summaryrefslogtreecommitdiff
path: root/rsvg
diff options
context:
space:
mode:
authorSophie Herold <sophie@hemio.de>2023-03-31 03:41:42 +0200
committerSophie Herold <sophie@hemio.de>2023-03-31 05:29:47 +0200
commit724c958dbece640ae8025fbca4050ee5cee2f266 (patch)
treed45fd40f9fd54fcdb68897f04379461dd8adf2dc /rsvg
parentd597831ff93b09cc41ce4768a833bc6407c95184 (diff)
downloadlibrsvg-724c958dbece640ae8025fbca4050ee5cee2f266.tar.gz
meta: Move lib and bins into separate crates
Closes #950 Part-of: <https://gitlab.gnome.org/GNOME/librsvg/-/merge_requests/822>
Diffstat (limited to 'rsvg')
-rw-r--r--rsvg/Cargo.toml131
-rw-r--r--rsvg/benches/box_blur.rs61
-rw-r--r--rsvg/benches/composite.rs46
-rw-r--r--rsvg/benches/lighting.rs264
-rw-r--r--rsvg/benches/path_parser.rs73
-rw-r--r--rsvg/benches/pixbuf_from_surface.rs45
-rw-r--r--rsvg/benches/pixel_iterators.rs101
-rw-r--r--rsvg/benches/pixel_ops.rs56
-rw-r--r--rsvg/benches/srgb.rs53
-rw-r--r--rsvg/benches/surface_from_pixbuf.rs37
-rw-r--r--rsvg/build.rs126
-rw-r--r--rsvg/src/accept_language.rs458
-rw-r--r--rsvg/src/angle.rs187
-rw-r--r--rsvg/src/api.rs622
-rw-r--r--rsvg/src/aspect_ratio.rs456
-rw-r--r--rsvg/src/bbox.rs121
-rw-r--r--rsvg/src/c_api/dpi.rs66
-rw-r--r--rsvg/src/c_api/handle.rs2144
-rw-r--r--rsvg/src/c_api/messages.rs158
-rw-r--r--rsvg/src/c_api/mod.rs58
-rw-r--r--rsvg/src/c_api/pixbuf_utils.rs330
-rw-r--r--rsvg/src/c_api/sizing.rs116
-rw-r--r--rsvg/src/color.rs27
-rw-r--r--rsvg/src/cond.rs243
-rw-r--r--rsvg/src/coord_units.rs99
-rw-r--r--rsvg/src/css.rs1110
-rw-r--r--rsvg/src/dasharray.rs114
-rw-r--r--rsvg/src/document.rs667
-rw-r--r--rsvg/src/dpi.rs13
-rw-r--r--rsvg/src/drawing_ctx.rs2412
-rw-r--r--rsvg/src/element.rs651
-rw-r--r--rsvg/src/error.rs526
-rw-r--r--rsvg/src/filter.rs332
-rw-r--r--rsvg/src/filter_func.rs959
-rw-r--r--rsvg/src/filters/blend.rs178
-rw-r--r--rsvg/src/filters/bounds.rs121
-rw-r--r--rsvg/src/filters/color_matrix.rs342
-rw-r--r--rsvg/src/filters/component_transfer.rs458
-rw-r--r--rsvg/src/filters/composite.rs179
-rw-r--r--rsvg/src/filters/context.rs405
-rw-r--r--rsvg/src/filters/convolve_matrix.rs354
-rw-r--r--rsvg/src/filters/displacement_map.rs195
-rw-r--r--rsvg/src/filters/drop_shadow.rs88
-rw-r--r--rsvg/src/filters/error.rs78
-rw-r--r--rsvg/src/filters/flood.rs70
-rw-r--r--rsvg/src/filters/gaussian_blur.rs282
-rw-r--r--rsvg/src/filters/image.rs211
-rw-r--r--rsvg/src/filters/lighting.rs1090
-rw-r--r--rsvg/src/filters/merge.rs217
-rw-r--r--rsvg/src/filters/mod.rs381
-rw-r--r--rsvg/src/filters/morphology.rs200
-rw-r--r--rsvg/src/filters/offset.rs100
-rw-r--r--rsvg/src/filters/tile.rs109
-rw-r--r--rsvg/src/filters/turbulence.rs484
-rw-r--r--rsvg/src/float_eq_cairo.rs154
-rw-r--r--rsvg/src/font_props.rs878
-rw-r--r--rsvg/src/gradient.rs748
-rw-r--r--rsvg/src/handle.rs388
-rw-r--r--rsvg/src/href.rs50
-rw-r--r--rsvg/src/image.rs119
-rw-r--r--rsvg/src/io.rs122
-rw-r--r--rsvg/src/iri.rs90
-rw-r--r--rsvg/src/layout.rs387
-rw-r--r--rsvg/src/length.rs736
-rw-r--r--rsvg/src/lib.rs254
-rw-r--r--rsvg/src/limits.rs52
-rw-r--r--rsvg/src/log.rs75
-rw-r--r--rsvg/src/marker.rs1215
-rw-r--r--rsvg/src/node.rs377
-rw-r--r--rsvg/src/paint_server.rs413
-rw-r--r--rsvg/src/parsers.rs424
-rw-r--r--rsvg/src/path_builder.rs875
-rw-r--r--rsvg/src/path_parser.rs2223
-rw-r--r--rsvg/src/pattern.rs525
-rw-r--r--rsvg/src/properties.rs1131
-rw-r--r--rsvg/src/property_defs.rs1328
-rw-r--r--rsvg/src/property_macros.rs288
-rw-r--r--rsvg/src/rect.rs274
-rw-r--r--rsvg/src/session.rs44
-rw-r--r--rsvg/src/shapes.rs743
-rw-r--r--rsvg/src/space.rs184
-rw-r--r--rsvg/src/structure.rs632
-rw-r--r--rsvg/src/style.rs84
-rw-r--r--rsvg/src/surface_utils/iterators.rs247
-rw-r--r--rsvg/src/surface_utils/mod.rs338
-rw-r--r--rsvg/src/surface_utils/shared_surface.rs1477
-rw-r--r--rsvg/src/surface_utils/srgb.rs95
-rw-r--r--rsvg/src/text.rs1456
-rw-r--r--rsvg/src/transform.rs1127
-rw-r--r--rsvg/src/ua.css41
-rw-r--r--rsvg/src/unit_interval.rs94
-rw-r--r--rsvg/src/url_resolver.rs256
-rw-r--r--rsvg/src/util.rs75
-rw-r--r--rsvg/src/viewbox.rs87
-rw-r--r--rsvg/src/xml/attributes.rs257
-rw-r--r--rsvg/src/xml/mod.rs787
-rw-r--r--rsvg/src/xml/xml2.rs212
-rw-r--r--rsvg/src/xml/xml2_load.rs517
-rw-r--r--rsvg/tests/Makefile.am95
-rw-r--r--rsvg/tests/README.md344
-rw-r--r--rsvg/tests/api.c1709
-rw-r--r--rsvg/tests/fixtures/api/bug334-element-positions.svg380
-rw-r--r--rsvg/tests/fixtures/api/document.svg6
-rw-r--r--rsvg/tests/fixtures/api/dpi.svg5
-rw-r--r--rsvg/tests/fixtures/api/example.svg5
-rw-r--r--rsvg/tests/fixtures/api/geometry-element.svg6
-rw-r--r--rsvg/tests/fixtures/api/geometry.svg6
-rw-r--r--rsvg/tests/fixtures/api/layers.svg5
-rw-r--r--rsvg/tests/fixtures/api/no-size.svg1
-rw-r--r--rsvg/tests/fixtures/api/no-viewbox.svg1
-rw-r--r--rsvg/tests/fixtures/api/size.svg1
-rw-r--r--rsvg/tests/fixtures/api/stylesheet-ref.svg4
-rw-r--r--rsvg/tests/fixtures/api/stylesheet.svg5
-rw-r--r--rsvg/tests/fixtures/cmdline/a-link.svg6
-rw-r--r--rsvg/tests/fixtures/cmdline/accept-language-de.pngbin0 -> 173 bytes
-rw-r--r--rsvg/tests/fixtures/cmdline/accept-language-es.pngbin0 -> 172 bytes
-rw-r--r--rsvg/tests/fixtures/cmdline/accept-language-fallback.pngbin0 -> 173 bytes
-rw-r--r--rsvg/tests/fixtures/cmdline/accept-language.svg7
-rw-r--r--rsvg/tests/fixtures/cmdline/bug601-zero-stroke-width-render-only-foo.pngbin0 -> 95 bytes
-rw-r--r--rsvg/tests/fixtures/cmdline/bug601-zero-stroke-width.svg6
-rw-r--r--rsvg/tests/fixtures/cmdline/bug677-partial-pixel.svg7
-rw-r--r--rsvg/tests/fixtures/cmdline/dimensions-in.svg4
-rw-r--r--rsvg/tests/fixtures/cmdline/gimp-wilber-ref.pngbin0 -> 2503 bytes
-rw-r--r--rsvg/tests/fixtures/cmdline/gimp-wilber.svg978
-rw-r--r--rsvg/tests/fixtures/cmdline/offset-png.pngbin0 -> 1426 bytes
-rw-r--r--rsvg/tests/fixtures/cmdline/text-a-link.svg14
-rw-r--r--rsvg/tests/fixtures/cmdline/zero-offset-png.pngbin0 -> 1419 bytes
-rw-r--r--rsvg/tests/fixtures/crash/bug335-non-svg-toplevel.svg1
-rw-r--r--rsvg/tests/fixtures/crash/bug336-invalid-css.svg7
-rw-r--r--rsvg/tests/fixtures/crash/bug349-empty-data-uri.svg1
-rw-r--r--rsvg/tests/fixtures/crash/bug349-too-big-image-in-href-data.svg1
-rw-r--r--rsvg/tests/fixtures/crash/bug352-feConvolveMatrix-large-allocation.svg1
-rw-r--r--rsvg/tests/fixtures/crash/bug377-xinclude-invalid-xml.svg25
-rw-r--r--rsvg/tests/fixtures/crash/bug463-characters-outside-first-element.svg69
-rw-r--r--rsvg/tests/fixtures/crash/bug467-xinclude-without-parent-element.svg1
-rw-r--r--rsvg/tests/fixtures/crash/bug524-invalid-stylesheet-href.svg9
-rw-r--r--rsvg/tests/fixtures/crash/bug620238.svg1
-rw-r--r--rsvg/tests/fixtures/crash/bug759084.svg9
-rw-r--r--rsvg/tests/fixtures/crash/bug785276-empty.svg0
-rw-r--r--rsvg/tests/fixtures/crash/bug785276-short-file.svg1
-rw-r--r--rsvg/tests/fixtures/crash/bug800-font-inherit.svg1
-rw-r--r--rsvg/tests/fixtures/crash/bug800-marker.svg1
-rw-r--r--rsvg/tests/fixtures/crash/bug942-xinclude-mutual-recursion-2.svg3
-rw-r--r--rsvg/tests/fixtures/crash/bug942-xinclude-mutual-recursion.svg3
-rw-r--r--rsvg/tests/fixtures/crash/bug942-xinclude-recursion.svg3
-rw-r--r--rsvg/tests/fixtures/crash/feConvolveMatrix-empty-kernel.svg7
-rw-r--r--rsvg/tests/fixtures/crash/marker-cycles.svg3
-rw-r--r--rsvg/tests/fixtures/crash/mask-cycles.svg6
-rw-r--r--rsvg/tests/fixtures/crash/pattern-fallback-cycles.svg9
-rw-r--r--rsvg/tests/fixtures/crash/xinclude-text-xml.svg28
-rw-r--r--rsvg/tests/fixtures/crash/xml-pi-without-data.svg1
-rw-r--r--rsvg/tests/fixtures/dimensions/bug347-bamboo-16fg-s-pt.svg128
-rw-r--r--rsvg/tests/fixtures/dimensions/bug347-wrapper.svg32
-rw-r--r--rsvg/tests/fixtures/dimensions/bug521-with-viewbox.svg4
-rw-r--r--rsvg/tests/fixtures/dimensions/bug564527.svg110
-rw-r--r--rsvg/tests/fixtures/dimensions/bug608102.svg15
-rw-r--r--rsvg/tests/fixtures/dimensions/bug612951.svg738
-rw-r--r--rsvg/tests/fixtures/dimensions/bug614018.svg360
-rw-r--r--rsvg/tests/fixtures/dimensions/bug760112-wilber.svg12205
-rw-r--r--rsvg/tests/fixtures/dimensions/bug823-position-sub.svg8
-rw-r--r--rsvg/tests/fixtures/dimensions/empty.svg3
-rw-r--r--rsvg/tests/fixtures/dimensions/sub-rect-no-unit.svg13
-rw-r--r--rsvg/tests/fixtures/errors/bug323-nested-use.svg196
-rw-r--r--rsvg/tests/fixtures/errors/bug515-pattern-billion-laughs.svg130
-rw-r--r--rsvg/tests/fixtures/errors/bug515-too-many-elements.svgzbin0 -> 40811 bytes
-rw-r--r--rsvg/tests/fixtures/geometries/README.md7
-rw-r--r--rsvg/tests/fixtures/geometries/dual.svg794
-rw-r--r--rsvg/tests/fixtures/geometries/dual.svg.subs86
-rw-r--r--rsvg/tests/fixtures/geometries/grid.svg947
-rw-r--r--rsvg/tests/fixtures/geometries/grid.svg.subs74
-rw-r--r--rsvg/tests/fixtures/geometries/quad.svg797
-rw-r--r--rsvg/tests/fixtures/geometries/quad.svg.subs128
-rw-r--r--rsvg/tests/fixtures/geometries/single.svg352
-rw-r--r--rsvg/tests/fixtures/geometries/single.svg.subs44
-rw-r--r--rsvg/tests/fixtures/loading/gnome-cool.svg66
-rw-r--r--rsvg/tests/fixtures/loading/gnome-cool.svgzbin0 -> 5183 bytes
-rw-r--r--rsvg/tests/fixtures/loading/include-fallback.svg10
-rw-r--r--rsvg/tests/fixtures/loading/include-text.svg6
-rw-r--r--rsvg/tests/fixtures/loading/text.txt1
-rw-r--r--rsvg/tests/fixtures/primitive_geometries/rect.svg4
-rw-r--r--rsvg/tests/fixtures/primitive_geometries/rect.svg.geom16
-rw-r--r--rsvg/tests/fixtures/primitive_geometries/rect_isolate.svg4
-rw-r--r--rsvg/tests/fixtures/primitive_geometries/rect_isolate.svg.geom16
-rw-r--r--rsvg/tests/fixtures/primitive_geometries/rect_stroke.svg4
-rw-r--r--rsvg/tests/fixtures/primitive_geometries/rect_stroke.svg.geom16
-rw-r--r--rsvg/tests/fixtures/primitive_geometries/rect_stroke_unfilled.svg4
-rw-r--r--rsvg/tests/fixtures/primitive_geometries/rect_stroke_unfilled.svg.geom16
-rw-r--r--rsvg/tests/fixtures/reftests/a-pseudo-class-ref.pngbin0 -> 3753 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/a-pseudo-class.svg30
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/ac-adapter-symbolic-ref.pngbin0 -> 327 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/ac-adapter-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/accessories-calculator-symbolic-ref.pngbin0 -> 179 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/accessories-calculator-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/accessories-character-map-symbolic-ref.pngbin0 -> 498 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/accessories-character-map-symbolic.svg33
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/accessories-dictionary-symbolic-ref.pngbin0 -> 416 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/accessories-dictionary-symbolic.svg34
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/accessories-text-editor-symbolic-ref.pngbin0 -> 228 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/accessories-text-editor-symbolic.svg39
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/action-unavailable-symbolic-ref.pngbin0 -> 495 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/action-unavailable-symbolic.svg126
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/address-book-new-symbolic-ref.pngbin0 -> 438 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/address-book-new-symbolic.svg40
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/airplane-mode-symbolic-ref.pngbin0 -> 371 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/airplane-mode-symbolic.svg35
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/alarm-symbolic-ref.pngbin0 -> 592 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/alarm-symbolic.svg35
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/applets-screenshooter-symbolic-ref.pngbin0 -> 372 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/applets-screenshooter-symbolic.svg33
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/application-certificate-symbolic-ref.pngbin0 -> 345 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/application-certificate-symbolic.svg33
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/application-exit-symbolic-ref.pngbin0 -> 279 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/application-exit-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/application-rss-xml-symbolic-ref.pngbin0 -> 458 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/application-rss-xml-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/application-x-addon-symbolic-ref.pngbin0 -> 289 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/application-x-addon-symbolic.svg35
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/application-x-appliance-symbolic-ref.pngbin0 -> 489 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/application-x-appliance-symbolic.svg44
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/application-x-executable-symbolic-ref.pngbin0 -> 402 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/application-x-executable-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/application-x-firmware-symbolic-ref.pngbin0 -> 543 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/application-x-firmware-symbolic.svg48
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/applications-engineering-symbolic-ref.pngbin0 -> 413 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/applications-engineering-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/applications-games-symbolic-ref.pngbin0 -> 409 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/applications-games-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/applications-graphics-symbolic-ref.pngbin0 -> 568 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/applications-graphics-symbolic.svg33
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/applications-multimedia-symbolic-ref.pngbin0 -> 291 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/applications-multimedia-symbolic.svg34
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/applications-science-symbolic-ref.pngbin0 -> 519 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/applications-science-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/applications-system-symbolic-ref.pngbin0 -> 411 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/applications-system-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/applications-utilities-symbolic-ref.pngbin0 -> 416 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/applications-utilities-symbolic.svg33
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/appointment-missed-symbolic-ref.pngbin0 -> 499 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/appointment-missed-symbolic.svg33
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/appointment-new-symbolic-ref.pngbin0 -> 467 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/appointment-new-symbolic.svg33
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/appointment-soon-symbolic-ref.pngbin0 -> 451 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/appointment-soon-symbolic.svg33
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/audio-card-symbolic-ref.pngbin0 -> 429 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/audio-card-symbolic.svg36
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/audio-headphones-symbolic-ref.pngbin0 -> 458 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/audio-headphones-symbolic.svg33
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/audio-headset-symbolic-ref.pngbin0 -> 489 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/audio-headset-symbolic.svg35
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/audio-input-microphone-symbolic-ref.pngbin0 -> 356 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/audio-input-microphone-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/audio-speakers-symbolic-ref.pngbin0 -> 335 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/audio-speakers-symbolic.svg37
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/audio-volume-high-symbolic-ref.pngbin0 -> 430 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/audio-volume-high-symbolic.svg38
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/audio-volume-low-symbolic-ref.pngbin0 -> 442 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/audio-volume-low-symbolic.svg38
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/audio-volume-medium-symbolic-ref.pngbin0 -> 443 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/audio-volume-medium-symbolic.svg38
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/audio-volume-muted-symbolic-ref.pngbin0 -> 450 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/audio-volume-muted-symbolic.svg39
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/audio-volume-overamplified-symbolic-ref.pngbin0 -> 375 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/audio-volume-overamplified-symbolic.svg37
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/audio-x-generic-symbolic-ref.pngbin0 -> 247 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/audio-x-generic-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/auth-fingerprint-symbolic-ref.pngbin0 -> 755 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/auth-fingerprint-symbolic.svg37
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/auth-smartcard-symbolic-ref.pngbin0 -> 283 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/auth-smartcard-symbolic.svg35
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/avatar-default-symbolic-ref.pngbin0 -> 291 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/avatar-default-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/battery-caution-charging-symbolic-ref.pngbin0 -> 364 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/battery-caution-charging-symbolic.svg39
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/battery-caution-symbolic-ref.pngbin0 -> 248 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/battery-caution-symbolic.svg34
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/battery-empty-charging-symbolic-ref.pngbin0 -> 349 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/battery-empty-charging-symbolic.svg38
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/battery-empty-symbolic-ref.pngbin0 -> 179 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/battery-empty-symbolic.svg33
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/battery-full-charged-symbolic-ref.pngbin0 -> 338 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/battery-full-charged-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/battery-full-charging-symbolic-ref.pngbin0 -> 345 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/battery-full-charging-symbolic.svg33
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/battery-full-symbolic-ref.pngbin0 -> 186 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/battery-full-symbolic.svg35
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/battery-good-charging-symbolic-ref.pngbin0 -> 348 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/battery-good-charging-symbolic.svg39
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/battery-good-symbolic-ref.pngbin0 -> 194 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/battery-good-symbolic.svg34
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/battery-low-charging-symbolic-ref.pngbin0 -> 357 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/battery-low-charging-symbolic.svg39
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/battery-low-symbolic-ref.pngbin0 -> 189 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/battery-low-symbolic.svg33
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/battery-missing-symbolic-ref.pngbin0 -> 364 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/battery-missing-symbolic.svg33
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/battery-symbolic-ref.pngbin0 -> 186 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/battery-symbolic.svg34
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/bluetooth-active-symbolic-ref.pngbin0 -> 365 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/bluetooth-active-symbolic.svg36
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/bluetooth-disabled-symbolic-ref.pngbin0 -> 420 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/bluetooth-disabled-symbolic.svg36
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/bluetooth-symbolic-ref.pngbin0 -> 365 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/bluetooth-symbolic.svg36
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/bookmark-new-symbolic-ref.pngbin0 -> 331 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/bookmark-new-symbolic.svg36
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/call-missed-symbolic-ref.pngbin0 -> 490 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/call-missed-symbolic.svg36
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/call-start-symbolic-ref.pngbin0 -> 311 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/call-start-symbolic.svg35
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/call-stop-symbolic-ref.pngbin0 -> 423 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/call-stop-symbolic.svg36
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/camera-photo-symbolic-ref.pngbin0 -> 347 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/camera-photo-symbolic.svg26
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/camera-switch-symbolic-ref.pngbin0 -> 343 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/camera-switch-symbolic.svg36
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/camera-video-symbolic-ref.pngbin0 -> 359 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/camera-video-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/camera-web-symbolic-ref.pngbin0 -> 212 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/camera-web-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/changes-allow-symbolic-ref.pngbin0 -> 247 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/changes-allow-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/changes-prevent-symbolic-ref.pngbin0 -> 242 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/changes-prevent-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/channel-insecure-symbolic-ref.pngbin0 -> 336 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/channel-insecure-symbolic.svg33
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/channel-secure-symbolic-ref.pngbin0 -> 239 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/channel-secure-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/checkbox-checked-symbolic-ref.pngbin0 -> 433 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/checkbox-checked-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/checkbox-mixed-symbolic-ref.pngbin0 -> 388 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/checkbox-mixed-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/checkbox-symbolic-ref.pngbin0 -> 285 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/checkbox-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/color-select-symbolic-ref.pngbin0 -> 394 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/color-select-symbolic.svg34
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/colorimeter-colorhug-symbolic-ref.pngbin0 -> 290 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/colorimeter-colorhug-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/computer-apple-ipad-symbolic-ref.pngbin0 -> 176 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/computer-apple-ipad-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/computer-fail-symbolic-ref.pngbin0 -> 403 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/computer-fail-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/computer-symbolic-ref.pngbin0 -> 325 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/computer-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/contact-new-symbolic-ref.pngbin0 -> 313 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/contact-new-symbolic.svg33
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/content-loading-symbolic-ref.pngbin0 -> 155 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/content-loading-symbolic.svg33
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/daytime-sunrise-symbolic-ref.pngbin0 -> 342 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/daytime-sunrise-symbolic.svg36
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/daytime-sunset-symbolic-ref.pngbin0 -> 335 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/daytime-sunset-symbolic.svg36
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/dialog-error-symbolic-ref.pngbin0 -> 345 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/dialog-error-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/dialog-information-symbolic-ref.pngbin0 -> 343 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/dialog-information-symbolic.svg33
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/dialog-password-symbolic-ref.pngbin0 -> 363 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/dialog-password-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/dialog-question-symbolic-ref.pngbin0 -> 427 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/dialog-question-symbolic.svg30
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/dialog-warning-symbolic-ref.pngbin0 -> 439 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/dialog-warning-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/display-brightness-symbolic-ref.pngbin0 -> 526 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/display-brightness-symbolic.svg40
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/display-projector-symbolic-ref.pngbin0 -> 330 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/display-projector-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/document-edit-symbolic-ref.pngbin0 -> 355 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/document-edit-symbolic.svg36
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/document-new-symbolic-ref.pngbin0 -> 358 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/document-new-symbolic.svg36
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/document-open-recent-symbolic-ref.pngbin0 -> 572 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/document-open-recent-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/document-open-symbolic-ref.pngbin0 -> 284 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/document-open-symbolic.svg36
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/document-page-setup-symbolic-ref.pngbin0 -> 409 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/document-page-setup-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/document-print-preview-symbolic-ref.pngbin0 -> 375 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/document-print-preview-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/document-print-symbolic-ref.pngbin0 -> 170 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/document-print-symbolic.svg33
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/document-properties-symbolic-ref.pngbin0 -> 413 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/document-properties-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/document-revert-symbolic-ref.pngbin0 -> 342 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/document-revert-symbolic-rtl-ref.pngbin0 -> 395 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/document-revert-symbolic-rtl.svg35
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/document-revert-symbolic.svg35
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/document-save-as-symbolic-ref.pngbin0 -> 349 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/document-save-as-symbolic.svg35
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/document-save-symbolic-ref.pngbin0 -> 326 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/document-save-symbolic.svg33
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/document-send-symbolic-ref.pngbin0 -> 366 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/document-send-symbolic.svg35
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/drive-harddisk-ieee1394-symbolic-ref.pngbin0 -> 360 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/drive-harddisk-ieee1394-symbolic.svg35
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/drive-harddisk-solidstate-symbolic-ref.pngbin0 -> 249 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/drive-harddisk-solidstate-symbolic.svg38
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/drive-harddisk-symbolic-ref.pngbin0 -> 414 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/drive-harddisk-symbolic.svg34
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/drive-harddisk-system-symbolic-ref.pngbin0 -> 416 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/drive-harddisk-system-symbolic.svg36
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/drive-harddisk-usb-symbolic-ref.pngbin0 -> 360 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/drive-harddisk-usb-symbolic.svg35
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/drive-multidisk-symbolic-ref.pngbin0 -> 418 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/drive-multidisk-symbolic.svg36
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/drive-optical-symbolic-ref.pngbin0 -> 352 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/drive-optical-symbolic.svg34
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/drive-removable-media-symbolic-ref.pngbin0 -> 214 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/drive-removable-media-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/edit-clear-all-symbolic-ref.pngbin0 -> 437 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/edit-clear-all-symbolic.svg37
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/edit-clear-symbolic-ref.pngbin0 -> 301 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/edit-clear-symbolic-rtl-ref.pngbin0 -> 320 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/edit-clear-symbolic-rtl.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/edit-clear-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/edit-copy-symbolic-ref.pngbin0 -> 171 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/edit-copy-symbolic.svg30
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/edit-cut-symbolic-ref.pngbin0 -> 566 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/edit-cut-symbolic.svg37
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/edit-delete-symbolic-ref.pngbin0 -> 437 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/edit-delete-symbolic.svg26
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/edit-find-replace-symbolic-ref.pngbin0 -> 461 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/edit-find-replace-symbolic.svg33
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/edit-find-symbolic-ref.pngbin0 -> 470 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/edit-find-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/edit-paste-symbolic-ref.pngbin0 -> 316 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/edit-paste-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/edit-redo-symbolic-ref.pngbin0 -> 317 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/edit-redo-symbolic-rtl-ref.pngbin0 -> 346 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/edit-redo-symbolic-rtl.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/edit-redo-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/edit-select-all-symbolic-ref.pngbin0 -> 216 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/edit-select-all-symbolic.svg57
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/edit-select-symbolic-ref.pngbin0 -> 260 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/edit-select-symbolic.svg33
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/edit-undo-symbolic-ref.pngbin0 -> 346 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/edit-undo-symbolic-rtl-ref.pngbin0 -> 317 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/edit-undo-symbolic-rtl.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/edit-undo-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/emblem-default-symbolic-ref.pngbin0 -> 467 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/emblem-default-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/emblem-documents-symbolic-ref.pngbin0 -> 252 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/emblem-documents-symbolic.svg36
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/emblem-favorite-symbolic-ref.pngbin0 -> 373 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/emblem-favorite-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/emblem-important-symbolic-ref.pngbin0 -> 386 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/emblem-important-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/emblem-music-symbolic-ref.pngbin0 -> 274 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/emblem-music-symbolic.svg35
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/emblem-ok-symbolic-ref.pngbin0 -> 273 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/emblem-ok-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/emblem-photos-symbolic-ref.pngbin0 -> 216 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/emblem-photos-symbolic.svg33
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/emblem-shared-symbolic-ref.pngbin0 -> 437 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/emblem-shared-symbolic.svg34
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/emblem-synchronizing-symbolic-ref.pngbin0 -> 443 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/emblem-synchronizing-symbolic.svg34
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/emblem-system-symbolic-ref.pngbin0 -> 411 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/emblem-system-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/emblem-videos-symbolic-ref.pngbin0 -> 211 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/emblem-videos-symbolic.svg33
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/emoji-activities-symbolic-ref.pngbin0 -> 649 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/emoji-activities-symbolic.svg35
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/emoji-body-symbolic-ref.pngbin0 -> 392 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/emoji-body-symbolic.svg36
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/emoji-flags-symbolic-ref.pngbin0 -> 291 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/emoji-flags-symbolic.svg35
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/emoji-food-symbolic-ref.pngbin0 -> 303 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/emoji-food-symbolic.svg36
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/emoji-nature-symbolic-ref.pngbin0 -> 354 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/emoji-nature-symbolic.svg36
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/emoji-objects-symbolic-ref.pngbin0 -> 179 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/emoji-objects-symbolic.svg35
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/emoji-people-symbolic-ref.pngbin0 -> 291 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/emoji-people-symbolic.svg36
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/emoji-recent-symbolic-ref.pngbin0 -> 586 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/emoji-recent-symbolic.svg36
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/emoji-symbols-symbolic-ref.pngbin0 -> 373 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/emoji-symbols-symbolic.svg35
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/emoji-travel-symbolic-ref.pngbin0 -> 371 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/emoji-travel-symbolic.svg35
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/emote-love-symbolic-ref.pngbin0 -> 373 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/emote-love-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/error-correct-symbolic-ref.pngbin0 -> 518 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/error-correct-symbolic.svg36
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/face-angel-symbolic-ref.pngbin0 -> 560 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/face-angel-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/face-angry-symbolic-ref.pngbin0 -> 437 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/face-angry-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/face-confused-symbolic-ref.pngbin0 -> 463 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/face-confused-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/face-cool-symbolic-ref.pngbin0 -> 491 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/face-cool-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/face-crying-symbolic-ref.pngbin0 -> 500 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/face-crying-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/face-devilish-symbolic-ref.pngbin0 -> 485 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/face-devilish-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/face-embarrassed-symbolic-ref.pngbin0 -> 470 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/face-embarrassed-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/face-glasses-symbolic-ref.pngbin0 -> 556 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/face-glasses-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/face-kiss-symbolic-ref.pngbin0 -> 480 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/face-kiss-symbolic.svg34
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/face-laugh-symbolic-ref.pngbin0 -> 490 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/face-laugh-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/face-monkey-symbolic-ref.pngbin0 -> 637 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/face-monkey-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/face-plain-symbolic-ref.pngbin0 -> 414 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/face-plain-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/face-raspberry-symbolic-ref.pngbin0 -> 496 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/face-raspberry-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/face-sad-symbolic-ref.pngbin0 -> 464 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/face-sad-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/face-shutmouth-symbolic-ref.pngbin0 -> 464 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/face-shutmouth-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/face-sick-symbolic-ref.pngbin0 -> 497 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/face-sick-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/face-smile-big-symbolic-ref.pngbin0 -> 477 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/face-smile-big-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/face-smile-symbolic-ref.pngbin0 -> 478 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/face-smile-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/face-smirk-symbolic-ref.pngbin0 -> 479 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/face-smirk-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/face-surprise-symbolic-ref.pngbin0 -> 444 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/face-surprise-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/face-tired-symbolic-ref.pngbin0 -> 422 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/face-tired-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/face-uncertain-symbolic-ref.pngbin0 -> 438 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/face-uncertain-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/face-wink-symbolic-ref.pngbin0 -> 467 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/face-wink-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/face-worried-symbolic-ref.pngbin0 -> 456 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/face-worried-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/face-yawn-symbolic-ref.pngbin0 -> 476 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/face-yawn-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/find-location-symbolic-ref.pngbin0 -> 564 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/find-location-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/focus-legacy-systray-symbolic-ref.pngbin0 -> 296 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/focus-legacy-systray-symbolic.svg33
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/focus-top-bar-symbolic-ref.pngbin0 -> 211 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/focus-top-bar-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/focus-windows-symbolic-ref.pngbin0 -> 238 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/focus-windows-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/folder-documents-symbolic-ref.pngbin0 -> 216 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/folder-documents-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/folder-download-symbolic-ref.pngbin0 -> 343 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/folder-download-symbolic.svg38
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/folder-drag-accept-symbolic-ref.pngbin0 -> 232 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/folder-drag-accept-symbolic.svg35
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/folder-music-symbolic-ref.pngbin0 -> 274 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/folder-music-symbolic.svg35
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/folder-new-symbolic-ref.pngbin0 -> 265 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/folder-new-symbolic.svg36
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/folder-open-symbolic-ref.pngbin0 -> 260 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/folder-open-symbolic.svg35
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/folder-pictures-symbolic-ref.pngbin0 -> 347 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/folder-pictures-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/folder-publicshare-symbolic-ref.pngbin0 -> 437 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/folder-publicshare-symbolic.svg34
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/folder-remote-symbolic-ref.pngbin0 -> 299 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/folder-remote-symbolic.svg35
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/folder-saved-search-symbolic-ref.pngbin0 -> 464 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/folder-saved-search-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/folder-symbolic-ref.pngbin0 -> 267 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/folder-symbolic.svg35
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/folder-templates-symbolic-ref.pngbin0 -> 220 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/folder-templates-symbolic.svg47
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/folder-videos-symbolic-ref.pngbin0 -> 212 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/folder-videos-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/folder-visiting-symbolic-ref.pngbin0 -> 229 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/folder-visiting-symbolic.svg35
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/font-select-symbolic-ref.pngbin0 -> 339 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/font-select-symbolic.svg33
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/font-x-generic-symbolic-ref.pngbin0 -> 306 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/font-x-generic-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/format-indent-less-symbolic-ref.pngbin0 -> 227 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/format-indent-less-symbolic-rtl-ref.pngbin0 -> 216 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/format-indent-less-symbolic-rtl.svg33
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/format-indent-less-symbolic.svg35
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/format-indent-more-symbolic-ref.pngbin0 -> 216 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/format-indent-more-symbolic-rtl-ref.pngbin0 -> 227 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/format-indent-more-symbolic-rtl.svg35
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/format-indent-more-symbolic.svg33
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/format-justify-center-symbolic-ref.pngbin0 -> 133 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/format-justify-center-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/format-justify-fill-symbolic-ref.pngbin0 -> 114 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/format-justify-fill-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/format-justify-left-symbolic-ref.pngbin0 -> 127 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/format-justify-left-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/format-justify-right-symbolic-ref.pngbin0 -> 126 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/format-justify-right-symbolic.svg34
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/format-text-bold-symbolic-ref.pngbin0 -> 283 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/format-text-bold-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/format-text-direction-symbolic-ref.pngbin0 -> 319 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/format-text-direction-symbolic-rtl-ref.pngbin0 -> 347 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/format-text-direction-symbolic-rtl.svg33
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/format-text-direction-symbolic.svg33
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/format-text-italic-symbolic-ref.pngbin0 -> 322 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/format-text-italic-symbolic.svg30
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/format-text-strikethrough-symbolic-ref.pngbin0 -> 230 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/format-text-strikethrough-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/format-text-underline-symbolic-ref.pngbin0 -> 270 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/format-text-underline-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/gnome-power-manager-symbolic-ref.pngbin0 -> 345 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/gnome-power-manager-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/go-bottom-symbolic-ref.pngbin0 -> 275 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/go-bottom-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/go-down-symbolic-ref.pngbin0 -> 267 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/go-down-symbolic.svg35
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/go-first-symbolic-ref.pngbin0 -> 264 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/go-first-symbolic-rtl-ref.pngbin0 -> 259 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/go-first-symbolic-rtl.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/go-first-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/go-home-symbolic-ref.pngbin0 -> 380 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/go-home-symbolic.svg44
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/go-jump-symbolic-ref.pngbin0 -> 332 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/go-jump-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/go-last-symbolic-ref.pngbin0 -> 259 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/go-last-symbolic-rtl-ref.pngbin0 -> 264 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/go-last-symbolic-rtl.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/go-last-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/go-next-symbolic-ref.pngbin0 -> 256 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/go-next-symbolic-rtl-ref.pngbin0 -> 257 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/go-next-symbolic-rtl.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/go-next-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/go-previous-symbolic-ref.pngbin0 -> 257 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/go-previous-symbolic-rtl-ref.pngbin0 -> 256 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/go-previous-symbolic-rtl.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/go-previous-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/go-top-symbolic-ref.pngbin0 -> 292 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/go-top-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/go-up-symbolic-ref.pngbin0 -> 275 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/go-up-symbolic.svg35
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/goa-panel-symbolic-ref.pngbin0 -> 521 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/goa-panel-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/help-about-symbolic-ref.pngbin0 -> 347 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/help-about-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/help-browser-symbolic-ref.pngbin0 -> 611 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/help-browser-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/help-contents-symbolic-ref.pngbin0 -> 507 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/help-contents-symbolic.svg38
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/help-faq-symbolic-ref.pngbin0 -> 386 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/help-faq-symbolic.svg36
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/image-loading-symbolic-ref.pngbin0 -> 155 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/image-loading-symbolic.svg33
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/image-x-generic-symbolic-ref.pngbin0 -> 334 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/image-x-generic-symbolic.svg33
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/inode-directory-symbolic-ref.pngbin0 -> 189 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/inode-directory-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/input-dialpad-symbolic-ref.pngbin0 -> 218 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/input-dialpad-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/input-gaming-symbolic-ref.pngbin0 -> 372 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/input-gaming-symbolic.svg35
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/input-keyboard-symbolic-ref.pngbin0 -> 183 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/input-keyboard-symbolic.svg35
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/input-mouse-symbolic-ref.pngbin0 -> 428 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/input-mouse-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/input-tablet-symbolic-ref.pngbin0 -> 504 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/input-tablet-symbolic.svg36
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/input-touchpad-symbolic-ref.pngbin0 -> 284 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/input-touchpad-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/insert-image-symbolic-ref.pngbin0 -> 299 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/insert-image-symbolic.svg33
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/insert-link-symbolic-ref.pngbin0 -> 333 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/insert-link-symbolic.svg34
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/insert-object-symbolic-ref.pngbin0 -> 466 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/insert-object-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/insert-text-symbolic-ref.pngbin0 -> 337 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/insert-text-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/keyboard-brightness-symbolic-ref.pngbin0 -> 320 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/keyboard-brightness-symbolic.svg37
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/list-add-symbolic-ref.pngbin0 -> 126 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/list-add-symbolic.svg30
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/list-remove-all-symbolic-ref.pngbin0 -> 210 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/list-remove-all-symbolic.svg35
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/list-remove-symbolic-ref.pngbin0 -> 111 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/list-remove-symbolic.svg30
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/mail-attachment-symbolic-ref.pngbin0 -> 466 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/mail-attachment-symbolic.svg35
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/mail-mark-important-symbolic-ref.pngbin0 -> 365 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/mail-mark-important-symbolic.svg33
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/mail-read-symbolic-ref.pngbin0 -> 503 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/mail-read-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/mail-replied-symbolic-ref.pngbin0 -> 286 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/mail-replied-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/mail-send-receive-symbolic-ref.pngbin0 -> 294 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/mail-send-receive-symbolic.svg34
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/mail-send-symbolic-ref.pngbin0 -> 321 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/mail-send-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/mail-unread-symbolic-ref.pngbin0 -> 316 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/mail-unread-symbolic.svg30
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/mark-location-symbolic-ref.pngbin0 -> 368 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/mark-location-symbolic.svg35
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/media-eject-symbolic-ref.pngbin0 -> 210 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/media-eject-symbolic.svg35
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/media-flash-symbolic-ref.pngbin0 -> 267 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/media-flash-symbolic.svg34
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/media-floppy-symbolic-ref.pngbin0 -> 236 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/media-floppy-symbolic.svg34
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/media-optical-bd-symbolic-ref.pngbin0 -> 438 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/media-optical-bd-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/media-optical-cd-audio-symbolic-ref.pngbin0 -> 438 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/media-optical-cd-audio-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/media-optical-dvd-symbolic-ref.pngbin0 -> 438 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/media-optical-dvd-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/media-optical-symbolic-ref.pngbin0 -> 438 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/media-optical-symbolic.svg33
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/media-playback-pause-symbolic-ref.pngbin0 -> 116 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/media-playback-pause-symbolic.svg29
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/media-playback-start-symbolic-ref.pngbin0 -> 230 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/media-playback-start-symbolic-rtl-ref.pngbin0 -> 257 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/media-playback-start-symbolic-rtl.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/media-playback-start-symbolic.svg29
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/media-playback-stop-symbolic-ref.pngbin0 -> 114 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/media-playback-stop-symbolic.svg29
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/media-playlist-consecutive-symbolic-ref.pngbin0 -> 178 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/media-playlist-consecutive-symbolic-rtl-ref.pngbin0 -> 192 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/media-playlist-consecutive-symbolic-rtl.svg34
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/media-playlist-consecutive-symbolic.svg34
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/media-playlist-repeat-song-symbolic-ref.pngbin0 -> 434 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/media-playlist-repeat-song-symbolic-rtl-ref.pngbin0 -> 424 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/media-playlist-repeat-song-symbolic-rtl.svg36
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/media-playlist-repeat-song-symbolic.svg36
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/media-playlist-repeat-symbolic-ref.pngbin0 -> 336 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/media-playlist-repeat-symbolic-rtl-ref.pngbin0 -> 329 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/media-playlist-repeat-symbolic-rtl.svg34
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/media-playlist-repeat-symbolic.svg33
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/media-playlist-shuffle-symbolic-ref.pngbin0 -> 305 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/media-playlist-shuffle-symbolic-rtl-ref.pngbin0 -> 317 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/media-playlist-shuffle-symbolic-rtl.svg38
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/media-playlist-shuffle-symbolic.svg38
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/media-record-symbolic-ref.pngbin0 -> 230 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/media-record-symbolic.svg26
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/media-removable-symbolic-ref.pngbin0 -> 201 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/media-removable-symbolic.svg34
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/media-seek-backward-symbolic-ref.pngbin0 -> 208 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/media-seek-backward-symbolic-rtl-ref.pngbin0 -> 242 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/media-seek-backward-symbolic-rtl.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/media-seek-backward-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/media-seek-forward-symbolic-ref.pngbin0 -> 242 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/media-seek-forward-symbolic-rtl-ref.pngbin0 -> 208 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/media-seek-forward-symbolic-rtl.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/media-seek-forward-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/media-skip-backward-symbolic-ref.pngbin0 -> 226 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/media-skip-backward-symbolic-rtl-ref.pngbin0 -> 228 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/media-skip-backward-symbolic-rtl.svg33
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/media-skip-backward-symbolic.svg33
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/media-skip-forward-symbolic-ref.pngbin0 -> 228 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/media-skip-forward-symbolic-rtl-ref.pngbin0 -> 226 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/media-skip-forward-symbolic-rtl.svg33
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/media-skip-forward-symbolic.svg33
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/media-tape-symbolic-ref.pngbin0 -> 324 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/media-tape-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/media-view-subtitles-symbolic-ref.pngbin0 -> 273 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/media-view-subtitles-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/media-zip-symbolic-ref.pngbin0 -> 414 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/media-zip-symbolic.svg33
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/microphone-sensitivity-high-symbolic-ref.pngbin0 -> 469 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/microphone-sensitivity-high-symbolic.svg45
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/microphone-sensitivity-low-symbolic-ref.pngbin0 -> 525 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/microphone-sensitivity-low-symbolic.svg45
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/microphone-sensitivity-medium-symbolic-ref.pngbin0 -> 526 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/microphone-sensitivity-medium-symbolic.svg45
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/microphone-sensitivity-muted-symbolic-ref.pngbin0 -> 534 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/microphone-sensitivity-muted-symbolic.svg45
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/modem-symbolic-ref.pngbin0 -> 346 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/modem-symbolic.svg36
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/multimedia-player-apple-ipod-touch-symbolic-ref.pngbin0 -> 193 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/multimedia-player-apple-ipod-touch-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/multimedia-player-symbolic-ref.pngbin0 -> 316 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/multimedia-player-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/multimedia-volume-control-symbolic-ref.pngbin0 -> 296 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/multimedia-volume-control-symbolic.svg37
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-cellular-3g-symbolic-ref.pngbin0 -> 382 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-cellular-3g-symbolic.svg30
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-cellular-4g-symbolic-ref.pngbin0 -> 313 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-cellular-4g-symbolic.svg30
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-cellular-acquiring-symbolic-ref.pngbin0 -> 254 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-cellular-acquiring-symbolic.svg40
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-cellular-connected-symbolic-ref.pngbin0 -> 320 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-cellular-connected-symbolic.svg34
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-cellular-edge-symbolic-ref.pngbin0 -> 234 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-cellular-edge-symbolic.svg26
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-cellular-gprs-symbolic-ref.pngbin0 -> 306 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-cellular-gprs-symbolic.svg26
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-cellular-hspa-symbolic-ref.pngbin0 -> 200 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-cellular-hspa-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-cellular-no-route-symbolic-ref.pngbin0 -> 372 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-cellular-no-route-symbolic.svg34
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-cellular-offline-symbolic-ref.pngbin0 -> 241 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-cellular-offline-symbolic.svg35
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-cellular-signal-excellent-symbolic-ref.pngbin0 -> 133 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-cellular-signal-excellent-symbolic.svg35
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-cellular-signal-good-symbolic-ref.pngbin0 -> 141 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-cellular-signal-good-symbolic.svg35
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-cellular-signal-none-symbolic-ref.pngbin0 -> 133 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-cellular-signal-none-symbolic.svg34
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-cellular-signal-ok-symbolic-ref.pngbin0 -> 141 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-cellular-signal-ok-symbolic.svg35
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-cellular-signal-weak-symbolic-ref.pngbin0 -> 141 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-cellular-signal-weak-symbolic.svg35
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-error-symbolic-ref.pngbin0 -> 481 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-error-symbolic.svg33
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-idle-symbolic-ref.pngbin0 -> 406 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-idle-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-no-route-symbolic-ref.pngbin0 -> 441 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-no-route-symbolic.svg39
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-offline-symbolic-ref.pngbin0 -> 455 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-offline-symbolic.svg34
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-receive-symbolic-ref.pngbin0 -> 400 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-receive-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-server-symbolic-ref.pngbin0 -> 227 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-server-symbolic.svg35
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-transmit-receive-symbolic-ref.pngbin0 -> 373 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-transmit-receive-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-transmit-symbolic-ref.pngbin0 -> 397 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-transmit-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-vpn-acquiring-symbolic-ref.pngbin0 -> 280 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-vpn-acquiring-symbolic.svg39
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-vpn-no-route-symbolic-ref.pngbin0 -> 432 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-vpn-no-route-symbolic.svg36
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-vpn-symbolic-ref.pngbin0 -> 234 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-vpn-symbolic.svg35
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-wired-acquiring-symbolic-ref.pngbin0 -> 296 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-wired-acquiring-symbolic.svg41
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-wired-disconnected-symbolic-ref.pngbin0 -> 260 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-wired-disconnected-symbolic.svg36
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-wired-no-route-symbolic-ref.pngbin0 -> 364 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-wired-no-route-symbolic.svg38
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-wired-offline-symbolic-ref.pngbin0 -> 260 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-wired-offline-symbolic.svg36
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-wired-symbolic-ref.pngbin0 -> 167 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-wired-symbolic.svg39
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-wireless-acquiring-symbolic-ref.pngbin0 -> 385 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-wireless-acquiring-symbolic.svg40
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-wireless-connected-symbolic-ref.pngbin0 -> 238 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-wireless-connected-symbolic.svg39
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-wireless-encrypted-symbolic-ref.pngbin0 -> 242 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-wireless-encrypted-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-wireless-hotspot-symbolic-ref.pngbin0 -> 391 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-wireless-hotspot-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-wireless-no-route-symbolic-ref.pngbin0 -> 320 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-wireless-no-route-symbolic.svg35
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-wireless-offline-symbolic-ref.pngbin0 -> 499 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-wireless-offline-symbolic.svg35
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-wireless-signal-excellent-symbolic-ref.pngbin0 -> 392 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-wireless-signal-excellent-symbolic.svg34
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-wireless-signal-good-symbolic-ref.pngbin0 -> 401 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-wireless-signal-good-symbolic.svg34
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-wireless-signal-none-symbolic-ref.pngbin0 -> 438 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-wireless-signal-none-symbolic.svg34
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-wireless-signal-ok-symbolic-ref.pngbin0 -> 429 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-wireless-signal-ok-symbolic.svg34
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-wireless-signal-weak-symbolic-ref.pngbin0 -> 436 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-wireless-signal-weak-symbolic.svg34
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-wireless-symbolic-ref.pngbin0 -> 420 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-wireless-symbolic.svg45
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-workgroup-symbolic-ref.pngbin0 -> 291 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/network-workgroup-symbolic.svg36
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/night-light-symbolic-ref.pngbin0 -> 347 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/night-light-symbolic.svg35
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/non-starred-symbolic-ref.pngbin0 -> 477 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/non-starred-symbolic.svg35
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/object-flip-horizontal-symbolic-ref.pngbin0 -> 305 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/object-flip-horizontal-symbolic.svg34
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/object-flip-vertical-symbolic-ref.pngbin0 -> 318 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/object-flip-vertical-symbolic.svg34
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/object-rotate-left-symbolic-ref.pngbin0 -> 301 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/object-rotate-left-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/object-rotate-right-symbolic-ref.pngbin0 -> 322 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/object-rotate-right-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/object-select-symbolic-ref.pngbin0 -> 259 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/object-select-symbolic.svg30
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/open-menu-symbolic-ref.pngbin0 -> 114 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/open-menu-symbolic.svg33
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/orientation-landscape-inverse-symbolic-ref.pngbin0 -> 256 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/orientation-landscape-inverse-symbolic.svg35
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/orientation-landscape-symbolic-ref.pngbin0 -> 269 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/orientation-landscape-symbolic.svg35
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/orientation-portrait-inverse-symbolic-ref.pngbin0 -> 270 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/orientation-portrait-inverse-symbolic.svg35
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/orientation-portrait-symbolic-ref.pngbin0 -> 282 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/orientation-portrait-symbolic.svg35
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/package-x-generic-symbolic-ref.pngbin0 -> 275 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/package-x-generic-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/pan-down-symbolic-ref.pngbin0 -> 146 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/pan-down-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/pan-end-symbolic-ref.pngbin0 -> 154 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/pan-end-symbolic-rtl-ref.pngbin0 -> 151 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/pan-end-symbolic-rtl.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/pan-end-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/pan-start-symbolic-ref.pngbin0 -> 151 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/pan-start-symbolic-rtl-ref.pngbin0 -> 154 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/pan-start-symbolic-rtl.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/pan-start-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/pan-up-symbolic-ref.pngbin0 -> 145 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/pan-up-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/pda-symbolic-ref.pngbin0 -> 432 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/pda-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/phone-apple-iphone-symbolic-ref.pngbin0 -> 193 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/phone-apple-iphone-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/phone-symbolic-ref.pngbin0 -> 179 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/phone-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/preferences-color-symbolic-ref.pngbin0 -> 444 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/preferences-color-symbolic.svg34
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/preferences-desktop-accessibility-symbolic-ref.pngbin0 -> 589 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/preferences-desktop-accessibility-symbolic.svg26
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/preferences-desktop-display-symbolic-ref.pngbin0 -> 458 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/preferences-desktop-display-symbolic.svg33
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/preferences-desktop-font-symbolic-ref.pngbin0 -> 306 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/preferences-desktop-font-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/preferences-desktop-keyboard-shortcuts-symbolic-ref.pngbin0 -> 491 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/preferences-desktop-keyboard-shortcuts-symbolic.svg33
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/preferences-desktop-keyboard-symbolic-ref.pngbin0 -> 183 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/preferences-desktop-keyboard-symbolic.svg35
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/preferences-desktop-locale-symbolic-ref.pngbin0 -> 435 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/preferences-desktop-locale-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/preferences-desktop-remote-desktop-symbolic-ref.pngbin0 -> 369 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/preferences-desktop-remote-desktop-symbolic.svg34
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/preferences-desktop-screensaver-symbolic-ref.pngbin0 -> 420 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/preferences-desktop-screensaver-symbolic.svg35
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/preferences-desktop-wallpaper-symbolic-ref.pngbin0 -> 382 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/preferences-desktop-wallpaper-symbolic.svg34
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/preferences-other-symbolic-ref.pngbin0 -> 542 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/preferences-other-symbolic.svg35
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/preferences-system-details-symbolic-ref.pngbin0 -> 213 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/preferences-system-details-symbolic.svg35
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/preferences-system-devices-symbolic-ref.pngbin0 -> 259 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/preferences-system-devices-symbolic.svg37
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/preferences-system-network-proxy-symbolic-ref.pngbin0 -> 395 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/preferences-system-network-proxy-symbolic.svg37
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/preferences-system-network-symbolic-ref.pngbin0 -> 291 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/preferences-system-network-symbolic.svg35
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/preferences-system-notifications-symbolic-ref.pngbin0 -> 354 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/preferences-system-notifications-symbolic.svg36
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/preferences-system-privacy-symbolic-ref.pngbin0 -> 300 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/preferences-system-privacy-symbolic.svg35
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/preferences-system-search-symbolic-ref.pngbin0 -> 464 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/preferences-system-search-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/preferences-system-sharing-symbolic-ref.pngbin0 -> 437 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/preferences-system-sharing-symbolic.svg34
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/preferences-system-symbolic-ref.pngbin0 -> 592 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/preferences-system-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/preferences-system-time-symbolic-ref.pngbin0 -> 564 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/preferences-system-time-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/printer-error-symbolic-ref.pngbin0 -> 277 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/printer-error-symbolic.svg34
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/printer-network-symbolic-ref.pngbin0 -> 191 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/printer-network-symbolic.svg36
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/printer-printing-symbolic-ref.pngbin0 -> 238 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/printer-printing-symbolic.svg35
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/printer-symbolic-ref.pngbin0 -> 181 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/printer-symbolic.svg35
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/printer-warning-symbolic-ref.pngbin0 -> 227 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/printer-warning-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/process-stop-symbolic-ref.pngbin0 -> 407 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/process-stop-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/radio-checked-symbolic-ref.pngbin0 -> 578 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/radio-checked-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/radio-mixed-symbolic-ref.pngbin0 -> 554 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/radio-mixed-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/radio-symbolic-ref.pngbin0 -> 430 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/radio-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/rotation-allowed-symbolic-ref.pngbin0 -> 522 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/rotation-allowed-symbolic.svg33
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/rotation-locked-symbolic-ref.pngbin0 -> 532 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/rotation-locked-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/scanner-symbolic-ref.pngbin0 -> 355 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/scanner-symbolic.svg35
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/security-high-symbolic-ref.pngbin0 -> 347 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/security-high-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/security-low-symbolic-ref.pngbin0 -> 311 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/security-low-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/security-medium-symbolic-ref.pngbin0 -> 336 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/security-medium-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/selection-end-symbolic-ref.pngbin0 -> 136 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/selection-end-symbolic-rtl-ref.pngbin0 -> 149 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/selection-end-symbolic-rtl.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/selection-end-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/selection-start-symbolic-ref.pngbin0 -> 149 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/selection-start-symbolic-rtl-ref.pngbin0 -> 136 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/selection-start-symbolic-rtl.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/selection-start-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/semi-starred-symbolic-ref.pngbin0 -> 478 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/semi-starred-symbolic-rtl-ref.pngbin0 -> 480 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/semi-starred-symbolic-rtl.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/semi-starred-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/send-to-symbolic-ref.pngbin0 -> 475 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/send-to-symbolic.svg36
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/software-update-available-symbolic-ref.pngbin0 -> 504 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/software-update-available-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/software-update-urgent-symbolic-ref.pngbin0 -> 492 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/software-update-urgent-symbolic.svg30
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/star-new-symbolic-ref.pngbin0 -> 423 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/star-new-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/starred-symbolic-ref.pngbin0 -> 391 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/starred-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/start-here-symbolic-ref.pngbin0 -> 574 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/start-here-symbolic.svg38
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/system-file-manager-symbolic-ref.pngbin0 -> 267 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/system-file-manager-symbolic.svg30
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/system-help-symbolic-ref.pngbin0 -> 464 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/system-help-symbolic.svg33
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/system-lock-screen-symbolic-ref.pngbin0 -> 242 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/system-lock-screen-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/system-run-symbolic-ref.pngbin0 -> 569 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/system-run-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/system-search-symbolic-ref.pngbin0 -> 464 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/system-search-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/system-shutdown-symbolic-ref.pngbin0 -> 494 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/system-shutdown-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/system-software-install-symbolic-ref.pngbin0 -> 275 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/system-software-install-symbolic.svg33
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/system-switch-user-symbolic-ref.pngbin0 -> 365 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/system-switch-user-symbolic.svg39
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/system-users-symbolic-ref.pngbin0 -> 306 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/system-users-symbolic.svg34
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/tab-new-symbolic-ref.pngbin0 -> 325 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/tab-new-symbolic.svg36
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/task-due-symbolic-ref.pngbin0 -> 353 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/task-due-symbolic.svg34
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/task-past-due-symbolic-ref.pngbin0 -> 335 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/task-past-due-symbolic.svg34
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/text-editor-symbolic-ref.pngbin0 -> 295 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/text-editor-symbolic.svg37
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/text-x-generic-symbolic-ref.pngbin0 -> 216 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/text-x-generic-symbolic.svg30
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/thunderbolt-acquiring-symbolic-ref.pngbin0 -> 404 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/thunderbolt-acquiring-symbolic.svg38
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/thunderbolt-symbolic-ref.pngbin0 -> 550 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/thunderbolt-symbolic.svg35
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/tools-check-spelling-symbolic-ref.pngbin0 -> 364 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/tools-check-spelling-symbolic.svg33
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/touchpad-disabled-symbolic-ref.pngbin0 -> 324 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/touchpad-disabled-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/tv-symbolic-ref.pngbin0 -> 412 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/tv-symbolic.svg34
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/uninterruptible-power-supply-symbolic-ref.pngbin0 -> 351 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/uninterruptible-power-supply-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/user-available-symbolic-ref.pngbin0 -> 255 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/user-available-symbolic.svg153
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/user-away-symbolic-ref.pngbin0 -> 342 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/user-away-symbolic.svg33
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/user-bookmarks-symbolic-ref.pngbin0 -> 391 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/user-bookmarks-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/user-busy-symbolic-ref.pngbin0 -> 274 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/user-busy-symbolic.svg33
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/user-desktop-symbolic-ref.pngbin0 -> 189 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/user-desktop-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/user-home-symbolic-ref.pngbin0 -> 380 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/user-home-symbolic.svg44
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/user-idle-symbolic-ref.pngbin0 -> 263 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/user-idle-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/user-info-symbolic-ref.pngbin0 -> 325 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/user-info-symbolic.svg34
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/user-invisible-symbolic-ref.pngbin0 -> 295 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/user-invisible-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/user-not-tracked-symbolic-ref.pngbin0 -> 630 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/user-not-tracked-symbolic.svg36
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/user-offline-symbolic-ref.pngbin0 -> 375 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/user-offline-symbolic.svg33
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/user-status-pending-symbolic-ref.pngbin0 -> 301 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/user-status-pending-symbolic.svg35
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/user-trash-full-symbolic-ref.pngbin0 -> 492 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/user-trash-full-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/user-trash-symbolic-ref.pngbin0 -> 218 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/user-trash-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/utilities-system-monitor-symbolic-ref.pngbin0 -> 372 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/utilities-system-monitor-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/utilities-terminal-symbolic-ref.pngbin0 -> 328 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/utilities-terminal-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/video-display-symbolic-ref.pngbin0 -> 272 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/video-display-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/video-joined-displays-symbolic-ref.pngbin0 -> 328 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/video-joined-displays-symbolic.svg38
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/video-single-display-symbolic-ref.pngbin0 -> 270 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/video-single-display-symbolic.svg36
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/video-x-generic-symbolic-ref.pngbin0 -> 212 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/video-x-generic-symbolic.svg32
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/view-app-grid-symbolic-ref.pngbin0 -> 122 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/view-app-grid-symbolic.svg43
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/view-continuous-symbolic-ref.pngbin0 -> 156 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/view-continuous-symbolic.svg35
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/view-dual-symbolic-ref.pngbin0 -> 268 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/view-dual-symbolic.svg35
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/view-fullscreen-symbolic-ref.pngbin0 -> 345 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/view-fullscreen-symbolic.svg40
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/view-grid-symbolic-ref.pngbin0 -> 137 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/view-grid-symbolic.svg38
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/view-list-symbolic-ref.pngbin0 -> 185 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/view-list-symbolic.svg38
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/view-mirror-symbolic-ref.pngbin0 -> 470 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/view-mirror-symbolic.svg36
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/view-more-horizontal-symbolic-ref.pngbin0 -> 136 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/view-more-horizontal-symbolic.svg33
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/view-more-symbolic-ref.pngbin0 -> 139 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/view-more-symbolic.svg34
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/view-paged-symbolic-ref.pngbin0 -> 182 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/view-paged-symbolic.svg34
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/view-pin-symbolic-ref.pngbin0 -> 216 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/view-pin-symbolic.svg35
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/view-refresh-symbolic-ref.pngbin0 -> 424 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/view-refresh-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/view-restore-symbolic-ref.pngbin0 -> 311 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/view-restore-symbolic.svg39
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/view-sort-ascending-symbolic-ref.pngbin0 -> 308 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/view-sort-ascending-symbolic.svg34
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/view-sort-descending-symbolic-ref.pngbin0 -> 290 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/view-sort-descending-symbolic.svg34
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/view-wrapped-symbolic-ref.pngbin0 -> 343 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/view-wrapped-symbolic-rtl-ref.pngbin0 -> 343 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/view-wrapped-symbolic-rtl.svg34
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/view-wrapped-symbolic.svg34
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/weather-clear-night-symbolic-ref.pngbin0 -> 425 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/weather-clear-night-symbolic.svg36
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/weather-clear-symbolic-ref.pngbin0 -> 409 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/weather-clear-symbolic.svg43
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/weather-few-clouds-night-symbolic-ref.pngbin0 -> 509 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/weather-few-clouds-night-symbolic.svg37
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/weather-few-clouds-symbolic-ref.pngbin0 -> 484 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/weather-few-clouds-symbolic.svg42
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/weather-fog-symbolic-ref.pngbin0 -> 313 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/weather-fog-symbolic.svg33
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/weather-overcast-symbolic-ref.pngbin0 -> 274 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/weather-overcast-symbolic.svg30
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/weather-severe-alert-symbolic-ref.pngbin0 -> 324 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/weather-severe-alert-symbolic.svg33
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/weather-showers-scattered-symbolic-ref.pngbin0 -> 488 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/weather-showers-scattered-symbolic.svg33
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/weather-showers-symbolic-ref.pngbin0 -> 460 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/weather-showers-symbolic.svg36
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/weather-snow-symbolic-ref.pngbin0 -> 563 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/weather-snow-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/weather-storm-symbolic-ref.pngbin0 -> 465 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/weather-storm-symbolic.svg33
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/weather-windy-symbolic-ref.pngbin0 -> 422 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/weather-windy-symbolic.svg40
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/web-browser-symbolic-ref.pngbin0 -> 578 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/web-browser-symbolic.svg33
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/window-close-symbolic-ref.pngbin0 -> 297 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/window-close-symbolic.svg28
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/window-maximize-symbolic-ref.pngbin0 -> 128 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/window-maximize-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/window-minimize-symbolic-ref.pngbin0 -> 113 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/window-minimize-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/window-restore-symbolic-ref.pngbin0 -> 130 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/window-restore-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/x-office-address-book-symbolic-ref.pngbin0 -> 416 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/x-office-address-book-symbolic.svg39
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/x-office-calendar-symbolic-ref.pngbin0 -> 241 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/x-office-calendar-symbolic.svg36
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/x-office-document-symbolic-ref.pngbin0 -> 301 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/x-office-document-symbolic.svg35
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/x-office-drawing-symbolic-ref.pngbin0 -> 390 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/x-office-drawing-symbolic.svg33
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/x-office-presentation-symbolic-ref.pngbin0 -> 288 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/x-office-presentation-symbolic.svg34
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/x-office-spreadsheet-symbolic-ref.pngbin0 -> 302 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/x-office-spreadsheet-symbolic.svg39
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/zoom-fit-best-symbolic-ref.pngbin0 -> 202 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/zoom-fit-best-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/zoom-in-symbolic-ref.pngbin0 -> 189 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/zoom-in-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/zoom-original-symbolic-ref.pngbin0 -> 195 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/zoom-original-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/zoom-out-symbolic-ref.pngbin0 -> 181 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/adwaita/zoom-out-symbolic.svg31
-rw-r--r--rsvg/tests/fixtures/reftests/bug483-attribute-selectors-ref.pngbin0 -> 334 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/bug483-attribute-selectors.svg23
-rw-r--r--rsvg/tests/fixtures/reftests/bug525-specificity-ref.pngbin0 -> 302 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/bug525-specificity.svg27
-rw-r--r--rsvg/tests/fixtures/reftests/bugs-reftests/bug875-svg-use-width-height-ref.svg4
-rw-r--r--rsvg/tests/fixtures/reftests/bugs-reftests/bug875-svg-use-width-height.svg9
-rw-r--r--rsvg/tests/fixtures/reftests/bugs-reftests/bug880-stroke-wide-line-ref.svg4
-rw-r--r--rsvg/tests/fixtures/reftests/bugs-reftests/bug880-stroke-wide-line.svg13
-rw-r--r--rsvg/tests/fixtures/reftests/bugs-reftests/bug885-vector-effect-non-scaling-stroke-ref.svg4
-rw-r--r--rsvg/tests/fixtures/reftests/bugs-reftests/bug885-vector-effect-non-scaling-stroke.svg4
-rw-r--r--rsvg/tests/fixtures/reftests/bugs-reftests/bug92-symbol-clip-ref.svg5
-rw-r--r--rsvg/tests/fixtures/reftests/bugs-reftests/bug92-symbol-clip.svg12
-rw-r--r--rsvg/tests/fixtures/reftests/bugs-reftests/bug930-invalid-clip-path-transform-ref.svg4
-rw-r--r--rsvg/tests/fixtures/reftests/bugs-reftests/bug930-invalid-clip-path-transform.svg9
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/a-inside-text-content-738-ref.pngbin0 -> 2799 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/a-inside-text-content-738.svg24
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/a-inside-text-content-pseudo-class-738-ref.pngbin0 -> 2799 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/a-inside-text-content-pseudo-class-738.svg26
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug108-font-size-relative-ref.pngbin0 -> 2397 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug108-font-size-relative.svg64
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug112-svg-delayed-attributes-ref.pngbin0 -> 99 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug112-svg-delayed-attributes.svg6
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug165-zero-length-subpath-square-linecap-ref.pngbin0 -> 2414 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug165-zero-length-subpath-square-linecap.svg6
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug181-inheritable-attrs-in-svg-ref.pngbin0 -> 1214 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug181-inheritable-attrs-in-svg.svg3
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug241-light-source-type-ref.pngbin0 -> 4013 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug241-light-source-type.svg16
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug245-negative-dashoffset-ref.pngbin0 -> 161 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug245-negative-dashoffset.svg4
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug282-drop-shadow-ref.pngbin0 -> 1733 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug282-drop-shadow.svg12
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug340047-ref.pngbin0 -> 5565 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug340047.svg43
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug363-missing-space-ref.pngbin0 -> 7943 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug363-missing-space.svg6
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug372-small-arcs-ref.pngbin0 -> 853 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug372-small-arcs.svg24
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug373-gradient-userspaceonuse-ref.pngbin0 -> 631 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug373-gradient-userspaceonuse.svg39
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug403357-ref.pngbin0 -> 1366 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug403357.svg48
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug476507-ref.pngbin0 -> 5982 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug476507.svg78
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug481-tspan-uses-at-least-first-x-ref.pngbin0 -> 1530 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug481-tspan-uses-at-least-first-x.svg15
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug494-text-accumulate-dy-ref.pngbin0 -> 4178 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug494-text-accumulate-dy.svg14
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug506-pattern-fallback-ref.pngbin0 -> 486 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug506-pattern-fallback.svg19
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug510-pattern-fill-opacity-ref.pngbin0 -> 1512 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug510-pattern-fill-opacity.svg21
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug510-pattern-fill-ref.pngbin0 -> 1053 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug510-pattern-fill.svg21
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug548-data-url-without-mimetype-ref.pngbin0 -> 77 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug548-data-url-without-mimetype.svg6
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug563933-ref.pngbin0 -> 2470 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug563933.svg86
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug577-multiple-font-families-ref.pngbin0 -> 3404 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug587721-text-transform-ref.pngbin0 -> 4050 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug587721-text-transform.svg13
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug590-mask-units-ref.pngbin0 -> 2701 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug590-mask-units.svg26
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug603550-mask-luminance-ref.pngbin0 -> 4597 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug603550-mask-luminance.svg130
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug609-clippath-transform-ref.pngbin0 -> 231 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug609-clippath-transform.svg23
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug634324-blur-negative-transform-ref.pngbin0 -> 25021 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug634324-blur-negative-transform.svg14
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug642-nested-tspan-dx-dy-ref.pngbin0 -> 7092 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug642-nested-tspan-dx-dy.svg17
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug667-tspan-visibility-ref.pngbin0 -> 2236 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug667-tspan-visibility.svg26
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug668-small-caps-ref.pngbin0 -> 2383 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug668-small-caps.svg5
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug689832-unresolved-gradient-ref.pngbin0 -> 943 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug689832-unresolved-gradient.svg220
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug718-rect-negative-rx-ry-ref.pngbin0 -> 658 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug718-rect-negative-rx-ry.svg11
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug730-font-scaling-ref.pngbin0 -> 16123 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug730-font-scaling.svg18
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug738367-ref.pngbin0 -> 8692 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug738367.svg7
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug749415-ref.pngbin0 -> 26974 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug749415.svg38
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug760180-ref.pngbin0 -> 10641 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug760180.svg159
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug761175-recursive-masks-ref.pngbin0 -> 513 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug761175-recursive-masks.svg50
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug761871-reset-reflection-points-ref.pngbin0 -> 695 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug761871-reset-reflection-points.svg18
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug763386-marker-coincident-ref.pngbin0 -> 1198 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug763386-marker-coincident.svg15
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug776297-marker-on-non-path-elements-ref.pngbin0 -> 1203 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug776297-marker-on-non-path-elements.svg16
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug786372-default-style-type-ref.pngbin0 -> 287 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug786372-default-style-type.svg1
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug788-inner-svg-viewbox-ref.pngbin0 -> 362 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/bug788-inner-svg-viewbox.svg21
-rw-r--r--rsvg/tests/fixtures/reftests/bugs/ignore-577-multiple-font-families.svg7
-rw-r--r--rsvg/tests/fixtures/reftests/css-import-ref.pngbin0 -> 938 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/css-import-url-ref.pngbin0 -> 938 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/css-import-url.svg7
-rw-r--r--rsvg/tests/fixtures/reftests/css-import.css1
-rw-r--r--rsvg/tests/fixtures/reftests/css-import.svg7
-rw-r--r--rsvg/tests/fixtures/reftests/duplicate-id-ref.pngbin0 -> 94 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/duplicate-id.svg7
-rw-r--r--rsvg/tests/fixtures/reftests/filter-component-transfer-from-reference-page-ref.pngbin0 -> 8371 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/filter-component-transfer-from-reference-page.svg63
-rw-r--r--rsvg/tests/fixtures/reftests/filter-composite-color-interpolation-filters-ref.pngbin0 -> 7948 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/filter-conv-bounds-ref.pngbin0 -> 937 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/filter-conv-bounds.svg36
-rw-r--r--rsvg/tests/fixtures/reftests/filter-conv-divisor-ref.pngbin0 -> 1410 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/filter-conv-divisor.svg70
-rw-r--r--rsvg/tests/fixtures/reftests/filter-effects-region-ref.pngbin0 -> 1698 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/filter-effects-region.svg84
-rw-r--r--rsvg/tests/fixtures/reftests/filter-image-from-reference-page-ref.pngbin0 -> 14681 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/filter-image-from-reference-page.svg35
-rw-r--r--rsvg/tests/fixtures/reftests/filter-kernel-unit-length-ref.pngbin0 -> 3815 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/filter-kernel-unit-length.svg30
-rw-r--r--rsvg/tests/fixtures/reftests/filter-offset-ref.pngbin0 -> 1274 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/filter-offset.svg33
-rw-r--r--rsvg/tests/fixtures/reftests/font-shorthand-ref.pngbin0 -> 4228 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/font-shorthand.svg4
-rw-r--r--rsvg/tests/fixtures/reftests/gzip-compressed-ref.pngbin0 -> 93 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/gzip-compressed.svgbin0 -> 131 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/hexchat-ref.pngbin0 -> 3930 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/hexchat.svg58
-rw-r--r--rsvg/tests/fixtures/reftests/ignore-filter-composite-color-interpolation-filters.svg65
-rw-r--r--rsvg/tests/fixtures/reftests/include-compressed-ref.pngbin0 -> 93 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/include-compressed.svg3
-rw-r--r--rsvg/tests/fixtures/reftests/include-fallback-ref.pngbin0 -> 1303 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/include-fallback.svg10
-rw-r--r--rsvg/tests/fixtures/reftests/include-text-ref.pngbin0 -> 1078 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/include-text.svg6
-rw-r--r--rsvg/tests/fixtures/reftests/rtl-tspan-ref.pngbin0 -> 5132 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/rtl-tspan.svg9
-rw-r--r--rsvg/tests/fixtures/reftests/specificity-ref.pngbin0 -> 89 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/specificity.svg25
-rw-r--r--rsvg/tests/fixtures/reftests/structural-pseudo-classes-ref.pngbin0 -> 1363 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/structural-pseudo-classes.svg59
-rw-r--r--rsvg/tests/fixtures/reftests/style-with-xml-comments-ref.pngbin0 -> 93 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/style-with-xml-comments.svg10
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/coords-trans-01-b-ref.pngbin0 -> 15526 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/coords-trans-01-b.svg239
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/coords-trans-02-t-ref.pngbin0 -> 10948 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/coords-trans-02-t.svg176
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/coords-trans-03-t-ref.pngbin0 -> 9447 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/coords-trans-03-t.svg99
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/coords-trans-04-t-ref.pngbin0 -> 7345 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/coords-trans-04-t.svg88
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/coords-trans-05-t-ref.pngbin0 -> 10865 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/coords-trans-05-t.svg88
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/coords-trans-06-t-ref.pngbin0 -> 11568 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/coords-trans-06-t.svg82
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/coords-trans-07-t-ref.pngbin0 -> 13471 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/coords-trans-07-t.svg70
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/coords-trans-08-t-ref.pngbin0 -> 15167 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/coords-trans-08-t.svg76
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/coords-trans-09-t-ref.pngbin0 -> 24169 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/coords-trans-09-t.svg102
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/coords-viewattr-01-b-ref.pngbin0 -> 20579 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/coords-viewattr-01-b.svg140
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/coords-viewattr-02-b-ref.pngbin0 -> 41857 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/coords-viewattr-02-b.svg716
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/coords-viewattr-03-b-ref.pngbin0 -> 32874 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/coords-viewattr-03-b.svg94
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-background-01-f-ref.pngbin0 -> 19599 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-background-01-f.svg159
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-blend-01-b-ref.pngbin0 -> 19129 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-blend-01-b.svg108
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-color-01-b-ref.pngbin0 -> 30271 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-color-01-b.svg112
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-color-02-b-ref.pngbin0 -> 7757 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-color-02-b.svg112
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-composite-02-b-ref.pngbin0 -> 19527 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-composite-02-b.svg203
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-composite-03-f-ref.pngbin0 -> 4994 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-composite-03-f.svg91
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-composite-04-f-ref.pngbin0 -> 115093 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-composite-04-f.svg78
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-composite-05-f-ref.pngbin0 -> 30491 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-composite-05-f.svg67
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-comptran-01-b-ref.pngbin0 -> 21117 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-comptran-01-b.svg126
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-conv-01-f-ref.pngbin0 -> 52909 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-conv-01-f.svg112
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-conv-02-f-ref.pngbin0 -> 35787 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-conv-02-f.svg77
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-conv-03-f-ref.pngbin0 -> 29721 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-conv-03-f.svg104
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-conv-04-f-ref.pngbin0 -> 77530 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-conv-04-f.svg163
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-conv-05-f-ref.pngbin0 -> 11750 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-conv-05-f.svg83
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-diffuse-01-f-ref.pngbin0 -> 25302 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-diffuse-01-f.svg152
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-displace-01-f-ref.pngbin0 -> 50115 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-displace-02-f-ref.pngbin0 -> 8210 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-displace-02-f.svg90
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-example-01-b-ref.pngbin0 -> 22681 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-felem-02-f-ref.pngbin0 -> 13814 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-felem-02-f.svg127
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-gauss-01-b-ref.pngbin0 -> 21424 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-gauss-01-b.svg93
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-gauss-02-f-ref.pngbin0 -> 7329 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-gauss-02-f.svg85
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-gauss-03-f-ref.pngbin0 -> 5023 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-gauss-03-f.svg65
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-image-01-b-ref.pngbin0 -> 92798 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-image-01-b.svg59
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-image-02-b-ref.pngbin0 -> 27166 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-image-02-b.svg83
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-image-03-f-ref.pngbin0 -> 12185 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-image-03-f.svg179
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-image-04-f-ref.pngbin0 -> 12972 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-image-04-f.svg119
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-image-05-f-ref.pngbin0 -> 23055 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-image-05-f.svg195
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-light-01-f-ref.pngbin0 -> 41139 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-light-01-f.svg187
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-light-02-f-ref.pngbin0 -> 12396 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-light-02-f.svg97
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-light-03-f-ref.pngbin0 -> 15089 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-light-03-f.svg124
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-light-04-f-ref.pngbin0 -> 13284 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-light-04-f.svg136
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-light-05-f-ref.pngbin0 -> 35062 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-light-05-f.svg252
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-morph-01-f-ref.pngbin0 -> 34940 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-morph-01-f.svg103
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-offset-01-b-ref.pngbin0 -> 11188 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-offset-01-b.svg112
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-overview-01-b-ref.pngbin0 -> 38045 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-overview-01-b.svg165
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-overview-02-b-ref.pngbin0 -> 45458 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-overview-02-b.svg178
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-overview-03-b-ref.pngbin0 -> 45573 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-overview-03-b.svg166
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-specular-01-f-ref.pngbin0 -> 34884 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-specular-01-f.svg195
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-tile-01-b-ref.pngbin0 -> 8034 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-tile-01-b.svg80
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-turb-01-f-ref.pngbin0 -> 144941 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-turb-01-f.svg102
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-turb-02-f-ref.pngbin0 -> 22335 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/filters-turb-02-f.svg148
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/ignore-filters-displace-01-f.svg141
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/ignore-filters-example-01-b.svg93
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/ignore-masking-path-07-b.svg147
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/images/DisplaceChecker.pngbin0 -> 2470 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/images/bumpMap2.pngbin0 -> 657 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/images/bumpMap3.pngbin0 -> 433 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/images/filters-conv-01-f.includeimage.pngbin0 -> 9281 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/images/image1.jpgbin0 -> 34183 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/images/pinksquidj.pngbin0 -> 31090 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/images/purplesquidj.pngbin0 -> 48672 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/images/rotate20.pngbin0 -> 1434 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/images/smiley.pngbin0 -> 2856 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/images/sphere.pngbin0 -> 5923 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/images/stefan_252_tRNS_opti.pngbin0 -> 12777 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/images/townsville.jpgbin0 -> 52480 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/masking-filter-01-f-ref.pngbin0 -> 7924 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/masking-filter-01-f.svg81
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/masking-intro-01-f-ref.pngbin0 -> 17747 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/masking-intro-01-f.svg81
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/masking-mask-01-b-ref.pngbin0 -> 23283 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/masking-mask-01-b.svg131
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/masking-mask-02-f-ref.pngbin0 -> 5021 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/masking-mask-02-f.svg50
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/masking-opacity-01-b-ref.pngbin0 -> 43003 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/masking-opacity-01-b.svg125
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/masking-path-01-b-ref.pngbin0 -> 15837 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/masking-path-01-b.svg95
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/masking-path-02-b-ref.pngbin0 -> 17531 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/masking-path-02-b.svg84
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/masking-path-03-b-ref.pngbin0 -> 26498 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/masking-path-03-b.svg134
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/masking-path-04-b-ref.pngbin0 -> 93356 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/masking-path-04-b.svg79
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/masking-path-05-f-ref.pngbin0 -> 9010 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/masking-path-05-f.svg78
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/masking-path-07-b-ref.pngbin0 -> 13226 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/masking-path-08-b-ref.pngbin0 -> 8232 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/masking-path-08-b.svg140
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/painting-control-02-f-ref.pngbin0 -> 5105 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/painting-control-02-f.svg65
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/painting-marker-01-f-ref.pngbin0 -> 10432 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/painting-marker-01-f.svg157
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/painting-marker-02-f-ref.pngbin0 -> 11457 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/painting-marker-02-f.svg245
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/painting-marker-03-f-ref.pngbin0 -> 36022 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/painting-marker-03-f.svg86
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/painting-marker-04-f-ref.pngbin0 -> 35004 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/painting-marker-04-f.svg84
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/painting-marker-06-f-ref.pngbin0 -> 10641 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/painting-marker-06-f.svg159
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/painting-marker-07-f-ref.pngbin0 -> 5669 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/painting-marker-07-f.svg66
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/painting-marker-properties-01-f-ref.pngbin0 -> 6820 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/painting-marker-properties-01-f.svg95
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/painting-stroke-01-t-ref.pngbin0 -> 16681 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/painting-stroke-01-t.svg68
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/painting-stroke-02-t-ref.pngbin0 -> 20598 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/painting-stroke-02-t.svg63
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/painting-stroke-03-t-ref.pngbin0 -> 21276 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/painting-stroke-03-t.svg64
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/painting-stroke-04-t-ref.pngbin0 -> 20026 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/painting-stroke-04-t.svg60
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/painting-stroke-05-t-ref.pngbin0 -> 8797 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/painting-stroke-05-t.svg88
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/painting-stroke-06-t-ref.pngbin0 -> 5266 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/painting-stroke-06-t.svg74
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/painting-stroke-07-t-ref.pngbin0 -> 6812 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/painting-stroke-07-t.svg63
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/painting-stroke-08-t-ref.pngbin0 -> 9131 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/painting-stroke-08-t.svg78
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/painting-stroke-09-t-ref.pngbin0 -> 4985 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/painting-stroke-09-t.svg59
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/paths-data-01-t-ref.pngbin0 -> 27842 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/paths-data-01-t.svg151
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/paths-data-02-t-ref.pngbin0 -> 35876 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/paths-data-02-t.svg124
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/paths-data-03-f-ref.pngbin0 -> 33259 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/paths-data-03-f.svg113
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/paths-data-04-t-ref.pngbin0 -> 19715 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/paths-data-04-t.svg82
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/paths-data-05-t-ref.pngbin0 -> 17198 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/paths-data-05-t.svg79
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/paths-data-06-t-ref.pngbin0 -> 8461 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/paths-data-06-t.svg83
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/paths-data-07-t-ref.pngbin0 -> 7647 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/paths-data-07-t.svg82
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/paths-data-08-t-ref.pngbin0 -> 21515 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/paths-data-08-t.svg82
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/paths-data-09-t-ref.pngbin0 -> 19348 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/paths-data-09-t.svg79
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/paths-data-10-t-ref.pngbin0 -> 23846 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/paths-data-10-t.svg111
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/paths-data-12-t-ref.pngbin0 -> 10181 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/paths-data-12-t.svg66
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/paths-data-13-t-ref.pngbin0 -> 5039 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/paths-data-13-t.svg56
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/paths-data-14-t-ref.pngbin0 -> 12954 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/paths-data-14-t.svg56
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/paths-data-15-t-ref.pngbin0 -> 6468 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/paths-data-15-t.svg60
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/paths-data-16-t-ref.pngbin0 -> 9812 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/paths-data-16-t.svg69
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/paths-data-17-f-ref.pngbin0 -> 4954 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/paths-data-17-f.svg65
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/paths-data-18-f-ref.pngbin0 -> 5250 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/paths-data-18-f.svg100
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/paths-data-19-f-ref.pngbin0 -> 23941 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/paths-data-19-f.svg107
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/paths-data-20-f-ref.pngbin0 -> 9633 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/paths-data-20-f.svg87
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-01-b-ref.pngbin0 -> 12480 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-01-b.svg69
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-02-b-ref.pngbin0 -> 25561 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-02-b.svg79
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-03-b-ref.pngbin0 -> 12249 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-03-b.svg77
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-04-b-ref.pngbin0 -> 27281 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-04-b.svg88
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-05-b-ref.pngbin0 -> 65682 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-05-b.svg94
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-06-b-ref.pngbin0 -> 24587 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-06-b.svg109
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-07-b-ref.pngbin0 -> 16104 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-07-b.svg88
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-08-b-ref.pngbin0 -> 42953 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-08-b.svg100
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-09-b-ref.pngbin0 -> 7685 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-09-b.svg107
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-10-b-ref.pngbin0 -> 12051 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-10-b.svg93
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-11-b-ref.pngbin0 -> 63163 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-11-b.svg124
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-12-b-ref.pngbin0 -> 33466 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-12-b.svg110
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-14-b-ref.pngbin0 -> 29324 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-14-b.svg120
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-15-b-ref.pngbin0 -> 10660 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-15-b.svg70
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-16-b-ref.pngbin0 -> 5254 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-16-b.svg81
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-18-b-ref.pngbin0 -> 5251 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-18-b.svg114
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-22-b-ref.pngbin0 -> 8073 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-22-b.svg97
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-23-f-ref.pngbin0 -> 6841 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-23-f.svg80
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-24-f-ref.pngbin0 -> 8890 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-24-f.svg68
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-stops-01-f-ref.pngbin0 -> 7057 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-stops-01-f.svg70
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/pservers-pattern-01-b-ref.pngbin0 -> 29302 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/pservers-pattern-01-b.svg108
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/pservers-pattern-02-f-ref.pngbin0 -> 35378 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/pservers-pattern-02-f.svg61
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/pservers-pattern-03-f-ref.pngbin0 -> 6845 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/pservers-pattern-03-f.svg91
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/pservers-pattern-04-f-ref.pngbin0 -> 6634 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/pservers-pattern-04-f.svg70
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/pservers-pattern-05-f-ref.pngbin0 -> 7836 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/pservers-pattern-05-f.svg64
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/pservers-pattern-06-f-ref.pngbin0 -> 6751 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/pservers-pattern-06-f.svg65
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/pservers-pattern-07-f-ref.pngbin0 -> 8292 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/pservers-pattern-07-f.svg65
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/pservers-pattern-08-f-ref.pngbin0 -> 8291 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/pservers-pattern-08-f.svg66
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/pservers-pattern-09-f-ref.pngbin0 -> 6625 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/pservers-pattern-09-f.svg70
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/resources/20x20.pngbin0 -> 1038 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/resources/bluesquidj.pngbin0 -> 37497 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/resources/stefan_252_tRNS_opti.pngbin0 -> 12777 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/resources/struct-symbol-01.pngbin0 -> 71497 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/resources/svgRef4.css4
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/resources/svgRef4.svg41
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/resources/text-extTref-BE-18-targ.svg58
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/resources/tree.jpgbin0 -> 66460 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/shapes-intro-01-t-ref.pngbin0 -> 9248 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/shapes-intro-01-t.svg108
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/shapes-intro-02-f-ref.pngbin0 -> 13081 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/shapes-intro-02-f.svg89
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/struct-cond-01-t-ref.pngbin0 -> 5010 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/struct-cond-01-t.svg61
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/struct-cond-03-t-ref.pngbin0 -> 4885 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/struct-cond-03-t.svg83
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/struct-group-03-t-ref.pngbin0 -> 22347 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/struct-group-03-t.svg285
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/struct-svg-03-f-ref.pngbin0 -> 6668 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/struct-svg-03-f.svg68
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/struct-symbol-01-b-ref.pngbin0 -> 52664 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/struct-symbol-01-b.svg89
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/struct-use-01-t-ref.pngbin0 -> 17058 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/struct-use-01-t.svg112
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/struct-use-03-t-ref.pngbin0 -> 8892 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/struct-use-03-t.svg76
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/struct-use-04-b-ref.pngbin0 -> 21560 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/struct-use-04-b.svg65
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/struct-use-09-b-ref.pngbin0 -> 7252 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/struct-use-09-b.svg74
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/struct-use-10-f-ref.pngbin0 -> 8339 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/struct-use-10-f.svg130
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/styling-css-01-b-ref.pngbin0 -> 10437 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/styling-css-01-b.svg90
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/styling-css-02-b-ref.pngbin0 -> 10228 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/styling-css-02-b.svg85
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/styling-css-03-b-ref.pngbin0 -> 13192 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/styling-css-03-b.svg106
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/styling-css-04-f-ref.pngbin0 -> 9426 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/styling-css-04-f.svg157
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/styling-css-07-f-ref.pngbin0 -> 5020 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/styling-css-07-f.svg62
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/styling-css-08-f-ref.pngbin0 -> 11155 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/styling-css-08-f.svg116
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/text-align-01-b-ref.pngbin0 -> 24464 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/text-align-01-b.svg80
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/text-align-02-b-ref.pngbin0 -> 26495 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/text-align-02-b.svg71
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/text-align-03-b-ref.pngbin0 -> 20317 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/text-align-03-b.svg82
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/text-fonts-02-t-ref.pngbin0 -> 23442 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/text-fonts-02-t.svg92
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/text-text-03-b-ref.pngbin0 -> 28286 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/text-text-03-b.svg94
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/text-text-08-b-ref.pngbin0 -> 43814 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/text-text-08-b.svg64
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/text-text-10-t-ref.pngbin0 -> 50554 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/text-text-10-t.svg76
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/text-tref-01-b-ref.pngbin0 -> 13431 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/text-tref-01-b.svg73
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/text-tref-02-b-ref.pngbin0 -> 11909 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/text-tref-02-b.svg79
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/text-tref-03-b-ref.pngbin0 -> 9970 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/text-tref-03-b.svg71
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/types-basic-02-f-ref.pngbin0 -> 18281 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg1.1/types-basic-02-f.svg84
-rw-r--r--rsvg/tests/fixtures/reftests/svg2-reftests/bug913-gaussian-blur-nonpositive-ref.svg7
-rw-r--r--rsvg/tests/fixtures/reftests/svg2-reftests/bug913-gaussian-blur-nonpositive.svg19
-rw-r--r--rsvg/tests/fixtures/reftests/svg2-reftests/ellipse-auto-rx-ry-ref.svg4
-rw-r--r--rsvg/tests/fixtures/reftests/svg2-reftests/ellipse-auto-rx-ry.svg5
-rw-r--r--rsvg/tests/fixtures/reftests/svg2-reftests/ellipse-single-auto-rx-ry-ref.svg5
-rw-r--r--rsvg/tests/fixtures/reftests/svg2-reftests/ellipse-single-auto-rx-ry.svg8
-rw-r--r--rsvg/tests/fixtures/reftests/svg2-reftests/isolation-ref.svg4
-rw-r--r--rsvg/tests/fixtures/reftests/svg2-reftests/isolation.svg7
-rw-r--r--rsvg/tests/fixtures/reftests/svg2-reftests/mask-and-opacity-ref.svg3
-rw-r--r--rsvg/tests/fixtures/reftests/svg2-reftests/mask-and-opacity.svg7
-rw-r--r--rsvg/tests/fixtures/reftests/svg2/bug743-fe-drop-shadow-ref.svg17
-rw-r--r--rsvg/tests/fixtures/reftests/svg2/bug743-fe-drop-shadow.svg10
-rw-r--r--rsvg/tests/fixtures/reftests/svg2/gradient-01-b-ref.pngbin0 -> 234830 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg2/gradient-01-b.svg137
-rw-r--r--rsvg/tests/fixtures/reftests/svg2/mix-blend-mode-ref.pngbin0 -> 25025 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg2/mix-blend-mode.svg1751
-rw-r--r--rsvg/tests/fixtures/reftests/svg2/multi-filter-ref.pngbin0 -> 5829 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg2/multi-filter.svg22
-rw-r--r--rsvg/tests/fixtures/reftests/svg2/paint-order-ref.pngbin0 -> 9505 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg2/paint-order.svg6
-rw-r--r--rsvg/tests/fixtures/reftests/svg2/text-paint-order-ref.pngbin0 -> 23494 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/svg2/text-paint-order.svg12
-rw-r--r--rsvg/tests/fixtures/reftests/system-language-de-ref.pngbin0 -> 94 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/system-language-de.svg7
-rw-r--r--rsvg/tests/fixtures/reftests/system-language-en-ref.pngbin0 -> 95 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/system-language-en.svg7
-rw-r--r--rsvg/tests/fixtures/reftests/system-language-other-ref.pngbin0 -> 95 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/system-language-other.svg7
-rw-r--r--rsvg/tests/fixtures/reftests/text-objectBoundingBox-ref.pngbin0 -> 925 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/text-objectBoundingBox.svg14
-rw-r--r--rsvg/tests/fixtures/reftests/text.txt1
-rw-r--r--rsvg/tests/fixtures/reftests/xml-lang-css-inherit-ref.pngbin0 -> 88 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/xml-lang-css-inherit.svg7
-rw-r--r--rsvg/tests/fixtures/reftests/xml-lang-css-ref.pngbin0 -> 126 bytes
-rw-r--r--rsvg/tests/fixtures/reftests/xml-lang-css.svg22
-rw-r--r--rsvg/tests/fixtures/render-crash/PixelRectangle-duplicate-crash.svg7
-rw-r--r--rsvg/tests/fixtures/render-crash/bug187-set-gradient-on-empty-path.svg13
-rw-r--r--rsvg/tests/fixtures/render-crash/bug193-filters-conv-05-f.svg83
-rw-r--r--rsvg/tests/fixtures/render-crash/bug227-negative-dasharray-value.svg3
-rw-r--r--rsvg/tests/fixtures/render-crash/bug266-filters-with-error-attributes.svg187
-rw-r--r--rsvg/tests/fixtures/render-crash/bug277-filter-on-empty-group.svg312
-rw-r--r--rsvg/tests/fixtures/render-crash/bug292-clip-empty-group.svg11
-rw-r--r--rsvg/tests/fixtures/render-crash/bug293-mask-empty-group.svg11
-rw-r--r--rsvg/tests/fixtures/render-crash/bug324-empty-svg.svg3
-rw-r--r--rsvg/tests/fixtures/render-crash/bug337-font-ex.svg9
-rw-r--r--rsvg/tests/fixtures/render-crash/bug338-zero-sized-image.svg3
-rw-r--r--rsvg/tests/fixtures/render-crash/bug340-marker-with-zero-sized-vbox.svg4
-rw-r--r--rsvg/tests/fixtures/render-crash/bug342-use-references-ancestor.svg5
-rw-r--r--rsvg/tests/fixtures/render-crash/bug343-feComponentTransfer-child-in-error.svg9
-rw-r--r--rsvg/tests/fixtures/render-crash/bug344-too-large-viewbox.svg1
-rw-r--r--rsvg/tests/fixtures/render-crash/bug345-too-large-size.svg3
-rw-r--r--rsvg/tests/fixtures/render-crash/bug395-feMorphology-negative-scaling.svg28
-rw-r--r--rsvg/tests/fixtures/render-crash/bug497-path-with-all-invalid-commands.svg13
-rw-r--r--rsvg/tests/fixtures/render-crash/bug581491-zero-sized-text.svg20
-rw-r--r--rsvg/tests/fixtures/render-crash/bug588-big-viewbox-yields-invalid-transform.svg23
-rw-r--r--rsvg/tests/fixtures/render-crash/bug591-vbox-overflow.svg11
-rw-r--r--rsvg/tests/fixtures/render-crash/bug593-mask-empty-bbox.svg10
-rw-r--r--rsvg/tests/fixtures/render-crash/bug721-pattern-cycle-from-child.svg7
-rw-r--r--rsvg/tests/fixtures/render-crash/bug721-pattern-cycle-from-other-child.svg10
-rw-r--r--rsvg/tests/fixtures/render-crash/bug777155-zero-sized-pattern.svg52
-rw-r--r--rsvg/tests/fixtures/render-crash/bug928-empty-feTile-bounds.svg12
-rw-r--r--rsvg/tests/fixtures/render-crash/bug932-too-big-font-size.svg9
-rw-r--r--rsvg/tests/fixtures/render-crash/feMerge-color-interpolation-srgb.svg47
-rw-r--r--rsvg/tests/fixtures/render-crash/filters-non-invertible-paffine.svg7
-rw-r--r--rsvg/tests/fixtures/render-crash/gradient-with-empty-bbox.svg14
-rw-r--r--rsvg/tests/fixtures/render-crash/gradient-with-no-children.svg11
-rw-r--r--rsvg/tests/fixtures/render-crash/pattern-with-empty-bbox.svg16
-rw-r--r--rsvg/tests/fixtures/render-crash/pattern-with-no-children.svg13
-rw-r--r--rsvg/tests/fixtures/render-crash/recursive-feimage.svg13
-rw-r--r--rsvg/tests/fixtures/text/bounds-ref.svg20
-rw-r--r--rsvg/tests/fixtures/text/bounds.svg48
-rw-r--r--rsvg/tests/fixtures/text/bug804-tspan-direction-change-ref.svg7
-rw-r--r--rsvg/tests/fixtures/text/bug804-tspan-direction-change.svg16
-rw-r--r--rsvg/tests/fixtures/text/bug806-text-anchor-chunk-ref.svg9
-rw-r--r--rsvg/tests/fixtures/text/bug806-text-anchor-chunk.svg10
-rw-r--r--rsvg/tests/fixtures/text/display-none-ref.svg4
-rw-r--r--rsvg/tests/fixtures/text/display-none.svg5
-rw-r--r--rsvg/tests/fixtures/text/hello-world.svg11
-rw-r--r--rsvg/tests/fixtures/text/span-bounds-when-offset-by-dx-ref.svg9
-rw-r--r--rsvg/tests/fixtures/text/span-bounds-when-offset-by-dx.svg9
-rw-r--r--rsvg/tests/fixtures/text/unicode-bidi-override-ref.svg6
-rw-r--r--rsvg/tests/fixtures/text/unicode-bidi-override.svg6
-rw-r--r--rsvg/tests/fixtures/text/visibility-hidden-ref.svg5
-rw-r--r--rsvg/tests/fixtures/text/visibility-hidden-x-attr.svg4
-rw-r--r--rsvg/tests/fixtures/text/visibility-hidden.svg5
-rw-r--r--rsvg/tests/resources/Ahem.ttfbin0 -> 21768 bytes
-rw-r--r--rsvg/tests/resources/NotoSansHebrew-Regular.ttfbin0 -> 17388 bytes
-rw-r--r--rsvg/tests/resources/README.md9
-rw-r--r--rsvg/tests/resources/Roboto-Bold.ttfbin0 -> 353376 bytes
-rw-r--r--rsvg/tests/resources/Roboto-BoldItalic.ttfbin0 -> 380912 bytes
-rw-r--r--rsvg/tests/resources/Roboto-Italic.ttfbin0 -> 379588 bytes
-rw-r--r--rsvg/tests/resources/Roboto-Regular.ttfbin0 -> 353888 bytes
-rw-r--r--rsvg/tests/src/api.rs216
-rw-r--r--rsvg/tests/src/bugs.rs455
-rw-r--r--rsvg/tests/src/cmdline/mod.rs1
-rw-r--r--rsvg/tests/src/cmdline/rsvg_convert.rs1079
-rw-r--r--rsvg/tests/src/compare_surfaces.rs112
-rw-r--r--rsvg/tests/src/errors.rs59
-rw-r--r--rsvg/tests/src/filters.rs371
-rw-r--r--rsvg/tests/src/geometries.rs135
-rw-r--r--rsvg/tests/src/intrinsic_dimensions.rs561
-rw-r--r--rsvg/tests/src/legacy_sizing.rs189
-rw-r--r--rsvg/tests/src/loading_crash.rs55
-rw-r--r--rsvg/tests/src/main.rs60
-rw-r--r--rsvg/tests/src/predicates/file.rs28
-rw-r--r--rsvg/tests/src/predicates/mod.rs10
-rw-r--r--rsvg/tests/src/predicates/pdf.rs358
-rw-r--r--rsvg/tests/src/predicates/png.rs193
-rw-r--r--rsvg/tests/src/predicates/svg.rs179
-rw-r--r--rsvg/tests/src/primitive_geometries.rs167
-rw-r--r--rsvg/tests/src/primitives.rs367
-rw-r--r--rsvg/tests/src/reference.rs1152
-rw-r--r--rsvg/tests/src/reference_utils.rs288
-rw-r--r--rsvg/tests/src/render_crash.rs75
-rw-r--r--rsvg/tests/src/shapes.rs13
-rw-r--r--rsvg/tests/src/text.rs127
-rw-r--r--rsvg/tests/src/utils.rs119
-rw-r--r--rsvg/tests/test-utils.c257
-rw-r--r--rsvg/tests/test-utils.h35
1765 files changed, 107029 insertions, 0 deletions
diff --git a/rsvg/Cargo.toml b/rsvg/Cargo.toml
new file mode 100644
index 00000000..4f6fa35e
--- /dev/null
+++ b/rsvg/Cargo.toml
@@ -0,0 +1,131 @@
+[package]
+name = "librsvg"
+documentation = "https://gnome.pages.gitlab.gnome.org/librsvg/doc/rsvg/index.html"
+version.workspace = true
+authors.workspace = true
+description.workspace = true
+license.workspace = true
+homepage.workspace = true
+repository.workspace = true
+edition.workspace = true
+rust-version.workspace = true
+
+[package.metadata.system-deps]
+gdk-pixbuf = { name = "gdk-pixbuf-2.0", version = "2.20" }
+gio = { name = "gio-2.0", version = "2.24" }
+glib = { name = "glib-2.0", version = "2.50" }
+pangocairo = "1.46"
+
+[package.metadata.system-deps.'cfg(windows)']
+fontconfig = { version = "1.7", optional = true }
+pangoft2 = { version = "1.46", optional = true }
+harfbuzz = { version = "2.0", optional = true }
+freetype2 = { version = "20.0.14", optional = true }
+cairo = { version = "1.16", optional = true }
+cairo-gobject = { version = "1.16", optional = true }
+cairo-png = { version = "1.16", optional = true }
+libxml2 = { name = "libxml-2.0", version = "2.9", optional = true }
+
+[package.metadata.system-deps.'cfg(not(windows))']
+fontconfig = { version = "1.7" }
+pangoft2 = { version = "1.46" }
+cairo = "1.16"
+cairo-gobject = "1.16"
+cairo-png = "1.16"
+harfbuzz = "2.0"
+freetype2 = "20.0.14"
+libxml2 = { name = "libxml-2.0", version = "2.9" }
+
+[lib]
+name = "rsvg"
+crate-type = [ "staticlib", "rlib" ]
+
+[dependencies]
+# Keep these in sync with respect to the cairo-rs version:
+# src/lib.rs - toplevel example in the docs
+byteorder = "1.4"
+cairo-rs = { version = "0.17", features=["v1_16", "png", "pdf", "ps", "svg"] }
+cast = "0.3.0"
+cssparser = "0.29.0"
+data-url = "0.2.0"
+encoding_rs = "0.8.32"
+float-cmp = "0.9.0"
+gdk-pixbuf = "0.17"
+gio = "0.17"
+glib = "0.17"
+itertools = "0.10.3"
+language-tags = "0.3.1"
+libc = "0.2"
+locale_config = "*" # recommended explicitly by locale_config's README.md
+markup5ever = "0.11.0"
+nalgebra = "0.32.1"
+num-traits = "0.2"
+once_cell = "1.2.0"
+pango = { version = "0.17", features = ["v1_46"] }
+pangocairo = "0.17"
+rayon = "1"
+rctree = "0.5.0"
+regex = "1.7.1"
+rgb = { version="0.8", features=["argb"] }
+selectors = "0.24.0"
+string_cache = "0.8.0"
+#thiserror = "1.0"
+tinyvec = { version = "1.2.0", features = ["alloc"] }
+url = "2"
+xml5ever = "0.17.0"
+
+[dev-dependencies]
+anyhow = "1.0"
+assert_cmd = "2.0.2"
+chrono = { version = "0.4.23", default-features = false, features = ["clock", "std"] }
+criterion = "0.4"
+lopdf = "0.29.0"
+matches = "0.1"
+png = "0.17.2"
+predicates = "2.0.0"
+proptest = "1.0.0"
+quick-error = "2.0.0"
+serde = { version = "1.0", features = ["derive"] }
+serde_json = "1.0"
+tempfile = "3"
+yeslogic-fontconfig-sys = "4.0.1"
+
+[build-dependencies]
+regex = "1.7.1"
+system-deps = "6.0.0"
+
+[[bench]]
+name = "box_blur"
+harness = false
+
+[[bench]]
+name = "composite"
+harness = false
+
+[[bench]]
+name = "lighting"
+harness = false
+
+[[bench]]
+name = "path_parser"
+harness = false
+
+[[bench]]
+name = "pixbuf_from_surface"
+harness = false
+
+[[bench]]
+name = "pixel_iterators"
+harness = false
+
+[[bench]]
+name = "pixel_ops"
+harness = false
+
+[[bench]]
+name = "srgb"
+harness = false
+
+[[bench]]
+name = "surface_from_pixbuf"
+harness = false
diff --git a/rsvg/benches/box_blur.rs b/rsvg/benches/box_blur.rs
new file mode 100644
index 00000000..876449ad
--- /dev/null
+++ b/rsvg/benches/box_blur.rs
@@ -0,0 +1,61 @@
+use criterion::{criterion_group, criterion_main, BenchmarkId, Criterion};
+
+use rsvg::{
+ surface_utils::shared_surface::{
+ AlphaOnly, Horizontal, NotAlphaOnly, SharedImageSurface, SurfaceType, Vertical,
+ },
+ IRect,
+};
+
+const SURFACE_SIDE: i32 = 512;
+const BOUNDS: IRect = IRect {
+ x0: 64,
+ y0: 64,
+ x1: 64 + 64,
+ y1: 64 + 64,
+};
+
+fn bench_box_blur(c: &mut Criterion) {
+ let mut group = c.benchmark_group("box_blur 9");
+
+ for input in [(false, false), (false, true), (true, false), (true, true)].iter() {
+ group.bench_with_input(
+ BenchmarkId::from_parameter(format!("{:?}", input)),
+ &input,
+ |b, &(vertical, alpha_only)| {
+ let surface_type = if *alpha_only {
+ SurfaceType::AlphaOnly
+ } else {
+ SurfaceType::SRgb
+ };
+ let input_surface =
+ SharedImageSurface::empty(SURFACE_SIDE, SURFACE_SIDE, surface_type).unwrap();
+
+ let mut output_surface =
+ cairo::ImageSurface::create(cairo::Format::ARgb32, SURFACE_SIDE, SURFACE_SIDE)
+ .unwrap();
+ const KERNEL_SIZE: usize = 9;
+
+ let f = match (vertical, alpha_only) {
+ (true, true) => SharedImageSurface::box_blur_loop::<Vertical, AlphaOnly>,
+ (true, false) => SharedImageSurface::box_blur_loop::<Vertical, NotAlphaOnly>,
+ (false, true) => SharedImageSurface::box_blur_loop::<Horizontal, AlphaOnly>,
+ (false, false) => SharedImageSurface::box_blur_loop::<Horizontal, NotAlphaOnly>,
+ };
+
+ b.iter(|| {
+ f(
+ &input_surface,
+ &mut output_surface,
+ BOUNDS,
+ KERNEL_SIZE,
+ KERNEL_SIZE / 2,
+ )
+ })
+ },
+ );
+ }
+}
+
+criterion_group!(benches, bench_box_blur);
+criterion_main!(benches);
diff --git a/rsvg/benches/composite.rs b/rsvg/benches/composite.rs
new file mode 100644
index 00000000..64e27003
--- /dev/null
+++ b/rsvg/benches/composite.rs
@@ -0,0 +1,46 @@
+use criterion::{black_box, criterion_group, criterion_main, Criterion};
+
+use rsvg::{
+ surface_utils::shared_surface::{
+ composite_arithmetic, ExclusiveImageSurface, SharedImageSurface, SurfaceType,
+ },
+ IRect,
+};
+
+const SURFACE_SIDE: i32 = 512;
+const BOUNDS: IRect = IRect {
+ x0: 64,
+ y0: 64,
+ x1: 64 + 64,
+ y1: 64 + 64,
+};
+
+fn bench_composite(c: &mut Criterion) {
+ c.bench_function("composite arithmetic", |b| {
+ let input_surface =
+ SharedImageSurface::empty(SURFACE_SIDE, SURFACE_SIDE, SurfaceType::SRgb).unwrap();
+ let input_2_surface =
+ SharedImageSurface::empty(SURFACE_SIDE, SURFACE_SIDE, SurfaceType::SRgb).unwrap();
+
+ let mut output_surface =
+ ExclusiveImageSurface::new(SURFACE_SIDE, SURFACE_SIDE, SurfaceType::SRgb).unwrap();
+
+ let bounds = black_box(BOUNDS);
+
+ b.iter(|| {
+ composite_arithmetic(
+ &input_surface,
+ &input_2_surface,
+ &mut output_surface,
+ bounds,
+ 0.5,
+ 0.5,
+ 0.5,
+ 0.5,
+ );
+ })
+ });
+}
+
+criterion_group!(benches, bench_composite);
+criterion_main!(benches);
diff --git a/rsvg/benches/lighting.rs b/rsvg/benches/lighting.rs
new file mode 100644
index 00000000..3d43815a
--- /dev/null
+++ b/rsvg/benches/lighting.rs
@@ -0,0 +1,264 @@
+use criterion::{criterion_group, criterion_main, Criterion};
+use nalgebra::{Matrix3, Vector2};
+
+use rsvg::{
+ filters::lighting::Normal,
+ surface_utils::{
+ iterators::{PixelRectangle, Pixels},
+ shared_surface::{SharedImageSurface, SurfaceType},
+ EdgeMode,
+ },
+ IRect,
+};
+
+/// Computes and returns the normal vector for the light filters.
+fn normal(surface: &SharedImageSurface, bounds: IRect, x: u32, y: u32) -> Normal {
+ assert!(x as i32 >= bounds.x0);
+ assert!(y as i32 >= bounds.y0);
+ assert!((x as i32) < bounds.x1);
+ assert!((y as i32) < bounds.y1);
+
+ // Get the correct sobel kernel and factor for the pixel position.
+ // Performance note: it's possible to replace the matrices with normal arrays.
+ #[rustfmt::skip]
+ let (factor_x, kx, factor_y, ky) = match (x as i32, y as i32) {
+ (x, y) if (x, y) == (bounds.x0, bounds.y0) => (
+ 2. / 3.,
+ Matrix3::new(
+ 0, 0, 0,
+ 0, -2, 2,
+ 0, -1, 1,
+ ),
+ 2. / 3.,
+ Matrix3::new(
+ 0, 0, 0,
+ 0, -2, -1,
+ 0, 2, 1,
+ ),
+ ),
+ (x, y) if (x + 1, y) == (bounds.x1, bounds.y0) => (
+ 2. / 3.,
+ Matrix3::new(
+ 0, 0, 0,
+ -2, 2, 0,
+ -1, 1, 0,
+ ),
+ 2. / 3.,
+ Matrix3::new(
+ 0, 0, 0,
+ -1, -2, 0,
+ 1, 2, 0,
+ ),
+ ),
+ (x, y) if (x, y + 1) == (bounds.x0, bounds.y1) => (
+ 2. / 3.,
+ Matrix3::new(
+ 0, -1, 1,
+ 0, -2, 2,
+ 0, 0, 0,
+ ),
+ 2. / 3.,
+ Matrix3::new(
+ 0, -2, -1,
+ 0, 2, 1,
+ 0, 0, 0,
+ ),
+ ),
+ (x, y) if (x + 1, y + 1) == (bounds.x1, bounds.y1) => (
+ 2. / 3.,
+ Matrix3::new(
+ -1, 1, 0,
+ -2, 2, 0,
+ 0, 0, 0,
+ ),
+ 2. / 3.,
+ Matrix3::new(
+ -1, -2, 0,
+ 1, 2, 0,
+ 0, 0, 0,
+ ),
+ ),
+ (_, y) if y == bounds.y0 => (
+ 1. / 3.,
+ Matrix3::new(
+ 0, 0, 0,
+ -2, 0, 2,
+ -1, 0, 1,
+ ),
+ 1. / 2.,
+ Matrix3::new(
+ 0, 0, 0,
+ -1, -2, -1,
+ 1, 2, 1,
+ ),
+ ),
+ (x, _) if x == bounds.x0 => (
+ 1. / 2.,
+ Matrix3::new(
+ 0, -1, 1,
+ 0, -2, 2,
+ 0, -1, 1,
+ ),
+ 1. / 3.,
+ Matrix3::new(
+ 0, -2, -1,
+ 0, 0, 0,
+ 0, 2, 1,
+ ),
+ ),
+ (x, _) if x + 1 == bounds.x1 => (
+ 1. / 2.,
+ Matrix3::new(
+ -1, 1, 0,
+ -2, 2, 0,
+ -1, 1, 0,
+ ),
+ 1. / 3.,
+ Matrix3::new(
+ -1, -2, 0,
+ 0, 0, 0,
+ 1, 2, 0,
+ ),
+ ),
+ (_, y) if y + 1 == bounds.y1 => (
+ 1. / 3.,
+ Matrix3::new(
+ -1, 0, 1,
+ -2, 0, 2,
+ 0, 0, 0,
+ ),
+ 1. / 2.,
+ Matrix3::new(
+ -1, -2, -1,
+ 1, 2, 1,
+ 0, 0, 0,
+ ),
+ ),
+ _ => (
+ 1. / 4.,
+ Matrix3::new(
+ -1, 0, 1,
+ -2, 0, 2,
+ -1, 0, 1,
+ ),
+ 1. / 4.,
+ Matrix3::new(
+ -1, -2, -1,
+ 0, 0, 0,
+ 1, 2, 1,
+ ),
+ ),
+ };
+
+ let kernel_bounds = IRect::new(x as i32 - 1, y as i32 - 1, x as i32 + 2, y as i32 + 2);
+
+ let mut nx = 0;
+ let mut ny = 0;
+ for (x, y, pixel) in PixelRectangle::within(surface, bounds, kernel_bounds, EdgeMode::None) {
+ let kernel_x = (x - kernel_bounds.x0) as usize;
+ let kernel_y = (y - kernel_bounds.y0) as usize;
+
+ nx += i16::from(pixel.a) * kx[(kernel_y, kernel_x)];
+ ny += i16::from(pixel.a) * ky[(kernel_y, kernel_x)];
+ }
+
+ // Negative nx and ny to account for the different coordinate system.
+ Normal {
+ factor: Vector2::new(factor_x, factor_y),
+ normal: Vector2::new(-nx, -ny),
+ }
+}
+
+const SURFACE_SIDE: i32 = 512;
+const BOUNDS: IRect = IRect {
+ x0: 64,
+ y0: 64,
+ x1: 64 + 64,
+ y1: 64 + 64,
+};
+
+fn bench_normal(c: &mut Criterion) {
+ c.bench_function("normal", |b| {
+ let surface =
+ SharedImageSurface::empty(SURFACE_SIDE, SURFACE_SIDE, SurfaceType::SRgb).unwrap();
+
+ b.iter(|| {
+ let mut z = 0;
+ for (x, y, _pixel) in Pixels::within(&surface, BOUNDS) {
+ let n = normal(&surface, BOUNDS, x, y);
+ z += n.normal.x;
+ }
+ z
+ })
+ });
+
+ c.bench_function("normal unrolled", |b| {
+ let surface =
+ SharedImageSurface::empty(SURFACE_SIDE, SURFACE_SIDE, SurfaceType::SRgb).unwrap();
+
+ b.iter(|| {
+ let mut z = 0;
+
+ // Top left.
+ {
+ let n = Normal::top_left(&surface, BOUNDS);
+ z += n.normal.x;
+ }
+
+ // Top right.
+ {
+ let n = Normal::top_right(&surface, BOUNDS);
+ z += n.normal.x;
+ }
+
+ // Bottom left.
+ {
+ let n = Normal::bottom_left(&surface, BOUNDS);
+ z += n.normal.x;
+ }
+
+ // Bottom right.
+ {
+ let n = Normal::bottom_right(&surface, BOUNDS);
+ z += n.normal.x;
+ }
+
+ // Top row.
+ for x in BOUNDS.x0 as u32 + 1..BOUNDS.x1 as u32 - 1 {
+ let n = Normal::top_row(&surface, BOUNDS, x);
+ z += n.normal.x;
+ }
+
+ // Bottom row.
+ for x in BOUNDS.x0 as u32 + 1..BOUNDS.x1 as u32 - 1 {
+ let n = Normal::bottom_row(&surface, BOUNDS, x);
+ z += n.normal.x;
+ }
+
+ // Left column.
+ for y in BOUNDS.y0 as u32 + 1..BOUNDS.y1 as u32 - 1 {
+ let n = Normal::left_column(&surface, BOUNDS, y);
+ z += n.normal.x;
+ }
+
+ // Right column.
+ for y in BOUNDS.y0 as u32 + 1..BOUNDS.y1 as u32 - 1 {
+ let n = Normal::right_column(&surface, BOUNDS, y);
+ z += n.normal.x;
+ }
+
+ // Interior pixels.
+ for y in BOUNDS.y0 as u32 + 1..BOUNDS.y1 as u32 - 1 {
+ for x in BOUNDS.x0 as u32 + 1..BOUNDS.x1 as u32 - 1 {
+ let n = Normal::interior(&surface, BOUNDS, x, y);
+ z += n.normal.x;
+ }
+ }
+
+ z
+ })
+ });
+}
+
+criterion_group!(benches, bench_normal);
+criterion_main!(benches);
diff --git a/rsvg/benches/path_parser.rs b/rsvg/benches/path_parser.rs
new file mode 100644
index 00000000..1c0c29ec
--- /dev/null
+++ b/rsvg/benches/path_parser.rs
@@ -0,0 +1,73 @@
+use criterion::{black_box, criterion_group, criterion_main, Criterion};
+
+use rsvg::bench_only::Lexer;
+use rsvg::bench_only::PathBuilder;
+
+static INPUT: &'static str = "M10 20 C 30,40 50 60-70,80,90 100,110 120,130,140";
+
+static BYTES: &'static [u8; 49] = b"M10 20 C 30,40 50 60-70,80,90 100,110 120,130,140";
+
+static SLICE_EDGES: [(usize, usize); 14] = [
+ (1, 3),
+ (4, 6),
+ (9, 11),
+ (12, 14),
+ (15, 17),
+ (18, 20),
+ (20, 23),
+ (24, 26),
+ (27, 29),
+ (30, 33),
+ (34, 37),
+ (38, 41),
+ (42, 45),
+ (46, 49),
+];
+
+fn lex_path(input: &str) {
+ let lexer = Lexer::new(black_box(input));
+
+ for (_pos, _token) in lexer {
+ // no-op
+ }
+}
+
+fn path_parser(c: &mut Criterion) {
+ c.bench_function("parse path into builder", |b| {
+ let input = black_box(INPUT);
+
+ b.iter(|| {
+ let mut builder = PathBuilder::default();
+ let _ = builder.parse(&input);
+ });
+ });
+
+ c.bench_function("lex str", |b| {
+ let input = black_box(INPUT);
+
+ b.iter(|| {
+ lex_path(input);
+ });
+ });
+
+ // look at how much time *just* the parse::<i32> part of the lexer should be taking...
+ c.bench_function("std i32 parse (bytes)", |b| {
+ let input = black_box(BYTES);
+ let slice_boundaries = black_box(SLICE_EDGES);
+
+ b.iter(|| {
+ for (a, b) in slice_boundaries.iter() {
+ let a: usize = *a;
+ let b: usize = *b;
+ unsafe {
+ let _ = std::str::from_utf8_unchecked(&input[a..b])
+ .parse::<i32>()
+ .unwrap();
+ }
+ }
+ });
+ });
+}
+
+criterion_group!(benches, path_parser);
+criterion_main!(benches);
diff --git a/rsvg/benches/pixbuf_from_surface.rs b/rsvg/benches/pixbuf_from_surface.rs
new file mode 100644
index 00000000..9b88a9df
--- /dev/null
+++ b/rsvg/benches/pixbuf_from_surface.rs
@@ -0,0 +1,45 @@
+use criterion::{criterion_group, criterion_main, Criterion};
+
+use rsvg::{
+ surface_utils::{
+ shared_surface::{ExclusiveImageSurface, SurfaceType},
+ ImageSurfaceDataExt, Pixel,
+ },
+ IRect,
+};
+
+const BOUNDS: IRect = IRect {
+ x0: 0,
+ y0: 0,
+ x1: 256,
+ y1: 256,
+};
+
+fn bench_pixbuf_from_surface(c: &mut Criterion) {
+ c.bench_function("pixbuf_from_surface", |b| {
+ let mut surface = ExclusiveImageSurface::new(256, 256, SurfaceType::SRgb).unwrap();
+
+ // Fill the surface with interesting data
+ surface.modify(&mut |data, stride| {
+ for y in BOUNDS.y_range() {
+ for x in BOUNDS.x_range() {
+ let pixel = Pixel {
+ r: x as u8,
+ g: y as u8,
+ b: x.max(y) as u8,
+ a: 255,
+ };
+
+ data.set_pixel(stride, pixel, x as u32, y as u32);
+ }
+ }
+ });
+
+ let surface = surface.share().unwrap();
+
+ b.iter(|| surface.to_pixbuf().unwrap())
+ });
+}
+
+criterion_group!(benches, bench_pixbuf_from_surface);
+criterion_main!(benches);
diff --git a/rsvg/benches/pixel_iterators.rs b/rsvg/benches/pixel_iterators.rs
new file mode 100644
index 00000000..fbcab5b6
--- /dev/null
+++ b/rsvg/benches/pixel_iterators.rs
@@ -0,0 +1,101 @@
+use criterion::{black_box, criterion_group, criterion_main, Criterion};
+
+use rsvg::{
+ surface_utils::{
+ iterators::Pixels,
+ shared_surface::{ExclusiveImageSurface, SharedImageSurface, SurfaceType},
+ },
+ IRect,
+};
+
+const SURFACE_SIDE: i32 = 512;
+const BOUNDS: IRect = IRect {
+ x0: 64,
+ y0: 32,
+ x1: 448,
+ y1: 480,
+};
+
+fn bench_pixel_iterators(c: &mut Criterion) {
+ c.bench_function("pixel_iterators straightforward", |b| {
+ let mut surface =
+ ExclusiveImageSurface::new(SURFACE_SIDE, SURFACE_SIDE, SurfaceType::SRgb).unwrap();
+ let stride = surface.stride() as i32;
+ let data = surface.data();
+
+ let bounds = black_box(BOUNDS);
+
+ b.iter(|| {
+ let mut r = 0usize;
+ let mut g = 0usize;
+ let mut b = 0usize;
+ let mut a = 0usize;
+
+ for y in bounds.y_range() {
+ for x in bounds.x_range() {
+ let base = (y * stride + x * 4) as usize;
+
+ r += data[base + 0] as usize;
+ g += data[base + 1] as usize;
+ b += data[base + 2] as usize;
+ a += data[base + 3] as usize;
+ }
+ }
+
+ (r, g, b, a)
+ })
+ });
+
+ c.bench_function("pixel_iterators get_pixel", |b| {
+ let surface =
+ SharedImageSurface::empty(SURFACE_SIDE, SURFACE_SIDE, SurfaceType::SRgb).unwrap();
+
+ let bounds = black_box(BOUNDS);
+
+ b.iter(|| {
+ let mut r = 0usize;
+ let mut g = 0usize;
+ let mut b = 0usize;
+ let mut a = 0usize;
+
+ for y in bounds.y_range() {
+ for x in bounds.x_range() {
+ let pixel = surface.get_pixel(x as u32, y as u32);
+
+ r += pixel.r as usize;
+ g += pixel.g as usize;
+ b += pixel.b as usize;
+ a += pixel.a as usize;
+ }
+ }
+
+ (r, g, b, a)
+ })
+ });
+
+ c.bench_function("pixel_iterators pixels", |b| {
+ let surface =
+ SharedImageSurface::empty(SURFACE_SIDE, SURFACE_SIDE, SurfaceType::SRgb).unwrap();
+
+ let bounds = black_box(BOUNDS);
+
+ b.iter(|| {
+ let mut r = 0usize;
+ let mut g = 0usize;
+ let mut b = 0usize;
+ let mut a = 0usize;
+
+ for (_x, _y, pixel) in Pixels::within(&surface, bounds) {
+ r += pixel.r as usize;
+ g += pixel.g as usize;
+ b += pixel.b as usize;
+ a += pixel.a as usize;
+ }
+
+ (r, g, b, a)
+ })
+ });
+}
+
+criterion_group!(benches, bench_pixel_iterators);
+criterion_main!(benches);
diff --git a/rsvg/benches/pixel_ops.rs b/rsvg/benches/pixel_ops.rs
new file mode 100644
index 00000000..4b5b00c5
--- /dev/null
+++ b/rsvg/benches/pixel_ops.rs
@@ -0,0 +1,56 @@
+use criterion::{black_box, criterion_group, criterion_main, Criterion};
+
+use rsvg::surface_utils::{Pixel, PixelOps};
+
+const OTHER: Pixel = Pixel {
+ r: 0x10,
+ g: 0x20,
+ b: 0x30,
+ a: 0x40,
+};
+const N: usize = 1024;
+
+fn make_pixels(n: usize) -> Vec<Pixel> {
+ (0..n)
+ .map(|i| Pixel {
+ r: (i / 2) as u8,
+ g: (i / 3) as u8,
+ b: (i / 4) as u8,
+ a: i as u8,
+ })
+ .collect()
+}
+
+fn bench_op<F>(pixels: &[Pixel], op: F)
+where
+ F: Fn(&Pixel) -> Pixel,
+{
+ let result: Vec<Pixel> = pixels.iter().map(op).collect();
+ black_box(result);
+}
+
+fn bench_pixel_ops(c: &mut Criterion) {
+ c.bench_function("pixel_diff", |b| {
+ let pixels = black_box(make_pixels(N));
+ let other = black_box(OTHER);
+ b.iter(|| bench_op(&pixels, |pixel| pixel.diff(&other)))
+ });
+
+ c.bench_function("pixel_to_luminance_mask", |b| {
+ let pixels = black_box(make_pixels(N));
+ b.iter(|| bench_op(&pixels, |pixel| pixel.to_luminance_mask()))
+ });
+
+ c.bench_function("pixel_premultiply", |b| {
+ let pixels = black_box(make_pixels(N));
+ b.iter(|| bench_op(&pixels, |pixel| pixel.premultiply()))
+ });
+
+ c.bench_function("pixel_unpremultiply", |b| {
+ let pixels = black_box(make_pixels(N));
+ b.iter(|| bench_op(&pixels, |pixel| pixel.unpremultiply()))
+ });
+}
+
+criterion_group!(benches, bench_pixel_ops);
+criterion_main!(benches);
diff --git a/rsvg/benches/srgb.rs b/rsvg/benches/srgb.rs
new file mode 100644
index 00000000..bccfed8a
--- /dev/null
+++ b/rsvg/benches/srgb.rs
@@ -0,0 +1,53 @@
+use criterion::{black_box, criterion_group, criterion_main, Criterion};
+
+use rsvg::{
+ surface_utils::{
+ shared_surface::{ExclusiveImageSurface, SurfaceType},
+ srgb::{linearize, map_unpremultiplied_components_loop},
+ ImageSurfaceDataExt, Pixel,
+ },
+ IRect,
+};
+
+const SURFACE_SIDE: i32 = 512;
+const BOUNDS: IRect = IRect {
+ x0: 64,
+ y0: 32,
+ x1: 448,
+ y1: 480,
+};
+
+fn bench_srgb_linearization(c: &mut Criterion) {
+ c.bench_function("srgb map_unpremultiplied_components", |b| {
+ let mut surface =
+ ExclusiveImageSurface::new(SURFACE_SIDE, SURFACE_SIDE, SurfaceType::LinearRgb).unwrap();
+
+ // Fill the surface with non-zero alpha (otherwise linearization is a no-op).
+ surface.modify(&mut |data, stride| {
+ for y in BOUNDS.y_range() {
+ for x in BOUNDS.x_range() {
+ let pixel = Pixel {
+ r: 0,
+ g: 0,
+ b: 0,
+ a: 127,
+ };
+
+ data.set_pixel(stride, pixel, x as u32, y as u32);
+ }
+ }
+ });
+
+ let surface = surface.share().unwrap();
+ let mut output_surface =
+ ExclusiveImageSurface::new(SURFACE_SIDE, SURFACE_SIDE, SurfaceType::SRgb).unwrap();
+ let bounds = black_box(BOUNDS);
+
+ b.iter(|| {
+ map_unpremultiplied_components_loop(&surface, &mut output_surface, bounds, linearize);
+ })
+ });
+}
+
+criterion_group!(benches, bench_srgb_linearization);
+criterion_main!(benches);
diff --git a/rsvg/benches/surface_from_pixbuf.rs b/rsvg/benches/surface_from_pixbuf.rs
new file mode 100644
index 00000000..529ddc52
--- /dev/null
+++ b/rsvg/benches/surface_from_pixbuf.rs
@@ -0,0 +1,37 @@
+use criterion::{criterion_group, criterion_main, BenchmarkId, Criterion};
+use gdk_pixbuf::{Colorspace, Pixbuf};
+
+use rsvg::surface_utils::shared_surface::SharedImageSurface;
+
+fn bench_surface_from_pixbuf(c: &mut Criterion) {
+ let mut group = c.benchmark_group("surface_from_pixbuf");
+
+ for input in [false, true].iter() {
+ group.bench_with_input(
+ BenchmarkId::from_parameter(format!("{:?}", input)),
+ input,
+ |b, alpha| {
+ let pixbuf = Pixbuf::new(Colorspace::Rgb, *alpha, 8, 256, 256).unwrap();
+
+ // Fill the surface with interesting data
+ for y in 0..pixbuf.width() {
+ for x in 0..pixbuf.height() {
+ pixbuf.put_pixel(
+ x as u32,
+ y as u32,
+ x as u8,
+ y as u8,
+ x.max(y) as u8,
+ 0xff,
+ );
+ }
+ }
+
+ b.iter(|| SharedImageSurface::from_pixbuf(&pixbuf, None, None).unwrap())
+ },
+ );
+ }
+}
+
+criterion_group!(benches, bench_surface_from_pixbuf);
+criterion_main!(benches);
diff --git a/rsvg/build.rs b/rsvg/build.rs
new file mode 100644
index 00000000..7a46d6c6
--- /dev/null
+++ b/rsvg/build.rs
@@ -0,0 +1,126 @@
+use regex::Regex;
+use std::env;
+use std::fs::File;
+use std::io::prelude::*;
+use std::io::{BufReader, BufWriter, Write};
+use std::path::Path;
+use std::process;
+
+fn main() {
+ if let Err(e) = system_deps::Config::new().probe() {
+ eprintln!("{e}");
+ process::exit(1);
+ }
+
+ generate_srgb_tables();
+ write_version();
+}
+
+/// Converts an sRGB color value to a linear sRGB color value (undoes the gamma correction).
+///
+/// The input and the output are supposed to be in the [0, 1] range.
+#[inline]
+fn linearize(c: f64) -> f64 {
+ if c <= (12.92 * 0.0031308) {
+ c / 12.92
+ } else {
+ ((c + 0.055) / 1.055).powf(2.4)
+ }
+}
+
+/// Converts a linear sRGB color value to a normal sRGB color value (applies the gamma correction).
+///
+/// The input and the output are supposed to be in the [0, 1] range.
+#[inline]
+fn unlinearize(c: f64) -> f64 {
+ if c <= 0.0031308 {
+ 12.92 * c
+ } else {
+ 1.055 * c.powf(1f64 / 2.4) - 0.055
+ }
+}
+
+fn print_table<W, F>(w: &mut W, name: &str, f: F, len: u32)
+where
+ W: Write,
+ F: Fn(f64) -> f64,
+{
+ writeln!(w, "const {name}: [u8; {len}] = [").unwrap();
+
+ for i in 0..len {
+ let x = f(i as f64 / 255.0);
+ let v = (x * 255.0).round() as u8;
+ writeln!(w, " {v},").unwrap();
+ }
+
+ writeln!(w, "];").unwrap();
+}
+
+fn generate_srgb_tables() {
+ let path = Path::new(&env::var("OUT_DIR").unwrap()).join("srgb-codegen.rs");
+ let mut file = BufWriter::new(File::create(path).unwrap());
+
+ print_table(&mut file, "LINEARIZE", linearize, 256);
+ print_table(&mut file, "UNLINEARIZE", unlinearize, 256);
+}
+
+fn write_version() {
+ let mut major = None;
+ let mut minor = None;
+ let mut micro = None;
+
+ {
+ let file = File::open("../configure.ac")
+ .expect("builds must take place within the librsvg source tree");
+
+ let major_regex = Regex::new(r#"^m4_define\(\[rsvg_major_version\],\[(\d+)\]\)"#).unwrap();
+ let minor_regex = Regex::new(r#"^m4_define\(\[rsvg_minor_version\],\[(\d+)\]\)"#).unwrap();
+ let micro_regex = Regex::new(r#"^m4_define\(\[rsvg_micro_version\],\[(\d+)\]\)"#).unwrap();
+
+ for line in BufReader::new(file).lines() {
+ match line {
+ Ok(line) => {
+ if let Some(nums) = major_regex.captures(&line) {
+ major = Some(String::from(
+ nums.get(1).expect("major_regex matched once").as_str(),
+ ));
+ } else if let Some(nums) = minor_regex.captures(&line) {
+ minor = Some(String::from(
+ nums.get(1).expect("minor_regex matched once").as_str(),
+ ));
+ } else if let Some(nums) = micro_regex.captures(&line) {
+ micro = Some(String::from(
+ nums.get(1).expect("micro_regex matched once").as_str(),
+ ));
+ }
+ }
+
+ Err(e) => panic!("could not parse version from configure.ac: {e}"),
+ }
+ }
+ }
+
+ let output = Path::new(&env::var("OUT_DIR").unwrap()).join("version.rs");
+ let mut file = File::create(output).expect("open version.rs for writing");
+ file.write_all(
+ format!(
+ r#"
+use std::os::raw::c_uint;
+
+#[no_mangle]
+pub static rsvg_major_version: c_uint = {};
+
+#[no_mangle]
+pub static rsvg_minor_version: c_uint = {};
+
+#[no_mangle]
+pub static rsvg_micro_version: c_uint = {};
+"#,
+ major.expect("major version is set"),
+ minor.expect("minor version is set"),
+ micro.expect("micro version is set")
+ )
+ .as_bytes(),
+ )
+ .expect("write version.rs");
+}
diff --git a/rsvg/src/accept_language.rs b/rsvg/src/accept_language.rs
new file mode 100644
index 00000000..2abaae7f
--- /dev/null
+++ b/rsvg/src/accept_language.rs
@@ -0,0 +1,458 @@
+//! Parser for an Accept-Language HTTP header.
+
+use language_tags::{LanguageTag, ParseError};
+use locale_config::{LanguageRange, Locale};
+
+use std::error;
+use std::fmt;
+use std::str::FromStr;
+
+/// Used to set the language for rendering.
+///
+/// SVG documents can use the `<switch>` element, whose children have a `systemLanguage`
+/// attribute; only the first child which has a `systemLanguage` that matches the
+/// preferred languages will be rendered.
+///
+/// This enum, used with `CairoRenderer::with_language`, configures how to obtain the
+/// user's prefererred languages.
+pub enum Language {
+ /// Use the Unix environment variables `LANGUAGE`, `LC_ALL`, `LC_MESSAGES` and `LANG` to obtain the
+ /// user's language. This uses [`g_get_language_names()`][ggln] underneath.
+ ///
+ /// [ggln]: https://docs.gtk.org/glib/func.get_language_names.html
+ FromEnvironment,
+ AcceptLanguage(AcceptLanguage),
+}
+
+/// `Language` but with the environment's locale converted to something we can use.
+#[derive(Clone)]
+pub enum UserLanguage {
+ LanguageTags(LanguageTags),
+ AcceptLanguage(AcceptLanguage),
+}
+
+#[derive(Clone, Debug, PartialEq)]
+struct Weight(Option<f32>);
+
+impl Weight {
+ fn numeric(&self) -> f32 {
+ self.0.unwrap_or(1.0)
+ }
+}
+
+#[derive(Clone, Debug, PartialEq)]
+struct Item {
+ tag: LanguageTag,
+ weight: Weight,
+}
+
+/// Stores a parsed version of an HTTP Accept-Language header.
+///
+/// RFC 7231: <https://datatracker.ietf.org/doc/html/rfc7231#section-5.3.5>
+#[derive(Clone, Debug, PartialEq)]
+pub struct AcceptLanguage(Box<[Item]>);
+
+/// Errors when parsing an `AcceptLanguage`.
+#[derive(Debug, PartialEq)]
+pub enum AcceptLanguageError {
+ NoElements,
+ InvalidCharacters,
+ InvalidLanguageTag(ParseError),
+ InvalidWeight,
+}
+
+impl error::Error for AcceptLanguageError {}
+
+impl fmt::Display for AcceptLanguageError {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ match self {
+ Self::NoElements => write!(f, "no language tags in list"),
+ Self::InvalidCharacters => write!(f, "invalid characters in language list"),
+ Self::InvalidLanguageTag(e) => write!(f, "invalid language tag: {e}"),
+ Self::InvalidWeight => write!(f, "invalid q= weight"),
+ }
+ }
+}
+
+/// Optional whitespace, Space or Tab, per RFC 7230.
+///
+/// RFC 7230: <https://datatracker.ietf.org/doc/html/rfc7230#section-3.2.3>
+const OWS: [char; 2] = ['\x20', '\x09'];
+
+impl AcceptLanguage {
+ pub fn parse(s: &str) -> Result<AcceptLanguage, AcceptLanguageError> {
+ if !s.is_ascii() {
+ return Err(AcceptLanguageError::InvalidCharacters);
+ }
+
+ let mut items = Vec::new();
+
+ for val in s.split(',') {
+ let trimmed = val.trim_matches(&OWS[..]);
+ if trimmed.is_empty() {
+ continue;
+ }
+
+ items.push(Item::parse(trimmed)?);
+ }
+
+ if items.is_empty() {
+ Err(AcceptLanguageError::NoElements)
+ } else {
+ Ok(AcceptLanguage(items.into_boxed_slice()))
+ }
+ }
+
+ pub fn iter(&self) -> impl Iterator<Item = (&LanguageTag, f32)> {
+ self.0.iter().map(|item| (&item.tag, item.weight.numeric()))
+ }
+
+ fn any_matches(&self, tag: &LanguageTag) -> bool {
+ self.iter().any(|(self_tag, _weight)| tag.matches(self_tag))
+ }
+}
+
+impl Item {
+ fn parse(s: &str) -> Result<Item, AcceptLanguageError> {
+ let semicolon_pos = s.find(';');
+
+ let (before_semicolon, after_semicolon) = if let Some(semi) = semicolon_pos {
+ (&s[..semi], Some(&s[semi + 1..]))
+ } else {
+ (s, None)
+ };
+
+ let tag = LanguageTag::parse(before_semicolon)
+ .map_err(AcceptLanguageError::InvalidLanguageTag)?;
+
+ let weight = if let Some(quality) = after_semicolon {
+ let quality = quality.trim_start_matches(&OWS[..]);
+
+ let number = if let Some(qvalue) = quality.strip_prefix("q=") {
+ if qvalue.starts_with(&['0', '1'][..]) {
+ let first_digit = qvalue.chars().next().unwrap();
+
+ if let Some(decimals) = qvalue[1..].strip_prefix('.') {
+ if (first_digit == '0'
+ && decimals.len() <= 3
+ && decimals.chars().all(|c| c.is_ascii_digit()))
+ || (first_digit == '1'
+ && decimals.len() <= 3
+ && decimals.chars().all(|c| c == '0'))
+ {
+ qvalue
+ } else {
+ return Err(AcceptLanguageError::InvalidWeight);
+ }
+ } else {
+ qvalue
+ }
+ } else {
+ return Err(AcceptLanguageError::InvalidWeight);
+ }
+ } else {
+ return Err(AcceptLanguageError::InvalidWeight);
+ };
+
+ Weight(Some(
+ f32::from_str(number).map_err(|_| AcceptLanguageError::InvalidWeight)?,
+ ))
+ } else {
+ Weight(None)
+ };
+
+ Ok(Item { tag, weight })
+ }
+}
+
+/// A list of BCP47 language tags.
+///
+/// RFC 5664: <https://www.rfc-editor.org/info/rfc5664>
+#[derive(Debug, Clone, PartialEq)]
+pub struct LanguageTags(Vec<LanguageTag>);
+
+impl LanguageTags {
+ pub fn empty() -> Self {
+ LanguageTags(Vec::new())
+ }
+
+ /// Converts a `Locale` to a set of language tags.
+ pub fn from_locale(locale: &Locale) -> Result<LanguageTags, String> {
+ let mut tags = Vec::new();
+
+ for locale_range in locale.tags_for("messages") {
+ if locale_range == LanguageRange::invariant() {
+ continue;
+ }
+
+ let str_locale_range = locale_range.as_ref();
+
+ let locale_tag = LanguageTag::from_str(str_locale_range).map_err(|e| {
+ format!("invalid language tag \"{str_locale_range}\" in locale: {e}")
+ })?;
+
+ if !locale_tag.is_language_range() {
+ return Err(format!(
+ "language tag \"{locale_tag}\" is not a language range"
+ ));
+ }
+
+ tags.push(locale_tag);
+ }
+
+ Ok(LanguageTags(tags))
+ }
+
+ pub fn from(tags: Vec<LanguageTag>) -> LanguageTags {
+ LanguageTags(tags)
+ }
+
+ pub fn iter(&self) -> impl Iterator<Item = &LanguageTag> {
+ self.0.iter()
+ }
+
+ pub fn any_matches(&self, language_tag: &LanguageTag) -> bool {
+ self.0.iter().any(|tag| tag.matches(language_tag))
+ }
+}
+
+impl UserLanguage {
+ pub fn any_matches(&self, tags: &LanguageTags) -> bool {
+ match *self {
+ UserLanguage::LanguageTags(ref language_tags) => {
+ tags.iter().any(|tag| language_tags.any_matches(tag))
+ }
+ UserLanguage::AcceptLanguage(ref accept_language) => {
+ tags.iter().any(|tag| accept_language.any_matches(tag))
+ }
+ }
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn parses_accept_language() {
+ // plain tag
+ assert_eq!(
+ AcceptLanguage::parse("es-MX").unwrap(),
+ AcceptLanguage(
+ vec![Item {
+ tag: LanguageTag::parse("es-MX").unwrap(),
+ weight: Weight(None)
+ }]
+ .into_boxed_slice()
+ )
+ );
+
+ // with quality
+ assert_eq!(
+ AcceptLanguage::parse("es-MX;q=1").unwrap(),
+ AcceptLanguage(
+ vec![Item {
+ tag: LanguageTag::parse("es-MX").unwrap(),
+ weight: Weight(Some(1.0))
+ }]
+ .into_boxed_slice()
+ )
+ );
+
+ // with quality
+ assert_eq!(
+ AcceptLanguage::parse("es-MX;q=0").unwrap(),
+ AcceptLanguage(
+ vec![Item {
+ tag: LanguageTag::parse("es-MX").unwrap(),
+ weight: Weight(Some(0.0))
+ }]
+ .into_boxed_slice()
+ )
+ );
+
+ // zero decimals are allowed
+ assert_eq!(
+ AcceptLanguage::parse("es-MX;q=0.").unwrap(),
+ AcceptLanguage(
+ vec![Item {
+ tag: LanguageTag::parse("es-MX").unwrap(),
+ weight: Weight(Some(0.0))
+ }]
+ .into_boxed_slice()
+ )
+ );
+
+ // zero decimals are allowed
+ assert_eq!(
+ AcceptLanguage::parse("es-MX;q=1.").unwrap(),
+ AcceptLanguage(
+ vec![Item {
+ tag: LanguageTag::parse("es-MX").unwrap(),
+ weight: Weight(Some(1.0))
+ }]
+ .into_boxed_slice()
+ )
+ );
+
+ // one decimal
+ assert_eq!(
+ AcceptLanguage::parse("es-MX;q=1.0").unwrap(),
+ AcceptLanguage(
+ vec![Item {
+ tag: LanguageTag::parse("es-MX").unwrap(),
+ weight: Weight(Some(1.0))
+ }]
+ .into_boxed_slice()
+ )
+ );
+
+ // two decimals
+ assert_eq!(
+ AcceptLanguage::parse("es-MX;q=1.00").unwrap(),
+ AcceptLanguage(
+ vec![Item {
+ tag: LanguageTag::parse("es-MX").unwrap(),
+ weight: Weight(Some(1.0))
+ }]
+ .into_boxed_slice()
+ )
+ );
+
+ // three decimals
+ assert_eq!(
+ AcceptLanguage::parse("es-MX;q=1.000").unwrap(),
+ AcceptLanguage(
+ vec![Item {
+ tag: LanguageTag::parse("es-MX").unwrap(),
+ weight: Weight(Some(1.0))
+ }]
+ .into_boxed_slice()
+ )
+ );
+
+ // multiple elements
+ assert_eq!(
+ AcceptLanguage::parse("es-MX, en; q=0.5").unwrap(),
+ AcceptLanguage(
+ vec![
+ Item {
+ tag: LanguageTag::parse("es-MX").unwrap(),
+ weight: Weight(None)
+ },
+ Item {
+ tag: LanguageTag::parse("en").unwrap(),
+ weight: Weight(Some(0.5))
+ },
+ ]
+ .into_boxed_slice()
+ )
+ );
+
+ // superfluous whitespace
+ assert_eq!(
+ AcceptLanguage::parse(",es-MX;q=1.000 , en; q=0.125 , ,").unwrap(),
+ AcceptLanguage(
+ vec![
+ Item {
+ tag: LanguageTag::parse("es-MX").unwrap(),
+ weight: Weight(Some(1.0))
+ },
+ Item {
+ tag: LanguageTag::parse("en").unwrap(),
+ weight: Weight(Some(0.125))
+ },
+ ]
+ .into_boxed_slice()
+ )
+ );
+ }
+
+ #[test]
+ fn empty_lists() {
+ assert!(matches!(
+ AcceptLanguage::parse(""),
+ Err(AcceptLanguageError::NoElements)
+ ));
+
+ assert!(matches!(
+ AcceptLanguage::parse(","),
+ Err(AcceptLanguageError::NoElements)
+ ));
+
+ assert!(matches!(
+ AcceptLanguage::parse(", , ,,,"),
+ Err(AcceptLanguageError::NoElements)
+ ));
+ }
+
+ #[test]
+ fn ascii_only() {
+ assert!(matches!(
+ AcceptLanguage::parse("ës"),
+ Err(AcceptLanguageError::InvalidCharacters)
+ ));
+ }
+
+ #[test]
+ fn invalid_tag() {
+ assert!(matches!(
+ AcceptLanguage::parse("no_underscores"),
+ Err(AcceptLanguageError::InvalidLanguageTag(_))
+ ));
+ }
+
+ #[test]
+ fn invalid_weight() {
+ assert!(matches!(
+ AcceptLanguage::parse("es;"),
+ Err(AcceptLanguageError::InvalidWeight)
+ ));
+ assert!(matches!(
+ AcceptLanguage::parse("es;q"),
+ Err(AcceptLanguageError::InvalidWeight)
+ ));
+ assert!(matches!(
+ AcceptLanguage::parse("es;q="),
+ Err(AcceptLanguageError::InvalidWeight)
+ ));
+ assert!(matches!(
+ AcceptLanguage::parse("es;q=2"),
+ Err(AcceptLanguageError::InvalidWeight)
+ ));
+ assert!(matches!(
+ AcceptLanguage::parse("es;q=1.1"),
+ Err(AcceptLanguageError::InvalidWeight)
+ ));
+ assert!(matches!(
+ AcceptLanguage::parse("es;q=1.12"),
+ Err(AcceptLanguageError::InvalidWeight)
+ ));
+ assert!(matches!(
+ AcceptLanguage::parse("es;q=1.123"),
+ Err(AcceptLanguageError::InvalidWeight)
+ ));
+
+ // Up to three decimals allowed per RFC 7231
+ assert!(matches!(
+ AcceptLanguage::parse("es;q=0.1234"),
+ Err(AcceptLanguageError::InvalidWeight)
+ ));
+ }
+
+ #[test]
+ fn iter() {
+ let accept_language = AcceptLanguage::parse("es-MX, en; q=0.5").unwrap();
+ let mut iter = accept_language.iter();
+
+ let (tag, weight) = iter.next().unwrap();
+ assert_eq!(*tag, LanguageTag::parse("es-MX").unwrap());
+ assert_eq!(weight, 1.0);
+
+ let (tag, weight) = iter.next().unwrap();
+ assert_eq!(*tag, LanguageTag::parse("en").unwrap());
+ assert_eq!(weight, 0.5);
+
+ assert!(iter.next().is_none());
+ }
+}
diff --git a/rsvg/src/angle.rs b/rsvg/src/angle.rs
new file mode 100644
index 00000000..aa5a1bef
--- /dev/null
+++ b/rsvg/src/angle.rs
@@ -0,0 +1,187 @@
+//! CSS angle values.
+
+use std::f64::consts::*;
+
+use cssparser::{Parser, Token};
+use float_cmp::approx_eq;
+
+use crate::error::*;
+use crate::parsers::{finite_f32, Parse};
+
+#[derive(Debug, Copy, Clone, PartialEq)]
+pub struct Angle(f64);
+
+impl Angle {
+ pub fn new(rad: f64) -> Angle {
+ Angle(Angle::normalize(rad))
+ }
+
+ pub fn from_degrees(deg: f64) -> Angle {
+ Angle(Angle::normalize(deg.to_radians()))
+ }
+
+ pub fn from_vector(vx: f64, vy: f64) -> Angle {
+ let rad = vy.atan2(vx);
+
+ if rad.is_nan() {
+ Angle(0.0)
+ } else {
+ Angle(Angle::normalize(rad))
+ }
+ }
+
+ pub fn radians(self) -> f64 {
+ self.0
+ }
+
+ pub fn bisect(self, other: Angle) -> Angle {
+ let half_delta = (other.0 - self.0) * 0.5;
+
+ if FRAC_PI_2 < half_delta.abs() {
+ Angle(Angle::normalize(self.0 + half_delta - PI))
+ } else {
+ Angle(Angle::normalize(self.0 + half_delta))
+ }
+ }
+
+ //Flips an angle to be 180deg or PI radians rotated
+ pub fn flip(self) -> Angle {
+ Angle::new(self.radians() + PI)
+ }
+
+ // Normalizes an angle to [0.0, 2*PI)
+ fn normalize(rad: f64) -> f64 {
+ let res = rad % (PI * 2.0);
+ if approx_eq!(f64, res, 0.0) {
+ 0.0
+ } else if res < 0.0 {
+ res + PI * 2.0
+ } else {
+ res
+ }
+ }
+}
+
+// angle:
+// https://www.w3.org/TR/SVG/types.html#DataTypeAngle
+//
+// angle ::= number ("deg" | "grad" | "rad")?
+//
+impl Parse for Angle {
+ fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<Angle, ParseError<'i>> {
+ let angle = {
+ let loc = parser.current_source_location();
+
+ let token = parser.next()?;
+
+ match *token {
+ Token::Number { value, .. } => {
+ let degrees = finite_f32(value).map_err(|e| loc.new_custom_error(e))?;
+ Angle::from_degrees(f64::from(degrees))
+ }
+
+ Token::Dimension {
+ value, ref unit, ..
+ } => {
+ let value = f64::from(finite_f32(value).map_err(|e| loc.new_custom_error(e))?);
+
+ match unit.as_ref() {
+ "deg" => Angle::from_degrees(value),
+ "grad" => Angle::from_degrees(value * 360.0 / 400.0),
+ "rad" => Angle::new(value),
+ "turn" => Angle::from_degrees(value * 360.0),
+ _ => {
+ return Err(loc.new_unexpected_token_error(token.clone()));
+ }
+ }
+ }
+
+ _ => return Err(loc.new_unexpected_token_error(token.clone())),
+ }
+ };
+
+ Ok(angle)
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn parses_angle() {
+ assert_eq!(Angle::parse_str("0").unwrap(), Angle::new(0.0));
+ assert_eq!(Angle::parse_str("15").unwrap(), Angle::from_degrees(15.0));
+ assert_eq!(
+ Angle::parse_str("180.5deg").unwrap(),
+ Angle::from_degrees(180.5)
+ );
+ assert_eq!(Angle::parse_str("1rad").unwrap(), Angle::new(1.0));
+ assert_eq!(
+ Angle::parse_str("-400grad").unwrap(),
+ Angle::from_degrees(-360.0)
+ );
+ assert_eq!(
+ Angle::parse_str("0.25turn").unwrap(),
+ Angle::from_degrees(90.0)
+ );
+
+ assert!(Angle::parse_str("").is_err());
+ assert!(Angle::parse_str("foo").is_err());
+ assert!(Angle::parse_str("300foo").is_err());
+ }
+
+ fn test_bisection_angle(
+ expected: f64,
+ incoming_vx: f64,
+ incoming_vy: f64,
+ outgoing_vx: f64,
+ outgoing_vy: f64,
+ ) {
+ let i = Angle::from_vector(incoming_vx, incoming_vy);
+ let o = Angle::from_vector(outgoing_vx, outgoing_vy);
+ let bisected = i.bisect(o);
+ assert!(approx_eq!(f64, expected, bisected.radians()));
+ }
+
+ #[test]
+ fn bisection_angle_is_correct_from_incoming_counterclockwise_to_outgoing() {
+ // 1st quadrant
+ test_bisection_angle(FRAC_PI_4, 1.0, 0.0, 0.0, 1.0);
+
+ // 2nd quadrant
+ test_bisection_angle(FRAC_PI_2 + FRAC_PI_4, 0.0, 1.0, -1.0, 0.0);
+
+ // 3rd quadrant
+ test_bisection_angle(PI + FRAC_PI_4, -1.0, 0.0, 0.0, -1.0);
+
+ // 4th quadrant
+ test_bisection_angle(PI + FRAC_PI_2 + FRAC_PI_4, 0.0, -1.0, 1.0, 0.0);
+ }
+
+ #[test]
+ fn bisection_angle_is_correct_from_incoming_clockwise_to_outgoing() {
+ // 1st quadrant
+ test_bisection_angle(FRAC_PI_4, 0.0, 1.0, 1.0, 0.0);
+
+ // 2nd quadrant
+ test_bisection_angle(FRAC_PI_2 + FRAC_PI_4, -1.0, 0.0, 0.0, 1.0);
+
+ // 3rd quadrant
+ test_bisection_angle(PI + FRAC_PI_4, 0.0, -1.0, -1.0, 0.0);
+
+ // 4th quadrant
+ test_bisection_angle(PI + FRAC_PI_2 + FRAC_PI_4, 1.0, 0.0, 0.0, -1.0);
+ }
+
+ #[test]
+ fn bisection_angle_is_correct_for_more_than_quarter_turn_angle() {
+ test_bisection_angle(0.0, 0.1, -1.0, 0.1, 1.0);
+
+ test_bisection_angle(FRAC_PI_2, 1.0, 0.1, -1.0, 0.1);
+
+ test_bisection_angle(PI, -0.1, 1.0, -0.1, -1.0);
+
+ test_bisection_angle(PI + FRAC_PI_2, -1.0, -0.1, 1.0, -0.1);
+ }
+}
diff --git a/rsvg/src/api.rs b/rsvg/src/api.rs
new file mode 100644
index 00000000..beaee9a9
--- /dev/null
+++ b/rsvg/src/api.rs
@@ -0,0 +1,622 @@
+//! Public Rust API for librsvg.
+//!
+//! This gets re-exported from the toplevel `lib.rs`.
+
+#![warn(missing_docs)]
+
+pub use crate::{
+ accept_language::{AcceptLanguage, Language},
+ error::{ImplementationLimit, LoadingError, RenderingError},
+ length::{LengthUnit, RsvgLength as Length},
+};
+
+use url::Url;
+
+use std::path::Path;
+use std::sync::Arc;
+
+use gio::prelude::*; // Re-exposes glib's prelude as well
+use gio::Cancellable;
+
+use locale_config::{LanguageRange, Locale};
+
+use crate::{
+ accept_language::{LanguageTags, UserLanguage},
+ dpi::Dpi,
+ handle::{Handle, LoadOptions},
+ session::Session,
+ url_resolver::UrlResolver,
+};
+
+/// Builder for loading an [`SvgHandle`].
+///
+/// This is the starting point for using librsvg. This struct
+/// implements a builder pattern for configuring an [`SvgHandle`]'s
+/// options, and then loading the SVG data. You can call the methods
+/// of `Loader` in sequence to configure how SVG data should be
+/// loaded, and finally use one of the loading functions to load an
+/// [`SvgHandle`].
+pub struct Loader {
+ unlimited_size: bool,
+ keep_image_data: bool,
+ session: Session,
+}
+
+impl Loader {
+ /// Creates a `Loader` with the default flags.
+ ///
+ /// * [`unlimited_size`](#method.with_unlimited_size) defaults to `false`, as malicious
+ /// SVG documents could cause the XML parser to consume very large amounts of memory.
+ ///
+ /// * [`keep_image_data`](#method.keep_image_data) defaults to
+ /// `false`. You may only need this if rendering to Cairo
+ /// surfaces that support including image data in compressed
+ /// formats, like PDF.
+ ///
+ /// # Example:
+ ///
+ /// ```
+ /// use rsvg;
+ ///
+ /// let svg_handle = rsvg::Loader::new()
+ /// .read_path("example.svg")
+ /// .unwrap();
+ /// ```
+ #[allow(clippy::new_without_default)]
+ pub fn new() -> Self {
+ Self::new_with_session(Session::default())
+ }
+
+ /// Creates a `Loader` from a pre-created [`Session`].
+ ///
+ /// This is useful when a `Loader` must be created by the C API, which should already
+ /// have created a session for logging.
+ pub(crate) fn new_with_session(session: Session) -> Self {
+ Self {
+ unlimited_size: false,
+ keep_image_data: false,
+ session,
+ }
+ }
+
+ /// Controls safety limits used in the XML parser.
+ ///
+ /// Internally, librsvg uses libxml2, which has set limits for things like the
+ /// maximum length of XML element names, the size of accumulated buffers
+ /// using during parsing of deeply-nested XML files, and the maximum size
+ /// of embedded XML entities.
+ ///
+ /// Set this to `true` only if loading a trusted SVG fails due to size limits.
+ ///
+ /// # Example:
+ /// ```
+ /// use rsvg;
+ ///
+ /// let svg_handle = rsvg::Loader::new()
+ /// .with_unlimited_size(true)
+ /// .read_path("example.svg") // presumably a trusted huge file
+ /// .unwrap();
+ /// ```
+ pub fn with_unlimited_size(mut self, unlimited: bool) -> Self {
+ self.unlimited_size = unlimited;
+ self
+ }
+
+ /// Controls embedding of compressed image data into the renderer.
+ ///
+ /// Normally, Cairo expects one to pass it uncompressed (decoded)
+ /// images as surfaces. However, when using a PDF rendering
+ /// context to render SVG documents that reference raster images
+ /// (e.g. those which include a bitmap as part of the SVG image),
+ /// it may be more efficient to embed the original, compressed raster
+ /// images into the PDF.
+ ///
+ /// Set this to `true` if you are using a Cairo PDF context, or any other type
+ /// of context which allows embedding compressed images.
+ ///
+ /// # Example:
+ ///
+ /// ```
+ /// # use std::env;
+ /// let svg_handle = rsvg::Loader::new()
+ /// .keep_image_data(true)
+ /// .read_path("example.svg")
+ /// .unwrap();
+ ///
+ /// let mut output = env::temp_dir();
+ /// output.push("output.pdf");
+ /// let surface = cairo::PdfSurface::new(640.0, 480.0, output)?;
+ /// let cr = cairo::Context::new(&surface).expect("Failed to create a cairo context");
+ ///
+ /// let renderer = rsvg::CairoRenderer::new(&svg_handle);
+ /// renderer.render_document(
+ /// &cr,
+ /// &cairo::Rectangle::new(0.0, 0.0, 640.0, 480.0),
+ /// )?;
+ /// # Ok::<(), rsvg::RenderingError>(())
+ /// ```
+ pub fn keep_image_data(mut self, keep: bool) -> Self {
+ self.keep_image_data = keep;
+ self
+ }
+
+ /// Reads an SVG document from `path`.
+ ///
+ /// # Example:
+ ///
+ /// ```
+ /// let svg_handle = rsvg::Loader::new()
+ /// .read_path("example.svg")
+ /// .unwrap();
+ /// ```
+ pub fn read_path<P: AsRef<Path>>(self, path: P) -> Result<SvgHandle, LoadingError> {
+ let file = gio::File::for_path(path);
+ self.read_file(&file, None::<&Cancellable>)
+ }
+
+ /// Reads an SVG document from a `gio::File`.
+ ///
+ /// The `cancellable` can be used to cancel loading from another thread.
+ ///
+ /// # Example:
+ /// ```
+ /// let svg_handle = rsvg::Loader::new()
+ /// .read_file(&gio::File::for_path("example.svg"), None::<&gio::Cancellable>)
+ /// .unwrap();
+ /// ```
+ pub fn read_file<F: IsA<gio::File>, P: IsA<Cancellable>>(
+ self,
+ file: &F,
+ cancellable: Option<&P>,
+ ) -> Result<SvgHandle, LoadingError> {
+ let stream = file.read(cancellable)?;
+ self.read_stream(&stream, Some(file), cancellable)
+ }
+
+ /// Reads an SVG stream from a `gio::InputStream`.
+ ///
+ /// The `base_file`, if it is not `None`, is used to extract the
+ /// [base URL][crate#the-base-file-and-resolving-references-to-external-files] for this stream.
+ ///
+ /// Reading an SVG document may involve resolving relative URLs if the
+ /// SVG references things like raster images, or other SVG files.
+ /// In this case, pass the `base_file` that correspondds to the
+ /// URL where this SVG got loaded from.
+ ///
+ /// The `cancellable` can be used to cancel loading from another thread.
+ ///
+ /// # Example
+ ///
+ /// ```
+ /// use gio::prelude::*;
+ ///
+ /// let file = gio::File::for_path("example.svg");
+ ///
+ /// let stream = file.read(None::<&gio::Cancellable>).unwrap();
+ ///
+ /// let svg_handle = rsvg::Loader::new()
+ /// .read_stream(&stream, Some(&file), None::<&gio::Cancellable>)
+ /// .unwrap();
+ /// ```
+ pub fn read_stream<S: IsA<gio::InputStream>, F: IsA<gio::File>, P: IsA<Cancellable>>(
+ self,
+ stream: &S,
+ base_file: Option<&F>,
+ cancellable: Option<&P>,
+ ) -> Result<SvgHandle, LoadingError> {
+ let base_file = base_file.map(|f| f.as_ref());
+
+ let base_url = if let Some(base_file) = base_file {
+ Some(url_from_file(base_file)?)
+ } else {
+ None
+ };
+
+ let load_options = LoadOptions::new(UrlResolver::new(base_url))
+ .with_unlimited_size(self.unlimited_size)
+ .keep_image_data(self.keep_image_data);
+
+ Ok(SvgHandle {
+ handle: Handle::from_stream(
+ self.session.clone(),
+ Arc::new(load_options),
+ stream.as_ref(),
+ cancellable.map(|c| c.as_ref()),
+ )?,
+ session: self.session,
+ })
+ }
+}
+
+fn url_from_file(file: &gio::File) -> Result<Url, LoadingError> {
+ Url::parse(&file.uri()).map_err(|_| LoadingError::BadUrl)
+}
+
+/// Handle used to hold SVG data in memory.
+///
+/// You can create this from one of the `read` methods in
+/// [`Loader`].
+pub struct SvgHandle {
+ session: Session,
+ pub(crate) handle: Handle,
+}
+
+impl SvgHandle {
+ /// Checks if the SVG has an element with the specified `id`.
+ ///
+ /// Note that the `id` must be a plain fragment identifier like `#foo`, with
+ /// a leading `#` character.
+ ///
+ /// The purpose of the `Err()` case in the return value is to indicate an
+ /// incorrectly-formatted `id` argument.
+ pub fn has_element_with_id(&self, id: &str) -> Result<bool, RenderingError> {
+ self.handle.has_sub(id)
+ }
+
+ /// Sets a CSS stylesheet to use for an SVG document.
+ ///
+ /// During the CSS cascade, the specified stylesheet will be used
+ /// with a "User" [origin].
+ ///
+ /// Note that `@import` rules will not be resolved, except for `data:` URLs.
+ ///
+ /// [origin]: https://drafts.csswg.org/css-cascade-3/#cascading-origins
+ pub fn set_stylesheet(&mut self, css: &str) -> Result<(), LoadingError> {
+ self.handle.set_stylesheet(css)
+ }
+}
+
+/// Can render an `SvgHandle` to a Cairo context.
+pub struct CairoRenderer<'a> {
+ pub(crate) handle: &'a SvgHandle,
+ pub(crate) dpi: Dpi,
+ user_language: UserLanguage,
+ is_testing: bool,
+}
+
+// Note that these are different than the C API's default, which is 90.
+const DEFAULT_DPI_X: f64 = 96.0;
+const DEFAULT_DPI_Y: f64 = 96.0;
+
+#[derive(Debug, Copy, Clone, PartialEq)]
+/// Contains the computed values of the `<svg>` element's `width`, `height`, and `viewBox`.
+///
+/// An SVG document has a toplevel `<svg>` element, with optional attributes `width`,
+/// `height`, and `viewBox`. This structure contains the values for those attributes; you
+/// can obtain the struct from [`CairoRenderer::intrinsic_dimensions`].
+///
+/// Since librsvg 2.54.0, there is support for [geometry
+/// properties](https://www.w3.org/TR/SVG2/geometry.html) from SVG2. This means that
+/// `width` and `height` are no longer attributes; they are instead CSS properties that
+/// default to `auto`. The computed value for `auto` is `100%`, so for a `<svg>` that
+/// does not have these attributes/properties, the `width`/`height` fields will be
+/// returned as a [`Length`] of 100%.
+///
+/// As an example, the following SVG element has a `width` of 100 pixels
+/// and a `height` of 400 pixels, but no `viewBox`.
+///
+/// ```xml
+/// <svg xmlns="http://www.w3.org/2000/svg" width="100" height="400">
+/// ```
+///
+/// In this case, the length fields will be set to the corresponding
+/// values with [`LengthUnit::Px`] units, and the `vbox` field will be
+/// set to to `None`.
+pub struct IntrinsicDimensions {
+ /// Computed value of the `width` property of the `<svg>`.
+ pub width: Length,
+
+ /// Computed value of the `height` property of the `<svg>`.
+ pub height: Length,
+
+ /// `viewBox` attribute of the `<svg>`, if present.
+ pub vbox: Option<cairo::Rectangle>,
+}
+
+/// Gets the user's preferred locale from the environment and
+/// translates it to a `Locale` with `LanguageRange` fallbacks.
+///
+/// The `Locale::current()` call only contemplates a single language,
+/// but glib is smarter, and `g_get_langauge_names()` can provide
+/// fallbacks, for example, when LC_MESSAGES="en_US.UTF-8:de" (USA
+/// English and German). This function converts the output of
+/// `g_get_language_names()` into a `Locale` with appropriate
+/// fallbacks.
+fn locale_from_environment() -> Locale {
+ let mut locale = Locale::invariant();
+
+ for name in glib::language_names() {
+ let name = name.as_str();
+ if let Ok(range) = LanguageRange::from_unix(name) {
+ locale.add(&range);
+ }
+ }
+
+ locale
+}
+
+impl UserLanguage {
+ fn new(language: &Language, session: &Session) -> UserLanguage {
+ match *language {
+ Language::FromEnvironment => UserLanguage::LanguageTags(
+ LanguageTags::from_locale(&locale_from_environment())
+ .map_err(|s| {
+ rsvg_log!(session, "could not convert locale to language tags: {}", s);
+ })
+ .unwrap_or_else(|_| LanguageTags::empty()),
+ ),
+
+ Language::AcceptLanguage(ref a) => UserLanguage::AcceptLanguage(a.clone()),
+ }
+ }
+}
+
+impl<'a> CairoRenderer<'a> {
+ /// Creates a `CairoRenderer` for the specified `SvgHandle`.
+ ///
+ /// The default dots-per-inch (DPI) value is set to 96; you can change it
+ /// with the [`with_dpi`] method.
+ ///
+ /// [`with_dpi`]: #method.with_dpi
+ pub fn new(handle: &'a SvgHandle) -> Self {
+ let session = &handle.session;
+
+ CairoRenderer {
+ handle,
+ dpi: Dpi::new(DEFAULT_DPI_X, DEFAULT_DPI_Y),
+ user_language: UserLanguage::new(&Language::FromEnvironment, session),
+ is_testing: false,
+ }
+ }
+
+ /// Configures the dots-per-inch for resolving physical lengths.
+ ///
+ /// If an SVG document has physical units like `5cm`, they must be resolved
+ /// to pixel-based values. The default pixel density is 96 DPI in
+ /// both dimensions.
+ pub fn with_dpi(self, dpi_x: f64, dpi_y: f64) -> Self {
+ assert!(dpi_x > 0.0);
+ assert!(dpi_y > 0.0);
+
+ CairoRenderer {
+ dpi: Dpi::new(dpi_x, dpi_y),
+ ..self
+ }
+ }
+
+ /// Configures the set of languages used for rendering.
+ ///
+ /// SVG documents can use the `<switch>` element, whose children have a
+ /// `systemLanguage` attribute; only the first child which has a `systemLanguage` that
+ /// matches the preferred languages will be rendered.
+ ///
+ /// This function sets the preferred languages. The default is
+ /// `Language::FromEnvironment`, which means that the set of preferred languages will
+ /// be obtained from the program's environment. To set an explicit list of languages,
+ /// you can use `Language::AcceptLanguage` instead.
+ pub fn with_language(self, language: &Language) -> Self {
+ let user_language = UserLanguage::new(language, &self.handle.session);
+
+ CairoRenderer {
+ user_language,
+ ..self
+ }
+ }
+
+ /// Queries the `width`, `height`, and `viewBox` attributes in an SVG document.
+ ///
+ /// If you are calling this function to compute a scaling factor to render the SVG,
+ /// consider simply using [`render_document`] instead; it will do the scaling
+ /// computations automatically.
+ ///
+ /// See also [`intrinsic_size_in_pixels`], which does the conversion to pixels if
+ /// possible.
+ ///
+ /// [`render_document`]: #method.render_document
+ /// [`intrinsic_size_in_pixels`]: #method.intrinsic_size_in_pixels
+ pub fn intrinsic_dimensions(&self) -> IntrinsicDimensions {
+ let d = self.handle.handle.get_intrinsic_dimensions();
+
+ IntrinsicDimensions {
+ width: Into::into(d.width),
+ height: Into::into(d.height),
+ vbox: d.vbox.map(|v| cairo::Rectangle::from(*v)),
+ }
+ }
+
+ /// Converts the SVG document's intrinsic dimensions to pixels, if possible.
+ ///
+ /// Returns `Some(width, height)` in pixel units if the SVG document has `width` and
+ /// `height` attributes with physical dimensions (CSS pixels, cm, in, etc.) or
+ /// font-based dimensions (em, ex).
+ ///
+ /// Note that the dimensions are floating-point numbers, so your application can know
+ /// the exact size of an SVG document. To get integer dimensions, you should use
+ /// [`f64::ceil()`] to round up to the nearest integer (just using [`f64::round()`],
+ /// may may chop off pixels with fractional coverage).
+ ///
+ /// If the SVG document has percentage-based `width` and `height` attributes, or if
+ /// either of those attributes are not present, returns `None`. Dimensions of that
+ /// kind require more information to be resolved to pixels; for example, the calling
+ /// application can use a viewport size to scale percentage-based dimensions.
+ pub fn intrinsic_size_in_pixels(&self) -> Option<(f64, f64)> {
+ let dim = self.intrinsic_dimensions();
+ let width = dim.width;
+ let height = dim.height;
+
+ if width.unit == LengthUnit::Percent || height.unit == LengthUnit::Percent {
+ return None;
+ }
+
+ Some(self.handle.handle.width_height_to_user(self.dpi))
+ }
+
+ /// Renders the whole SVG document fitted to a viewport
+ ///
+ /// The `viewport` gives the position and size at which the whole SVG
+ /// document will be rendered.
+ ///
+ /// The `cr` must be in a `cairo::Status::Success` state, or this function
+ /// will not render anything, and instead will return
+ /// `RenderingError::Cairo` with the `cr`'s current error state.
+ pub fn render_document(
+ &self,
+ cr: &cairo::Context,
+ viewport: &cairo::Rectangle,
+ ) -> Result<(), RenderingError> {
+ self.handle.handle.render_document(
+ cr,
+ viewport,
+ &self.user_language,
+ self.dpi,
+ self.is_testing,
+ )
+ }
+
+ /// Computes the (ink_rect, logical_rect) of an SVG element, as if
+ /// the SVG were rendered to a specific viewport.
+ ///
+ /// Element IDs should look like an URL fragment identifier; for
+ /// example, pass `Some("#foo")` to get the geometry of the
+ /// element that has an `id="foo"` attribute.
+ ///
+ /// The "ink rectangle" is the bounding box that would be painted
+ /// for fully- stroked and filled elements.
+ ///
+ /// The "logical rectangle" just takes into account the unstroked
+ /// paths and text outlines.
+ ///
+ /// Note that these bounds are not minimum bounds; for example,
+ /// clipping paths are not taken into account.
+ ///
+ /// You can pass `None` for the `id` if you want to measure all
+ /// the elements in the SVG, i.e. to measure everything from the
+ /// root element.
+ ///
+ /// This operation is not constant-time, as it involves going through all
+ /// the child elements.
+ ///
+ /// FIXME: example
+ pub fn geometry_for_layer(
+ &self,
+ id: Option<&str>,
+ viewport: &cairo::Rectangle,
+ ) -> Result<(cairo::Rectangle, cairo::Rectangle), RenderingError> {
+ self.handle
+ .handle
+ .get_geometry_for_layer(id, viewport, &self.user_language, self.dpi, self.is_testing)
+ .map(|(i, l)| (i, l))
+ }
+
+ /// Renders a single SVG element in the same place as for a whole SVG document
+ ///
+ /// This is equivalent to `render_document`, but renders only a single element and its
+ /// children, as if they composed an individual layer in the SVG. The element is
+ /// rendered with the same transformation matrix as it has within the whole SVG
+ /// document. Applications can use this to re-render a single element and repaint it
+ /// on top of a previously-rendered document, for example.
+ ///
+ /// Note that the `id` must be a plain fragment identifier like `#foo`, with
+ /// a leading `#` character.
+ ///
+ /// The `viewport` gives the position and size at which the whole SVG
+ /// document would be rendered. This function will effectively place the
+ /// whole SVG within that viewport, but only render the element given by
+ /// `id`.
+ ///
+ /// The `cr` must be in a `cairo::Status::Success` state, or this function
+ /// will not render anything, and instead will return
+ /// `RenderingError::Cairo` with the `cr`'s current error state.
+ pub fn render_layer(
+ &self,
+ cr: &cairo::Context,
+ id: Option<&str>,
+ viewport: &cairo::Rectangle,
+ ) -> Result<(), RenderingError> {
+ self.handle.handle.render_layer(
+ cr,
+ id,
+ viewport,
+ &self.user_language,
+ self.dpi,
+ self.is_testing,
+ )
+ }
+
+ /// Computes the (ink_rect, logical_rect) of a single SVG element
+ ///
+ /// While `geometry_for_layer` computes the geometry of an SVG element subtree with
+ /// its transformation matrix, this other function will compute the element's geometry
+ /// as if it were being rendered under an identity transformation by itself. That is,
+ /// the resulting geometry is as if the element got extracted by itself from the SVG.
+ ///
+ /// This function is the counterpart to `render_element`.
+ ///
+ /// Element IDs should look like an URL fragment identifier; for
+ /// example, pass `Some("#foo")` to get the geometry of the
+ /// element that has an `id="foo"` attribute.
+ ///
+ /// The "ink rectangle" is the bounding box that would be painted
+ /// for fully- stroked and filled elements.
+ ///
+ /// The "logical rectangle" just takes into account the unstroked
+ /// paths and text outlines.
+ ///
+ /// Note that these bounds are not minimum bounds; for example,
+ /// clipping paths are not taken into account.
+ ///
+ /// You can pass `None` for the `id` if you want to measure all
+ /// the elements in the SVG, i.e. to measure everything from the
+ /// root element.
+ ///
+ /// This operation is not constant-time, as it involves going through all
+ /// the child elements.
+ ///
+ /// FIXME: example
+ pub fn geometry_for_element(
+ &self,
+ id: Option<&str>,
+ ) -> Result<(cairo::Rectangle, cairo::Rectangle), RenderingError> {
+ self.handle
+ .handle
+ .get_geometry_for_element(id, &self.user_language, self.dpi, self.is_testing)
+ .map(|(i, l)| (i, l))
+ }
+
+ /// Renders a single SVG element to a given viewport
+ ///
+ /// This function can be used to extract individual element subtrees and render them,
+ /// scaled to a given `element_viewport`. This is useful for applications which have
+ /// reusable objects in an SVG and want to render them individually; for example, an
+ /// SVG full of icons that are meant to be be rendered independently of each other.
+ ///
+ /// Note that the `id` must be a plain fragment identifier like `#foo`, with
+ /// a leading `#` character.
+ ///
+ /// The `element_viewport` gives the position and size at which the named element will
+ /// be rendered. FIXME: mention proportional scaling.
+ ///
+ /// The `cr` must be in a `cairo::Status::Success` state, or this function
+ /// will not render anything, and instead will return
+ /// `RenderingError::Cairo` with the `cr`'s current error state.
+ pub fn render_element(
+ &self,
+ cr: &cairo::Context,
+ id: Option<&str>,
+ element_viewport: &cairo::Rectangle,
+ ) -> Result<(), RenderingError> {
+ self.handle.handle.render_element(
+ cr,
+ id,
+ element_viewport,
+ &self.user_language,
+ self.dpi,
+ self.is_testing,
+ )
+ }
+
+ /// Turns on test mode. Do not use this function; it is for librsvg's test suite only.
+ pub fn test_mode(self, is_testing: bool) -> Self {
+ CairoRenderer { is_testing, ..self }
+ }
+}
diff --git a/rsvg/src/aspect_ratio.rs b/rsvg/src/aspect_ratio.rs
new file mode 100644
index 00000000..3b2cc830
--- /dev/null
+++ b/rsvg/src/aspect_ratio.rs
@@ -0,0 +1,456 @@
+//! Handling of `preserveAspectRatio` values.
+//!
+//! This module handles `preserveAspectRatio` values [per the SVG specification][spec].
+//! We have an [`AspectRatio`] struct which encapsulates such a value.
+//!
+//! ```
+//! # use rsvg::doctest_only::AspectRatio;
+//! # use rsvg::doctest_only::Parse;
+//! assert_eq!(
+//! AspectRatio::parse_str("xMidYMid").unwrap(),
+//! AspectRatio::default()
+//! );
+//! ```
+//!
+//! [spec]: https://www.w3.org/TR/SVG/coords.html#PreserveAspectRatioAttribute
+
+use cssparser::{BasicParseError, Parser};
+use std::ops::Deref;
+
+use crate::error::*;
+use crate::parsers::Parse;
+use crate::rect::Rect;
+use crate::transform::{Transform, ValidTransform};
+use crate::viewbox::ViewBox;
+
+#[derive(Debug, Copy, Clone, PartialEq, Eq)]
+enum FitMode {
+ Meet,
+ Slice,
+}
+
+enum_default!(FitMode, FitMode::Meet);
+
+#[derive(Debug, Copy, Clone, PartialEq, Eq)]
+enum Align1D {
+ Min,
+ Mid,
+ Max,
+}
+
+enum_default!(Align1D, Align1D::Mid);
+
+#[derive(Debug, Default, Copy, Clone, PartialEq, Eq)]
+struct X(Align1D);
+#[derive(Debug, Default, Copy, Clone, PartialEq, Eq)]
+struct Y(Align1D);
+
+impl Deref for X {
+ type Target = Align1D;
+
+ fn deref(&self) -> &Align1D {
+ &self.0
+ }
+}
+
+impl Deref for Y {
+ type Target = Align1D;
+
+ fn deref(&self) -> &Align1D {
+ &self.0
+ }
+}
+
+impl Align1D {
+ fn compute(self, dest_pos: f64, dest_size: f64, obj_size: f64) -> f64 {
+ match self {
+ Align1D::Min => dest_pos,
+ Align1D::Mid => dest_pos + (dest_size - obj_size) / 2.0,
+ Align1D::Max => dest_pos + dest_size - obj_size,
+ }
+ }
+}
+
+#[derive(Debug, Default, Copy, Clone, PartialEq, Eq)]
+struct Align {
+ x: X,
+ y: Y,
+ fit: FitMode,
+}
+
+#[derive(Debug, Copy, Clone, PartialEq, Eq)]
+pub struct AspectRatio {
+ defer: bool,
+ align: Option<Align>,
+}
+
+impl Default for AspectRatio {
+ fn default() -> AspectRatio {
+ AspectRatio {
+ defer: false,
+ align: Some(Align::default()),
+ }
+ }
+}
+
+impl AspectRatio {
+ pub fn is_slice(&self) -> bool {
+ matches!(
+ self.align,
+ Some(Align {
+ fit: FitMode::Slice,
+ ..
+ })
+ )
+ }
+
+ pub fn compute(&self, vbox: &ViewBox, viewport: &Rect) -> Rect {
+ match self.align {
+ None => *viewport,
+
+ Some(Align { x, y, fit }) => {
+ let (vb_width, vb_height) = vbox.size();
+ let (vp_width, vp_height) = viewport.size();
+
+ let w_factor = vp_width / vb_width;
+ let h_factor = vp_height / vb_height;
+
+ let factor = match fit {
+ FitMode::Meet => w_factor.min(h_factor),
+ FitMode::Slice => w_factor.max(h_factor),
+ };
+
+ let w = vb_width * factor;
+ let h = vb_height * factor;
+
+ let xpos = x.compute(viewport.x0, vp_width, w);
+ let ypos = y.compute(viewport.y0, vp_height, h);
+
+ Rect::new(xpos, ypos, xpos + w, ypos + h)
+ }
+ }
+ }
+
+ /// Computes the viewport to viewbox transformation.
+ ///
+ /// Given a viewport, returns a transformation that will create a coordinate
+ /// space inside it. The `(vbox.x0, vbox.y0)` will be mapped to the viewport's
+ /// upper-left corner, and the `(vbox.x1, vbox.y1)` will be mapped to the viewport's
+ /// lower-right corner.
+ ///
+ /// If the vbox or viewport are empty, returns `Ok(None)`. Per the SVG spec, either
+ /// of those mean that the corresponding element should not be rendered.
+ ///
+ /// If the vbox would create an invalid transform (say, a vbox with huge numbers that
+ /// leads to a near-zero scaling transform), returns an `Err(())`.
+ pub fn viewport_to_viewbox_transform(
+ &self,
+ vbox: Option<ViewBox>,
+ viewport: &Rect,
+ ) -> Result<Option<ValidTransform>, InvalidTransform> {
+ // width or height set to 0 disables rendering of the element
+ // https://www.w3.org/TR/SVG/struct.html#SVGElementWidthAttribute
+ // https://www.w3.org/TR/SVG/struct.html#UseElementWidthAttribute
+ // https://www.w3.org/TR/SVG/struct.html#ImageElementWidthAttribute
+ // https://www.w3.org/TR/SVG/painting.html#MarkerWidthAttribute
+
+ if viewport.is_empty() {
+ return Ok(None);
+ }
+
+ // the preserveAspectRatio attribute is only used if viewBox is specified
+ // https://www.w3.org/TR/SVG/coords.html#PreserveAspectRatioAttribute
+ let transform = if let Some(vbox) = vbox {
+ if vbox.is_empty() {
+ // Width or height of 0 for the viewBox disables rendering of the element
+ // https://www.w3.org/TR/SVG/coords.html#ViewBoxAttribute
+ return Ok(None);
+ } else {
+ let r = self.compute(&vbox, viewport);
+ Transform::new_translate(r.x0, r.y0)
+ .pre_scale(r.width() / vbox.width(), r.height() / vbox.height())
+ .pre_translate(-vbox.x0, -vbox.y0)
+ }
+ } else {
+ Transform::new_translate(viewport.x0, viewport.y0)
+ };
+
+ ValidTransform::try_from(transform).map(Some)
+ }
+}
+
+fn parse_align_xy<'i>(parser: &mut Parser<'i, '_>) -> Result<Option<(X, Y)>, BasicParseError<'i>> {
+ use self::Align1D::*;
+
+ parse_identifiers!(
+ parser,
+
+ "none" => None,
+
+ "xMinYMin" => Some((X(Min), Y(Min))),
+ "xMidYMin" => Some((X(Mid), Y(Min))),
+ "xMaxYMin" => Some((X(Max), Y(Min))),
+
+ "xMinYMid" => Some((X(Min), Y(Mid))),
+ "xMidYMid" => Some((X(Mid), Y(Mid))),
+ "xMaxYMid" => Some((X(Max), Y(Mid))),
+
+ "xMinYMax" => Some((X(Min), Y(Max))),
+ "xMidYMax" => Some((X(Mid), Y(Max))),
+ "xMaxYMax" => Some((X(Max), Y(Max))),
+ )
+}
+
+fn parse_fit_mode<'i>(parser: &mut Parser<'i, '_>) -> Result<FitMode, BasicParseError<'i>> {
+ parse_identifiers!(
+ parser,
+ "meet" => FitMode::Meet,
+ "slice" => FitMode::Slice,
+ )
+}
+
+impl Parse for AspectRatio {
+ fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<AspectRatio, ParseError<'i>> {
+ let defer = parser
+ .try_parse(|p| p.expect_ident_matching("defer"))
+ .is_ok();
+
+ let align_xy = parser.try_parse(parse_align_xy)?;
+ let fit = parser.try_parse(parse_fit_mode).unwrap_or_default();
+ let align = align_xy.map(|(x, y)| Align { x, y, fit });
+
+ Ok(AspectRatio { defer, align })
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+ use crate::float_eq_cairo::ApproxEqCairo;
+
+ #[test]
+ fn parsing_invalid_strings_yields_error() {
+ assert!(AspectRatio::parse_str("").is_err());
+ assert!(AspectRatio::parse_str("defer").is_err());
+ assert!(AspectRatio::parse_str("defer foo").is_err());
+ assert!(AspectRatio::parse_str("defer xMidYMid foo").is_err());
+ assert!(AspectRatio::parse_str("xMidYMid foo").is_err());
+ assert!(AspectRatio::parse_str("defer xMidYMid meet foo").is_err());
+ }
+
+ #[test]
+ fn parses_valid_strings() {
+ assert_eq!(
+ AspectRatio::parse_str("defer none").unwrap(),
+ AspectRatio {
+ defer: true,
+ align: None,
+ }
+ );
+
+ assert_eq!(
+ AspectRatio::parse_str("xMidYMid").unwrap(),
+ AspectRatio {
+ defer: false,
+ align: Some(Align {
+ x: X(Align1D::Mid),
+ y: Y(Align1D::Mid),
+ fit: FitMode::Meet,
+ },),
+ }
+ );
+
+ assert_eq!(
+ AspectRatio::parse_str("defer xMidYMid").unwrap(),
+ AspectRatio {
+ defer: true,
+ align: Some(Align {
+ x: X(Align1D::Mid),
+ y: Y(Align1D::Mid),
+ fit: FitMode::Meet,
+ },),
+ }
+ );
+
+ assert_eq!(
+ AspectRatio::parse_str("defer xMinYMax").unwrap(),
+ AspectRatio {
+ defer: true,
+ align: Some(Align {
+ x: X(Align1D::Min),
+ y: Y(Align1D::Max),
+ fit: FitMode::Meet,
+ },),
+ }
+ );
+
+ assert_eq!(
+ AspectRatio::parse_str("defer xMaxYMid meet").unwrap(),
+ AspectRatio {
+ defer: true,
+ align: Some(Align {
+ x: X(Align1D::Max),
+ y: Y(Align1D::Mid),
+ fit: FitMode::Meet,
+ },),
+ }
+ );
+
+ assert_eq!(
+ AspectRatio::parse_str("defer xMinYMax slice").unwrap(),
+ AspectRatio {
+ defer: true,
+ align: Some(Align {
+ x: X(Align1D::Min),
+ y: Y(Align1D::Max),
+ fit: FitMode::Slice,
+ },),
+ }
+ );
+ }
+
+ fn assert_rect_equal(r1: &Rect, r2: &Rect) {
+ assert_approx_eq_cairo!(r1.x0, r2.x0);
+ assert_approx_eq_cairo!(r1.y0, r2.y0);
+ assert_approx_eq_cairo!(r1.x1, r2.x1);
+ assert_approx_eq_cairo!(r1.y1, r2.y1);
+ }
+
+ #[test]
+ fn aligns() {
+ let viewbox = ViewBox::from(Rect::from_size(1.0, 10.0));
+
+ let foo = AspectRatio::parse_str("xMinYMin meet").unwrap();
+ let foo = foo.compute(&viewbox, &Rect::from_size(10.0, 1.0));
+ assert_rect_equal(&foo, &Rect::from_size(0.1, 1.0));
+
+ let foo = AspectRatio::parse_str("xMinYMin slice").unwrap();
+ let foo = foo.compute(&viewbox, &Rect::from_size(10.0, 1.0));
+ assert_rect_equal(&foo, &Rect::from_size(10.0, 100.0));
+
+ let foo = AspectRatio::parse_str("xMinYMid meet").unwrap();
+ let foo = foo.compute(&viewbox, &Rect::from_size(10.0, 1.0));
+ assert_rect_equal(&foo, &Rect::from_size(0.1, 1.0));
+
+ let foo = AspectRatio::parse_str("xMinYMid slice").unwrap();
+ let foo = foo.compute(&viewbox, &Rect::from_size(10.0, 1.0));
+ assert_rect_equal(&foo, &Rect::new(0.0, -49.5, 10.0, 100.0 - 49.5));
+
+ let foo = AspectRatio::parse_str("xMinYMax meet").unwrap();
+ let foo = foo.compute(&viewbox, &Rect::from_size(10.0, 1.0));
+ assert_rect_equal(&foo, &Rect::from_size(0.1, 1.0));
+
+ let foo = AspectRatio::parse_str("xMinYMax slice").unwrap();
+ let foo = foo.compute(&viewbox, &Rect::from_size(10.0, 1.0));
+ assert_rect_equal(&foo, &Rect::new(0.0, -99.0, 10.0, 1.0));
+
+ let foo = AspectRatio::parse_str("xMidYMin meet").unwrap();
+ let foo = foo.compute(&viewbox, &Rect::from_size(10.0, 1.0));
+ assert_rect_equal(&foo, &Rect::new(4.95, 0.0, 4.95 + 0.1, 1.0));
+
+ let foo = AspectRatio::parse_str("xMidYMin slice").unwrap();
+ let foo = foo.compute(&viewbox, &Rect::from_size(10.0, 1.0));
+ assert_rect_equal(&foo, &Rect::from_size(10.0, 100.0));
+
+ let foo = AspectRatio::parse_str("xMidYMid meet").unwrap();
+ let foo = foo.compute(&viewbox, &Rect::from_size(10.0, 1.0));
+ assert_rect_equal(&foo, &Rect::new(4.95, 0.0, 4.95 + 0.1, 1.0));
+
+ let foo = AspectRatio::parse_str("xMidYMid slice").unwrap();
+ let foo = foo.compute(&viewbox, &Rect::from_size(10.0, 1.0));
+ assert_rect_equal(&foo, &Rect::new(0.0, -49.5, 10.0, 100.0 - 49.5));
+
+ let foo = AspectRatio::parse_str("xMidYMax meet").unwrap();
+ let foo = foo.compute(&viewbox, &Rect::from_size(10.0, 1.0));
+ assert_rect_equal(&foo, &Rect::new(4.95, 0.0, 4.95 + 0.1, 1.0));
+
+ let foo = AspectRatio::parse_str("xMidYMax slice").unwrap();
+ let foo = foo.compute(&viewbox, &Rect::from_size(10.0, 1.0));
+ assert_rect_equal(&foo, &Rect::new(0.0, -99.0, 10.0, 1.0));
+
+ let foo = AspectRatio::parse_str("xMaxYMin meet").unwrap();
+ let foo = foo.compute(&viewbox, &Rect::from_size(10.0, 1.0));
+ assert_rect_equal(&foo, &Rect::new(9.9, 0.0, 10.0, 1.0));
+
+ let foo = AspectRatio::parse_str("xMaxYMin slice").unwrap();
+ let foo = foo.compute(&viewbox, &Rect::from_size(10.0, 1.0));
+ assert_rect_equal(&foo, &Rect::from_size(10.0, 100.0));
+
+ let foo = AspectRatio::parse_str("xMaxYMid meet").unwrap();
+ let foo = foo.compute(&viewbox, &Rect::from_size(10.0, 1.0));
+ assert_rect_equal(&foo, &Rect::new(9.9, 0.0, 10.0, 1.0));
+
+ let foo = AspectRatio::parse_str("xMaxYMid slice").unwrap();
+ let foo = foo.compute(&viewbox, &Rect::from_size(10.0, 1.0));
+ assert_rect_equal(&foo, &Rect::new(0.0, -49.5, 10.0, 100.0 - 49.5));
+
+ let foo = AspectRatio::parse_str("xMaxYMax meet").unwrap();
+ let foo = foo.compute(&viewbox, &Rect::from_size(10.0, 1.0));
+ assert_rect_equal(&foo, &Rect::new(9.9, 0.0, 10.0, 1.0));
+
+ let foo = AspectRatio::parse_str("xMaxYMax slice").unwrap();
+ let foo = foo.compute(&viewbox, &Rect::from_size(10.0, 1.0));
+ assert_rect_equal(&foo, &Rect::new(0.0, -99.0, 10.0, 1.0));
+ }
+
+ #[test]
+ fn empty_viewport() {
+ let a = AspectRatio::default();
+ let t = a
+ .viewport_to_viewbox_transform(
+ Some(ViewBox::parse_str("10 10 40 40").unwrap()),
+ &Rect::from_size(0.0, 0.0),
+ )
+ .unwrap();
+
+ assert_eq!(t, None);
+ }
+
+ #[test]
+ fn empty_viewbox() {
+ let a = AspectRatio::default();
+ let t = a
+ .viewport_to_viewbox_transform(
+ Some(ViewBox::parse_str("10 10 0 0").unwrap()),
+ &Rect::from_size(10.0, 10.0),
+ )
+ .unwrap();
+
+ assert_eq!(t, None);
+ }
+
+ #[test]
+ fn valid_viewport_and_viewbox() {
+ let a = AspectRatio::default();
+ let t = a
+ .viewport_to_viewbox_transform(
+ Some(ViewBox::parse_str("10 10 40 40").unwrap()),
+ &Rect::new(1.0, 1.0, 2.0, 2.0),
+ )
+ .unwrap();
+
+ assert_eq!(
+ t,
+ Some(
+ ValidTransform::try_from(
+ Transform::identity()
+ .pre_translate(1.0, 1.0)
+ .pre_scale(0.025, 0.025)
+ .pre_translate(-10.0, -10.0)
+ )
+ .unwrap()
+ )
+ );
+ }
+
+ #[test]
+ fn invalid_viewbox() {
+ let a = AspectRatio::default();
+ let t = a.viewport_to_viewbox_transform(
+ Some(ViewBox::parse_str("0 0 6E20 540").unwrap()),
+ &Rect::new(1.0, 1.0, 2.0, 2.0),
+ );
+
+ assert_eq!(t, Err(InvalidTransform));
+ }
+}
diff --git a/rsvg/src/bbox.rs b/rsvg/src/bbox.rs
new file mode 100644
index 00000000..c851c473
--- /dev/null
+++ b/rsvg/src/bbox.rs
@@ -0,0 +1,121 @@
+//! Bounding boxes that know their coordinate space.
+
+use crate::rect::Rect;
+use crate::transform::Transform;
+
+#[derive(Debug, Default, Copy, Clone)]
+pub struct BoundingBox {
+ transform: Transform,
+ pub rect: Option<Rect>, // without stroke
+ pub ink_rect: Option<Rect>, // with stroke
+}
+
+impl BoundingBox {
+ pub fn new() -> BoundingBox {
+ Default::default()
+ }
+
+ pub fn with_transform(self, transform: Transform) -> BoundingBox {
+ BoundingBox { transform, ..self }
+ }
+
+ pub fn with_rect(self, rect: Rect) -> BoundingBox {
+ BoundingBox {
+ rect: Some(rect),
+ ..self
+ }
+ }
+
+ pub fn with_ink_rect(self, ink_rect: Rect) -> BoundingBox {
+ BoundingBox {
+ ink_rect: Some(ink_rect),
+ ..self
+ }
+ }
+
+ pub fn clear(mut self) {
+ self.rect = None;
+ self.ink_rect = None;
+ }
+
+ fn combine(&mut self, src: &BoundingBox, clip: bool) {
+ if src.rect.is_none() && src.ink_rect.is_none() {
+ return;
+ }
+
+ // this will panic!() if it's not invertible... should we check on our own?
+ let transform = self
+ .transform
+ .invert()
+ .unwrap()
+ .pre_transform(&src.transform);
+
+ self.rect = combine_rects(self.rect, src.rect, &transform, clip);
+ self.ink_rect = combine_rects(self.ink_rect, src.ink_rect, &transform, clip);
+ }
+
+ pub fn insert(&mut self, src: &BoundingBox) {
+ self.combine(src, false);
+ }
+
+ pub fn clip(&mut self, src: &BoundingBox) {
+ self.combine(src, true);
+ }
+}
+
+fn combine_rects(
+ r1: Option<Rect>,
+ r2: Option<Rect>,
+ transform: &Transform,
+ clip: bool,
+) -> Option<Rect> {
+ match (r1, r2, clip) {
+ (r1, None, _) => r1,
+ (None, Some(r2), _) => Some(transform.transform_rect(&r2)),
+ (Some(r1), Some(r2), true) => transform
+ .transform_rect(&r2)
+ .intersection(&r1)
+ .or_else(|| Some(Rect::default())),
+ (Some(r1), Some(r2), false) => Some(transform.transform_rect(&r2).union(&r1)),
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn combine() {
+ let r1 = Rect::new(1.0, 2.0, 3.0, 4.0);
+ let r2 = Rect::new(1.5, 2.5, 3.5, 4.5);
+ let r3 = Rect::new(10.0, 11.0, 12.0, 13.0);
+ let t = Transform::new_unchecked(1.0, 0.0, 0.0, 1.0, 0.5, 0.5);
+
+ let res = combine_rects(None, None, &t, true);
+ assert_eq!(res, None);
+
+ let res = combine_rects(None, None, &t, false);
+ assert_eq!(res, None);
+
+ let res = combine_rects(Some(r1), None, &t, true);
+ assert_eq!(res, Some(r1));
+
+ let res = combine_rects(Some(r1), None, &t, false);
+ assert_eq!(res, Some(r1));
+
+ let res = combine_rects(None, Some(r2), &t, true);
+ assert_eq!(res, Some(Rect::new(2.0, 3.0, 4.0, 5.0)));
+
+ let res = combine_rects(None, Some(r2), &t, false);
+ assert_eq!(res, Some(Rect::new(2.0, 3.0, 4.0, 5.0)));
+
+ let res = combine_rects(Some(r1), Some(r2), &t, true);
+ assert_eq!(res, Some(Rect::new(2.0, 3.0, 3.0, 4.0)));
+
+ let res = combine_rects(Some(r1), Some(r3), &t, true);
+ assert_eq!(res, Some(Rect::default()));
+
+ let res = combine_rects(Some(r1), Some(r2), &t, false);
+ assert_eq!(res, Some(Rect::new(1.0, 2.0, 4.0, 5.0)));
+ }
+}
diff --git a/rsvg/src/c_api/dpi.rs b/rsvg/src/c_api/dpi.rs
new file mode 100644
index 00000000..b2e15eef
--- /dev/null
+++ b/rsvg/src/c_api/dpi.rs
@@ -0,0 +1,66 @@
+//! Legacy C API for setting a default DPI (dots per inch = DPI).
+//!
+//! There are two deprecated functions, `rsvg_set_default_dpi` and
+//! `rsvg_set_default_dpi_x_y`, which set global values for the default DPI to be used
+//! with `RsvgHandle`. In turn, `RsvgHandle` assumes that when its own DPI value is set
+//! to `0.0` (which is in fact its default), it will fall back to the global DPI.
+//!
+//! This is clearly not thread-safe, but it is the legacy behavior.
+//!
+//! This module encapsulates that behavior so that the `rsvg_internals` crate
+//! can always have immutable DPI values as intended.
+
+// This is configurable at runtime
+const DEFAULT_DPI_X: f64 = 90.0;
+const DEFAULT_DPI_Y: f64 = 90.0;
+
+static mut DPI_X: f64 = DEFAULT_DPI_X;
+static mut DPI_Y: f64 = DEFAULT_DPI_Y;
+
+#[derive(Debug, Copy, Clone, Default)]
+pub(crate) struct Dpi {
+ x: f64,
+ y: f64,
+}
+
+impl Dpi {
+ pub(crate) fn new(x: f64, y: f64) -> Dpi {
+ Dpi { x, y }
+ }
+
+ pub(crate) fn x(&self) -> f64 {
+ if self.x <= 0.0 {
+ unsafe { DPI_X }
+ } else {
+ self.x
+ }
+ }
+
+ pub(crate) fn y(&self) -> f64 {
+ if self.y <= 0.0 {
+ unsafe { DPI_Y }
+ } else {
+ self.y
+ }
+ }
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn rsvg_set_default_dpi_x_y(dpi_x: libc::c_double, dpi_y: libc::c_double) {
+ if dpi_x <= 0.0 {
+ DPI_X = DEFAULT_DPI_X;
+ } else {
+ DPI_X = dpi_x;
+ }
+
+ if dpi_y <= 0.0 {
+ DPI_Y = DEFAULT_DPI_Y;
+ } else {
+ DPI_Y = dpi_y;
+ }
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn rsvg_set_default_dpi(dpi: libc::c_double) {
+ rsvg_set_default_dpi_x_y(dpi, dpi);
+}
diff --git a/rsvg/src/c_api/handle.rs b/rsvg/src/c_api/handle.rs
new file mode 100644
index 00000000..1698cc17
--- /dev/null
+++ b/rsvg/src/c_api/handle.rs
@@ -0,0 +1,2144 @@
+//! Main API for `RsvgHandle`.
+//!
+//! The C API of librsvg revolves around an `RsvgHandle` GObject class, which is
+//! implemented as follows:
+//!
+//! * [`RsvgHandle`] and [`RsvgHandleClass`] are derivatives of `GObject` and
+//! `GObjectClass`. These are coded explicitly, instead of using
+//! [`glib::subclass::prelude::InstanceStruct<T>`] and
+//! [`glib::subclass::prelude::ClassStruct<T>`], as the structs need need to be kept
+//! ABI-compatible with the traditional C API/ABI.
+//!
+//! * The actual data for a handle (e.g. the `RsvgHandle`'s private data, in GObject
+//! parlance) is in [`CHandle`].
+//!
+//! * Public C ABI functions are the `#[no_mangle]` functions with an `rsvg_` prefix.
+//!
+//! The C API is implemented in terms of the Rust API in `librsvg_crate`. In effect,
+//! [`RsvgHandle`] is a rather convoluted builder or adapter pattern that translates all the
+//! historical idiosyncrasies of the C API into the simple Rust API.
+
+use std::cell::{Cell, Ref, RefCell, RefMut};
+use std::ffi::{CStr, CString, OsStr};
+use std::fmt;
+use std::path::PathBuf;
+use std::ptr;
+use std::slice;
+use std::str;
+use std::{f64, i32};
+
+use gdk_pixbuf::Pixbuf;
+use gio::prelude::*;
+use glib::error::ErrorDomain;
+use url::Url;
+
+use glib::subclass::prelude::*;
+use glib::translate::*;
+use glib::types::instance_of;
+use glib::{ffi::gpointer, gobject_ffi};
+use glib::{Bytes, Cast, StaticType, ToValue};
+
+use crate::api::{self, CairoRenderer, IntrinsicDimensions, Loader, LoadingError, SvgHandle};
+
+use crate::{
+ length::RsvgLength,
+ rsvg_log,
+ session::Session,
+ surface_utils::shared_surface::{SharedImageSurface, SurfaceType},
+};
+
+use super::dpi::Dpi;
+use super::messages::{rsvg_g_critical, rsvg_g_warning};
+use super::pixbuf_utils::{empty_pixbuf, pixbuf_from_surface};
+use super::sizing::LegacySize;
+
+// The C API exports global variables that contain the library's version number;
+// those get autogenerated from `build.rs` and placed in this `version.rs` file.
+include!(concat!(env!("OUT_DIR"), "/version.rs"));
+
+// This is basically the same as api::RenderingError but with extra cases for
+// the peculiarities of the C API.
+enum RenderingError {
+ RenderingError(api::RenderingError),
+
+ // The RsvgHandle is created, but hasn't been loaded yet.
+ HandleIsNotLoaded,
+}
+
+impl<T: Into<api::RenderingError>> From<T> for RenderingError {
+ fn from(e: T) -> RenderingError {
+ RenderingError::RenderingError(e.into())
+ }
+}
+
+impl fmt::Display for RenderingError {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ match *self {
+ RenderingError::RenderingError(ref e) => e.fmt(f),
+ RenderingError::HandleIsNotLoaded => write!(f, "SVG data is not loaded into handle"),
+ }
+ }
+}
+
+/// Rust version of the `RsvgHandleFlags` enum in C.
+#[glib::flags(name = "RsvgHandleFlags")]
+pub enum HandleFlags {
+ #[flags_value(name = "RSVG_HANDLE_FLAGS_NONE", nick = "flags-none")]
+ NONE = 0,
+
+ #[flags_value(name = "RSVG_HANDLE_FLAG_UNLIMITED", nick = "flag-unlimited")]
+ UNLIMITED = 1 << 0,
+
+ #[flags_value(
+ name = "RSVG_HANDLE_FLAG_KEEP_IMAGE_DATA",
+ nick = "flag-keep-image-data"
+ )]
+ KEEP_IMAGE_DATA = 1 << 1,
+}
+
+/// Type alias used to pass flags in the C API functions.
+pub type RsvgHandleFlags = u32;
+
+/// Internal representation of the loading flags, without bitflags.
+#[derive(Default, Copy, Clone)]
+struct LoadFlags {
+ unlimited_size: bool,
+ keep_image_data: bool,
+}
+
+impl From<HandleFlags> for LoadFlags {
+ fn from(flags: HandleFlags) -> LoadFlags {
+ LoadFlags {
+ unlimited_size: flags.contains(HandleFlags::UNLIMITED),
+ keep_image_data: flags.contains(HandleFlags::KEEP_IMAGE_DATA),
+ }
+ }
+}
+
+impl From<LoadFlags> for HandleFlags {
+ fn from(lflags: LoadFlags) -> HandleFlags {
+ let mut hflags = HandleFlags::empty();
+
+ if lflags.unlimited_size {
+ hflags.insert(HandleFlags::UNLIMITED);
+ }
+
+ if lflags.keep_image_data {
+ hflags.insert(HandleFlags::KEEP_IMAGE_DATA);
+ }
+
+ hflags
+ }
+}
+
+/// GObject class struct for RsvgHandle.
+///
+/// This is not done through [`glib::subclass::prelude::ClassStruct<T>`] because we need
+/// to include the `_abi_padding` field for ABI compatibility with the C headers, and
+/// `simple::ClassStruct` does not allow that.
+#[repr(C)]
+pub struct RsvgHandleClass {
+ // Keep this in sync with rsvg.h:RsvgHandleClass
+ parent: gobject_ffi::GObjectClass,
+
+ _abi_padding: [gpointer; 15],
+}
+
+unsafe impl ClassStruct for RsvgHandleClass {
+ type Type = imp::CHandle;
+}
+
+/// GObject instance struct for RsvgHandle.
+///
+/// This is not done through [`glib::subclass::prelude::InstanceStruct<T>`] because we need
+/// to include the `_abi_padding` field for ABI compatibility with the C headers, and
+/// `simple::InstanceStruct` does not allow that.
+#[repr(C)]
+pub struct RsvgHandle {
+ // Keep this in sync with rsvg.h:RsvgHandle
+ parent: gobject_ffi::GObject,
+
+ _abi_padding: [gpointer; 16],
+}
+
+unsafe impl InstanceStruct for RsvgHandle {
+ type Type = imp::CHandle;
+}
+
+/// State machine for `RsvgHandle`.
+///
+/// When an `RsvgHandled` is created it is empty / not loaded yet, and it does not know
+/// whether the caller will feed it data gradually with the legacy `write()/close()` API,
+/// or whether it will be given a `GInputStream` to read in a blocking fashion. After the
+/// handle is loaded (e.g. the SVG document is finished parsing), we make sure that no
+/// further loading operations can be done.
+#[allow(clippy::large_enum_variant)]
+enum LoadState {
+ /// Just created the CHandle; nothing loaded yet.
+ Start,
+
+ /// Being loaded using the legacy write()/close() API.
+ ///
+ /// We buffer all the data from `write()` calls until the time `close()` is called;
+ /// then we run the buffer through a decompressor in case this is an SVGZ file.
+ Loading { buffer: Vec<u8> },
+
+ /// Loading finished successfully; the document is in the `SvgHandle`.
+ ClosedOk { handle: SvgHandle },
+
+ /// Loaded unsuccessfully.
+ ClosedError,
+}
+
+impl LoadState {
+ fn set_from_loading_result(
+ &mut self,
+ result: Result<SvgHandle, LoadingError>,
+ ) -> Result<(), LoadingError> {
+ match result {
+ Ok(handle) => {
+ *self = LoadState::ClosedOk { handle };
+ Ok(())
+ }
+
+ Err(e) => {
+ *self = LoadState::ClosedError;
+ Err(e)
+ }
+ }
+ }
+}
+
+impl Default for LoadState {
+ fn default() -> Self {
+ Self::Start
+ }
+}
+
+/// Holds the base URL for loading a handle, and the C-accessible version of it
+///
+/// There is a public API to query the base URL, and we need to
+/// produce a CString with it. However, that API returns a borrowed
+/// *const char, so we need to maintain a long-lived CString along with the
+/// internal Url.
+#[derive(Default)]
+struct BaseUrl {
+ inner: Option<BaseUrlInner>,
+}
+
+struct BaseUrlInner {
+ url: Url,
+ cstring: CString,
+}
+
+impl BaseUrl {
+ fn set(&mut self, url: Url) {
+ let cstring = CString::new(url.as_str()).unwrap();
+
+ self.inner = Some(BaseUrlInner { url, cstring });
+ }
+
+ fn get(&self) -> Option<&Url> {
+ self.inner.as_ref().map(|b| &b.url)
+ }
+
+ fn get_gfile(&self) -> Option<gio::File> {
+ self.get().map(|url| gio::File::for_uri(url.as_str()))
+ }
+
+ fn get_ptr(&self) -> *const libc::c_char {
+ self.inner
+ .as_ref()
+ .map(|b| b.cstring.as_ptr())
+ .unwrap_or_else(ptr::null)
+ }
+}
+
+#[derive(Clone, Copy)]
+#[repr(C)]
+pub struct RsvgRectangle {
+ pub x: f64,
+ pub y: f64,
+ pub width: f64,
+ pub height: f64,
+}
+
+impl From<cairo::Rectangle> for RsvgRectangle {
+ fn from(r: cairo::Rectangle) -> RsvgRectangle {
+ RsvgRectangle {
+ x: r.x(),
+ y: r.y(),
+ width: r.width(),
+ height: r.height(),
+ }
+ }
+}
+
+impl From<RsvgRectangle> for cairo::Rectangle {
+ fn from(r: RsvgRectangle) -> cairo::Rectangle {
+ cairo::Rectangle::new(r.x, r.y, r.width, r.height)
+ }
+}
+
+mod imp {
+ use super::*;
+ use glib::{ParamSpec, ParamSpecDouble, ParamSpecFlags, ParamSpecInt, ParamSpecString};
+ use once_cell::sync::Lazy;
+
+ /// Contains all the interior mutability for a RsvgHandle to be called
+ /// from the C API.
+ #[derive(Default)]
+ pub struct CHandle {
+ pub(super) inner: RefCell<CHandleInner>,
+ pub(super) load_state: RefCell<LoadState>,
+ pub(super) session: Session,
+ }
+
+ #[derive(Default)]
+ pub(super) struct CHandleInner {
+ pub(super) dpi: Dpi,
+ pub(super) load_flags: LoadFlags,
+ pub(super) base_url: BaseUrl,
+ pub(super) size_callback: SizeCallback,
+ pub(super) is_testing: bool,
+ }
+
+ #[glib::object_subclass]
+ impl ObjectSubclass for CHandle {
+ const NAME: &'static str = "RsvgHandle";
+
+ type Type = super::CHandle;
+
+ type Instance = RsvgHandle;
+ type Class = RsvgHandleClass;
+ }
+
+ impl ObjectImpl for CHandle {
+ fn properties() -> &'static [ParamSpec] {
+ static PROPERTIES: Lazy<Vec<ParamSpec>> = Lazy::new(|| {
+ vec![
+ ParamSpecFlags::builder::<HandleFlags>("flags")
+ .construct_only()
+ .build(),
+ ParamSpecDouble::builder("dpi-x").construct().build(),
+ ParamSpecDouble::builder("dpi-y").construct().build(),
+ ParamSpecString::builder("base-uri").construct().build(),
+ ParamSpecInt::builder("width").read_only().build(),
+ ParamSpecInt::builder("height").read_only().build(),
+ ParamSpecDouble::builder("em").read_only().build(),
+ ParamSpecDouble::builder("ex").read_only().build(),
+ ParamSpecString::builder("title").read_only().build(),
+ ParamSpecString::builder("desc").read_only().build(),
+ ParamSpecString::builder("metadata").read_only().build(),
+ ]
+ });
+ PROPERTIES.as_ref()
+ }
+
+ fn set_property(&self, id: usize, value: &glib::Value, pspec: &ParamSpec) {
+ let obj = self.obj();
+ match pspec.name() {
+ "flags" => {
+ let v: HandleFlags = value.get().expect("flags value has incorrect type");
+ obj.set_flags(v);
+ }
+
+ "dpi-x" => {
+ let dpi_x: f64 = value.get().expect("dpi-x value has incorrect type");
+ obj.set_dpi_x(dpi_x);
+ }
+
+ "dpi-y" => {
+ let dpi_y: f64 = value.get().expect("dpi-y value has incorrect type");
+ obj.set_dpi_y(dpi_y);
+ }
+
+ "base-uri" => {
+ let v: Option<String> = value.get().expect("base-uri value has incorrect type");
+
+ // rsvg_handle_set_base_uri() expects non-NULL URI strings,
+ // but the "base-uri" property can be set to NULL due to a missing
+ // construct-time property.
+
+ if let Some(s) = v {
+ obj.set_base_url(&s);
+ }
+ }
+
+ _ => unreachable!("invalid property id {}", id),
+ }
+ }
+
+ fn property(&self, id: usize, pspec: &ParamSpec) -> glib::Value {
+ let obj = self.obj();
+ match pspec.name() {
+ "flags" => obj.get_flags().to_value(),
+ "dpi-x" => obj.get_dpi_x().to_value(),
+ "dpi-y" => obj.get_dpi_y().to_value(),
+ "base-uri" => obj.get_base_url().to_value(),
+ "width" => obj.get_dimensions_or_empty().width.to_value(),
+ "height" => obj.get_dimensions_or_empty().height.to_value(),
+ "em" => obj.get_dimensions_or_empty().em.to_value(),
+ "ex" => obj.get_dimensions_or_empty().ex.to_value(),
+
+ // the following three are deprecated
+ "title" => None::<String>.to_value(),
+ "desc" => None::<String>.to_value(),
+ "metadata" => None::<String>.to_value(),
+
+ _ => unreachable!("invalid property id={} for RsvgHandle", id),
+ }
+ }
+ }
+}
+
+glib::wrapper! {
+ // We don't use subclass:simple::InstanceStruct and ClassStruct
+ // because we need to maintain the respective _abi_padding of each
+ // of RsvgHandleClass and RsvgHandle.
+ pub struct CHandle(ObjectSubclass<imp::CHandle>);
+}
+
+// Keep in sync with tests/src/reference.rs
+pub(crate) fn checked_i32(x: f64) -> Result<i32, cairo::Error> {
+ cast::i32(x).map_err(|_| cairo::Error::InvalidSize)
+}
+
+// Keep in sync with rsvg.h:RsvgPositionData
+#[repr(C)]
+pub struct RsvgPositionData {
+ pub x: libc::c_int,
+ pub y: libc::c_int,
+}
+
+// Keep in sync with rsvg.h:RsvgDimensionData
+#[repr(C)]
+pub struct RsvgDimensionData {
+ pub width: libc::c_int,
+ pub height: libc::c_int,
+ pub em: f64,
+ pub ex: f64,
+}
+
+impl RsvgDimensionData {
+ // This is not #[derive(Default)] to make it clear that it
+ // shouldn't be the default value for anything; it is actually a
+ // special case we use to indicate an error to the public API.
+ pub fn empty() -> RsvgDimensionData {
+ RsvgDimensionData {
+ width: 0,
+ height: 0,
+ em: 0.0,
+ ex: 0.0,
+ }
+ }
+}
+
+// Keep in sync with rsvg.h:RsvgSizeFunc
+pub type RsvgSizeFunc = Option<
+ unsafe extern "C" fn(
+ inout_width: *mut libc::c_int,
+ inout_height: *mut libc::c_int,
+ user_data: gpointer,
+ ),
+>;
+
+struct SizeCallback {
+ size_func: RsvgSizeFunc,
+ user_data: gpointer,
+ destroy_notify: glib::ffi::GDestroyNotify,
+ in_loop: Cell<bool>,
+}
+
+impl SizeCallback {
+ fn new(
+ size_func: RsvgSizeFunc,
+ user_data: gpointer,
+ destroy_notify: glib::ffi::GDestroyNotify,
+ ) -> Self {
+ SizeCallback {
+ size_func,
+ user_data,
+ destroy_notify,
+ in_loop: Cell::new(false),
+ }
+ }
+
+ fn call(&self, width: libc::c_int, height: libc::c_int) -> (libc::c_int, libc::c_int) {
+ unsafe {
+ let mut w = width;
+ let mut h = height;
+
+ if let Some(ref f) = self.size_func {
+ f(&mut w, &mut h, self.user_data);
+ };
+
+ (w, h)
+ }
+ }
+
+ fn start_loop(&self) {
+ assert!(!self.in_loop.get());
+ self.in_loop.set(true);
+ }
+
+ fn end_loop(&self) {
+ assert!(self.in_loop.get());
+ self.in_loop.set(false);
+ }
+
+ fn get_in_loop(&self) -> bool {
+ self.in_loop.get()
+ }
+}
+
+impl Default for SizeCallback {
+ fn default() -> SizeCallback {
+ SizeCallback {
+ size_func: None,
+ user_data: ptr::null_mut(),
+ destroy_notify: None,
+ in_loop: Cell::new(false),
+ }
+ }
+}
+
+impl Drop for SizeCallback {
+ fn drop(&mut self) {
+ unsafe {
+ if let Some(ref f) = self.destroy_notify {
+ f(self.user_data);
+ };
+ }
+ }
+}
+pub trait CairoRectangleExt {
+ fn from_size(width: f64, height: f64) -> Self;
+}
+
+impl CairoRectangleExt for cairo::Rectangle {
+ fn from_size(width: f64, height: f64) -> Self {
+ Self::new(0.0, 0.0, width, height)
+ }
+}
+
+impl CHandle {
+ fn set_base_url(&self, url: &str) {
+ let imp = self.imp();
+ let session = &imp.session;
+ let state = imp.load_state.borrow();
+
+ match *state {
+ LoadState::Start => (),
+ _ => {
+ rsvg_g_critical(
+ "Please set the base file or URI before loading any data into RsvgHandle",
+ );
+ return;
+ }
+ }
+
+ match Url::parse(url) {
+ Ok(u) => {
+ rsvg_log!(session, "setting base_uri to \"{}\"", u.as_str());
+ let mut inner = imp.inner.borrow_mut();
+ inner.base_url.set(u);
+ }
+
+ Err(e) => {
+ rsvg_log!(
+ session,
+ "not setting base_uri to \"{}\" since it is invalid: {}",
+ url,
+ e
+ );
+ }
+ }
+ }
+
+ fn set_base_gfile(&self, file: &gio::File) {
+ self.set_base_url(&file.uri());
+ }
+
+ fn get_base_url(&self) -> Option<String> {
+ let inner = self.imp().inner.borrow();
+ inner.base_url.get().map(|url| url.as_str().to_string())
+ }
+
+ fn get_base_url_as_ptr(&self) -> *const libc::c_char {
+ let inner = self.imp().inner.borrow();
+ inner.base_url.get_ptr()
+ }
+
+ fn set_dpi_x(&self, dpi_x: f64) {
+ let mut inner = self.imp().inner.borrow_mut();
+ let dpi = inner.dpi;
+ inner.dpi = Dpi::new(dpi_x, dpi.y());
+ }
+
+ fn set_dpi_y(&self, dpi_y: f64) {
+ let mut inner = self.imp().inner.borrow_mut();
+ let dpi = inner.dpi;
+ inner.dpi = Dpi::new(dpi.x(), dpi_y);
+ }
+
+ fn get_dpi_x(&self) -> f64 {
+ let inner = self.imp().inner.borrow();
+ inner.dpi.x()
+ }
+
+ fn get_dpi_y(&self) -> f64 {
+ let inner = self.imp().inner.borrow();
+ inner.dpi.y()
+ }
+
+ fn set_flags(&self, flags: HandleFlags) {
+ let mut inner = self.imp().inner.borrow_mut();
+ inner.load_flags = LoadFlags::from(flags);
+ }
+
+ fn get_flags(&self) -> HandleFlags {
+ let inner = self.imp().inner.borrow();
+ HandleFlags::from(inner.load_flags)
+ }
+
+ fn set_size_callback(
+ &self,
+ size_func: RsvgSizeFunc,
+ user_data: gpointer,
+ destroy_notify: glib::ffi::GDestroyNotify,
+ ) {
+ let mut inner = self.imp().inner.borrow_mut();
+ inner.size_callback = SizeCallback::new(size_func, user_data, destroy_notify);
+ }
+
+ fn write(&self, buf: &[u8]) {
+ let mut state = self.imp().load_state.borrow_mut();
+
+ match *state {
+ LoadState::Start => {
+ *state = LoadState::Loading {
+ buffer: Vec::from(buf),
+ }
+ }
+
+ LoadState::Loading { ref mut buffer } => {
+ buffer.extend_from_slice(buf);
+ }
+
+ _ => {
+ rsvg_g_critical("Handle must not be closed in order to write to it");
+ }
+ }
+ }
+
+ fn close(&self) -> Result<(), LoadingError> {
+ let imp = self.imp();
+
+ let inner = imp.inner.borrow();
+ let mut state = imp.load_state.borrow_mut();
+
+ match *state {
+ LoadState::Start => {
+ *state = LoadState::ClosedError;
+ Err(LoadingError::XmlParseError(String::from(
+ "caller did not write any data",
+ )))
+ }
+
+ LoadState::Loading { ref buffer } => {
+ let bytes = Bytes::from(buffer);
+ let stream = gio::MemoryInputStream::from_bytes(&bytes);
+
+ let base_file = inner.base_url.get_gfile();
+ self.read_stream(state, &stream.upcast(), base_file.as_ref(), None)
+ }
+
+ // Closing is idempotent
+ LoadState::ClosedOk { .. } => Ok(()),
+ LoadState::ClosedError => Ok(()),
+ }
+ }
+
+ fn read_stream_sync(
+ &self,
+ stream: &gio::InputStream,
+ cancellable: Option<&gio::Cancellable>,
+ ) -> Result<(), LoadingError> {
+ let imp = self.imp();
+
+ let state = imp.load_state.borrow_mut();
+ let inner = imp.inner.borrow();
+
+ match *state {
+ LoadState::Start => {
+ let base_file = inner.base_url.get_gfile();
+ self.read_stream(state, stream, base_file.as_ref(), cancellable)
+ }
+
+ LoadState::Loading { .. } | LoadState::ClosedOk { .. } | LoadState::ClosedError => {
+ rsvg_g_critical(
+ "handle must not be already loaded in order to call \
+ rsvg_handle_read_stream_sync()",
+ );
+ Err(LoadingError::Other(String::from("API ordering")))
+ }
+ }
+ }
+
+ fn read_stream(
+ &self,
+ mut load_state: RefMut<'_, LoadState>,
+ stream: &gio::InputStream,
+ base_file: Option<&gio::File>,
+ cancellable: Option<&gio::Cancellable>,
+ ) -> Result<(), LoadingError> {
+ let loader = self.make_loader();
+
+ load_state.set_from_loading_result(loader.read_stream(stream, base_file, cancellable))
+ }
+
+ fn get_handle_ref(&self) -> Result<Ref<'_, SvgHandle>, RenderingError> {
+ let state = self.imp().load_state.borrow();
+
+ match *state {
+ LoadState::Start => {
+ rsvg_g_critical("Handle has not been loaded");
+ Err(RenderingError::HandleIsNotLoaded)
+ }
+
+ LoadState::Loading { .. } => {
+ rsvg_g_critical("Handle is still loading; call rsvg_handle_close() first");
+ Err(RenderingError::HandleIsNotLoaded)
+ }
+
+ LoadState::ClosedError => {
+ rsvg_g_critical(
+ "Handle could not read or parse the SVG; did you check for errors during the \
+ loading stage?",
+ );
+ Err(RenderingError::HandleIsNotLoaded)
+ }
+
+ LoadState::ClosedOk { .. } => Ok(Ref::map(state, |s| match *s {
+ LoadState::ClosedOk { ref handle } => handle,
+ _ => unreachable!(),
+ })),
+ }
+ }
+
+ fn make_loader(&self) -> Loader {
+ let imp = self.imp();
+ let inner = imp.inner.borrow();
+ let session = imp.session.clone();
+
+ Loader::new_with_session(session)
+ .with_unlimited_size(inner.load_flags.unlimited_size)
+ .keep_image_data(inner.load_flags.keep_image_data)
+ }
+
+ fn has_sub(&self, id: &str) -> Result<bool, RenderingError> {
+ let handle = self.get_handle_ref()?;
+ Ok(handle.has_element_with_id(id)?)
+ }
+
+ fn get_dimensions_or_empty(&self) -> RsvgDimensionData {
+ self.get_dimensions_sub(None)
+ .unwrap_or_else(|_| RsvgDimensionData::empty())
+ }
+
+ fn get_dimensions_sub(&self, id: Option<&str>) -> Result<RsvgDimensionData, RenderingError> {
+ let inner = self.imp().inner.borrow();
+
+ // This function is probably called from the cairo_render functions,
+ // or is being erroneously called within the size_func.
+ // To prevent an infinite loop we are saving the state, and
+ // returning a meaningless size.
+ if inner.size_callback.get_in_loop() {
+ return Ok(RsvgDimensionData {
+ width: 1,
+ height: 1,
+ em: 1.0,
+ ex: 1.0,
+ });
+ }
+
+ inner.size_callback.start_loop();
+
+ let res = self
+ .get_geometry_sub(id)
+ .and_then(|(ink_r, _)| {
+ // Keep these in sync with tests/src/reference.rs
+ let width = checked_i32(ink_r.width().round())?;
+ let height = checked_i32(ink_r.height().round())?;
+
+ Ok((ink_r, width, height))
+ })
+ .map(|(ink_r, width, height)| {
+ let (w, h) = inner.size_callback.call(width, height);
+
+ RsvgDimensionData {
+ width: w,
+ height: h,
+ em: ink_r.width(),
+ ex: ink_r.height(),
+ }
+ });
+
+ inner.size_callback.end_loop();
+
+ res
+ }
+
+ fn get_position_sub(&self, id: Option<&str>) -> Result<RsvgPositionData, RenderingError> {
+ let inner = self.imp().inner.borrow();
+
+ if id.is_none() {
+ return Ok(RsvgPositionData { x: 0, y: 0 });
+ }
+
+ self.get_geometry_sub(id)
+ .and_then(|(ink_r, _)| {
+ let width = checked_i32(ink_r.width().round())?;
+ let height = checked_i32(ink_r.height().round())?;
+
+ Ok((ink_r, width, height))
+ })
+ .and_then(|(ink_r, width, height)| {
+ inner.size_callback.call(width, height);
+
+ Ok(RsvgPositionData {
+ x: checked_i32(ink_r.x())?,
+ y: checked_i32(ink_r.y())?,
+ })
+ })
+ }
+
+ fn make_renderer<'a>(&self, handle_ref: &'a Ref<'_, SvgHandle>) -> CairoRenderer<'a> {
+ let inner = self.imp().inner.borrow();
+
+ CairoRenderer::new(handle_ref)
+ .with_dpi(inner.dpi.x(), inner.dpi.y())
+ .test_mode(inner.is_testing)
+ }
+
+ fn get_geometry_sub(
+ &self,
+ id: Option<&str>,
+ ) -> Result<(cairo::Rectangle, cairo::Rectangle), RenderingError> {
+ let handle = self.get_handle_ref()?;
+ let renderer = self.make_renderer(&handle);
+
+ Ok(renderer.legacy_layer_geometry(id)?)
+ }
+
+ fn set_stylesheet(&self, css: &str) -> Result<(), LoadingError> {
+ match *self.imp().load_state.borrow_mut() {
+ LoadState::ClosedOk { ref mut handle } => handle.set_stylesheet(css),
+
+ _ => {
+ rsvg_g_critical(
+ "handle must already be loaded in order to call \
+ rsvg_handle_set_stylesheet()",
+ );
+ Err(LoadingError::Other(String::from("API ordering")))
+ }
+ }
+ }
+
+ fn render_cairo_sub(
+ &self,
+ cr: *mut cairo::ffi::cairo_t,
+ id: Option<&str>,
+ ) -> Result<(), RenderingError> {
+ let dimensions = self.get_dimensions_sub(None)?;
+ if dimensions.width == 0 || dimensions.height == 0 {
+ // nothing to render
+ return Ok(());
+ }
+
+ let viewport = cairo::Rectangle::new(
+ 0.0,
+ 0.0,
+ f64::from(dimensions.width),
+ f64::from(dimensions.height),
+ );
+
+ self.render_layer(cr, id, &viewport)
+ }
+
+ fn get_pixbuf_sub(&self, id: Option<&str>) -> Result<Pixbuf, RenderingError> {
+ let dimensions = self.get_dimensions_sub(None)?;
+
+ if dimensions.width == 0 || dimensions.height == 0 {
+ return Ok(empty_pixbuf()?);
+ }
+
+ let surface = cairo::ImageSurface::create(
+ cairo::Format::ARgb32,
+ dimensions.width,
+ dimensions.height,
+ )?;
+
+ {
+ let cr = cairo::Context::new(&surface)?;
+ let cr_raw = cr.to_raw_none();
+ self.render_cairo_sub(cr_raw, id)?;
+ }
+
+ let surface = SharedImageSurface::wrap(surface, SurfaceType::SRgb)?;
+
+ Ok(pixbuf_from_surface(&surface)?)
+ }
+
+ fn render_document(
+ &self,
+ cr: *mut cairo::ffi::cairo_t,
+ viewport: &cairo::Rectangle,
+ ) -> Result<(), RenderingError> {
+ let cr = check_cairo_context(cr)?;
+
+ let handle = self.get_handle_ref()?;
+
+ let renderer = self.make_renderer(&handle);
+ Ok(renderer.render_document(&cr, viewport)?)
+ }
+
+ fn get_geometry_for_layer(
+ &self,
+ id: Option<&str>,
+ viewport: &cairo::Rectangle,
+ ) -> Result<(RsvgRectangle, RsvgRectangle), RenderingError> {
+ let handle = self.get_handle_ref()?;
+ let renderer = self.make_renderer(&handle);
+
+ Ok(renderer
+ .geometry_for_layer(id, viewport)
+ .map(|(i, l)| (RsvgRectangle::from(i), RsvgRectangle::from(l)))?)
+ }
+
+ fn render_layer(
+ &self,
+ cr: *mut cairo::ffi::cairo_t,
+ id: Option<&str>,
+ viewport: &cairo::Rectangle,
+ ) -> Result<(), RenderingError> {
+ let cr = check_cairo_context(cr)?;
+
+ let handle = self.get_handle_ref()?;
+
+ let renderer = self.make_renderer(&handle);
+
+ Ok(renderer.render_layer(&cr, id, viewport)?)
+ }
+
+ fn get_geometry_for_element(
+ &self,
+ id: Option<&str>,
+ ) -> Result<(RsvgRectangle, RsvgRectangle), RenderingError> {
+ let handle = self.get_handle_ref()?;
+
+ let renderer = self.make_renderer(&handle);
+
+ Ok(renderer
+ .geometry_for_element(id)
+ .map(|(i, l)| (RsvgRectangle::from(i), RsvgRectangle::from(l)))?)
+ }
+
+ fn render_element(
+ &self,
+ cr: *mut cairo::ffi::cairo_t,
+ id: Option<&str>,
+ element_viewport: &cairo::Rectangle,
+ ) -> Result<(), RenderingError> {
+ let cr = check_cairo_context(cr)?;
+
+ let handle = self.get_handle_ref()?;
+
+ let renderer = self.make_renderer(&handle);
+
+ Ok(renderer.render_element(&cr, id, element_viewport)?)
+ }
+
+ fn get_intrinsic_dimensions(&self) -> Result<IntrinsicDimensions, RenderingError> {
+ let handle = self.get_handle_ref()?;
+ let renderer = self.make_renderer(&handle);
+ Ok(renderer.intrinsic_dimensions())
+ }
+
+ fn get_intrinsic_size_in_pixels(&self) -> Result<Option<(f64, f64)>, RenderingError> {
+ let handle = self.get_handle_ref()?;
+ let renderer = self.make_renderer(&handle);
+ Ok(renderer.intrinsic_size_in_pixels())
+ }
+
+ fn set_testing(&self, is_testing: bool) {
+ let mut inner = self.imp().inner.borrow_mut();
+ inner.is_testing = is_testing;
+ }
+}
+
+fn is_rsvg_handle(obj: *const RsvgHandle) -> bool {
+ unsafe { instance_of::<CHandle>(obj as *const _) }
+}
+
+fn is_input_stream(obj: *mut gio::ffi::GInputStream) -> bool {
+ unsafe { instance_of::<gio::InputStream>(obj as *const _) }
+}
+
+fn is_gfile(obj: *const gio::ffi::GFile) -> bool {
+ unsafe { instance_of::<gio::File>(obj as *const _) }
+}
+
+fn is_cancellable(obj: *mut gio::ffi::GCancellable) -> bool {
+ unsafe { instance_of::<gio::Cancellable>(obj as *const _) }
+}
+
+fn get_rust_handle(handle: *const RsvgHandle) -> CHandle {
+ let handle = unsafe { &*handle };
+ handle.imp().obj().to_owned()
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn rsvg_handle_get_type() -> glib::ffi::GType {
+ CHandle::static_type().into_glib()
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn rsvg_error_get_type() -> glib::ffi::GType {
+ Error::static_type().into_glib()
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn rsvg_handle_flags_get_type() -> glib::ffi::GType {
+ HandleFlags::static_type().into_glib()
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn rsvg_handle_set_base_uri(
+ handle: *const RsvgHandle,
+ uri: *const libc::c_char,
+) {
+ rsvg_return_if_fail! {
+ rsvg_handle_set_base_uri;
+
+ is_rsvg_handle(handle),
+ !uri.is_null(),
+ }
+
+ let rhandle = get_rust_handle(handle);
+
+ assert!(!uri.is_null());
+ let uri: String = from_glib_none(uri);
+
+ rhandle.set_base_url(&uri);
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn rsvg_handle_set_base_gfile(
+ handle: *const RsvgHandle,
+ raw_gfile: *mut gio::ffi::GFile,
+) {
+ rsvg_return_if_fail! {
+ rsvg_handle_set_base_gfile;
+
+ is_rsvg_handle(handle),
+ is_gfile(raw_gfile),
+ }
+
+ let rhandle = get_rust_handle(handle);
+
+ assert!(!raw_gfile.is_null());
+
+ let file: gio::File = from_glib_none(raw_gfile);
+
+ rhandle.set_base_gfile(&file);
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn rsvg_handle_get_base_uri(
+ handle: *const RsvgHandle,
+) -> *const libc::c_char {
+ rsvg_return_val_if_fail! {
+ rsvg_handle_get_base_uri => ptr::null();
+
+ is_rsvg_handle(handle),
+ }
+
+ let rhandle = get_rust_handle(handle);
+
+ rhandle.get_base_url_as_ptr()
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn rsvg_handle_set_dpi(handle: *const RsvgHandle, dpi: libc::c_double) {
+ rsvg_return_if_fail! {
+ rsvg_handle_set_dpi;
+
+ is_rsvg_handle(handle),
+ }
+
+ let rhandle = get_rust_handle(handle);
+ rhandle.set_dpi_x(dpi);
+ rhandle.set_dpi_y(dpi);
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn rsvg_handle_set_dpi_x_y(
+ handle: *const RsvgHandle,
+ dpi_x: libc::c_double,
+ dpi_y: libc::c_double,
+) {
+ rsvg_return_if_fail! {
+ rsvg_handle_set_dpi_x_y;
+
+ is_rsvg_handle(handle),
+ }
+
+ let rhandle = get_rust_handle(handle);
+ rhandle.set_dpi_x(dpi_x);
+ rhandle.set_dpi_y(dpi_y);
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn rsvg_handle_set_size_callback(
+ handle: *const RsvgHandle,
+ size_func: RsvgSizeFunc,
+ user_data: gpointer,
+ destroy_notify: glib::ffi::GDestroyNotify,
+) {
+ rsvg_return_if_fail! {
+ rsvg_handle_set_size_callback;
+
+ is_rsvg_handle(handle),
+ }
+
+ let rhandle = get_rust_handle(handle);
+
+ rhandle.set_size_callback(size_func, user_data, destroy_notify);
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn rsvg_handle_internal_set_testing(
+ handle: *const RsvgHandle,
+ testing: glib::ffi::gboolean,
+) {
+ rsvg_return_if_fail! {
+ rsvg_handle_internal_set_testing;
+
+ is_rsvg_handle(handle),
+ }
+
+ let rhandle = get_rust_handle(handle);
+
+ rhandle.set_testing(from_glib(testing));
+}
+
+trait IntoGError {
+ type GlibResult;
+
+ fn into_gerror(self, session: &Session, error: *mut *mut glib::ffi::GError)
+ -> Self::GlibResult;
+}
+
+impl<E: fmt::Display> IntoGError for Result<(), E> {
+ type GlibResult = glib::ffi::gboolean;
+
+ fn into_gerror(
+ self,
+ session: &Session,
+ error: *mut *mut glib::ffi::GError,
+ ) -> Self::GlibResult {
+ match self {
+ Ok(()) => true.into_glib(),
+
+ Err(e) => {
+ set_gerror(session, error, 0, &format!("{e}"));
+ false.into_glib()
+ }
+ }
+ }
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn rsvg_handle_read_stream_sync(
+ handle: *const RsvgHandle,
+ stream: *mut gio::ffi::GInputStream,
+ cancellable: *mut gio::ffi::GCancellable,
+ error: *mut *mut glib::ffi::GError,
+) -> glib::ffi::gboolean {
+ rsvg_return_val_if_fail! {
+ rsvg_handle_read_stream_sync => false.into_glib();
+
+ is_rsvg_handle(handle),
+ is_input_stream(stream),
+ cancellable.is_null() || is_cancellable(cancellable),
+ error.is_null() || (*error).is_null(),
+ }
+
+ let rhandle = get_rust_handle(handle);
+ let session = rhandle.imp().session.clone();
+
+ let stream = gio::InputStream::from_glib_none(stream);
+ let cancellable: Option<gio::Cancellable> = from_glib_none(cancellable);
+
+ rhandle
+ .read_stream_sync(&stream, cancellable.as_ref())
+ .into_gerror(&session, error)
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn rsvg_handle_write(
+ handle: *const RsvgHandle,
+ buf: *const u8,
+ count: usize,
+ error: *mut *mut glib::ffi::GError,
+) -> glib::ffi::gboolean {
+ rsvg_return_val_if_fail! {
+ rsvg_handle_write => false.into_glib();
+
+ is_rsvg_handle(handle),
+ error.is_null() || (*error).is_null(),
+ !buf.is_null() || count == 0,
+ }
+
+ let rhandle = get_rust_handle(handle);
+ let buffer = slice::from_raw_parts(buf, count);
+ rhandle.write(buffer);
+
+ true.into_glib()
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn rsvg_handle_close(
+ handle: *const RsvgHandle,
+ error: *mut *mut glib::ffi::GError,
+) -> glib::ffi::gboolean {
+ rsvg_return_val_if_fail! {
+ rsvg_handle_close => false.into_glib();
+
+ is_rsvg_handle(handle),
+ error.is_null() || (*error).is_null(),
+ }
+
+ let rhandle = get_rust_handle(handle);
+ let session = rhandle.imp().session.clone();
+
+ rhandle.close().into_gerror(&session, error)
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn rsvg_handle_has_sub(
+ handle: *const RsvgHandle,
+ id: *const libc::c_char,
+) -> glib::ffi::gboolean {
+ rsvg_return_val_if_fail! {
+ rsvg_handle_has_sub => false.into_glib();
+
+ is_rsvg_handle(handle),
+ }
+
+ let rhandle = get_rust_handle(handle);
+
+ if id.is_null() {
+ return false.into_glib();
+ }
+
+ let id: String = from_glib_none(id);
+ rhandle.has_sub(&id).unwrap_or(false).into_glib()
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn rsvg_handle_render_cairo(
+ handle: *const RsvgHandle,
+ cr: *mut cairo::ffi::cairo_t,
+) -> glib::ffi::gboolean {
+ rsvg_return_val_if_fail! {
+ rsvg_handle_render_cairo => false.into_glib();
+
+ is_rsvg_handle(handle),
+ !cr.is_null(),
+ }
+
+ let rhandle = get_rust_handle(handle);
+ let session = rhandle.imp().session.clone();
+
+ rhandle
+ .render_cairo_sub(cr, None)
+ .into_gerror(&session, ptr::null_mut())
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn rsvg_handle_render_cairo_sub(
+ handle: *const RsvgHandle,
+ cr: *mut cairo::ffi::cairo_t,
+ id: *const libc::c_char,
+) -> glib::ffi::gboolean {
+ rsvg_return_val_if_fail! {
+ rsvg_handle_render_cairo_sub => false.into_glib();
+
+ is_rsvg_handle(handle),
+ !cr.is_null(),
+ }
+
+ let rhandle = get_rust_handle(handle);
+ let session = rhandle.imp().session.clone();
+
+ let id: Option<String> = from_glib_none(id);
+
+ rhandle
+ .render_cairo_sub(cr, id.as_deref())
+ .into_gerror(&session, ptr::null_mut())
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn rsvg_handle_get_pixbuf(
+ handle: *const RsvgHandle,
+) -> *mut gdk_pixbuf::ffi::GdkPixbuf {
+ rsvg_return_val_if_fail! {
+ rsvg_handle_get_pixbuf => ptr::null_mut();
+
+ is_rsvg_handle(handle),
+ }
+
+ let rhandle = get_rust_handle(handle);
+
+ match rhandle.get_pixbuf_sub(None) {
+ Ok(pixbuf) => pixbuf.to_glib_full(),
+ Err(e) => {
+ let session = &rhandle.imp().session;
+ rsvg_log!(session, "could not render: {}", e);
+ ptr::null_mut()
+ }
+ }
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn rsvg_handle_get_pixbuf_sub(
+ handle: *const RsvgHandle,
+ id: *const libc::c_char,
+) -> *mut gdk_pixbuf::ffi::GdkPixbuf {
+ rsvg_return_val_if_fail! {
+ rsvg_handle_get_pixbuf_sub => ptr::null_mut();
+
+ is_rsvg_handle(handle),
+ }
+
+ let rhandle = get_rust_handle(handle);
+ let id: Option<String> = from_glib_none(id);
+
+ match rhandle.get_pixbuf_sub(id.as_deref()) {
+ Ok(pixbuf) => pixbuf.to_glib_full(),
+ Err(e) => {
+ let session = &rhandle.imp().session;
+ rsvg_log!(session, "could not render: {}", e);
+ ptr::null_mut()
+ }
+ }
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn rsvg_handle_get_dimensions(
+ handle: *const RsvgHandle,
+ dimension_data: *mut RsvgDimensionData,
+) {
+ rsvg_handle_get_dimensions_sub(handle, dimension_data, ptr::null());
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn rsvg_handle_get_dimensions_sub(
+ handle: *const RsvgHandle,
+ dimension_data: *mut RsvgDimensionData,
+ id: *const libc::c_char,
+) -> glib::ffi::gboolean {
+ rsvg_return_val_if_fail! {
+ rsvg_handle_get_dimensions_sub => false.into_glib();
+
+ is_rsvg_handle(handle),
+ !dimension_data.is_null(),
+ }
+
+ let rhandle = get_rust_handle(handle);
+
+ let id: Option<String> = from_glib_none(id);
+
+ match rhandle.get_dimensions_sub(id.as_deref()) {
+ Ok(dimensions) => {
+ *dimension_data = dimensions;
+ true.into_glib()
+ }
+
+ Err(e) => {
+ let session = &rhandle.imp().session;
+ rsvg_log!(session, "could not get dimensions: {}", e);
+ *dimension_data = RsvgDimensionData::empty();
+ false.into_glib()
+ }
+ }
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn rsvg_handle_get_position_sub(
+ handle: *const RsvgHandle,
+ position_data: *mut RsvgPositionData,
+ id: *const libc::c_char,
+) -> glib::ffi::gboolean {
+ rsvg_return_val_if_fail! {
+ rsvg_handle_get_position_sub => false.into_glib();
+
+ is_rsvg_handle(handle),
+ !position_data.is_null(),
+ }
+
+ let rhandle = get_rust_handle(handle);
+
+ let id: Option<String> = from_glib_none(id);
+
+ match rhandle.get_position_sub(id.as_deref()) {
+ Ok(position) => {
+ *position_data = position;
+ true.into_glib()
+ }
+
+ Err(e) => {
+ let p = &mut *position_data;
+
+ p.x = 0;
+ p.y = 0;
+
+ let session = &rhandle.imp().session;
+ rsvg_log!(session, "could not get position: {}", e);
+ false.into_glib()
+ }
+ }
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn rsvg_handle_new() -> *const RsvgHandle {
+ let obj = glib::Object::new::<CHandle>();
+
+ obj.to_glib_full()
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn rsvg_handle_new_with_flags(flags: RsvgHandleFlags) -> *const RsvgHandle {
+ let obj = glib::Object::builder::<CHandle>()
+ .property("flags", &HandleFlags::from_bits_truncate(flags))
+ .build();
+
+ obj.to_glib_full()
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn rsvg_handle_new_from_file(
+ filename: *const libc::c_char,
+ error: *mut *mut glib::ffi::GError,
+) -> *const RsvgHandle {
+ rsvg_return_val_if_fail! {
+ rsvg_handle_new_from_file => ptr::null();
+
+ !filename.is_null(),
+ error.is_null() || (*error).is_null(),
+ }
+
+ let file = match PathOrUrl::new(filename) {
+ Ok(p) => p.get_gfile(),
+
+ Err(s) => {
+ // Here we don't have a handle created yet, so it's fine to create a session
+ // to log the error message. We'll need to change this when we start logging
+ // API calls, so that we can log the call to rsvg_handle_new_from_file() and
+ // then pass *that* session to rsvg_handle_new_from_gfile_sync() below.
+ let session = Session::default();
+ set_gerror(&session, error, 0, &s);
+ return ptr::null_mut();
+ }
+ };
+
+ rsvg_handle_new_from_gfile_sync(file.to_glib_none().0, 0, ptr::null_mut(), error)
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn rsvg_handle_new_from_gfile_sync(
+ file: *mut gio::ffi::GFile,
+ flags: RsvgHandleFlags,
+ cancellable: *mut gio::ffi::GCancellable,
+ error: *mut *mut glib::ffi::GError,
+) -> *const RsvgHandle {
+ rsvg_return_val_if_fail! {
+ rsvg_handle_new_from_gfile_sync => ptr::null();
+
+ is_gfile(file),
+ cancellable.is_null() || is_cancellable(cancellable),
+ error.is_null() || (*error).is_null(),
+ }
+
+ let raw_handle = rsvg_handle_new_with_flags(flags);
+
+ let rhandle = get_rust_handle(raw_handle);
+ let session = rhandle.imp().session.clone();
+
+ let file = gio::File::from_glib_none(file);
+ rhandle.set_base_gfile(&file);
+
+ let cancellable: Option<gio::Cancellable> = from_glib_none(cancellable);
+
+ let res = file
+ .read(cancellable.as_ref())
+ .map_err(LoadingError::from)
+ .and_then(|stream| rhandle.read_stream_sync(&stream.upcast(), cancellable.as_ref()));
+
+ match res {
+ Ok(()) => raw_handle,
+
+ Err(e) => {
+ set_gerror(&session, error, 0, &format!("{e}"));
+ gobject_ffi::g_object_unref(raw_handle as *mut _);
+ ptr::null_mut()
+ }
+ }
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn rsvg_handle_new_from_stream_sync(
+ input_stream: *mut gio::ffi::GInputStream,
+ base_file: *mut gio::ffi::GFile,
+ flags: RsvgHandleFlags,
+ cancellable: *mut gio::ffi::GCancellable,
+ error: *mut *mut glib::ffi::GError,
+) -> *const RsvgHandle {
+ rsvg_return_val_if_fail! {
+ rsvg_handle_new_from_stream_sync => ptr::null();
+
+ is_input_stream(input_stream),
+ base_file.is_null() || is_gfile(base_file),
+ cancellable.is_null() || is_cancellable(cancellable),
+ error.is_null() || (*error).is_null(),
+ }
+
+ let raw_handle = rsvg_handle_new_with_flags(flags);
+
+ let rhandle = get_rust_handle(raw_handle);
+ let session = rhandle.imp().session.clone();
+
+ let base_file: Option<gio::File> = from_glib_none(base_file);
+ if let Some(base_file) = base_file {
+ rhandle.set_base_gfile(&base_file);
+ }
+
+ let stream: gio::InputStream = from_glib_none(input_stream);
+ let cancellable: Option<gio::Cancellable> = from_glib_none(cancellable);
+
+ match rhandle.read_stream_sync(&stream, cancellable.as_ref()) {
+ Ok(()) => raw_handle,
+
+ Err(e) => {
+ set_gerror(&session, error, 0, &format!("{e}"));
+ gobject_ffi::g_object_unref(raw_handle as *mut _);
+ ptr::null_mut()
+ }
+ }
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn rsvg_handle_new_from_data(
+ data: *const u8,
+ data_len: usize,
+ error: *mut *mut glib::ffi::GError,
+) -> *const RsvgHandle {
+ rsvg_return_val_if_fail! {
+ rsvg_handle_new_from_data => ptr::null();
+
+ !data.is_null() || data_len == 0,
+ data_len <= std::isize::MAX as usize,
+ error.is_null() || (*error).is_null(),
+ }
+
+ // We create the MemoryInputStream without the gtk-rs binding because of this:
+ //
+ // - The binding doesn't provide _new_from_data(). All of the binding's ways to
+ // put data into a MemoryInputStream involve copying the data buffer.
+ //
+ // - We can't use glib::Bytes from the binding either, for the same reason.
+ //
+ // - For now, we are using the other C-visible constructor, so we need a raw pointer to the
+ // stream, anyway.
+
+ assert!(data_len <= std::isize::MAX as usize);
+ let data_len = data_len as isize;
+
+ let raw_stream = gio::ffi::g_memory_input_stream_new_from_data(data as *mut u8, data_len, None);
+
+ let ret = rsvg_handle_new_from_stream_sync(
+ raw_stream,
+ ptr::null_mut(), // base_file
+ 0,
+ ptr::null_mut(), // cancellable
+ error,
+ );
+
+ gobject_ffi::g_object_unref(raw_stream as *mut _);
+ ret
+}
+
+unsafe fn set_out_param<T: Copy>(
+ out_has_param: *mut glib::ffi::gboolean,
+ out_param: *mut T,
+ value: &Option<T>,
+) {
+ let has_value = if let Some(ref v) = *value {
+ if !out_param.is_null() {
+ *out_param = *v;
+ }
+
+ true
+ } else {
+ false
+ };
+
+ if !out_has_param.is_null() {
+ *out_has_param = has_value.into_glib();
+ }
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn rsvg_handle_free(handle: *mut RsvgHandle) {
+ gobject_ffi::g_object_unref(handle as *mut _);
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn rsvg_handle_set_stylesheet(
+ handle: *const RsvgHandle,
+ css: *const u8,
+ css_len: usize,
+ error: *mut *mut glib::ffi::GError,
+) -> glib::ffi::gboolean {
+ rsvg_return_val_if_fail! {
+ rsvg_handle_set_stylesheet => false.into_glib();
+
+ is_rsvg_handle(handle),
+ !css.is_null() || (css.is_null() && css_len == 0),
+ error.is_null() || (*error).is_null(),
+ }
+
+ let rhandle = get_rust_handle(handle);
+ let session = rhandle.imp().session.clone();
+
+ let css = match (css, css_len) {
+ (p, 0) if p.is_null() => "",
+ (_, _) => {
+ let s = slice::from_raw_parts(css, css_len);
+ match str::from_utf8(s) {
+ Ok(s) => s,
+ Err(e) => {
+ set_gerror(&session, error, 0, &format!("CSS is not valid UTF-8: {e}"));
+ return false.into_glib();
+ }
+ }
+ }
+ };
+
+ rhandle.set_stylesheet(css).into_gerror(&session, error)
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn rsvg_handle_get_intrinsic_dimensions(
+ handle: *const RsvgHandle,
+ out_has_width: *mut glib::ffi::gboolean,
+ out_width: *mut RsvgLength,
+ out_has_height: *mut glib::ffi::gboolean,
+ out_height: *mut RsvgLength,
+ out_has_viewbox: *mut glib::ffi::gboolean,
+ out_viewbox: *mut RsvgRectangle,
+) {
+ rsvg_return_if_fail! {
+ rsvg_handle_get_intrinsic_dimensions;
+
+ is_rsvg_handle(handle),
+ }
+
+ let rhandle = get_rust_handle(handle);
+
+ let d = rhandle
+ .get_intrinsic_dimensions()
+ .unwrap_or_else(|_| panic!("API called out of order"));
+
+ let w = d.width;
+ let h = d.height;
+ let r = d.vbox.map(RsvgRectangle::from);
+
+ set_out_param(out_has_width, out_width, &Into::into(w));
+ set_out_param(out_has_height, out_height, &Into::into(h));
+ set_out_param(out_has_viewbox, out_viewbox, &r);
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn rsvg_handle_get_intrinsic_size_in_pixels(
+ handle: *const RsvgHandle,
+ out_width: *mut f64,
+ out_height: *mut f64,
+) -> glib::ffi::gboolean {
+ rsvg_return_val_if_fail! {
+ rsvg_handle_get_intrinsic_size_in_pixels => false.into_glib();
+
+ is_rsvg_handle(handle),
+ }
+
+ let rhandle = get_rust_handle(handle);
+
+ let dim = rhandle
+ .get_intrinsic_size_in_pixels()
+ .unwrap_or_else(|_| panic!("API called out of order"));
+
+ let (w, h) = dim.unwrap_or((0.0, 0.0));
+
+ if !out_width.is_null() {
+ *out_width = w;
+ }
+
+ if !out_height.is_null() {
+ *out_height = h;
+ }
+
+ dim.is_some().into_glib()
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn rsvg_handle_render_document(
+ handle: *const RsvgHandle,
+ cr: *mut cairo::ffi::cairo_t,
+ viewport: *const RsvgRectangle,
+ error: *mut *mut glib::ffi::GError,
+) -> glib::ffi::gboolean {
+ rsvg_return_val_if_fail! {
+ rsvg_handle_render_document => false.into_glib();
+
+ is_rsvg_handle(handle),
+ !cr.is_null(),
+ !viewport.is_null(),
+ error.is_null() || (*error).is_null(),
+ }
+
+ let rhandle = get_rust_handle(handle);
+ let session = rhandle.imp().session.clone();
+
+ rhandle
+ .render_document(cr, &(*viewport).into())
+ .into_gerror(&session, error)
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn rsvg_handle_get_geometry_for_layer(
+ handle: *mut RsvgHandle,
+ id: *const libc::c_char,
+ viewport: *const RsvgRectangle,
+ out_ink_rect: *mut RsvgRectangle,
+ out_logical_rect: *mut RsvgRectangle,
+ error: *mut *mut glib::ffi::GError,
+) -> glib::ffi::gboolean {
+ rsvg_return_val_if_fail! {
+ rsvg_handle_get_geometry_for_layer => false.into_glib();
+
+ is_rsvg_handle(handle),
+ !viewport.is_null(),
+ error.is_null() || (*error).is_null(),
+ }
+
+ let rhandle = get_rust_handle(handle);
+ let session = rhandle.imp().session.clone();
+
+ let id: Option<String> = from_glib_none(id);
+
+ rhandle
+ .get_geometry_for_layer(id.as_deref(), &(*viewport).into())
+ .map(|(ink_rect, logical_rect)| {
+ if !out_ink_rect.is_null() {
+ *out_ink_rect = ink_rect;
+ }
+
+ if !out_logical_rect.is_null() {
+ *out_logical_rect = logical_rect;
+ }
+ })
+ .into_gerror(&session, error)
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn rsvg_handle_render_layer(
+ handle: *const RsvgHandle,
+ cr: *mut cairo::ffi::cairo_t,
+ id: *const libc::c_char,
+ viewport: *const RsvgRectangle,
+ error: *mut *mut glib::ffi::GError,
+) -> glib::ffi::gboolean {
+ rsvg_return_val_if_fail! {
+ rsvg_handle_render_layer => false.into_glib();
+
+ is_rsvg_handle(handle),
+ !cr.is_null(),
+ !viewport.is_null(),
+ error.is_null() || (*error).is_null(),
+ }
+
+ let rhandle = get_rust_handle(handle);
+ let session = rhandle.imp().session.clone();
+
+ let id: Option<String> = from_glib_none(id);
+
+ rhandle
+ .render_layer(cr, id.as_deref(), &(*viewport).into())
+ .into_gerror(&session, error)
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn rsvg_handle_get_geometry_for_element(
+ handle: *const RsvgHandle,
+ id: *const libc::c_char,
+ out_ink_rect: *mut RsvgRectangle,
+ out_logical_rect: *mut RsvgRectangle,
+ error: *mut *mut glib::ffi::GError,
+) -> glib::ffi::gboolean {
+ rsvg_return_val_if_fail! {
+ rsvg_handle_get_geometry_for_element => false.into_glib();
+
+ is_rsvg_handle(handle),
+ error.is_null() || (*error).is_null(),
+ }
+
+ let rhandle = get_rust_handle(handle);
+ let session = rhandle.imp().session.clone();
+
+ let id: Option<String> = from_glib_none(id);
+
+ rhandle
+ .get_geometry_for_element(id.as_deref())
+ .map(|(ink_rect, logical_rect)| {
+ if !out_ink_rect.is_null() {
+ *out_ink_rect = ink_rect;
+ }
+
+ if !out_logical_rect.is_null() {
+ *out_logical_rect = logical_rect;
+ }
+ })
+ .into_gerror(&session, error)
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn rsvg_handle_render_element(
+ handle: *const RsvgHandle,
+ cr: *mut cairo::ffi::cairo_t,
+ id: *const libc::c_char,
+ element_viewport: *const RsvgRectangle,
+ error: *mut *mut glib::ffi::GError,
+) -> glib::ffi::gboolean {
+ rsvg_return_val_if_fail! {
+ rsvg_handle_render_element => false.into_glib();
+
+ is_rsvg_handle(handle),
+ !cr.is_null(),
+ !element_viewport.is_null(),
+ error.is_null() || (*error).is_null(),
+ }
+
+ let rhandle = get_rust_handle(handle);
+ let session = rhandle.imp().session.clone();
+
+ let id: Option<String> = from_glib_none(id);
+
+ rhandle
+ .render_element(cr, id.as_deref(), &(*element_viewport).into())
+ .into_gerror(&session, error)
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn rsvg_handle_get_desc(handle: *const RsvgHandle) -> *mut libc::c_char {
+ rsvg_return_val_if_fail! {
+ rsvg_handle_get_desc => ptr::null_mut();
+
+ is_rsvg_handle(handle),
+ }
+
+ ptr::null_mut()
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn rsvg_handle_get_metadata(handle: *const RsvgHandle) -> *mut libc::c_char {
+ rsvg_return_val_if_fail! {
+ rsvg_handle_get_metadata => ptr::null_mut();
+
+ is_rsvg_handle(handle),
+ }
+
+ ptr::null_mut()
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn rsvg_handle_get_title(handle: *const RsvgHandle) -> *mut libc::c_char {
+ rsvg_return_val_if_fail! {
+ rsvg_handle_get_title => ptr::null_mut();
+
+ is_rsvg_handle(handle),
+ }
+
+ ptr::null_mut()
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn rsvg_init() {}
+
+#[no_mangle]
+pub unsafe extern "C" fn rsvg_term() {}
+
+#[no_mangle]
+pub unsafe extern "C" fn rsvg_cleanup() {}
+
+/// Detects whether a `*const libc::c_char` is a path or a URI
+///
+/// `rsvg_handle_new_from_file()` takes a `filename` argument, and advertises
+/// that it will detect either a file system path, or a proper URI. It will then use
+/// `gio::File::for_path()` or `gio::File::for_uri()` as appropriate.
+///
+/// This enum does the magic heuristics to figure this out.
+///
+/// The `from_os_str` version is for using the same logic on rsvg-convert's command-line
+/// arguments: we want `rsvg-convert http://example.com/foo.svg` to go to a URL, not to a
+/// local file with that name.
+#[derive(Clone, Debug)]
+pub enum PathOrUrl {
+ Path(PathBuf),
+ Url(Url),
+}
+
+impl PathOrUrl {
+ unsafe fn new(s: *const libc::c_char) -> Result<PathOrUrl, String> {
+ let cstr = CStr::from_ptr(s);
+
+ if cstr.to_bytes().is_empty() {
+ return Err("invalid empty filename".to_string());
+ }
+
+ Ok(cstr
+ .to_str()
+ .map_err(|_| ())
+ .and_then(Self::try_from_str)
+ .unwrap_or_else(|_| PathOrUrl::Path(PathBuf::from_glib_none(s))))
+ }
+
+ fn try_from_str(s: &str) -> Result<PathOrUrl, ()> {
+ assert!(!s.is_empty());
+
+ Url::parse(s).map_err(|_| ()).and_then(|url| {
+ if url.origin().is_tuple() || url.scheme() == "file" {
+ Ok(PathOrUrl::Url(url))
+ } else {
+ Ok(PathOrUrl::Path(url.to_file_path()?))
+ }
+ })
+ }
+
+ pub fn from_os_str(osstr: &OsStr) -> Result<PathOrUrl, String> {
+ if osstr.is_empty() {
+ return Err("invalid empty filename".to_string());
+ }
+
+ Ok(osstr
+ .to_str()
+ .ok_or(())
+ .and_then(Self::try_from_str)
+ .unwrap_or_else(|_| PathOrUrl::Path(PathBuf::from(osstr.to_os_string()))))
+ }
+
+ pub fn get_gfile(&self) -> gio::File {
+ match *self {
+ PathOrUrl::Path(ref p) => gio::File::for_path(p),
+ PathOrUrl::Url(ref u) => gio::File::for_uri(u.as_str()),
+ }
+ }
+}
+
+impl fmt::Display for PathOrUrl {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ match *self {
+ PathOrUrl::Path(ref p) => p.display().fmt(f),
+ PathOrUrl::Url(ref u) => u.fmt(f),
+ }
+ }
+}
+
+fn check_cairo_context(cr: *mut cairo::ffi::cairo_t) -> Result<cairo::Context, RenderingError> {
+ let status = unsafe { cairo::ffi::cairo_status(cr) };
+
+ if status == cairo::ffi::STATUS_SUCCESS {
+ Ok(unsafe { from_glib_none(cr) })
+ } else {
+ let status: cairo::Error = status.into();
+
+ let msg = format!("cannot render on a cairo_t with a failure status (status={status:?})");
+
+ rsvg_g_warning(&msg);
+
+ Err(RenderingError::from(status))
+ }
+}
+
+pub(crate) fn set_gerror(
+ session: &Session,
+ err: *mut *mut glib::ffi::GError,
+ code: u32,
+ msg: &str,
+) {
+ unsafe {
+ // this is RSVG_ERROR_FAILED, the only error code available in RsvgError
+ assert!(code == 0);
+
+ // Log this, in case the calling program passes a NULL GError, so we can at least
+ // diagnose things by asking for RSVG_LOG.
+ //
+ // See https://gitlab.gnome.org/GNOME/gtk/issues/2294 for an example of code that
+ // passed a NULL GError and so we had no easy way to see what was wrong.
+ rsvg_log!(session, "{}", msg);
+
+ glib::ffi::g_set_error_literal(
+ err,
+ rsvg_error_quark(),
+ code as libc::c_int,
+ msg.to_glib_none().0,
+ );
+ }
+}
+
+#[derive(Debug, Eq, PartialEq, Clone, Copy, glib::Enum)]
+#[repr(u32)]
+#[enum_type(name = "RsvgError")]
+enum Error {
+ #[enum_value(name = "RSVG_ERROR_FAILED", nick = "failed")]
+ // Keep in sync with rsvg.h:RsvgError
+ Failed = 0,
+}
+
+/// Used as a generic error to translate to glib::Error
+///
+/// This type implements `glib::error::ErrorDomain`, so it can be used
+/// to obtain the error code while calling `glib::Error::new()`. Unfortunately
+/// the public librsvg API does not have detailed error codes yet, so we use
+/// this single value as the only possible error code to return.
+#[derive(Copy, Clone)]
+struct RsvgError;
+
+impl ErrorDomain for RsvgError {
+ fn domain() -> glib::Quark {
+ glib::Quark::from_str("rsvg-error-quark")
+ }
+
+ fn code(self) -> i32 {
+ Error::Failed as i32
+ }
+
+ fn from(_code: i32) -> Option<Self> {
+ // We don't have enough information from glib error codes
+ Some(RsvgError)
+ }
+}
+
+#[no_mangle]
+pub extern "C" fn rsvg_error_quark() -> glib::ffi::GQuark {
+ RsvgError::domain().into_glib()
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn path_or_url_unix() {
+ unsafe {
+ match PathOrUrl::new(rsvg_c_str!("/foo/bar")).unwrap() {
+ PathOrUrl::Path(_) => (),
+ _ => panic!("unix filename should be a PathOrUrl::Path"),
+ }
+
+ match PathOrUrl::new(rsvg_c_str!("foo/bar")).unwrap() {
+ PathOrUrl::Path(_) => (),
+ _ => panic!("unix filename should be a PathOrUrl::Path"),
+ }
+ }
+ }
+
+ #[test]
+ fn path_or_url_windows() {
+ unsafe {
+ match PathOrUrl::new(rsvg_c_str!("c:/foo/bar")).unwrap() {
+ PathOrUrl::Path(_) => (),
+ _ => panic!("windows filename should be a PathOrUrl::Path"),
+ }
+
+ match PathOrUrl::new(rsvg_c_str!("C:/foo/bar")).unwrap() {
+ PathOrUrl::Path(_) => (),
+ _ => panic!("windows filename should be a PathOrUrl::Path"),
+ }
+
+ match PathOrUrl::new(rsvg_c_str!("c:\\foo\\bar")).unwrap() {
+ PathOrUrl::Path(_) => (),
+ _ => panic!("windows filename should be a PathOrUrl::Path"),
+ }
+
+ match PathOrUrl::new(rsvg_c_str!("C:\\foo\\bar")).unwrap() {
+ PathOrUrl::Path(_) => (),
+ _ => panic!("windows filename should be a PathOrUrl::Path"),
+ }
+ }
+ }
+
+ #[test]
+ fn path_or_url_unix_url() {
+ unsafe {
+ match PathOrUrl::new(rsvg_c_str!("file:///foo/bar")).unwrap() {
+ PathOrUrl::Url(_) => (),
+ _ => panic!("file:// unix filename should be a PathOrUrl::Url"),
+ }
+ }
+ }
+
+ #[test]
+ fn path_or_url_windows_url() {
+ unsafe {
+ match PathOrUrl::new(rsvg_c_str!("file://c:/foo/bar")).unwrap() {
+ PathOrUrl::Url(_) => (),
+ _ => panic!("file:// windows filename should be a PathOrUrl::Url"),
+ }
+
+ match PathOrUrl::new(rsvg_c_str!("file://C:/foo/bar")).unwrap() {
+ PathOrUrl::Url(_) => (),
+ _ => panic!("file:// windows filename should be a PathOrUrl::Url"),
+ }
+ }
+ }
+
+ #[test]
+ fn path_or_url_empty_str() {
+ unsafe {
+ assert!(PathOrUrl::new(rsvg_c_str!("")).is_err());
+ }
+
+ assert!(PathOrUrl::from_os_str(OsStr::new("")).is_err());
+ }
+
+ #[test]
+ fn base_url_works() {
+ let mut u = BaseUrl::default();
+
+ assert!(u.get().is_none());
+ assert_eq!(u.get_ptr(), ptr::null());
+
+ u.set(Url::parse("file:///example.txt").unwrap());
+
+ assert_eq!(u.get().unwrap().as_str(), "file:///example.txt");
+
+ unsafe {
+ let p = u.get_ptr();
+ let cstr = CStr::from_ptr(p);
+ assert_eq!(cstr.to_str().unwrap(), "file:///example.txt");
+ }
+ }
+}
diff --git a/rsvg/src/c_api/messages.rs b/rsvg/src/c_api/messages.rs
new file mode 100644
index 00000000..5b227cb8
--- /dev/null
+++ b/rsvg/src/c_api/messages.rs
@@ -0,0 +1,158 @@
+//! Logging functions, plus Rust versions of `g_return_if_fail()`.
+//!
+//! Glib's `g_return_if_fail()`, `g_warning()`, etc. are all C macros, so they cannot be
+//! used from Rust. This module defines equivalent functions or macros with an `rsvg_`
+//! prefix, to be clear that they should only be used from the implementation of the C API
+//! and not from the main Rust code of the library.
+
+use glib::ffi::{g_log_structured_array, GLogField, G_LOG_LEVEL_CRITICAL, G_LOG_LEVEL_WARNING};
+use glib::translate::*;
+
+/*
+ G_LOG_LEVEL_CRITICAL = 1 << 3,
+ G_LOG_LEVEL_WARNING = 1 << 4,
+
+#define g_critical(...) g_log_structured_standard (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, \
+ __FILE__, G_STRINGIFY (__LINE__), \
+ G_STRFUNC, __VA_ARGS__)
+#define g_warning(...) g_log_structured_standard (G_LOG_DOMAIN, G_LOG_LEVEL_WARNING, \
+ __FILE__, G_STRINGIFY (__LINE__), \
+ G_STRFUNC, __VA_ARGS__)
+ GLogField fields[] =
+ {
+ { "PRIORITY", log_level_to_priority (log_level), -1 },
+ { "CODE_FILE", file, -1 },
+ { "CODE_LINE", line, -1 },
+ { "CODE_FUNC", func, -1 },
+ /* Filled in later: */
+ { "MESSAGE", NULL, -1 },
+ /* If @log_domain is %NULL, we will not pass this field: */
+ { "GLIB_DOMAIN", log_domain, -1 },
+ };
+
+ g_log_structured_array (log_level, fields, n_fields);
+ */
+
+/// Helper function for converting string literals to C char pointers.
+#[macro_export]
+macro_rules! rsvg_c_str {
+ ($txt:expr) => {
+ // SAFETY: it's important that the type we pass to `from_bytes_with_nul` is 'static,
+ // so that the storage behind the returned pointer doesn't get freed while it's still
+ // being used. We get that by only allowing string literals.
+ std::ffi::CStr::from_bytes_with_nul(concat!($txt, "\0").as_bytes())
+ .unwrap()
+ .as_ptr()
+ };
+}
+
+/// Helper for `rsvg_g_warning` and `rsvg_g_critical`
+///
+/// This simulates what in C would be a call to the g_warning() or g_critical()
+/// macros, but with the underlying function g_log_structured_array().
+///
+/// If the implementation of g_warning() or g_critical() changes, we'll have
+/// to change this function.
+fn rsvg_g_log(level: glib::ffi::GLogLevelFlags, msg: &str) {
+ // stolen from gmessages.c:log_level_to_priority()
+ let priority = match level {
+ G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL => rsvg_c_str!("4"),
+ _ => unreachable!("please add another log level priority to rsvg_g_log()"),
+ };
+
+ let c_msg = msg.to_glib_none();
+ let c_char_msg: *const libc::c_char = c_msg.0;
+
+ // Glib's g_log_structured_standard() adds a few more fields for the source
+ // file, line number, etc., but those are not terribly useful without a stack
+ // trace. So, we'll omit them.
+ let fields = [
+ GLogField {
+ key: rsvg_c_str!("PRIORITY"),
+ value: priority as *const _,
+ length: -1,
+ },
+ GLogField {
+ key: rsvg_c_str!("MESSAGE"),
+ value: c_char_msg as *const _,
+ length: msg.len() as _,
+ },
+ // This is the G_LOG_DOMAIN set from the Makefile
+ GLogField {
+ key: rsvg_c_str!("GLIB_DOMAIN"),
+ value: rsvg_c_str!("librsvg") as *const _,
+ length: -1,
+ },
+ ];
+
+ unsafe {
+ g_log_structured_array(level, fields.as_ptr(), fields.len());
+ }
+}
+
+/// Replacement for `g_warning()`.
+///
+/// Use this to signal an error condition in the following situations:
+///
+/// * The C API does not have an adequate error code for the error in question (and cannot
+/// be changed to have one, for ABI compatibility reasons).
+///
+/// * Applications using the C API would be prone to ignoring an important error,
+/// so it's best to have a warning on the console to at least have a hope of someone
+/// noticing the error.
+pub(crate) fn rsvg_g_warning(msg: &str) {
+ rsvg_g_log(glib::ffi::G_LOG_LEVEL_WARNING, msg);
+}
+
+/// Replacement for `g_critical()`.
+///
+/// Use this to signal a programming error from the caller of the C API, like passing
+/// incorrect arguments or calling the API out of order. Rust code conventionally panics
+/// in such situations, but C/Glib code does not, so it's best to "do nothing", print a
+/// critical message, and return. Development versions of GNOME will crash the program
+/// if this happens; release versions will ignore the error.
+pub(crate) fn rsvg_g_critical(msg: &str) {
+ rsvg_g_log(glib::ffi::G_LOG_LEVEL_CRITICAL, msg);
+}
+
+/// Replacement for `g_return_if_fail()`.
+// Once Rust has a function! macro that gives us the current function name, we
+// can remove the $func_name argument.
+#[macro_export]
+macro_rules! rsvg_return_if_fail {
+ {
+ $func_name:ident;
+ $($condition:expr,)+
+ } => {
+ $(
+ if !$condition {
+ glib::ffi::g_return_if_fail_warning(
+ rsvg_c_str!("librsvg"),
+ rsvg_c_str!(stringify!($func_name)),
+ rsvg_c_str!(stringify!($condition)),
+ );
+ return;
+ }
+ )+
+ }
+}
+
+/// Replacement for `g_return_val_if_fail()`.
+#[macro_export]
+macro_rules! rsvg_return_val_if_fail {
+ {
+ $func_name:ident => $retval:expr;
+ $($condition:expr,)+
+ } => {
+ $(
+ if !$condition {
+ glib::ffi::g_return_if_fail_warning(
+ rsvg_c_str!("librsvg"),
+ rsvg_c_str!(stringify!($func_name)),
+ rsvg_c_str!(stringify!($condition)),
+ );
+ return $retval;
+ }
+ )+
+ }
+}
diff --git a/rsvg/src/c_api/mod.rs b/rsvg/src/c_api/mod.rs
new file mode 100644
index 00000000..febca033
--- /dev/null
+++ b/rsvg/src/c_api/mod.rs
@@ -0,0 +1,58 @@
+//! C API for librsvg, based on GObject.
+//!
+//! The main API is in the [`handle`] module. The other modules
+//! have utility functions and the legacy [pixbuf-based API][pixbuf_utils].
+
+#![allow(clippy::missing_safety_doc)]
+
+#[rustfmt::skip]
+pub use handle::{
+ rsvg_error_get_type,
+ rsvg_handle_close,
+ rsvg_handle_flags_get_type,
+ rsvg_handle_get_base_uri,
+ rsvg_handle_get_dimensions,
+ rsvg_handle_get_dimensions_sub,
+ rsvg_handle_get_geometry_for_element,
+ rsvg_handle_get_geometry_for_layer,
+ rsvg_handle_get_intrinsic_dimensions,
+ rsvg_handle_get_intrinsic_size_in_pixels,
+ rsvg_handle_get_pixbuf_sub,
+ rsvg_handle_get_position_sub,
+ rsvg_handle_has_sub,
+ rsvg_handle_internal_set_testing,
+ rsvg_handle_new_from_data,
+ rsvg_handle_new_from_file,
+ rsvg_handle_new_from_gfile_sync,
+ rsvg_handle_new_from_stream_sync,
+ rsvg_handle_new_with_flags,
+ rsvg_handle_read_stream_sync,
+ rsvg_handle_render_cairo_sub,
+ rsvg_handle_render_element,
+ rsvg_handle_render_document,
+ rsvg_handle_render_layer,
+ rsvg_handle_set_base_gfile,
+ rsvg_handle_set_base_uri,
+ rsvg_handle_set_dpi_x_y,
+ rsvg_handle_set_size_callback,
+ rsvg_handle_write,
+};
+
+pub use dpi::{rsvg_set_default_dpi, rsvg_set_default_dpi_x_y};
+
+#[rustfmt::skip]
+pub use pixbuf_utils::{
+ rsvg_pixbuf_from_file,
+ rsvg_pixbuf_from_file_at_max_size,
+ rsvg_pixbuf_from_file_at_size,
+ rsvg_pixbuf_from_file_at_zoom,
+ rsvg_pixbuf_from_file_at_zoom_with_max,
+};
+
+#[macro_use]
+mod messages;
+
+mod dpi;
+pub mod handle;
+pub mod pixbuf_utils;
+pub mod sizing;
diff --git a/rsvg/src/c_api/pixbuf_utils.rs b/rsvg/src/c_api/pixbuf_utils.rs
new file mode 100644
index 00000000..710f2c4b
--- /dev/null
+++ b/rsvg/src/c_api/pixbuf_utils.rs
@@ -0,0 +1,330 @@
+//! Legacy C API for functions that render directly to a `GdkPixbuf`.
+//!
+//! This is the implementation of the `rsvg_pixbuf_*` family of functions.
+
+use std::path::PathBuf;
+use std::ptr;
+
+use gdk_pixbuf::{Colorspace, Pixbuf};
+use glib::translate::*;
+
+use super::dpi::Dpi;
+use super::handle::{checked_i32, set_gerror};
+use super::sizing::LegacySize;
+
+use crate::api::{CairoRenderer, Loader};
+use crate::error::RenderingError;
+use crate::session::Session;
+use crate::surface_utils::shared_surface::{SharedImageSurface, SurfaceType};
+
+pub fn empty_pixbuf() -> Result<Pixbuf, RenderingError> {
+ // GdkPixbuf does not allow zero-sized pixbufs, but Cairo allows zero-sized
+ // surfaces. In this case, return a 1-pixel transparent pixbuf.
+
+ let pixbuf = Pixbuf::new(Colorspace::Rgb, true, 8, 1, 1)
+ .ok_or_else(|| RenderingError::OutOfMemory(String::from("creating a Pixbuf")))?;
+ pixbuf.put_pixel(0, 0, 0, 0, 0, 0);
+
+ Ok(pixbuf)
+}
+
+pub fn pixbuf_from_surface(surface: &SharedImageSurface) -> Result<Pixbuf, RenderingError> {
+ surface
+ .to_pixbuf()
+ .ok_or_else(|| RenderingError::OutOfMemory(String::from("creating a Pixbuf")))
+}
+
+enum SizeKind {
+ Zoom,
+ WidthHeight,
+ WidthHeightMax,
+ ZoomMax,
+}
+
+struct SizeMode {
+ kind: SizeKind,
+ x_zoom: f64,
+ y_zoom: f64,
+ width: i32,
+ height: i32,
+}
+
+fn get_final_size(in_width: f64, in_height: f64, size_mode: &SizeMode) -> (f64, f64) {
+ if in_width == 0.0 || in_height == 0.0 {
+ return (0.0, 0.0);
+ }
+
+ let mut out_width;
+ let mut out_height;
+
+ match size_mode.kind {
+ SizeKind::Zoom => {
+ out_width = size_mode.x_zoom * in_width;
+ out_height = size_mode.y_zoom * in_height;
+ }
+
+ SizeKind::ZoomMax => {
+ out_width = size_mode.x_zoom * in_width;
+ out_height = size_mode.y_zoom * in_height;
+
+ if out_width > f64::from(size_mode.width) || out_height > f64::from(size_mode.height) {
+ let zoom_x = f64::from(size_mode.width) / out_width;
+ let zoom_y = f64::from(size_mode.height) / out_height;
+ let zoom = zoom_x.min(zoom_y);
+
+ out_width *= zoom;
+ out_height *= zoom;
+ }
+ }
+
+ SizeKind::WidthHeightMax => {
+ let zoom_x = f64::from(size_mode.width) / in_width;
+ let zoom_y = f64::from(size_mode.height) / in_height;
+
+ let zoom = zoom_x.min(zoom_y);
+
+ out_width = zoom * in_width;
+ out_height = zoom * in_height;
+ }
+
+ SizeKind::WidthHeight => {
+ if size_mode.width != -1 {
+ out_width = f64::from(size_mode.width);
+ } else {
+ out_width = in_width;
+ }
+
+ if size_mode.height != -1 {
+ out_height = f64::from(size_mode.height);
+ } else {
+ out_height = in_height;
+ }
+ }
+ }
+
+ (out_width, out_height)
+}
+
+pub fn render_to_pixbuf_at_size(
+ renderer: &CairoRenderer<'_>,
+ document_width: f64,
+ document_height: f64,
+ desired_width: f64,
+ desired_height: f64,
+) -> Result<Pixbuf, RenderingError> {
+ if desired_width == 0.0
+ || desired_height == 0.0
+ || document_width == 0.0
+ || document_height == 0.0
+ {
+ return empty_pixbuf();
+ }
+
+ let surface = cairo::ImageSurface::create(
+ cairo::Format::ARgb32,
+ checked_i32(desired_width.ceil())?,
+ checked_i32(desired_height.ceil())?,
+ )?;
+
+ {
+ let cr = cairo::Context::new(&surface)?;
+ cr.scale(
+ desired_width / document_width,
+ desired_height / document_height,
+ );
+
+ let viewport = cairo::Rectangle::new(0.0, 0.0, document_width, document_height);
+
+ // We do it with a cr transform so we can scale non-proportionally.
+ renderer.render_document(&cr, &viewport)?;
+ }
+
+ let shared_surface = SharedImageSurface::wrap(surface, SurfaceType::SRgb)?;
+
+ pixbuf_from_surface(&shared_surface)
+}
+
+unsafe fn pixbuf_from_file_with_size_mode(
+ filename: *const libc::c_char,
+ size_mode: &SizeMode,
+ error: *mut *mut glib::ffi::GError,
+) -> *mut gdk_pixbuf::ffi::GdkPixbuf {
+ let path = PathBuf::from_glib_none(filename);
+
+ let session = Session::default();
+
+ let handle = match Loader::new_with_session(session.clone()).read_path(path) {
+ Ok(handle) => handle,
+ Err(e) => {
+ set_gerror(&session, error, 0, &format!("{e}"));
+ return ptr::null_mut();
+ }
+ };
+
+ let dpi = Dpi::default();
+ let renderer = CairoRenderer::new(&handle).with_dpi(dpi.x(), dpi.y());
+
+ let (document_width, document_height) = match renderer.legacy_document_size() {
+ Ok(dim) => dim,
+ Err(e) => {
+ set_gerror(&session, error, 0, &format!("{e}"));
+ return ptr::null_mut();
+ }
+ };
+
+ let (desired_width, desired_height) =
+ get_final_size(document_width, document_height, size_mode);
+
+ render_to_pixbuf_at_size(
+ &renderer,
+ document_width,
+ document_height,
+ desired_width,
+ desired_height,
+ )
+ .map(|pixbuf| pixbuf.to_glib_full())
+ .unwrap_or_else(|e| {
+ set_gerror(&session, error, 0, &format!("{e}"));
+ ptr::null_mut()
+ })
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn rsvg_pixbuf_from_file(
+ filename: *const libc::c_char,
+ error: *mut *mut glib::ffi::GError,
+) -> *mut gdk_pixbuf::ffi::GdkPixbuf {
+ rsvg_return_val_if_fail! {
+ rsvg_pixbuf_from_file => ptr::null_mut();
+
+ !filename.is_null(),
+ error.is_null() || (*error).is_null(),
+ }
+
+ pixbuf_from_file_with_size_mode(
+ filename,
+ &SizeMode {
+ kind: SizeKind::WidthHeight,
+ x_zoom: 0.0,
+ y_zoom: 0.0,
+ width: -1,
+ height: -1,
+ },
+ error,
+ )
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn rsvg_pixbuf_from_file_at_size(
+ filename: *const libc::c_char,
+ width: libc::c_int,
+ height: libc::c_int,
+ error: *mut *mut glib::ffi::GError,
+) -> *mut gdk_pixbuf::ffi::GdkPixbuf {
+ rsvg_return_val_if_fail! {
+ rsvg_pixbuf_from_file_at_size => ptr::null_mut();
+
+ !filename.is_null(),
+ (width >= 1 && height >= 1) || (width == -1 && height == -1),
+ error.is_null() || (*error).is_null(),
+ }
+
+ pixbuf_from_file_with_size_mode(
+ filename,
+ &SizeMode {
+ kind: SizeKind::WidthHeight,
+ x_zoom: 0.0,
+ y_zoom: 0.0,
+ width,
+ height,
+ },
+ error,
+ )
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn rsvg_pixbuf_from_file_at_zoom(
+ filename: *const libc::c_char,
+ x_zoom: libc::c_double,
+ y_zoom: libc::c_double,
+ error: *mut *mut glib::ffi::GError,
+) -> *mut gdk_pixbuf::ffi::GdkPixbuf {
+ rsvg_return_val_if_fail! {
+ rsvg_pixbuf_from_file_at_zoom => ptr::null_mut();
+
+ !filename.is_null(),
+ x_zoom > 0.0 && y_zoom > 0.0,
+ error.is_null() || (*error).is_null(),
+ }
+
+ pixbuf_from_file_with_size_mode(
+ filename,
+ &SizeMode {
+ kind: SizeKind::Zoom,
+ x_zoom,
+ y_zoom,
+ width: 0,
+ height: 0,
+ },
+ error,
+ )
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn rsvg_pixbuf_from_file_at_zoom_with_max(
+ filename: *const libc::c_char,
+ x_zoom: libc::c_double,
+ y_zoom: libc::c_double,
+ max_width: libc::c_int,
+ max_height: libc::c_int,
+ error: *mut *mut glib::ffi::GError,
+) -> *mut gdk_pixbuf::ffi::GdkPixbuf {
+ rsvg_return_val_if_fail! {
+ rsvg_pixbuf_from_file_at_zoom_with_max => ptr::null_mut();
+
+ !filename.is_null(),
+ x_zoom > 0.0 && y_zoom > 0.0,
+ max_width >= 1 && max_height >= 1,
+ error.is_null() || (*error).is_null(),
+ }
+
+ pixbuf_from_file_with_size_mode(
+ filename,
+ &SizeMode {
+ kind: SizeKind::ZoomMax,
+ x_zoom,
+ y_zoom,
+ width: max_width,
+ height: max_height,
+ },
+ error,
+ )
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn rsvg_pixbuf_from_file_at_max_size(
+ filename: *const libc::c_char,
+ max_width: libc::c_int,
+ max_height: libc::c_int,
+ error: *mut *mut glib::ffi::GError,
+) -> *mut gdk_pixbuf::ffi::GdkPixbuf {
+ rsvg_return_val_if_fail! {
+ rsvg_pixbuf_from_file_at_max_size => ptr::null_mut();
+
+ !filename.is_null(),
+ max_width >= 1 && max_height >= 1,
+ error.is_null() || (*error).is_null(),
+ }
+
+ pixbuf_from_file_with_size_mode(
+ filename,
+ &SizeMode {
+ kind: SizeKind::WidthHeightMax,
+ x_zoom: 0.0,
+ y_zoom: 0.0,
+ width: max_width,
+ height: max_height,
+ },
+ error,
+ )
+}
diff --git a/rsvg/src/c_api/sizing.rs b/rsvg/src/c_api/sizing.rs
new file mode 100644
index 00000000..e0c85bd1
--- /dev/null
+++ b/rsvg/src/c_api/sizing.rs
@@ -0,0 +1,116 @@
+//! Compute an SVG document's size with the legacy logic.
+//!
+//! See the documentation for [`LegacySize`]. The legacy C API functions like
+//! `rsvg_handle_render_cairo()` do not take a viewport argument: they do not know how big
+//! the caller would like to render the document; instead they compute a "natural size"
+//! for the document based on its `width`/`height`/`viewBox` and some heuristics for when
+//! they are missing.
+//!
+//! The new style C functions like `rsvg_handle_render_document()` actually take a
+//! viewport, which indicates how big the result should be. This matches the expectations
+//! of the web platform, which assumes that all embedded content goes into a viewport.
+
+use float_cmp::approx_eq;
+
+use crate::api::{CairoRenderer, IntrinsicDimensions, RenderingError};
+use crate::dpi::Dpi;
+use crate::handle::Handle;
+use crate::length::*;
+
+use super::handle::CairoRectangleExt;
+
+/// Extension methods to compute the SVG's size suitable for the legacy C API.
+///
+/// The legacy C API can compute an SVG document's size from the
+/// `width`, `height`, and `viewBox` attributes of the toplevel `<svg>`
+/// element. If these are not available, then the size must be computed
+/// by actually measuring the geometries of elements in the document.
+///
+/// See <https://www.w3.org/TR/css-images-3/#sizing-terms> for terminology and logic.
+pub trait LegacySize {
+ fn legacy_document_size(&self) -> Result<(f64, f64), RenderingError> {
+ let (ink_r, _) = self.legacy_layer_geometry(None)?;
+ Ok((ink_r.width(), ink_r.height()))
+ }
+
+ fn legacy_layer_geometry(
+ &self,
+ id: Option<&str>,
+ ) -> Result<(cairo::Rectangle, cairo::Rectangle), RenderingError>;
+}
+
+impl<'a> LegacySize for CairoRenderer<'a> {
+ fn legacy_layer_geometry(
+ &self,
+ id: Option<&str>,
+ ) -> Result<(cairo::Rectangle, cairo::Rectangle), RenderingError> {
+ match id {
+ Some(id) => Ok(self.geometry_for_layer(Some(id), &unit_rectangle())?),
+
+ None => {
+ let size_from_intrinsic_dimensions =
+ self.intrinsic_size_in_pixels().or_else(|| {
+ size_in_pixels_from_percentage_width_and_height(
+ &self.handle.handle,
+ &self.intrinsic_dimensions(),
+ self.dpi,
+ )
+ });
+
+ if let Some((w, h)) = size_from_intrinsic_dimensions {
+ // We have a size directly computed from the <svg> attributes
+ let rect = cairo::Rectangle::from_size(w, h);
+ Ok((rect, rect))
+ } else {
+ self.geometry_for_layer(None, &unit_rectangle())
+ }
+ }
+ }
+ }
+}
+
+fn unit_rectangle() -> cairo::Rectangle {
+ cairo::Rectangle::from_size(1.0, 1.0)
+}
+
+/// If the width and height are in percentage units, computes a size equal to the
+/// `viewBox`'s aspect ratio if it exists, or else returns None.
+///
+/// For example, a `viewBox="0 0 100 200"` will yield `Some(100.0, 200.0)`.
+///
+/// Note that this only checks that the width and height are in percentage units, but
+/// it actually ignores their values. This is because at the point this function is
+/// called, there is no viewport to embed the SVG document in, so those percentage
+/// units cannot be resolved against anything in particular. The idea is to return
+/// some dimensions with the correct aspect ratio.
+fn size_in_pixels_from_percentage_width_and_height(
+ handle: &Handle,
+ dim: &IntrinsicDimensions,
+ dpi: Dpi,
+) -> Option<(f64, f64)> {
+ let IntrinsicDimensions {
+ width,
+ height,
+ vbox,
+ } = *dim;
+
+ use LengthUnit::*;
+
+ // Unwrap or return None if we don't know the aspect ratio -> Let the caller handle it.
+ let vbox = vbox?;
+
+ let (w, h) = handle.width_height_to_user(dpi);
+
+ // Avoid division by zero below. If the viewBox is zero-sized, there's
+ // not much we can do.
+ if approx_eq!(f64, vbox.width(), 0.0) || approx_eq!(f64, vbox.height(), 0.0) {
+ return Some((0.0, 0.0));
+ }
+
+ match (width.unit, height.unit) {
+ (Percent, Percent) => Some((vbox.width(), vbox.height())),
+ (_, Percent) => Some((w, w * vbox.height() / vbox.width())),
+ (Percent, _) => Some((h * vbox.width() / vbox.height(), h)),
+ (_, _) => unreachable!("should have been called with percentage units"),
+ }
+}
diff --git a/rsvg/src/color.rs b/rsvg/src/color.rs
new file mode 100644
index 00000000..b83b76f4
--- /dev/null
+++ b/rsvg/src/color.rs
@@ -0,0 +1,27 @@
+//! CSS color values.
+
+use cssparser::Parser;
+
+use crate::error::*;
+use crate::parsers::Parse;
+
+pub use cssparser::Color;
+
+impl Parse for cssparser::Color {
+ fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<cssparser::Color, ParseError<'i>> {
+ Ok(cssparser::Color::parse(parser)?)
+ }
+}
+
+impl Parse for cssparser::RGBA {
+ fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<cssparser::RGBA, ParseError<'i>> {
+ let loc = parser.current_source_location();
+
+ match cssparser::Color::parse(parser)? {
+ cssparser::Color::RGBA(rgba) => Ok(rgba),
+ cssparser::Color::CurrentColor => Err(loc.new_custom_error(ValueErrorKind::Value(
+ "currentColor is not allowed here".to_string(),
+ ))),
+ }
+ }
+}
diff --git a/rsvg/src/cond.rs b/rsvg/src/cond.rs
new file mode 100644
index 00000000..57e4817c
--- /dev/null
+++ b/rsvg/src/cond.rs
@@ -0,0 +1,243 @@
+//! Conditional processing attributes: `requiredExtensions`, `requiredFeatures`, `systemLanguage`.
+
+#[allow(unused_imports, deprecated)]
+use std::ascii::AsciiExt;
+
+use std::str::FromStr;
+
+use language_tags::LanguageTag;
+
+use crate::accept_language::{LanguageTags, UserLanguage};
+use crate::error::*;
+use crate::session::Session;
+
+// No extensions at the moment.
+static IMPLEMENTED_EXTENSIONS: &[&str] = &[];
+
+#[derive(Debug, PartialEq)]
+pub struct RequiredExtensions(pub bool);
+
+impl RequiredExtensions {
+ /// Parse a requiredExtensions attribute.
+ ///
+ /// <http://www.w3.org/TR/SVG/struct.html#RequiredExtensionsAttribute>
+ pub fn from_attribute(s: &str) -> RequiredExtensions {
+ RequiredExtensions(
+ s.split_whitespace()
+ .all(|f| IMPLEMENTED_EXTENSIONS.binary_search(&f).is_ok()),
+ )
+ }
+
+ /// Evaluate a requiredExtensions value for conditional processing.
+ pub fn eval(&self) -> bool {
+ self.0
+ }
+}
+
+// Keep these sorted alphabetically for binary_search.
+static IMPLEMENTED_FEATURES: &[&str] = &[
+ "http://www.w3.org/TR/SVG11/feature#BasicFilter",
+ "http://www.w3.org/TR/SVG11/feature#BasicGraphicsAttribute",
+ "http://www.w3.org/TR/SVG11/feature#BasicPaintAttribute",
+ "http://www.w3.org/TR/SVG11/feature#BasicStructure",
+ "http://www.w3.org/TR/SVG11/feature#BasicText",
+ "http://www.w3.org/TR/SVG11/feature#ConditionalProcessing",
+ "http://www.w3.org/TR/SVG11/feature#ContainerAttribute",
+ "http://www.w3.org/TR/SVG11/feature#Filter",
+ "http://www.w3.org/TR/SVG11/feature#Gradient",
+ "http://www.w3.org/TR/SVG11/feature#Image",
+ "http://www.w3.org/TR/SVG11/feature#Marker",
+ "http://www.w3.org/TR/SVG11/feature#Mask",
+ "http://www.w3.org/TR/SVG11/feature#OpacityAttribute",
+ "http://www.w3.org/TR/SVG11/feature#Pattern",
+ "http://www.w3.org/TR/SVG11/feature#SVG",
+ "http://www.w3.org/TR/SVG11/feature#SVG-static",
+ "http://www.w3.org/TR/SVG11/feature#Shape",
+ "http://www.w3.org/TR/SVG11/feature#Structure",
+ "http://www.w3.org/TR/SVG11/feature#Style",
+ "http://www.w3.org/TR/SVG11/feature#View",
+ "org.w3c.svg.static", // deprecated SVG 1.0 feature string
+];
+
+#[derive(Debug, PartialEq)]
+pub struct RequiredFeatures(pub bool);
+
+impl RequiredFeatures {
+ // Parse a requiredFeatures attribute
+ // http://www.w3.org/TR/SVG/struct.html#RequiredFeaturesAttribute
+ pub fn from_attribute(s: &str) -> RequiredFeatures {
+ RequiredFeatures(
+ s.split_whitespace()
+ .all(|f| IMPLEMENTED_FEATURES.binary_search(&f).is_ok()),
+ )
+ }
+
+ /// Evaluate a requiredFeatures value for conditional processing.
+ pub fn eval(&self) -> bool {
+ self.0
+ }
+}
+
+/// The systemLanguage attribute inside `<cond>` element's children.
+///
+/// Parsing the value of a `systemLanguage` attribute may fail if the document supplies
+/// invalid BCP47 language tags. In that case, we store an `Invalid` variant.
+///
+/// That variant is used later, during [`SystemLanguage::eval`], to see whether the
+/// `<cond>` should match or not.
+#[derive(Debug, PartialEq)]
+pub enum SystemLanguage {
+ Valid(LanguageTags),
+ Invalid,
+}
+
+impl SystemLanguage {
+ /// Parse a `systemLanguage` attribute and match it against a given `Locale`
+ ///
+ /// The [`systemLanguage`] conditional attribute is a
+ /// comma-separated list of [BCP47] Language Tags. This function
+ /// parses the attribute and matches the result against a given
+ /// `locale`. If there is a match, i.e. if the given locale
+ /// supports one of the languages listed in the `systemLanguage`
+ /// attribute, then the `SystemLanguage.0` will be `true`;
+ /// otherwise it will be `false`.
+ ///
+ /// Normally, calling code will pass `&Locale::current()` for the
+ /// `locale` attribute; this is the user's current locale.
+ ///
+ /// [`systemLanguage`]: https://www.w3.org/TR/SVG/struct.html#ConditionalProcessingSystemLanguageAttribute
+ /// [BCP47]: http://www.ietf.org/rfc/bcp/bcp47.txt
+ pub fn from_attribute(s: &str, session: &Session) -> SystemLanguage {
+ let attribute_tags = s
+ .split(',')
+ .map(str::trim)
+ .map(|s| {
+ LanguageTag::from_str(s).map_err(|e| {
+ ValueErrorKind::parse_error(&format!("invalid language tag \"{s}\": {e}"))
+ })
+ })
+ .collect::<Result<Vec<LanguageTag>, _>>();
+
+ match attribute_tags {
+ Ok(tags) => SystemLanguage::Valid(LanguageTags::from(tags)),
+
+ Err(e) => {
+ rsvg_log!(
+ session,
+ "ignoring systemLanguage attribute with invalid value: {}",
+ e
+ );
+ SystemLanguage::Invalid
+ }
+ }
+ }
+
+ /// Evaluate a systemLanguage value for conditional processing.
+ pub fn eval(&self, user_language: &UserLanguage) -> bool {
+ match *self {
+ SystemLanguage::Valid(ref tags) => user_language.any_matches(tags),
+ SystemLanguage::Invalid => false,
+ }
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+ use locale_config::Locale;
+
+ #[test]
+ fn required_extensions() {
+ assert_eq!(
+ RequiredExtensions::from_attribute("http://test.org/NotExisting/1.0"),
+ RequiredExtensions(false)
+ );
+ }
+
+ #[test]
+ fn required_features() {
+ assert_eq!(
+ RequiredFeatures::from_attribute("http://www.w3.org/TR/SVG11/feature#NotExisting"),
+ RequiredFeatures(false)
+ );
+
+ assert_eq!(
+ RequiredFeatures::from_attribute("http://www.w3.org/TR/SVG11/feature#BasicFilter"),
+ RequiredFeatures(true)
+ );
+
+ assert_eq!(
+ RequiredFeatures::from_attribute(
+ "http://www.w3.org/TR/SVG11/feature#BasicFilter \
+ http://www.w3.org/TR/SVG11/feature#NotExisting",
+ ),
+ RequiredFeatures(false)
+ );
+
+ assert_eq!(
+ RequiredFeatures::from_attribute(
+ "http://www.w3.org/TR/SVG11/feature#BasicFilter \
+ http://www.w3.org/TR/SVG11/feature#BasicText",
+ ),
+ RequiredFeatures(true)
+ );
+ }
+
+ #[test]
+ fn system_language() {
+ let session = Session::new_for_test_suite();
+
+ let locale = Locale::new("de,en-US").unwrap();
+ let user_language = UserLanguage::LanguageTags(LanguageTags::from_locale(&locale).unwrap());
+
+ assert!(matches!(
+ SystemLanguage::from_attribute("", &session),
+ SystemLanguage::Invalid
+ ));
+
+ assert!(matches!(
+ SystemLanguage::from_attribute("12345", &session),
+ SystemLanguage::Invalid
+ ));
+
+ assert_eq!(
+ SystemLanguage::from_attribute("fr", &session).eval(&user_language),
+ false
+ );
+
+ assert_eq!(
+ SystemLanguage::from_attribute("en", &session).eval(&user_language),
+ false
+ );
+
+ assert_eq!(
+ SystemLanguage::from_attribute("de", &session).eval(&user_language),
+ true
+ );
+
+ assert_eq!(
+ SystemLanguage::from_attribute("en-US", &session).eval(&user_language),
+ true
+ );
+
+ assert_eq!(
+ SystemLanguage::from_attribute("en-GB", &session).eval(&user_language),
+ false
+ );
+
+ assert_eq!(
+ SystemLanguage::from_attribute("DE", &session).eval(&user_language),
+ true
+ );
+
+ assert_eq!(
+ SystemLanguage::from_attribute("de-LU", &session).eval(&user_language),
+ true
+ );
+
+ assert_eq!(
+ SystemLanguage::from_attribute("fr, de", &session).eval(&user_language),
+ true
+ );
+ }
+}
diff --git a/rsvg/src/coord_units.rs b/rsvg/src/coord_units.rs
new file mode 100644
index 00000000..b7d1a1c8
--- /dev/null
+++ b/rsvg/src/coord_units.rs
@@ -0,0 +1,99 @@
+//! `userSpaceOnUse` or `objectBoundingBox` values.
+
+use cssparser::Parser;
+
+use crate::error::*;
+use crate::parsers::Parse;
+
+/// Defines the units to be used for things that can consider a
+/// coordinate system in terms of the current transformation, or in
+/// terms of the current object's bounding box.
+#[derive(Debug, Copy, Clone, PartialEq, Eq)]
+pub enum CoordUnits {
+ UserSpaceOnUse,
+ ObjectBoundingBox,
+}
+
+impl Parse for CoordUnits {
+ fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<Self, ParseError<'i>> {
+ Ok(parse_identifiers!(
+ parser,
+ "userSpaceOnUse" => CoordUnits::UserSpaceOnUse,
+ "objectBoundingBox" => CoordUnits::ObjectBoundingBox,
+ )?)
+ }
+}
+
+/// Creates a newtype around `CoordUnits`, with a default value.
+///
+/// SVG attributes that can take `userSpaceOnUse` or
+/// `objectBoundingBox` values often have different default values
+/// depending on the type of SVG element. We use this macro to create
+/// a newtype for each SVG element and attribute that requires values
+/// of this type. The newtype provides an `impl Default` with the
+/// specified `$default` value.
+#[macro_export]
+macro_rules! coord_units {
+ ($name:ident, $default:expr) => {
+ #[derive(Debug, Copy, Clone, PartialEq, Eq)]
+ pub struct $name(pub CoordUnits);
+
+ impl Default for $name {
+ fn default() -> Self {
+ $name($default)
+ }
+ }
+
+ impl From<$name> for CoordUnits {
+ fn from(u: $name) -> Self {
+ u.0
+ }
+ }
+
+ impl $crate::parsers::Parse for $name {
+ fn parse<'i>(
+ parser: &mut ::cssparser::Parser<'i, '_>,
+ ) -> Result<Self, $crate::error::ParseError<'i>> {
+ Ok($name($crate::coord_units::CoordUnits::parse(parser)?))
+ }
+ }
+ };
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ coord_units!(MyUnits, CoordUnits::ObjectBoundingBox);
+
+ #[test]
+ fn parsing_invalid_strings_yields_error() {
+ assert!(MyUnits::parse_str("").is_err());
+ assert!(MyUnits::parse_str("foo").is_err());
+ }
+
+ #[test]
+ fn parses_paint_server_units() {
+ assert_eq!(
+ MyUnits::parse_str("userSpaceOnUse").unwrap(),
+ MyUnits(CoordUnits::UserSpaceOnUse)
+ );
+ assert_eq!(
+ MyUnits::parse_str("objectBoundingBox").unwrap(),
+ MyUnits(CoordUnits::ObjectBoundingBox)
+ );
+ }
+
+ #[test]
+ fn has_correct_default() {
+ assert_eq!(MyUnits::default(), MyUnits(CoordUnits::ObjectBoundingBox));
+ }
+
+ #[test]
+ fn converts_to_coord_units() {
+ assert_eq!(
+ CoordUnits::from(MyUnits(CoordUnits::ObjectBoundingBox)),
+ CoordUnits::ObjectBoundingBox
+ );
+ }
+}
diff --git a/rsvg/src/css.rs b/rsvg/src/css.rs
new file mode 100644
index 00000000..bf81dddf
--- /dev/null
+++ b/rsvg/src/css.rs
@@ -0,0 +1,1110 @@
+//! Representation of CSS types, and the CSS parsing and matching engine.
+//!
+//! # Terminology
+//!
+//! Consider a CSS **stylesheet** like this:
+//!
+//! ```css
+//! @import url("another.css");
+//!
+//! foo, .bar {
+//! fill: red;
+//! stroke: green;
+//! }
+//!
+//! #baz { stroke-width: 42; }
+//! ```
+//! The example contains three **rules**, the first one is an **at-rule*,
+//! the other two are **qualified rules**.
+//!
+//! Each rule is made of two parts, a **prelude** and an optional **block**
+//! The prelude is the part until the first `{` or until `;`, depending on
+//! whether a block is present. The block is the part between curly braces.
+//!
+//! Let's look at each rule:
+//!
+//! `@import` is an **at-rule**. This rule has a prelude, but no block.
+//! There are other at-rules like `@media` and some of them may have a block,
+//! but librsvg doesn't support those yet.
+//!
+//! The prelude of the following rule is `foo, .bar`.
+//! It is a **selector list** with two **selectors**, one for
+//! `foo` elements and one for elements that have the `bar` class.
+//!
+//! The content of the block between `{}` for a qualified rule is a
+//! **declaration list**. The block of the first qualified rule contains two
+//! **declarations**, one for the `fill` **property** and one for the
+//! `stroke` property.
+//!
+//! After the first qualified rule, we have a second qualified rule with
+//! a single selector for the `#baz` id, with a single declaration for the
+//! `stroke-width` property.
+//!
+//! # Helper crates we use
+//!
+//! * `cssparser` crate as a CSS tokenizer, and some utilities to
+//! parse CSS rules and declarations.
+//!
+//! * `selectors` crate for the representation of selectors and
+//! selector lists, and for the matching engine.
+//!
+//! Both crates provide very generic implementations of their concepts,
+//! and expect the caller to provide implementations of various traits,
+//! and to provide types that represent certain things.
+//!
+//! For example, `cssparser` expects one to provide representations of
+//! the following types:
+//!
+//! * A parsed CSS rule. For `fill: blue;` we have
+//! `ParsedProperty::Fill(...)`.
+//!
+//! * A parsed selector list; we use `SelectorList` from the
+//! `selectors` crate.
+//!
+//! In turn, the `selectors` crate needs a way to navigate and examine
+//! one's implementation of an element tree. We provide `impl
+//! selectors::Element for RsvgElement` for this. This implementation
+//! has methods like "does this element have the id `#foo`", or "give
+//! me the next sibling element".
+//!
+//! Finally, the matching engine ties all of this together with
+//! `matches_selector()`. This takes an opaque representation of an
+//! element, plus a selector, and returns a bool. We iterate through
+//! the rules in the stylesheets and gather the matches; then sort the
+//! matches by specificity and apply the result to each element.
+
+use cssparser::{
+ self, match_ignore_ascii_case, parse_important, AtRuleParser, BasicParseErrorKind, CowRcStr,
+ DeclarationListParser, DeclarationParser, Parser, ParserInput, ParserState,
+ QualifiedRuleParser, RuleListParser, SourceLocation, ToCss, _cssparser_internal_to_lowercase,
+};
+use data_url::mime::Mime;
+use language_tags::LanguageTag;
+use markup5ever::{self, namespace_url, ns, Namespace, QualName};
+use selectors::attr::{AttrSelectorOperation, CaseSensitivity, NamespaceConstraint};
+use selectors::matching::{ElementSelectorFlags, MatchingContext, MatchingMode, QuirksMode};
+use selectors::{OpaqueElement, SelectorImpl, SelectorList};
+use std::cmp::Ordering;
+use std::fmt;
+use std::str;
+use std::str::FromStr;
+
+use crate::error::*;
+use crate::io::{self, BinaryData};
+use crate::node::{Node, NodeBorrow, NodeCascade};
+use crate::properties::{parse_value, ComputedValues, ParseAs, ParsedProperty};
+use crate::session::Session;
+use crate::url_resolver::{AllowedUrl, UrlResolver};
+
+/// A parsed CSS declaration
+///
+/// For example, in the declaration `fill: green !important`, the
+/// `prop_name` would be `fill`, the `property` would be
+/// `ParsedProperty::Fill(...)` with the green value, and `important`
+/// would be `true`.
+pub struct Declaration {
+ pub prop_name: QualName,
+ pub property: ParsedProperty,
+ pub important: bool,
+}
+
+/// Dummy struct required to use `cssparser::DeclarationListParser`
+///
+/// It implements `cssparser::DeclarationParser`, which knows how to parse
+/// the property/value pairs from a CSS declaration.
+pub struct DeclParser;
+
+impl<'i> DeclarationParser<'i> for DeclParser {
+ type Declaration = Declaration;
+ type Error = ValueErrorKind;
+
+ /// Parses a CSS declaration like `name: input_value [!important]`
+ fn parse_value<'t>(
+ &mut self,
+ name: CowRcStr<'i>,
+ input: &mut Parser<'i, 't>,
+ ) -> Result<Declaration, ParseError<'i>> {
+ let prop_name = QualName::new(None, ns!(), markup5ever::LocalName::from(name.as_ref()));
+ let property = parse_value(&prop_name, input, ParseAs::Property)?;
+
+ let important = input.try_parse(parse_important).is_ok();
+
+ Ok(Declaration {
+ prop_name,
+ property,
+ important,
+ })
+ }
+}
+
+// cssparser's DeclarationListParser requires this; we just use the dummy
+// implementations from cssparser itself. We may want to provide a real
+// implementation in the future, although this may require keeping track of the
+// CSS parsing state like Servo does.
+impl<'i> AtRuleParser<'i> for DeclParser {
+ type Prelude = ();
+ type AtRule = Declaration;
+ type Error = ValueErrorKind;
+}
+
+/// Struct to implement cssparser::QualifiedRuleParser and cssparser::AtRuleParser
+pub struct RuleParser {
+ session: Session,
+}
+
+/// Errors from the CSS parsing process
+#[derive(Debug)]
+pub enum ParseErrorKind<'i> {
+ Selector(selectors::parser::SelectorParseErrorKind<'i>),
+}
+
+impl<'i> From<selectors::parser::SelectorParseErrorKind<'i>> for ParseErrorKind<'i> {
+ fn from(e: selectors::parser::SelectorParseErrorKind<'_>) -> ParseErrorKind<'_> {
+ ParseErrorKind::Selector(e)
+ }
+}
+
+/// A CSS qualified rule (or ruleset)
+pub struct QualifiedRule {
+ selectors: SelectorList<Selector>,
+ declarations: Vec<Declaration>,
+}
+
+/// Prelude of at-rule used in the AtRuleParser.
+pub enum AtRulePrelude {
+ Import(String),
+}
+
+/// A CSS at-rule (or ruleset)
+pub enum AtRule {
+ Import(String),
+}
+
+/// A CSS rule (or ruleset)
+pub enum Rule {
+ AtRule(AtRule),
+ QualifiedRule(QualifiedRule),
+}
+
+// Required to implement the `Prelude` associated type in `cssparser::QualifiedRuleParser`
+impl<'i> selectors::Parser<'i> for RuleParser {
+ type Impl = Selector;
+ type Error = ParseErrorKind<'i>;
+
+ fn default_namespace(&self) -> Option<<Self::Impl as SelectorImpl>::NamespaceUrl> {
+ Some(ns!(svg))
+ }
+
+ fn namespace_for_prefix(
+ &self,
+ _prefix: &<Self::Impl as SelectorImpl>::NamespacePrefix,
+ ) -> Option<<Self::Impl as SelectorImpl>::NamespaceUrl> {
+ // FIXME: Do we need to keep a lookup table extracted from libxml2's
+ // XML namespaces?
+ //
+ // Or are CSS namespaces completely different, declared elsewhere?
+ None
+ }
+ fn parse_non_ts_pseudo_class(
+ &self,
+ location: SourceLocation,
+ name: CowRcStr<'i>,
+ ) -> Result<NonTSPseudoClass, cssparser::ParseError<'i, Self::Error>> {
+ match &*name {
+ "link" => Ok(NonTSPseudoClass::Link),
+ "visited" => Ok(NonTSPseudoClass::Visited),
+ _ => Err(location.new_custom_error(
+ selectors::parser::SelectorParseErrorKind::UnsupportedPseudoClassOrElement(name),
+ )),
+ }
+ }
+ fn parse_non_ts_functional_pseudo_class(
+ &self,
+ name: CowRcStr<'i>,
+ arguments: &mut Parser<'i, '_>,
+ ) -> Result<NonTSPseudoClass, cssparser::ParseError<'i, Self::Error>> {
+ match &*name {
+ "lang" => {
+ // Comma-separated lists of languages are a Selectors 4 feature,
+ // but a pretty stable one that hasn't changed in a long time.
+ let tags = arguments.parse_comma_separated(|arg| {
+ let language_tag = arg.expect_ident_or_string()?.clone();
+ LanguageTag::from_str(&language_tag).map_err(|_| {
+ arg.new_custom_error(selectors::parser::SelectorParseErrorKind::UnsupportedPseudoClassOrElement(language_tag))
+ })
+ })?;
+ arguments.expect_exhausted()?;
+ Ok(NonTSPseudoClass::Lang(tags))
+ }
+ _ => Err(arguments.new_custom_error(
+ selectors::parser::SelectorParseErrorKind::UnsupportedPseudoClassOrElement(name),
+ )),
+ }
+ }
+}
+
+// `cssparser::RuleListParser` is a struct which requires that we
+// provide a type that implements `cssparser::QualifiedRuleParser`.
+//
+// In turn, `cssparser::QualifiedRuleParser` requires that we
+// implement a way to parse the `Prelude` of a ruleset or rule. For
+// example, in this ruleset:
+//
+// ```css
+// foo, .bar { fill: red; stroke: green; }
+// ```
+//
+// The prelude is the selector list with the `foo` and `.bar` selectors.
+//
+// The `parse_prelude` method just uses `selectors::SelectorList`. This
+// is what requires the `impl selectors::Parser for RuleParser`.
+//
+// Next, the `parse_block` method takes an already-parsed prelude (a selector list),
+// and tries to parse the block between braces. It creates a `Rule` out of
+// the selector list and the declaration list.
+impl<'i> QualifiedRuleParser<'i> for RuleParser {
+ type Prelude = SelectorList<Selector>;
+ type QualifiedRule = Rule;
+ type Error = ParseErrorKind<'i>;
+
+ fn parse_prelude<'t>(
+ &mut self,
+ input: &mut Parser<'i, 't>,
+ ) -> Result<Self::Prelude, cssparser::ParseError<'i, Self::Error>> {
+ SelectorList::parse(self, input)
+ }
+
+ fn parse_block<'t>(
+ &mut self,
+ prelude: Self::Prelude,
+ _start: &ParserState,
+ input: &mut Parser<'i, 't>,
+ ) -> Result<Self::QualifiedRule, cssparser::ParseError<'i, Self::Error>> {
+ let declarations = DeclarationListParser::new(input, DeclParser)
+ .filter_map(|r| match r {
+ Ok(decl) => Some(decl),
+ Err(e) => {
+ rsvg_log!(self.session, "Invalid declaration; ignoring: {:?}", e);
+ None
+ }
+ })
+ .collect();
+
+ Ok(Rule::QualifiedRule(QualifiedRule {
+ selectors: prelude,
+ declarations,
+ }))
+ }
+}
+
+// Required by `cssparser::RuleListParser`.
+//
+// This only handles the `@import` at-rule.
+impl<'i> AtRuleParser<'i> for RuleParser {
+ type Prelude = AtRulePrelude;
+ type AtRule = Rule;
+ type Error = ParseErrorKind<'i>;
+
+ #[allow(clippy::type_complexity)]
+ fn parse_prelude<'t>(
+ &mut self,
+ name: CowRcStr<'i>,
+ input: &mut Parser<'i, 't>,
+ ) -> Result<Self::Prelude, cssparser::ParseError<'i, Self::Error>> {
+ match_ignore_ascii_case! {
+ &name,
+
+ // FIXME: at the moment we ignore media queries
+
+ "import" => {
+ let url = input.expect_url_or_string()?.as_ref().to_owned();
+ Ok(AtRulePrelude::Import(url))
+ },
+
+ _ => Err(input.new_error(BasicParseErrorKind::AtRuleInvalid(name))),
+ }
+ }
+
+ fn rule_without_block(
+ &mut self,
+ prelude: Self::Prelude,
+ _start: &ParserState,
+ ) -> Result<Self::AtRule, ()> {
+ let AtRulePrelude::Import(url) = prelude;
+ Ok(Rule::AtRule(AtRule::Import(url)))
+ }
+
+ // When we implement at-rules with blocks, implement the trait's parse_block() method here.
+}
+
+/// Dummy type required by the SelectorImpl trait.
+#[allow(clippy::upper_case_acronyms)]
+#[derive(Clone, Debug, Eq, PartialEq)]
+pub enum NonTSPseudoClass {
+ Link,
+ Visited,
+ Lang(Vec<LanguageTag>),
+}
+
+impl ToCss for NonTSPseudoClass {
+ fn to_css<W>(&self, dest: &mut W) -> fmt::Result
+ where
+ W: fmt::Write,
+ {
+ match self {
+ NonTSPseudoClass::Link => write!(dest, "link"),
+ NonTSPseudoClass::Visited => write!(dest, "visited"),
+ NonTSPseudoClass::Lang(lang) => write!(
+ dest,
+ "lang(\"{}\")",
+ lang.iter()
+ .map(ToString::to_string)
+ .collect::<Vec<_>>()
+ .join("\",\"")
+ ),
+ }
+ }
+}
+
+impl selectors::parser::NonTSPseudoClass for NonTSPseudoClass {
+ type Impl = Selector;
+
+ fn is_active_or_hover(&self) -> bool {
+ false
+ }
+
+ fn is_user_action_state(&self) -> bool {
+ false
+ }
+}
+
+/// Dummy type required by the SelectorImpl trait
+#[derive(Clone, Debug, Eq, PartialEq)]
+pub struct PseudoElement;
+
+impl ToCss for PseudoElement {
+ fn to_css<W>(&self, _dest: &mut W) -> fmt::Result
+ where
+ W: fmt::Write,
+ {
+ Ok(())
+ }
+}
+
+impl selectors::parser::PseudoElement for PseudoElement {
+ type Impl = Selector;
+}
+
+/// Holds all the types for the SelectorImpl trait
+#[derive(Debug, Clone)]
+pub struct Selector;
+
+/// Wrapper for attribute values.
+///
+/// We use a newtype because the associated type Selector::AttrValue
+/// must implement `From<&str>` and `ToCss`, which are foreign traits.
+///
+/// The `derive` requirements come from the `selectors` crate.
+#[derive(Clone, PartialEq, Eq)]
+pub struct AttributeValue(String);
+
+impl From<&str> for AttributeValue {
+ fn from(s: &str) -> AttributeValue {
+ AttributeValue(s.to_owned())
+ }
+}
+
+impl ToCss for AttributeValue {
+ fn to_css<W>(&self, dest: &mut W) -> fmt::Result
+ where
+ W: fmt::Write,
+ {
+ use std::fmt::Write;
+
+ write!(cssparser::CssStringWriter::new(dest), "{}", &self.0)
+ }
+}
+
+impl AsRef<str> for AttributeValue {
+ fn as_ref(&self) -> &str {
+ self.0.as_ref()
+ }
+}
+
+/// Wrapper for identifier values.
+///
+/// Used to implement `ToCss` on the `LocalName` foreign type.
+#[derive(Clone, PartialEq, Eq)]
+pub struct Identifier(markup5ever::LocalName);
+
+impl From<&str> for Identifier {
+ fn from(s: &str) -> Identifier {
+ Identifier(markup5ever::LocalName::from(s))
+ }
+}
+
+impl ToCss for Identifier {
+ fn to_css<W>(&self, dest: &mut W) -> fmt::Result
+ where
+ W: fmt::Write,
+ {
+ cssparser::serialize_identifier(&self.0, dest)
+ }
+}
+
+/// Wrapper for local names.
+///
+/// Used to implement `ToCss` on the `LocalName` foreign type.
+#[derive(Clone, PartialEq, Eq)]
+pub struct LocalName(markup5ever::LocalName);
+
+impl From<&str> for LocalName {
+ fn from(s: &str) -> LocalName {
+ LocalName(markup5ever::LocalName::from(s))
+ }
+}
+
+impl ToCss for LocalName {
+ fn to_css<W>(&self, dest: &mut W) -> fmt::Result
+ where
+ W: fmt::Write,
+ {
+ cssparser::serialize_identifier(&self.0, dest)
+ }
+}
+
+/// Wrapper for namespace prefixes.
+///
+/// Used to implement `ToCss` on the `markup5ever::Prefix` foreign type.
+#[derive(Clone, Default, PartialEq, Eq)]
+pub struct NamespacePrefix(markup5ever::Prefix);
+
+impl From<&str> for NamespacePrefix {
+ fn from(s: &str) -> NamespacePrefix {
+ NamespacePrefix(markup5ever::Prefix::from(s))
+ }
+}
+
+impl ToCss for NamespacePrefix {
+ fn to_css<W>(&self, dest: &mut W) -> fmt::Result
+ where
+ W: fmt::Write,
+ {
+ cssparser::serialize_identifier(&self.0, dest)
+ }
+}
+
+impl SelectorImpl for Selector {
+ type ExtraMatchingData = ();
+ type AttrValue = AttributeValue;
+ type Identifier = Identifier;
+ type LocalName = LocalName;
+ type NamespaceUrl = Namespace;
+ type NamespacePrefix = NamespacePrefix;
+ type BorrowedNamespaceUrl = Namespace;
+ type BorrowedLocalName = LocalName;
+ type NonTSPseudoClass = NonTSPseudoClass;
+ type PseudoElement = PseudoElement;
+}
+
+/// Newtype wrapper around `Node` so we can implement [`selectors::Element`] for it.
+///
+/// `Node` is an alias for [`rctree::Node`], so we can't implement
+/// `selectors::Element` directly on it. We implement it on the
+/// `RsvgElement` wrapper instead.
+#[derive(Clone, PartialEq)]
+pub struct RsvgElement(Node);
+
+impl From<Node> for RsvgElement {
+ fn from(n: Node) -> RsvgElement {
+ RsvgElement(n)
+ }
+}
+
+impl fmt::Debug for RsvgElement {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ write!(f, "{}", self.0.borrow())
+ }
+}
+
+// The selectors crate uses this to examine our tree of elements.
+impl selectors::Element for RsvgElement {
+ type Impl = Selector;
+
+ /// Converts self into an opaque representation.
+ fn opaque(&self) -> OpaqueElement {
+ OpaqueElement::new(&self.0.borrow())
+ }
+
+ fn parent_element(&self) -> Option<Self> {
+ self.0.parent().map(|n| n.into())
+ }
+
+ /// Whether the parent node of this element is a shadow root.
+ fn parent_node_is_shadow_root(&self) -> bool {
+ // unsupported
+ false
+ }
+
+ /// The host of the containing shadow root, if any.
+ fn containing_shadow_host(&self) -> Option<Self> {
+ // unsupported
+ None
+ }
+
+ /// Whether we're matching on a pseudo-element.
+ fn is_pseudo_element(&self) -> bool {
+ // unsupported
+ false
+ }
+
+ /// Skips non-element nodes
+ fn prev_sibling_element(&self) -> Option<Self> {
+ let mut sibling = self.0.previous_sibling();
+
+ while let Some(ref sib) = sibling {
+ if sib.is_element() {
+ return sibling.map(|n| n.into());
+ }
+
+ sibling = sib.previous_sibling();
+ }
+
+ None
+ }
+
+ /// Skips non-element nodes
+ fn next_sibling_element(&self) -> Option<Self> {
+ let mut sibling = self.0.next_sibling();
+
+ while let Some(ref sib) = sibling {
+ if sib.is_element() {
+ return sibling.map(|n| n.into());
+ }
+
+ sibling = sib.next_sibling();
+ }
+
+ None
+ }
+
+ fn is_html_element_in_html_document(&self) -> bool {
+ false
+ }
+
+ fn has_local_name(&self, local_name: &LocalName) -> bool {
+ self.0.borrow_element().element_name().local == local_name.0
+ }
+
+ /// Empty string for no namespace
+ fn has_namespace(&self, ns: &Namespace) -> bool {
+ self.0.borrow_element().element_name().ns == *ns
+ }
+
+ /// Whether this element and the `other` element have the same local name and namespace.
+ fn is_same_type(&self, other: &Self) -> bool {
+ self.0.borrow_element().element_name() == other.0.borrow_element().element_name()
+ }
+
+ fn attr_matches(
+ &self,
+ ns: &NamespaceConstraint<&Namespace>,
+ local_name: &LocalName,
+ operation: &AttrSelectorOperation<&AttributeValue>,
+ ) -> bool {
+ self.0
+ .borrow_element()
+ .get_attributes()
+ .iter()
+ .find(|(attr, _)| {
+ // do we have an attribute that matches the namespace and local_name?
+ match *ns {
+ NamespaceConstraint::Any => local_name.0 == attr.local,
+ NamespaceConstraint::Specific(ns) => {
+ QualName::new(None, ns.clone(), local_name.0.clone()) == *attr
+ }
+ }
+ })
+ .map(|(_, value)| {
+ // we have one; does the attribute's value match the expected operation?
+ operation.eval_str(value)
+ })
+ .unwrap_or(false)
+ }
+
+ fn match_non_ts_pseudo_class<F>(
+ &self,
+ pc: &<Self::Impl as SelectorImpl>::NonTSPseudoClass,
+ _context: &mut MatchingContext<'_, Self::Impl>,
+ _flags_setter: &mut F,
+ ) -> bool
+ where
+ F: FnMut(&Self, ElementSelectorFlags),
+ {
+ match pc {
+ NonTSPseudoClass::Link => self.is_link(),
+ NonTSPseudoClass::Visited => false,
+ NonTSPseudoClass::Lang(css_lang) => self
+ .0
+ .borrow_element()
+ .get_computed_values()
+ .xml_lang()
+ .0
+ .as_ref()
+ .map_or(false, |e_lang| css_lang.iter().any(|l| l.matches(e_lang))),
+ }
+ }
+
+ fn match_pseudo_element(
+ &self,
+ _pe: &<Self::Impl as SelectorImpl>::PseudoElement,
+ _context: &mut MatchingContext<'_, Self::Impl>,
+ ) -> bool {
+ // unsupported
+ false
+ }
+
+ /// Whether this element is a `link`.
+ fn is_link(&self) -> bool {
+ // Style as link only if href is specified at all.
+ //
+ // The SVG and CSS specifications do not seem to clearly
+ // say what happens when you have an `<svg:a>` tag with no
+ // `(xlink:|svg:)href` attribute. However, both Firefox and Chromium
+ // consider a bare `<svg:a>` element with no href to be NOT
+ // a link, so to avoid nasty surprises, we do the same.
+ // Empty href's, however, ARE considered links.
+ self.0.is_element()
+ && match *self.0.borrow_element_data() {
+ crate::element::ElementData::Link(ref link) => link.link.is_some(),
+ _ => false,
+ }
+ }
+
+ /// Returns whether the element is an HTML <slot> element.
+ fn is_html_slot_element(&self) -> bool {
+ false
+ }
+
+ fn has_id(&self, id: &Identifier, case_sensitivity: CaseSensitivity) -> bool {
+ self.0
+ .borrow_element()
+ .get_id()
+ .map(|self_id| case_sensitivity.eq(self_id.as_bytes(), id.0.as_bytes()))
+ .unwrap_or(false)
+ }
+
+ fn has_class(&self, name: &Identifier, case_sensitivity: CaseSensitivity) -> bool {
+ self.0
+ .borrow_element()
+ .get_class()
+ .map(|classes| {
+ classes
+ .split_whitespace()
+ .any(|class| case_sensitivity.eq(class.as_bytes(), name.0.as_bytes()))
+ })
+ .unwrap_or(false)
+ }
+
+ fn imported_part(&self, _name: &Identifier) -> Option<Identifier> {
+ // unsupported
+ None
+ }
+
+ fn is_part(&self, _name: &Identifier) -> bool {
+ // unsupported
+ false
+ }
+
+ /// Returns whether this element matches `:empty`.
+ ///
+ /// That is, whether it does not contain any child element or any non-zero-length text node.
+ /// See <http://dev.w3.org/csswg/selectors-3/#empty-pseudo>.
+ fn is_empty(&self) -> bool {
+ // .all() returns true for the empty iterator
+ self.0
+ .children()
+ .all(|child| child.is_chars() && child.borrow_chars().is_empty())
+ }
+
+ /// Returns whether this element matches `:root`,
+ /// i.e. whether it is the root element of a document.
+ ///
+ /// Note: this can be false even if `.parent_element()` is `None`
+ /// if the parent node is a `DocumentFragment`.
+ fn is_root(&self) -> bool {
+ self.0.parent().is_none()
+ }
+}
+
+/// Origin for a stylesheet, per CSS 2.2.
+///
+/// This is used when sorting selector matches according to their origin and specificity.
+///
+/// CSS2.2: <https://www.w3.org/TR/CSS22/cascade.html#cascading-order>
+#[derive(Copy, Clone, Eq, Ord, PartialEq, PartialOrd)]
+pub enum Origin {
+ UserAgent,
+ User,
+ Author,
+}
+
+/// A parsed CSS stylesheet.
+pub struct Stylesheet {
+ origin: Origin,
+ qualified_rules: Vec<QualifiedRule>,
+}
+
+/// A match during the selector matching process
+///
+/// This struct comes from [`Stylesheet::get_matches`], and represents
+/// that a certain node matched a CSS rule which has a selector with a
+/// certain `specificity`. The stylesheet's `origin` is also given here.
+///
+/// This type implements [`Ord`] so a list of `Match` can be sorted.
+/// That implementation does ordering based on origin and specificity
+/// as per <https://www.w3.org/TR/CSS22/cascade.html#cascading-order>.
+struct Match<'a> {
+ specificity: u32,
+ origin: Origin,
+ declaration: &'a Declaration,
+}
+
+impl<'a> Ord for Match<'a> {
+ fn cmp(&self, other: &Self) -> Ordering {
+ match self.origin.cmp(&other.origin) {
+ Ordering::Equal => self.specificity.cmp(&other.specificity),
+ o => o,
+ }
+ }
+}
+
+impl<'a> PartialOrd for Match<'a> {
+ fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
+ Some(self.cmp(other))
+ }
+}
+
+impl<'a> PartialEq for Match<'a> {
+ fn eq(&self, other: &Self) -> bool {
+ self.origin == other.origin && self.specificity == other.specificity
+ }
+}
+
+impl<'a> Eq for Match<'a> {}
+
+impl Stylesheet {
+ fn empty(origin: Origin) -> Stylesheet {
+ Stylesheet {
+ origin,
+ qualified_rules: Vec::new(),
+ }
+ }
+
+ /// Parses a new stylesheet from CSS data in a string.
+ ///
+ /// The `url_resolver_url` is required for `@import` rules, so that librsvg can determine if
+ /// the requested path is allowed.
+ pub fn from_data(
+ buf: &str,
+ url_resolver: &UrlResolver,
+ origin: Origin,
+ session: Session,
+ ) -> Result<Self, LoadingError> {
+ let mut stylesheet = Stylesheet::empty(origin);
+ stylesheet.add_rules_from_string(buf, url_resolver, session)?;
+ Ok(stylesheet)
+ }
+
+ /// Parses a new stylesheet by loading CSS data from a URL.
+ pub fn from_href(
+ aurl: &AllowedUrl,
+ origin: Origin,
+ session: Session,
+ ) -> Result<Self, LoadingError> {
+ let mut stylesheet = Stylesheet::empty(origin);
+ stylesheet.load(aurl, session)?;
+ Ok(stylesheet)
+ }
+
+ /// Parses the CSS rules in `buf` and appends them to the stylesheet.
+ ///
+ /// The `url_resolver_url` is required for `@import` rules, so that librsvg can determine if
+ /// the requested path is allowed.
+ ///
+ /// If there is an `@import` rule, its rules will be recursively added into the
+ /// stylesheet, in the order in which they appear.
+ fn add_rules_from_string(
+ &mut self,
+ buf: &str,
+ url_resolver: &UrlResolver,
+ session: Session,
+ ) -> Result<(), LoadingError> {
+ let mut input = ParserInput::new(buf);
+ let mut parser = Parser::new(&mut input);
+ let rule_parser = RuleParser {
+ session: session.clone(),
+ };
+
+ RuleListParser::new_for_stylesheet(&mut parser, rule_parser)
+ .filter_map(|r| match r {
+ Ok(rule) => Some(rule),
+ Err(e) => {
+ rsvg_log!(session, "Invalid rule; ignoring: {:?}", e);
+ None
+ }
+ })
+ .for_each(|rule| match rule {
+ Rule::AtRule(AtRule::Import(url)) => match url_resolver.resolve_href(&url) {
+ Ok(aurl) => {
+ // ignore invalid imports
+ let _ = self.load(&aurl, session.clone());
+ }
+
+ Err(e) => {
+ rsvg_log!(session, "Not loading stylesheet from \"{}\": {}", url, e);
+ }
+ },
+
+ Rule::QualifiedRule(qr) => self.qualified_rules.push(qr),
+ });
+
+ Ok(())
+ }
+
+ /// Parses a stylesheet referenced by an URL
+ fn load(&mut self, aurl: &AllowedUrl, session: Session) -> Result<(), LoadingError> {
+ io::acquire_data(aurl, None)
+ .map_err(LoadingError::from)
+ .and_then(|data| {
+ let BinaryData {
+ data: bytes,
+ mime_type,
+ } = data;
+
+ if is_text_css(&mime_type) {
+ Ok(bytes)
+ } else {
+ rsvg_log!(session, "\"{}\" is not of type text/css; ignoring", aurl);
+ Err(LoadingError::BadCss)
+ }
+ })
+ .and_then(|bytes| {
+ String::from_utf8(bytes).map_err(|_| {
+ rsvg_log!(
+ session,
+ "\"{}\" does not contain valid UTF-8 CSS data; ignoring",
+ aurl
+ );
+ LoadingError::BadCss
+ })
+ })
+ .and_then(|utf8| {
+ let url = (**aurl).clone();
+ self.add_rules_from_string(&utf8, &UrlResolver::new(Some(url)), session)
+ })
+ }
+
+ /// Appends the style declarations that match a specified node to a given vector
+ fn get_matches<'a>(
+ &'a self,
+ node: &Node,
+ match_ctx: &mut MatchingContext<'_, Selector>,
+ acc: &mut Vec<Match<'a>>,
+ ) {
+ for rule in &self.qualified_rules {
+ for selector in &rule.selectors.0 {
+ // This magic call is stolen from selectors::matching::matches_selector_list()
+ let matches = selectors::matching::matches_selector(
+ selector,
+ 0,
+ None,
+ &RsvgElement(node.clone()),
+ match_ctx,
+ &mut |_, _| {},
+ );
+
+ if matches {
+ for decl in rule.declarations.iter() {
+ acc.push(Match {
+ declaration: decl,
+ specificity: selector.specificity(),
+ origin: self.origin,
+ });
+ }
+ }
+ }
+ }
+ }
+}
+
+fn is_text_css(mime_type: &Mime) -> bool {
+ mime_type.type_ == "text" && mime_type.subtype == "css"
+}
+
+/// Runs the CSS cascade on the specified tree from all the stylesheets
+pub fn cascade(
+ root: &mut Node,
+ ua_stylesheets: &[Stylesheet],
+ author_stylesheets: &[Stylesheet],
+ user_stylesheets: &[Stylesheet],
+ session: &Session,
+) {
+ for mut node in root.descendants().filter(|n| n.is_element()) {
+ let mut matches = Vec::new();
+
+ // xml:lang needs to be inherited before selector matching, so it
+ // can't be done in the usual SpecifiedValues::to_computed_values,
+ // which is called by cascade() and runs after matching.
+ let parent = node.parent().clone();
+ node.borrow_element_mut().inherit_xml_lang(parent);
+
+ let mut match_ctx = MatchingContext::new(
+ MatchingMode::Normal,
+ // FIXME: how the fuck does one set up a bloom filter here?
+ None,
+ // n_index_cache,
+ None,
+ QuirksMode::NoQuirks,
+ );
+
+ for s in ua_stylesheets
+ .iter()
+ .chain(author_stylesheets)
+ .chain(user_stylesheets)
+ {
+ s.get_matches(&node, &mut match_ctx, &mut matches);
+ }
+
+ matches.as_mut_slice().sort();
+
+ for m in matches {
+ node.borrow_element_mut()
+ .apply_style_declaration(m.declaration, m.origin);
+ }
+
+ node.borrow_element_mut().set_style_attribute(session);
+ }
+
+ let values = ComputedValues::default();
+ root.cascade(&values);
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+ use selectors::Element;
+
+ use crate::document::Document;
+
+ #[test]
+ fn xml_lang() {
+ let document = Document::load_from_bytes(
+ br#"<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xml:lang="zh">
+ <text id="a" x="10" y="10" width="30" height="30"></text>
+ <text id="b" x="10" y="20" width="30" height="30" xml:lang="en"></text>
+</svg>
+"#,
+ );
+ let a = document.lookup_internal_node("a").unwrap();
+ assert_eq!(
+ a.borrow_element()
+ .get_computed_values()
+ .xml_lang()
+ .0
+ .unwrap()
+ .as_str(),
+ "zh"
+ );
+ let b = document.lookup_internal_node("b").unwrap();
+ assert_eq!(
+ b.borrow_element()
+ .get_computed_values()
+ .xml_lang()
+ .0
+ .unwrap()
+ .as_str(),
+ "en"
+ );
+ }
+
+ #[test]
+ fn impl_element() {
+ let document = Document::load_from_bytes(
+ br#"<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" id="a">
+ <rect id="b" x="10" y="10" width="30" height="30"/>
+ <circle id="c" cx="10" cy="10" r="10"/>
+ <rect id="d" class="foo bar"/>
+</svg>
+"#,
+ );
+
+ let a = document.lookup_internal_node("a").unwrap();
+ let b = document.lookup_internal_node("b").unwrap();
+ let c = document.lookup_internal_node("c").unwrap();
+ let d = document.lookup_internal_node("d").unwrap();
+
+ // Node types
+ assert!(is_element_of_type!(a, Svg));
+ assert!(is_element_of_type!(b, Rect));
+ assert!(is_element_of_type!(c, Circle));
+ assert!(is_element_of_type!(d, Rect));
+
+ let a = RsvgElement(a);
+ let b = RsvgElement(b);
+ let c = RsvgElement(c);
+ let d = RsvgElement(d);
+
+ // Tree navigation
+
+ assert_eq!(a.parent_element(), None);
+ assert_eq!(b.parent_element(), Some(a.clone()));
+ assert_eq!(c.parent_element(), Some(a.clone()));
+ assert_eq!(d.parent_element(), Some(a.clone()));
+
+ assert_eq!(b.next_sibling_element(), Some(c.clone()));
+ assert_eq!(c.next_sibling_element(), Some(d.clone()));
+ assert_eq!(d.next_sibling_element(), None);
+
+ assert_eq!(b.prev_sibling_element(), None);
+ assert_eq!(c.prev_sibling_element(), Some(b.clone()));
+ assert_eq!(d.prev_sibling_element(), Some(c.clone()));
+
+ // Other operations
+
+ assert!(a.has_local_name(&LocalName::from("svg")));
+
+ assert!(a.has_namespace(&ns!(svg)));
+
+ assert!(!a.is_same_type(&b));
+ assert!(b.is_same_type(&d));
+
+ assert!(a.has_id(
+ &Identifier::from("a"),
+ CaseSensitivity::AsciiCaseInsensitive
+ ));
+ assert!(!b.has_id(
+ &Identifier::from("foo"),
+ CaseSensitivity::AsciiCaseInsensitive
+ ));
+
+ assert!(d.has_class(
+ &Identifier::from("foo"),
+ CaseSensitivity::AsciiCaseInsensitive
+ ));
+ assert!(d.has_class(
+ &Identifier::from("bar"),
+ CaseSensitivity::AsciiCaseInsensitive
+ ));
+
+ assert!(!a.has_class(
+ &Identifier::from("foo"),
+ CaseSensitivity::AsciiCaseInsensitive
+ ));
+
+ assert!(d.is_empty());
+ assert!(!a.is_empty());
+ }
+}
diff --git a/rsvg/src/dasharray.rs b/rsvg/src/dasharray.rs
new file mode 100644
index 00000000..ae0e9488
--- /dev/null
+++ b/rsvg/src/dasharray.rs
@@ -0,0 +1,114 @@
+//! Parser for the `stroke-dasharray` property.
+
+use cssparser::Parser;
+
+use crate::error::*;
+use crate::length::*;
+use crate::parsers::{optional_comma, Parse};
+
+#[derive(Debug, PartialEq, Clone)]
+pub enum Dasharray {
+ None,
+ Array(Box<[ULength<Both>]>),
+}
+
+enum_default!(Dasharray, Dasharray::None);
+
+impl Parse for Dasharray {
+ fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<Dasharray, ParseError<'i>> {
+ if parser
+ .try_parse(|p| p.expect_ident_matching("none"))
+ .is_ok()
+ {
+ return Ok(Dasharray::None);
+ }
+
+ let mut dasharray = Vec::new();
+
+ loop {
+ let d = ULength::<Both>::parse(parser)?;
+ dasharray.push(d);
+
+ if parser.is_exhausted() {
+ break;
+ }
+
+ optional_comma(parser);
+ }
+
+ Ok(Dasharray::Array(dasharray.into_boxed_slice()))
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ fn dasharray(l: &[ULength<Both>]) -> Dasharray {
+ Dasharray::Array(
+ l.iter()
+ .cloned()
+ .collect::<Vec<ULength<Both>>>()
+ .into_boxed_slice(),
+ )
+ }
+
+ #[test]
+ fn parses_dash_array() {
+ // helper to cut down boilderplate
+ let length_parse = |s| ULength::<Both>::parse_str(s).unwrap();
+
+ let expected = dasharray(&[
+ length_parse("1"),
+ length_parse("2in"),
+ length_parse("3"),
+ length_parse("4%"),
+ ]);
+
+ let sample_1 = dasharray(&[length_parse("10"), length_parse("6")]);
+
+ let sample_2 = dasharray(&[length_parse("5"), length_parse("5"), length_parse("20")]);
+
+ let sample_3 = dasharray(&[
+ length_parse("10px"),
+ length_parse("20px"),
+ length_parse("20px"),
+ ]);
+
+ let sample_4 = dasharray(&[
+ length_parse("25"),
+ length_parse("5"),
+ length_parse("5"),
+ length_parse("5"),
+ ]);
+
+ let sample_5 = dasharray(&[length_parse("3.1415926"), length_parse("8")]);
+ let sample_6 = dasharray(&[length_parse("5"), length_parse("3.14")]);
+ let sample_7 = dasharray(&[length_parse("2")]);
+
+ assert_eq!(Dasharray::parse_str("none").unwrap(), Dasharray::None);
+ assert_eq!(Dasharray::parse_str("1 2in,3 4%").unwrap(), expected);
+ assert_eq!(Dasharray::parse_str("10,6").unwrap(), sample_1);
+ assert_eq!(Dasharray::parse_str("5,5,20").unwrap(), sample_2);
+ assert_eq!(Dasharray::parse_str("10px 20px 20px").unwrap(), sample_3);
+ assert_eq!(Dasharray::parse_str("25 5 , 5 5").unwrap(), sample_4);
+ assert_eq!(Dasharray::parse_str("3.1415926,8").unwrap(), sample_5);
+ assert_eq!(Dasharray::parse_str("5, 3.14").unwrap(), sample_6);
+ assert_eq!(Dasharray::parse_str("2").unwrap(), sample_7);
+
+ // Negative numbers
+ assert!(Dasharray::parse_str("20,40,-20").is_err());
+
+ // Empty dash_array
+ assert!(Dasharray::parse_str("").is_err());
+ assert!(Dasharray::parse_str("\t \n ").is_err());
+ assert!(Dasharray::parse_str(",,,").is_err());
+ assert!(Dasharray::parse_str("10, \t, 20 \n").is_err());
+
+ // No trailing commas allowed, parse error
+ assert!(Dasharray::parse_str("10,").is_err());
+
+ // A comma should be followed by a number
+ assert!(Dasharray::parse_str("20,,10").is_err());
+ }
+}
diff --git a/rsvg/src/document.rs b/rsvg/src/document.rs
new file mode 100644
index 00000000..0327e769
--- /dev/null
+++ b/rsvg/src/document.rs
@@ -0,0 +1,667 @@
+//! Main SVG document structure.
+
+use data_url::mime::Mime;
+use gdk_pixbuf::{prelude::PixbufLoaderExt, PixbufLoader};
+use markup5ever::QualName;
+use once_cell::sync::Lazy;
+use std::cell::RefCell;
+use std::collections::hash_map::Entry;
+use std::collections::HashMap;
+use std::fmt;
+use std::include_str;
+use std::rc::Rc;
+use std::str::FromStr;
+use std::sync::Arc;
+
+use crate::css::{self, Origin, Stylesheet};
+use crate::error::{AcquireError, LoadingError, NodeIdError};
+use crate::handle::LoadOptions;
+use crate::io::{self, BinaryData};
+use crate::limits;
+use crate::node::{Node, NodeBorrow, NodeData};
+use crate::session::Session;
+use crate::surface_utils::shared_surface::SharedImageSurface;
+use crate::url_resolver::{AllowedUrl, UrlResolver};
+use crate::xml::{xml_load_from_possibly_compressed_stream, Attributes};
+
+static UA_STYLESHEETS: Lazy<Vec<Stylesheet>> = Lazy::new(|| {
+ vec![Stylesheet::from_data(
+ include_str!("ua.css"),
+ &UrlResolver::new(None),
+ Origin::UserAgent,
+ Session::default(),
+ )
+ .expect("could not parse user agent stylesheet for librsvg, there's a bug!")]
+});
+
+/// Identifier of a node
+#[derive(Debug, PartialEq, Clone)]
+pub enum NodeId {
+ /// element id
+ Internal(String),
+ /// url, element id
+ External(String, String),
+}
+
+impl NodeId {
+ pub fn parse(href: &str) -> Result<NodeId, NodeIdError> {
+ let (url, id) = match href.rfind('#') {
+ None => (Some(href), None),
+ Some(p) if p == 0 => (None, Some(&href[1..])),
+ Some(p) => (Some(&href[..p]), Some(&href[(p + 1)..])),
+ };
+
+ match (url, id) {
+ (None, Some(id)) if !id.is_empty() => Ok(NodeId::Internal(String::from(id))),
+ (Some(url), Some(id)) if !id.is_empty() => {
+ Ok(NodeId::External(String::from(url), String::from(id)))
+ }
+ _ => Err(NodeIdError::NodeIdRequired),
+ }
+ }
+}
+
+impl fmt::Display for NodeId {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ match self {
+ NodeId::Internal(id) => write!(f, "#{id}"),
+ NodeId::External(url, id) => write!(f, "{url}#{id}"),
+ }
+ }
+}
+
+/// A loaded SVG file and its derived data.
+pub struct Document {
+ /// Tree of nodes; the root is guaranteed to be an `<svg>` element.
+ tree: Node,
+
+ /// Metadata about the SVG handle.
+ session: Session,
+
+ /// Mapping from `id` attributes to nodes.
+ ids: HashMap<String, Node>,
+
+ // The following two require interior mutability because we load the extern
+ // resources all over the place. Eventually we'll be able to do this
+ // once, at loading time, and keep this immutable.
+ /// SVG documents referenced from this document.
+ externs: RefCell<Resources>,
+
+ /// Image resources referenced from this document.
+ images: RefCell<Images>,
+
+ /// Used to load referenced resources.
+ load_options: Arc<LoadOptions>,
+
+ /// Stylesheets defined in the document.
+ stylesheets: Vec<Stylesheet>,
+}
+
+impl Document {
+ /// Constructs a `Document` by loading it from a stream.
+ pub fn load_from_stream(
+ session: Session,
+ load_options: Arc<LoadOptions>,
+ stream: &gio::InputStream,
+ cancellable: Option<&gio::Cancellable>,
+ ) -> Result<Document, LoadingError> {
+ xml_load_from_possibly_compressed_stream(
+ session.clone(),
+ DocumentBuilder::new(session, load_options.clone()),
+ load_options,
+ stream,
+ cancellable,
+ )
+ }
+
+ /// Utility function to load a document from a static string in tests.
+ #[cfg(test)]
+ pub fn load_from_bytes(input: &'static [u8]) -> Document {
+ use glib::prelude::*;
+
+ let bytes = glib::Bytes::from_static(input);
+ let stream = gio::MemoryInputStream::from_bytes(&bytes);
+
+ Document::load_from_stream(
+ Session::new_for_test_suite(),
+ Arc::new(LoadOptions::new(UrlResolver::new(None))),
+ &stream.upcast(),
+ None::<&gio::Cancellable>,
+ )
+ .unwrap()
+ }
+
+ /// Gets the root node. This is guaranteed to be an `<svg>` element.
+ pub fn root(&self) -> Node {
+ self.tree.clone()
+ }
+
+ /// Looks up a node in this document or one of its resources by its `id` attribute.
+ pub fn lookup_node(&self, node_id: &NodeId) -> Option<Node> {
+ match node_id {
+ NodeId::Internal(id) => self.lookup_internal_node(id),
+ NodeId::External(url, id) => self
+ .externs
+ .borrow_mut()
+ .lookup(&self.session, &self.load_options, url, id)
+ .ok(),
+ }
+ }
+
+ /// Looks up a node in this document by its `id` attribute.
+ pub fn lookup_internal_node(&self, id: &str) -> Option<Node> {
+ self.ids.get(id).map(|n| (*n).clone())
+ }
+
+ /// Loads an image by URL, or returns a pre-loaded one.
+ pub fn lookup_image(&self, url: &str) -> Result<SharedImageSurface, LoadingError> {
+ let aurl = self
+ .load_options
+ .url_resolver
+ .resolve_href(url)
+ .map_err(|_| LoadingError::BadUrl)?;
+
+ self.images.borrow_mut().lookup(&self.load_options, &aurl)
+ }
+
+ /// Runs the CSS cascade on the document tree
+ ///
+ /// This uses the default UserAgent stylesheet, the document's internal stylesheets,
+ /// plus an extra set of stylesheets supplied by the caller.
+ pub fn cascade(&mut self, extra: &[Stylesheet], session: &Session) {
+ css::cascade(
+ &mut self.tree,
+ &UA_STYLESHEETS,
+ &self.stylesheets,
+ extra,
+ session,
+ );
+ }
+}
+
+struct Resources {
+ resources: HashMap<AllowedUrl, Result<Rc<Document>, LoadingError>>,
+}
+
+impl Resources {
+ pub fn new() -> Resources {
+ Resources {
+ resources: Default::default(),
+ }
+ }
+
+ pub fn lookup(
+ &mut self,
+ session: &Session,
+ load_options: &LoadOptions,
+ url: &str,
+ id: &str,
+ ) -> Result<Node, LoadingError> {
+ self.get_extern_document(session, load_options, url)
+ .and_then(|doc| doc.lookup_internal_node(id).ok_or(LoadingError::BadUrl))
+ }
+
+ fn get_extern_document(
+ &mut self,
+ session: &Session,
+ load_options: &LoadOptions,
+ href: &str,
+ ) -> Result<Rc<Document>, LoadingError> {
+ let aurl = load_options
+ .url_resolver
+ .resolve_href(href)
+ .map_err(|_| LoadingError::BadUrl)?;
+
+ match self.resources.entry(aurl) {
+ Entry::Occupied(e) => e.get().clone(),
+ Entry::Vacant(e) => {
+ let aurl = e.key();
+ // FIXME: pass a cancellable to these
+ let doc = io::acquire_stream(aurl, None)
+ .map_err(LoadingError::from)
+ .and_then(|stream| {
+ Document::load_from_stream(
+ session.clone(),
+ Arc::new(load_options.copy_with_base_url(aurl)),
+ &stream,
+ None,
+ )
+ })
+ .map(Rc::new);
+ let res = e.insert(doc);
+ res.clone()
+ }
+ }
+ }
+}
+
+struct Images {
+ images: HashMap<AllowedUrl, Result<SharedImageSurface, LoadingError>>,
+}
+
+impl Images {
+ fn new() -> Images {
+ Images {
+ images: Default::default(),
+ }
+ }
+
+ fn lookup(
+ &mut self,
+ load_options: &LoadOptions,
+ aurl: &AllowedUrl,
+ ) -> Result<SharedImageSurface, LoadingError> {
+ match self.images.entry(aurl.clone()) {
+ Entry::Occupied(e) => e.get().clone(),
+ Entry::Vacant(e) => {
+ let surface = load_image(load_options, e.key());
+ let res = e.insert(surface);
+ res.clone()
+ }
+ }
+ }
+}
+
+fn load_image(
+ load_options: &LoadOptions,
+ aurl: &AllowedUrl,
+) -> Result<SharedImageSurface, LoadingError> {
+ let BinaryData {
+ data: bytes,
+ mime_type,
+ } = io::acquire_data(aurl, None)?;
+
+ if bytes.is_empty() {
+ return Err(LoadingError::Other(String::from("no image data")));
+ }
+
+ let content_type = content_type_for_gdk_pixbuf(&mime_type);
+
+ let loader = if let Some(ref content_type) = content_type {
+ PixbufLoader::with_mime_type(content_type)?
+ } else {
+ PixbufLoader::new()
+ };
+
+ loader.write(&bytes)?;
+ loader.close()?;
+
+ let pixbuf = loader.pixbuf().ok_or_else(|| {
+ LoadingError::Other(format!("loading image: {}", human_readable_url(aurl)))
+ })?;
+
+ let bytes = if load_options.keep_image_data {
+ Some(bytes)
+ } else {
+ None
+ };
+
+ let surface = SharedImageSurface::from_pixbuf(&pixbuf, content_type.as_deref(), bytes)
+ .map_err(|e| image_loading_error_from_cairo(e, aurl))?;
+
+ Ok(surface)
+}
+
+fn content_type_for_gdk_pixbuf(mime_type: &Mime) -> Option<String> {
+ // See issue #548 - data: URLs without a MIME-type automatically
+ // fall back to "text/plain;charset=US-ASCII". Some (old?) versions of
+ // Adobe Illustrator generate data: URLs without MIME-type for image
+ // data. We'll catch this and fall back to sniffing by unsetting the
+ // content_type.
+ let unspecified_mime_type = Mime::from_str("text/plain;charset=US-ASCII").unwrap();
+
+ if *mime_type == unspecified_mime_type {
+ None
+ } else {
+ Some(format!("{}/{}", mime_type.type_, mime_type.subtype))
+ }
+}
+
+fn human_readable_url(aurl: &AllowedUrl) -> &str {
+ if aurl.scheme() == "data" {
+ // avoid printing a huge data: URL for image data
+ "data URL"
+ } else {
+ aurl.as_ref()
+ }
+}
+
+fn image_loading_error_from_cairo(status: cairo::Error, aurl: &AllowedUrl) -> LoadingError {
+ let url = human_readable_url(aurl);
+
+ match status {
+ cairo::Error::NoMemory => LoadingError::OutOfMemory(format!("loading image: {url}")),
+ cairo::Error::InvalidSize => LoadingError::Other(format!("image too big: {url}")),
+ _ => LoadingError::Other(format!("cairo error: {status}")),
+ }
+}
+
+pub struct AcquiredNode {
+ stack: Option<Rc<RefCell<NodeStack>>>,
+ node: Node,
+}
+
+impl Drop for AcquiredNode {
+ fn drop(&mut self) {
+ if let Some(ref stack) = self.stack {
+ let mut stack = stack.borrow_mut();
+ let last = stack.pop().unwrap();
+ assert!(last == self.node);
+ }
+ }
+}
+
+impl AcquiredNode {
+ pub fn get(&self) -> &Node {
+ &self.node
+ }
+}
+
+/// Detects circular references between nodes, and enforces referencing limits.
+///
+/// Consider this fragment of SVG:
+///
+/// ```xml
+/// <pattern id="foo">
+/// <rect width="1" height="1" fill="url(#foo)"/>
+/// </pattern>
+/// ```
+///
+/// The pattern has a child element that references the pattern itself. This kind of circular
+/// reference is invalid. The `AcquiredNodes` struct is passed around
+/// wherever it may be necessary to resolve references to nodes, or to access nodes
+/// "elsewhere" in the DOM that is not the current subtree.
+///
+/// Also, such constructs that reference other elements can be maliciously arranged like
+/// in the [billion laughs attack][lol], to cause huge amounts of CPU to be consumed through
+/// creating an exponential number of references. `AcquiredNodes` imposes a hard limit on
+/// the number of references that can be resolved for typical, well-behaved SVG documents.
+///
+/// The [`Self::acquire()`] and [`Self::acquire_ref()`] methods return an [`AcquiredNode`], which
+/// acts like a smart pointer for a [`Node`]. Once a node has been acquired, it cannot be
+/// acquired again until its [`AcquiredNode`] is dropped. In the example above, a graphic element
+/// would acquire the `pattern`, which would then acquire its `rect` child, which then would fail
+/// to re-acquired the `pattern` — thus signaling a circular reference.
+///
+/// Those methods return an [`AcquireError`] to signal circular references. Also, they
+/// can return [`AcquireError::MaxReferencesExceeded`] if the aforementioned referencing limit
+/// is exceeded.
+///
+/// [lol]: https://bitbucket.org/tiran/defusedxml
+pub struct AcquiredNodes<'i> {
+ document: &'i Document,
+ num_elements_acquired: usize,
+ node_stack: Rc<RefCell<NodeStack>>,
+}
+
+impl<'i> AcquiredNodes<'i> {
+ pub fn new(document: &Document) -> AcquiredNodes<'_> {
+ AcquiredNodes {
+ document,
+ num_elements_acquired: 0,
+ node_stack: Rc::new(RefCell::new(NodeStack::new())),
+ }
+ }
+
+ pub fn lookup_image(&self, href: &str) -> Result<SharedImageSurface, LoadingError> {
+ self.document.lookup_image(href)
+ }
+
+ /// Acquires a node by its id.
+ ///
+ /// This is typically used during an "early resolution" stage, when XML `id`s are being
+ /// resolved to node references.
+ pub fn acquire(&mut self, node_id: &NodeId) -> Result<AcquiredNode, AcquireError> {
+ self.num_elements_acquired += 1;
+
+ // This is a mitigation for SVG files that try to instance a huge number of
+ // elements via <use>, recursive patterns, etc. See limits.rs for details.
+ if self.num_elements_acquired > limits::MAX_REFERENCED_ELEMENTS {
+ return Err(AcquireError::MaxReferencesExceeded);
+ }
+
+ // FIXME: callers shouldn't have to know that get_node() can initiate a file load.
+ // Maybe we should have the following stages:
+ // - load main SVG XML
+ //
+ // - load secondary SVG XML and other files like images; all document::Resources and
+ // document::Images loaded
+ //
+ // - Now that all files are loaded, resolve URL references
+ let node = self
+ .document
+ .lookup_node(node_id)
+ .ok_or_else(|| AcquireError::LinkNotFound(node_id.clone()))?;
+
+ if !node.is_element() {
+ return Err(AcquireError::InvalidLinkType(node_id.clone()));
+ }
+
+ if node.borrow_element().is_accessed_by_reference() {
+ self.acquire_ref(&node)
+ } else {
+ Ok(AcquiredNode { stack: None, node })
+ }
+ }
+
+ /// Acquires a node whose reference is already known.
+ ///
+ /// This is useful for cases where a node is initially referenced by its id with
+ /// [`Self::acquire`] and kept around for later use. During the later use, the node
+ /// needs to be re-acquired with this method. For example:
+ ///
+ /// * At an "early resolution" stage, `acquire()` a pattern by its id, and keep around its
+ /// [`Node`] reference.
+ ///
+ /// * At the drawing stage, `acquire_ref()` the pattern node that we already had, so that
+ /// its child elements that reference other paint servers will be able to detect circular
+ /// references to the pattern.
+ pub fn acquire_ref(&self, node: &Node) -> Result<AcquiredNode, AcquireError> {
+ if self.node_stack.borrow().contains(node) {
+ Err(AcquireError::CircularReference(node.clone()))
+ } else {
+ self.node_stack.borrow_mut().push(node);
+ Ok(AcquiredNode {
+ stack: Some(self.node_stack.clone()),
+ node: node.clone(),
+ })
+ }
+ }
+}
+
+/// Keeps a stack of nodes and can check if a certain node is contained in the stack
+///
+/// Sometimes parts of the code cannot plainly use the implicit stack of acquired
+/// nodes as maintained by DrawingCtx::acquire_node(), and they must keep their
+/// own stack of nodes to test for reference cycles. NodeStack can be used to do that.
+pub struct NodeStack(Vec<Node>);
+
+impl NodeStack {
+ pub fn new() -> NodeStack {
+ NodeStack(Vec::new())
+ }
+
+ pub fn push(&mut self, node: &Node) {
+ self.0.push(node.clone());
+ }
+
+ pub fn pop(&mut self) -> Option<Node> {
+ self.0.pop()
+ }
+
+ pub fn contains(&self, node: &Node) -> bool {
+ self.0.iter().any(|n| *n == *node)
+ }
+}
+
+/// Used to build a tree of SVG nodes while an XML document is being read.
+///
+/// This struct holds the document-related state while loading an SVG document from XML:
+/// the loading options, the partially-built tree of nodes, the CSS stylesheets that
+/// appear while loading the document.
+///
+/// The XML loader asks a `DocumentBuilder` to
+/// [`append_element`][DocumentBuilder::append_element],
+/// [`append_characters`][DocumentBuilder::append_characters], etc. When all the XML has
+/// been consumed, the caller can use [`build`][DocumentBuilder::build] to get a
+/// fully-loaded [`Document`].
+pub struct DocumentBuilder {
+ /// Metadata for the document's lifetime.
+ session: Session,
+
+ /// Loading options; mainly the URL resolver.
+ load_options: Arc<LoadOptions>,
+
+ /// Root node of the tree.
+ tree: Option<Node>,
+
+ /// Mapping from `id` attributes to nodes.
+ ids: HashMap<String, Node>,
+
+ /// Stylesheets defined in the document.
+ stylesheets: Vec<Stylesheet>,
+}
+
+impl DocumentBuilder {
+ pub fn new(session: Session, load_options: Arc<LoadOptions>) -> DocumentBuilder {
+ DocumentBuilder {
+ session,
+ load_options,
+ tree: None,
+ ids: HashMap::new(),
+ stylesheets: Vec::new(),
+ }
+ }
+
+ /// Adds a stylesheet in order to the document.
+ ///
+ /// Stylesheets will later be matched in the order in which they were added.
+ pub fn append_stylesheet(&mut self, stylesheet: Stylesheet) {
+ self.stylesheets.push(stylesheet);
+ }
+
+ /// Creates an element of the specified `name` as a child of `parent`.
+ ///
+ /// This is the main function to create new SVG elements while parsing XML.
+ ///
+ /// `name` is the XML element's name, for example `rect`.
+ ///
+ /// `attrs` has the XML element's attributes, e.g. cx/cy/r for `<circle cx="0" cy="0"
+ /// r="5">`.
+ ///
+ /// If `parent` is `None` it means that we are creating the root node in the tree of
+ /// elements. The code will later validate that this is indeed an `<svg>` element.
+ pub fn append_element(
+ &mut self,
+ name: &QualName,
+ attrs: Attributes,
+ parent: Option<Node>,
+ ) -> Node {
+ let node = Node::new(NodeData::new_element(&self.session, name, attrs));
+
+ if let Some(id) = node.borrow_element().get_id() {
+ // This is so we don't overwrite an existing id
+ self.ids
+ .entry(id.to_string())
+ .or_insert_with(|| node.clone());
+ }
+
+ if let Some(parent) = parent {
+ parent.append(node.clone());
+ } else if self.tree.is_none() {
+ self.tree = Some(node.clone());
+ } else {
+ panic!("The tree root has already been set");
+ }
+
+ node
+ }
+
+ /// Creates a node for an XML text element as a child of `parent`.
+ pub fn append_characters(&mut self, text: &str, parent: &mut Node) {
+ if !text.is_empty() {
+ // When the last child is a Chars node we can coalesce
+ // the text and avoid screwing up the Pango layouts
+ if let Some(child) = parent.last_child().filter(|c| c.is_chars()) {
+ child.borrow_chars().append(text);
+ } else {
+ parent.append(Node::new(NodeData::new_chars(text)));
+ };
+ }
+ }
+
+ /// Does the final validation on the `Document` being read, and returns it.
+ pub fn build(self) -> Result<Document, LoadingError> {
+ let DocumentBuilder {
+ load_options,
+ session,
+ tree,
+ ids,
+ stylesheets,
+ ..
+ } = self;
+
+ match tree {
+ Some(root) if root.is_element() => {
+ if is_element_of_type!(root, Svg) {
+ let mut document = Document {
+ tree: root,
+ session: session.clone(),
+ ids,
+ externs: RefCell::new(Resources::new()),
+ images: RefCell::new(Images::new()),
+ load_options,
+ stylesheets,
+ };
+
+ document.cascade(&[], &session);
+
+ Ok(document)
+ } else {
+ Err(LoadingError::NoSvgRoot)
+ }
+ }
+ _ => Err(LoadingError::NoSvgRoot),
+ }
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn parses_node_id() {
+ assert_eq!(
+ NodeId::parse("#foo").unwrap(),
+ NodeId::Internal("foo".to_string())
+ );
+
+ assert_eq!(
+ NodeId::parse("uri#foo").unwrap(),
+ NodeId::External("uri".to_string(), "foo".to_string())
+ );
+
+ assert!(matches!(
+ NodeId::parse("uri"),
+ Err(NodeIdError::NodeIdRequired)
+ ));
+ }
+
+ #[test]
+ fn unspecified_mime_type_yields_no_content_type() {
+ // Issue #548
+ let mime = Mime::from_str("text/plain;charset=US-ASCII").unwrap();
+ assert!(content_type_for_gdk_pixbuf(&mime).is_none());
+ }
+
+ #[test]
+ fn strips_mime_type_parameters() {
+ // Issue #699
+ let mime = Mime::from_str("image/png;charset=utf-8").unwrap();
+ assert_eq!(
+ content_type_for_gdk_pixbuf(&mime),
+ Some(String::from("image/png"))
+ );
+ }
+}
diff --git a/rsvg/src/dpi.rs b/rsvg/src/dpi.rs
new file mode 100644
index 00000000..e205ec75
--- /dev/null
+++ b/rsvg/src/dpi.rs
@@ -0,0 +1,13 @@
+//! Resolution for rendering (dots per inch = DPI).
+
+#[derive(Debug, Copy, Clone)]
+pub struct Dpi {
+ pub x: f64,
+ pub y: f64,
+}
+
+impl Dpi {
+ pub fn new(x: f64, y: f64) -> Dpi {
+ Dpi { x, y }
+ }
+}
diff --git a/rsvg/src/drawing_ctx.rs b/rsvg/src/drawing_ctx.rs
new file mode 100644
index 00000000..0bf726c3
--- /dev/null
+++ b/rsvg/src/drawing_ctx.rs
@@ -0,0 +1,2412 @@
+//! The main context structure which drives the drawing process.
+
+use float_cmp::approx_eq;
+use glib::translate::*;
+use once_cell::sync::Lazy;
+use pango::ffi::PangoMatrix;
+use pango::prelude::FontMapExt;
+use regex::{Captures, Regex};
+use std::borrow::Cow;
+use std::cell::RefCell;
+use std::convert::TryFrom;
+use std::f64::consts::*;
+use std::rc::Rc;
+use std::sync::Arc;
+
+use crate::accept_language::UserLanguage;
+use crate::aspect_ratio::AspectRatio;
+use crate::bbox::BoundingBox;
+use crate::coord_units::CoordUnits;
+use crate::document::{AcquiredNodes, NodeId};
+use crate::dpi::Dpi;
+use crate::element::{Element, ElementData};
+use crate::error::{AcquireError, ImplementationLimit, RenderingError};
+use crate::filters::{self, FilterSpec};
+use crate::float_eq_cairo::ApproxEqCairo;
+use crate::gradient::{GradientVariant, SpreadMethod, UserSpaceGradient};
+use crate::layout::{
+ Filter, Image, Layer, LayerKind, Shape, StackingContext, Stroke, Text, TextSpan,
+};
+use crate::length::*;
+use crate::marker;
+use crate::node::{CascadedValues, Node, NodeBorrow, NodeDraw};
+use crate::paint_server::{PaintSource, UserSpacePaintSource};
+use crate::path_builder::*;
+use crate::pattern::UserSpacePattern;
+use crate::properties::{
+ ClipRule, ComputedValues, FillRule, MaskType, MixBlendMode, Opacity, Overflow, PaintTarget,
+ ShapeRendering, StrokeLinecap, StrokeLinejoin, TextRendering,
+};
+use crate::rect::{rect_to_transform, IRect, Rect};
+use crate::session::Session;
+use crate::surface_utils::{
+ shared_surface::ExclusiveImageSurface, shared_surface::SharedImageSurface,
+ shared_surface::SurfaceType,
+};
+use crate::transform::{Transform, ValidTransform};
+use crate::unit_interval::UnitInterval;
+use crate::viewbox::ViewBox;
+
+/// Opaque font options for a DrawingCtx.
+///
+/// This is used for DrawingCtx::create_pango_context.
+pub struct FontOptions {
+ options: cairo::FontOptions,
+}
+
+#[derive(Debug, Copy, Clone, PartialEq)]
+pub enum ClipMode {
+ ClipToViewport,
+ NoClip,
+}
+
+/// Set path on the cairo context, or clear it.
+/// This helper object keeps track whether the path has been set already,
+/// so that it isn't recalculated every so often.
+struct PathHelper<'a> {
+ cr: &'a cairo::Context,
+ transform: ValidTransform,
+ path: &'a Path,
+ is_square_linecap: bool,
+ has_path: Option<bool>,
+}
+
+impl<'a> PathHelper<'a> {
+ pub fn new(
+ cr: &'a cairo::Context,
+ transform: ValidTransform,
+ path: &'a Path,
+ linecap: StrokeLinecap,
+ ) -> Self {
+ PathHelper {
+ cr,
+ transform,
+ path,
+ is_square_linecap: linecap == StrokeLinecap::Square,
+ has_path: None,
+ }
+ }
+
+ pub fn set(&mut self) -> Result<(), RenderingError> {
+ match self.has_path {
+ Some(false) | None => {
+ self.has_path = Some(true);
+ self.cr.set_matrix(self.transform.into());
+ self.path.to_cairo(self.cr, self.is_square_linecap)
+ }
+ Some(true) => Ok(()),
+ }
+ }
+
+ pub fn unset(&mut self) {
+ match self.has_path {
+ Some(true) | None => {
+ self.has_path = Some(false);
+ self.cr.new_path();
+ }
+ Some(false) => {}
+ }
+ }
+}
+
+/// Holds the size of the current viewport in the user's coordinate system.
+#[derive(Clone)]
+pub struct Viewport {
+ pub dpi: Dpi,
+
+ /// Corners of the current coordinate space.
+ pub vbox: ViewBox,
+
+ /// The viewport's coordinate system, or "user coordinate system" in SVG terms.
+ transform: Transform,
+}
+
+impl Viewport {
+ /// FIXME: this is just used in Handle::with_height_to_user(), and in length.rs's test suite.
+ /// Find a way to do this without involving a default identity transform.
+ pub fn new(dpi: Dpi, view_box_width: f64, view_box_height: f64) -> Viewport {
+ Viewport {
+ dpi,
+ vbox: ViewBox::from(Rect::from_size(view_box_width, view_box_height)),
+ transform: Default::default(),
+ }
+ }
+
+ /// Creates a new viewport suitable for a certain kind of units.
+ ///
+ /// For `objectBoundingBox`, CSS lengths which are in percentages
+ /// refer to the size of the current viewport. Librsvg implements
+ /// that by keeping the same current transformation matrix, and
+ /// setting a viewport size of (1.0, 1.0).
+ ///
+ /// For `userSpaceOnUse`, we just duplicate the current viewport,
+ /// since that kind of units means to use the current coordinate
+ /// system unchanged.
+ pub fn with_units(&self, units: CoordUnits) -> Viewport {
+ match units {
+ CoordUnits::ObjectBoundingBox => Viewport {
+ dpi: self.dpi,
+ vbox: ViewBox::from(Rect::from_size(1.0, 1.0)),
+ transform: self.transform,
+ },
+
+ CoordUnits::UserSpaceOnUse => Viewport {
+ dpi: self.dpi,
+ vbox: self.vbox,
+ transform: self.transform,
+ },
+ }
+ }
+
+ /// Returns a viewport with a new size for normalizing `Length` values.
+ pub fn with_view_box(&self, width: f64, height: f64) -> Viewport {
+ Viewport {
+ dpi: self.dpi,
+ vbox: ViewBox::from(Rect::from_size(width, height)),
+ transform: self.transform,
+ }
+ }
+}
+
+pub struct DrawingCtx {
+ session: Session,
+
+ initial_viewport: Viewport,
+
+ dpi: Dpi,
+
+ cr_stack: Rc<RefCell<Vec<cairo::Context>>>,
+ cr: cairo::Context,
+
+ user_language: UserLanguage,
+
+ drawsub_stack: Vec<Node>,
+
+ measuring: bool,
+ testing: bool,
+}
+
+pub enum DrawingMode {
+ LimitToStack { node: Node, root: Node },
+
+ OnlyNode(Node),
+}
+
+/// The toplevel drawing routine.
+///
+/// This creates a DrawingCtx internally and starts drawing at the specified `node`.
+pub fn draw_tree(
+ session: Session,
+ mode: DrawingMode,
+ cr: &cairo::Context,
+ viewport_rect: Rect,
+ user_language: &UserLanguage,
+ dpi: Dpi,
+ measuring: bool,
+ testing: bool,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+) -> Result<BoundingBox, RenderingError> {
+ let (drawsub_stack, node) = match mode {
+ DrawingMode::LimitToStack { node, root } => (node.ancestors().collect(), root),
+
+ DrawingMode::OnlyNode(node) => (Vec::new(), node),
+ };
+
+ let cascaded = CascadedValues::new_from_node(&node);
+
+ // Preserve the user's transform and use it for the outermost bounding box. All bounds/extents
+ // will be converted to this transform in the end.
+ let user_transform = Transform::from(cr.matrix());
+ let mut user_bbox = BoundingBox::new().with_transform(user_transform);
+
+ // https://www.w3.org/TR/SVG2/coords.html#InitialCoordinateSystem
+ //
+ // "For the outermost svg element, the SVG user agent must
+ // determine an initial viewport coordinate system and an
+ // initial user coordinate system such that the two
+ // coordinates systems are identical. The origin of both
+ // coordinate systems must be at the origin of the SVG
+ // viewport."
+ //
+ // "... the initial viewport coordinate system (and therefore
+ // the initial user coordinate system) must have its origin at
+ // the top/left of the viewport"
+
+ // Translate so (0, 0) is at the viewport's upper-left corner.
+ let transform = user_transform.pre_translate(viewport_rect.x0, viewport_rect.y0);
+
+ // Here we exit immediately if the transform is not valid, since we are in the
+ // toplevel drawing function. Downstream cases would simply not render the current
+ // element and ignore the error.
+ let valid_transform = ValidTransform::try_from(transform)?;
+ cr.set_matrix(valid_transform.into());
+
+ // Per the spec, so the viewport has (0, 0) as upper-left.
+ let viewport_rect = viewport_rect.translate((-viewport_rect.x0, -viewport_rect.y0));
+ let initial_viewport = Viewport {
+ dpi,
+ vbox: ViewBox::from(viewport_rect),
+ transform,
+ };
+
+ let mut draw_ctx = DrawingCtx::new(
+ session,
+ cr,
+ &initial_viewport,
+ user_language.clone(),
+ dpi,
+ measuring,
+ testing,
+ drawsub_stack,
+ );
+
+ let content_bbox = draw_ctx.draw_node_from_stack(
+ &node,
+ acquired_nodes,
+ &cascaded,
+ &initial_viewport,
+ false,
+ )?;
+
+ user_bbox.insert(&content_bbox);
+
+ Ok(user_bbox)
+}
+
+pub fn with_saved_cr<O, F>(cr: &cairo::Context, f: F) -> Result<O, RenderingError>
+where
+ F: FnOnce() -> Result<O, RenderingError>,
+{
+ cr.save()?;
+ match f() {
+ Ok(o) => {
+ cr.restore()?;
+ Ok(o)
+ }
+
+ Err(e) => Err(e),
+ }
+}
+
+impl Drop for DrawingCtx {
+ fn drop(&mut self) {
+ self.cr_stack.borrow_mut().pop();
+ }
+}
+
+const CAIRO_TAG_LINK: &str = "Link";
+
+impl DrawingCtx {
+ fn new(
+ session: Session,
+ cr: &cairo::Context,
+ initial_viewport: &Viewport,
+ user_language: UserLanguage,
+ dpi: Dpi,
+ measuring: bool,
+ testing: bool,
+ drawsub_stack: Vec<Node>,
+ ) -> DrawingCtx {
+ DrawingCtx {
+ session,
+ initial_viewport: initial_viewport.clone(),
+ dpi,
+ cr_stack: Rc::new(RefCell::new(Vec::new())),
+ cr: cr.clone(),
+ user_language,
+ drawsub_stack,
+ measuring,
+ testing,
+ }
+ }
+
+ /// Copies a `DrawingCtx` for temporary use on a Cairo surface.
+ ///
+ /// `DrawingCtx` maintains state using during the drawing process, and sometimes we
+ /// would like to use that same state but on a different Cairo surface and context
+ /// than the ones being used on `self`. This function copies the `self` state into a
+ /// new `DrawingCtx`, and ties the copied one to the supplied `cr`.
+ fn nested(&self, cr: cairo::Context) -> DrawingCtx {
+ let cr_stack = self.cr_stack.clone();
+
+ cr_stack.borrow_mut().push(self.cr.clone());
+
+ DrawingCtx {
+ session: self.session.clone(),
+ initial_viewport: self.initial_viewport.clone(),
+ dpi: self.dpi,
+ cr_stack,
+ cr,
+ user_language: self.user_language.clone(),
+ drawsub_stack: self.drawsub_stack.clone(),
+ measuring: self.measuring,
+ testing: self.testing,
+ }
+ }
+
+ pub fn session(&self) -> &Session {
+ &self.session
+ }
+
+ pub fn user_language(&self) -> &UserLanguage {
+ &self.user_language
+ }
+
+ pub fn toplevel_viewport(&self) -> Rect {
+ *self.initial_viewport.vbox
+ }
+
+ /// Gets the transform that will be used on the target surface,
+ /// whether using an isolated stacking context or not.
+ ///
+ /// This is only used in the text code, and we should probably try
+ /// to remove it.
+ pub fn get_transform_for_stacking_ctx(
+ &self,
+ stacking_ctx: &StackingContext,
+ clipping: bool,
+ ) -> Result<ValidTransform, RenderingError> {
+ if stacking_ctx.should_isolate() && !clipping {
+ let affines = CompositingAffines::new(
+ *self.get_transform(),
+ self.initial_viewport.transform,
+ self.cr_stack.borrow().len(),
+ );
+
+ Ok(ValidTransform::try_from(affines.for_temporary_surface)?)
+ } else {
+ Ok(self.get_transform())
+ }
+ }
+
+ pub fn is_measuring(&self) -> bool {
+ self.measuring
+ }
+
+ pub fn get_transform(&self) -> ValidTransform {
+ let t = Transform::from(self.cr.matrix());
+ ValidTransform::try_from(t)
+ .expect("Cairo should already have checked that its current transform is valid")
+ }
+
+ pub fn empty_bbox(&self) -> BoundingBox {
+ BoundingBox::new().with_transform(*self.get_transform())
+ }
+
+ fn size_for_temporary_surface(&self) -> (i32, i32) {
+ let rect = self.toplevel_viewport();
+
+ let (viewport_width, viewport_height) = (rect.width(), rect.height());
+
+ let (width, height) = self
+ .initial_viewport
+ .transform
+ .transform_distance(viewport_width, viewport_height);
+
+ // We need a size in whole pixels, so use ceil() to ensure the whole viewport fits
+ // into the temporary surface.
+ (width.ceil() as i32, height.ceil() as i32)
+ }
+
+ pub fn create_surface_for_toplevel_viewport(
+ &self,
+ ) -> Result<cairo::ImageSurface, RenderingError> {
+ let (w, h) = self.size_for_temporary_surface();
+
+ Ok(cairo::ImageSurface::create(cairo::Format::ARgb32, w, h)?)
+ }
+
+ fn create_similar_surface_for_toplevel_viewport(
+ &self,
+ surface: &cairo::Surface,
+ ) -> Result<cairo::Surface, RenderingError> {
+ let (w, h) = self.size_for_temporary_surface();
+
+ Ok(cairo::Surface::create_similar(
+ surface,
+ cairo::Content::ColorAlpha,
+ w,
+ h,
+ )?)
+ }
+
+ /// Creates a new coordinate space inside a viewport and sets a clipping rectangle.
+ ///
+ /// Note that this actually changes the `draw_ctx.cr`'s transformation to match
+ /// the new coordinate space, but the old one is not restored after the
+ /// result's `Viewport` is dropped. Thus, this function must be called
+ /// inside `with_saved_cr` or `draw_ctx.with_discrete_layer`.
+ pub fn push_new_viewport(
+ &self,
+ current_viewport: &Viewport,
+ vbox: Option<ViewBox>,
+ viewport_rect: Rect,
+ preserve_aspect_ratio: AspectRatio,
+ clip_mode: ClipMode,
+ ) -> Option<Viewport> {
+ if let ClipMode::ClipToViewport = clip_mode {
+ clip_to_rectangle(&self.cr, &viewport_rect);
+ }
+
+ preserve_aspect_ratio
+ .viewport_to_viewbox_transform(vbox, &viewport_rect)
+ .unwrap_or_else(|_e| {
+ match vbox {
+ None => unreachable!(
+ "viewport_to_viewbox_transform only returns errors when vbox != None"
+ ),
+ Some(v) => {
+ rsvg_log!(
+ self.session,
+ "ignoring viewBox ({}, {}, {}, {}) since it is not usable",
+ v.x0,
+ v.y0,
+ v.width(),
+ v.height()
+ );
+ }
+ }
+ None
+ })
+ .map(|t| {
+ self.cr.transform(t.into());
+
+ Viewport {
+ dpi: self.dpi,
+ vbox: vbox.unwrap_or(current_viewport.vbox),
+ transform: current_viewport.transform.post_transform(&t),
+ }
+ })
+ }
+
+ fn clip_to_node(
+ &mut self,
+ clip_node: &Option<Node>,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ viewport: &Viewport,
+ bbox: &BoundingBox,
+ ) -> Result<(), RenderingError> {
+ if clip_node.is_none() {
+ return Ok(());
+ }
+
+ let node = clip_node.as_ref().unwrap();
+ let units = borrow_element_as!(node, ClipPath).get_units();
+
+ if let Ok(transform) = rect_to_transform(&bbox.rect, units) {
+ let cascaded = CascadedValues::new_from_node(node);
+ let values = cascaded.get();
+
+ let node_transform = values.transform().post_transform(&transform);
+ let transform_for_clip = ValidTransform::try_from(node_transform)?;
+
+ let orig_transform = self.get_transform();
+ self.cr.transform(transform_for_clip.into());
+
+ for child in node.children().filter(|c| {
+ c.is_element() && element_can_be_used_inside_clip_path(&c.borrow_element())
+ }) {
+ child.draw(
+ acquired_nodes,
+ &CascadedValues::clone_with_node(&cascaded, &child),
+ viewport,
+ self,
+ true,
+ )?;
+ }
+
+ self.cr.clip();
+
+ self.cr.set_matrix(orig_transform.into());
+ }
+
+ Ok(())
+ }
+
+ fn generate_cairo_mask(
+ &mut self,
+ mask_node: &Node,
+ viewport: &Viewport,
+ transform: Transform,
+ bbox: &BoundingBox,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ ) -> Result<Option<cairo::ImageSurface>, RenderingError> {
+ if bbox.rect.is_none() {
+ // The node being masked is empty / doesn't have a
+ // bounding box, so there's nothing to mask!
+ return Ok(None);
+ }
+
+ let _mask_acquired = match acquired_nodes.acquire_ref(mask_node) {
+ Ok(n) => n,
+
+ Err(AcquireError::CircularReference(_)) => {
+ rsvg_log!(self.session, "circular reference in element {}", mask_node);
+ return Ok(None);
+ }
+
+ _ => unreachable!(),
+ };
+
+ let mask = borrow_element_as!(mask_node, Mask);
+
+ let bbox_rect = bbox.rect.as_ref().unwrap();
+
+ let cascaded = CascadedValues::new_from_node(mask_node);
+ let values = cascaded.get();
+
+ let mask_units = mask.get_units();
+
+ let mask_rect = {
+ let params = NormalizeParams::new(values, &viewport.with_units(mask_units));
+ mask.get_rect(&params)
+ };
+
+ let mask_element = mask_node.borrow_element();
+
+ let mask_transform = values.transform().post_transform(&transform);
+ let transform_for_mask = ValidTransform::try_from(mask_transform)?;
+
+ let mask_content_surface = self.create_surface_for_toplevel_viewport()?;
+
+ // Use a scope because mask_cr needs to release the
+ // reference to the surface before we access the pixels
+ {
+ let mask_cr = cairo::Context::new(&mask_content_surface)?;
+ mask_cr.set_matrix(transform_for_mask.into());
+
+ let bbtransform = Transform::new_unchecked(
+ bbox_rect.width(),
+ 0.0,
+ 0.0,
+ bbox_rect.height(),
+ bbox_rect.x0,
+ bbox_rect.y0,
+ );
+
+ let clip_rect = if mask_units == CoordUnits::ObjectBoundingBox {
+ bbtransform.transform_rect(&mask_rect)
+ } else {
+ mask_rect
+ };
+
+ clip_to_rectangle(&mask_cr, &clip_rect);
+
+ if mask.get_content_units() == CoordUnits::ObjectBoundingBox {
+ if bbox_rect.is_empty() {
+ return Ok(None);
+ }
+ mask_cr.transform(ValidTransform::try_from(bbtransform)?.into());
+ }
+
+ let mask_viewport = viewport.with_units(mask.get_content_units());
+
+ let mut mask_draw_ctx = self.nested(mask_cr);
+
+ let stacking_ctx = StackingContext::new(
+ self.session(),
+ acquired_nodes,
+ &mask_element,
+ Transform::identity(),
+ values,
+ );
+
+ let res = mask_draw_ctx.with_discrete_layer(
+ &stacking_ctx,
+ acquired_nodes,
+ &mask_viewport,
+ false,
+ None,
+ &mut |an, dc| mask_node.draw_children(an, &cascaded, &mask_viewport, dc, false),
+ );
+
+ res?;
+ }
+
+ let tmp = SharedImageSurface::wrap(mask_content_surface, SurfaceType::SRgb)?;
+
+ let mask_result = match values.mask_type() {
+ MaskType::Luminance => tmp.to_luminance_mask()?,
+ MaskType::Alpha => tmp.extract_alpha(IRect::from_size(tmp.width(), tmp.height()))?,
+ };
+
+ let mask = mask_result.into_image_surface()?;
+
+ Ok(Some(mask))
+ }
+
+ pub fn with_discrete_layer(
+ &mut self,
+ stacking_ctx: &StackingContext,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ viewport: &Viewport,
+ clipping: bool,
+ clip_rect: Option<Rect>,
+ draw_fn: &mut dyn FnMut(
+ &mut AcquiredNodes<'_>,
+ &mut DrawingCtx,
+ ) -> Result<BoundingBox, RenderingError>,
+ ) -> Result<BoundingBox, RenderingError> {
+ let stacking_ctx_transform = ValidTransform::try_from(stacking_ctx.transform)?;
+
+ let orig_transform = self.get_transform();
+ self.cr.transform(stacking_ctx_transform.into());
+
+ let res = if clipping {
+ draw_fn(acquired_nodes, self)
+ } else {
+ with_saved_cr(&self.cr.clone(), || {
+ if let Some(ref link_target) = stacking_ctx.link_target {
+ self.link_tag_begin(link_target);
+ }
+
+ let Opacity(UnitInterval(opacity)) = stacking_ctx.opacity;
+
+ let affine_at_start = self.get_transform();
+
+ if let Some(rect) = clip_rect {
+ clip_to_rectangle(&self.cr, &rect);
+ }
+
+ // Here we are clipping in user space, so the bbox doesn't matter
+ self.clip_to_node(
+ &stacking_ctx.clip_in_user_space,
+ acquired_nodes,
+ viewport,
+ &self.empty_bbox(),
+ )?;
+
+ let should_isolate = stacking_ctx.should_isolate();
+
+ let res = if should_isolate {
+ // Compute our assortment of affines
+
+ let affines = CompositingAffines::new(
+ *affine_at_start,
+ self.initial_viewport.transform,
+ self.cr_stack.borrow().len(),
+ );
+
+ // Create temporary surface and its cr
+
+ let cr = match stacking_ctx.filter {
+ None => cairo::Context::new(
+ &self
+ .create_similar_surface_for_toplevel_viewport(&self.cr.target())?,
+ )?,
+ Some(_) => {
+ cairo::Context::new(self.create_surface_for_toplevel_viewport()?)?
+ }
+ };
+
+ cr.set_matrix(ValidTransform::try_from(affines.for_temporary_surface)?.into());
+
+ let (source_surface, mut res, bbox) = {
+ let mut temporary_draw_ctx = self.nested(cr);
+
+ // Draw!
+
+ let res = draw_fn(acquired_nodes, &mut temporary_draw_ctx);
+
+ let bbox = if let Ok(ref bbox) = res {
+ *bbox
+ } else {
+ BoundingBox::new().with_transform(affines.for_temporary_surface)
+ };
+
+ if let Some(ref filter) = stacking_ctx.filter {
+ let surface_to_filter = SharedImageSurface::copy_from_surface(
+ &cairo::ImageSurface::try_from(temporary_draw_ctx.cr.target())
+ .unwrap(),
+ )?;
+
+ let stroke_paint_source =
+ Rc::new(filter.stroke_paint_source.to_user_space(
+ &bbox.rect,
+ viewport,
+ &filter.normalize_values,
+ ));
+ let fill_paint_source =
+ Rc::new(filter.fill_paint_source.to_user_space(
+ &bbox.rect,
+ viewport,
+ &filter.normalize_values,
+ ));
+
+ // Filter functions (like "blend()", not the <filter> element) require
+ // being resolved in userSpaceonUse units, since that is the default
+ // for primitive_units. So, get the corresponding NormalizeParams
+ // here and pass them down.
+ let user_space_params = NormalizeParams::from_values(
+ &filter.normalize_values,
+ &viewport.with_units(CoordUnits::UserSpaceOnUse),
+ );
+
+ let filtered_surface = temporary_draw_ctx
+ .run_filters(
+ viewport,
+ surface_to_filter,
+ filter,
+ acquired_nodes,
+ &stacking_ctx.element_name,
+ &user_space_params,
+ stroke_paint_source,
+ fill_paint_source,
+ bbox,
+ )?
+ .into_image_surface()?;
+
+ let generic_surface: &cairo::Surface = &filtered_surface; // deref to Surface
+
+ (generic_surface.clone(), res, bbox)
+ } else {
+ (temporary_draw_ctx.cr.target(), res, bbox)
+ }
+ };
+
+ // Set temporary surface as source
+
+ self.cr
+ .set_matrix(ValidTransform::try_from(affines.compositing)?.into());
+ self.cr.set_source_surface(&source_surface, 0.0, 0.0)?;
+
+ // Clip
+
+ self.cr.set_matrix(
+ ValidTransform::try_from(affines.outside_temporary_surface)?.into(),
+ );
+ self.clip_to_node(
+ &stacking_ctx.clip_in_object_space,
+ acquired_nodes,
+ viewport,
+ &bbox,
+ )?;
+
+ // Mask
+
+ if let Some(ref mask_node) = stacking_ctx.mask {
+ res = res.and_then(|bbox| {
+ self.generate_cairo_mask(
+ mask_node,
+ viewport,
+ affines.for_temporary_surface,
+ &bbox,
+ acquired_nodes,
+ )
+ .and_then(|mask_surf| {
+ if let Some(surf) = mask_surf {
+ self.cr.push_group();
+
+ self.cr.set_matrix(
+ ValidTransform::try_from(affines.compositing)?.into(),
+ );
+ self.cr.mask_surface(&surf, 0.0, 0.0)?;
+
+ Ok(self.cr.pop_group_to_source()?)
+ } else {
+ Ok(())
+ }
+ })
+ .map(|_: ()| bbox)
+ });
+ }
+
+ {
+ // Composite the temporary surface
+
+ self.cr
+ .set_matrix(ValidTransform::try_from(affines.compositing)?.into());
+ self.cr.set_operator(stacking_ctx.mix_blend_mode.into());
+
+ if opacity < 1.0 {
+ self.cr.paint_with_alpha(opacity)?;
+ } else {
+ self.cr.paint()?;
+ }
+ }
+
+ self.cr.set_matrix(affine_at_start.into());
+ res
+ } else {
+ draw_fn(acquired_nodes, self)
+ };
+
+ if stacking_ctx.link_target.is_some() {
+ self.link_tag_end();
+ }
+
+ res
+ })
+ };
+
+ self.cr.set_matrix(orig_transform.into());
+ res
+ }
+
+ /// Run the drawing function with the specified opacity
+ fn with_alpha(
+ &mut self,
+ opacity: UnitInterval,
+ draw_fn: &mut dyn FnMut(&mut DrawingCtx) -> Result<BoundingBox, RenderingError>,
+ ) -> Result<BoundingBox, RenderingError> {
+ let res;
+ let UnitInterval(o) = opacity;
+ if o < 1.0 {
+ self.cr.push_group();
+ res = draw_fn(self);
+ self.cr.pop_group_to_source()?;
+ self.cr.paint_with_alpha(o)?;
+ } else {
+ res = draw_fn(self);
+ }
+
+ res
+ }
+
+ /// Start a Cairo tag for PDF links
+ fn link_tag_begin(&mut self, link_target: &str) {
+ let attributes = format!("uri='{}'", escape_link_target(link_target));
+
+ let cr = self.cr.clone();
+ cr.tag_begin(CAIRO_TAG_LINK, &attributes);
+ }
+
+ /// End a Cairo tag for PDF links
+ fn link_tag_end(&mut self) {
+ self.cr.tag_end(CAIRO_TAG_LINK);
+ }
+
+ fn run_filters(
+ &mut self,
+ viewport: &Viewport,
+ surface_to_filter: SharedImageSurface,
+ filter: &Filter,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ node_name: &str,
+ user_space_params: &NormalizeParams,
+ stroke_paint_source: Rc<UserSpacePaintSource>,
+ fill_paint_source: Rc<UserSpacePaintSource>,
+ node_bbox: BoundingBox,
+ ) -> Result<SharedImageSurface, RenderingError> {
+ // We try to convert each item in the filter_list to a FilterSpec.
+ //
+ // However, the spec mentions, "If the filter references a non-existent object or
+ // the referenced object is not a filter element, then the whole filter chain is
+ // ignored." - https://www.w3.org/TR/filter-effects/#FilterProperty
+ //
+ // So, run through the filter_list and collect into a Result<Vec<FilterSpec>>.
+ // This will return an Err if any of the conversions failed.
+ let filter_specs = filter
+ .filter_list
+ .iter()
+ .map(|filter_value| {
+ filter_value.to_filter_spec(
+ acquired_nodes,
+ user_space_params,
+ filter.current_color,
+ viewport,
+ self,
+ node_name,
+ )
+ })
+ .collect::<Result<Vec<FilterSpec>, _>>();
+
+ match filter_specs {
+ Ok(specs) => {
+ // Start with the surface_to_filter, and apply each filter spec in turn;
+ // the final result is our return value.
+ specs.iter().try_fold(surface_to_filter, |surface, spec| {
+ filters::render(
+ spec,
+ stroke_paint_source.clone(),
+ fill_paint_source.clone(),
+ surface,
+ acquired_nodes,
+ self,
+ *self.get_transform(),
+ node_bbox,
+ )
+ })
+ }
+
+ Err(e) => {
+ rsvg_log!(
+ self.session,
+ "not rendering filter list on node {} because it was in error: {}",
+ node_name,
+ e
+ );
+ // just return the original surface without filtering it
+ Ok(surface_to_filter)
+ }
+ }
+ }
+
+ fn set_gradient(&mut self, gradient: &UserSpaceGradient) -> Result<(), RenderingError> {
+ let g = match gradient.variant {
+ GradientVariant::Linear { x1, y1, x2, y2 } => {
+ cairo::Gradient::clone(&cairo::LinearGradient::new(x1, y1, x2, y2))
+ }
+
+ GradientVariant::Radial {
+ cx,
+ cy,
+ r,
+ fx,
+ fy,
+ fr,
+ } => cairo::Gradient::clone(&cairo::RadialGradient::new(fx, fy, fr, cx, cy, r)),
+ };
+
+ g.set_matrix(ValidTransform::try_from(gradient.transform)?.into());
+ g.set_extend(cairo::Extend::from(gradient.spread));
+
+ for stop in &gradient.stops {
+ let UnitInterval(stop_offset) = stop.offset;
+
+ g.add_color_stop_rgba(
+ stop_offset,
+ f64::from(stop.rgba.red_f32()),
+ f64::from(stop.rgba.green_f32()),
+ f64::from(stop.rgba.blue_f32()),
+ f64::from(stop.rgba.alpha_f32()),
+ );
+ }
+
+ Ok(self.cr.set_source(&g)?)
+ }
+
+ fn set_pattern(
+ &mut self,
+ pattern: &UserSpacePattern,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ ) -> Result<bool, RenderingError> {
+ // Bail out early if the pattern has zero size, per the spec
+ if approx_eq!(f64, pattern.width, 0.0) || approx_eq!(f64, pattern.height, 0.0) {
+ return Ok(false);
+ }
+
+ // Bail out early if this pattern has a circular reference
+ let pattern_node_acquired = match pattern.acquire_pattern_node(acquired_nodes) {
+ Ok(n) => n,
+
+ Err(AcquireError::CircularReference(ref node)) => {
+ rsvg_log!(self.session, "circular reference in element {}", node);
+ return Ok(false);
+ }
+
+ _ => unreachable!(),
+ };
+
+ let pattern_node = pattern_node_acquired.get();
+
+ let taffine = self.get_transform().pre_transform(&pattern.transform);
+
+ let mut scwscale = (taffine.xx.powi(2) + taffine.xy.powi(2)).sqrt();
+ let mut schscale = (taffine.yx.powi(2) + taffine.yy.powi(2)).sqrt();
+
+ let pw: i32 = (pattern.width * scwscale) as i32;
+ let ph: i32 = (pattern.height * schscale) as i32;
+
+ if pw < 1 || ph < 1 {
+ return Ok(false);
+ }
+
+ scwscale = f64::from(pw) / pattern.width;
+ schscale = f64::from(ph) / pattern.height;
+
+ // Apply the pattern transform
+ let (affine, caffine) = if scwscale.approx_eq_cairo(1.0) && schscale.approx_eq_cairo(1.0) {
+ (pattern.coord_transform, pattern.content_transform)
+ } else {
+ (
+ pattern
+ .coord_transform
+ .pre_scale(1.0 / scwscale, 1.0 / schscale),
+ pattern.content_transform.post_scale(scwscale, schscale),
+ )
+ };
+
+ // Draw to another surface
+ let surface = self
+ .cr
+ .target()
+ .create_similar(cairo::Content::ColorAlpha, pw, ph)?;
+
+ let cr_pattern = cairo::Context::new(&surface)?;
+
+ // Set up transformations to be determined by the contents units
+
+ let transform = ValidTransform::try_from(caffine)?;
+ cr_pattern.set_matrix(transform.into());
+
+ // Draw everything
+
+ {
+ let mut pattern_draw_ctx = self.nested(cr_pattern);
+
+ let pattern_viewport = Viewport {
+ dpi: self.dpi,
+ vbox: ViewBox::from(Rect::from_size(pattern.width, pattern.height)),
+ transform: *transform,
+ };
+
+ pattern_draw_ctx
+ .with_alpha(pattern.opacity, &mut |dc| {
+ let pattern_cascaded = CascadedValues::new_from_node(pattern_node);
+ let pattern_values = pattern_cascaded.get();
+
+ let elt = pattern_node.borrow_element();
+
+ let stacking_ctx = StackingContext::new(
+ self.session(),
+ acquired_nodes,
+ &elt,
+ Transform::identity(),
+ pattern_values,
+ );
+
+ dc.with_discrete_layer(
+ &stacking_ctx,
+ acquired_nodes,
+ &pattern_viewport,
+ false,
+ None,
+ &mut |an, dc| {
+ pattern_node.draw_children(
+ an,
+ &pattern_cascaded,
+ &pattern_viewport,
+ dc,
+ false,
+ )
+ },
+ )
+ })
+ .map(|_| ())?;
+ }
+
+ // Set the final surface as a Cairo pattern into the Cairo context
+ let pattern = cairo::SurfacePattern::create(&surface);
+
+ if let Some(m) = affine.invert() {
+ pattern.set_matrix(ValidTransform::try_from(m)?.into());
+ pattern.set_extend(cairo::Extend::Repeat);
+ pattern.set_filter(cairo::Filter::Best);
+ self.cr.set_source(&pattern)?;
+ }
+
+ Ok(true)
+ }
+
+ fn set_color(&self, rgba: cssparser::RGBA) {
+ self.cr.clone().set_source_rgba(
+ f64::from(rgba.red_f32()),
+ f64::from(rgba.green_f32()),
+ f64::from(rgba.blue_f32()),
+ f64::from(rgba.alpha_f32()),
+ );
+ }
+
+ fn set_paint_source(
+ &mut self,
+ paint_source: &UserSpacePaintSource,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ ) -> Result<bool, RenderingError> {
+ match *paint_source {
+ UserSpacePaintSource::Gradient(ref gradient, _c) => {
+ self.set_gradient(gradient)?;
+ Ok(true)
+ }
+ UserSpacePaintSource::Pattern(ref pattern, c) => {
+ if self.set_pattern(pattern, acquired_nodes)? {
+ Ok(true)
+ } else if let Some(c) = c {
+ self.set_color(c);
+ Ok(true)
+ } else {
+ Ok(false)
+ }
+ }
+ UserSpacePaintSource::SolidColor(c) => {
+ self.set_color(c);
+ Ok(true)
+ }
+ UserSpacePaintSource::None => Ok(false),
+ }
+ }
+
+ /// Computes and returns a surface corresponding to the given paint server.
+ pub fn get_paint_source_surface(
+ &mut self,
+ width: i32,
+ height: i32,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ paint_source: &UserSpacePaintSource,
+ ) -> Result<SharedImageSurface, RenderingError> {
+ let mut surface = ExclusiveImageSurface::new(width, height, SurfaceType::SRgb)?;
+
+ surface.draw(&mut |cr| {
+ let mut temporary_draw_ctx = self.nested(cr);
+
+ // FIXME: we are ignoring any error
+
+ let had_paint_server =
+ temporary_draw_ctx.set_paint_source(paint_source, acquired_nodes)?;
+ if had_paint_server {
+ temporary_draw_ctx.cr.paint()?;
+ }
+
+ Ok(())
+ })?;
+
+ Ok(surface.share()?)
+ }
+
+ fn stroke(
+ &mut self,
+ cr: &cairo::Context,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ paint_source: &UserSpacePaintSource,
+ ) -> Result<(), RenderingError> {
+ let had_paint_server = self.set_paint_source(paint_source, acquired_nodes)?;
+ if had_paint_server {
+ cr.stroke_preserve()?;
+ }
+
+ Ok(())
+ }
+
+ fn fill(
+ &mut self,
+ cr: &cairo::Context,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ paint_source: &UserSpacePaintSource,
+ ) -> Result<(), RenderingError> {
+ let had_paint_server = self.set_paint_source(paint_source, acquired_nodes)?;
+ if had_paint_server {
+ cr.fill_preserve()?;
+ }
+
+ Ok(())
+ }
+
+ pub fn compute_path_extents(&self, path: &Path) -> Result<Option<Rect>, RenderingError> {
+ if path.is_empty() {
+ return Ok(None);
+ }
+
+ let surface = cairo::RecordingSurface::create(cairo::Content::ColorAlpha, None)?;
+ let cr = cairo::Context::new(&surface)?;
+
+ path.to_cairo(&cr, false)?;
+ let (x0, y0, x1, y1) = cr.path_extents()?;
+
+ Ok(Some(Rect::new(x0, y0, x1, y1)))
+ }
+
+ pub fn draw_layer(
+ &mut self,
+ layer: &Layer,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ clipping: bool,
+ viewport: &Viewport,
+ ) -> Result<BoundingBox, RenderingError> {
+ match &layer.kind {
+ LayerKind::Shape(shape) => self.draw_shape(
+ shape,
+ &layer.stacking_ctx,
+ acquired_nodes,
+ clipping,
+ viewport,
+ ),
+ LayerKind::Text(text) => self.draw_text(
+ text,
+ &layer.stacking_ctx,
+ acquired_nodes,
+ clipping,
+ viewport,
+ ),
+ LayerKind::Image(image) => self.draw_image(
+ image,
+ &layer.stacking_ctx,
+ acquired_nodes,
+ clipping,
+ viewport,
+ ),
+ }
+ }
+
+ fn draw_shape(
+ &mut self,
+ shape: &Shape,
+ stacking_ctx: &StackingContext,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ clipping: bool,
+ viewport: &Viewport,
+ ) -> Result<BoundingBox, RenderingError> {
+ if shape.extents.is_none() {
+ return Ok(self.empty_bbox());
+ }
+
+ self.with_discrete_layer(
+ stacking_ctx,
+ acquired_nodes,
+ viewport,
+ clipping,
+ None,
+ &mut |an, dc| {
+ let cr = dc.cr.clone();
+
+ let transform = dc.get_transform_for_stacking_ctx(stacking_ctx, clipping)?;
+ let mut path_helper =
+ PathHelper::new(&cr, transform, &shape.path, shape.stroke.line_cap);
+
+ if clipping {
+ if shape.is_visible {
+ cr.set_fill_rule(cairo::FillRule::from(shape.clip_rule));
+ path_helper.set()?;
+ }
+ return Ok(dc.empty_bbox());
+ }
+
+ cr.set_antialias(cairo::Antialias::from(shape.shape_rendering));
+
+ setup_cr_for_stroke(&cr, &shape.stroke);
+
+ cr.set_fill_rule(cairo::FillRule::from(shape.fill_rule));
+
+ path_helper.set()?;
+ let bbox = compute_stroke_and_fill_box(
+ &cr,
+ &shape.stroke,
+ &shape.stroke_paint,
+ &dc.initial_viewport,
+ )?;
+
+ if shape.is_visible {
+ for &target in &shape.paint_order.targets {
+ // fill and stroke operations will preserve the path.
+ // markers operation will clear the path.
+ match target {
+ PaintTarget::Fill => {
+ path_helper.set()?;
+ dc.fill(&cr, an, &shape.fill_paint)?;
+ }
+
+ PaintTarget::Stroke => {
+ path_helper.set()?;
+ let backup_matrix = if shape.stroke.non_scaling {
+ let matrix = cr.matrix();
+ cr.set_matrix(
+ ValidTransform::try_from(dc.initial_viewport.transform)?
+ .into(),
+ );
+ Some(matrix)
+ } else {
+ None
+ };
+ dc.stroke(&cr, an, &shape.stroke_paint)?;
+ if let Some(matrix) = backup_matrix {
+ cr.set_matrix(matrix);
+ }
+ }
+
+ PaintTarget::Markers => {
+ path_helper.unset();
+ marker::render_markers_for_shape(
+ shape, viewport, dc, an, clipping,
+ )?;
+ }
+ }
+ }
+ }
+
+ path_helper.unset();
+ Ok(bbox)
+ },
+ )
+ }
+
+ fn paint_surface(
+ &mut self,
+ surface: &SharedImageSurface,
+ width: f64,
+ height: f64,
+ ) -> Result<(), cairo::Error> {
+ let cr = self.cr.clone();
+
+ // We need to set extend appropriately, so can't use cr.set_source_surface().
+ //
+ // If extend is left at its default value (None), then bilinear scaling uses
+ // transparency outside of the image producing incorrect results.
+ // For example, in svg1.1/filters-blend-01-b.svgthere's a completely
+ // opaque 100×1 image of a gradient scaled to 100×98 which ends up
+ // transparent almost everywhere without this fix (which it shouldn't).
+ let ptn = surface.to_cairo_pattern();
+ ptn.set_extend(cairo::Extend::Pad);
+ cr.set_source(&ptn)?;
+
+ // Clip is needed due to extend being set to pad.
+ clip_to_rectangle(&cr, &Rect::from_size(width, height));
+
+ cr.paint()
+ }
+
+ fn draw_image(
+ &mut self,
+ image: &Image,
+ stacking_ctx: &StackingContext,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ clipping: bool,
+ viewport: &Viewport,
+ ) -> Result<BoundingBox, RenderingError> {
+ let image_width = image.surface.width();
+ let image_height = image.surface.height();
+ if clipping || image.rect.is_empty() || image_width == 0 || image_height == 0 {
+ return Ok(self.empty_bbox());
+ }
+
+ let image_width = f64::from(image_width);
+ let image_height = f64::from(image_height);
+ let vbox = ViewBox::from(Rect::from_size(image_width, image_height));
+
+ let clip_mode = if !(image.overflow == Overflow::Auto
+ || image.overflow == Overflow::Visible)
+ && image.aspect.is_slice()
+ {
+ ClipMode::ClipToViewport
+ } else {
+ ClipMode::NoClip
+ };
+
+ // The bounding box for <image> is decided by the values of the image's x, y, w, h
+ // and not by the final computed image bounds.
+ let bounds = self.empty_bbox().with_rect(image.rect);
+
+ if image.is_visible {
+ self.with_discrete_layer(
+ stacking_ctx,
+ acquired_nodes,
+ viewport, // FIXME: should this be the push_new_viewport below?
+ clipping,
+ None,
+ &mut |_an, dc| {
+ with_saved_cr(&dc.cr.clone(), || {
+ if let Some(_params) = dc.push_new_viewport(
+ viewport,
+ Some(vbox),
+ image.rect,
+ image.aspect,
+ clip_mode,
+ ) {
+ dc.paint_surface(&image.surface, image_width, image_height)?;
+ }
+
+ Ok(bounds)
+ })
+ },
+ )
+ } else {
+ Ok(bounds)
+ }
+ }
+
+ fn draw_text_span(
+ &mut self,
+ span: &TextSpan,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ clipping: bool,
+ ) -> Result<BoundingBox, RenderingError> {
+ let path = pango_layout_to_path(span.x, span.y, &span.layout, span.gravity)?;
+ if path.is_empty() {
+ // Empty strings, or only-whitespace text, get turned into empty paths.
+ // In that case, we really want to return "no bounds" rather than an
+ // empty rectangle.
+ return Ok(self.empty_bbox());
+ }
+
+ // #851 - We can't just render all text as paths for PDF; it
+ // needs the actual text content so text is selectable by PDF
+ // viewers.
+ let can_use_text_as_path = self.cr.target().type_() != cairo::SurfaceType::Pdf;
+
+ with_saved_cr(&self.cr.clone(), || {
+ self.cr
+ .set_antialias(cairo::Antialias::from(span.text_rendering));
+
+ setup_cr_for_stroke(&self.cr, &span.stroke);
+
+ if clipping {
+ path.to_cairo(&self.cr, false)?;
+ return Ok(self.empty_bbox());
+ }
+
+ path.to_cairo(&self.cr, false)?;
+ let bbox = compute_stroke_and_fill_box(
+ &self.cr,
+ &span.stroke,
+ &span.stroke_paint,
+ &self.initial_viewport,
+ )?;
+ self.cr.new_path();
+
+ if span.is_visible {
+ if let Some(ref link_target) = span.link_target {
+ self.link_tag_begin(link_target);
+ }
+
+ for &target in &span.paint_order.targets {
+ match target {
+ PaintTarget::Fill => {
+ let had_paint_server =
+ self.set_paint_source(&span.fill_paint, acquired_nodes)?;
+
+ if had_paint_server {
+ if can_use_text_as_path {
+ path.to_cairo(&self.cr, false)?;
+ self.cr.fill()?;
+ self.cr.new_path();
+ } else {
+ self.cr.move_to(span.x, span.y);
+
+ let matrix = self.cr.matrix();
+
+ let rotation_from_gravity = span.gravity.to_rotation();
+ if !rotation_from_gravity.approx_eq_cairo(0.0) {
+ self.cr.rotate(-rotation_from_gravity);
+ }
+
+ pangocairo::functions::update_layout(&self.cr, &span.layout);
+ pangocairo::functions::show_layout(&self.cr, &span.layout);
+
+ self.cr.set_matrix(matrix);
+ }
+ }
+ }
+
+ PaintTarget::Stroke => {
+ let had_paint_server =
+ self.set_paint_source(&span.stroke_paint, acquired_nodes)?;
+
+ if had_paint_server {
+ path.to_cairo(&self.cr, false)?;
+ self.cr.stroke()?;
+ self.cr.new_path();
+ }
+ }
+
+ PaintTarget::Markers => {}
+ }
+ }
+
+ if span.link_target.is_some() {
+ self.link_tag_end();
+ }
+ }
+
+ Ok(bbox)
+ })
+ }
+
+ fn draw_text(
+ &mut self,
+ text: &Text,
+ stacking_ctx: &StackingContext,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ clipping: bool,
+ viewport: &Viewport,
+ ) -> Result<BoundingBox, RenderingError> {
+ self.with_discrete_layer(
+ stacking_ctx,
+ acquired_nodes,
+ viewport,
+ clipping,
+ None,
+ &mut |an, dc| {
+ let mut bbox = dc.empty_bbox();
+
+ for span in &text.spans {
+ let span_bbox = dc.draw_text_span(span, an, clipping)?;
+ bbox.insert(&span_bbox);
+ }
+
+ Ok(bbox)
+ },
+ )
+ }
+
+ pub fn get_snapshot(
+ &self,
+ width: i32,
+ height: i32,
+ ) -> Result<SharedImageSurface, RenderingError> {
+ // TODO: as far as I can tell this should not render elements past the last (topmost) one
+ // with enable-background: new (because technically we shouldn't have been caching them).
+ // Right now there are no enable-background checks whatsoever.
+ //
+ // Addendum: SVG 2 has deprecated the enable-background property, and replaced it with an
+ // "isolation" property from the CSS Compositing and Blending spec.
+ //
+ // Deprecation:
+ // https://www.w3.org/TR/filter-effects-1/#AccessBackgroundImage
+ //
+ // BackgroundImage, BackgroundAlpha in the "in" attribute of filter primitives:
+ // https://www.w3.org/TR/filter-effects-1/#attr-valuedef-in-backgroundimage
+ //
+ // CSS Compositing and Blending, "isolation" property:
+ // https://www.w3.org/TR/compositing-1/#isolation
+ let mut surface = ExclusiveImageSurface::new(width, height, SurfaceType::SRgb)?;
+
+ surface.draw(&mut |cr| {
+ // TODO: apparently DrawingCtx.cr_stack is just a way to store pairs of
+ // (surface, transform). Can we turn it into a DrawingCtx.surface_stack
+ // instead? See what CSS isolation would like to call that; are the pairs just
+ // stacking contexts instead, or the result of rendering stacking contexts?
+ for (depth, draw) in self.cr_stack.borrow().iter().enumerate() {
+ let affines = CompositingAffines::new(
+ Transform::from(draw.matrix()),
+ self.initial_viewport.transform,
+ depth,
+ );
+
+ cr.set_matrix(ValidTransform::try_from(affines.for_snapshot)?.into());
+ cr.set_source_surface(&draw.target(), 0.0, 0.0)?;
+ cr.paint()?;
+ }
+
+ Ok(())
+ })?;
+
+ Ok(surface.share()?)
+ }
+
+ pub fn draw_node_to_surface(
+ &mut self,
+ node: &Node,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ cascaded: &CascadedValues<'_>,
+ affine: Transform,
+ width: i32,
+ height: i32,
+ ) -> Result<SharedImageSurface, RenderingError> {
+ let surface = cairo::ImageSurface::create(cairo::Format::ARgb32, width, height)?;
+
+ let save_cr = self.cr.clone();
+
+ {
+ let cr = cairo::Context::new(&surface)?;
+ cr.set_matrix(ValidTransform::try_from(affine)?.into());
+
+ self.cr = cr;
+ let viewport = Viewport {
+ dpi: self.dpi,
+ transform: affine,
+ vbox: ViewBox::from(Rect::from_size(f64::from(width), f64::from(height))),
+ };
+
+ let _ = self.draw_node_from_stack(node, acquired_nodes, cascaded, &viewport, false)?;
+ }
+
+ self.cr = save_cr;
+
+ Ok(SharedImageSurface::wrap(surface, SurfaceType::SRgb)?)
+ }
+
+ pub fn draw_node_from_stack(
+ &mut self,
+ node: &Node,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ cascaded: &CascadedValues<'_>,
+ viewport: &Viewport,
+ clipping: bool,
+ ) -> Result<BoundingBox, RenderingError> {
+ let stack_top = self.drawsub_stack.pop();
+
+ let draw = if let Some(ref top) = stack_top {
+ top == node
+ } else {
+ true
+ };
+
+ let res = if draw {
+ node.draw(acquired_nodes, cascaded, viewport, self, clipping)
+ } else {
+ Ok(self.empty_bbox())
+ };
+
+ if let Some(top) = stack_top {
+ self.drawsub_stack.push(top);
+ }
+
+ res
+ }
+
+ pub fn draw_from_use_node(
+ &mut self,
+ node: &Node,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ values: &ComputedValues,
+ use_rect: Rect,
+ link: &NodeId,
+ clipping: bool,
+ viewport: &Viewport,
+ fill_paint: Arc<PaintSource>,
+ stroke_paint: Arc<PaintSource>,
+ ) -> Result<BoundingBox, RenderingError> {
+ // <use> is an element that is used directly, unlike
+ // <pattern>, which is used through a fill="url(#...)"
+ // reference. However, <use> will always reference another
+ // element, potentially itself or an ancestor of itself (or
+ // another <use> which references the first one, etc.). So,
+ // we acquire the <use> element itself so that circular
+ // references can be caught.
+ let _self_acquired = match acquired_nodes.acquire_ref(node) {
+ Ok(n) => n,
+
+ Err(AcquireError::CircularReference(_)) => {
+ rsvg_log!(self.session, "circular reference in element {}", node);
+ return Ok(self.empty_bbox());
+ }
+
+ _ => unreachable!(),
+ };
+
+ let acquired = match acquired_nodes.acquire(link) {
+ Ok(acquired) => acquired,
+
+ Err(AcquireError::CircularReference(node)) => {
+ rsvg_log!(self.session, "circular reference in element {}", node);
+ return Ok(self.empty_bbox());
+ }
+
+ Err(AcquireError::MaxReferencesExceeded) => {
+ return Err(RenderingError::LimitExceeded(
+ ImplementationLimit::TooManyReferencedElements,
+ ));
+ }
+
+ Err(AcquireError::InvalidLinkType(_)) => unreachable!(),
+
+ Err(AcquireError::LinkNotFound(node_id)) => {
+ rsvg_log!(
+ self.session,
+ "element {} references nonexistent \"{}\"",
+ node,
+ node_id
+ );
+ return Ok(self.empty_bbox());
+ }
+ };
+
+ // width or height set to 0 disables rendering of the element
+ // https://www.w3.org/TR/SVG/struct.html#UseElementWidthAttribute
+ if use_rect.is_empty() {
+ return Ok(self.empty_bbox());
+ }
+
+ let child = acquired.get();
+
+ if clipping && !element_can_be_used_inside_use_inside_clip_path(&child.borrow_element()) {
+ return Ok(self.empty_bbox());
+ }
+
+ let orig_transform = self.get_transform();
+
+ self.cr
+ .transform(ValidTransform::try_from(values.transform())?.into());
+
+ let use_element = node.borrow_element();
+
+ let defines_a_viewport = if is_element_of_type!(child, Symbol) {
+ let symbol = borrow_element_as!(child, Symbol);
+ Some((symbol.get_viewbox(), symbol.get_preserve_aspect_ratio()))
+ } else if is_element_of_type!(child, Svg) {
+ let svg = borrow_element_as!(child, Svg);
+ Some((svg.get_viewbox(), svg.get_preserve_aspect_ratio()))
+ } else {
+ None
+ };
+
+ let res = if let Some((viewbox, preserve_aspect_ratio)) = defines_a_viewport {
+ // <symbol> and <svg> define a viewport, as described in the specification:
+ // https://www.w3.org/TR/SVG2/struct.html#UseElement
+ // https://gitlab.gnome.org/GNOME/librsvg/-/issues/875#note_1482705
+
+ let elt = child.borrow_element();
+
+ let values = elt.get_computed_values();
+
+ // FIXME: do we need to look at preserveAspectRatio.slice, like in draw_image()?
+ let clip_mode = if !values.is_overflow() {
+ ClipMode::ClipToViewport
+ } else {
+ ClipMode::NoClip
+ };
+
+ let stacking_ctx = StackingContext::new(
+ self.session(),
+ acquired_nodes,
+ &use_element,
+ Transform::identity(),
+ values,
+ );
+
+ self.with_discrete_layer(
+ &stacking_ctx,
+ acquired_nodes,
+ viewport, // FIXME: should this be the child_viewport from below?
+ clipping,
+ None,
+ &mut |an, dc| {
+ if let Some(child_viewport) = dc.push_new_viewport(
+ viewport,
+ viewbox,
+ use_rect,
+ preserve_aspect_ratio,
+ clip_mode,
+ ) {
+ child.draw_children(
+ an,
+ &CascadedValues::new_from_values(
+ child,
+ values,
+ Some(fill_paint.clone()),
+ Some(stroke_paint.clone()),
+ ),
+ &child_viewport,
+ dc,
+ clipping,
+ )
+ } else {
+ Ok(dc.empty_bbox())
+ }
+ },
+ )
+ } else {
+ // otherwise the referenced node is not a <symbol>; process it generically
+
+ let stacking_ctx = StackingContext::new(
+ self.session(),
+ acquired_nodes,
+ &use_element,
+ Transform::new_translate(use_rect.x0, use_rect.y0),
+ values,
+ );
+
+ self.with_discrete_layer(
+ &stacking_ctx,
+ acquired_nodes,
+ viewport,
+ clipping,
+ None,
+ &mut |an, dc| {
+ child.draw(
+ an,
+ &CascadedValues::new_from_values(
+ child,
+ values,
+ Some(fill_paint.clone()),
+ Some(stroke_paint.clone()),
+ ),
+ viewport,
+ dc,
+ clipping,
+ )
+ },
+ )
+ };
+
+ self.cr.set_matrix(orig_transform.into());
+
+ if let Ok(bbox) = res {
+ let mut res_bbox = BoundingBox::new().with_transform(*orig_transform);
+ res_bbox.insert(&bbox);
+ Ok(res_bbox)
+ } else {
+ res
+ }
+ }
+
+ /// Extracts the font options for the current state of the DrawingCtx.
+ ///
+ /// You can use the font options later with create_pango_context().
+ pub fn get_font_options(&self) -> FontOptions {
+ let mut options = cairo::FontOptions::new().unwrap();
+ if self.testing {
+ options.set_antialias(cairo::Antialias::Gray);
+ }
+
+ options.set_hint_style(cairo::HintStyle::None);
+ options.set_hint_metrics(cairo::HintMetrics::Off);
+
+ FontOptions { options }
+ }
+}
+
+/// Create a Pango context with a particular configuration.
+pub fn create_pango_context(font_options: &FontOptions, transform: &Transform) -> pango::Context {
+ let font_map = pangocairo::FontMap::default();
+ let context = font_map.create_context();
+
+ context.set_round_glyph_positions(false);
+
+ let pango_matrix = PangoMatrix {
+ xx: transform.xx,
+ xy: transform.xy,
+ yx: transform.yx,
+ yy: transform.yy,
+ x0: transform.x0,
+ y0: transform.y0,
+ };
+
+ let pango_matrix_ptr: *const PangoMatrix = &pango_matrix;
+
+ let matrix = unsafe { pango::Matrix::from_glib_none(pango_matrix_ptr) };
+ context.set_matrix(Some(&matrix));
+
+ pangocairo::functions::context_set_font_options(&context, Some(&font_options.options));
+
+ // Pango says this about pango_cairo_context_set_resolution():
+ //
+ // Sets the resolution for the context. This is a scale factor between
+ // points specified in a #PangoFontDescription and Cairo units. The
+ // default value is 96, meaning that a 10 point font will be 13
+ // units high. (10 * 96. / 72. = 13.3).
+ //
+ // I.e. Pango font sizes in a PangoFontDescription are in *points*, not pixels.
+ // However, we are normalizing everything to userspace units, which amount to
+ // pixels. So, we will use 72.0 here to make Pango not apply any further scaling
+ // to the size values we give it.
+ //
+ // An alternative would be to divide our font sizes by (dpi_y / 72) to effectively
+ // cancel out Pango's scaling, but it's probably better to deal with Pango-isms
+ // right here, instead of spreading them out through our Length normalization
+ // code.
+ pangocairo::functions::context_set_resolution(&context, 72.0);
+
+ context
+}
+
+/// Converts a Pango layout to a Cairo path on the specified cr starting at (x, y).
+/// Does not clear the current path first.
+fn pango_layout_to_cairo(
+ x: f64,
+ y: f64,
+ layout: &pango::Layout,
+ gravity: pango::Gravity,
+ cr: &cairo::Context,
+) {
+ let rotation_from_gravity = gravity.to_rotation();
+ let rotation = if !rotation_from_gravity.approx_eq_cairo(0.0) {
+ Some(-rotation_from_gravity)
+ } else {
+ None
+ };
+
+ cr.move_to(x, y);
+
+ let matrix = cr.matrix();
+ if let Some(rot) = rotation {
+ cr.rotate(rot);
+ }
+
+ pangocairo::functions::update_layout(cr, layout);
+ pangocairo::functions::layout_path(cr, layout);
+ cr.set_matrix(matrix);
+}
+
+/// Converts a Pango layout to a Path starting at (x, y).
+pub fn pango_layout_to_path(
+ x: f64,
+ y: f64,
+ layout: &pango::Layout,
+ gravity: pango::Gravity,
+) -> Result<Path, RenderingError> {
+ let surface = cairo::RecordingSurface::create(cairo::Content::ColorAlpha, None)?;
+ let cr = cairo::Context::new(&surface)?;
+
+ pango_layout_to_cairo(x, y, layout, gravity, &cr);
+
+ let cairo_path = cr.copy_path()?;
+ Ok(Path::from_cairo(cairo_path))
+}
+
+// https://www.w3.org/TR/css-masking-1/#ClipPathElement
+fn element_can_be_used_inside_clip_path(element: &Element) -> bool {
+ use ElementData::*;
+
+ matches!(
+ element.element_data,
+ Circle(_)
+ | Ellipse(_)
+ | Line(_)
+ | Path(_)
+ | Polygon(_)
+ | Polyline(_)
+ | Rect(_)
+ | Text(_)
+ | Use(_)
+ )
+}
+
+// https://www.w3.org/TR/css-masking-1/#ClipPathElement
+fn element_can_be_used_inside_use_inside_clip_path(element: &Element) -> bool {
+ use ElementData::*;
+
+ matches!(
+ element.element_data,
+ Circle(_) | Ellipse(_) | Line(_) | Path(_) | Polygon(_) | Polyline(_) | Rect(_) | Text(_)
+ )
+}
+
+#[derive(Debug)]
+struct CompositingAffines {
+ pub outside_temporary_surface: Transform,
+ #[allow(unused)]
+ pub initial: Transform,
+ pub for_temporary_surface: Transform,
+ pub compositing: Transform,
+ pub for_snapshot: Transform,
+}
+
+impl CompositingAffines {
+ fn new(current: Transform, initial: Transform, cr_stack_depth: usize) -> CompositingAffines {
+ let is_topmost_temporary_surface = cr_stack_depth == 0;
+
+ let initial_inverse = initial.invert().unwrap();
+
+ let outside_temporary_surface = if is_topmost_temporary_surface {
+ current
+ } else {
+ current.post_transform(&initial_inverse)
+ };
+
+ let (scale_x, scale_y) = initial.transform_distance(1.0, 1.0);
+
+ let for_temporary_surface = if is_topmost_temporary_surface {
+ current
+ .post_transform(&initial_inverse)
+ .post_scale(scale_x, scale_y)
+ } else {
+ current
+ };
+
+ let compositing = if is_topmost_temporary_surface {
+ initial.pre_scale(1.0 / scale_x, 1.0 / scale_y)
+ } else {
+ Transform::identity()
+ };
+
+ let for_snapshot = compositing.invert().unwrap();
+
+ CompositingAffines {
+ outside_temporary_surface,
+ initial,
+ for_temporary_surface,
+ compositing,
+ for_snapshot,
+ }
+ }
+}
+
+fn compute_stroke_and_fill_extents(
+ cr: &cairo::Context,
+ stroke: &Stroke,
+ stroke_paint_source: &UserSpacePaintSource,
+ initial_viewport: &Viewport,
+) -> Result<PathExtents, RenderingError> {
+ // Dropping the precision of cairo's bezier subdivision, yielding 2x
+ // _rendering_ time speedups, are these rather expensive operations
+ // really needed here? */
+ let backup_tolerance = cr.tolerance();
+ cr.set_tolerance(1.0);
+
+ // Bounding box for fill
+ //
+ // Unlike the case for stroke, for fills we always compute the bounding box.
+ // In GNOME we have SVGs for symbolic icons where each icon has a bounding
+ // rectangle with no fill and no stroke, and inside it there are the actual
+ // paths for the icon's shape. We need to be able to compute the bounding
+ // rectangle's extents, even when it has no fill nor stroke.
+
+ let (x0, y0, x1, y1) = cr.fill_extents()?;
+ let fill_extents = Some(Rect::new(x0, y0, x1, y1));
+
+ // Bounding box for stroke
+ //
+ // When presented with a line width of 0, Cairo returns a
+ // stroke_extents rectangle of (0, 0, 0, 0). This would cause the
+ // bbox to include a lone point at the origin, which is wrong, as a
+ // stroke of zero width should not be painted, per
+ // https://www.w3.org/TR/SVG2/painting.html#StrokeWidth
+ //
+ // So, see if the stroke width is 0 and just not include the stroke in the
+ // bounding box if so.
+
+ let stroke_extents = if !stroke.width.approx_eq_cairo(0.0)
+ && !matches!(stroke_paint_source, UserSpacePaintSource::None)
+ {
+ let backup_matrix = if stroke.non_scaling {
+ let matrix = cr.matrix();
+ cr.set_matrix(ValidTransform::try_from(initial_viewport.transform)?.into());
+ Some(matrix)
+ } else {
+ None
+ };
+ let (x0, y0, x1, y1) = cr.stroke_extents()?;
+ if let Some(matrix) = backup_matrix {
+ cr.set_matrix(matrix);
+ }
+ Some(Rect::new(x0, y0, x1, y1))
+ } else {
+ None
+ };
+
+ // objectBoundingBox
+
+ let (x0, y0, x1, y1) = cr.path_extents()?;
+ let path_extents = Some(Rect::new(x0, y0, x1, y1));
+
+ // restore tolerance
+
+ cr.set_tolerance(backup_tolerance);
+
+ Ok(PathExtents {
+ path_only: path_extents,
+ fill: fill_extents,
+ stroke: stroke_extents,
+ })
+}
+
+fn compute_stroke_and_fill_box(
+ cr: &cairo::Context,
+ stroke: &Stroke,
+ stroke_paint_source: &UserSpacePaintSource,
+ initial_viewport: &Viewport,
+) -> Result<BoundingBox, RenderingError> {
+ let extents =
+ compute_stroke_and_fill_extents(cr, stroke, stroke_paint_source, initial_viewport)?;
+
+ let ink_rect = match (extents.fill, extents.stroke) {
+ (None, None) => None,
+ (Some(f), None) => Some(f),
+ (None, Some(s)) => Some(s),
+ (Some(f), Some(s)) => Some(f.union(&s)),
+ };
+
+ let mut bbox = BoundingBox::new().with_transform(Transform::from(cr.matrix()));
+
+ if let Some(rect) = extents.path_only {
+ bbox = bbox.with_rect(rect);
+ }
+
+ if let Some(ink_rect) = ink_rect {
+ bbox = bbox.with_ink_rect(ink_rect);
+ }
+
+ Ok(bbox)
+}
+
+fn setup_cr_for_stroke(cr: &cairo::Context, stroke: &Stroke) {
+ cr.set_line_width(stroke.width);
+ cr.set_miter_limit(stroke.miter_limit.0);
+ cr.set_line_cap(cairo::LineCap::from(stroke.line_cap));
+ cr.set_line_join(cairo::LineJoin::from(stroke.line_join));
+
+ let total_length: f64 = stroke.dashes.iter().sum();
+
+ if total_length > 0.0 {
+ cr.set_dash(&stroke.dashes, stroke.dash_offset);
+ } else {
+ cr.set_dash(&[], 0.0);
+ }
+}
+
+/// escape quotes and backslashes with backslash
+fn escape_link_target(value: &str) -> Cow<'_, str> {
+ static REGEX: Lazy<Regex> = Lazy::new(|| Regex::new(r"['\\]").unwrap());
+
+ REGEX.replace_all(value, |caps: &Captures<'_>| {
+ match caps.get(0).unwrap().as_str() {
+ "'" => "\\'".to_owned(),
+ "\\" => "\\\\".to_owned(),
+ _ => unreachable!(),
+ }
+ })
+}
+
+fn clip_to_rectangle(cr: &cairo::Context, r: &Rect) {
+ cr.rectangle(r.x0, r.y0, r.width(), r.height());
+ cr.clip();
+}
+
+impl From<SpreadMethod> for cairo::Extend {
+ fn from(s: SpreadMethod) -> cairo::Extend {
+ match s {
+ SpreadMethod::Pad => cairo::Extend::Pad,
+ SpreadMethod::Reflect => cairo::Extend::Reflect,
+ SpreadMethod::Repeat => cairo::Extend::Repeat,
+ }
+ }
+}
+
+impl From<StrokeLinejoin> for cairo::LineJoin {
+ fn from(j: StrokeLinejoin) -> cairo::LineJoin {
+ match j {
+ StrokeLinejoin::Miter => cairo::LineJoin::Miter,
+ StrokeLinejoin::Round => cairo::LineJoin::Round,
+ StrokeLinejoin::Bevel => cairo::LineJoin::Bevel,
+ }
+ }
+}
+
+impl From<StrokeLinecap> for cairo::LineCap {
+ fn from(j: StrokeLinecap) -> cairo::LineCap {
+ match j {
+ StrokeLinecap::Butt => cairo::LineCap::Butt,
+ StrokeLinecap::Round => cairo::LineCap::Round,
+ StrokeLinecap::Square => cairo::LineCap::Square,
+ }
+ }
+}
+
+impl From<MixBlendMode> for cairo::Operator {
+ fn from(m: MixBlendMode) -> cairo::Operator {
+ use cairo::Operator;
+
+ match m {
+ MixBlendMode::Normal => Operator::Over,
+ MixBlendMode::Multiply => Operator::Multiply,
+ MixBlendMode::Screen => Operator::Screen,
+ MixBlendMode::Overlay => Operator::Overlay,
+ MixBlendMode::Darken => Operator::Darken,
+ MixBlendMode::Lighten => Operator::Lighten,
+ MixBlendMode::ColorDodge => Operator::ColorDodge,
+ MixBlendMode::ColorBurn => Operator::ColorBurn,
+ MixBlendMode::HardLight => Operator::HardLight,
+ MixBlendMode::SoftLight => Operator::SoftLight,
+ MixBlendMode::Difference => Operator::Difference,
+ MixBlendMode::Exclusion => Operator::Exclusion,
+ MixBlendMode::Hue => Operator::HslHue,
+ MixBlendMode::Saturation => Operator::HslSaturation,
+ MixBlendMode::Color => Operator::HslColor,
+ MixBlendMode::Luminosity => Operator::HslLuminosity,
+ }
+ }
+}
+
+impl From<ClipRule> for cairo::FillRule {
+ fn from(c: ClipRule) -> cairo::FillRule {
+ match c {
+ ClipRule::NonZero => cairo::FillRule::Winding,
+ ClipRule::EvenOdd => cairo::FillRule::EvenOdd,
+ }
+ }
+}
+
+impl From<FillRule> for cairo::FillRule {
+ fn from(f: FillRule) -> cairo::FillRule {
+ match f {
+ FillRule::NonZero => cairo::FillRule::Winding,
+ FillRule::EvenOdd => cairo::FillRule::EvenOdd,
+ }
+ }
+}
+
+impl From<ShapeRendering> for cairo::Antialias {
+ fn from(sr: ShapeRendering) -> cairo::Antialias {
+ match sr {
+ ShapeRendering::Auto | ShapeRendering::GeometricPrecision => cairo::Antialias::Default,
+ ShapeRendering::OptimizeSpeed | ShapeRendering::CrispEdges => cairo::Antialias::None,
+ }
+ }
+}
+
+impl From<TextRendering> for cairo::Antialias {
+ fn from(tr: TextRendering) -> cairo::Antialias {
+ match tr {
+ TextRendering::Auto
+ | TextRendering::OptimizeLegibility
+ | TextRendering::GeometricPrecision => cairo::Antialias::Default,
+ TextRendering::OptimizeSpeed => cairo::Antialias::None,
+ }
+ }
+}
+
+impl From<cairo::Matrix> for Transform {
+ #[inline]
+ fn from(m: cairo::Matrix) -> Self {
+ Self::new_unchecked(m.xx(), m.yx(), m.xy(), m.yy(), m.x0(), m.y0())
+ }
+}
+
+impl From<ValidTransform> for cairo::Matrix {
+ #[inline]
+ fn from(t: ValidTransform) -> cairo::Matrix {
+ cairo::Matrix::new(t.xx, t.yx, t.xy, t.yy, t.x0, t.y0)
+ }
+}
+
+/// Extents for a path in its current coordinate system.
+///
+/// Normally you'll want to convert this to a BoundingBox, which has knowledge about just
+/// what that coordinate system is.
+pub struct PathExtents {
+ /// Extents of the "plain", unstroked path, or `None` if the path is empty.
+ pub path_only: Option<Rect>,
+
+ /// Extents of just the fill, or `None` if the path is empty.
+ pub fill: Option<Rect>,
+
+ /// Extents for the stroked path, or `None` if the path is empty or zero-width.
+ pub stroke: Option<Rect>,
+}
+
+impl Path {
+ pub fn to_cairo(
+ &self,
+ cr: &cairo::Context,
+ is_square_linecap: bool,
+ ) -> Result<(), RenderingError> {
+ assert!(!self.is_empty());
+
+ for subpath in self.iter_subpath() {
+ // If a subpath is empty and the linecap is a square, then draw a square centered on
+ // the origin of the subpath. See #165.
+ if is_square_linecap {
+ let (x, y) = subpath.origin();
+ if subpath.is_zero_length() {
+ let stroke_size = 0.002;
+
+ cr.move_to(x - stroke_size / 2., y);
+ cr.line_to(x + stroke_size / 2., y);
+ }
+ }
+
+ for cmd in subpath.iter_commands() {
+ cmd.to_cairo(cr);
+ }
+ }
+
+ // We check the cr's status right after feeding it a new path for a few reasons:
+ //
+ // * Any of the individual path commands may cause the cr to enter an error state, for
+ // example, if they come with coordinates outside of Cairo's supported range.
+ //
+ // * The *next* call to the cr will probably be something that actually checks the status
+ // (i.e. in cairo-rs), and we don't want to panic there.
+
+ cr.status().map_err(|e| e.into())
+ }
+
+ /// Converts a `cairo::Path` to a librsvg `Path`.
+ fn from_cairo(cairo_path: cairo::Path) -> Path {
+ let mut builder = PathBuilder::default();
+
+ // Cairo has the habit of appending a MoveTo to some paths, but we don't want a
+ // path for empty text to generate that lone point. So, strip out paths composed
+ // only of MoveTo.
+
+ if !cairo_path_is_only_move_tos(&cairo_path) {
+ for segment in cairo_path.iter() {
+ match segment {
+ cairo::PathSegment::MoveTo((x, y)) => builder.move_to(x, y),
+ cairo::PathSegment::LineTo((x, y)) => builder.line_to(x, y),
+ cairo::PathSegment::CurveTo((x2, y2), (x3, y3), (x4, y4)) => {
+ builder.curve_to(x2, y2, x3, y3, x4, y4)
+ }
+ cairo::PathSegment::ClosePath => builder.close_path(),
+ }
+ }
+ }
+
+ builder.into_path()
+ }
+}
+
+fn cairo_path_is_only_move_tos(path: &cairo::Path) -> bool {
+ path.iter()
+ .all(|seg| matches!(seg, cairo::PathSegment::MoveTo((_, _))))
+}
+
+impl PathCommand {
+ fn to_cairo(&self, cr: &cairo::Context) {
+ match *self {
+ PathCommand::MoveTo(x, y) => cr.move_to(x, y),
+ PathCommand::LineTo(x, y) => cr.line_to(x, y),
+ PathCommand::CurveTo(ref curve) => curve.to_cairo(cr),
+ PathCommand::Arc(ref arc) => arc.to_cairo(cr),
+ PathCommand::ClosePath => cr.close_path(),
+ }
+ }
+}
+
+impl EllipticalArc {
+ fn to_cairo(&self, cr: &cairo::Context) {
+ match self.center_parameterization() {
+ ArcParameterization::CenterParameters {
+ center,
+ radii,
+ theta1,
+ delta_theta,
+ } => {
+ let n_segs = (delta_theta / (PI * 0.5 + 0.001)).abs().ceil() as u32;
+ let d_theta = delta_theta / f64::from(n_segs);
+
+ let mut theta = theta1;
+ for _ in 0..n_segs {
+ arc_segment(center, radii, self.x_axis_rotation, theta, theta + d_theta)
+ .to_cairo(cr);
+ theta += d_theta;
+ }
+ }
+ ArcParameterization::LineTo => {
+ let (x2, y2) = self.to;
+ cr.line_to(x2, y2);
+ }
+ ArcParameterization::Omit => {}
+ }
+ }
+}
+
+impl CubicBezierCurve {
+ fn to_cairo(&self, cr: &cairo::Context) {
+ let Self { pt1, pt2, to } = *self;
+ cr.curve_to(pt1.0, pt1.1, pt2.0, pt2.1, to.0, to.1);
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn rsvg_path_from_cairo_path() {
+ let surface = cairo::ImageSurface::create(cairo::Format::ARgb32, 10, 10).unwrap();
+ let cr = cairo::Context::new(&surface).unwrap();
+
+ cr.move_to(1.0, 2.0);
+ cr.line_to(3.0, 4.0);
+ cr.curve_to(5.0, 6.0, 7.0, 8.0, 9.0, 10.0);
+ cr.close_path();
+
+ let cairo_path = cr.copy_path().unwrap();
+ let path = Path::from_cairo(cairo_path);
+
+ assert_eq!(
+ path.iter().collect::<Vec<PathCommand>>(),
+ vec![
+ PathCommand::MoveTo(1.0, 2.0),
+ PathCommand::LineTo(3.0, 4.0),
+ PathCommand::CurveTo(CubicBezierCurve {
+ pt1: (5.0, 6.0),
+ pt2: (7.0, 8.0),
+ to: (9.0, 10.0),
+ }),
+ PathCommand::ClosePath,
+ PathCommand::MoveTo(1.0, 2.0), // cairo inserts a MoveTo after ClosePath
+ ],
+ );
+ }
+}
diff --git a/rsvg/src/element.rs b/rsvg/src/element.rs
new file mode 100644
index 00000000..77e5539c
--- /dev/null
+++ b/rsvg/src/element.rs
@@ -0,0 +1,651 @@
+//! SVG Elements.
+
+use markup5ever::{expanded_name, local_name, namespace_url, ns, QualName};
+use once_cell::sync::Lazy;
+use std::collections::{HashMap, HashSet};
+use std::fmt;
+
+use crate::accept_language::UserLanguage;
+use crate::bbox::BoundingBox;
+use crate::cond::{RequiredExtensions, RequiredFeatures, SystemLanguage};
+use crate::css::{Declaration, Origin};
+use crate::document::AcquiredNodes;
+use crate::drawing_ctx::{DrawingCtx, Viewport};
+use crate::error::*;
+use crate::filter::Filter;
+use crate::filters::{
+ blend::FeBlend,
+ color_matrix::FeColorMatrix,
+ component_transfer::{FeComponentTransfer, FeFuncA, FeFuncB, FeFuncG, FeFuncR},
+ composite::FeComposite,
+ convolve_matrix::FeConvolveMatrix,
+ displacement_map::FeDisplacementMap,
+ drop_shadow::FeDropShadow,
+ flood::FeFlood,
+ gaussian_blur::FeGaussianBlur,
+ image::FeImage,
+ lighting::{FeDiffuseLighting, FeDistantLight, FePointLight, FeSpecularLighting, FeSpotLight},
+ merge::{FeMerge, FeMergeNode},
+ morphology::FeMorphology,
+ offset::FeOffset,
+ tile::FeTile,
+ turbulence::FeTurbulence,
+ FilterEffect,
+};
+use crate::gradient::{LinearGradient, RadialGradient, Stop};
+use crate::image::Image;
+use crate::marker::Marker;
+use crate::node::*;
+use crate::pattern::Pattern;
+use crate::properties::{ComputedValues, SpecifiedValues};
+use crate::session::Session;
+use crate::shapes::{Circle, Ellipse, Line, Path, Polygon, Polyline, Rect};
+use crate::structure::{ClipPath, Group, Link, Mask, NonRendering, Svg, Switch, Symbol, Use};
+use crate::style::Style;
+use crate::text::{TRef, TSpan, Text};
+use crate::xml::Attributes;
+
+pub trait ElementTrait {
+ /// Sets per-element attributes.
+ ///
+ /// Each element is supposed to iterate the `attributes`, and parse any ones it needs.
+ /// SVG specifies that unknown attributes should be ignored, and known attributes with invalid
+ /// values should be ignored so that the attribute ends up with its "initial value".
+ ///
+ /// You can use the [`set_attribute`] function to do that.
+ fn set_attributes(&mut self, _attributes: &Attributes, _session: &Session) {}
+
+ /// Draw an element.
+ ///
+ /// Each element is supposed to draw itself as needed.
+ fn draw(
+ &self,
+ _node: &Node,
+ _acquired_nodes: &mut AcquiredNodes<'_>,
+ _cascaded: &CascadedValues<'_>,
+ _viewport: &Viewport,
+ draw_ctx: &mut DrawingCtx,
+ _clipping: bool,
+ ) -> Result<BoundingBox, RenderingError> {
+ // by default elements don't draw themselves
+ Ok(draw_ctx.empty_bbox())
+ }
+}
+
+/// Sets `dest` if `parse_result` is `Ok()`, otherwise just logs the error.
+///
+/// Implementations of the [`ElementTrait`] trait generally scan a list of attributes
+/// for the ones they can handle, and parse their string values. Per the SVG spec, an attribute
+/// with an invalid value should be ignored, and it should fall back to the default value.
+///
+/// In librsvg, those default values are set in each element's implementation of the [`Default`] trait:
+/// at element creation time, each element gets initialized to its `Default`, and then each attribute
+/// gets parsed. This function will set that attribute's value only if parsing was successful.
+///
+/// In case the `parse_result` is an error, this function will log an appropriate notice
+/// via the [`Session`].
+pub fn set_attribute<T>(dest: &mut T, parse_result: Result<T, ElementError>, session: &Session) {
+ match parse_result {
+ Ok(v) => *dest = v,
+ Err(e) => {
+ // FIXME: this does not provide a clue of what was the problematic element.
+ // We need tracking of the current parsing position to do that.
+ rsvg_log!(session, "ignoring attribute with invalid value: {}", e);
+ }
+ }
+}
+
+pub struct Element {
+ element_name: QualName,
+ attributes: Attributes,
+ specified_values: SpecifiedValues,
+ important_styles: HashSet<QualName>,
+ values: ComputedValues,
+ required_extensions: Option<RequiredExtensions>,
+ required_features: Option<RequiredFeatures>,
+ system_language: Option<SystemLanguage>,
+ pub element_data: ElementData,
+}
+
+impl fmt::Display for Element {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ write!(f, "{}", self.element_name().local)?;
+ write!(f, " id={}", self.get_id().unwrap_or("None"))?;
+ Ok(())
+ }
+}
+
+/// Parsed contents of an element node in the DOM.
+///
+/// This enum uses `Box<Foo>` in order to make each variant the size of
+/// a pointer.
+pub enum ElementData {
+ Circle(Box<Circle>),
+ ClipPath(Box<ClipPath>),
+ Ellipse(Box<Ellipse>),
+ Filter(Box<Filter>),
+ Group(Box<Group>),
+ Image(Box<Image>),
+ Line(Box<Line>),
+ LinearGradient(Box<LinearGradient>),
+ Link(Box<Link>),
+ Marker(Box<Marker>),
+ Mask(Box<Mask>),
+ NonRendering(Box<NonRendering>),
+ Path(Box<Path>),
+ Pattern(Box<Pattern>),
+ Polygon(Box<Polygon>),
+ Polyline(Box<Polyline>),
+ RadialGradient(Box<RadialGradient>),
+ Rect(Box<Rect>),
+ Stop(Box<Stop>),
+ Style(Box<Style>),
+ Svg(Box<Svg>),
+ Switch(Box<Switch>),
+ Symbol(Box<Symbol>),
+ Text(Box<Text>),
+ TRef(Box<TRef>),
+ TSpan(Box<TSpan>),
+ Use(Box<Use>),
+
+ // Filter primitives, these start with "Fe" as element names are e.g. "feBlend"
+ FeBlend(Box<FeBlend>),
+ FeColorMatrix(Box<FeColorMatrix>),
+ FeComponentTransfer(Box<FeComponentTransfer>),
+ FeComposite(Box<FeComposite>),
+ FeConvolveMatrix(Box<FeConvolveMatrix>),
+ FeDiffuseLighting(Box<FeDiffuseLighting>),
+ FeDisplacementMap(Box<FeDisplacementMap>),
+ FeDistantLight(Box<FeDistantLight>),
+ FeDropShadow(Box<FeDropShadow>),
+ FeFlood(Box<FeFlood>),
+ FeFuncA(Box<FeFuncA>),
+ FeFuncB(Box<FeFuncB>),
+ FeFuncG(Box<FeFuncG>),
+ FeFuncR(Box<FeFuncR>),
+ FeGaussianBlur(Box<FeGaussianBlur>),
+ FeImage(Box<FeImage>),
+ FeMerge(Box<FeMerge>),
+ FeMergeNode(Box<FeMergeNode>),
+ FeMorphology(Box<FeMorphology>),
+ FeOffset(Box<FeOffset>),
+ FePointLight(Box<FePointLight>),
+ FeSpecularLighting(Box<FeSpecularLighting>),
+ FeSpotLight(Box<FeSpotLight>),
+ FeTile(Box<FeTile>),
+ FeTurbulence(Box<FeTurbulence>),
+}
+
+impl Element {
+ /// Takes an XML element name and consumes a list of attribute/value pairs to create an [`Element`].
+ ///
+ /// This operation does not fail. Unknown element names simply produce a [`NonRendering`]
+ /// element.
+ pub fn new(session: &Session, name: &QualName, mut attributes: Attributes) -> Element {
+ let (create_fn, flags): (ElementDataCreateFn, ElementCreateFlags) = if name.ns == ns!(svg) {
+ match ELEMENT_CREATORS.get(name.local.as_ref()) {
+ // hack in the SVG namespace for supported element names
+ Some(&(create_fn, flags)) => (create_fn, flags),
+
+ // Whenever we encounter a element name we don't understand, represent it as a
+ // non-rendering element. This is like a group, but it doesn't do any rendering
+ // of children. The effect is that we will ignore all children of unknown elements.
+ None => (create_non_rendering, ElementCreateFlags::Default),
+ }
+ } else {
+ (create_non_rendering, ElementCreateFlags::Default)
+ };
+
+ if flags == ElementCreateFlags::IgnoreClass {
+ attributes.clear_class();
+ };
+
+ let element_data = create_fn(session, &attributes);
+
+ let mut e = Self {
+ element_name: name.clone(),
+ attributes,
+ specified_values: Default::default(),
+ important_styles: Default::default(),
+ values: Default::default(),
+ required_extensions: Default::default(),
+ required_features: Default::default(),
+ system_language: Default::default(),
+ element_data,
+ };
+
+ e.set_conditional_processing_attributes(session);
+ e.set_presentation_attributes(session);
+
+ e
+ }
+
+ pub fn element_name(&self) -> &QualName {
+ &self.element_name
+ }
+
+ pub fn get_attributes(&self) -> &Attributes {
+ &self.attributes
+ }
+
+ pub fn get_id(&self) -> Option<&str> {
+ self.attributes.get_id()
+ }
+
+ pub fn get_class(&self) -> Option<&str> {
+ self.attributes.get_class()
+ }
+
+ pub fn inherit_xml_lang(&mut self, parent: Option<Node>) {
+ self.specified_values
+ .inherit_xml_lang(&mut self.values, parent);
+ }
+
+ pub fn get_specified_values(&self) -> &SpecifiedValues {
+ &self.specified_values
+ }
+
+ pub fn get_computed_values(&self) -> &ComputedValues {
+ &self.values
+ }
+
+ pub fn set_computed_values(&mut self, values: &ComputedValues) {
+ self.values = values.clone();
+ }
+
+ pub fn get_cond(&self, user_language: &UserLanguage) -> bool {
+ self.required_extensions
+ .as_ref()
+ .map(|v| v.eval())
+ .unwrap_or(true)
+ && self
+ .required_features
+ .as_ref()
+ .map(|v| v.eval())
+ .unwrap_or(true)
+ && self
+ .system_language
+ .as_ref()
+ .map(|v| v.eval(user_language))
+ .unwrap_or(true)
+ }
+
+ fn set_conditional_processing_attributes(&mut self, session: &Session) {
+ for (attr, value) in self.attributes.iter() {
+ match attr.expanded() {
+ expanded_name!("", "requiredExtensions") => {
+ self.required_extensions = Some(RequiredExtensions::from_attribute(value));
+ }
+
+ expanded_name!("", "requiredFeatures") => {
+ self.required_features = Some(RequiredFeatures::from_attribute(value));
+ }
+
+ expanded_name!("", "systemLanguage") => {
+ self.system_language = Some(SystemLanguage::from_attribute(value, session));
+ }
+
+ _ => {}
+ }
+ }
+ }
+
+ /// Hands the `attrs` to the node's state, to apply the presentation attributes.
+ fn set_presentation_attributes(&mut self, session: &Session) {
+ self.specified_values
+ .parse_presentation_attributes(session, &self.attributes);
+ }
+
+ // Applies a style declaration to the node's specified_values
+ pub fn apply_style_declaration(&mut self, declaration: &Declaration, origin: Origin) {
+ self.specified_values.set_property_from_declaration(
+ declaration,
+ origin,
+ &mut self.important_styles,
+ );
+ }
+
+ /// Applies CSS styles from the "style" attribute
+ pub fn set_style_attribute(&mut self, session: &Session) {
+ let style = self
+ .attributes
+ .iter()
+ .find(|(attr, _)| attr.expanded() == expanded_name!("", "style"))
+ .map(|(_, value)| value);
+
+ if let Some(style) = style {
+ self.specified_values.parse_style_declarations(
+ style,
+ Origin::Author,
+ &mut self.important_styles,
+ session,
+ );
+ }
+ }
+
+ #[rustfmt::skip]
+ pub fn as_filter_effect(&self) -> Option<&dyn FilterEffect> {
+ use ElementData::*;
+
+ match &self.element_data {
+ FeBlend(fe) => Some(&**fe),
+ FeColorMatrix(fe) => Some(&**fe),
+ FeComponentTransfer(fe) => Some(&**fe),
+ FeComposite(fe) => Some(&**fe),
+ FeConvolveMatrix(fe) => Some(&**fe),
+ FeDiffuseLighting(fe) => Some(&**fe),
+ FeDisplacementMap(fe) => Some(&**fe),
+ FeDropShadow(fe) => Some(&**fe),
+ FeFlood(fe) => Some(&**fe),
+ FeGaussianBlur(fe) => Some(&**fe),
+ FeImage(fe) => Some(&**fe),
+ FeMerge(fe) => Some(&**fe),
+ FeMorphology(fe) => Some(&**fe),
+ FeOffset(fe) => Some(&**fe),
+ FeSpecularLighting(fe) => Some(&**fe),
+ FeTile(fe) => Some(&**fe),
+ FeTurbulence(fe) => Some(&**fe),
+ _ => None,
+ }
+ }
+
+ /// Returns whether an element of a particular type is only accessed by reference
+ // from other elements' attributes. The element could in turn cause other nodes
+ // to get referenced, potentially causing reference cycles.
+ pub fn is_accessed_by_reference(&self) -> bool {
+ use ElementData::*;
+
+ matches!(
+ self.element_data,
+ ClipPath(_)
+ | Filter(_)
+ | LinearGradient(_)
+ | Marker(_)
+ | Mask(_)
+ | Pattern(_)
+ | RadialGradient(_)
+ )
+ }
+
+ /// The main drawing function for elements.
+ pub fn draw(
+ &self,
+ node: &Node,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ cascaded: &CascadedValues<'_>,
+ viewport: &Viewport,
+ draw_ctx: &mut DrawingCtx,
+ clipping: bool,
+ ) -> Result<BoundingBox, RenderingError> {
+ let values = cascaded.get();
+ if values.is_displayed() {
+ self.element_data
+ .draw(node, acquired_nodes, cascaded, viewport, draw_ctx, clipping)
+ } else {
+ Ok(draw_ctx.empty_bbox())
+ }
+ }
+}
+
+impl ElementData {
+ /// Dispatcher for the draw method of concrete element implementations.
+ #[rustfmt::skip]
+ fn draw(
+ &self,
+ node: &Node,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ cascaded: &CascadedValues<'_>,
+ viewport: &Viewport,
+ draw_ctx: &mut DrawingCtx,
+ clipping: bool,
+ ) -> Result<BoundingBox, RenderingError> {
+ use ElementData::*;
+
+ let data: &dyn ElementTrait = match self {
+ Circle(d) => &**d,
+ ClipPath(d) => &**d,
+ Ellipse(d) => &**d,
+ Filter(d) => &**d,
+ Group(d) => &**d,
+ Image(d) => &**d,
+ Line(d) => &**d,
+ LinearGradient(d) => &**d,
+ Link(d) => &**d,
+ Marker(d) => &**d,
+ Mask(d) => &**d,
+ NonRendering(d) => &**d,
+ Path(d) => &**d,
+ Pattern(d) => &**d,
+ Polygon(d) => &**d,
+ Polyline(d) => &**d,
+ RadialGradient(d) => &**d,
+ Rect(d) => &**d,
+ Stop(d) => &**d,
+ Style(d) => &**d,
+ Svg(d) => &**d,
+ Switch(d) => &**d,
+ Symbol(d) => &**d,
+ Text(d) => &**d,
+ TRef(d) => &**d,
+ TSpan(d) => &**d,
+ Use(d) => &**d,
+
+ FeBlend(d) => &**d,
+ FeColorMatrix(d) => &**d,
+ FeComponentTransfer(d) => &**d,
+ FeComposite(d) => &**d,
+ FeConvolveMatrix(d) => &**d,
+ FeDiffuseLighting(d) => &**d,
+ FeDisplacementMap(d) => &**d,
+ FeDistantLight(d) => &**d,
+ FeDropShadow(d) => &**d,
+ FeFlood(d) => &**d,
+ FeFuncA(d) => &**d,
+ FeFuncB(d) => &**d,
+ FeFuncG(d) => &**d,
+ FeFuncR(d) => &**d,
+ FeGaussianBlur(d) => &**d,
+ FeImage(d) => &**d,
+ FeMerge(d) => &**d,
+ FeMergeNode(d) => &**d,
+ FeMorphology(d) => &**d,
+ FeOffset(d) => &**d,
+ FePointLight(d) => &**d,
+ FeSpecularLighting(d) => &**d,
+ FeSpotLight(d) => &**d,
+ FeTile(d) => &**d,
+ FeTurbulence(d) => &**d,
+ };
+
+ data.draw(node, acquired_nodes, cascaded, viewport, draw_ctx, clipping)
+ }
+}
+
+macro_rules! e {
+ ($name:ident, $element_type:ident) => {
+ pub fn $name(session: &Session, attributes: &Attributes) -> ElementData {
+ let mut payload = Box::<$element_type>::default();
+ payload.set_attributes(attributes, session);
+
+ ElementData::$element_type(payload)
+ }
+ };
+}
+
+#[rustfmt::skip]
+mod creators {
+ use super::*;
+
+ e!(create_circle, Circle);
+ e!(create_clip_path, ClipPath);
+ e!(create_defs, NonRendering);
+ e!(create_ellipse, Ellipse);
+ e!(create_fe_blend, FeBlend);
+ e!(create_fe_color_matrix, FeColorMatrix);
+ e!(create_fe_component_transfer, FeComponentTransfer);
+ e!(create_fe_func_a, FeFuncA);
+ e!(create_fe_func_b, FeFuncB);
+ e!(create_fe_func_g, FeFuncG);
+ e!(create_fe_func_r, FeFuncR);
+ e!(create_fe_composite, FeComposite);
+ e!(create_fe_convolve_matrix, FeConvolveMatrix);
+ e!(create_fe_diffuse_lighting, FeDiffuseLighting);
+ e!(create_fe_displacement_map, FeDisplacementMap);
+ e!(create_fe_distant_light, FeDistantLight);
+ e!(create_fe_drop_shadow, FeDropShadow);
+ e!(create_fe_flood, FeFlood);
+ e!(create_fe_gaussian_blur, FeGaussianBlur);
+ e!(create_fe_image, FeImage);
+ e!(create_fe_merge, FeMerge);
+ e!(create_fe_merge_node, FeMergeNode);
+ e!(create_fe_morphology, FeMorphology);
+ e!(create_fe_offset, FeOffset);
+ e!(create_fe_point_light, FePointLight);
+ e!(create_fe_specular_lighting, FeSpecularLighting);
+ e!(create_fe_spot_light, FeSpotLight);
+ e!(create_fe_tile, FeTile);
+ e!(create_fe_turbulence, FeTurbulence);
+ e!(create_filter, Filter);
+ e!(create_group, Group);
+ e!(create_image, Image);
+ e!(create_line, Line);
+ e!(create_linear_gradient, LinearGradient);
+ e!(create_link, Link);
+ e!(create_marker, Marker);
+ e!(create_mask, Mask);
+ e!(create_non_rendering, NonRendering);
+ e!(create_path, Path);
+ e!(create_pattern, Pattern);
+ e!(create_polygon, Polygon);
+ e!(create_polyline, Polyline);
+ e!(create_radial_gradient, RadialGradient);
+ e!(create_rect, Rect);
+ e!(create_stop, Stop);
+ e!(create_style, Style);
+ e!(create_svg, Svg);
+ e!(create_switch, Switch);
+ e!(create_symbol, Symbol);
+ e!(create_text, Text);
+ e!(create_tref, TRef);
+ e!(create_tspan, TSpan);
+ e!(create_use, Use);
+
+ /* Hack to make multiImage sort-of work
+ *
+ * disabled for now, as markup5ever doesn't have local names for
+ * multiImage, subImage, subImageRef. Maybe we can just... create them ourselves?
+ *
+ * Is multiImage even in SVG2?
+ */
+ /*
+ e!(create_multi_image, Switch);
+ e!(create_sub_image, Group);
+ e!(create_sub_image_ref, Image);
+ */
+}
+
+use creators::*;
+
+type ElementDataCreateFn = fn(session: &Session, attributes: &Attributes) -> ElementData;
+
+#[derive(Copy, Clone, PartialEq)]
+enum ElementCreateFlags {
+ Default,
+ IgnoreClass,
+}
+
+// Lines in comments are elements that we don't support.
+#[rustfmt::skip]
+static ELEMENT_CREATORS: Lazy<HashMap<&'static str, (ElementDataCreateFn, ElementCreateFlags)>> = Lazy::new(|| {
+ use ElementCreateFlags::*;
+
+ let creators_table: Vec<(&str, ElementDataCreateFn, ElementCreateFlags)> = vec![
+ // name, supports_class, create_fn
+ ("a", create_link, Default),
+ /* ("altGlyph", ), */
+ /* ("altGlyphDef", ), */
+ /* ("altGlyphItem", ), */
+ /* ("animate", ), */
+ /* ("animateColor", ), */
+ /* ("animateMotion", ), */
+ /* ("animateTransform", ), */
+ ("circle", create_circle, Default),
+ ("clipPath", create_clip_path, Default),
+ /* ("color-profile", ), */
+ /* ("cursor", ), */
+ ("defs", create_defs, Default),
+ /* ("desc", ), */
+ ("ellipse", create_ellipse, Default),
+ ("feBlend", create_fe_blend, Default),
+ ("feColorMatrix", create_fe_color_matrix, Default),
+ ("feComponentTransfer", create_fe_component_transfer, Default),
+ ("feComposite", create_fe_composite, Default),
+ ("feConvolveMatrix", create_fe_convolve_matrix, Default),
+ ("feDiffuseLighting", create_fe_diffuse_lighting, Default),
+ ("feDisplacementMap", create_fe_displacement_map, Default),
+ ("feDistantLight", create_fe_distant_light, IgnoreClass),
+ ("feDropShadow", create_fe_drop_shadow, Default),
+ ("feFuncA", create_fe_func_a, IgnoreClass),
+ ("feFuncB", create_fe_func_b, IgnoreClass),
+ ("feFuncG", create_fe_func_g, IgnoreClass),
+ ("feFuncR", create_fe_func_r, IgnoreClass),
+ ("feFlood", create_fe_flood, Default),
+ ("feGaussianBlur", create_fe_gaussian_blur, Default),
+ ("feImage", create_fe_image, Default),
+ ("feMerge", create_fe_merge, Default),
+ ("feMergeNode", create_fe_merge_node, IgnoreClass),
+ ("feMorphology", create_fe_morphology, Default),
+ ("feOffset", create_fe_offset, Default),
+ ("fePointLight", create_fe_point_light, IgnoreClass),
+ ("feSpecularLighting", create_fe_specular_lighting, Default),
+ ("feSpotLight", create_fe_spot_light, IgnoreClass),
+ ("feTile", create_fe_tile, Default),
+ ("feTurbulence", create_fe_turbulence, Default),
+ ("filter", create_filter, Default),
+ /* ("font", ), */
+ /* ("font-face", ), */
+ /* ("font-face-format", ), */
+ /* ("font-face-name", ), */
+ /* ("font-face-src", ), */
+ /* ("font-face-uri", ), */
+ /* ("foreignObject", ), */
+ ("g", create_group, Default),
+ /* ("glyph", ), */
+ /* ("glyphRef", ), */
+ /* ("hkern", ), */
+ ("image", create_image, Default),
+ ("line", create_line, Default),
+ ("linearGradient", create_linear_gradient, Default),
+ ("marker", create_marker, Default),
+ ("mask", create_mask, Default),
+ /* ("metadata", ), */
+ /* ("missing-glyph", ), */
+ /* ("mpath", ), */
+ /* ("multiImage", ), */
+ ("path", create_path, Default),
+ ("pattern", create_pattern, Default),
+ ("polygon", create_polygon, Default),
+ ("polyline", create_polyline, Default),
+ ("radialGradient", create_radial_gradient, Default),
+ ("rect", create_rect, Default),
+ /* ("script", ), */
+ /* ("set", ), */
+ ("stop", create_stop, Default),
+ ("style", create_style, IgnoreClass),
+ /* ("subImage", ), */
+ /* ("subImageRef", ), */
+ ("svg", create_svg, Default),
+ ("switch", create_switch, Default),
+ ("symbol", create_symbol, Default),
+ ("text", create_text, Default),
+ /* ("textPath", ), */
+ /* ("title", ), */
+ ("tref", create_tref, Default),
+ ("tspan", create_tspan, Default),
+ ("use", create_use, Default),
+ /* ("view", ), */
+ /* ("vkern", ), */
+ ];
+
+ creators_table.into_iter().map(|(n, c, f)| (n, (c, f))).collect()
+});
diff --git a/rsvg/src/error.rs b/rsvg/src/error.rs
new file mode 100644
index 00000000..ffa1e690
--- /dev/null
+++ b/rsvg/src/error.rs
@@ -0,0 +1,526 @@
+//! Error types.
+
+use std::error;
+use std::fmt;
+
+use cssparser::{BasicParseError, BasicParseErrorKind, ParseErrorKind, ToCss};
+use markup5ever::QualName;
+
+use crate::document::NodeId;
+use crate::io::IoError;
+use crate::limits;
+use crate::node::Node;
+
+/// A short-lived error.
+///
+/// The lifetime of the error is the same as the `cssparser::ParserInput` that
+/// was used to create a `cssparser::Parser`. That is, it is the lifetime of
+/// the string data that is being parsed.
+///
+/// The code flow will sometimes require preserving this error as a long-lived struct;
+/// see the `impl<'i, O> AttributeResultExt<O> for Result<O, ParseError<'i>>` for that
+/// purpose.
+pub type ParseError<'i> = cssparser::ParseError<'i, ValueErrorKind>;
+
+/// A simple error which refers to an attribute's value
+#[derive(Debug, Clone)]
+pub enum ValueErrorKind {
+ /// A property with the specified name was not found
+ UnknownProperty,
+
+ /// The value could not be parsed
+ Parse(String),
+
+ // The value could be parsed, but is invalid
+ Value(String),
+}
+
+impl ValueErrorKind {
+ pub fn parse_error(s: &str) -> ValueErrorKind {
+ ValueErrorKind::Parse(s.to_string())
+ }
+
+ pub fn value_error(s: &str) -> ValueErrorKind {
+ ValueErrorKind::Value(s.to_string())
+ }
+}
+
+impl fmt::Display for ValueErrorKind {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ match *self {
+ ValueErrorKind::UnknownProperty => write!(f, "unknown property name"),
+
+ ValueErrorKind::Parse(ref s) => write!(f, "parse error: {s}"),
+
+ ValueErrorKind::Value(ref s) => write!(f, "invalid value: {s}"),
+ }
+ }
+}
+
+impl<'a> From<BasicParseError<'a>> for ValueErrorKind {
+ fn from(e: BasicParseError<'_>) -> ValueErrorKind {
+ let BasicParseError { kind, .. } = e;
+
+ let msg = match kind {
+ BasicParseErrorKind::UnexpectedToken(_) => "unexpected token",
+ BasicParseErrorKind::EndOfInput => "unexpected end of input",
+ BasicParseErrorKind::AtRuleInvalid(_) => "invalid @-rule",
+ BasicParseErrorKind::AtRuleBodyInvalid => "invalid @-rule body",
+ BasicParseErrorKind::QualifiedRuleInvalid => "invalid qualified rule",
+ };
+
+ ValueErrorKind::parse_error(msg)
+ }
+}
+
+/// A complete error for an attribute and its erroneous value
+#[derive(Debug, Clone)]
+pub struct ElementError {
+ pub attr: QualName,
+ pub err: ValueErrorKind,
+}
+
+impl fmt::Display for ElementError {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ write!(f, "{:?}: {}", self.attr.expanded(), self.err)
+ }
+}
+
+/// Errors returned when looking up a resource by URL reference.
+#[derive(Debug, Clone)]
+pub enum DefsLookupErrorKind {
+ /// Error when parsing the id to lookup.
+ InvalidId,
+
+ /// Used when the public API tries to look up an external URL, which is not allowed.
+ ///
+ /// This catches the case where a public API wants to be misused to access an external
+ /// resource. For example, `SvgHandle.has_sub("https://evil.com/phone_home#element_id")` will
+ /// fail with this error.
+ CannotLookupExternalReferences,
+
+ /// For internal use only.
+ ///
+ // FIXME: this is returned internally from Handle.lookup_node(), and gets translated
+ // to Ok(false). Don't expose this internal code in the public API.
+ NotFound,
+}
+
+impl fmt::Display for DefsLookupErrorKind {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ match *self {
+ DefsLookupErrorKind::InvalidId => write!(f, "invalid id"),
+ DefsLookupErrorKind::CannotLookupExternalReferences => {
+ write!(f, "cannot lookup references to elements in external files")
+ }
+ DefsLookupErrorKind::NotFound => write!(f, "not found"),
+ }
+ }
+}
+
+/// Errors that can happen while rendering or measuring an SVG document.
+#[non_exhaustive]
+#[derive(Debug, Clone)]
+pub enum RenderingError {
+ /// An error from the rendering backend.
+ Rendering(String),
+
+ /// A particular implementation-defined limit was exceeded.
+ LimitExceeded(ImplementationLimit),
+
+ /// A non-invertible transform was generated.
+ ///
+ /// This should not be a fatal error; we should catch it and just not render
+ /// the problematic element.
+ InvalidTransform,
+
+ /// Tried to reference an SVG element that does not exist.
+ IdNotFound,
+
+ /// Tried to reference an SVG element from a fragment identifier that is incorrect.
+ InvalidId(String),
+
+ /// Not enough memory was available for rendering.
+ OutOfMemory(String),
+}
+
+impl From<DefsLookupErrorKind> for RenderingError {
+ fn from(e: DefsLookupErrorKind) -> RenderingError {
+ match e {
+ DefsLookupErrorKind::NotFound => RenderingError::IdNotFound,
+ _ => RenderingError::InvalidId(format!("{e}")),
+ }
+ }
+}
+
+impl From<InvalidTransform> for RenderingError {
+ fn from(_: InvalidTransform) -> RenderingError {
+ RenderingError::InvalidTransform
+ }
+}
+
+impl error::Error for RenderingError {}
+
+impl fmt::Display for RenderingError {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ match *self {
+ RenderingError::Rendering(ref s) => write!(f, "rendering error: {s}"),
+ RenderingError::LimitExceeded(ref l) => write!(f, "{l}"),
+ RenderingError::InvalidTransform => write!(f, "invalid transform"),
+ RenderingError::IdNotFound => write!(f, "element id not found"),
+ RenderingError::InvalidId(ref s) => write!(f, "invalid id: {s:?}"),
+ RenderingError::OutOfMemory(ref s) => write!(f, "out of memory: {s}"),
+ }
+ }
+}
+
+impl From<cairo::Error> for RenderingError {
+ fn from(e: cairo::Error) -> RenderingError {
+ RenderingError::Rendering(format!("{e:?}"))
+ }
+}
+
+/// Indicates that a transform is not invertible.
+///
+/// This generally represents an error from [`ValidTransform::try_from`], which is what we use
+/// to check affine transforms for validity.
+#[derive(Debug, PartialEq)]
+pub struct InvalidTransform;
+
+/// Errors from [`crate::document::AcquiredNodes`].
+pub enum AcquireError {
+ /// An element with the specified id was not found.
+ LinkNotFound(NodeId),
+
+ InvalidLinkType(NodeId),
+
+ /// A circular reference was detected; non-fatal error.
+ ///
+ /// Callers are expected to treat the offending element as invalid, for example
+ /// if a graphic element uses a pattern fill, but the pattern in turn includes
+ /// another graphic element that references the same pattern.
+ ///
+ /// ```xml
+ /// <pattern id="foo">
+ /// <rect width="1" height="1" fill="url(#foo)"/>
+ /// </pattern>
+ /// ```
+ CircularReference(Node),
+
+ /// Too many referenced objects were resolved; fatal error.
+ ///
+ /// Callers are expected to exit as early as possible and return an error to
+ /// the public API. See [`ImplementationLimit::TooManyReferencedElements`] for details.
+ MaxReferencesExceeded,
+}
+
+impl fmt::Display for AcquireError {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ match *self {
+ AcquireError::LinkNotFound(ref frag) => write!(f, "link not found: {frag}"),
+
+ AcquireError::InvalidLinkType(ref frag) => {
+ write!(f, "link \"{frag}\" is to object of invalid type")
+ }
+
+ AcquireError::CircularReference(ref node) => {
+ write!(f, "circular reference in node {node}")
+ }
+
+ AcquireError::MaxReferencesExceeded => {
+ write!(f, "maximum number of references exceeded")
+ }
+ }
+ }
+}
+
+/// Helper for converting `Result<O, E>` into `Result<O, ElementError>`
+///
+/// A `ElementError` requires a `QualName` that corresponds to the attribute to which the
+/// error refers, plus the actual `ValueErrorKind` that describes the error. However,
+/// parsing functions for attribute value types will want to return their own kind of
+/// error, instead of `ValueErrorKind`. If that particular error type has an `impl
+/// From<FooError> for ValueErrorKind`, then this trait helps assign attribute values in
+/// `set_atts()` methods as follows:
+///
+/// ```
+/// # use rsvg::doctest_only::AttributeResultExt;
+/// # use rsvg::doctest_only::ValueErrorKind;
+/// # use rsvg::doctest_only::ElementError;
+/// # use markup5ever::{QualName, Prefix, Namespace, LocalName};
+/// # type FooError = ValueErrorKind;
+/// fn parse_foo(value: &str) -> Result<(), FooError>
+/// # { Err(ValueErrorKind::value_error("test")) }
+///
+/// // It is assumed that there is an impl From<FooError> for ValueErrorKind
+/// # let attr = QualName::new(
+/// # Some(Prefix::from("")),
+/// # Namespace::from(""),
+/// # LocalName::from(""),
+/// # );
+/// let result = parse_foo("value").attribute(attr);
+/// assert!(result.is_err());
+/// # Ok::<(), ElementError>(())
+/// ```
+///
+/// The call to `.attribute(attr)` converts the `Result` from `parse_foo()` into a full
+/// `ElementError` with the provided `attr`.
+pub trait AttributeResultExt<O> {
+ fn attribute(self, attr: QualName) -> Result<O, ElementError>;
+}
+
+impl<O, E: Into<ValueErrorKind>> AttributeResultExt<O> for Result<O, E> {
+ fn attribute(self, attr: QualName) -> Result<O, ElementError> {
+ self.map_err(|e| e.into())
+ .map_err(|err| ElementError { attr, err })
+ }
+}
+
+/// Turns a short-lived `ParseError` into a long-lived `ElementError`
+impl<'i, O> AttributeResultExt<O> for Result<O, ParseError<'i>> {
+ fn attribute(self, attr: QualName) -> Result<O, ElementError> {
+ self.map_err(|e| {
+ // FIXME: eventually, here we'll want to preserve the location information
+
+ let ParseError {
+ kind,
+ location: _location,
+ } = e;
+
+ match kind {
+ ParseErrorKind::Basic(BasicParseErrorKind::UnexpectedToken(tok)) => {
+ let mut s = String::from("unexpected token '");
+ tok.to_css(&mut s).unwrap(); // FIXME: what do we do with a fmt::Error?
+ s.push('\'');
+
+ ElementError {
+ attr,
+ err: ValueErrorKind::Parse(s),
+ }
+ }
+
+ ParseErrorKind::Basic(BasicParseErrorKind::EndOfInput) => ElementError {
+ attr,
+ err: ValueErrorKind::parse_error("unexpected end of input"),
+ },
+
+ ParseErrorKind::Basic(_) => {
+ unreachable!("attribute parsers should not return errors for CSS rules")
+ }
+
+ ParseErrorKind::Custom(err) => ElementError { attr, err },
+ }
+ })
+ }
+}
+
+/// Errors returned when resolving an URL
+#[derive(Debug, Clone)]
+pub enum AllowedUrlError {
+ /// parsing error from `Url::parse()`
+ UrlParseError(url::ParseError),
+
+ /// A base file/uri was not set
+ BaseRequired,
+
+ /// Cannot reference a file with a different URI scheme from the base file
+ DifferentUriSchemes,
+
+ /// Some scheme we don't allow loading
+ DisallowedScheme,
+
+ /// The requested file is not in the same directory as the base file,
+ /// or in one directory below the base file.
+ NotSiblingOrChildOfBaseFile,
+
+ /// Error when obtaining the file path or the base file path
+ InvalidPath,
+
+ /// The base file cannot be the root of the file system
+ BaseIsRoot,
+
+ /// Error when canonicalizing either the file path or the base file path
+ CanonicalizationError,
+}
+
+impl fmt::Display for AllowedUrlError {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ match *self {
+ AllowedUrlError::UrlParseError(e) => write!(f, "URL parse error: {e}"),
+ AllowedUrlError::BaseRequired => write!(f, "base required"),
+ AllowedUrlError::DifferentUriSchemes => write!(f, "different URI schemes"),
+ AllowedUrlError::DisallowedScheme => write!(f, "disallowed scheme"),
+ AllowedUrlError::NotSiblingOrChildOfBaseFile => {
+ write!(f, "not sibling or child of base file")
+ }
+ AllowedUrlError::InvalidPath => write!(f, "invalid path"),
+ AllowedUrlError::BaseIsRoot => write!(f, "base is root"),
+ AllowedUrlError::CanonicalizationError => write!(f, "canonicalization error"),
+ }
+ }
+}
+
+/// Errors returned when creating a `NodeId` out of a string
+#[derive(Debug, Clone)]
+pub enum NodeIdError {
+ NodeIdRequired,
+}
+
+impl From<NodeIdError> for ValueErrorKind {
+ fn from(e: NodeIdError) -> ValueErrorKind {
+ match e {
+ NodeIdError::NodeIdRequired => {
+ ValueErrorKind::value_error("fragment identifier required")
+ }
+ }
+ }
+}
+
+/// Errors that can happen while loading an SVG document.
+///
+/// All of these codes are for unrecoverable errors that keep an SVG document from being
+/// fully loaded and parsed. Note that SVG is very lenient with respect to document
+/// structure and the syntax of CSS property values; most errors there will not lead to a
+/// `LoadingError`. To see those errors, you may want to set the `RSVG_LOG=1` environment
+/// variable.
+///
+/// I/O errors get reported in the `Glib` variant, since librsvg uses GIO internally for
+/// all input/output.
+#[non_exhaustive]
+#[derive(Debug, Clone)]
+pub enum LoadingError {
+ /// XML syntax error.
+ XmlParseError(String),
+
+ /// Not enough memory to load the document.
+ OutOfMemory(String),
+
+ /// A malformed or disallowed URL was used.
+ BadUrl,
+
+ /// An invalid stylesheet was used.
+ BadCss,
+
+ /// There is no `<svg>` root element in the XML.
+ NoSvgRoot,
+
+ /// I/O error.
+ Io(String),
+
+ /// A particular implementation-defined limit was exceeded.
+ LimitExceeded(ImplementationLimit),
+
+ /// Catch-all for loading errors.
+ Other(String),
+}
+
+/// Errors for implementation-defined limits, to mitigate malicious SVG documents.
+///
+/// These get emitted as `LoadingError::LimitExceeded` or `RenderingError::LimitExceeded`.
+/// The limits are present to mitigate malicious SVG documents which may try to exhaust
+/// all available memory, or which would use large amounts of CPU time.
+#[non_exhaustive]
+#[derive(Debug, Copy, Clone)]
+pub enum ImplementationLimit {
+ /// Document exceeded the maximum number of times that elements
+ /// can be referenced through URL fragments.
+ ///
+ /// This is a mitigation for malicious documents that attempt to
+ /// consume exponential amounts of CPU time by creating millions
+ /// of references to SVG elements. For example, the `<use>` and
+ /// `<pattern>` elements allow referencing other elements, which
+ /// can in turn reference other elements. This can be used to
+ /// create documents which would require exponential amounts of
+ /// CPU time to be rendered.
+ ///
+ /// Librsvg deals with both cases by placing a limit on how many
+ /// references will be resolved during the SVG rendering process,
+ /// that is, how many `url(#foo)` will be resolved.
+ ///
+ /// These malicious documents are similar to the XML
+ /// [billion laughs attack], but done with SVG's referencing features.
+ ///
+ /// See issues
+ /// [#323](https://gitlab.gnome.org/GNOME/librsvg/issues/323) and
+ /// [#515](https://gitlab.gnome.org/GNOME/librsvg/issues/515) for
+ /// examples for the `<use>` and `<pattern>` elements,
+ /// respectively.
+ ///
+ /// [billion laughs attack]: https://bitbucket.org/tiran/defusedxml
+ TooManyReferencedElements,
+
+ /// Document exceeded the maximum number of elements that can be loaded.
+ ///
+ /// This is a mitigation for SVG files which create millions of
+ /// elements in an attempt to exhaust memory. Librsvg does not't
+ /// allow loading more than a certain number of elements during
+ /// the initial loading process.
+ TooManyLoadedElements,
+
+ /// Document exceeded the number of attributes that can be attached to
+ /// an element.
+ ///
+ /// This is here because librsvg uses u16 to address attributes. It should
+ /// be essentially impossible to actually hit this limit, because the
+ /// number of attributes that the SVG standard ascribes meaning to are
+ /// lower than this limit.
+ TooManyAttributes,
+}
+
+impl error::Error for LoadingError {}
+
+impl fmt::Display for LoadingError {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ match *self {
+ LoadingError::XmlParseError(ref s) => write!(f, "XML parse error: {s}"),
+ LoadingError::OutOfMemory(ref s) => write!(f, "out of memory: {s}"),
+ LoadingError::BadUrl => write!(f, "invalid URL"),
+ LoadingError::BadCss => write!(f, "invalid CSS"),
+ LoadingError::NoSvgRoot => write!(f, "XML does not have <svg> root"),
+ LoadingError::Io(ref s) => write!(f, "I/O error: {s}"),
+ LoadingError::LimitExceeded(ref l) => write!(f, "{l}"),
+ LoadingError::Other(ref s) => write!(f, "{s}"),
+ }
+ }
+}
+
+impl From<glib::Error> for LoadingError {
+ fn from(e: glib::Error) -> LoadingError {
+ // FIXME: this is somewhat fishy; not all GError are I/O errors, but in librsvg
+ // most GError do come from gio. Some come from GdkPixbufLoader, though.
+ LoadingError::Io(format!("{e}"))
+ }
+}
+
+impl From<IoError> for LoadingError {
+ fn from(e: IoError) -> LoadingError {
+ match e {
+ IoError::BadDataUrl => LoadingError::BadUrl,
+ IoError::Glib(e) => LoadingError::Io(format!("{e}")),
+ }
+ }
+}
+
+impl fmt::Display for ImplementationLimit {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ match *self {
+ ImplementationLimit::TooManyReferencedElements => write!(
+ f,
+ "exceeded more than {} referenced elements",
+ limits::MAX_REFERENCED_ELEMENTS
+ ),
+
+ ImplementationLimit::TooManyLoadedElements => write!(
+ f,
+ "cannot load more than {} XML elements",
+ limits::MAX_LOADED_ELEMENTS
+ ),
+
+ ImplementationLimit::TooManyAttributes => write!(
+ f,
+ "cannot load more than {} XML attributes",
+ limits::MAX_LOADED_ATTRIBUTES
+ ),
+ }
+ }
+}
diff --git a/rsvg/src/filter.rs b/rsvg/src/filter.rs
new file mode 100644
index 00000000..7347b331
--- /dev/null
+++ b/rsvg/src/filter.rs
@@ -0,0 +1,332 @@
+//! The `filter` element.
+
+use cssparser::{Parser, RGBA};
+use markup5ever::{expanded_name, local_name, namespace_url, ns};
+use std::slice::Iter;
+
+use crate::coord_units::CoordUnits;
+use crate::document::{AcquiredNodes, NodeId};
+use crate::drawing_ctx::{DrawingCtx, Viewport};
+use crate::element::{set_attribute, ElementData, ElementTrait};
+use crate::error::ValueErrorKind;
+use crate::filter_func::FilterFunction;
+use crate::filters::{FilterResolveError, FilterSpec};
+use crate::length::*;
+use crate::node::{Node, NodeBorrow};
+use crate::parsers::{Parse, ParseValue};
+use crate::rect::Rect;
+use crate::session::Session;
+use crate::xml::Attributes;
+
+/// The <filter> node.
+pub struct Filter {
+ x: Length<Horizontal>,
+ y: Length<Vertical>,
+ width: ULength<Horizontal>,
+ height: ULength<Vertical>,
+ filter_units: CoordUnits,
+ primitive_units: CoordUnits,
+}
+
+/// A <filter> element definition in user-space coordinates.
+pub struct UserSpaceFilter {
+ pub rect: Rect,
+ pub filter_units: CoordUnits,
+ pub primitive_units: CoordUnits,
+}
+
+impl Default for Filter {
+ /// Constructs a new `Filter` with default properties.
+ fn default() -> Self {
+ Self {
+ x: Length::<Horizontal>::parse_str("-10%").unwrap(),
+ y: Length::<Vertical>::parse_str("-10%").unwrap(),
+ width: ULength::<Horizontal>::parse_str("120%").unwrap(),
+ height: ULength::<Vertical>::parse_str("120%").unwrap(),
+ filter_units: CoordUnits::ObjectBoundingBox,
+ primitive_units: CoordUnits::UserSpaceOnUse,
+ }
+ }
+}
+
+impl Filter {
+ pub fn get_filter_units(&self) -> CoordUnits {
+ self.filter_units
+ }
+
+ pub fn to_user_space(&self, params: &NormalizeParams) -> UserSpaceFilter {
+ let x = self.x.to_user(params);
+ let y = self.y.to_user(params);
+ let w = self.width.to_user(params);
+ let h = self.height.to_user(params);
+
+ let rect = Rect::new(x, y, x + w, y + h);
+
+ UserSpaceFilter {
+ rect,
+ filter_units: self.filter_units,
+ primitive_units: self.primitive_units,
+ }
+ }
+}
+
+impl ElementTrait for Filter {
+ fn set_attributes(&mut self, attrs: &Attributes, session: &Session) {
+ for (attr, value) in attrs.iter() {
+ match attr.expanded() {
+ expanded_name!("", "filterUnits") => {
+ set_attribute(&mut self.filter_units, attr.parse(value), session)
+ }
+ expanded_name!("", "x") => set_attribute(&mut self.x, attr.parse(value), session),
+ expanded_name!("", "y") => set_attribute(&mut self.y, attr.parse(value), session),
+ expanded_name!("", "width") => {
+ set_attribute(&mut self.width, attr.parse(value), session)
+ }
+ expanded_name!("", "height") => {
+ set_attribute(&mut self.height, attr.parse(value), session)
+ }
+ expanded_name!("", "primitiveUnits") => {
+ set_attribute(&mut self.primitive_units, attr.parse(value), session)
+ }
+ _ => (),
+ }
+ }
+ }
+}
+
+#[derive(Debug, Clone, PartialEq)]
+pub enum FilterValue {
+ Url(NodeId),
+ Function(FilterFunction),
+}
+
+impl FilterValue {
+ pub fn to_filter_spec(
+ &self,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ user_space_params: &NormalizeParams,
+ current_color: RGBA,
+ viewport: &Viewport,
+ draw_ctx: &DrawingCtx,
+ node_being_filtered_name: &str,
+ ) -> Result<FilterSpec, FilterResolveError> {
+ match *self {
+ FilterValue::Url(ref node_id) => filter_spec_from_filter_node(
+ acquired_nodes,
+ viewport,
+ draw_ctx,
+ node_id,
+ node_being_filtered_name,
+ ),
+
+ FilterValue::Function(ref func) => {
+ Ok(func.to_filter_spec(user_space_params, current_color))
+ }
+ }
+ }
+}
+
+/// Holds the viewport parameters for both objectBoundingBox and userSpaceOnUse units.
+///
+/// When collecting a set of filter primitives (`feFoo`) into a [`FilterSpec`], which is
+/// in user space, we need to convert each primitive's units into user space units. So,
+/// pre-compute both cases and pass them around.
+///
+/// This struct needs a better name; I didn't want to make it seem specific to filters by
+/// calling `FiltersViewport` or `FilterCollectionProcessViewport`. Maybe the
+/// original [`Viewport`] should be this struct, with both cases included...
+struct ViewportGen {
+ object_bounding_box: Viewport,
+ user_space_on_use: Viewport,
+}
+
+impl ViewportGen {
+ pub fn new(viewport: &Viewport) -> Self {
+ ViewportGen {
+ object_bounding_box: viewport.with_units(CoordUnits::ObjectBoundingBox),
+ user_space_on_use: viewport.with_units(CoordUnits::UserSpaceOnUse),
+ }
+ }
+
+ fn get(&self, units: CoordUnits) -> &Viewport {
+ match units {
+ CoordUnits::ObjectBoundingBox => &self.object_bounding_box,
+ CoordUnits::UserSpaceOnUse => &self.user_space_on_use,
+ }
+ }
+}
+
+fn extract_filter_from_filter_node(
+ filter_node: &Node,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ session: &Session,
+ filter_view_params: &ViewportGen,
+) -> Result<FilterSpec, FilterResolveError> {
+ assert!(is_element_of_type!(filter_node, Filter));
+
+ let filter_element = filter_node.borrow_element();
+
+ let user_space_filter = {
+ let filter_values = filter_element.get_computed_values();
+
+ let filter = borrow_element_as!(filter_node, Filter);
+
+ filter.to_user_space(&NormalizeParams::new(
+ filter_values,
+ filter_view_params.get(filter.get_filter_units()),
+ ))
+ };
+
+ let primitive_view_params = filter_view_params.get(user_space_filter.primitive_units);
+
+ let primitive_nodes = filter_node
+ .children()
+ .filter(|c| c.is_element())
+ // Keep only filter primitives (those that implement the Filter trait)
+ .filter(|c| c.borrow_element().as_filter_effect().is_some());
+
+ let mut user_space_primitives = Vec::new();
+
+ for primitive_node in primitive_nodes {
+ let elt = primitive_node.borrow_element();
+ let effect = elt.as_filter_effect().unwrap();
+
+ let primitive_name = format!("{primitive_node}");
+
+ let primitive_values = elt.get_computed_values();
+ let params = NormalizeParams::new(primitive_values, primitive_view_params);
+
+ let primitives = match effect.resolve(acquired_nodes, &primitive_node) {
+ Ok(primitives) => primitives,
+ Err(e) => {
+ rsvg_log!(
+ session,
+ "(filter primitive {} returned an error: {})",
+ primitive_name,
+ e
+ );
+ return Err(e);
+ }
+ };
+
+ for p in primitives {
+ user_space_primitives.push(p.into_user_space(&params));
+ }
+ }
+
+ Ok(FilterSpec {
+ user_space_filter,
+ primitives: user_space_primitives,
+ })
+}
+
+fn filter_spec_from_filter_node(
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ viewport: &Viewport,
+ draw_ctx: &DrawingCtx,
+ node_id: &NodeId,
+ node_being_filtered_name: &str,
+) -> Result<FilterSpec, FilterResolveError> {
+ let session = draw_ctx.session().clone();
+
+ let filter_view_params = ViewportGen::new(viewport);
+
+ acquired_nodes
+ .acquire(node_id)
+ .map_err(|e| {
+ rsvg_log!(
+ session,
+ "element {} will not be filtered with \"{}\": {}",
+ node_being_filtered_name,
+ node_id,
+ e
+ );
+ FilterResolveError::ReferenceToNonFilterElement
+ })
+ .and_then(|acquired| {
+ let node = acquired.get();
+
+ match *node.borrow_element_data() {
+ ElementData::Filter(_) => extract_filter_from_filter_node(
+ node,
+ acquired_nodes,
+ &session,
+ &filter_view_params,
+ ),
+
+ _ => {
+ rsvg_log!(
+ session,
+ "element {} will not be filtered since \"{}\" is not a filter",
+ node_being_filtered_name,
+ node_id,
+ );
+ Err(FilterResolveError::ReferenceToNonFilterElement)
+ }
+ }
+ })
+}
+
+#[derive(Debug, Default, Clone, PartialEq)]
+pub struct FilterValueList(Vec<FilterValue>);
+
+impl FilterValueList {
+ pub fn is_empty(&self) -> bool {
+ self.0.is_empty()
+ }
+
+ pub fn iter(&self) -> Iter<'_, FilterValue> {
+ self.0.iter()
+ }
+}
+
+impl Parse for FilterValueList {
+ fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<Self, crate::error::ParseError<'i>> {
+ let mut result = FilterValueList::default();
+
+ loop {
+ let loc = parser.current_source_location();
+
+ let filter_value = if let Ok(func) = parser.try_parse(|p| FilterFunction::parse(p)) {
+ FilterValue::Function(func)
+ } else {
+ let url = parser.expect_url()?;
+ let node_id = NodeId::parse(&url)
+ .map_err(|e| loc.new_custom_error(ValueErrorKind::from(e)))?;
+
+ FilterValue::Url(node_id)
+ };
+
+ result.0.push(filter_value);
+
+ if parser.is_exhausted() {
+ break;
+ }
+ }
+
+ Ok(result)
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn parses_filter_value_list() {
+ let n1 = NodeId::External("foo.svg".to_string(), "bar".to_string());
+ let n2 = NodeId::External("test.svg".to_string(), "baz".to_string());
+ assert_eq!(
+ FilterValueList::parse_str("url(foo.svg#bar) url(test.svg#baz)").unwrap(),
+ FilterValueList(vec![FilterValue::Url(n1), FilterValue::Url(n2)])
+ );
+ }
+
+ #[test]
+ fn detects_invalid_filter_value_list() {
+ assert!(FilterValueList::parse_str("none").is_err());
+ assert!(FilterValueList::parse_str("").is_err());
+ assert!(FilterValueList::parse_str("fail").is_err());
+ assert!(FilterValueList::parse_str("url(#test) none").is_err());
+ }
+}
diff --git a/rsvg/src/filter_func.rs b/rsvg/src/filter_func.rs
new file mode 100644
index 00000000..a6611bf8
--- /dev/null
+++ b/rsvg/src/filter_func.rs
@@ -0,0 +1,959 @@
+//! SVG2 filter function shortcuts - `blur()`, `brightness()`, etc.
+//!
+//! The `<filter>` element from SVG1.1 (also present in SVG2) uses some verbose XML to
+//! define chains of filter primitives. In SVG2, there is a shortcut form of the `filter`
+//! attribute and property, where one can simply say `filter="blur(5)"` and get the
+//! equivalent of writing a full `<filter>` with a `<feGaussianBlur>` element.
+//!
+//! This module has a type for each of the filter functions in SVG2 with the function's
+//! parameters, for example [`Blur`] stores the blur's standard deviation parameter.
+//!
+//! Those types get aggregated in the [`FilterFunction`] enum. A [`FilterFunction`] can
+//! then convert itself into a [`FilterSpec`], which is ready to be rendered on a surface.
+
+use cssparser::{Color, Parser, RGBA};
+
+use crate::angle::Angle;
+use crate::error::*;
+use crate::filter::Filter;
+use crate::filters::{
+ color_matrix::ColorMatrix,
+ component_transfer::{self, FeFuncA, FeFuncB, FeFuncCommon, FeFuncG, FeFuncR},
+ composite::{Composite, Operator},
+ flood::Flood,
+ gaussian_blur::GaussianBlur,
+ merge::{Merge, MergeNode},
+ offset::Offset,
+ FilterSpec, Input, Primitive, PrimitiveParams, ResolvedPrimitive,
+};
+use crate::length::*;
+use crate::paint_server::resolve_color;
+use crate::parsers::{CustomIdent, NumberOptionalNumber, NumberOrPercentage, Parse};
+use crate::unit_interval::UnitInterval;
+
+/// CSS Filter functions from the Filter Effects Module Level 1
+///
+/// Filter Effects 1: <https://www.w3.org/TR/filter-effects/#filter-functions>
+#[derive(Debug, Clone, PartialEq)]
+pub enum FilterFunction {
+ Blur(Blur),
+ Brightness(Brightness),
+ Contrast(Contrast),
+ DropShadow(DropShadow),
+ Grayscale(Grayscale),
+ HueRotate(HueRotate),
+ Invert(Invert),
+ Opacity(Opacity),
+ Saturate(Saturate),
+ Sepia(Sepia),
+}
+
+/// Parameters for the `blur()` filter function
+///
+/// Filter Effects 1: <https://www.w3.org/TR/filter-effects/#funcdef-filter-blur>
+#[derive(Debug, Clone, PartialEq)]
+pub struct Blur {
+ std_deviation: Option<Length<Both>>,
+}
+
+/// Parameters for the `brightness()` filter function
+///
+/// Filter Effects 1: <https://www.w3.org/TR/filter-effects/#funcdef-filter-brightness>
+#[derive(Debug, Clone, PartialEq)]
+pub struct Brightness {
+ proportion: Option<f64>,
+}
+
+/// Parameters for the `contrast()` filter function
+///
+/// Filter Effects 1: <https://www.w3.org/TR/filter-effects/#funcdef-filter-contrast>
+#[derive(Debug, Clone, PartialEq)]
+pub struct Contrast {
+ proportion: Option<f64>,
+}
+
+/// Parameters for the `drop-shadow()` filter function
+///
+/// Filter Effects 1: <https://www.w3.org/TR/filter-effects/#funcdef-filter-drop-shadow>
+#[derive(Debug, Clone, PartialEq)]
+pub struct DropShadow {
+ color: Option<Color>,
+ dx: Option<Length<Horizontal>>,
+ dy: Option<Length<Vertical>>,
+ std_deviation: Option<ULength<Both>>,
+}
+
+/// Parameters for the `grayscale()` filter function
+///
+/// Filter Effects 1: <https://www.w3.org/TR/filter-effects/#funcdef-filter-grayscale>
+#[derive(Debug, Clone, PartialEq)]
+pub struct Grayscale {
+ proportion: Option<f64>,
+}
+
+/// Parameters for the `hue-rotate()` filter function
+///
+/// Filter Effects 1: <https://www.w3.org/TR/filter-effects/#funcdef-filter-huerotate>
+#[derive(Debug, Clone, PartialEq)]
+pub struct HueRotate {
+ angle: Option<Angle>,
+}
+
+/// Parameters for the `invert()` filter function
+///
+/// Filter Effects 1: <https://www.w3.org/TR/filter-effects/#funcdef-filter-invert>
+#[derive(Debug, Clone, PartialEq)]
+pub struct Invert {
+ proportion: Option<f64>,
+}
+
+/// Parameters for the `opacity()` filter function
+///
+/// Filter Effects 1: <https://www.w3.org/TR/filter-effects/#funcdef-filter-opacity>
+#[derive(Debug, Clone, PartialEq)]
+pub struct Opacity {
+ proportion: Option<f64>,
+}
+
+/// Parameters for the `saturate()` filter function
+///
+/// Filter Effects 1: <https://www.w3.org/TR/filter-effects/#funcdef-filter-saturate>
+#[derive(Debug, Clone, PartialEq)]
+pub struct Saturate {
+ proportion: Option<f64>,
+}
+
+/// Parameters for the `sepia()` filter function
+///
+/// Filter Effects 1: <https://www.w3.org/TR/filter-effects/#funcdef-filter-sepia>
+#[derive(Debug, Clone, PartialEq)]
+pub struct Sepia {
+ proportion: Option<f64>,
+}
+
+/// Reads an optional number or percentage from the parser.
+/// Negative numbers are not allowed.
+fn parse_num_or_percentage(parser: &mut Parser<'_, '_>) -> Option<f64> {
+ match parser.try_parse(|p| NumberOrPercentage::parse(p)) {
+ Ok(NumberOrPercentage { value }) if value < 0.0 => None,
+ Ok(NumberOrPercentage { value }) => Some(value),
+ Err(_) => None,
+ }
+}
+
+/// Reads an optional number or percentage from the parser, returning a value clamped to [0, 1].
+/// Negative numbers are not allowed.
+fn parse_num_or_percentage_clamped(parser: &mut Parser<'_, '_>) -> Option<f64> {
+ parse_num_or_percentage(parser).map(|value| value.clamp(0.0, 1.0))
+}
+
+fn parse_function<'i, F>(
+ parser: &mut Parser<'i, '_>,
+ name: &str,
+ f: F,
+) -> Result<FilterFunction, ParseError<'i>>
+where
+ F: for<'tt> FnOnce(&mut Parser<'i, 'tt>) -> Result<FilterFunction, ParseError<'i>>,
+{
+ parser.expect_function_matching(name)?;
+ parser.parse_nested_block(f)
+}
+
+// This function doesn't fail, but returns a Result like the other parsers, so tell Clippy
+// about that.
+#[allow(clippy::unnecessary_wraps)]
+fn parse_blur<'i>(parser: &mut Parser<'i, '_>) -> Result<FilterFunction, ParseError<'i>> {
+ let length = parser.try_parse(|p| Length::parse(p)).ok();
+
+ Ok(FilterFunction::Blur(Blur {
+ std_deviation: length,
+ }))
+}
+
+#[allow(clippy::unnecessary_wraps)]
+fn parse_brightness<'i>(parser: &mut Parser<'i, '_>) -> Result<FilterFunction, ParseError<'i>> {
+ let proportion = parse_num_or_percentage(parser);
+
+ Ok(FilterFunction::Brightness(Brightness { proportion }))
+}
+
+#[allow(clippy::unnecessary_wraps)]
+fn parse_contrast<'i>(parser: &mut Parser<'i, '_>) -> Result<FilterFunction, ParseError<'i>> {
+ let proportion = parse_num_or_percentage(parser);
+
+ Ok(FilterFunction::Contrast(Contrast { proportion }))
+}
+#[allow(clippy::unnecessary_wraps)]
+fn parse_dropshadow<'i>(parser: &mut Parser<'i, '_>) -> Result<FilterFunction, ParseError<'i>> {
+ let mut result = DropShadow {
+ color: None,
+ dx: None,
+ dy: None,
+ std_deviation: None,
+ };
+
+ result.color = parser.try_parse(Color::parse).ok();
+
+ // if dx is provided, dy must follow and an optional std_dev must follow that.
+ if let Ok(dx) = parser.try_parse(Length::parse) {
+ result.dx = Some(dx);
+ result.dy = Some(parser.try_parse(Length::parse)?);
+ result.std_deviation = parser.try_parse(ULength::parse).ok();
+ }
+
+ let loc = parser.current_source_location();
+
+ // because the color and length arguments can be provided in either order,
+ // check again after potentially parsing lengths if the color is now provided.
+ // if a color is provided both before and after, that is an error.
+ if let Ok(c) = parser.try_parse(Color::parse) {
+ if result.color.is_some() {
+ return Err(
+ loc.new_custom_error(ValueErrorKind::Value("color already specified".to_string()))
+ );
+ } else {
+ result.color = Some(c);
+ }
+ }
+
+ Ok(FilterFunction::DropShadow(result))
+}
+
+#[allow(clippy::unnecessary_wraps)]
+fn parse_grayscale<'i>(parser: &mut Parser<'i, '_>) -> Result<FilterFunction, ParseError<'i>> {
+ let proportion = parse_num_or_percentage_clamped(parser);
+
+ Ok(FilterFunction::Grayscale(Grayscale { proportion }))
+}
+
+#[allow(clippy::unnecessary_wraps)]
+fn parse_huerotate<'i>(parser: &mut Parser<'i, '_>) -> Result<FilterFunction, ParseError<'i>> {
+ let angle = parser.try_parse(|p| Angle::parse(p)).ok();
+
+ Ok(FilterFunction::HueRotate(HueRotate { angle }))
+}
+
+#[allow(clippy::unnecessary_wraps)]
+fn parse_invert<'i>(parser: &mut Parser<'i, '_>) -> Result<FilterFunction, ParseError<'i>> {
+ let proportion = parse_num_or_percentage_clamped(parser);
+
+ Ok(FilterFunction::Invert(Invert { proportion }))
+}
+
+#[allow(clippy::unnecessary_wraps)]
+fn parse_opacity<'i>(parser: &mut Parser<'i, '_>) -> Result<FilterFunction, ParseError<'i>> {
+ let proportion = parse_num_or_percentage_clamped(parser);
+
+ Ok(FilterFunction::Opacity(Opacity { proportion }))
+}
+
+#[allow(clippy::unnecessary_wraps)]
+fn parse_saturate<'i>(parser: &mut Parser<'i, '_>) -> Result<FilterFunction, ParseError<'i>> {
+ let proportion = parse_num_or_percentage(parser);
+
+ Ok(FilterFunction::Saturate(Saturate { proportion }))
+}
+
+#[allow(clippy::unnecessary_wraps)]
+fn parse_sepia<'i>(parser: &mut Parser<'i, '_>) -> Result<FilterFunction, ParseError<'i>> {
+ let proportion = parse_num_or_percentage_clamped(parser);
+
+ Ok(FilterFunction::Sepia(Sepia { proportion }))
+}
+
+impl Blur {
+ fn to_filter_spec(&self, params: &NormalizeParams) -> FilterSpec {
+ // The 0.0 default is from the spec
+ let std_dev = self.std_deviation.map(|l| l.to_user(params)).unwrap_or(0.0);
+
+ let user_space_filter = Filter::default().to_user_space(params);
+
+ let gaussian_blur = ResolvedPrimitive {
+ primitive: Primitive::default(),
+ params: PrimitiveParams::GaussianBlur(GaussianBlur {
+ std_deviation: NumberOptionalNumber(std_dev, std_dev),
+ ..GaussianBlur::default()
+ }),
+ }
+ .into_user_space(params);
+
+ FilterSpec {
+ user_space_filter,
+ primitives: vec![gaussian_blur],
+ }
+ }
+}
+
+impl Brightness {
+ fn to_filter_spec(&self, params: &NormalizeParams) -> FilterSpec {
+ let user_space_filter = Filter::default().to_user_space(params);
+ let slope = self.proportion.unwrap_or(1.0);
+
+ let brightness = ResolvedPrimitive {
+ primitive: Primitive::default(),
+ params: PrimitiveParams::ComponentTransfer(component_transfer::ComponentTransfer {
+ functions: component_transfer::Functions {
+ r: FeFuncR(FeFuncCommon {
+ function_type: component_transfer::FunctionType::Linear,
+ slope,
+ ..FeFuncCommon::default()
+ }),
+ g: FeFuncG(FeFuncCommon {
+ function_type: component_transfer::FunctionType::Linear,
+ slope,
+ ..FeFuncCommon::default()
+ }),
+ b: FeFuncB(FeFuncCommon {
+ function_type: component_transfer::FunctionType::Linear,
+ slope,
+ ..FeFuncCommon::default()
+ }),
+ a: FeFuncA::default(),
+ },
+ ..component_transfer::ComponentTransfer::default()
+ }),
+ }
+ .into_user_space(params);
+
+ FilterSpec {
+ user_space_filter,
+ primitives: vec![brightness],
+ }
+ }
+}
+
+impl Contrast {
+ fn to_filter_spec(&self, params: &NormalizeParams) -> FilterSpec {
+ let user_space_filter = Filter::default().to_user_space(params);
+ let slope = self.proportion.unwrap_or(1.0);
+ let intercept = -(0.5 * slope) + 0.5;
+
+ let contrast = ResolvedPrimitive {
+ primitive: Primitive::default(),
+ params: PrimitiveParams::ComponentTransfer(component_transfer::ComponentTransfer {
+ functions: component_transfer::Functions {
+ r: FeFuncR(FeFuncCommon {
+ function_type: component_transfer::FunctionType::Linear,
+ slope,
+ intercept,
+ ..FeFuncCommon::default()
+ }),
+ g: FeFuncG(FeFuncCommon {
+ function_type: component_transfer::FunctionType::Linear,
+ slope,
+ intercept,
+ ..FeFuncCommon::default()
+ }),
+ b: FeFuncB(FeFuncCommon {
+ function_type: component_transfer::FunctionType::Linear,
+ slope,
+ intercept,
+ ..FeFuncCommon::default()
+ }),
+ a: FeFuncA::default(),
+ },
+ ..component_transfer::ComponentTransfer::default()
+ }),
+ }
+ .into_user_space(params);
+
+ FilterSpec {
+ user_space_filter,
+ primitives: vec![contrast],
+ }
+ }
+}
+
+/// Creates the filter primitives required for a `feDropShadow` effect.
+///
+/// Both the `drop-shadow()` filter function and the `feDropShadow` element need to create
+/// a sequence of filter primitives (blur, offset, etc.) to build the drop shadow. This
+/// function builds that sequence.
+pub fn drop_shadow_primitives(
+ dx: f64,
+ dy: f64,
+ std_deviation: NumberOptionalNumber<f64>,
+ color: RGBA,
+) -> Vec<ResolvedPrimitive> {
+ let offsetblur = CustomIdent("offsetblur".to_string());
+
+ let gaussian_blur = ResolvedPrimitive {
+ primitive: Primitive::default(),
+ params: PrimitiveParams::GaussianBlur(GaussianBlur {
+ in1: Input::SourceAlpha,
+ std_deviation,
+ ..GaussianBlur::default()
+ }),
+ };
+
+ let offset = ResolvedPrimitive {
+ primitive: Primitive {
+ result: Some(offsetblur.clone()),
+ ..Primitive::default()
+ },
+ params: PrimitiveParams::Offset(Offset {
+ in1: Input::default(),
+ dx,
+ dy,
+ }),
+ };
+
+ let flood = ResolvedPrimitive {
+ primitive: Primitive::default(),
+ params: PrimitiveParams::Flood(Flood { color }),
+ };
+
+ let composite = ResolvedPrimitive {
+ primitive: Primitive::default(),
+ params: PrimitiveParams::Composite(Composite {
+ in2: Input::FilterOutput(offsetblur),
+ operator: Operator::In,
+ ..Composite::default()
+ }),
+ };
+
+ let merge = ResolvedPrimitive {
+ primitive: Primitive::default(),
+ params: PrimitiveParams::Merge(Merge {
+ merge_nodes: vec![
+ MergeNode::default(),
+ MergeNode {
+ in1: Input::SourceGraphic,
+ ..MergeNode::default()
+ },
+ ],
+ }),
+ };
+
+ vec![gaussian_blur, offset, flood, composite, merge]
+}
+
+impl DropShadow {
+ /// Converts a DropShadow into the set of filter element primitives.
+ ///
+ /// See <https://www.w3.org/TR/filter-effects/#dropshadowEquivalent>.
+ fn to_filter_spec(&self, params: &NormalizeParams, default_color: RGBA) -> FilterSpec {
+ let user_space_filter = Filter::default().to_user_space(params);
+ let dx = self.dx.map(|l| l.to_user(params)).unwrap_or(0.0);
+ let dy = self.dy.map(|l| l.to_user(params)).unwrap_or(0.0);
+ let std_dev = self.std_deviation.map(|l| l.to_user(params)).unwrap_or(0.0);
+ let std_deviation = NumberOptionalNumber(std_dev, std_dev);
+ let color = self
+ .color
+ .as_ref()
+ .map(|c| resolve_color(c, UnitInterval::clamp(1.0), default_color))
+ .unwrap_or(default_color);
+
+ let resolved_primitives = drop_shadow_primitives(dx, dy, std_deviation, color);
+
+ let primitives = resolved_primitives
+ .into_iter()
+ .map(|p| p.into_user_space(params))
+ .collect();
+
+ FilterSpec {
+ user_space_filter,
+ primitives,
+ }
+ }
+}
+
+impl Grayscale {
+ fn to_filter_spec(&self, params: &NormalizeParams) -> FilterSpec {
+ // grayscale is implemented as the inverse of a saturate operation,
+ // with the input clamped to the range [0, 1] by the parser.
+ let p = 1.0 - self.proportion.unwrap_or(1.0);
+ let saturate = Saturate {
+ proportion: Some(p),
+ };
+
+ saturate.to_filter_spec(params)
+ }
+}
+
+impl HueRotate {
+ fn to_filter_spec(&self, params: &NormalizeParams) -> FilterSpec {
+ let rads = self.angle.map(|a| a.radians()).unwrap_or(0.0);
+ let user_space_filter = Filter::default().to_user_space(params);
+
+ let huerotate = ResolvedPrimitive {
+ primitive: Primitive::default(),
+ params: PrimitiveParams::ColorMatrix(ColorMatrix {
+ matrix: ColorMatrix::hue_rotate_matrix(rads),
+ ..ColorMatrix::default()
+ }),
+ }
+ .into_user_space(params);
+
+ FilterSpec {
+ user_space_filter,
+ primitives: vec![huerotate],
+ }
+ }
+}
+
+impl Invert {
+ fn to_filter_spec(&self, params: &NormalizeParams) -> FilterSpec {
+ let p = self.proportion.unwrap_or(1.0);
+ let user_space_filter = Filter::default().to_user_space(params);
+
+ let invert = ResolvedPrimitive {
+ primitive: Primitive::default(),
+ params: PrimitiveParams::ComponentTransfer(component_transfer::ComponentTransfer {
+ functions: component_transfer::Functions {
+ r: FeFuncR(FeFuncCommon {
+ function_type: component_transfer::FunctionType::Table,
+ table_values: vec![p, 1.0 - p],
+ ..FeFuncCommon::default()
+ }),
+ g: FeFuncG(FeFuncCommon {
+ function_type: component_transfer::FunctionType::Table,
+ table_values: vec![p, 1.0 - p],
+ ..FeFuncCommon::default()
+ }),
+ b: FeFuncB(FeFuncCommon {
+ function_type: component_transfer::FunctionType::Table,
+ table_values: vec![p, 1.0 - p],
+ ..FeFuncCommon::default()
+ }),
+ a: FeFuncA::default(),
+ },
+ ..component_transfer::ComponentTransfer::default()
+ }),
+ }
+ .into_user_space(params);
+
+ FilterSpec {
+ user_space_filter,
+ primitives: vec![invert],
+ }
+ }
+}
+
+impl Opacity {
+ fn to_filter_spec(&self, params: &NormalizeParams) -> FilterSpec {
+ let p = self.proportion.unwrap_or(1.0);
+ let user_space_filter = Filter::default().to_user_space(params);
+
+ let opacity = ResolvedPrimitive {
+ primitive: Primitive::default(),
+ params: PrimitiveParams::ComponentTransfer(component_transfer::ComponentTransfer {
+ functions: component_transfer::Functions {
+ a: FeFuncA(FeFuncCommon {
+ function_type: component_transfer::FunctionType::Table,
+ table_values: vec![0.0, p],
+ ..FeFuncCommon::default()
+ }),
+ ..component_transfer::Functions::default()
+ },
+ ..component_transfer::ComponentTransfer::default()
+ }),
+ }
+ .into_user_space(params);
+
+ FilterSpec {
+ user_space_filter,
+ primitives: vec![opacity],
+ }
+ }
+}
+
+impl Saturate {
+ #[rustfmt::skip]
+ fn matrix(&self) -> nalgebra::Matrix5<f64> {
+ let p = self.proportion.unwrap_or(1.0);
+
+ nalgebra::Matrix5::new(
+ 0.213 + 0.787 * p, 0.715 - 0.715 * p, 0.072 - 0.072 * p, 0.0, 0.0,
+ 0.213 - 0.213 * p, 0.715 + 0.285 * p, 0.072 - 0.072 * p, 0.0, 0.0,
+ 0.213 - 0.213 * p, 0.715 - 0.715 * p, 0.072 + 0.928 * p, 0.0, 0.0,
+ 0.0, 0.0, 0.0, 1.0, 0.0,
+ 0.0, 0.0, 0.0, 0.0, 1.0,
+ )
+ }
+
+ fn to_filter_spec(&self, params: &NormalizeParams) -> FilterSpec {
+ let user_space_filter = Filter::default().to_user_space(params);
+
+ let saturate = ResolvedPrimitive {
+ primitive: Primitive::default(),
+ params: PrimitiveParams::ColorMatrix(ColorMatrix {
+ matrix: self.matrix(),
+ ..ColorMatrix::default()
+ }),
+ }
+ .into_user_space(params);
+
+ FilterSpec {
+ user_space_filter,
+ primitives: vec![saturate],
+ }
+ }
+}
+
+impl Sepia {
+ #[rustfmt::skip]
+ fn matrix(&self) -> nalgebra::Matrix5<f64> {
+ let p = self.proportion.unwrap_or(1.0);
+
+ nalgebra::Matrix5::new(
+ 0.393 + 0.607 * (1.0 - p), 0.769 - 0.769 * (1.0 - p), 0.189 - 0.189 * (1.0 - p), 0.0, 0.0,
+ 0.349 - 0.349 * (1.0 - p), 0.686 + 0.314 * (1.0 - p), 0.168 - 0.168 * (1.0 - p), 0.0, 0.0,
+ 0.272 - 0.272 * (1.0 - p), 0.534 - 0.534 * (1.0 - p), 0.131 + 0.869 * (1.0 - p), 0.0, 0.0,
+ 0.0, 0.0, 0.0, 1.0, 0.0,
+ 0.0, 0.0, 0.0, 0.0, 1.0,
+ )
+ }
+
+ fn to_filter_spec(&self, params: &NormalizeParams) -> FilterSpec {
+ let user_space_filter = Filter::default().to_user_space(params);
+
+ let sepia = ResolvedPrimitive {
+ primitive: Primitive::default(),
+ params: PrimitiveParams::ColorMatrix(ColorMatrix {
+ matrix: self.matrix(),
+ ..ColorMatrix::default()
+ }),
+ }
+ .into_user_space(params);
+
+ FilterSpec {
+ user_space_filter,
+ primitives: vec![sepia],
+ }
+ }
+}
+
+impl Parse for FilterFunction {
+ #[allow(clippy::type_complexity)]
+ #[rustfmt::skip]
+ fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<Self, crate::error::ParseError<'i>> {
+ let loc = parser.current_source_location();
+ let fns: Vec<(&str, &dyn Fn(&mut Parser<'i, '_>) -> _)> = vec![
+ ("blur", &parse_blur),
+ ("brightness", &parse_brightness),
+ ("contrast", &parse_contrast),
+ ("drop-shadow", &parse_dropshadow),
+ ("grayscale", &parse_grayscale),
+ ("hue-rotate", &parse_huerotate),
+ ("invert", &parse_invert),
+ ("opacity", &parse_opacity),
+ ("saturate", &parse_saturate),
+ ("sepia", &parse_sepia),
+ ];
+
+ for (filter_name, parse_fn) in fns {
+ if let Ok(func) = parser.try_parse(|p| parse_function(p, filter_name, parse_fn)) {
+ return Ok(func);
+ }
+ }
+
+ return Err(loc.new_custom_error(ValueErrorKind::parse_error("expected filter function")));
+ }
+}
+
+impl FilterFunction {
+ // If this function starts actually returning an Err, remove this Clippy exception:
+ #[allow(clippy::unnecessary_wraps)]
+ pub fn to_filter_spec(&self, params: &NormalizeParams, current_color: RGBA) -> FilterSpec {
+ match self {
+ FilterFunction::Blur(v) => v.to_filter_spec(params),
+ FilterFunction::Brightness(v) => v.to_filter_spec(params),
+ FilterFunction::Contrast(v) => v.to_filter_spec(params),
+ FilterFunction::DropShadow(v) => v.to_filter_spec(params, current_color),
+ FilterFunction::Grayscale(v) => v.to_filter_spec(params),
+ FilterFunction::HueRotate(v) => v.to_filter_spec(params),
+ FilterFunction::Invert(v) => v.to_filter_spec(params),
+ FilterFunction::Opacity(v) => v.to_filter_spec(params),
+ FilterFunction::Saturate(v) => v.to_filter_spec(params),
+ FilterFunction::Sepia(v) => v.to_filter_spec(params),
+ }
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn parses_blur() {
+ assert_eq!(
+ FilterFunction::parse_str("blur()").unwrap(),
+ FilterFunction::Blur(Blur {
+ std_deviation: None
+ })
+ );
+
+ assert_eq!(
+ FilterFunction::parse_str("blur(5px)").unwrap(),
+ FilterFunction::Blur(Blur {
+ std_deviation: Some(Length::new(5.0, LengthUnit::Px))
+ })
+ );
+ }
+
+ #[test]
+ fn parses_brightness() {
+ assert_eq!(
+ FilterFunction::parse_str("brightness()").unwrap(),
+ FilterFunction::Brightness(Brightness { proportion: None })
+ );
+
+ assert_eq!(
+ FilterFunction::parse_str("brightness(50%)").unwrap(),
+ FilterFunction::Brightness(Brightness {
+ proportion: Some(0.50_f32.into()),
+ })
+ );
+ }
+
+ #[test]
+ fn parses_contrast() {
+ assert_eq!(
+ FilterFunction::parse_str("contrast()").unwrap(),
+ FilterFunction::Contrast(Contrast { proportion: None })
+ );
+
+ assert_eq!(
+ FilterFunction::parse_str("contrast(50%)").unwrap(),
+ FilterFunction::Contrast(Contrast {
+ proportion: Some(0.50_f32.into()),
+ })
+ );
+ }
+
+ #[test]
+ fn parses_dropshadow() {
+ assert_eq!(
+ FilterFunction::parse_str("drop-shadow(4px 5px)").unwrap(),
+ FilterFunction::DropShadow(DropShadow {
+ color: None,
+ dx: Some(Length::new(4.0, LengthUnit::Px)),
+ dy: Some(Length::new(5.0, LengthUnit::Px)),
+ std_deviation: None,
+ })
+ );
+
+ assert_eq!(
+ FilterFunction::parse_str("drop-shadow(#ff0000 4px 5px 32px)").unwrap(),
+ FilterFunction::DropShadow(DropShadow {
+ color: Some(Color::RGBA(RGBA {
+ red: 255,
+ green: 0,
+ blue: 0,
+ alpha: 255
+ })),
+ dx: Some(Length::new(4.0, LengthUnit::Px)),
+ dy: Some(Length::new(5.0, LengthUnit::Px)),
+ std_deviation: Some(ULength::new(32.0, LengthUnit::Px)),
+ })
+ );
+
+ assert_eq!(
+ FilterFunction::parse_str("drop-shadow(1px 2px blue)").unwrap(),
+ FilterFunction::DropShadow(DropShadow {
+ color: Some(Color::RGBA(RGBA {
+ red: 0,
+ green: 0,
+ blue: 255,
+ alpha: 255
+ })),
+ dx: Some(Length::new(1.0, LengthUnit::Px)),
+ dy: Some(Length::new(2.0, LengthUnit::Px)),
+ std_deviation: None,
+ })
+ );
+
+ assert_eq!(
+ FilterFunction::parse_str("drop-shadow(1px 2px 3px currentColor)").unwrap(),
+ FilterFunction::DropShadow(DropShadow {
+ color: Some(Color::CurrentColor),
+ dx: Some(Length::new(1.0, LengthUnit::Px)),
+ dy: Some(Length::new(2.0, LengthUnit::Px)),
+ std_deviation: Some(ULength::new(3.0, LengthUnit::Px)),
+ })
+ );
+
+ assert_eq!(
+ FilterFunction::parse_str("drop-shadow(1 2 3)").unwrap(),
+ FilterFunction::DropShadow(DropShadow {
+ color: None,
+ dx: Some(Length::new(1.0, LengthUnit::Px)),
+ dy: Some(Length::new(2.0, LengthUnit::Px)),
+ std_deviation: Some(ULength::new(3.0, LengthUnit::Px)),
+ })
+ );
+ }
+
+ #[test]
+ fn parses_grayscale() {
+ assert_eq!(
+ FilterFunction::parse_str("grayscale()").unwrap(),
+ FilterFunction::Grayscale(Grayscale { proportion: None })
+ );
+
+ assert_eq!(
+ FilterFunction::parse_str("grayscale(50%)").unwrap(),
+ FilterFunction::Grayscale(Grayscale {
+ proportion: Some(0.50_f32.into()),
+ })
+ );
+ }
+
+ #[test]
+ fn parses_huerotate() {
+ assert_eq!(
+ FilterFunction::parse_str("hue-rotate()").unwrap(),
+ FilterFunction::HueRotate(HueRotate { angle: None })
+ );
+
+ assert_eq!(
+ FilterFunction::parse_str("hue-rotate(0)").unwrap(),
+ FilterFunction::HueRotate(HueRotate {
+ angle: Some(Angle::new(0.0))
+ })
+ );
+
+ assert_eq!(
+ FilterFunction::parse_str("hue-rotate(128deg)").unwrap(),
+ FilterFunction::HueRotate(HueRotate {
+ angle: Some(Angle::from_degrees(128.0))
+ })
+ );
+ }
+
+ #[test]
+ fn parses_invert() {
+ assert_eq!(
+ FilterFunction::parse_str("invert()").unwrap(),
+ FilterFunction::Invert(Invert { proportion: None })
+ );
+
+ assert_eq!(
+ FilterFunction::parse_str("invert(50%)").unwrap(),
+ FilterFunction::Invert(Invert {
+ proportion: Some(0.50_f32.into()),
+ })
+ );
+ }
+
+ #[test]
+ fn parses_opacity() {
+ assert_eq!(
+ FilterFunction::parse_str("opacity()").unwrap(),
+ FilterFunction::Opacity(Opacity { proportion: None })
+ );
+
+ assert_eq!(
+ FilterFunction::parse_str("opacity(50%)").unwrap(),
+ FilterFunction::Opacity(Opacity {
+ proportion: Some(0.50_f32.into()),
+ })
+ );
+ }
+
+ #[test]
+ fn parses_saturate() {
+ assert_eq!(
+ FilterFunction::parse_str("saturate()").unwrap(),
+ FilterFunction::Saturate(Saturate { proportion: None })
+ );
+
+ assert_eq!(
+ FilterFunction::parse_str("saturate(50%)").unwrap(),
+ FilterFunction::Saturate(Saturate {
+ proportion: Some(0.50_f32.into()),
+ })
+ );
+ }
+
+ #[test]
+ fn parses_sepia() {
+ assert_eq!(
+ FilterFunction::parse_str("sepia()").unwrap(),
+ FilterFunction::Sepia(Sepia { proportion: None })
+ );
+
+ assert_eq!(
+ FilterFunction::parse_str("sepia(80%)").unwrap(),
+ FilterFunction::Sepia(Sepia {
+ proportion: Some(0.80_f32.into())
+ })
+ );
+
+ assert_eq!(
+ FilterFunction::parse_str("sepia(0.52)").unwrap(),
+ FilterFunction::Sepia(Sepia {
+ proportion: Some(0.52_f32.into())
+ })
+ );
+
+ // values > 1.0 should be clamped to 1.0
+ assert_eq!(
+ FilterFunction::parse_str("sepia(1.5)").unwrap(),
+ FilterFunction::Sepia(Sepia {
+ proportion: Some(1.0)
+ })
+ );
+
+ // negative numbers are invalid.
+ assert_eq!(
+ FilterFunction::parse_str("sepia(-1)").unwrap(),
+ FilterFunction::Sepia(Sepia { proportion: None }),
+ );
+ }
+
+ #[test]
+ fn invalid_blur_yields_error() {
+ assert!(FilterFunction::parse_str("blur(foo)").is_err());
+ assert!(FilterFunction::parse_str("blur(42 43)").is_err());
+ }
+
+ #[test]
+ fn invalid_brightness_yields_error() {
+ assert!(FilterFunction::parse_str("brightness(foo)").is_err());
+ }
+
+ #[test]
+ fn invalid_contrast_yields_error() {
+ assert!(FilterFunction::parse_str("contrast(foo)").is_err());
+ }
+
+ #[test]
+ fn invalid_dropshadow_yields_error() {
+ assert!(FilterFunction::parse_str("drop-shadow(blue 5px green)").is_err());
+ assert!(FilterFunction::parse_str("drop-shadow(blue 5px 5px green)").is_err());
+ assert!(FilterFunction::parse_str("drop-shadow(blue 1px)").is_err());
+ assert!(FilterFunction::parse_str("drop-shadow(1 2 3 4 blue)").is_err());
+ }
+
+ #[test]
+ fn invalid_grayscale_yields_error() {
+ assert!(FilterFunction::parse_str("grayscale(foo)").is_err());
+ }
+
+ #[test]
+ fn invalid_huerotate_yields_error() {
+ assert!(FilterFunction::parse_str("hue-rotate(foo)").is_err());
+ }
+
+ #[test]
+ fn invalid_invert_yields_error() {
+ assert!(FilterFunction::parse_str("invert(foo)").is_err());
+ }
+
+ #[test]
+ fn invalid_opacity_yields_error() {
+ assert!(FilterFunction::parse_str("opacity(foo)").is_err());
+ }
+
+ #[test]
+ fn invalid_saturate_yields_error() {
+ assert!(FilterFunction::parse_str("saturate(foo)").is_err());
+ }
+
+ #[test]
+ fn invalid_sepia_yields_error() {
+ assert!(FilterFunction::parse_str("sepia(foo)").is_err());
+ }
+}
diff --git a/rsvg/src/filters/blend.rs b/rsvg/src/filters/blend.rs
new file mode 100644
index 00000000..30b0bdf7
--- /dev/null
+++ b/rsvg/src/filters/blend.rs
@@ -0,0 +1,178 @@
+use cssparser::Parser;
+use markup5ever::{expanded_name, local_name, namespace_url, ns};
+
+use crate::document::AcquiredNodes;
+use crate::drawing_ctx::DrawingCtx;
+use crate::element::{set_attribute, ElementTrait};
+use crate::error::*;
+use crate::node::{CascadedValues, Node};
+use crate::parsers::{Parse, ParseValue};
+use crate::properties::ColorInterpolationFilters;
+use crate::rect::IRect;
+use crate::session::Session;
+use crate::surface_utils::shared_surface::Operator;
+use crate::xml::Attributes;
+
+use super::bounds::BoundsBuilder;
+use super::context::{FilterContext, FilterOutput};
+use super::{
+ FilterEffect, FilterError, FilterResolveError, Input, Primitive, PrimitiveParams,
+ ResolvedPrimitive,
+};
+
+/// Enumeration of the possible blending modes.
+#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash)]
+enum Mode {
+ Normal,
+ Multiply,
+ Screen,
+ Darken,
+ Lighten,
+ Overlay,
+ ColorDodge,
+ ColorBurn,
+ HardLight,
+ SoftLight,
+ Difference,
+ Exclusion,
+ HslHue,
+ HslSaturation,
+ HslColor,
+ HslLuminosity,
+}
+
+enum_default!(Mode, Mode::Normal);
+
+/// The `feBlend` filter primitive.
+#[derive(Default)]
+pub struct FeBlend {
+ base: Primitive,
+ params: Blend,
+}
+
+/// Resolved `feBlend` primitive for rendering.
+#[derive(Clone, Default)]
+pub struct Blend {
+ in1: Input,
+ in2: Input,
+ mode: Mode,
+ color_interpolation_filters: ColorInterpolationFilters,
+}
+
+impl ElementTrait for FeBlend {
+ fn set_attributes(&mut self, attrs: &Attributes, session: &Session) {
+ let (in1, in2) = self.base.parse_two_inputs(attrs, session);
+ self.params.in1 = in1;
+ self.params.in2 = in2;
+
+ for (attr, value) in attrs.iter() {
+ if let expanded_name!("", "mode") = attr.expanded() {
+ set_attribute(&mut self.params.mode, attr.parse(value), session);
+ }
+ }
+ }
+}
+
+impl Blend {
+ pub fn render(
+ &self,
+ bounds_builder: BoundsBuilder,
+ ctx: &FilterContext,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ draw_ctx: &mut DrawingCtx,
+ ) -> Result<FilterOutput, FilterError> {
+ let input_1 = ctx.get_input(
+ acquired_nodes,
+ draw_ctx,
+ &self.in1,
+ self.color_interpolation_filters,
+ )?;
+ let input_2 = ctx.get_input(
+ acquired_nodes,
+ draw_ctx,
+ &self.in2,
+ self.color_interpolation_filters,
+ )?;
+ let bounds: IRect = bounds_builder
+ .add_input(&input_1)
+ .add_input(&input_2)
+ .compute(ctx)
+ .clipped
+ .into();
+
+ let surface = input_1
+ .surface()
+ .compose(input_2.surface(), bounds, self.mode.into())?;
+
+ Ok(FilterOutput { surface, bounds })
+ }
+}
+
+impl FilterEffect for FeBlend {
+ fn resolve(
+ &self,
+ _acquired_nodes: &mut AcquiredNodes<'_>,
+ node: &Node,
+ ) -> Result<Vec<ResolvedPrimitive>, FilterResolveError> {
+ let cascaded = CascadedValues::new_from_node(node);
+ let values = cascaded.get();
+
+ let mut params = self.params.clone();
+ params.color_interpolation_filters = values.color_interpolation_filters();
+
+ Ok(vec![ResolvedPrimitive {
+ primitive: self.base.clone(),
+ params: PrimitiveParams::Blend(params),
+ }])
+ }
+}
+
+impl Parse for Mode {
+ fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<Self, ParseError<'i>> {
+ Ok(parse_identifiers!(
+ parser,
+ "normal" => Mode::Normal,
+ "multiply" => Mode::Multiply,
+ "screen" => Mode::Screen,
+ "darken" => Mode::Darken,
+ "lighten" => Mode::Lighten,
+ "overlay" => Mode::Overlay,
+ "color-dodge" => Mode::ColorDodge,
+ "color-burn" => Mode::ColorBurn,
+ "hard-light" => Mode::HardLight,
+ "soft-light" => Mode::SoftLight,
+ "difference" => Mode::Difference,
+ "exclusion" => Mode::Exclusion,
+ "hue" => Mode::HslHue,
+ "saturation" => Mode::HslSaturation,
+ "color" => Mode::HslColor,
+ "luminosity" => Mode::HslLuminosity,
+ )?)
+ }
+}
+
+impl From<Mode> for Operator {
+ #[inline]
+ fn from(x: Mode) -> Self {
+ use Mode::*;
+
+ match x {
+ Normal => Operator::Over,
+ Multiply => Operator::Multiply,
+ Screen => Operator::Screen,
+ Darken => Operator::Darken,
+ Lighten => Operator::Lighten,
+ Overlay => Operator::Overlay,
+ ColorDodge => Operator::ColorDodge,
+ ColorBurn => Operator::ColorBurn,
+ HardLight => Operator::HardLight,
+ SoftLight => Operator::SoftLight,
+ Difference => Operator::Difference,
+ Exclusion => Operator::Exclusion,
+ HslHue => Operator::HslHue,
+ HslSaturation => Operator::HslSaturation,
+ HslColor => Operator::HslColor,
+ HslLuminosity => Operator::HslLuminosity,
+ }
+ }
+}
diff --git a/rsvg/src/filters/bounds.rs b/rsvg/src/filters/bounds.rs
new file mode 100644
index 00000000..6a6dd9d2
--- /dev/null
+++ b/rsvg/src/filters/bounds.rs
@@ -0,0 +1,121 @@
+//! Filter primitive subregion computation.
+use crate::rect::Rect;
+use crate::transform::Transform;
+
+use super::context::{FilterContext, FilterInput};
+
+/// A helper type for filter primitive subregion computation.
+pub struct BoundsBuilder {
+ /// Filter primitive properties.
+ x: Option<f64>,
+ y: Option<f64>,
+ width: Option<f64>,
+ height: Option<f64>,
+
+ /// The transform to use when generating the rect
+ transform: Transform,
+
+ /// The inverse transform used when adding rects
+ inverse: Transform,
+
+ /// Whether one of the input nodes is standard input.
+ standard_input_was_referenced: bool,
+
+ /// The current bounding rectangle.
+ rect: Option<Rect>,
+}
+
+/// A filter primitive's subregion.
+pub struct Bounds {
+ /// Primitive's subregion, clipped to the filter effects region.
+ pub clipped: Rect,
+
+ /// Primitive's subregion, unclipped.
+ pub unclipped: Rect,
+}
+
+impl BoundsBuilder {
+ /// Constructs a new `BoundsBuilder`.
+ #[inline]
+ pub fn new(
+ x: Option<f64>,
+ y: Option<f64>,
+ width: Option<f64>,
+ height: Option<f64>,
+ transform: Transform,
+ ) -> Self {
+ // We panic if transform is not invertible. This is checked in the caller.
+ Self {
+ x,
+ y,
+ width,
+ height,
+ transform,
+ inverse: transform.invert().unwrap(),
+ standard_input_was_referenced: false,
+ rect: None,
+ }
+ }
+
+ /// Adds a filter primitive input to the bounding box.
+ #[inline]
+ pub fn add_input(mut self, input: &FilterInput) -> Self {
+ // If a standard input was referenced, the default value is the filter effects region
+ // regardless of other referenced inputs. This means we can skip computing the bounds.
+ if self.standard_input_was_referenced {
+ return self;
+ }
+
+ match *input {
+ FilterInput::StandardInput(_) => {
+ self.standard_input_was_referenced = true;
+ }
+ FilterInput::PrimitiveOutput(ref output) => {
+ let input_rect = self.inverse.transform_rect(&Rect::from(output.bounds));
+ self.rect = Some(self.rect.map_or(input_rect, |r| input_rect.union(&r)));
+ }
+ }
+
+ self
+ }
+
+ /// Returns the final exact bounds, both with and without clipping to the effects region.
+ pub fn compute(self, ctx: &FilterContext) -> Bounds {
+ let effects_region = ctx.effects_region();
+
+ // The default value is the filter effects region converted into
+ // the ptimitive coordinate system.
+ let mut rect = match self.rect {
+ Some(r) if !self.standard_input_was_referenced => r,
+ _ => self.inverse.transform_rect(&effects_region),
+ };
+
+ // If any of the properties were specified, we need to respect them.
+ // These replacements are possible because of the primitive coordinate system.
+ if self.x.is_some() || self.y.is_some() || self.width.is_some() || self.height.is_some() {
+ if let Some(x) = self.x {
+ let w = rect.width();
+ rect.x0 = x;
+ rect.x1 = rect.x0 + w;
+ }
+ if let Some(y) = self.y {
+ let h = rect.height();
+ rect.y0 = y;
+ rect.y1 = rect.y0 + h;
+ }
+ if let Some(width) = self.width {
+ rect.x1 = rect.x0 + width;
+ }
+ if let Some(height) = self.height {
+ rect.y1 = rect.y0 + height;
+ }
+ }
+
+ // Convert into the surface coordinate system.
+ let unclipped = self.transform.transform_rect(&rect);
+
+ let clipped = unclipped.intersection(&effects_region).unwrap_or_default();
+
+ Bounds { clipped, unclipped }
+ }
+}
diff --git a/rsvg/src/filters/color_matrix.rs b/rsvg/src/filters/color_matrix.rs
new file mode 100644
index 00000000..3701b541
--- /dev/null
+++ b/rsvg/src/filters/color_matrix.rs
@@ -0,0 +1,342 @@
+use cssparser::Parser;
+use markup5ever::{expanded_name, local_name, namespace_url, ns, QualName};
+use nalgebra::{Matrix3, Matrix4x5, Matrix5, Vector5};
+
+use crate::document::AcquiredNodes;
+use crate::drawing_ctx::DrawingCtx;
+use crate::element::{set_attribute, ElementTrait};
+use crate::error::*;
+use crate::node::{CascadedValues, Node};
+use crate::parsers::{NumberList, Parse, ParseValue};
+use crate::properties::ColorInterpolationFilters;
+use crate::rect::IRect;
+use crate::session::Session;
+use crate::surface_utils::{
+ iterators::Pixels, shared_surface::ExclusiveImageSurface, ImageSurfaceDataExt, Pixel,
+};
+use crate::util::clamp;
+use crate::xml::Attributes;
+
+use super::bounds::BoundsBuilder;
+use super::context::{FilterContext, FilterOutput};
+use super::{
+ FilterEffect, FilterError, FilterResolveError, Input, Primitive, PrimitiveParams,
+ ResolvedPrimitive,
+};
+
+/// Color matrix operation types.
+#[derive(Debug, Clone, Copy, Eq, PartialEq)]
+enum OperationType {
+ Matrix,
+ Saturate,
+ HueRotate,
+ LuminanceToAlpha,
+}
+
+enum_default!(OperationType, OperationType::Matrix);
+
+/// The `feColorMatrix` filter primitive.
+#[derive(Default)]
+pub struct FeColorMatrix {
+ base: Primitive,
+ params: ColorMatrix,
+}
+
+/// Resolved `feColorMatrix` primitive for rendering.
+#[derive(Clone)]
+pub struct ColorMatrix {
+ pub in1: Input,
+ pub matrix: Matrix5<f64>,
+ pub color_interpolation_filters: ColorInterpolationFilters,
+}
+
+impl Default for ColorMatrix {
+ fn default() -> ColorMatrix {
+ ColorMatrix {
+ in1: Default::default(),
+ color_interpolation_filters: Default::default(),
+
+ // nalgebra's Default for Matrix5 is all zeroes, so we actually need this :(
+ matrix: Matrix5::identity(),
+ }
+ }
+}
+
+impl ElementTrait for FeColorMatrix {
+ fn set_attributes(&mut self, attrs: &Attributes, session: &Session) {
+ self.params.in1 = self.base.parse_one_input(attrs, session);
+
+ // First, determine the operation type.
+ let mut operation_type = Default::default();
+ for (attr, value) in attrs
+ .iter()
+ .filter(|(attr, _)| attr.expanded() == expanded_name!("", "type"))
+ {
+ set_attribute(&mut operation_type, attr.parse(value), session);
+ }
+
+ // Now read the matrix correspondingly.
+ //
+ // Here we cannot assume that ColorMatrix::default() has provided the correct
+ // initial value for the matrix itself, since the initial value for the matrix
+ // (i.e. the value to which it should fall back if the `values` attribute is in
+ // error) depends on the operation_type.
+ //
+ // So, for each operation_type, first initialize the proper default matrix, then
+ // try to parse the value.
+
+ use OperationType::*;
+
+ self.params.matrix = match operation_type {
+ Matrix => ColorMatrix::default_matrix(),
+ Saturate => ColorMatrix::saturate_matrix(1.0),
+ HueRotate => ColorMatrix::hue_rotate_matrix(0.0),
+ LuminanceToAlpha => ColorMatrix::luminance_to_alpha_matrix(),
+ };
+
+ for (attr, value) in attrs
+ .iter()
+ .filter(|(attr, _)| attr.expanded() == expanded_name!("", "values"))
+ {
+ match operation_type {
+ Matrix => parse_matrix(&mut self.params.matrix, attr, value, session),
+ Saturate => parse_saturate_matrix(&mut self.params.matrix, attr, value, session),
+ HueRotate => parse_hue_rotate_matrix(&mut self.params.matrix, attr, value, session),
+ LuminanceToAlpha => {
+ parse_luminance_to_alpha_matrix(&mut self.params.matrix, attr, value, session)
+ }
+ }
+ }
+ }
+}
+
+fn parse_matrix(dest: &mut Matrix5<f64>, attr: QualName, value: &str, session: &Session) {
+ let parsed: Result<NumberList<20, 20>, _> = attr.parse(value);
+
+ match parsed {
+ Ok(NumberList(v)) => {
+ let matrix = Matrix4x5::from_row_slice(&v);
+ let mut matrix = matrix.fixed_resize(0.0);
+ matrix[(4, 4)] = 1.0;
+ *dest = matrix;
+ }
+
+ Err(e) => {
+ rsvg_log!(session, "element feColorMatrix with type=\"matrix\", expected a values attribute with 20 numbers: {}", e);
+ }
+ }
+}
+
+fn parse_saturate_matrix(dest: &mut Matrix5<f64>, attr: QualName, value: &str, session: &Session) {
+ let parsed: Result<f64, _> = attr.parse(value);
+
+ match parsed {
+ Ok(s) => {
+ *dest = ColorMatrix::saturate_matrix(s);
+ }
+
+ Err(e) => {
+ rsvg_log!(session, "element feColorMatrix with type=\"saturate\", expected a values attribute with 1 number: {}", e);
+ }
+ }
+}
+
+fn parse_hue_rotate_matrix(
+ dest: &mut Matrix5<f64>,
+ attr: QualName,
+ value: &str,
+ session: &Session,
+) {
+ let parsed: Result<f64, _> = attr.parse(value);
+
+ match parsed {
+ Ok(degrees) => {
+ *dest = ColorMatrix::hue_rotate_matrix(degrees.to_radians());
+ }
+
+ Err(e) => {
+ rsvg_log!(session, "element feColorMatrix with type=\"hueRotate\", expected a values attribute with 1 number: {}", e);
+ }
+ }
+}
+
+fn parse_luminance_to_alpha_matrix(
+ _dest: &mut Matrix5<f64>,
+ _attr: QualName,
+ _value: &str,
+ session: &Session,
+) {
+ // There's nothing to parse, since our caller already supplied the default value,
+ // and type="luminanceToAlpha" does not takes a `values` attribute. So, just warn
+ // that the value is being ignored.
+
+ rsvg_log!(
+ session,
+ "ignoring \"values\" attribute for feColorMatrix with type=\"luminanceToAlpha\""
+ );
+}
+
+impl ColorMatrix {
+ pub fn render(
+ &self,
+ bounds_builder: BoundsBuilder,
+ ctx: &FilterContext,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ draw_ctx: &mut DrawingCtx,
+ ) -> Result<FilterOutput, FilterError> {
+ let input_1 = ctx.get_input(
+ acquired_nodes,
+ draw_ctx,
+ &self.in1,
+ self.color_interpolation_filters,
+ )?;
+ let bounds: IRect = bounds_builder
+ .add_input(&input_1)
+ .compute(ctx)
+ .clipped
+ .into();
+
+ let mut surface = ExclusiveImageSurface::new(
+ ctx.source_graphic().width(),
+ ctx.source_graphic().height(),
+ input_1.surface().surface_type(),
+ )?;
+
+ surface.modify(&mut |data, stride| {
+ for (x, y, pixel) in Pixels::within(input_1.surface(), bounds) {
+ let alpha = f64::from(pixel.a) / 255f64;
+
+ let pixel_vec = if alpha == 0.0 {
+ Vector5::new(0.0, 0.0, 0.0, 0.0, 1.0)
+ } else {
+ Vector5::new(
+ f64::from(pixel.r) / 255f64 / alpha,
+ f64::from(pixel.g) / 255f64 / alpha,
+ f64::from(pixel.b) / 255f64 / alpha,
+ alpha,
+ 1.0,
+ )
+ };
+ let mut new_pixel_vec = Vector5::zeros();
+ self.matrix.mul_to(&pixel_vec, &mut new_pixel_vec);
+
+ let new_alpha = clamp(new_pixel_vec[3], 0.0, 1.0);
+
+ let premultiply = |x: f64| ((clamp(x, 0.0, 1.0) * new_alpha * 255f64) + 0.5) as u8;
+
+ let output_pixel = Pixel {
+ r: premultiply(new_pixel_vec[0]),
+ g: premultiply(new_pixel_vec[1]),
+ b: premultiply(new_pixel_vec[2]),
+ a: ((new_alpha * 255f64) + 0.5) as u8,
+ };
+
+ data.set_pixel(stride, output_pixel, x, y);
+ }
+ });
+
+ Ok(FilterOutput {
+ surface: surface.share()?,
+ bounds,
+ })
+ }
+
+ /// Compute a `type="hueRotate"` matrix.
+ ///
+ /// https://drafts.fxtf.org/filter-effects/#element-attrdef-fecolormatrix-values
+ #[rustfmt::skip]
+ pub fn hue_rotate_matrix(radians: f64) -> Matrix5<f64> {
+ let (sin, cos) = radians.sin_cos();
+
+ let a = Matrix3::new(
+ 0.213, 0.715, 0.072,
+ 0.213, 0.715, 0.072,
+ 0.213, 0.715, 0.072,
+ );
+
+ let b = Matrix3::new(
+ 0.787, -0.715, -0.072,
+ -0.213, 0.285, -0.072,
+ -0.213, -0.715, 0.928,
+ );
+
+ let c = Matrix3::new(
+ -0.213, -0.715, 0.928,
+ 0.143, 0.140, -0.283,
+ -0.787, 0.715, 0.072,
+ );
+
+ let top_left = a + b * cos + c * sin;
+
+ let mut matrix = top_left.fixed_resize(0.0);
+ matrix[(3, 3)] = 1.0;
+ matrix[(4, 4)] = 1.0;
+ matrix
+ }
+
+ /// Compute a `type="luminanceToAlpha"` matrix.
+ ///
+ /// https://drafts.fxtf.org/filter-effects/#element-attrdef-fecolormatrix-values
+ #[rustfmt::skip]
+ fn luminance_to_alpha_matrix() -> Matrix5<f64> {
+ Matrix5::new(
+ 0.0, 0.0, 0.0, 0.0, 0.0,
+ 0.0, 0.0, 0.0, 0.0, 0.0,
+ 0.0, 0.0, 0.0, 0.0, 0.0,
+ 0.2126, 0.7152, 0.0722, 0.0, 0.0,
+ 0.0, 0.0, 0.0, 0.0, 1.0,
+ )
+ }
+
+ /// Compute a `type="saturate"` matrix.
+ ///
+ /// https://drafts.fxtf.org/filter-effects/#element-attrdef-fecolormatrix-values
+ #[rustfmt::skip]
+ fn saturate_matrix(s: f64) -> Matrix5<f64> {
+ Matrix5::new(
+ 0.213 + 0.787 * s, 0.715 - 0.715 * s, 0.072 - 0.072 * s, 0.0, 0.0,
+ 0.213 - 0.213 * s, 0.715 + 0.285 * s, 0.072 - 0.072 * s, 0.0, 0.0,
+ 0.213 - 0.213 * s, 0.715 - 0.715 * s, 0.072 + 0.928 * s, 0.0, 0.0,
+ 0.0, 0.0, 0.0, 1.0, 0.0,
+ 0.0, 0.0, 0.0, 0.0, 1.0,
+ )
+ }
+
+ /// Default for `type="matrix"`.
+ ///
+ /// https://drafts.fxtf.org/filter-effects/#element-attrdef-fecolormatrix-values
+ fn default_matrix() -> Matrix5<f64> {
+ Matrix5::identity()
+ }
+}
+
+impl FilterEffect for FeColorMatrix {
+ fn resolve(
+ &self,
+ _acquired_nodes: &mut AcquiredNodes<'_>,
+ node: &Node,
+ ) -> Result<Vec<ResolvedPrimitive>, FilterResolveError> {
+ let cascaded = CascadedValues::new_from_node(node);
+ let values = cascaded.get();
+
+ let mut params = self.params.clone();
+ params.color_interpolation_filters = values.color_interpolation_filters();
+
+ Ok(vec![ResolvedPrimitive {
+ primitive: self.base.clone(),
+ params: PrimitiveParams::ColorMatrix(params),
+ }])
+ }
+}
+
+impl Parse for OperationType {
+ fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<Self, ParseError<'i>> {
+ Ok(parse_identifiers!(
+ parser,
+ "matrix" => OperationType::Matrix,
+ "saturate" => OperationType::Saturate,
+ "hueRotate" => OperationType::HueRotate,
+ "luminanceToAlpha" => OperationType::LuminanceToAlpha,
+ )?)
+ }
+}
diff --git a/rsvg/src/filters/component_transfer.rs b/rsvg/src/filters/component_transfer.rs
new file mode 100644
index 00000000..6f26f683
--- /dev/null
+++ b/rsvg/src/filters/component_transfer.rs
@@ -0,0 +1,458 @@
+use std::cmp::min;
+
+use cssparser::Parser;
+use markup5ever::{expanded_name, local_name, namespace_url, ns};
+
+use crate::document::AcquiredNodes;
+use crate::drawing_ctx::DrawingCtx;
+use crate::element::{set_attribute, ElementData, ElementTrait};
+use crate::error::*;
+use crate::node::{CascadedValues, Node, NodeBorrow};
+use crate::parsers::{NumberList, Parse, ParseValue};
+use crate::properties::ColorInterpolationFilters;
+use crate::rect::IRect;
+use crate::session::Session;
+use crate::surface_utils::{
+ iterators::Pixels, shared_surface::ExclusiveImageSurface, ImageSurfaceDataExt, Pixel,
+};
+use crate::util::clamp;
+use crate::xml::Attributes;
+
+use super::bounds::BoundsBuilder;
+use super::context::{FilterContext, FilterOutput};
+use super::{
+ FilterEffect, FilterError, FilterResolveError, Input, Primitive, PrimitiveParams,
+ ResolvedPrimitive,
+};
+
+/// The `feComponentTransfer` filter primitive.
+#[derive(Default)]
+pub struct FeComponentTransfer {
+ base: Primitive,
+ params: ComponentTransfer,
+}
+
+/// Resolved `feComponentTransfer` primitive for rendering.
+#[derive(Clone, Default)]
+pub struct ComponentTransfer {
+ pub in1: Input,
+ pub functions: Functions,
+ pub color_interpolation_filters: ColorInterpolationFilters,
+}
+
+impl ElementTrait for FeComponentTransfer {
+ fn set_attributes(&mut self, attrs: &Attributes, session: &Session) {
+ self.params.in1 = self.base.parse_one_input(attrs, session);
+ }
+}
+
+/// Component transfer function types.
+#[derive(Clone, Debug, PartialEq)]
+pub enum FunctionType {
+ Identity,
+ Table,
+ Discrete,
+ Linear,
+ Gamma,
+}
+
+impl Parse for FunctionType {
+ fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<Self, ParseError<'i>> {
+ Ok(parse_identifiers!(
+ parser,
+ "identity" => FunctionType::Identity,
+ "table" => FunctionType::Table,
+ "discrete" => FunctionType::Discrete,
+ "linear" => FunctionType::Linear,
+ "gamma" => FunctionType::Gamma,
+ )?)
+ }
+}
+
+/// The compute function parameters.
+struct FunctionParameters {
+ table_values: Vec<f64>,
+ slope: f64,
+ intercept: f64,
+ amplitude: f64,
+ exponent: f64,
+ offset: f64,
+}
+
+#[derive(Clone, Debug, Default, PartialEq)]
+pub struct Functions {
+ pub r: FeFuncR,
+ pub g: FeFuncG,
+ pub b: FeFuncB,
+ pub a: FeFuncA,
+}
+
+/// The compute function type.
+type Function = fn(&FunctionParameters, f64) -> f64;
+
+/// The identity component transfer function.
+fn identity(_: &FunctionParameters, value: f64) -> f64 {
+ value
+}
+
+/// The table component transfer function.
+fn table(params: &FunctionParameters, value: f64) -> f64 {
+ let n = params.table_values.len() - 1;
+ let k = (value * (n as f64)).floor() as usize;
+
+ let k = min(k, n); // Just in case.
+
+ if k == n {
+ return params.table_values[k];
+ }
+
+ let vk = params.table_values[k];
+ let vk1 = params.table_values[k + 1];
+ let k = k as f64;
+ let n = n as f64;
+
+ vk + (value - k / n) * n * (vk1 - vk)
+}
+
+/// The discrete component transfer function.
+fn discrete(params: &FunctionParameters, value: f64) -> f64 {
+ let n = params.table_values.len();
+ let k = (value * (n as f64)).floor() as usize;
+
+ params.table_values[min(k, n - 1)]
+}
+
+/// The linear component transfer function.
+fn linear(params: &FunctionParameters, value: f64) -> f64 {
+ params.slope * value + params.intercept
+}
+
+/// The gamma component transfer function.
+fn gamma(params: &FunctionParameters, value: f64) -> f64 {
+ params.amplitude * value.powf(params.exponent) + params.offset
+}
+
+/// Common values for `feFuncX` elements
+///
+/// The elements `feFuncR`, `feFuncG`, `feFuncB`, `feFuncA` all have the same parameters; this structure
+/// contains them. Later we define newtypes on this struct as [`FeFuncR`], etc.
+#[derive(Clone, Debug, PartialEq)]
+pub struct FeFuncCommon {
+ pub function_type: FunctionType,
+ pub table_values: Vec<f64>,
+ pub slope: f64,
+ pub intercept: f64,
+ pub amplitude: f64,
+ pub exponent: f64,
+ pub offset: f64,
+}
+
+impl Default for FeFuncCommon {
+ #[inline]
+ fn default() -> Self {
+ Self {
+ function_type: FunctionType::Identity,
+ table_values: Vec::new(),
+ slope: 1.0,
+ intercept: 0.0,
+ amplitude: 1.0,
+ exponent: 1.0,
+ offset: 0.0,
+ }
+ }
+}
+
+// All FeFunc* elements are defined here; they just delegate their attributes
+// to the FeFuncCommon inside.
+macro_rules! impl_func {
+ ($(#[$attr:meta])*
+ $name:ident
+ ) => {
+ #[derive(Clone, Debug, Default, PartialEq)]
+ pub struct $name(pub FeFuncCommon);
+
+ impl ElementTrait for $name {
+ fn set_attributes(&mut self, attrs: &Attributes, session: &Session) {
+ self.0.set_attributes(attrs, session);
+ }
+ }
+ };
+}
+
+impl_func!(
+ /// The `feFuncR` element.
+ FeFuncR
+);
+
+impl_func!(
+ /// The `feFuncG` element.
+ FeFuncG
+);
+
+impl_func!(
+ /// The `feFuncB` element.
+ FeFuncB
+);
+
+impl_func!(
+ /// The `feFuncA` element.
+ FeFuncA
+);
+
+impl FeFuncCommon {
+ fn set_attributes(&mut self, attrs: &Attributes, session: &Session) {
+ for (attr, value) in attrs.iter() {
+ match attr.expanded() {
+ expanded_name!("", "type") => {
+ set_attribute(&mut self.function_type, attr.parse(value), session)
+ }
+ expanded_name!("", "tableValues") => {
+ // #691: Limit list to 256 to mitigate malicious SVGs
+ let mut number_list = NumberList::<0, 256>(Vec::new());
+ set_attribute(&mut number_list, attr.parse(value), session);
+ self.table_values = number_list.0;
+ }
+ expanded_name!("", "slope") => {
+ set_attribute(&mut self.slope, attr.parse(value), session)
+ }
+ expanded_name!("", "intercept") => {
+ set_attribute(&mut self.intercept, attr.parse(value), session)
+ }
+ expanded_name!("", "amplitude") => {
+ set_attribute(&mut self.amplitude, attr.parse(value), session)
+ }
+ expanded_name!("", "exponent") => {
+ set_attribute(&mut self.exponent, attr.parse(value), session)
+ }
+ expanded_name!("", "offset") => {
+ set_attribute(&mut self.offset, attr.parse(value), session)
+ }
+
+ _ => (),
+ }
+ }
+
+ // The table function type with empty table_values is considered
+ // an identity function.
+ match self.function_type {
+ FunctionType::Table | FunctionType::Discrete => {
+ if self.table_values.is_empty() {
+ self.function_type = FunctionType::Identity;
+ }
+ }
+ _ => (),
+ }
+ }
+
+ fn function_parameters(&self) -> FunctionParameters {
+ FunctionParameters {
+ table_values: self.table_values.clone(),
+ slope: self.slope,
+ intercept: self.intercept,
+ amplitude: self.amplitude,
+ exponent: self.exponent,
+ offset: self.offset,
+ }
+ }
+
+ fn function(&self) -> Function {
+ match self.function_type {
+ FunctionType::Identity => identity,
+ FunctionType::Table => table,
+ FunctionType::Discrete => discrete,
+ FunctionType::Linear => linear,
+ FunctionType::Gamma => gamma,
+ }
+ }
+}
+
+macro_rules! func_or_default {
+ ($func_node:ident, $func_type:ident) => {
+ match $func_node {
+ Some(ref f) => match &*f.borrow_element_data() {
+ ElementData::$func_type(e) => (**e).clone(),
+ _ => unreachable!(),
+ },
+ _ => $func_type::default(),
+ }
+ };
+}
+
+macro_rules! get_func_x_node {
+ ($func_node:ident, $func_type:ident) => {
+ $func_node
+ .children()
+ .rev()
+ .filter(|c| c.is_element())
+ .find(|c| matches!(*c.borrow_element_data(), ElementData::$func_type(_)))
+ };
+}
+
+impl ComponentTransfer {
+ pub fn render(
+ &self,
+ bounds_builder: BoundsBuilder,
+ ctx: &FilterContext,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ draw_ctx: &mut DrawingCtx,
+ ) -> Result<FilterOutput, FilterError> {
+ let input_1 = ctx.get_input(
+ acquired_nodes,
+ draw_ctx,
+ &self.in1,
+ self.color_interpolation_filters,
+ )?;
+ let bounds: IRect = bounds_builder
+ .add_input(&input_1)
+ .compute(ctx)
+ .clipped
+ .into();
+
+ // Create the output surface.
+ let mut surface = ExclusiveImageSurface::new(
+ ctx.source_graphic().width(),
+ ctx.source_graphic().height(),
+ input_1.surface().surface_type(),
+ )?;
+
+ fn compute_func(func: &FeFuncCommon) -> impl Fn(u8, f64, f64) -> u8 {
+ let compute = func.function();
+ let params = func.function_parameters();
+
+ move |value, alpha, new_alpha| {
+ let value = f64::from(value) / 255f64;
+
+ let unpremultiplied = if alpha == 0f64 { 0f64 } else { value / alpha };
+
+ let new_value = compute(&params, unpremultiplied);
+ let new_value = clamp(new_value, 0f64, 1f64);
+
+ ((new_value * new_alpha * 255f64) + 0.5) as u8
+ }
+ }
+
+ let compute_r = compute_func(&self.functions.r.0);
+ let compute_g = compute_func(&self.functions.g.0);
+ let compute_b = compute_func(&self.functions.b.0);
+
+ // Alpha gets special handling since everything else depends on it.
+ let compute_a = self.functions.a.0.function();
+ let params_a = self.functions.a.0.function_parameters();
+ let compute_a = |alpha| compute_a(&params_a, alpha);
+
+ // Do the actual processing.
+ surface.modify(&mut |data, stride| {
+ for (x, y, pixel) in Pixels::within(input_1.surface(), bounds) {
+ let alpha = f64::from(pixel.a) / 255f64;
+ let new_alpha = compute_a(alpha);
+
+ let output_pixel = Pixel {
+ r: compute_r(pixel.r, alpha, new_alpha),
+ g: compute_g(pixel.g, alpha, new_alpha),
+ b: compute_b(pixel.b, alpha, new_alpha),
+ a: ((new_alpha * 255f64) + 0.5) as u8,
+ };
+
+ data.set_pixel(stride, output_pixel, x, y);
+ }
+ });
+
+ Ok(FilterOutput {
+ surface: surface.share()?,
+ bounds,
+ })
+ }
+}
+
+impl FilterEffect for FeComponentTransfer {
+ fn resolve(
+ &self,
+ _acquired_nodes: &mut AcquiredNodes<'_>,
+ node: &Node,
+ ) -> Result<Vec<ResolvedPrimitive>, FilterResolveError> {
+ let cascaded = CascadedValues::new_from_node(node);
+ let values = cascaded.get();
+
+ let mut params = self.params.clone();
+ params.functions = get_functions(node)?;
+ params.color_interpolation_filters = values.color_interpolation_filters();
+
+ Ok(vec![ResolvedPrimitive {
+ primitive: self.base.clone(),
+ params: PrimitiveParams::ComponentTransfer(params),
+ }])
+ }
+}
+
+/// Takes a feComponentTransfer and walks its children to produce the feFuncX arguments.
+fn get_functions(node: &Node) -> Result<Functions, FilterResolveError> {
+ let func_r_node = get_func_x_node!(node, FeFuncR);
+ let func_g_node = get_func_x_node!(node, FeFuncG);
+ let func_b_node = get_func_x_node!(node, FeFuncB);
+ let func_a_node = get_func_x_node!(node, FeFuncA);
+
+ let r = func_or_default!(func_r_node, FeFuncR);
+ let g = func_or_default!(func_g_node, FeFuncG);
+ let b = func_or_default!(func_b_node, FeFuncB);
+ let a = func_or_default!(func_a_node, FeFuncA);
+
+ Ok(Functions { r, g, b, a })
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+ use crate::document::Document;
+
+ #[test]
+ fn extracts_functions() {
+ let document = Document::load_from_bytes(
+ br#"<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg">
+ <filter id="filter">
+ <feComponentTransfer id="component_transfer">
+ <!-- no feFuncR so it should get the defaults -->
+
+ <feFuncG type="table" tableValues="0.0 1.0 2.0"/>
+
+ <feFuncB type="table"/>
+ <!-- duplicate this to test that last-one-wins -->
+ <feFuncB type="discrete" tableValues="0.0, 1.0" slope="1.0" intercept="2.0" amplitude="3.0" exponent="4.0" offset="5.0"/>
+
+ <!-- no feFuncA so it should get the defaults -->
+ </feComponentTransfer>
+ </filter>
+</svg>
+"#
+ );
+
+ let component_transfer = document.lookup_internal_node("component_transfer").unwrap();
+ let functions = get_functions(&component_transfer).unwrap();
+
+ assert_eq!(
+ functions,
+ Functions {
+ r: FeFuncR::default(),
+
+ g: FeFuncG(FeFuncCommon {
+ function_type: FunctionType::Table,
+ table_values: vec![0.0, 1.0, 2.0],
+ ..FeFuncCommon::default()
+ }),
+
+ b: FeFuncB(FeFuncCommon {
+ function_type: FunctionType::Discrete,
+ table_values: vec![0.0, 1.0],
+ slope: 1.0,
+ intercept: 2.0,
+ amplitude: 3.0,
+ exponent: 4.0,
+ offset: 5.0,
+ ..FeFuncCommon::default()
+ }),
+
+ a: FeFuncA::default(),
+ }
+ );
+ }
+}
diff --git a/rsvg/src/filters/composite.rs b/rsvg/src/filters/composite.rs
new file mode 100644
index 00000000..c5c02af1
--- /dev/null
+++ b/rsvg/src/filters/composite.rs
@@ -0,0 +1,179 @@
+use cssparser::Parser;
+use markup5ever::{expanded_name, local_name, namespace_url, ns};
+
+use crate::document::AcquiredNodes;
+use crate::drawing_ctx::DrawingCtx;
+use crate::element::{set_attribute, ElementTrait};
+use crate::error::*;
+use crate::node::{CascadedValues, Node};
+use crate::parsers::{Parse, ParseValue};
+use crate::properties::ColorInterpolationFilters;
+use crate::rect::IRect;
+use crate::session::Session;
+use crate::surface_utils::shared_surface::Operator as SurfaceOperator;
+use crate::xml::Attributes;
+
+use super::bounds::BoundsBuilder;
+use super::context::{FilterContext, FilterOutput};
+use super::{
+ FilterEffect, FilterError, FilterResolveError, Input, Primitive, PrimitiveParams,
+ ResolvedPrimitive,
+};
+
+/// Enumeration of the possible compositing operations.
+#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash)]
+pub enum Operator {
+ Over,
+ In,
+ Out,
+ Atop,
+ Xor,
+ Arithmetic,
+}
+
+enum_default!(Operator, Operator::Over);
+
+/// The `feComposite` filter primitive.
+#[derive(Default)]
+pub struct FeComposite {
+ base: Primitive,
+ params: Composite,
+}
+
+/// Resolved `feComposite` primitive for rendering.
+#[derive(Clone, Default)]
+pub struct Composite {
+ pub in1: Input,
+ pub in2: Input,
+ pub operator: Operator,
+ pub k1: f64,
+ pub k2: f64,
+ pub k3: f64,
+ pub k4: f64,
+ pub color_interpolation_filters: ColorInterpolationFilters,
+}
+
+impl ElementTrait for FeComposite {
+ fn set_attributes(&mut self, attrs: &Attributes, session: &Session) {
+ let (in1, in2) = self.base.parse_two_inputs(attrs, session);
+ self.params.in1 = in1;
+ self.params.in2 = in2;
+
+ for (attr, value) in attrs.iter() {
+ match attr.expanded() {
+ expanded_name!("", "operator") => {
+ set_attribute(&mut self.params.operator, attr.parse(value), session)
+ }
+ expanded_name!("", "k1") => {
+ set_attribute(&mut self.params.k1, attr.parse(value), session)
+ }
+ expanded_name!("", "k2") => {
+ set_attribute(&mut self.params.k2, attr.parse(value), session)
+ }
+ expanded_name!("", "k3") => {
+ set_attribute(&mut self.params.k3, attr.parse(value), session)
+ }
+ expanded_name!("", "k4") => {
+ set_attribute(&mut self.params.k4, attr.parse(value), session)
+ }
+ _ => (),
+ }
+ }
+ }
+}
+
+impl Composite {
+ pub fn render(
+ &self,
+ bounds_builder: BoundsBuilder,
+ ctx: &FilterContext,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ draw_ctx: &mut DrawingCtx,
+ ) -> Result<FilterOutput, FilterError> {
+ let input_1 = ctx.get_input(
+ acquired_nodes,
+ draw_ctx,
+ &self.in1,
+ self.color_interpolation_filters,
+ )?;
+ let input_2 = ctx.get_input(
+ acquired_nodes,
+ draw_ctx,
+ &self.in2,
+ self.color_interpolation_filters,
+ )?;
+ let bounds: IRect = bounds_builder
+ .add_input(&input_1)
+ .add_input(&input_2)
+ .compute(ctx)
+ .clipped
+ .into();
+
+ let surface = if self.operator == Operator::Arithmetic {
+ input_1.surface().compose_arithmetic(
+ input_2.surface(),
+ bounds,
+ self.k1,
+ self.k2,
+ self.k3,
+ self.k4,
+ )?
+ } else {
+ input_1
+ .surface()
+ .compose(input_2.surface(), bounds, self.operator.into())?
+ };
+
+ Ok(FilterOutput { surface, bounds })
+ }
+}
+
+impl FilterEffect for FeComposite {
+ fn resolve(
+ &self,
+ _acquired_nodes: &mut AcquiredNodes<'_>,
+ node: &Node,
+ ) -> Result<Vec<ResolvedPrimitive>, FilterResolveError> {
+ let cascaded = CascadedValues::new_from_node(node);
+ let values = cascaded.get();
+
+ let mut params = self.params.clone();
+ params.color_interpolation_filters = values.color_interpolation_filters();
+
+ Ok(vec![ResolvedPrimitive {
+ primitive: self.base.clone(),
+ params: PrimitiveParams::Composite(params),
+ }])
+ }
+}
+
+impl Parse for Operator {
+ fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<Self, ParseError<'i>> {
+ Ok(parse_identifiers!(
+ parser,
+ "over" => Operator::Over,
+ "in" => Operator::In,
+ "out" => Operator::Out,
+ "atop" => Operator::Atop,
+ "xor" => Operator::Xor,
+ "arithmetic" => Operator::Arithmetic,
+ )?)
+ }
+}
+
+impl From<Operator> for SurfaceOperator {
+ #[inline]
+ fn from(x: Operator) -> SurfaceOperator {
+ use Operator::*;
+
+ match x {
+ Over => SurfaceOperator::Over,
+ In => SurfaceOperator::In,
+ Out => SurfaceOperator::Out,
+ Atop => SurfaceOperator::Atop,
+ Xor => SurfaceOperator::Xor,
+
+ _ => panic!("can't convert Operator::Arithmetic to a shared_surface::Operator"),
+ }
+ }
+}
diff --git a/rsvg/src/filters/context.rs b/rsvg/src/filters/context.rs
new file mode 100644
index 00000000..a3b28d69
--- /dev/null
+++ b/rsvg/src/filters/context.rs
@@ -0,0 +1,405 @@
+use once_cell::sync::OnceCell;
+use std::collections::HashMap;
+use std::rc::Rc;
+
+use crate::bbox::BoundingBox;
+use crate::coord_units::CoordUnits;
+use crate::document::AcquiredNodes;
+use crate::drawing_ctx::DrawingCtx;
+use crate::filter::UserSpaceFilter;
+use crate::paint_server::UserSpacePaintSource;
+use crate::parsers::CustomIdent;
+use crate::properties::ColorInterpolationFilters;
+use crate::rect::{IRect, Rect};
+use crate::surface_utils::shared_surface::{SharedImageSurface, SurfaceType};
+use crate::transform::Transform;
+
+use super::error::FilterError;
+use super::Input;
+
+/// A filter primitive output.
+#[derive(Debug, Clone)]
+pub struct FilterOutput {
+ /// The surface after the filter primitive was applied.
+ pub surface: SharedImageSurface,
+
+ /// The filter primitive subregion.
+ pub bounds: IRect,
+}
+
+/// A filter primitive result.
+#[derive(Debug, Clone)]
+pub struct FilterResult {
+ /// The name of this result: the value of the `result` attribute.
+ pub name: Option<CustomIdent>,
+
+ /// The output.
+ pub output: FilterOutput,
+}
+
+/// An input to a filter primitive.
+#[derive(Debug, Clone)]
+pub enum FilterInput {
+ /// One of the standard inputs.
+ StandardInput(SharedImageSurface),
+ /// Output of another filter primitive.
+ PrimitiveOutput(FilterOutput),
+}
+
+/// The filter rendering context.
+pub struct FilterContext {
+ /// Paint source for primitives which have an input value equal to `StrokePaint`.
+ stroke_paint: Rc<UserSpacePaintSource>,
+ /// Paint source for primitives which have an input value equal to `FillPaint`.
+ fill_paint: Rc<UserSpacePaintSource>,
+
+ /// The source graphic surface.
+ source_surface: SharedImageSurface,
+ /// Output of the last filter primitive.
+ last_result: Option<FilterOutput>,
+ /// Surfaces of the previous filter primitives by name.
+ previous_results: HashMap<CustomIdent, FilterOutput>,
+
+ /// Input surface for primitives that require an input of `BackgroundImage` or `BackgroundAlpha`. Computed lazily.
+ background_surface: OnceCell<Result<SharedImageSurface, FilterError>>,
+
+ // Input surface for primitives that require an input of `StrokePaint`, Computed lazily.
+ stroke_paint_surface: OnceCell<Result<SharedImageSurface, FilterError>>,
+
+ // Input surface for primitives that require an input of `FillPaint`, Computed lazily.
+ fill_paint_surface: OnceCell<Result<SharedImageSurface, FilterError>>,
+
+ /// Primtive units
+ primitive_units: CoordUnits,
+ /// The filter effects region.
+ effects_region: Rect,
+
+ /// The filter element affine matrix.
+ ///
+ /// If `filterUnits == userSpaceOnUse`, equal to the drawing context matrix, so, for example,
+ /// if the target node is in a group with `transform="translate(30, 20)"`, this will be equal
+ /// to a matrix that translates to 30, 20 (and does not scale). Note that the target node
+ /// bounding box isn't included in the computations in this case.
+ ///
+ /// If `filterUnits == objectBoundingBox`, equal to the target node bounding box matrix
+ /// multiplied by the drawing context matrix, so, for example, if the target node is in a group
+ /// with `transform="translate(30, 20)"` and also has `x="1", y="1", width="50", height="50"`,
+ /// this will be equal to a matrix that translates to 31, 21 and scales to 50, 50.
+ ///
+ /// This is to be used in conjunction with setting the viewbox size to account for the scaling.
+ /// For `filterUnits == userSpaceOnUse`, the viewbox will have the actual resolution size, and
+ /// for `filterUnits == objectBoundingBox`, the viewbox will have the size of 1, 1.
+ _affine: Transform,
+
+ /// The filter primitive affine matrix.
+ ///
+ /// See the comments for `_affine`, they largely apply here.
+ paffine: Transform,
+}
+
+impl FilterContext {
+ /// Creates a new `FilterContext`.
+ pub fn new(
+ filter: &UserSpaceFilter,
+ stroke_paint: Rc<UserSpacePaintSource>,
+ fill_paint: Rc<UserSpacePaintSource>,
+ source_surface: &SharedImageSurface,
+ draw_transform: Transform,
+ node_bbox: BoundingBox,
+ ) -> Result<Self, FilterError> {
+ // The rect can be empty (for example, if the filter is applied to an empty group).
+ // However, with userSpaceOnUse it's still possible to create images with a filter.
+ let bbox_rect = node_bbox.rect.unwrap_or_default();
+
+ let affine = match filter.filter_units {
+ CoordUnits::UserSpaceOnUse => draw_transform,
+ CoordUnits::ObjectBoundingBox => Transform::new_unchecked(
+ bbox_rect.width(),
+ 0.0,
+ 0.0,
+ bbox_rect.height(),
+ bbox_rect.x0,
+ bbox_rect.y0,
+ )
+ .post_transform(&draw_transform),
+ };
+
+ let paffine = match filter.primitive_units {
+ CoordUnits::UserSpaceOnUse => draw_transform,
+ CoordUnits::ObjectBoundingBox => Transform::new_unchecked(
+ bbox_rect.width(),
+ 0.0,
+ 0.0,
+ bbox_rect.height(),
+ bbox_rect.x0,
+ bbox_rect.y0,
+ )
+ .post_transform(&draw_transform),
+ };
+
+ if !(affine.is_invertible() && paffine.is_invertible()) {
+ return Err(FilterError::InvalidParameter(
+ "transform is not invertible".to_string(),
+ ));
+ }
+
+ let effects_region = {
+ let mut bbox = BoundingBox::new();
+ let other_bbox = BoundingBox::new()
+ .with_transform(affine)
+ .with_rect(filter.rect);
+
+ // At this point all of the previous viewbox and matrix business gets converted to pixel
+ // coordinates in the final surface, because bbox is created with an identity transform.
+ bbox.insert(&other_bbox);
+
+ // Finally, clip to the width and height of our surface.
+ let (width, height) = (source_surface.width(), source_surface.height());
+ let rect = Rect::from_size(f64::from(width), f64::from(height));
+ let other_bbox = BoundingBox::new().with_rect(rect);
+ bbox.clip(&other_bbox);
+
+ bbox.rect.unwrap()
+ };
+
+ Ok(Self {
+ stroke_paint,
+ fill_paint,
+ source_surface: source_surface.clone(),
+ last_result: None,
+ previous_results: HashMap::new(),
+ background_surface: OnceCell::new(),
+ stroke_paint_surface: OnceCell::new(),
+ fill_paint_surface: OnceCell::new(),
+ primitive_units: filter.primitive_units,
+ effects_region,
+ _affine: affine,
+ paffine,
+ })
+ }
+
+ /// Returns the surface corresponding to the source graphic.
+ #[inline]
+ pub fn source_graphic(&self) -> &SharedImageSurface {
+ &self.source_surface
+ }
+
+ /// Returns the surface corresponding to the background image snapshot.
+ fn background_image(&self, draw_ctx: &DrawingCtx) -> Result<SharedImageSurface, FilterError> {
+ let res = self.background_surface.get_or_init(|| {
+ draw_ctx
+ .get_snapshot(self.source_surface.width(), self.source_surface.height())
+ .map_err(FilterError::Rendering)
+ });
+
+ res.as_ref().map(|s| s.clone()).map_err(|e| e.clone())
+ }
+
+ /// Returns a surface filled with the current stroke's paint, for `StrokePaint` inputs in primitives.
+ ///
+ /// Filter Effects 1: <https://www.w3.org/TR/filter-effects/#attr-valuedef-in-strokepaint>
+ fn stroke_paint_image(
+ &self,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ draw_ctx: &mut DrawingCtx,
+ ) -> Result<SharedImageSurface, FilterError> {
+ let res = self.stroke_paint_surface.get_or_init(|| {
+ Ok(draw_ctx.get_paint_source_surface(
+ self.source_surface.width(),
+ self.source_surface.height(),
+ acquired_nodes,
+ &self.stroke_paint,
+ )?)
+ });
+
+ res.as_ref().map(|s| s.clone()).map_err(|e| e.clone())
+ }
+
+ /// Returns a surface filled with the current fill's paint, for `FillPaint` inputs in primitives.
+ ///
+ /// Filter Effects 1: <https://www.w3.org/TR/filter-effects/#attr-valuedef-in-fillpaint>
+ fn fill_paint_image(
+ &self,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ draw_ctx: &mut DrawingCtx,
+ ) -> Result<SharedImageSurface, FilterError> {
+ let res = self.fill_paint_surface.get_or_init(|| {
+ Ok(draw_ctx.get_paint_source_surface(
+ self.source_surface.width(),
+ self.source_surface.height(),
+ acquired_nodes,
+ &self.fill_paint,
+ )?)
+ });
+
+ res.as_ref().map(|s| s.clone()).map_err(|e| e.clone())
+ }
+
+ /// Converts this `FilterContext` into the surface corresponding to the output of the filter
+ /// chain.
+ ///
+ /// The returned surface is in the sRGB color space.
+ // TODO: sRGB conversion should probably be done by the caller.
+ #[inline]
+ pub fn into_output(self) -> Result<SharedImageSurface, cairo::Error> {
+ match self.last_result {
+ Some(FilterOutput { surface, bounds }) => surface.to_srgb(bounds),
+ None => SharedImageSurface::empty(
+ self.source_surface.width(),
+ self.source_surface.height(),
+ SurfaceType::AlphaOnly,
+ ),
+ }
+ }
+
+ /// Stores a filter primitive result into the context.
+ #[inline]
+ pub fn store_result(&mut self, result: FilterResult) {
+ if let Some(name) = result.name {
+ self.previous_results.insert(name, result.output.clone());
+ }
+
+ self.last_result = Some(result.output);
+ }
+
+ /// Returns the paffine matrix.
+ #[inline]
+ pub fn paffine(&self) -> Transform {
+ self.paffine
+ }
+
+ /// Returns the primitive units.
+ #[inline]
+ pub fn primitive_units(&self) -> CoordUnits {
+ self.primitive_units
+ }
+
+ /// Returns the filter effects region.
+ #[inline]
+ pub fn effects_region(&self) -> Rect {
+ self.effects_region
+ }
+
+ /// Get a filter primitive's default input as if its `in=\"...\"` were not specified.
+ ///
+ /// Per https://drafts.fxtf.org/filter-effects/#element-attrdef-filter-primitive-in,
+ /// "References to non-existent results will be treated as if no result was
+ /// specified". That is, fall back to the last result in the filter chain, or if this
+ /// is the first in the chain, just use SourceGraphic.
+ fn get_unspecified_input(&self) -> FilterInput {
+ if let Some(output) = self.last_result.as_ref() {
+ FilterInput::PrimitiveOutput(output.clone())
+ } else {
+ FilterInput::StandardInput(self.source_graphic().clone())
+ }
+ }
+
+ /// Retrieves the filter input surface according to the SVG rules.
+ fn get_input_raw(
+ &self,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ draw_ctx: &mut DrawingCtx,
+ in_: &Input,
+ ) -> Result<FilterInput, FilterError> {
+ match *in_ {
+ Input::Unspecified => Ok(self.get_unspecified_input()),
+
+ Input::SourceGraphic => Ok(FilterInput::StandardInput(self.source_graphic().clone())),
+
+ Input::SourceAlpha => self
+ .source_graphic()
+ .extract_alpha(self.effects_region().into())
+ .map_err(FilterError::CairoError)
+ .map(FilterInput::StandardInput),
+
+ Input::BackgroundImage => self
+ .background_image(draw_ctx)
+ .map(FilterInput::StandardInput),
+
+ Input::BackgroundAlpha => self
+ .background_image(draw_ctx)
+ .and_then(|surface| {
+ surface
+ .extract_alpha(self.effects_region().into())
+ .map_err(FilterError::CairoError)
+ })
+ .map(FilterInput::StandardInput),
+
+ Input::FillPaint => self
+ .fill_paint_image(acquired_nodes, draw_ctx)
+ .map(FilterInput::StandardInput),
+
+ Input::StrokePaint => self
+ .stroke_paint_image(acquired_nodes, draw_ctx)
+ .map(FilterInput::StandardInput),
+
+ Input::FilterOutput(ref name) => {
+ let input = match self.previous_results.get(name).cloned() {
+ Some(filter_output) => {
+ // Happy path: we found a previous primitive's named output, so pass it on.
+ FilterInput::PrimitiveOutput(filter_output)
+ }
+
+ None => {
+ // Fallback path: we didn't find a primitive's output by the
+ // specified name, so fall back to using an unspecified output.
+ // Per the spec, "References to non-existent results will be
+ // treated as if no result was specified." -
+ // https://drafts.fxtf.org/filter-effects/#element-attrdef-filter-primitive-in
+ self.get_unspecified_input()
+ }
+ };
+
+ Ok(input)
+ }
+ }
+ }
+
+ /// Retrieves the filter input surface according to the SVG rules.
+ ///
+ /// The surface will be converted to the color space specified by `color_interpolation_filters`.
+ pub fn get_input(
+ &self,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ draw_ctx: &mut DrawingCtx,
+ in_: &Input,
+ color_interpolation_filters: ColorInterpolationFilters,
+ ) -> Result<FilterInput, FilterError> {
+ let raw = self.get_input_raw(acquired_nodes, draw_ctx, in_)?;
+
+ // Convert the input surface to the desired format.
+ let (surface, bounds) = match raw {
+ FilterInput::StandardInput(ref surface) => (surface, self.effects_region().into()),
+ FilterInput::PrimitiveOutput(FilterOutput {
+ ref surface,
+ ref bounds,
+ }) => (surface, *bounds),
+ };
+
+ let surface = match color_interpolation_filters {
+ ColorInterpolationFilters::Auto => Ok(surface.clone()),
+ ColorInterpolationFilters::LinearRgb => surface.to_linear_rgb(bounds),
+ ColorInterpolationFilters::Srgb => surface.to_srgb(bounds),
+ };
+
+ surface
+ .map_err(FilterError::CairoError)
+ .map(|surface| match raw {
+ FilterInput::StandardInput(_) => FilterInput::StandardInput(surface),
+ FilterInput::PrimitiveOutput(ref output) => {
+ FilterInput::PrimitiveOutput(FilterOutput { surface, ..*output })
+ }
+ })
+ }
+}
+
+impl FilterInput {
+ /// Retrieves the surface from `FilterInput`.
+ #[inline]
+ pub fn surface(&self) -> &SharedImageSurface {
+ match *self {
+ FilterInput::StandardInput(ref surface) => surface,
+ FilterInput::PrimitiveOutput(FilterOutput { ref surface, .. }) => surface,
+ }
+ }
+}
diff --git a/rsvg/src/filters/convolve_matrix.rs b/rsvg/src/filters/convolve_matrix.rs
new file mode 100644
index 00000000..096ad043
--- /dev/null
+++ b/rsvg/src/filters/convolve_matrix.rs
@@ -0,0 +1,354 @@
+use cssparser::Parser;
+use markup5ever::{expanded_name, local_name, namespace_url, ns};
+use nalgebra::{DMatrix, Dyn, VecStorage};
+
+use crate::document::AcquiredNodes;
+use crate::drawing_ctx::DrawingCtx;
+use crate::element::{set_attribute, ElementTrait};
+use crate::error::*;
+use crate::node::{CascadedValues, Node};
+use crate::parsers::{NumberList, NumberOptionalNumber, Parse, ParseValue};
+use crate::properties::ColorInterpolationFilters;
+use crate::rect::IRect;
+use crate::session::Session;
+use crate::surface_utils::{
+ iterators::{PixelRectangle, Pixels},
+ shared_surface::ExclusiveImageSurface,
+ EdgeMode, ImageSurfaceDataExt, Pixel,
+};
+use crate::util::clamp;
+use crate::xml::Attributes;
+
+use super::bounds::BoundsBuilder;
+use super::context::{FilterContext, FilterOutput};
+use super::{
+ FilterEffect, FilterError, FilterResolveError, Input, Primitive, PrimitiveParams,
+ ResolvedPrimitive,
+};
+
+/// The `feConvolveMatrix` filter primitive.
+#[derive(Default)]
+pub struct FeConvolveMatrix {
+ base: Primitive,
+ params: ConvolveMatrix,
+}
+
+/// Resolved `feConvolveMatrix` primitive for rendering.
+#[derive(Clone)]
+pub struct ConvolveMatrix {
+ in1: Input,
+ order: NumberOptionalNumber<u32>,
+ kernel_matrix: NumberList<0, 400>, // #691: Limit list to 400 (20x20) to mitigate malicious SVGs
+ divisor: f64,
+ bias: f64,
+ target_x: Option<u32>,
+ target_y: Option<u32>,
+ edge_mode: EdgeMode,
+ kernel_unit_length: Option<(f64, f64)>,
+ preserve_alpha: bool,
+ color_interpolation_filters: ColorInterpolationFilters,
+}
+
+impl Default for ConvolveMatrix {
+ /// Constructs a new `ConvolveMatrix` with empty properties.
+ #[inline]
+ fn default() -> ConvolveMatrix {
+ ConvolveMatrix {
+ in1: Default::default(),
+ order: NumberOptionalNumber(3, 3),
+ kernel_matrix: NumberList(Vec::new()),
+ divisor: 0.0,
+ bias: 0.0,
+ target_x: None,
+ target_y: None,
+ edge_mode: EdgeMode::Duplicate,
+ kernel_unit_length: None,
+ preserve_alpha: false,
+ color_interpolation_filters: Default::default(),
+ }
+ }
+}
+
+impl ElementTrait for FeConvolveMatrix {
+ fn set_attributes(&mut self, attrs: &Attributes, session: &Session) {
+ self.params.in1 = self.base.parse_one_input(attrs, session);
+
+ for (attr, value) in attrs.iter() {
+ match attr.expanded() {
+ expanded_name!("", "order") => {
+ set_attribute(&mut self.params.order, attr.parse(value), session)
+ }
+ expanded_name!("", "kernelMatrix") => {
+ set_attribute(&mut self.params.kernel_matrix, attr.parse(value), session)
+ }
+ expanded_name!("", "divisor") => {
+ set_attribute(&mut self.params.divisor, attr.parse(value), session)
+ }
+ expanded_name!("", "bias") => {
+ set_attribute(&mut self.params.bias, attr.parse(value), session)
+ }
+ expanded_name!("", "targetX") => {
+ set_attribute(&mut self.params.target_x, attr.parse(value), session)
+ }
+ expanded_name!("", "targetY") => {
+ set_attribute(&mut self.params.target_y, attr.parse(value), session)
+ }
+ expanded_name!("", "edgeMode") => {
+ set_attribute(&mut self.params.edge_mode, attr.parse(value), session)
+ }
+ expanded_name!("", "kernelUnitLength") => {
+ let v: Result<NumberOptionalNumber<f64>, _> = attr.parse(value);
+ match v {
+ Ok(NumberOptionalNumber(x, y)) => {
+ self.params.kernel_unit_length = Some((x, y));
+ }
+
+ Err(e) => {
+ rsvg_log!(session, "ignoring attribute with invalid value: {}", e);
+ }
+ }
+ }
+ expanded_name!("", "preserveAlpha") => {
+ set_attribute(&mut self.params.preserve_alpha, attr.parse(value), session);
+ }
+
+ _ => (),
+ }
+ }
+ }
+}
+
+impl ConvolveMatrix {
+ pub fn render(
+ &self,
+ bounds_builder: BoundsBuilder,
+ ctx: &FilterContext,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ draw_ctx: &mut DrawingCtx,
+ ) -> Result<FilterOutput, FilterError> {
+ #![allow(clippy::many_single_char_names)]
+
+ let input_1 = ctx.get_input(
+ acquired_nodes,
+ draw_ctx,
+ &self.in1,
+ self.color_interpolation_filters,
+ )?;
+ let mut bounds: IRect = bounds_builder
+ .add_input(&input_1)
+ .compute(ctx)
+ .clipped
+ .into();
+ let original_bounds = bounds;
+
+ let target_x = match self.target_x {
+ Some(x) if x >= self.order.0 => {
+ return Err(FilterError::InvalidParameter(
+ "targetX must be less than orderX".to_string(),
+ ))
+ }
+ Some(x) => x,
+ None => self.order.0 / 2,
+ };
+
+ let target_y = match self.target_y {
+ Some(y) if y >= self.order.1 => {
+ return Err(FilterError::InvalidParameter(
+ "targetY must be less than orderY".to_string(),
+ ))
+ }
+ Some(y) => y,
+ None => self.order.1 / 2,
+ };
+
+ let mut input_surface = if self.preserve_alpha {
+ // preserve_alpha means we need to premultiply and unpremultiply the values.
+ input_1.surface().unpremultiply(bounds)?
+ } else {
+ input_1.surface().clone()
+ };
+
+ let scale = self
+ .kernel_unit_length
+ .and_then(|(x, y)| {
+ if x <= 0.0 || y <= 0.0 {
+ None
+ } else {
+ Some((x, y))
+ }
+ })
+ .map(|(dx, dy)| ctx.paffine().transform_distance(dx, dy));
+
+ if let Some((ox, oy)) = scale {
+ // Scale the input surface to match kernel_unit_length.
+ let (new_surface, new_bounds) = input_surface.scale(bounds, 1.0 / ox, 1.0 / oy)?;
+
+ input_surface = new_surface;
+ bounds = new_bounds;
+ }
+
+ let cols = self.order.0 as usize;
+ let rows = self.order.1 as usize;
+ let number_of_elements = cols * rows;
+ let numbers = self.kernel_matrix.0.clone();
+
+ if numbers.len() != number_of_elements && numbers.len() != 400 {
+ // "If the result of orderX * orderY is not equal to the the number of entries
+ // in the value list, the filter primitive acts as a pass through filter."
+ //
+ // https://drafts.fxtf.org/filter-effects/#element-attrdef-feconvolvematrix-kernelmatrix
+ rsvg_log!(
+ draw_ctx.session(),
+ "feConvolveMatrix got {} elements when it expected {}; ignoring it",
+ numbers.len(),
+ number_of_elements
+ );
+ return Ok(FilterOutput {
+ surface: input_1.surface().clone(),
+ bounds: original_bounds,
+ });
+ }
+
+ let matrix = DMatrix::from_data(VecStorage::new(Dyn(rows), Dyn(cols), numbers));
+
+ let divisor = if self.divisor != 0.0 {
+ self.divisor
+ } else {
+ let d = matrix.iter().sum();
+
+ if d != 0.0 {
+ d
+ } else {
+ 1.0
+ }
+ };
+
+ let mut surface = ExclusiveImageSurface::new(
+ input_surface.width(),
+ input_surface.height(),
+ input_1.surface().surface_type(),
+ )?;
+
+ surface.modify(&mut |data, stride| {
+ for (x, y, pixel) in Pixels::within(&input_surface, bounds) {
+ // Compute the convolution rectangle bounds.
+ let kernel_bounds = IRect::new(
+ x as i32 - target_x as i32,
+ y as i32 - target_y as i32,
+ x as i32 - target_x as i32 + self.order.0 as i32,
+ y as i32 - target_y as i32 + self.order.1 as i32,
+ );
+
+ // Do the convolution.
+ let mut r = 0.0;
+ let mut g = 0.0;
+ let mut b = 0.0;
+ let mut a = 0.0;
+
+ for (x, y, pixel) in
+ PixelRectangle::within(&input_surface, bounds, kernel_bounds, self.edge_mode)
+ {
+ let kernel_x = (kernel_bounds.x1 - x - 1) as usize;
+ let kernel_y = (kernel_bounds.y1 - y - 1) as usize;
+
+ r += f64::from(pixel.r) / 255.0 * matrix[(kernel_y, kernel_x)];
+ g += f64::from(pixel.g) / 255.0 * matrix[(kernel_y, kernel_x)];
+ b += f64::from(pixel.b) / 255.0 * matrix[(kernel_y, kernel_x)];
+
+ if !self.preserve_alpha {
+ a += f64::from(pixel.a) / 255.0 * matrix[(kernel_y, kernel_x)];
+ }
+ }
+
+ // If preserve_alpha is true, set a to the source alpha value.
+ if self.preserve_alpha {
+ a = f64::from(pixel.a) / 255.0;
+ } else {
+ a = a / divisor + self.bias;
+ }
+
+ let clamped_a = clamp(a, 0.0, 1.0);
+
+ let compute = |x| {
+ let x = x / divisor + self.bias * a;
+
+ let x = if self.preserve_alpha {
+ // Premultiply the output value.
+ clamp(x, 0.0, 1.0) * clamped_a
+ } else {
+ clamp(x, 0.0, clamped_a)
+ };
+
+ ((x * 255.0) + 0.5) as u8
+ };
+
+ let output_pixel = Pixel {
+ r: compute(r),
+ g: compute(g),
+ b: compute(b),
+ a: ((clamped_a * 255.0) + 0.5) as u8,
+ };
+
+ data.set_pixel(stride, output_pixel, x, y);
+ }
+ });
+
+ let mut surface = surface.share()?;
+
+ if let Some((ox, oy)) = scale {
+ // Scale the output surface back.
+ surface = surface.scale_to(
+ ctx.source_graphic().width(),
+ ctx.source_graphic().height(),
+ original_bounds,
+ ox,
+ oy,
+ )?;
+
+ bounds = original_bounds;
+ }
+
+ Ok(FilterOutput { surface, bounds })
+ }
+}
+
+impl FilterEffect for FeConvolveMatrix {
+ fn resolve(
+ &self,
+ _acquired_nodes: &mut AcquiredNodes<'_>,
+ node: &Node,
+ ) -> Result<Vec<ResolvedPrimitive>, FilterResolveError> {
+ let cascaded = CascadedValues::new_from_node(node);
+ let values = cascaded.get();
+
+ let mut params = self.params.clone();
+ params.color_interpolation_filters = values.color_interpolation_filters();
+
+ Ok(vec![ResolvedPrimitive {
+ primitive: self.base.clone(),
+ params: PrimitiveParams::ConvolveMatrix(params),
+ }])
+ }
+}
+
+impl Parse for EdgeMode {
+ fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<Self, ParseError<'i>> {
+ Ok(parse_identifiers!(
+ parser,
+ "duplicate" => EdgeMode::Duplicate,
+ "wrap" => EdgeMode::Wrap,
+ "none" => EdgeMode::None,
+ )?)
+ }
+}
+
+// Used for the preserveAlpha attribute
+impl Parse for bool {
+ fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<Self, ParseError<'i>> {
+ Ok(parse_identifiers!(
+ parser,
+ "false" => false,
+ "true" => true,
+ )?)
+ }
+}
diff --git a/rsvg/src/filters/displacement_map.rs b/rsvg/src/filters/displacement_map.rs
new file mode 100644
index 00000000..f0cead68
--- /dev/null
+++ b/rsvg/src/filters/displacement_map.rs
@@ -0,0 +1,195 @@
+use cssparser::Parser;
+use markup5ever::{expanded_name, local_name, namespace_url, ns};
+
+use crate::document::AcquiredNodes;
+use crate::drawing_ctx::DrawingCtx;
+use crate::element::{set_attribute, ElementTrait};
+use crate::error::*;
+use crate::node::{CascadedValues, Node};
+use crate::parsers::{Parse, ParseValue};
+use crate::properties::ColorInterpolationFilters;
+use crate::rect::IRect;
+use crate::session::Session;
+use crate::surface_utils::{iterators::Pixels, shared_surface::ExclusiveImageSurface};
+use crate::xml::Attributes;
+
+use super::bounds::BoundsBuilder;
+use super::context::{FilterContext, FilterOutput};
+use super::{
+ FilterEffect, FilterError, FilterResolveError, Input, Primitive, PrimitiveParams,
+ ResolvedPrimitive,
+};
+
+/// Enumeration of the color channels the displacement map can source.
+#[derive(Clone, Copy)]
+enum ColorChannel {
+ R,
+ G,
+ B,
+ A,
+}
+
+enum_default!(ColorChannel, ColorChannel::A);
+
+/// The `feDisplacementMap` filter primitive.
+#[derive(Default)]
+pub struct FeDisplacementMap {
+ base: Primitive,
+ params: DisplacementMap,
+}
+
+/// Resolved `feDisplacementMap` primitive for rendering.
+#[derive(Clone, Default)]
+pub struct DisplacementMap {
+ in1: Input,
+ in2: Input,
+ scale: f64,
+ x_channel_selector: ColorChannel,
+ y_channel_selector: ColorChannel,
+ color_interpolation_filters: ColorInterpolationFilters,
+}
+
+impl ElementTrait for FeDisplacementMap {
+ fn set_attributes(&mut self, attrs: &Attributes, session: &Session) {
+ let (in1, in2) = self.base.parse_two_inputs(attrs, session);
+ self.params.in1 = in1;
+ self.params.in2 = in2;
+
+ for (attr, value) in attrs.iter() {
+ match attr.expanded() {
+ expanded_name!("", "scale") => {
+ set_attribute(&mut self.params.scale, attr.parse(value), session)
+ }
+ expanded_name!("", "xChannelSelector") => {
+ set_attribute(
+ &mut self.params.x_channel_selector,
+ attr.parse(value),
+ session,
+ );
+ }
+ expanded_name!("", "yChannelSelector") => {
+ set_attribute(
+ &mut self.params.y_channel_selector,
+ attr.parse(value),
+ session,
+ );
+ }
+ _ => (),
+ }
+ }
+ }
+}
+
+impl DisplacementMap {
+ pub fn render(
+ &self,
+ bounds_builder: BoundsBuilder,
+ ctx: &FilterContext,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ draw_ctx: &mut DrawingCtx,
+ ) -> Result<FilterOutput, FilterError> {
+ // https://www.w3.org/TR/filter-effects/#feDisplacementMapElement
+ // "The color-interpolation-filters property only applies to
+ // the in2 source image and does not apply to the in source
+ // image. The in source image must remain in its current color
+ // space.
+
+ let input_1 = ctx.get_input(
+ acquired_nodes,
+ draw_ctx,
+ &self.in1,
+ ColorInterpolationFilters::Auto,
+ )?;
+ let displacement_input = ctx.get_input(
+ acquired_nodes,
+ draw_ctx,
+ &self.in2,
+ self.color_interpolation_filters,
+ )?;
+ let bounds: IRect = bounds_builder
+ .add_input(&input_1)
+ .add_input(&displacement_input)
+ .compute(ctx)
+ .clipped
+ .into();
+
+ // Displacement map's values need to be non-premultiplied.
+ let displacement_surface = displacement_input.surface().unpremultiply(bounds)?;
+
+ let (sx, sy) = ctx.paffine().transform_distance(self.scale, self.scale);
+
+ let mut surface = ExclusiveImageSurface::new(
+ ctx.source_graphic().width(),
+ ctx.source_graphic().height(),
+ input_1.surface().surface_type(),
+ )?;
+
+ surface.draw(&mut |cr| {
+ for (x, y, displacement_pixel) in Pixels::within(&displacement_surface, bounds) {
+ let get_value = |channel| match channel {
+ ColorChannel::R => displacement_pixel.r,
+ ColorChannel::G => displacement_pixel.g,
+ ColorChannel::B => displacement_pixel.b,
+ ColorChannel::A => displacement_pixel.a,
+ };
+
+ let process = |x| f64::from(x) / 255.0 - 0.5;
+
+ let dx = process(get_value(self.x_channel_selector));
+ let dy = process(get_value(self.y_channel_selector));
+
+ let x = f64::from(x);
+ let y = f64::from(y);
+ let ox = sx * dx;
+ let oy = sy * dy;
+
+ // Doing this in a loop doesn't look too bad performance wise, and allows not to
+ // manually implement bilinear or other interpolation.
+ cr.rectangle(x, y, 1.0, 1.0);
+ cr.reset_clip();
+ cr.clip();
+
+ input_1.surface().set_as_source_surface(&cr, -ox, -oy)?;
+ cr.paint()?;
+ }
+
+ Ok(())
+ })?;
+
+ Ok(FilterOutput {
+ surface: surface.share()?,
+ bounds,
+ })
+ }
+}
+
+impl FilterEffect for FeDisplacementMap {
+ fn resolve(
+ &self,
+ _acquired_nodes: &mut AcquiredNodes<'_>,
+ node: &Node,
+ ) -> Result<Vec<ResolvedPrimitive>, FilterResolveError> {
+ let cascaded = CascadedValues::new_from_node(node);
+ let values = cascaded.get();
+
+ let mut params = self.params.clone();
+ params.color_interpolation_filters = values.color_interpolation_filters();
+
+ Ok(vec![ResolvedPrimitive {
+ primitive: self.base.clone(),
+ params: PrimitiveParams::DisplacementMap(params),
+ }])
+ }
+}
+
+impl Parse for ColorChannel {
+ fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<Self, ParseError<'i>> {
+ Ok(parse_identifiers!(
+ parser,
+ "R" => ColorChannel::R,
+ "G" => ColorChannel::G,
+ "B" => ColorChannel::B,
+ "A" => ColorChannel::A,
+ )?)
+ }
+}
diff --git a/rsvg/src/filters/drop_shadow.rs b/rsvg/src/filters/drop_shadow.rs
new file mode 100644
index 00000000..49abb574
--- /dev/null
+++ b/rsvg/src/filters/drop_shadow.rs
@@ -0,0 +1,88 @@
+use markup5ever::{expanded_name, local_name, namespace_url, ns};
+
+use crate::document::AcquiredNodes;
+use crate::element::{set_attribute, ElementTrait};
+use crate::filter_func::drop_shadow_primitives;
+use crate::node::{CascadedValues, Node};
+use crate::paint_server::resolve_color;
+use crate::parsers::{NumberOptionalNumber, ParseValue};
+use crate::session::Session;
+use crate::xml::Attributes;
+
+use super::{FilterEffect, FilterResolveError, Input, Primitive, ResolvedPrimitive};
+
+/// The `feDropShadow` element.
+#[derive(Default)]
+pub struct FeDropShadow {
+ base: Primitive,
+ params: DropShadow,
+}
+
+/// Resolved `feDropShadow` parameters for rendering.
+#[derive(Clone)]
+pub struct DropShadow {
+ pub in1: Input,
+ pub dx: f64,
+ pub dy: f64,
+ pub std_deviation: NumberOptionalNumber<f64>,
+}
+
+impl Default for DropShadow {
+ /// Defaults come from https://www.w3.org/TR/filter-effects/#feDropShadowElement
+ fn default() -> Self {
+ Self {
+ in1: Default::default(),
+ dx: 2.0,
+ dy: 2.0,
+ std_deviation: NumberOptionalNumber(2.0, 2.0),
+ }
+ }
+}
+
+impl ElementTrait for FeDropShadow {
+ fn set_attributes(&mut self, attrs: &Attributes, session: &Session) {
+ self.params.in1 = self.base.parse_one_input(attrs, session);
+
+ for (attr, value) in attrs.iter() {
+ match attr.expanded() {
+ expanded_name!("", "dx") => {
+ set_attribute(&mut self.params.dx, attr.parse(value), session);
+ }
+
+ expanded_name!("", "dy") => {
+ set_attribute(&mut self.params.dy, attr.parse(value), session);
+ }
+
+ expanded_name!("", "stdDeviation") => {
+ set_attribute(&mut self.params.std_deviation, attr.parse(value), session);
+ }
+
+ _ => (),
+ }
+ }
+ }
+}
+
+impl FilterEffect for FeDropShadow {
+ fn resolve(
+ &self,
+ _acquired_nodes: &mut AcquiredNodes<'_>,
+ node: &Node,
+ ) -> Result<Vec<ResolvedPrimitive>, FilterResolveError> {
+ let cascaded = CascadedValues::new_from_node(node);
+ let values = cascaded.get();
+
+ let color = resolve_color(
+ &values.flood_color().0,
+ values.flood_opacity().0,
+ values.color().0,
+ );
+
+ Ok(drop_shadow_primitives(
+ self.params.dx,
+ self.params.dy,
+ self.params.std_deviation,
+ color,
+ ))
+ }
+}
diff --git a/rsvg/src/filters/error.rs b/rsvg/src/filters/error.rs
new file mode 100644
index 00000000..1b1f9bc1
--- /dev/null
+++ b/rsvg/src/filters/error.rs
@@ -0,0 +1,78 @@
+use std::fmt;
+
+use crate::error::RenderingError;
+
+/// An enumeration of errors that can occur during filter primitive rendering.
+#[derive(Debug, Clone)]
+pub enum FilterError {
+ /// The filter was passed invalid input (the `in` attribute).
+ InvalidInput,
+ /// The filter was passed an invalid parameter.
+ InvalidParameter(String),
+ /// The filter input surface has an unsuccessful status.
+ BadInputSurfaceStatus(cairo::Error),
+ /// A Cairo error.
+ ///
+ /// This means that either a failed intermediate surface creation or bad intermediate surface
+ /// status.
+ CairoError(cairo::Error),
+ /// Error from the rendering backend.
+ Rendering(RenderingError),
+ /// A lighting filter input surface is too small.
+ LightingInputTooSmall,
+}
+
+/// Errors that can occur while resolving a `FilterSpec`.
+#[derive(Debug)]
+pub enum FilterResolveError {
+ /// An `uri(#foo)` reference does not point to a `<filter>` element.
+ ReferenceToNonFilterElement,
+ /// A lighting filter has none or multiple light sources.
+ InvalidLightSourceCount,
+ /// Child node was in error.
+ ChildNodeInError,
+}
+
+impl fmt::Display for FilterError {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ match *self {
+ FilterError::InvalidInput => write!(f, "invalid value of the `in` attribute"),
+ FilterError::InvalidParameter(ref s) => write!(f, "invalid parameter value: {s}"),
+ FilterError::BadInputSurfaceStatus(ref status) => {
+ write!(f, "invalid status of the input surface: {status}")
+ }
+ FilterError::CairoError(ref status) => write!(f, "Cairo error: {status}"),
+ FilterError::Rendering(ref e) => write!(f, "Rendering error: {e}"),
+ FilterError::LightingInputTooSmall => write!(
+ f,
+ "lighting filter input surface is too small (less than 2×2 pixels)"
+ ),
+ }
+ }
+}
+
+impl fmt::Display for FilterResolveError {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ match *self {
+ FilterResolveError::ReferenceToNonFilterElement => {
+ write!(f, "reference to a non-filter element")
+ }
+ FilterResolveError::InvalidLightSourceCount => write!(f, "invalid light source count"),
+ FilterResolveError::ChildNodeInError => write!(f, "child node was in error"),
+ }
+ }
+}
+
+impl From<cairo::Error> for FilterError {
+ #[inline]
+ fn from(x: cairo::Error) -> Self {
+ FilterError::CairoError(x)
+ }
+}
+
+impl From<RenderingError> for FilterError {
+ #[inline]
+ fn from(e: RenderingError) -> Self {
+ FilterError::Rendering(e)
+ }
+}
diff --git a/rsvg/src/filters/flood.rs b/rsvg/src/filters/flood.rs
new file mode 100644
index 00000000..4ebf0257
--- /dev/null
+++ b/rsvg/src/filters/flood.rs
@@ -0,0 +1,70 @@
+use crate::document::AcquiredNodes;
+use crate::drawing_ctx::DrawingCtx;
+use crate::element::ElementTrait;
+use crate::node::{CascadedValues, Node};
+use crate::paint_server::resolve_color;
+use crate::rect::IRect;
+use crate::session::Session;
+use crate::xml::Attributes;
+
+use super::bounds::BoundsBuilder;
+use super::context::{FilterContext, FilterOutput};
+use super::{
+ FilterEffect, FilterError, FilterResolveError, Primitive, PrimitiveParams, ResolvedPrimitive,
+};
+
+/// The `feFlood` filter primitive.
+#[derive(Default)]
+pub struct FeFlood {
+ base: Primitive,
+}
+
+/// Resolved `feFlood` primitive for rendering.
+pub struct Flood {
+ pub color: cssparser::RGBA,
+}
+
+impl ElementTrait for FeFlood {
+ fn set_attributes(&mut self, attrs: &Attributes, session: &Session) {
+ self.base.parse_no_inputs(attrs, session);
+ }
+}
+
+impl Flood {
+ pub fn render(
+ &self,
+ bounds_builder: BoundsBuilder,
+ ctx: &FilterContext,
+ _acquired_nodes: &mut AcquiredNodes<'_>,
+ draw_ctx: &mut DrawingCtx,
+ ) -> Result<FilterOutput, FilterError> {
+ let bounds: IRect = bounds_builder.compute(ctx).clipped.into();
+ rsvg_log!(draw_ctx.session(), "(feFlood bounds={:?}", bounds);
+
+ let surface = ctx.source_graphic().flood(bounds, self.color)?;
+
+ Ok(FilterOutput { surface, bounds })
+ }
+}
+
+impl FilterEffect for FeFlood {
+ fn resolve(
+ &self,
+ _acquired_nodes: &mut AcquiredNodes<'_>,
+ node: &Node,
+ ) -> Result<Vec<ResolvedPrimitive>, FilterResolveError> {
+ let cascaded = CascadedValues::new_from_node(node);
+ let values = cascaded.get();
+
+ Ok(vec![ResolvedPrimitive {
+ primitive: self.base.clone(),
+ params: PrimitiveParams::Flood(Flood {
+ color: resolve_color(
+ &values.flood_color().0,
+ values.flood_opacity().0,
+ values.color().0,
+ ),
+ }),
+ }])
+ }
+}
diff --git a/rsvg/src/filters/gaussian_blur.rs b/rsvg/src/filters/gaussian_blur.rs
new file mode 100644
index 00000000..b56fc9ef
--- /dev/null
+++ b/rsvg/src/filters/gaussian_blur.rs
@@ -0,0 +1,282 @@
+use std::cmp::min;
+use std::f64;
+
+use markup5ever::{expanded_name, local_name, namespace_url, ns};
+use nalgebra::{DMatrix, Dyn, VecStorage};
+
+use crate::document::AcquiredNodes;
+use crate::drawing_ctx::DrawingCtx;
+use crate::element::{set_attribute, ElementTrait};
+use crate::node::{CascadedValues, Node};
+use crate::parsers::{NumberOptionalNumber, ParseValue};
+use crate::properties::ColorInterpolationFilters;
+use crate::rect::IRect;
+use crate::session::Session;
+use crate::surface_utils::{
+ shared_surface::{BlurDirection, Horizontal, SharedImageSurface, Vertical},
+ EdgeMode,
+};
+use crate::xml::Attributes;
+
+use super::bounds::BoundsBuilder;
+use super::context::{FilterContext, FilterOutput};
+use super::{
+ FilterEffect, FilterError, FilterResolveError, Input, Primitive, PrimitiveParams,
+ ResolvedPrimitive,
+};
+
+/// The maximum gaussian blur kernel size.
+///
+/// The value of 500 is used in webkit.
+const MAXIMUM_KERNEL_SIZE: usize = 500;
+
+/// The `feGaussianBlur` filter primitive.
+#[derive(Default)]
+pub struct FeGaussianBlur {
+ base: Primitive,
+ params: GaussianBlur,
+}
+
+/// Resolved `feGaussianBlur` primitive for rendering.
+#[derive(Clone)]
+pub struct GaussianBlur {
+ pub in1: Input,
+ pub std_deviation: NumberOptionalNumber<f64>,
+ pub color_interpolation_filters: ColorInterpolationFilters,
+}
+
+// We need this because NumberOptionalNumber doesn't impl Default
+impl Default for GaussianBlur {
+ fn default() -> GaussianBlur {
+ GaussianBlur {
+ in1: Default::default(),
+ std_deviation: NumberOptionalNumber(0.0, 0.0),
+ color_interpolation_filters: Default::default(),
+ }
+ }
+}
+
+impl ElementTrait for FeGaussianBlur {
+ fn set_attributes(&mut self, attrs: &Attributes, session: &Session) {
+ self.params.in1 = self.base.parse_one_input(attrs, session);
+
+ for (attr, value) in attrs.iter() {
+ if let expanded_name!("", "stdDeviation") = attr.expanded() {
+ set_attribute(&mut self.params.std_deviation, attr.parse(value), session);
+ }
+ }
+ }
+}
+
+/// Computes a gaussian kernel line for the given standard deviation.
+fn gaussian_kernel(std_deviation: f64) -> Vec<f64> {
+ assert!(std_deviation > 0.0);
+
+ // Make sure there aren't any infinities.
+ let maximal_deviation = (MAXIMUM_KERNEL_SIZE / 2) as f64 / 3.0;
+
+ // Values further away than std_deviation * 3 are too small to contribute anything meaningful.
+ let radius = ((std_deviation.min(maximal_deviation) * 3.0) + 0.5) as usize;
+ // Clamp the radius rather than diameter because `MAXIMUM_KERNEL_SIZE` might be even and we
+ // want an odd-sized kernel.
+ let radius = min(radius, (MAXIMUM_KERNEL_SIZE - 1) / 2);
+ let diameter = radius * 2 + 1;
+
+ let mut kernel = Vec::with_capacity(diameter);
+
+ let gauss_point = |x: f64| (-x.powi(2) / (2.0 * std_deviation.powi(2))).exp();
+
+ // Fill the matrix by doing numerical integration approximation from -2*std_dev to 2*std_dev,
+ // sampling 50 points per pixel. We do the bottom half, mirror it to the top half, then compute
+ // the center point. Otherwise asymmetric quantization errors will occur. The formula to
+ // integrate is e^-(x^2/2s^2).
+ for i in 0..diameter / 2 {
+ let base_x = (diameter / 2 + 1 - i) as f64 - 0.5;
+
+ let mut sum = 0.0;
+ for j in 1..=50 {
+ let r = base_x + 0.02 * f64::from(j);
+ sum += gauss_point(r);
+ }
+
+ kernel.push(sum / 50.0);
+ }
+
+ // We'll compute the middle point later.
+ kernel.push(0.0);
+
+ // Mirror the bottom half to the top half.
+ for i in 0..diameter / 2 {
+ let x = kernel[diameter / 2 - 1 - i];
+ kernel.push(x);
+ }
+
+ // Find center val -- calculate an odd number of quanta to make it symmetric, even if the
+ // center point is weighted slightly higher than others.
+ let mut sum = 0.0;
+ for j in 0..=50 {
+ let r = -0.5 + 0.02 * f64::from(j);
+ sum += gauss_point(r);
+ }
+ kernel[diameter / 2] = sum / 51.0;
+
+ // Normalize the distribution by scaling the total sum to 1.
+ let sum = kernel.iter().sum::<f64>();
+ kernel.iter_mut().for_each(|x| *x /= sum);
+
+ kernel
+}
+
+/// Returns a size of the box blur kernel to approximate the gaussian blur.
+fn box_blur_kernel_size(std_deviation: f64) -> usize {
+ let d = (std_deviation * 3.0 * (2.0 * f64::consts::PI).sqrt() / 4.0 + 0.5).floor();
+ let d = d.min(MAXIMUM_KERNEL_SIZE as f64);
+ d as usize
+}
+
+/// Applies three box blurs to approximate the gaussian blur.
+///
+/// This is intended to be used in two steps, horizontal and vertical.
+fn three_box_blurs<B: BlurDirection>(
+ surface: &SharedImageSurface,
+ bounds: IRect,
+ std_deviation: f64,
+) -> Result<SharedImageSurface, FilterError> {
+ let d = box_blur_kernel_size(std_deviation);
+ if d == 0 {
+ return Ok(surface.clone());
+ }
+
+ let surface = if d % 2 == 1 {
+ // Odd kernel sizes just get three successive box blurs.
+ let mut surface = surface.clone();
+
+ for _ in 0..3 {
+ surface = surface.box_blur::<B>(bounds, d, d / 2)?;
+ }
+
+ surface
+ } else {
+ // Even kernel sizes have a more interesting scheme.
+ let surface = surface.box_blur::<B>(bounds, d, d / 2)?;
+ let surface = surface.box_blur::<B>(bounds, d, d / 2 - 1)?;
+
+ let d = d + 1;
+ surface.box_blur::<B>(bounds, d, d / 2)?
+ };
+
+ Ok(surface)
+}
+
+/// Applies the gaussian blur.
+///
+/// This is intended to be used in two steps, horizontal and vertical.
+fn gaussian_blur(
+ input_surface: &SharedImageSurface,
+ bounds: IRect,
+ std_deviation: f64,
+ vertical: bool,
+) -> Result<SharedImageSurface, FilterError> {
+ let kernel = gaussian_kernel(std_deviation);
+ let (rows, cols) = if vertical {
+ (kernel.len(), 1)
+ } else {
+ (1, kernel.len())
+ };
+ let kernel = DMatrix::from_data(VecStorage::new(Dyn(rows), Dyn(cols), kernel));
+
+ Ok(input_surface.convolve(
+ bounds,
+ ((cols / 2) as i32, (rows / 2) as i32),
+ &kernel,
+ EdgeMode::None,
+ )?)
+}
+
+impl GaussianBlur {
+ pub fn render(
+ &self,
+ bounds_builder: BoundsBuilder,
+ ctx: &FilterContext,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ draw_ctx: &mut DrawingCtx,
+ ) -> Result<FilterOutput, FilterError> {
+ let input_1 = ctx.get_input(
+ acquired_nodes,
+ draw_ctx,
+ &self.in1,
+ self.color_interpolation_filters,
+ )?;
+ let bounds: IRect = bounds_builder
+ .add_input(&input_1)
+ .compute(ctx)
+ .clipped
+ .into();
+
+ let NumberOptionalNumber(std_x, std_y) = self.std_deviation;
+
+ // "A negative value or a value of zero disables the effect of
+ // the given filter primitive (i.e., the result is the filter
+ // input image)."
+ if std_x <= 0.0 && std_y <= 0.0 {
+ return Ok(FilterOutput {
+ surface: input_1.surface().clone(),
+ bounds,
+ });
+ }
+
+ let (std_x, std_y) = ctx.paffine().transform_distance(std_x, std_y);
+
+ // The deviation can become negative here due to the transform.
+ let std_x = std_x.abs();
+ let std_y = std_y.abs();
+
+ // Performance TODO: gaussian blur is frequently used for shadows, operating on SourceAlpha
+ // (so the image is alpha-only). We can use this to not waste time processing the other
+ // channels.
+
+ // Horizontal convolution.
+ let horiz_result_surface = if std_x >= 2.0 {
+ // The spec says for deviation >= 2.0 three box blurs can be used as an optimization.
+ three_box_blurs::<Horizontal>(input_1.surface(), bounds, std_x)?
+ } else if std_x != 0.0 {
+ gaussian_blur(input_1.surface(), bounds, std_x, false)?
+ } else {
+ input_1.surface().clone()
+ };
+
+ // Vertical convolution.
+ let output_surface = if std_y >= 2.0 {
+ // The spec says for deviation >= 2.0 three box blurs can be used as an optimization.
+ three_box_blurs::<Vertical>(&horiz_result_surface, bounds, std_y)?
+ } else if std_y != 0.0 {
+ gaussian_blur(&horiz_result_surface, bounds, std_y, true)?
+ } else {
+ horiz_result_surface
+ };
+
+ Ok(FilterOutput {
+ surface: output_surface,
+ bounds,
+ })
+ }
+}
+
+impl FilterEffect for FeGaussianBlur {
+ fn resolve(
+ &self,
+ _acquired_nodes: &mut AcquiredNodes<'_>,
+ node: &Node,
+ ) -> Result<Vec<ResolvedPrimitive>, FilterResolveError> {
+ let cascaded = CascadedValues::new_from_node(node);
+ let values = cascaded.get();
+
+ let mut params = self.params.clone();
+ params.color_interpolation_filters = values.color_interpolation_filters();
+
+ Ok(vec![ResolvedPrimitive {
+ primitive: self.base.clone(),
+ params: PrimitiveParams::GaussianBlur(params),
+ }])
+ }
+}
diff --git a/rsvg/src/filters/image.rs b/rsvg/src/filters/image.rs
new file mode 100644
index 00000000..eaeb08f9
--- /dev/null
+++ b/rsvg/src/filters/image.rs
@@ -0,0 +1,211 @@
+use markup5ever::{expanded_name, local_name, namespace_url, ns};
+
+use crate::aspect_ratio::AspectRatio;
+use crate::document::{AcquiredNodes, NodeId};
+use crate::drawing_ctx::DrawingCtx;
+use crate::element::{set_attribute, ElementTrait};
+use crate::href::{is_href, set_href};
+use crate::node::{CascadedValues, Node};
+use crate::parsers::ParseValue;
+use crate::properties::ComputedValues;
+use crate::rect::Rect;
+use crate::session::Session;
+use crate::surface_utils::shared_surface::SharedImageSurface;
+use crate::viewbox::ViewBox;
+use crate::xml::Attributes;
+
+use super::bounds::{Bounds, BoundsBuilder};
+use super::context::{FilterContext, FilterOutput};
+use super::{
+ FilterEffect, FilterError, FilterResolveError, Primitive, PrimitiveParams, ResolvedPrimitive,
+};
+
+/// The `feImage` filter primitive.
+#[derive(Default)]
+pub struct FeImage {
+ base: Primitive,
+ params: ImageParams,
+}
+
+#[derive(Clone, Default)]
+struct ImageParams {
+ aspect: AspectRatio,
+ href: Option<String>,
+}
+
+/// Resolved `feImage` primitive for rendering.
+pub struct Image {
+ aspect: AspectRatio,
+ source: Source,
+ feimage_values: Box<ComputedValues>,
+}
+
+/// What a feImage references for rendering.
+enum Source {
+ /// Nothing is referenced; ignore the filter.
+ None,
+
+ /// Reference to a node.
+ Node(Node),
+
+ /// Reference to an external image. This is just a URL.
+ ExternalImage(String),
+}
+
+impl Image {
+ /// Renders the filter if the source is an existing node.
+ fn render_node(
+ &self,
+ ctx: &FilterContext,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ draw_ctx: &mut DrawingCtx,
+ bounds: Rect,
+ referenced_node: &Node,
+ ) -> Result<SharedImageSurface, FilterError> {
+ // https://www.w3.org/TR/filter-effects/#feImageElement
+ //
+ // The filters spec says, "... otherwise [rendering a referenced object], the
+ // referenced resource is rendered according to the behavior of the use element."
+ // I think this means that we use the same cascading mode as <use>, i.e. the
+ // referenced object inherits its properties from the feImage element.
+ let cascaded =
+ CascadedValues::new_from_values(referenced_node, &self.feimage_values, None, None);
+
+ let image = draw_ctx.draw_node_to_surface(
+ referenced_node,
+ acquired_nodes,
+ &cascaded,
+ ctx.paffine(),
+ ctx.source_graphic().width(),
+ ctx.source_graphic().height(),
+ )?;
+
+ let surface = ctx.source_graphic().paint_image(bounds, &image, None)?;
+
+ Ok(surface)
+ }
+
+ /// Renders the filter if the source is an external image.
+ fn render_external_image(
+ &self,
+ ctx: &FilterContext,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ _draw_ctx: &DrawingCtx,
+ bounds: &Bounds,
+ url: &str,
+ ) -> Result<SharedImageSurface, FilterError> {
+ // FIXME: translate the error better here
+ let image = acquired_nodes
+ .lookup_image(url)
+ .map_err(|_| FilterError::InvalidInput)?;
+
+ let rect = self.aspect.compute(
+ &ViewBox::from(Rect::from_size(
+ f64::from(image.width()),
+ f64::from(image.height()),
+ )),
+ &bounds.unclipped,
+ );
+
+ let surface = ctx
+ .source_graphic()
+ .paint_image(bounds.clipped, &image, Some(rect))?;
+
+ Ok(surface)
+ }
+}
+
+impl ElementTrait for FeImage {
+ fn set_attributes(&mut self, attrs: &Attributes, session: &Session) {
+ self.base.parse_no_inputs(attrs, session);
+
+ for (attr, value) in attrs.iter() {
+ match attr.expanded() {
+ expanded_name!("", "preserveAspectRatio") => {
+ set_attribute(&mut self.params.aspect, attr.parse(value), session);
+ }
+
+ // "path" is used by some older Adobe Illustrator versions
+ ref a if is_href(a) || *a == expanded_name!("", "path") => {
+ set_href(a, &mut self.params.href, Some(value.to_string()));
+ }
+
+ _ => (),
+ }
+ }
+ }
+}
+
+impl Image {
+ pub fn render(
+ &self,
+ bounds_builder: BoundsBuilder,
+ ctx: &FilterContext,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ draw_ctx: &mut DrawingCtx,
+ ) -> Result<FilterOutput, FilterError> {
+ let bounds = bounds_builder.compute(ctx);
+
+ let surface = match &self.source {
+ Source::None => return Err(FilterError::InvalidInput),
+
+ Source::Node(node) => {
+ if let Ok(acquired) = acquired_nodes.acquire_ref(node) {
+ self.render_node(
+ ctx,
+ acquired_nodes,
+ draw_ctx,
+ bounds.clipped,
+ acquired.get(),
+ )?
+ } else {
+ return Err(FilterError::InvalidInput);
+ }
+ }
+
+ Source::ExternalImage(ref href) => {
+ self.render_external_image(ctx, acquired_nodes, draw_ctx, &bounds, href)?
+ }
+ };
+
+ Ok(FilterOutput {
+ surface,
+ bounds: bounds.clipped.into(),
+ })
+ }
+}
+
+impl FilterEffect for FeImage {
+ fn resolve(
+ &self,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ node: &Node,
+ ) -> Result<Vec<ResolvedPrimitive>, FilterResolveError> {
+ let cascaded = CascadedValues::new_from_node(node);
+ let feimage_values = cascaded.get().clone();
+
+ let source = match self.params.href {
+ None => Source::None,
+
+ Some(ref s) => {
+ if let Ok(node_id) = NodeId::parse(s) {
+ acquired_nodes
+ .acquire(&node_id)
+ .map(|acquired| Source::Node(acquired.get().clone()))
+ .unwrap_or(Source::None)
+ } else {
+ Source::ExternalImage(s.to_string())
+ }
+ }
+ };
+
+ Ok(vec![ResolvedPrimitive {
+ primitive: self.base.clone(),
+ params: PrimitiveParams::Image(Image {
+ aspect: self.params.aspect,
+ source,
+ feimage_values: Box::new(feimage_values),
+ }),
+ }])
+ }
+}
diff --git a/rsvg/src/filters/lighting.rs b/rsvg/src/filters/lighting.rs
new file mode 100644
index 00000000..ed39e78b
--- /dev/null
+++ b/rsvg/src/filters/lighting.rs
@@ -0,0 +1,1090 @@
+//! Lighting filters and light nodes.
+
+use float_cmp::approx_eq;
+use markup5ever::{expanded_name, local_name, namespace_url, ns};
+use nalgebra::{Vector2, Vector3};
+use num_traits::identities::Zero;
+use rayon::prelude::*;
+use std::cmp::max;
+
+use crate::document::AcquiredNodes;
+use crate::drawing_ctx::DrawingCtx;
+use crate::element::{set_attribute, ElementData, ElementTrait};
+use crate::filters::{
+ bounds::BoundsBuilder,
+ context::{FilterContext, FilterOutput},
+ FilterEffect, FilterError, FilterResolveError, Input, Primitive, PrimitiveParams,
+ ResolvedPrimitive,
+};
+use crate::node::{CascadedValues, Node, NodeBorrow};
+use crate::paint_server::resolve_color;
+use crate::parsers::{NonNegative, NumberOptionalNumber, ParseValue};
+use crate::properties::ColorInterpolationFilters;
+use crate::rect::IRect;
+use crate::session::Session;
+use crate::surface_utils::{
+ shared_surface::{ExclusiveImageSurface, SharedImageSurface, SurfaceType},
+ ImageSurfaceDataExt, Pixel,
+};
+use crate::transform::Transform;
+use crate::unit_interval::UnitInterval;
+use crate::util::clamp;
+use crate::xml::Attributes;
+
+/// The `feDiffuseLighting` filter primitives.
+#[derive(Default)]
+pub struct FeDiffuseLighting {
+ base: Primitive,
+ params: DiffuseLightingParams,
+}
+
+#[derive(Clone)]
+pub struct DiffuseLightingParams {
+ in1: Input,
+ surface_scale: f64,
+ kernel_unit_length: Option<(f64, f64)>,
+ diffuse_constant: NonNegative,
+}
+
+impl Default for DiffuseLightingParams {
+ fn default() -> Self {
+ Self {
+ in1: Default::default(),
+ surface_scale: 1.0,
+ kernel_unit_length: None,
+ diffuse_constant: NonNegative(1.0),
+ }
+ }
+}
+
+/// The `feSpecularLighting` filter primitives.
+#[derive(Default)]
+pub struct FeSpecularLighting {
+ base: Primitive,
+ params: SpecularLightingParams,
+}
+
+#[derive(Clone)]
+pub struct SpecularLightingParams {
+ in1: Input,
+ surface_scale: f64,
+ kernel_unit_length: Option<(f64, f64)>,
+ specular_constant: NonNegative,
+ specular_exponent: f64,
+}
+
+impl Default for SpecularLightingParams {
+ fn default() -> Self {
+ Self {
+ in1: Default::default(),
+ surface_scale: 1.0,
+ kernel_unit_length: None,
+ specular_constant: NonNegative(1.0),
+ specular_exponent: 1.0,
+ }
+ }
+}
+
+/// Resolved `feDiffuseLighting` primitive for rendering.
+pub struct DiffuseLighting {
+ params: DiffuseLightingParams,
+ light: Light,
+}
+
+/// Resolved `feSpecularLighting` primitive for rendering.
+pub struct SpecularLighting {
+ params: SpecularLightingParams,
+ light: Light,
+}
+
+/// A light source before applying affine transformations, straight out of the SVG.
+#[derive(Debug, PartialEq)]
+enum UntransformedLightSource {
+ Distant(FeDistantLight),
+ Point(FePointLight),
+ Spot(FeSpotLight),
+}
+
+/// A light source with affine transformations applied.
+enum LightSource {
+ Distant {
+ azimuth: f64,
+ elevation: f64,
+ },
+ Point {
+ origin: Vector3<f64>,
+ },
+ Spot {
+ origin: Vector3<f64>,
+ direction: Vector3<f64>,
+ specular_exponent: f64,
+ limiting_cone_angle: Option<f64>,
+ },
+}
+
+impl UntransformedLightSource {
+ fn transform(&self, paffine: Transform) -> LightSource {
+ match *self {
+ UntransformedLightSource::Distant(ref l) => l.transform(),
+ UntransformedLightSource::Point(ref l) => l.transform(paffine),
+ UntransformedLightSource::Spot(ref l) => l.transform(paffine),
+ }
+ }
+}
+
+struct Light {
+ source: UntransformedLightSource,
+ lighting_color: cssparser::RGBA,
+ color_interpolation_filters: ColorInterpolationFilters,
+}
+
+impl Light {
+ /// Returns the color and unit (or null) vector from the image sample to the light.
+ #[inline]
+ pub fn color_and_vector(
+ &self,
+ source: &LightSource,
+ x: f64,
+ y: f64,
+ z: f64,
+ ) -> (cssparser::RGBA, Vector3<f64>) {
+ let vector = match *source {
+ LightSource::Distant { azimuth, elevation } => {
+ let azimuth = azimuth.to_radians();
+ let elevation = elevation.to_radians();
+ Vector3::new(
+ azimuth.cos() * elevation.cos(),
+ azimuth.sin() * elevation.cos(),
+ elevation.sin(),
+ )
+ }
+ LightSource::Point { origin } | LightSource::Spot { origin, .. } => {
+ let mut v = origin - Vector3::new(x, y, z);
+ let _ = v.try_normalize_mut(0.0);
+ v
+ }
+ };
+
+ let color = match *source {
+ LightSource::Spot {
+ direction,
+ specular_exponent,
+ limiting_cone_angle,
+ ..
+ } => {
+ let minus_l_dot_s = -vector.dot(&direction);
+ match limiting_cone_angle {
+ _ if minus_l_dot_s <= 0.0 => cssparser::RGBA::transparent(),
+ Some(a) if minus_l_dot_s < a.to_radians().cos() => {
+ cssparser::RGBA::transparent()
+ }
+ _ => {
+ let factor = minus_l_dot_s.powf(specular_exponent);
+ let compute = |x| (clamp(f64::from(x) * factor, 0.0, 255.0) + 0.5) as u8;
+
+ cssparser::RGBA {
+ red: compute(self.lighting_color.red),
+ green: compute(self.lighting_color.green),
+ blue: compute(self.lighting_color.blue),
+ alpha: 255,
+ }
+ }
+ }
+ }
+ _ => self.lighting_color,
+ };
+
+ (color, vector)
+ }
+}
+
+#[derive(Clone, Debug, Default, PartialEq)]
+pub struct FeDistantLight {
+ azimuth: f64,
+ elevation: f64,
+}
+
+impl FeDistantLight {
+ fn transform(&self) -> LightSource {
+ LightSource::Distant {
+ azimuth: self.azimuth,
+ elevation: self.elevation,
+ }
+ }
+}
+
+impl ElementTrait for FeDistantLight {
+ fn set_attributes(&mut self, attrs: &Attributes, session: &Session) {
+ for (attr, value) in attrs.iter() {
+ match attr.expanded() {
+ expanded_name!("", "azimuth") => {
+ set_attribute(&mut self.azimuth, attr.parse(value), session)
+ }
+ expanded_name!("", "elevation") => {
+ set_attribute(&mut self.elevation, attr.parse(value), session)
+ }
+ _ => (),
+ }
+ }
+ }
+}
+
+#[derive(Clone, Debug, Default, PartialEq)]
+pub struct FePointLight {
+ x: f64,
+ y: f64,
+ z: f64,
+}
+
+impl FePointLight {
+ fn transform(&self, paffine: Transform) -> LightSource {
+ let (x, y) = paffine.transform_point(self.x, self.y);
+ let z = transform_dist(paffine, self.z);
+
+ LightSource::Point {
+ origin: Vector3::new(x, y, z),
+ }
+ }
+}
+
+impl ElementTrait for FePointLight {
+ fn set_attributes(&mut self, attrs: &Attributes, session: &Session) {
+ for (attr, value) in attrs.iter() {
+ match attr.expanded() {
+ expanded_name!("", "x") => set_attribute(&mut self.x, attr.parse(value), session),
+ expanded_name!("", "y") => set_attribute(&mut self.y, attr.parse(value), session),
+ expanded_name!("", "z") => set_attribute(&mut self.z, attr.parse(value), session),
+ _ => (),
+ }
+ }
+ }
+}
+
+#[derive(Clone, Debug, PartialEq)]
+pub struct FeSpotLight {
+ x: f64,
+ y: f64,
+ z: f64,
+ points_at_x: f64,
+ points_at_y: f64,
+ points_at_z: f64,
+ specular_exponent: f64,
+ limiting_cone_angle: Option<f64>,
+}
+
+// We need this because, per the spec, the initial values for all fields are 0.0
+// except for specular_exponent, which is 1.
+impl Default for FeSpotLight {
+ fn default() -> FeSpotLight {
+ FeSpotLight {
+ x: 0.0,
+ y: 0.0,
+ z: 0.0,
+ points_at_x: 0.0,
+ points_at_y: 0.0,
+ points_at_z: 0.0,
+ specular_exponent: 1.0,
+ limiting_cone_angle: None,
+ }
+ }
+}
+
+impl FeSpotLight {
+ fn transform(&self, paffine: Transform) -> LightSource {
+ let (x, y) = paffine.transform_point(self.x, self.y);
+ let z = transform_dist(paffine, self.z);
+ let (points_at_x, points_at_y) =
+ paffine.transform_point(self.points_at_x, self.points_at_y);
+ let points_at_z = transform_dist(paffine, self.points_at_z);
+
+ let origin = Vector3::new(x, y, z);
+ let mut direction = Vector3::new(points_at_x, points_at_y, points_at_z) - origin;
+ let _ = direction.try_normalize_mut(0.0);
+
+ LightSource::Spot {
+ origin,
+ direction,
+ specular_exponent: self.specular_exponent,
+ limiting_cone_angle: self.limiting_cone_angle,
+ }
+ }
+}
+
+impl ElementTrait for FeSpotLight {
+ fn set_attributes(&mut self, attrs: &Attributes, session: &Session) {
+ for (attr, value) in attrs.iter() {
+ match attr.expanded() {
+ expanded_name!("", "x") => set_attribute(&mut self.x, attr.parse(value), session),
+ expanded_name!("", "y") => set_attribute(&mut self.y, attr.parse(value), session),
+ expanded_name!("", "z") => set_attribute(&mut self.z, attr.parse(value), session),
+ expanded_name!("", "pointsAtX") => {
+ set_attribute(&mut self.points_at_x, attr.parse(value), session)
+ }
+ expanded_name!("", "pointsAtY") => {
+ set_attribute(&mut self.points_at_y, attr.parse(value), session)
+ }
+ expanded_name!("", "pointsAtZ") => {
+ set_attribute(&mut self.points_at_z, attr.parse(value), session)
+ }
+
+ expanded_name!("", "specularExponent") => {
+ set_attribute(&mut self.specular_exponent, attr.parse(value), session);
+ }
+
+ expanded_name!("", "limitingConeAngle") => {
+ set_attribute(&mut self.limiting_cone_angle, attr.parse(value), session);
+ }
+
+ _ => (),
+ }
+ }
+ }
+}
+
+/// Applies the `primitiveUnits` coordinate transformation to a non-x or y distance.
+#[inline]
+fn transform_dist(t: Transform, d: f64) -> f64 {
+ d * (t.xx.powi(2) + t.yy.powi(2)).sqrt() / std::f64::consts::SQRT_2
+}
+
+impl ElementTrait for FeDiffuseLighting {
+ fn set_attributes(&mut self, attrs: &Attributes, session: &Session) {
+ self.params.in1 = self.base.parse_one_input(attrs, session);
+
+ for (attr, value) in attrs.iter() {
+ match attr.expanded() {
+ expanded_name!("", "surfaceScale") => {
+ set_attribute(&mut self.params.surface_scale, attr.parse(value), session);
+ }
+ expanded_name!("", "kernelUnitLength") => {
+ let v: Result<NumberOptionalNumber<f64>, _> = attr.parse(value);
+ match v {
+ Ok(NumberOptionalNumber(x, y)) => {
+ self.params.kernel_unit_length = Some((x, y));
+ }
+
+ Err(e) => {
+ rsvg_log!(session, "ignoring attribute with invalid value: {}", e);
+ }
+ }
+ }
+ expanded_name!("", "diffuseConstant") => {
+ set_attribute(
+ &mut self.params.diffuse_constant,
+ attr.parse(value),
+ session,
+ );
+ }
+ _ => (),
+ }
+ }
+ }
+}
+
+impl DiffuseLighting {
+ #[inline]
+ fn compute_factor(&self, normal: Normal, light_vector: Vector3<f64>) -> f64 {
+ let k = if normal.normal.is_zero() {
+ // Common case of (0, 0, 1) normal.
+ light_vector.z
+ } else {
+ let mut n = normal
+ .normal
+ .map(|x| f64::from(x) * self.params.surface_scale / 255.);
+ n.component_mul_assign(&normal.factor);
+ let normal = Vector3::new(n.x, n.y, 1.0);
+
+ normal.dot(&light_vector) / normal.norm()
+ };
+
+ self.params.diffuse_constant.0 * k
+ }
+}
+
+impl ElementTrait for FeSpecularLighting {
+ fn set_attributes(&mut self, attrs: &Attributes, session: &Session) {
+ self.params.in1 = self.base.parse_one_input(attrs, session);
+
+ for (attr, value) in attrs.iter() {
+ match attr.expanded() {
+ expanded_name!("", "surfaceScale") => {
+ set_attribute(&mut self.params.surface_scale, attr.parse(value), session);
+ }
+ expanded_name!("", "kernelUnitLength") => {
+ let v: Result<NumberOptionalNumber<f64>, _> = attr.parse(value);
+ match v {
+ Ok(NumberOptionalNumber(x, y)) => {
+ self.params.kernel_unit_length = Some((x, y));
+ }
+
+ Err(e) => {
+ rsvg_log!(session, "ignoring attribute with invalid value: {}", e);
+ }
+ }
+ }
+ expanded_name!("", "specularConstant") => {
+ set_attribute(
+ &mut self.params.specular_constant,
+ attr.parse(value),
+ session,
+ );
+ }
+ expanded_name!("", "specularExponent") => {
+ set_attribute(
+ &mut self.params.specular_exponent,
+ attr.parse(value),
+ session,
+ );
+ }
+ _ => (),
+ }
+ }
+ }
+}
+
+impl SpecularLighting {
+ #[inline]
+ fn compute_factor(&self, normal: Normal, light_vector: Vector3<f64>) -> f64 {
+ let h = light_vector + Vector3::new(0.0, 0.0, 1.0);
+ let h_norm = h.norm();
+
+ if h_norm == 0.0 {
+ return 0.0;
+ }
+
+ let n_dot_h = if normal.normal.is_zero() {
+ // Common case of (0, 0, 1) normal.
+ h.z / h_norm
+ } else {
+ let mut n = normal
+ .normal
+ .map(|x| f64::from(x) * self.params.surface_scale / 255.);
+ n.component_mul_assign(&normal.factor);
+ let normal = Vector3::new(n.x, n.y, 1.0);
+ normal.dot(&h) / normal.norm() / h_norm
+ };
+
+ if approx_eq!(f64, self.params.specular_exponent, 1.0) {
+ self.params.specular_constant.0 * n_dot_h
+ } else {
+ self.params.specular_constant.0 * n_dot_h.powf(self.params.specular_exponent)
+ }
+ }
+}
+
+macro_rules! impl_lighting_filter {
+ ($lighting_type:ty, $params_name:ident, $alpha_func:ident) => {
+ impl $params_name {
+ pub fn render(
+ &self,
+ bounds_builder: BoundsBuilder,
+ ctx: &FilterContext,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ draw_ctx: &mut DrawingCtx,
+ ) -> Result<FilterOutput, FilterError> {
+ let input_1 = ctx.get_input(
+ acquired_nodes,
+ draw_ctx,
+ &self.params.in1,
+ self.light.color_interpolation_filters,
+ )?;
+ let mut bounds: IRect = bounds_builder
+ .add_input(&input_1)
+ .compute(ctx)
+ .clipped
+ .into();
+ let original_bounds = bounds;
+
+ let scale = self
+ .params
+ .kernel_unit_length
+ .and_then(|(x, y)| {
+ if x <= 0.0 || y <= 0.0 {
+ None
+ } else {
+ Some((x, y))
+ }
+ })
+ .map(|(dx, dy)| ctx.paffine().transform_distance(dx, dy));
+
+ let mut input_surface = input_1.surface().clone();
+
+ if let Some((ox, oy)) = scale {
+ // Scale the input surface to match kernel_unit_length.
+ let (new_surface, new_bounds) =
+ input_surface.scale(bounds, 1.0 / ox, 1.0 / oy)?;
+
+ input_surface = new_surface;
+ bounds = new_bounds;
+ }
+
+ let (bounds_w, bounds_h) = bounds.size();
+
+ // Check if the surface is too small for normal computation. This case is
+ // unspecified; WebKit doesn't render anything in this case.
+ if bounds_w < 2 || bounds_h < 2 {
+ return Err(FilterError::LightingInputTooSmall);
+ }
+
+ let (ox, oy) = scale.unwrap_or((1.0, 1.0));
+
+ let source = self.light.source.transform(ctx.paffine());
+
+ let mut surface = ExclusiveImageSurface::new(
+ input_surface.width(),
+ input_surface.height(),
+ SurfaceType::from(self.light.color_interpolation_filters),
+ )?;
+
+ {
+ let output_stride = surface.stride() as usize;
+ let mut output_data = surface.data();
+ let output_slice = &mut *output_data;
+
+ let compute_output_pixel =
+ |output_slice: &mut [u8], base_y, x, y, normal: Normal| {
+ let pixel = input_surface.get_pixel(x, y);
+
+ let scaled_x = f64::from(x) * ox;
+ let scaled_y = f64::from(y) * oy;
+ let z = f64::from(pixel.a) / 255.0 * self.params.surface_scale;
+
+ let (color, vector) =
+ self.light.color_and_vector(&source, scaled_x, scaled_y, z);
+
+ // compute the factor just once for the three colors
+ let factor = self.compute_factor(normal, vector);
+ let compute =
+ |x| (clamp(factor * f64::from(x), 0.0, 255.0) + 0.5) as u8;
+
+ let r = compute(color.red);
+ let g = compute(color.green);
+ let b = compute(color.blue);
+ let a = $alpha_func(r, g, b);
+
+ let output_pixel = Pixel { r, g, b, a };
+
+ output_slice.set_pixel(output_stride, output_pixel, x, y - base_y);
+ };
+
+ // Top left.
+ compute_output_pixel(
+ output_slice,
+ 0,
+ bounds.x0 as u32,
+ bounds.y0 as u32,
+ Normal::top_left(&input_surface, bounds),
+ );
+
+ // Top right.
+ compute_output_pixel(
+ output_slice,
+ 0,
+ bounds.x1 as u32 - 1,
+ bounds.y0 as u32,
+ Normal::top_right(&input_surface, bounds),
+ );
+
+ // Bottom left.
+ compute_output_pixel(
+ output_slice,
+ 0,
+ bounds.x0 as u32,
+ bounds.y1 as u32 - 1,
+ Normal::bottom_left(&input_surface, bounds),
+ );
+
+ // Bottom right.
+ compute_output_pixel(
+ output_slice,
+ 0,
+ bounds.x1 as u32 - 1,
+ bounds.y1 as u32 - 1,
+ Normal::bottom_right(&input_surface, bounds),
+ );
+
+ if bounds_w >= 3 {
+ // Top row.
+ for x in bounds.x0 as u32 + 1..bounds.x1 as u32 - 1 {
+ compute_output_pixel(
+ output_slice,
+ 0,
+ x,
+ bounds.y0 as u32,
+ Normal::top_row(&input_surface, bounds, x),
+ );
+ }
+
+ // Bottom row.
+ for x in bounds.x0 as u32 + 1..bounds.x1 as u32 - 1 {
+ compute_output_pixel(
+ output_slice,
+ 0,
+ x,
+ bounds.y1 as u32 - 1,
+ Normal::bottom_row(&input_surface, bounds, x),
+ );
+ }
+ }
+
+ if bounds_h >= 3 {
+ // Left column.
+ for y in bounds.y0 as u32 + 1..bounds.y1 as u32 - 1 {
+ compute_output_pixel(
+ output_slice,
+ 0,
+ bounds.x0 as u32,
+ y,
+ Normal::left_column(&input_surface, bounds, y),
+ );
+ }
+
+ // Right column.
+ for y in bounds.y0 as u32 + 1..bounds.y1 as u32 - 1 {
+ compute_output_pixel(
+ output_slice,
+ 0,
+ bounds.x1 as u32 - 1,
+ y,
+ Normal::right_column(&input_surface, bounds, y),
+ );
+ }
+ }
+
+ if bounds_w >= 3 && bounds_h >= 3 {
+ // Interior pixels.
+ let first_row = bounds.y0 as u32 + 1;
+ let one_past_last_row = bounds.y1 as u32 - 1;
+ let first_pixel = (first_row as usize) * output_stride;
+ let one_past_last_pixel = (one_past_last_row as usize) * output_stride;
+
+ output_slice[first_pixel..one_past_last_pixel]
+ .par_chunks_mut(output_stride)
+ .zip(first_row..one_past_last_row)
+ .for_each(|(slice, y)| {
+ for x in bounds.x0 as u32 + 1..bounds.x1 as u32 - 1 {
+ compute_output_pixel(
+ slice,
+ y,
+ x,
+ y,
+ Normal::interior(&input_surface, bounds, x, y),
+ );
+ }
+ });
+ }
+ }
+
+ let mut surface = surface.share()?;
+
+ if let Some((ox, oy)) = scale {
+ // Scale the output surface back.
+ surface = surface.scale_to(
+ ctx.source_graphic().width(),
+ ctx.source_graphic().height(),
+ original_bounds,
+ ox,
+ oy,
+ )?;
+
+ bounds = original_bounds;
+ }
+
+ Ok(FilterOutput { surface, bounds })
+ }
+ }
+
+ impl FilterEffect for $lighting_type {
+ fn resolve(
+ &self,
+ _acquired_nodes: &mut AcquiredNodes<'_>,
+ node: &Node,
+ ) -> Result<Vec<ResolvedPrimitive>, FilterResolveError> {
+ let mut sources = node.children().rev().filter(|c| {
+ c.is_element()
+ && matches!(
+ *c.borrow_element_data(),
+ ElementData::FeDistantLight(_)
+ | ElementData::FePointLight(_)
+ | ElementData::FeSpotLight(_)
+ )
+ });
+
+ let source_node = sources.next();
+ if source_node.is_none() || sources.next().is_some() {
+ return Err(FilterResolveError::InvalidLightSourceCount);
+ }
+
+ let source_node = source_node.unwrap();
+
+ let source = match &*source_node.borrow_element_data() {
+ ElementData::FeDistantLight(l) => {
+ UntransformedLightSource::Distant((**l).clone())
+ }
+ ElementData::FePointLight(l) => UntransformedLightSource::Point((**l).clone()),
+ ElementData::FeSpotLight(l) => UntransformedLightSource::Spot((**l).clone()),
+ _ => unreachable!(),
+ };
+
+ let cascaded = CascadedValues::new_from_node(node);
+ let values = cascaded.get();
+
+ Ok(vec![ResolvedPrimitive {
+ primitive: self.base.clone(),
+ params: PrimitiveParams::$params_name($params_name {
+ params: self.params.clone(),
+ light: Light {
+ source,
+ lighting_color: resolve_color(
+ &values.lighting_color().0,
+ UnitInterval::clamp(1.0),
+ values.color().0,
+ ),
+ color_interpolation_filters: values.color_interpolation_filters(),
+ },
+ }),
+ }])
+ }
+ }
+ };
+}
+
+const fn diffuse_alpha(_r: u8, _g: u8, _b: u8) -> u8 {
+ 255
+}
+
+fn specular_alpha(r: u8, g: u8, b: u8) -> u8 {
+ max(max(r, g), b)
+}
+
+impl_lighting_filter!(FeDiffuseLighting, DiffuseLighting, diffuse_alpha);
+
+impl_lighting_filter!(FeSpecularLighting, SpecularLighting, specular_alpha);
+
+/// 2D normal and factor stored separately.
+///
+/// The normal needs to be multiplied by `surface_scale * factor / 255` and
+/// normalized with 1 as the z component.
+/// pub for the purpose of accessing this from benchmarks.
+#[derive(Debug, Clone, Copy)]
+pub struct Normal {
+ pub factor: Vector2<f64>,
+ pub normal: Vector2<i16>,
+}
+
+impl Normal {
+ #[inline]
+ fn new(factor_x: f64, nx: i16, factor_y: f64, ny: i16) -> Normal {
+ // Negative nx and ny to account for the different coordinate system.
+ Normal {
+ factor: Vector2::new(factor_x, factor_y),
+ normal: Vector2::new(-nx, -ny),
+ }
+ }
+
+ /// Computes and returns the normal vector for the top left pixel for light filters.
+ #[inline]
+ pub fn top_left(surface: &SharedImageSurface, bounds: IRect) -> Normal {
+ // Surface needs to be at least 2×2.
+ assert!(bounds.width() >= 2);
+ assert!(bounds.height() >= 2);
+
+ let get = |x, y| i16::from(surface.get_pixel(x, y).a);
+ let (x, y) = (bounds.x0 as u32, bounds.y0 as u32);
+
+ let center = get(x, y);
+ let right = get(x + 1, y);
+ let bottom = get(x, y + 1);
+ let bottom_right = get(x + 1, y + 1);
+
+ Self::new(
+ 2. / 3.,
+ -2 * center + 2 * right - bottom + bottom_right,
+ 2. / 3.,
+ -2 * center - right + 2 * bottom + bottom_right,
+ )
+ }
+
+ /// Computes and returns the normal vector for the top row pixels for light filters.
+ #[inline]
+ pub fn top_row(surface: &SharedImageSurface, bounds: IRect, x: u32) -> Normal {
+ assert!(x as i32 > bounds.x0);
+ assert!((x as i32) + 1 < bounds.x1);
+ assert!(bounds.height() >= 2);
+
+ let get = |x, y| i16::from(surface.get_pixel(x, y).a);
+ let y = bounds.y0 as u32;
+
+ let left = get(x - 1, y);
+ let center = get(x, y);
+ let right = get(x + 1, y);
+ let bottom_left = get(x - 1, y + 1);
+ let bottom = get(x, y + 1);
+ let bottom_right = get(x + 1, y + 1);
+
+ Self::new(
+ 1. / 3.,
+ -2 * left + 2 * right - bottom_left + bottom_right,
+ 1. / 2.,
+ -left - 2 * center - right + bottom_left + 2 * bottom + bottom_right,
+ )
+ }
+
+ /// Computes and returns the normal vector for the top right pixel for light filters.
+ #[inline]
+ pub fn top_right(surface: &SharedImageSurface, bounds: IRect) -> Normal {
+ // Surface needs to be at least 2×2.
+ assert!(bounds.width() >= 2);
+ assert!(bounds.height() >= 2);
+
+ let get = |x, y| i16::from(surface.get_pixel(x, y).a);
+ let (x, y) = (bounds.x1 as u32 - 1, bounds.y0 as u32);
+
+ let left = get(x - 1, y);
+ let center = get(x, y);
+ let bottom_left = get(x - 1, y + 1);
+ let bottom = get(x, y + 1);
+
+ Self::new(
+ 2. / 3.,
+ -2 * left + 2 * center - bottom_left + bottom,
+ 2. / 3.,
+ -left - 2 * center + bottom_left + 2 * bottom,
+ )
+ }
+
+ /// Computes and returns the normal vector for the left column pixels for light filters.
+ #[inline]
+ pub fn left_column(surface: &SharedImageSurface, bounds: IRect, y: u32) -> Normal {
+ assert!(y as i32 > bounds.y0);
+ assert!((y as i32) + 1 < bounds.y1);
+ assert!(bounds.width() >= 2);
+
+ let get = |x, y| i16::from(surface.get_pixel(x, y).a);
+ let x = bounds.x0 as u32;
+
+ let top = get(x, y - 1);
+ let top_right = get(x + 1, y - 1);
+ let center = get(x, y);
+ let right = get(x + 1, y);
+ let bottom = get(x, y + 1);
+ let bottom_right = get(x + 1, y + 1);
+
+ Self::new(
+ 1. / 2.,
+ -top + top_right - 2 * center + 2 * right - bottom + bottom_right,
+ 1. / 3.,
+ -2 * top - top_right + 2 * bottom + bottom_right,
+ )
+ }
+
+ /// Computes and returns the normal vector for the interior pixels for light filters.
+ #[inline]
+ pub fn interior(surface: &SharedImageSurface, bounds: IRect, x: u32, y: u32) -> Normal {
+ assert!(x as i32 > bounds.x0);
+ assert!((x as i32) + 1 < bounds.x1);
+ assert!(y as i32 > bounds.y0);
+ assert!((y as i32) + 1 < bounds.y1);
+
+ let get = |x, y| i16::from(surface.get_pixel(x, y).a);
+
+ let top_left = get(x - 1, y - 1);
+ let top = get(x, y - 1);
+ let top_right = get(x + 1, y - 1);
+ let left = get(x - 1, y);
+ let right = get(x + 1, y);
+ let bottom_left = get(x - 1, y + 1);
+ let bottom = get(x, y + 1);
+ let bottom_right = get(x + 1, y + 1);
+
+ Self::new(
+ 1. / 4.,
+ -top_left + top_right - 2 * left + 2 * right - bottom_left + bottom_right,
+ 1. / 4.,
+ -top_left - 2 * top - top_right + bottom_left + 2 * bottom + bottom_right,
+ )
+ }
+
+ /// Computes and returns the normal vector for the right column pixels for light filters.
+ #[inline]
+ pub fn right_column(surface: &SharedImageSurface, bounds: IRect, y: u32) -> Normal {
+ assert!(y as i32 > bounds.y0);
+ assert!((y as i32) + 1 < bounds.y1);
+ assert!(bounds.width() >= 2);
+
+ let get = |x, y| i16::from(surface.get_pixel(x, y).a);
+ let x = bounds.x1 as u32 - 1;
+
+ let top_left = get(x - 1, y - 1);
+ let top = get(x, y - 1);
+ let left = get(x - 1, y);
+ let center = get(x, y);
+ let bottom_left = get(x - 1, y + 1);
+ let bottom = get(x, y + 1);
+
+ Self::new(
+ 1. / 2.,
+ -top_left + top - 2 * left + 2 * center - bottom_left + bottom,
+ 1. / 3.,
+ -top_left - 2 * top + bottom_left + 2 * bottom,
+ )
+ }
+
+ /// Computes and returns the normal vector for the bottom left pixel for light filters.
+ #[inline]
+ pub fn bottom_left(surface: &SharedImageSurface, bounds: IRect) -> Normal {
+ // Surface needs to be at least 2×2.
+ assert!(bounds.width() >= 2);
+ assert!(bounds.height() >= 2);
+
+ let get = |x, y| i16::from(surface.get_pixel(x, y).a);
+ let (x, y) = (bounds.x0 as u32, bounds.y1 as u32 - 1);
+
+ let top = get(x, y - 1);
+ let top_right = get(x + 1, y - 1);
+ let center = get(x, y);
+ let right = get(x + 1, y);
+
+ Self::new(
+ 2. / 3.,
+ -top + top_right - 2 * center + 2 * right,
+ 2. / 3.,
+ -2 * top - top_right + 2 * center + right,
+ )
+ }
+
+ /// Computes and returns the normal vector for the bottom row pixels for light filters.
+ #[inline]
+ pub fn bottom_row(surface: &SharedImageSurface, bounds: IRect, x: u32) -> Normal {
+ assert!(x as i32 > bounds.x0);
+ assert!((x as i32) + 1 < bounds.x1);
+ assert!(bounds.height() >= 2);
+
+ let get = |x, y| i16::from(surface.get_pixel(x, y).a);
+ let y = bounds.y1 as u32 - 1;
+
+ let top_left = get(x - 1, y - 1);
+ let top = get(x, y - 1);
+ let top_right = get(x + 1, y - 1);
+ let left = get(x - 1, y);
+ let center = get(x, y);
+ let right = get(x + 1, y);
+
+ Self::new(
+ 1. / 3.,
+ -top_left + top_right - 2 * left + 2 * right,
+ 1. / 2.,
+ -top_left - 2 * top - top_right + left + 2 * center + right,
+ )
+ }
+
+ /// Computes and returns the normal vector for the bottom right pixel for light filters.
+ #[inline]
+ pub fn bottom_right(surface: &SharedImageSurface, bounds: IRect) -> Normal {
+ // Surface needs to be at least 2×2.
+ assert!(bounds.width() >= 2);
+ assert!(bounds.height() >= 2);
+
+ let get = |x, y| i16::from(surface.get_pixel(x, y).a);
+ let (x, y) = (bounds.x1 as u32 - 1, bounds.y1 as u32 - 1);
+
+ let top_left = get(x - 1, y - 1);
+ let top = get(x, y - 1);
+ let left = get(x - 1, y);
+ let center = get(x, y);
+
+ Self::new(
+ 2. / 3.,
+ -top_left + top - 2 * left + 2 * center,
+ 2. / 3.,
+ -top_left - 2 * top + left + 2 * center,
+ )
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+ use crate::document::Document;
+
+ #[test]
+ fn extracts_light_source() {
+ let document = Document::load_from_bytes(
+ br#"<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg">
+ <filter id="filter">
+ <feDiffuseLighting id="diffuse_distant">
+ <feDistantLight azimuth="0.0" elevation="45.0"/>
+ </feDiffuseLighting>
+
+ <feSpecularLighting id="specular_point">
+ <fePointLight x="1.0" y="2.0" z="3.0"/>
+ </feSpecularLighting>
+
+ <feDiffuseLighting id="diffuse_spot">
+ <feSpotLight x="1.0" y="2.0" z="3.0"
+ pointsAtX="4.0" pointsAtY="5.0" pointsAtZ="6.0"
+ specularExponent="7.0" limitingConeAngle="8.0"/>
+ </feDiffuseLighting>
+ </filter>
+</svg>
+"#,
+ );
+ let mut acquired_nodes = AcquiredNodes::new(&document);
+
+ let node = document.lookup_internal_node("diffuse_distant").unwrap();
+ let lighting = borrow_element_as!(node, FeDiffuseLighting);
+ let resolved = lighting.resolve(&mut acquired_nodes, &node).unwrap();
+ let ResolvedPrimitive { params, .. } = resolved.first().unwrap();
+ let diffuse_lighting = match params {
+ PrimitiveParams::DiffuseLighting(l) => l,
+ _ => unreachable!(),
+ };
+ assert_eq!(
+ diffuse_lighting.light.source,
+ UntransformedLightSource::Distant(FeDistantLight {
+ azimuth: 0.0,
+ elevation: 45.0,
+ })
+ );
+
+ let node = document.lookup_internal_node("specular_point").unwrap();
+ let lighting = borrow_element_as!(node, FeSpecularLighting);
+ let resolved = lighting.resolve(&mut acquired_nodes, &node).unwrap();
+ let ResolvedPrimitive { params, .. } = resolved.first().unwrap();
+ let specular_lighting = match params {
+ PrimitiveParams::SpecularLighting(l) => l,
+ _ => unreachable!(),
+ };
+ assert_eq!(
+ specular_lighting.light.source,
+ UntransformedLightSource::Point(FePointLight {
+ x: 1.0,
+ y: 2.0,
+ z: 3.0,
+ })
+ );
+
+ let node = document.lookup_internal_node("diffuse_spot").unwrap();
+ let lighting = borrow_element_as!(node, FeDiffuseLighting);
+ let resolved = lighting.resolve(&mut acquired_nodes, &node).unwrap();
+ let ResolvedPrimitive { params, .. } = resolved.first().unwrap();
+ let diffuse_lighting = match params {
+ PrimitiveParams::DiffuseLighting(l) => l,
+ _ => unreachable!(),
+ };
+ assert_eq!(
+ diffuse_lighting.light.source,
+ UntransformedLightSource::Spot(FeSpotLight {
+ x: 1.0,
+ y: 2.0,
+ z: 3.0,
+ points_at_x: 4.0,
+ points_at_y: 5.0,
+ points_at_z: 6.0,
+ specular_exponent: 7.0,
+ limiting_cone_angle: Some(8.0),
+ })
+ );
+ }
+}
diff --git a/rsvg/src/filters/merge.rs b/rsvg/src/filters/merge.rs
new file mode 100644
index 00000000..0f762fdd
--- /dev/null
+++ b/rsvg/src/filters/merge.rs
@@ -0,0 +1,217 @@
+use markup5ever::{expanded_name, local_name, namespace_url, ns};
+
+use crate::document::AcquiredNodes;
+use crate::drawing_ctx::DrawingCtx;
+use crate::element::{set_attribute, ElementData, ElementTrait};
+use crate::node::{CascadedValues, Node, NodeBorrow};
+use crate::parsers::ParseValue;
+use crate::properties::ColorInterpolationFilters;
+use crate::rect::IRect;
+use crate::session::Session;
+use crate::surface_utils::shared_surface::{Operator, SharedImageSurface, SurfaceType};
+use crate::xml::Attributes;
+
+use super::bounds::BoundsBuilder;
+use super::context::{FilterContext, FilterOutput};
+use super::{
+ FilterEffect, FilterError, FilterResolveError, Input, Primitive, PrimitiveParams,
+ ResolvedPrimitive,
+};
+
+/// The `feMerge` filter primitive.
+pub struct FeMerge {
+ base: Primitive,
+}
+
+/// The `<feMergeNode>` element.
+#[derive(Clone, Default)]
+pub struct FeMergeNode {
+ in1: Input,
+}
+
+/// Resolved `feMerge` primitive for rendering.
+pub struct Merge {
+ pub merge_nodes: Vec<MergeNode>,
+}
+
+/// Resolved `feMergeNode` for rendering.
+#[derive(Debug, Default, PartialEq)]
+pub struct MergeNode {
+ pub in1: Input,
+ pub color_interpolation_filters: ColorInterpolationFilters,
+}
+
+impl Default for FeMerge {
+ /// Constructs a new `Merge` with empty properties.
+ #[inline]
+ fn default() -> FeMerge {
+ FeMerge {
+ base: Default::default(),
+ }
+ }
+}
+
+impl ElementTrait for FeMerge {
+ fn set_attributes(&mut self, attrs: &Attributes, session: &Session) {
+ self.base.parse_no_inputs(attrs, session);
+ }
+}
+
+impl ElementTrait for FeMergeNode {
+ fn set_attributes(&mut self, attrs: &Attributes, session: &Session) {
+ for (attr, value) in attrs.iter() {
+ if let expanded_name!("", "in") = attr.expanded() {
+ set_attribute(&mut self.in1, attr.parse(value), session);
+ }
+ }
+ }
+}
+
+impl MergeNode {
+ fn render(
+ &self,
+ ctx: &FilterContext,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ draw_ctx: &mut DrawingCtx,
+ bounds: IRect,
+ output_surface: Option<SharedImageSurface>,
+ ) -> Result<SharedImageSurface, FilterError> {
+ let input = ctx.get_input(
+ acquired_nodes,
+ draw_ctx,
+ &self.in1,
+ self.color_interpolation_filters,
+ )?;
+
+ if output_surface.is_none() {
+ return Ok(input.surface().clone());
+ }
+
+ input
+ .surface()
+ .compose(&output_surface.unwrap(), bounds, Operator::Over)
+ .map_err(FilterError::CairoError)
+ }
+}
+
+impl Merge {
+ pub fn render(
+ &self,
+ bounds_builder: BoundsBuilder,
+ ctx: &FilterContext,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ draw_ctx: &mut DrawingCtx,
+ ) -> Result<FilterOutput, FilterError> {
+ // Compute the filter bounds, taking each feMergeNode's input into account.
+ let mut bounds_builder = bounds_builder;
+ for merge_node in &self.merge_nodes {
+ let input = ctx.get_input(
+ acquired_nodes,
+ draw_ctx,
+ &merge_node.in1,
+ merge_node.color_interpolation_filters,
+ )?;
+ bounds_builder = bounds_builder.add_input(&input);
+ }
+
+ let bounds: IRect = bounds_builder.compute(ctx).clipped.into();
+
+ // Now merge them all.
+ let mut output_surface = None;
+ for merge_node in &self.merge_nodes {
+ output_surface = merge_node
+ .render(ctx, acquired_nodes, draw_ctx, bounds, output_surface)
+ .ok();
+ }
+
+ let surface = match output_surface {
+ Some(s) => s,
+ None => SharedImageSurface::empty(
+ ctx.source_graphic().width(),
+ ctx.source_graphic().height(),
+ SurfaceType::AlphaOnly,
+ )?,
+ };
+
+ Ok(FilterOutput { surface, bounds })
+ }
+}
+
+impl FilterEffect for FeMerge {
+ fn resolve(
+ &self,
+ _acquired_nodes: &mut AcquiredNodes<'_>,
+ node: &Node,
+ ) -> Result<Vec<ResolvedPrimitive>, FilterResolveError> {
+ Ok(vec![ResolvedPrimitive {
+ primitive: self.base.clone(),
+ params: PrimitiveParams::Merge(Merge {
+ merge_nodes: resolve_merge_nodes(node)?,
+ }),
+ }])
+ }
+}
+
+/// Takes a feMerge and walks its children to produce a list of feMergeNode arguments.
+fn resolve_merge_nodes(node: &Node) -> Result<Vec<MergeNode>, FilterResolveError> {
+ let mut merge_nodes = Vec::new();
+
+ for child in node.children().filter(|c| c.is_element()) {
+ let cascaded = CascadedValues::new_from_node(&child);
+ let values = cascaded.get();
+
+ if let ElementData::FeMergeNode(merge_node) = &*child.borrow_element_data() {
+ merge_nodes.push(MergeNode {
+ in1: merge_node.in1.clone(),
+ color_interpolation_filters: values.color_interpolation_filters(),
+ });
+ }
+ }
+
+ Ok(merge_nodes)
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+ use crate::document::Document;
+
+ #[test]
+ fn extracts_parameters() {
+ let document = Document::load_from_bytes(
+ br#"<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg">
+ <filter id="filter">
+ <feMerge id="merge">
+ <feMergeNode in="SourceGraphic"/>
+ <feMergeNode in="SourceAlpha" color-interpolation-filters="sRGB"/>
+ </feMerge>
+ </filter>
+</svg>
+"#,
+ );
+ let mut acquired_nodes = AcquiredNodes::new(&document);
+
+ let node = document.lookup_internal_node("merge").unwrap();
+ let merge = borrow_element_as!(node, FeMerge);
+ let resolved = merge.resolve(&mut acquired_nodes, &node).unwrap();
+ let ResolvedPrimitive { params, .. } = resolved.first().unwrap();
+ let params = match params {
+ PrimitiveParams::Merge(m) => m,
+ _ => unreachable!(),
+ };
+ assert_eq!(
+ &params.merge_nodes[..],
+ vec![
+ MergeNode {
+ in1: Input::SourceGraphic,
+ color_interpolation_filters: Default::default(),
+ },
+ MergeNode {
+ in1: Input::SourceAlpha,
+ color_interpolation_filters: ColorInterpolationFilters::Srgb,
+ },
+ ]
+ );
+ }
+}
diff --git a/rsvg/src/filters/mod.rs b/rsvg/src/filters/mod.rs
new file mode 100644
index 00000000..f0fee772
--- /dev/null
+++ b/rsvg/src/filters/mod.rs
@@ -0,0 +1,381 @@
+//! Entry point for the CSS filters infrastructure.
+
+use cssparser::{BasicParseError, Parser};
+use markup5ever::{expanded_name, local_name, namespace_url, ns};
+use std::rc::Rc;
+use std::time::Instant;
+
+use crate::bbox::BoundingBox;
+use crate::document::AcquiredNodes;
+use crate::drawing_ctx::DrawingCtx;
+use crate::element::{set_attribute, ElementTrait};
+use crate::error::{ParseError, RenderingError};
+use crate::filter::UserSpaceFilter;
+use crate::length::*;
+use crate::node::Node;
+use crate::paint_server::UserSpacePaintSource;
+use crate::parsers::{CustomIdent, Parse, ParseValue};
+use crate::properties::ColorInterpolationFilters;
+use crate::session::Session;
+use crate::surface_utils::shared_surface::{SharedImageSurface, SurfaceType};
+use crate::transform::Transform;
+use crate::xml::Attributes;
+
+mod bounds;
+use self::bounds::BoundsBuilder;
+
+pub mod context;
+use self::context::{FilterContext, FilterOutput, FilterResult};
+
+mod error;
+use self::error::FilterError;
+pub use self::error::FilterResolveError;
+
+/// A filter primitive interface.
+pub trait FilterEffect: ElementTrait {
+ fn resolve(
+ &self,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ node: &Node,
+ ) -> Result<Vec<ResolvedPrimitive>, FilterResolveError>;
+}
+
+pub mod blend;
+pub mod color_matrix;
+pub mod component_transfer;
+pub mod composite;
+pub mod convolve_matrix;
+pub mod displacement_map;
+pub mod drop_shadow;
+pub mod flood;
+pub mod gaussian_blur;
+pub mod image;
+pub mod lighting;
+pub mod merge;
+pub mod morphology;
+pub mod offset;
+pub mod tile;
+pub mod turbulence;
+
+pub struct FilterSpec {
+ pub user_space_filter: UserSpaceFilter,
+ pub primitives: Vec<UserSpacePrimitive>,
+}
+
+/// Resolved parameters for each filter primitive.
+///
+/// These gather all the data that a primitive may need during rendering:
+/// the `feFoo` element's attributes, any computed values from its properties,
+/// and parameters extracted from the element's children (for example,
+/// `feMerge` gathers info from its `feMergNode` children).
+pub enum PrimitiveParams {
+ Blend(blend::Blend),
+ ColorMatrix(color_matrix::ColorMatrix),
+ ComponentTransfer(component_transfer::ComponentTransfer),
+ Composite(composite::Composite),
+ ConvolveMatrix(convolve_matrix::ConvolveMatrix),
+ DiffuseLighting(lighting::DiffuseLighting),
+ DisplacementMap(displacement_map::DisplacementMap),
+ Flood(flood::Flood),
+ GaussianBlur(gaussian_blur::GaussianBlur),
+ Image(image::Image),
+ Merge(merge::Merge),
+ Morphology(morphology::Morphology),
+ Offset(offset::Offset),
+ SpecularLighting(lighting::SpecularLighting),
+ Tile(tile::Tile),
+ Turbulence(turbulence::Turbulence),
+}
+
+impl PrimitiveParams {
+ /// Returns a human-readable name for a primitive.
+ #[rustfmt::skip]
+ fn name(&self) -> &'static str {
+ use PrimitiveParams::*;
+ match self {
+ Blend(..) => "feBlend",
+ ColorMatrix(..) => "feColorMatrix",
+ ComponentTransfer(..) => "feComponentTransfer",
+ Composite(..) => "feComposite",
+ ConvolveMatrix(..) => "feConvolveMatrix",
+ DiffuseLighting(..) => "feDiffuseLighting",
+ DisplacementMap(..) => "feDisplacementMap",
+ Flood(..) => "feFlood",
+ GaussianBlur(..) => "feGaussianBlur",
+ Image(..) => "feImage",
+ Merge(..) => "feMerge",
+ Morphology(..) => "feMorphology",
+ Offset(..) => "feOffset",
+ SpecularLighting(..) => "feSpecularLighting",
+ Tile(..) => "feTile",
+ Turbulence(..) => "feTurbulence",
+ }
+ }
+}
+
+/// The base filter primitive node containing common properties.
+#[derive(Default, Clone)]
+pub struct Primitive {
+ pub x: Option<Length<Horizontal>>,
+ pub y: Option<Length<Vertical>>,
+ pub width: Option<ULength<Horizontal>>,
+ pub height: Option<ULength<Vertical>>,
+ pub result: Option<CustomIdent>,
+}
+
+pub struct ResolvedPrimitive {
+ pub primitive: Primitive,
+ pub params: PrimitiveParams,
+}
+
+/// A fully resolved filter primitive in user-space coordinates.
+pub struct UserSpacePrimitive {
+ x: Option<f64>,
+ y: Option<f64>,
+ width: Option<f64>,
+ height: Option<f64>,
+ result: Option<CustomIdent>,
+
+ params: PrimitiveParams,
+}
+
+/// An enumeration of possible inputs for a filter primitive.
+#[derive(Debug, Clone, Eq, PartialEq, Hash)]
+pub enum Input {
+ Unspecified,
+ SourceGraphic,
+ SourceAlpha,
+ BackgroundImage,
+ BackgroundAlpha,
+ FillPaint,
+ StrokePaint,
+ FilterOutput(CustomIdent),
+}
+
+enum_default!(Input, Input::Unspecified);
+
+impl Parse for Input {
+ fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<Self, ParseError<'i>> {
+ parser
+ .try_parse(|p| {
+ parse_identifiers!(
+ p,
+ "SourceGraphic" => Input::SourceGraphic,
+ "SourceAlpha" => Input::SourceAlpha,
+ "BackgroundImage" => Input::BackgroundImage,
+ "BackgroundAlpha" => Input::BackgroundAlpha,
+ "FillPaint" => Input::FillPaint,
+ "StrokePaint" => Input::StrokePaint,
+ )
+ })
+ .or_else(|_: BasicParseError<'_>| {
+ let ident = CustomIdent::parse(parser)?;
+ Ok(Input::FilterOutput(ident))
+ })
+ }
+}
+
+impl ResolvedPrimitive {
+ pub fn into_user_space(self, params: &NormalizeParams) -> UserSpacePrimitive {
+ let x = self.primitive.x.map(|l| l.to_user(params));
+ let y = self.primitive.y.map(|l| l.to_user(params));
+ let width = self.primitive.width.map(|l| l.to_user(params));
+ let height = self.primitive.height.map(|l| l.to_user(params));
+
+ UserSpacePrimitive {
+ x,
+ y,
+ width,
+ height,
+ result: self.primitive.result,
+ params: self.params,
+ }
+ }
+}
+
+impl UserSpacePrimitive {
+ /// Validates attributes and returns the `BoundsBuilder` for bounds computation.
+ #[inline]
+ fn get_bounds(&self, ctx: &FilterContext) -> BoundsBuilder {
+ BoundsBuilder::new(self.x, self.y, self.width, self.height, ctx.paffine())
+ }
+}
+
+impl Primitive {
+ fn parse_standard_attributes(
+ &mut self,
+ attrs: &Attributes,
+ session: &Session,
+ ) -> (Input, Input) {
+ let mut input_1 = Input::Unspecified;
+ let mut input_2 = Input::Unspecified;
+
+ for (attr, value) in attrs.iter() {
+ match attr.expanded() {
+ expanded_name!("", "x") => set_attribute(&mut self.x, attr.parse(value), session),
+ expanded_name!("", "y") => set_attribute(&mut self.y, attr.parse(value), session),
+ expanded_name!("", "width") => {
+ set_attribute(&mut self.width, attr.parse(value), session)
+ }
+ expanded_name!("", "height") => {
+ set_attribute(&mut self.height, attr.parse(value), session)
+ }
+ expanded_name!("", "result") => {
+ set_attribute(&mut self.result, attr.parse(value), session)
+ }
+ expanded_name!("", "in") => set_attribute(&mut input_1, attr.parse(value), session),
+ expanded_name!("", "in2") => {
+ set_attribute(&mut input_2, attr.parse(value), session)
+ }
+ _ => (),
+ }
+ }
+
+ (input_1, input_2)
+ }
+
+ pub fn parse_no_inputs(&mut self, attrs: &Attributes, session: &Session) {
+ let (_, _) = self.parse_standard_attributes(attrs, session);
+ }
+
+ pub fn parse_one_input(&mut self, attrs: &Attributes, session: &Session) -> Input {
+ let (input_1, _) = self.parse_standard_attributes(attrs, session);
+ input_1
+ }
+
+ pub fn parse_two_inputs(&mut self, attrs: &Attributes, session: &Session) -> (Input, Input) {
+ self.parse_standard_attributes(attrs, session)
+ }
+}
+
+/// Applies a filter and returns the resulting surface.
+pub fn render(
+ filter: &FilterSpec,
+ stroke_paint_source: Rc<UserSpacePaintSource>,
+ fill_paint_source: Rc<UserSpacePaintSource>,
+ source_surface: SharedImageSurface,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ draw_ctx: &mut DrawingCtx,
+ transform: Transform,
+ node_bbox: BoundingBox,
+) -> Result<SharedImageSurface, RenderingError> {
+ let session = draw_ctx.session().clone();
+
+ FilterContext::new(
+ &filter.user_space_filter,
+ stroke_paint_source,
+ fill_paint_source,
+ &source_surface,
+ transform,
+ node_bbox,
+ )
+ .and_then(|mut filter_ctx| {
+ // the message has an unclosed parenthesis; we'll close it below.
+ rsvg_log!(
+ session,
+ "(rendering filter with effects_region={:?}",
+ filter_ctx.effects_region()
+ );
+ for user_space_primitive in &filter.primitives {
+ let start = Instant::now();
+
+ match render_primitive(user_space_primitive, &filter_ctx, acquired_nodes, draw_ctx) {
+ Ok(output) => {
+ let elapsed = start.elapsed();
+ rsvg_log!(
+ session,
+ "(rendered filter primitive {} in\n {} seconds)",
+ user_space_primitive.params.name(),
+ elapsed.as_secs() as f64 + f64::from(elapsed.subsec_nanos()) / 1e9
+ );
+
+ filter_ctx.store_result(FilterResult {
+ name: user_space_primitive.result.clone(),
+ output,
+ });
+ }
+
+ Err(err) => {
+ rsvg_log!(
+ session,
+ "(filter primitive {} returned an error: {})",
+ user_space_primitive.params.name(),
+ err
+ );
+
+ // close the opening parenthesis from the message at the start of this function
+ rsvg_log!(session, ")");
+
+ // Exit early on Cairo errors. Continue rendering otherwise.
+ if let FilterError::CairoError(status) = err {
+ return Err(FilterError::CairoError(status));
+ }
+ }
+ }
+ }
+
+ // close the opening parenthesis from the message at the start of this function
+ rsvg_log!(session, ")");
+
+ Ok(filter_ctx.into_output()?)
+ })
+ .or_else(|err| match err {
+ FilterError::CairoError(status) => {
+ // Exit early on Cairo errors
+ Err(RenderingError::from(status))
+ }
+
+ _ => {
+ // ignore other filter errors and just return an empty surface
+ Ok(SharedImageSurface::empty(
+ source_surface.width(),
+ source_surface.height(),
+ SurfaceType::AlphaOnly,
+ )?)
+ }
+ })
+}
+
+#[rustfmt::skip]
+fn render_primitive(
+ primitive: &UserSpacePrimitive,
+ ctx: &FilterContext,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ draw_ctx: &mut DrawingCtx,
+) -> Result<FilterOutput, FilterError> {
+ use PrimitiveParams::*;
+
+ let bounds_builder = primitive.get_bounds(ctx);
+
+ // Note that feDropShadow is not handled here. When its FilterElement::resolve() is called,
+ // it returns a series of lower-level primitives (flood, blur, offset, etc.) that make up
+ // the drop-shadow effect.
+
+ match primitive.params {
+ Blend(ref p) => p.render(bounds_builder, ctx, acquired_nodes, draw_ctx),
+ ColorMatrix(ref p) => p.render(bounds_builder, ctx, acquired_nodes, draw_ctx),
+ ComponentTransfer(ref p) => p.render(bounds_builder, ctx, acquired_nodes, draw_ctx),
+ Composite(ref p) => p.render(bounds_builder, ctx, acquired_nodes, draw_ctx),
+ ConvolveMatrix(ref p) => p.render(bounds_builder, ctx, acquired_nodes, draw_ctx),
+ DiffuseLighting(ref p) => p.render(bounds_builder, ctx, acquired_nodes, draw_ctx),
+ DisplacementMap(ref p) => p.render(bounds_builder, ctx, acquired_nodes, draw_ctx),
+ Flood(ref p) => p.render(bounds_builder, ctx, acquired_nodes, draw_ctx),
+ GaussianBlur(ref p) => p.render(bounds_builder, ctx, acquired_nodes, draw_ctx),
+ Image(ref p) => p.render(bounds_builder, ctx, acquired_nodes, draw_ctx),
+ Merge(ref p) => p.render(bounds_builder, ctx, acquired_nodes, draw_ctx),
+ Morphology(ref p) => p.render(bounds_builder, ctx, acquired_nodes, draw_ctx),
+ Offset(ref p) => p.render(bounds_builder, ctx, acquired_nodes, draw_ctx),
+ SpecularLighting(ref p) => p.render(bounds_builder, ctx, acquired_nodes, draw_ctx),
+ Tile(ref p) => p.render(bounds_builder, ctx, acquired_nodes, draw_ctx),
+ Turbulence(ref p) => p.render(bounds_builder, ctx, acquired_nodes, draw_ctx),
+ }
+}
+
+impl From<ColorInterpolationFilters> for SurfaceType {
+ fn from(c: ColorInterpolationFilters) -> Self {
+ match c {
+ ColorInterpolationFilters::LinearRgb => SurfaceType::LinearRgb,
+ _ => SurfaceType::SRgb,
+ }
+ }
+}
diff --git a/rsvg/src/filters/morphology.rs b/rsvg/src/filters/morphology.rs
new file mode 100644
index 00000000..1ff7ddaa
--- /dev/null
+++ b/rsvg/src/filters/morphology.rs
@@ -0,0 +1,200 @@
+use std::cmp::{max, min};
+
+use cssparser::Parser;
+use markup5ever::{expanded_name, local_name, namespace_url, ns};
+
+use crate::document::AcquiredNodes;
+use crate::drawing_ctx::DrawingCtx;
+use crate::element::{set_attribute, ElementTrait};
+use crate::error::*;
+use crate::node::Node;
+use crate::parsers::{NumberOptionalNumber, Parse, ParseValue};
+use crate::properties::ColorInterpolationFilters;
+use crate::rect::IRect;
+use crate::session::Session;
+use crate::surface_utils::{
+ iterators::{PixelRectangle, Pixels},
+ shared_surface::ExclusiveImageSurface,
+ EdgeMode, ImageSurfaceDataExt, Pixel,
+};
+use crate::xml::Attributes;
+
+use super::bounds::BoundsBuilder;
+use super::context::{FilterContext, FilterOutput};
+use super::{
+ FilterEffect, FilterError, FilterResolveError, Input, Primitive, PrimitiveParams,
+ ResolvedPrimitive,
+};
+
+/// Enumeration of the possible morphology operations.
+#[derive(Clone)]
+enum Operator {
+ Erode,
+ Dilate,
+}
+
+enum_default!(Operator, Operator::Erode);
+
+/// The `feMorphology` filter primitive.
+#[derive(Default)]
+pub struct FeMorphology {
+ base: Primitive,
+ params: Morphology,
+}
+
+/// Resolved `feMorphology` primitive for rendering.
+#[derive(Clone)]
+pub struct Morphology {
+ in1: Input,
+ operator: Operator,
+ radius: NumberOptionalNumber<f64>,
+}
+
+// We need this because NumberOptionalNumber doesn't impl Default
+impl Default for Morphology {
+ fn default() -> Morphology {
+ Morphology {
+ in1: Default::default(),
+ operator: Default::default(),
+ radius: NumberOptionalNumber(0.0, 0.0),
+ }
+ }
+}
+
+impl ElementTrait for FeMorphology {
+ fn set_attributes(&mut self, attrs: &Attributes, session: &Session) {
+ self.params.in1 = self.base.parse_one_input(attrs, session);
+
+ for (attr, value) in attrs.iter() {
+ match attr.expanded() {
+ expanded_name!("", "operator") => {
+ set_attribute(&mut self.params.operator, attr.parse(value), session);
+ }
+ expanded_name!("", "radius") => {
+ set_attribute(&mut self.params.radius, attr.parse(value), session);
+ }
+ _ => (),
+ }
+ }
+ }
+}
+
+impl Morphology {
+ pub fn render(
+ &self,
+ bounds_builder: BoundsBuilder,
+ ctx: &FilterContext,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ draw_ctx: &mut DrawingCtx,
+ ) -> Result<FilterOutput, FilterError> {
+ // Although https://www.w3.org/TR/filter-effects/#propdef-color-interpolation-filters does not mention
+ // feMorphology as being one of the primitives that does *not* use that property,
+ // the SVG1.1 test for filters-morph-01-f.svg fails if we pass the value from the ComputedValues here (that
+ // document does not specify the color-interpolation-filters property, so it defaults to linearRGB).
+ // So, we pass Auto, which will get resolved to SRGB, and that makes that test pass.
+ //
+ // I suppose erosion/dilation doesn't care about the color space of the source image?
+
+ let input_1 = ctx.get_input(
+ acquired_nodes,
+ draw_ctx,
+ &self.in1,
+ ColorInterpolationFilters::Auto,
+ )?;
+ let bounds: IRect = bounds_builder
+ .add_input(&input_1)
+ .compute(ctx)
+ .clipped
+ .into();
+
+ let NumberOptionalNumber(rx, ry) = self.radius;
+
+ if rx <= 0.0 && ry <= 0.0 {
+ return Ok(FilterOutput {
+ surface: input_1.surface().clone(),
+ bounds,
+ });
+ }
+
+ let (rx, ry) = ctx.paffine().transform_distance(rx, ry);
+
+ // The radii can become negative here due to the transform.
+ // Additionally The radii being excessively large causes cpu hangups
+ let (rx, ry) = (rx.abs().min(10.0), ry.abs().min(10.0));
+
+ let mut surface = ExclusiveImageSurface::new(
+ ctx.source_graphic().width(),
+ ctx.source_graphic().height(),
+ input_1.surface().surface_type(),
+ )?;
+
+ surface.modify(&mut |data, stride| {
+ for (x, y, _pixel) in Pixels::within(input_1.surface(), bounds) {
+ // Compute the kernel rectangle bounds.
+ let kernel_bounds = IRect::new(
+ (f64::from(x) - rx).floor() as i32,
+ (f64::from(y) - ry).floor() as i32,
+ (f64::from(x) + rx).ceil() as i32 + 1,
+ (f64::from(y) + ry).ceil() as i32 + 1,
+ );
+
+ // Compute the new pixel values.
+ let initial = match self.operator {
+ Operator::Erode => u8::max_value(),
+ Operator::Dilate => u8::min_value(),
+ };
+
+ let mut output_pixel = Pixel {
+ r: initial,
+ g: initial,
+ b: initial,
+ a: initial,
+ };
+
+ for (_x, _y, pixel) in
+ PixelRectangle::within(input_1.surface(), bounds, kernel_bounds, EdgeMode::None)
+ {
+ let op = match self.operator {
+ Operator::Erode => min,
+ Operator::Dilate => max,
+ };
+
+ output_pixel.r = op(output_pixel.r, pixel.r);
+ output_pixel.g = op(output_pixel.g, pixel.g);
+ output_pixel.b = op(output_pixel.b, pixel.b);
+ output_pixel.a = op(output_pixel.a, pixel.a);
+ }
+
+ data.set_pixel(stride, output_pixel, x, y);
+ }
+ });
+
+ Ok(FilterOutput {
+ surface: surface.share()?,
+ bounds,
+ })
+ }
+}
+
+impl FilterEffect for FeMorphology {
+ fn resolve(
+ &self,
+ _acquired_nodes: &mut AcquiredNodes<'_>,
+ _node: &Node,
+ ) -> Result<Vec<ResolvedPrimitive>, FilterResolveError> {
+ Ok(vec![ResolvedPrimitive {
+ primitive: self.base.clone(),
+ params: PrimitiveParams::Morphology(self.params.clone()),
+ }])
+ }
+}
+
+impl Parse for Operator {
+ fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<Self, ParseError<'i>> {
+ Ok(parse_identifiers!(
+ parser,
+ "erode" => Operator::Erode,
+ "dilate" => Operator::Dilate,
+ )?)
+ }
+}
diff --git a/rsvg/src/filters/offset.rs b/rsvg/src/filters/offset.rs
new file mode 100644
index 00000000..5b15b583
--- /dev/null
+++ b/rsvg/src/filters/offset.rs
@@ -0,0 +1,100 @@
+use markup5ever::{expanded_name, local_name, namespace_url, ns};
+
+use crate::document::AcquiredNodes;
+use crate::drawing_ctx::DrawingCtx;
+use crate::element::{set_attribute, ElementTrait};
+use crate::node::Node;
+use crate::parsers::ParseValue;
+use crate::properties::ColorInterpolationFilters;
+use crate::rect::IRect;
+use crate::session::Session;
+use crate::xml::Attributes;
+
+use super::bounds::BoundsBuilder;
+use super::context::{FilterContext, FilterOutput};
+use super::{
+ FilterEffect, FilterError, FilterResolveError, Input, Primitive, PrimitiveParams,
+ ResolvedPrimitive,
+};
+
+/// The `feOffset` filter primitive.
+#[derive(Default)]
+pub struct FeOffset {
+ base: Primitive,
+ params: Offset,
+}
+
+/// Resolved `feOffset` primitive for rendering.
+#[derive(Clone, Default)]
+pub struct Offset {
+ pub in1: Input,
+ pub dx: f64,
+ pub dy: f64,
+}
+
+impl ElementTrait for FeOffset {
+ fn set_attributes(&mut self, attrs: &Attributes, session: &Session) {
+ self.params.in1 = self.base.parse_one_input(attrs, session);
+
+ for (attr, value) in attrs.iter() {
+ match attr.expanded() {
+ expanded_name!("", "dx") => {
+ set_attribute(&mut self.params.dx, attr.parse(value), session)
+ }
+ expanded_name!("", "dy") => {
+ set_attribute(&mut self.params.dy, attr.parse(value), session)
+ }
+ _ => (),
+ }
+ }
+ }
+}
+
+impl Offset {
+ pub fn render(
+ &self,
+ bounds_builder: BoundsBuilder,
+ ctx: &FilterContext,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ draw_ctx: &mut DrawingCtx,
+ ) -> Result<FilterOutput, FilterError> {
+ // https://www.w3.org/TR/filter-effects/#ColorInterpolationFiltersProperty
+ //
+ // "Note: The color-interpolation-filters property just has an
+ // effect on filter operations. Therefore, it has no effect on
+ // filter primitives like feOffset"
+ //
+ // This is why we pass Auto here.
+ let input_1 = ctx.get_input(
+ acquired_nodes,
+ draw_ctx,
+ &self.in1,
+ ColorInterpolationFilters::Auto,
+ )?;
+ let bounds: IRect = bounds_builder
+ .add_input(&input_1)
+ .compute(ctx)
+ .clipped
+ .into();
+ rsvg_log!(draw_ctx.session(), "(feOffset bounds={:?}", bounds);
+
+ let (dx, dy) = ctx.paffine().transform_distance(self.dx, self.dy);
+
+ let surface = input_1.surface().offset(bounds, dx, dy)?;
+
+ Ok(FilterOutput { surface, bounds })
+ }
+}
+
+impl FilterEffect for FeOffset {
+ fn resolve(
+ &self,
+ _acquired_nodes: &mut AcquiredNodes<'_>,
+ _node: &Node,
+ ) -> Result<Vec<ResolvedPrimitive>, FilterResolveError> {
+ Ok(vec![ResolvedPrimitive {
+ primitive: self.base.clone(),
+ params: PrimitiveParams::Offset(self.params.clone()),
+ }])
+ }
+}
diff --git a/rsvg/src/filters/tile.rs b/rsvg/src/filters/tile.rs
new file mode 100644
index 00000000..fb50ce81
--- /dev/null
+++ b/rsvg/src/filters/tile.rs
@@ -0,0 +1,109 @@
+use crate::document::AcquiredNodes;
+use crate::drawing_ctx::DrawingCtx;
+use crate::element::ElementTrait;
+use crate::node::Node;
+use crate::properties::ColorInterpolationFilters;
+use crate::rect::IRect;
+use crate::session::Session;
+use crate::xml::Attributes;
+
+use super::bounds::BoundsBuilder;
+use super::context::{FilterContext, FilterInput, FilterOutput};
+use super::{
+ FilterEffect, FilterError, FilterResolveError, Input, Primitive, PrimitiveParams,
+ ResolvedPrimitive,
+};
+
+/// The `feTile` filter primitive.
+#[derive(Default)]
+pub struct FeTile {
+ base: Primitive,
+ params: Tile,
+}
+
+/// Resolved `feTile` primitive for rendering.
+#[derive(Clone, Default)]
+pub struct Tile {
+ in1: Input,
+}
+
+impl ElementTrait for FeTile {
+ fn set_attributes(&mut self, attrs: &Attributes, session: &Session) {
+ self.params.in1 = self.base.parse_one_input(attrs, session);
+ }
+}
+
+impl Tile {
+ pub fn render(
+ &self,
+ bounds_builder: BoundsBuilder,
+ ctx: &FilterContext,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ draw_ctx: &mut DrawingCtx,
+ ) -> Result<FilterOutput, FilterError> {
+ // https://www.w3.org/TR/filter-effects/#ColorInterpolationFiltersProperty
+ //
+ // "Note: The color-interpolation-filters property just has an
+ // effect on filter operations. Therefore, it has no effect on
+ // filter primitives like [...], feTile"
+ //
+ // This is why we pass Auto here.
+ let input_1 = ctx.get_input(
+ acquired_nodes,
+ draw_ctx,
+ &self.in1,
+ ColorInterpolationFilters::Auto,
+ )?;
+
+ // feTile doesn't consider its inputs in the filter primitive subregion calculation.
+ let bounds: IRect = bounds_builder.compute(ctx).clipped.into();
+
+ let surface = match input_1 {
+ FilterInput::StandardInput(input_surface) => input_surface,
+ FilterInput::PrimitiveOutput(FilterOutput {
+ surface: input_surface,
+ bounds: input_bounds,
+ }) => {
+ if input_bounds.is_empty() {
+ rsvg_log!(
+ draw_ctx.session(),
+ "(feTile with empty input_bounds; returning just the input surface)"
+ );
+
+ input_surface
+ } else {
+ rsvg_log!(
+ draw_ctx.session(),
+ "(feTile bounds={:?}, input_bounds={:?})",
+ bounds,
+ input_bounds
+ );
+
+ let tile_surface = input_surface.tile(input_bounds)?;
+
+ ctx.source_graphic().paint_image_tiled(
+ bounds,
+ &tile_surface,
+ input_bounds.x0,
+ input_bounds.y0,
+ )?
+ }
+ }
+ };
+
+ Ok(FilterOutput { surface, bounds })
+ }
+}
+
+impl FilterEffect for FeTile {
+ fn resolve(
+ &self,
+ _acquired_nodes: &mut AcquiredNodes<'_>,
+ _node: &Node,
+ ) -> Result<Vec<ResolvedPrimitive>, FilterResolveError> {
+ Ok(vec![ResolvedPrimitive {
+ primitive: self.base.clone(),
+ params: PrimitiveParams::Tile(self.params.clone()),
+ }])
+ }
+}
diff --git a/rsvg/src/filters/turbulence.rs b/rsvg/src/filters/turbulence.rs
new file mode 100644
index 00000000..9e76a2a6
--- /dev/null
+++ b/rsvg/src/filters/turbulence.rs
@@ -0,0 +1,484 @@
+use cssparser::Parser;
+use markup5ever::{expanded_name, local_name, namespace_url, ns};
+
+use crate::document::AcquiredNodes;
+use crate::drawing_ctx::DrawingCtx;
+use crate::element::{set_attribute, ElementTrait};
+use crate::error::*;
+use crate::node::{CascadedValues, Node};
+use crate::parsers::{NumberOptionalNumber, Parse, ParseValue};
+use crate::properties::ColorInterpolationFilters;
+use crate::rect::IRect;
+use crate::session::Session;
+use crate::surface_utils::{
+ shared_surface::{ExclusiveImageSurface, SurfaceType},
+ ImageSurfaceDataExt, Pixel, PixelOps,
+};
+use crate::util::clamp;
+use crate::xml::Attributes;
+
+use super::bounds::BoundsBuilder;
+use super::context::{FilterContext, FilterOutput};
+use super::{
+ FilterEffect, FilterError, FilterResolveError, Primitive, PrimitiveParams, ResolvedPrimitive,
+};
+
+/// Enumeration of the tile stitching modes.
+#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash)]
+enum StitchTiles {
+ Stitch,
+ NoStitch,
+}
+
+enum_default!(StitchTiles, StitchTiles::NoStitch);
+
+/// Enumeration of the noise types.
+#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash)]
+enum NoiseType {
+ FractalNoise,
+ Turbulence,
+}
+
+enum_default!(NoiseType, NoiseType::Turbulence);
+
+/// The `feTurbulence` filter primitive.
+#[derive(Default)]
+pub struct FeTurbulence {
+ base: Primitive,
+ params: Turbulence,
+}
+
+/// Resolved `feTurbulence` primitive for rendering.
+#[derive(Clone)]
+pub struct Turbulence {
+ base_frequency: NumberOptionalNumber<f64>,
+ num_octaves: i32,
+ seed: f64,
+ stitch_tiles: StitchTiles,
+ type_: NoiseType,
+ color_interpolation_filters: ColorInterpolationFilters,
+}
+
+impl Default for Turbulence {
+ /// Constructs a new `Turbulence` with empty properties.
+ #[inline]
+ fn default() -> Turbulence {
+ Turbulence {
+ base_frequency: NumberOptionalNumber(0.0, 0.0),
+ num_octaves: 1,
+ seed: 0.0,
+ stitch_tiles: Default::default(),
+ type_: Default::default(),
+ color_interpolation_filters: Default::default(),
+ }
+ }
+}
+
+impl ElementTrait for FeTurbulence {
+ fn set_attributes(&mut self, attrs: &Attributes, session: &Session) {
+ self.base.parse_no_inputs(attrs, session);
+
+ for (attr, value) in attrs.iter() {
+ match attr.expanded() {
+ expanded_name!("", "baseFrequency") => {
+ set_attribute(&mut self.params.base_frequency, attr.parse(value), session);
+ }
+ expanded_name!("", "numOctaves") => {
+ set_attribute(&mut self.params.num_octaves, attr.parse(value), session);
+ }
+ // Yes, seed needs to be parsed as a number and then truncated.
+ expanded_name!("", "seed") => {
+ set_attribute(&mut self.params.seed, attr.parse(value), session);
+ }
+ expanded_name!("", "stitchTiles") => {
+ set_attribute(&mut self.params.stitch_tiles, attr.parse(value), session);
+ }
+ expanded_name!("", "type") => {
+ set_attribute(&mut self.params.type_, attr.parse(value), session)
+ }
+ _ => (),
+ }
+ }
+ }
+}
+
+// Produces results in the range [1, 2**31 - 2].
+// Algorithm is: r = (a * r) mod m
+// where a = 16807 and m = 2**31 - 1 = 2147483647
+// See [Park & Miller], CACM vol. 31 no. 10 p. 1195, Oct. 1988
+// To test: the algorithm should produce the result 1043618065
+// as the 10,000th generated number if the original seed is 1.
+const RAND_M: i32 = 2147483647; // 2**31 - 1
+const RAND_A: i32 = 16807; // 7**5; primitive root of m
+const RAND_Q: i32 = 127773; // m / a
+const RAND_R: i32 = 2836; // m % a
+
+fn setup_seed(mut seed: i32) -> i32 {
+ if seed <= 0 {
+ seed = -(seed % (RAND_M - 1)) + 1;
+ }
+ if seed > RAND_M - 1 {
+ seed = RAND_M - 1;
+ }
+ seed
+}
+
+fn random(seed: i32) -> i32 {
+ let mut result = RAND_A * (seed % RAND_Q) - RAND_R * (seed / RAND_Q);
+ if result <= 0 {
+ result += RAND_M;
+ }
+ result
+}
+
+const B_SIZE: usize = 0x100;
+const PERLIN_N: i32 = 0x1000;
+
+#[derive(Clone, Copy)]
+struct NoiseGenerator {
+ base_frequency: (f64, f64),
+ num_octaves: i32,
+ stitch_tiles: StitchTiles,
+ type_: NoiseType,
+
+ tile_width: f64,
+ tile_height: f64,
+
+ lattice_selector: [usize; B_SIZE + B_SIZE + 2],
+ gradient: [[[f64; 2]; B_SIZE + B_SIZE + 2]; 4],
+}
+
+#[derive(Clone, Copy)]
+struct StitchInfo {
+ width: usize, // How much to subtract to wrap for stitching.
+ height: usize,
+ wrap_x: usize, // Minimum value to wrap.
+ wrap_y: usize,
+}
+
+impl NoiseGenerator {
+ fn new(
+ seed: i32,
+ base_frequency: (f64, f64),
+ num_octaves: i32,
+ type_: NoiseType,
+ stitch_tiles: StitchTiles,
+ tile_width: f64,
+ tile_height: f64,
+ ) -> Self {
+ let mut rv = Self {
+ base_frequency,
+ num_octaves,
+ type_,
+ stitch_tiles,
+
+ tile_width,
+ tile_height,
+
+ lattice_selector: [0; B_SIZE + B_SIZE + 2],
+ gradient: [[[0.0; 2]; B_SIZE + B_SIZE + 2]; 4],
+ };
+
+ let mut seed = setup_seed(seed);
+
+ for k in 0..4 {
+ for i in 0..B_SIZE {
+ rv.lattice_selector[i] = i;
+ for j in 0..2 {
+ seed = random(seed);
+ rv.gradient[k][i][j] =
+ ((seed % (B_SIZE + B_SIZE) as i32) - B_SIZE as i32) as f64 / B_SIZE as f64;
+ }
+ let s = (rv.gradient[k][i][0] * rv.gradient[k][i][0]
+ + rv.gradient[k][i][1] * rv.gradient[k][i][1])
+ .sqrt();
+ rv.gradient[k][i][0] /= s;
+ rv.gradient[k][i][1] /= s;
+ }
+ }
+ for i in (1..B_SIZE).rev() {
+ let k = rv.lattice_selector[i];
+ seed = random(seed);
+ let j = seed as usize % B_SIZE;
+ rv.lattice_selector[i] = rv.lattice_selector[j];
+ rv.lattice_selector[j] = k;
+ }
+ for i in 0..B_SIZE + 2 {
+ rv.lattice_selector[B_SIZE + i] = rv.lattice_selector[i];
+ for k in 0..4 {
+ for j in 0..2 {
+ rv.gradient[k][B_SIZE + i][j] = rv.gradient[k][i][j];
+ }
+ }
+ }
+
+ rv
+ }
+
+ fn noise2(&self, color_channel: usize, vec: [f64; 2], stitch_info: Option<StitchInfo>) -> f64 {
+ #![allow(clippy::many_single_char_names)]
+
+ const BM: usize = 0xff;
+
+ let s_curve = |t| t * t * (3. - 2. * t);
+ let lerp = |t, a, b| a + t * (b - a);
+
+ let t = vec[0] + f64::from(PERLIN_N);
+ let mut bx0 = t as usize;
+ let mut bx1 = bx0 + 1;
+ let rx0 = t.fract();
+ let rx1 = rx0 - 1.0;
+ let t = vec[1] + f64::from(PERLIN_N);
+ let mut by0 = t as usize;
+ let mut by1 = by0 + 1;
+ let ry0 = t.fract();
+ let ry1 = ry0 - 1.0;
+
+ // If stitching, adjust lattice points accordingly.
+ if let Some(stitch_info) = stitch_info {
+ if bx0 >= stitch_info.wrap_x {
+ bx0 -= stitch_info.width;
+ }
+ if bx1 >= stitch_info.wrap_x {
+ bx1 -= stitch_info.width;
+ }
+ if by0 >= stitch_info.wrap_y {
+ by0 -= stitch_info.height;
+ }
+ if by1 >= stitch_info.wrap_y {
+ by1 -= stitch_info.height;
+ }
+ }
+ bx0 &= BM;
+ bx1 &= BM;
+ by0 &= BM;
+ by1 &= BM;
+ let i = self.lattice_selector[bx0];
+ let j = self.lattice_selector[bx1];
+ let b00 = self.lattice_selector[i + by0];
+ let b10 = self.lattice_selector[j + by0];
+ let b01 = self.lattice_selector[i + by1];
+ let b11 = self.lattice_selector[j + by1];
+ let sx = s_curve(rx0);
+ let sy = s_curve(ry0);
+ let q = self.gradient[color_channel][b00];
+ let u = rx0 * q[0] + ry0 * q[1];
+ let q = self.gradient[color_channel][b10];
+ let v = rx1 * q[0] + ry0 * q[1];
+ let a = lerp(sx, u, v);
+ let q = self.gradient[color_channel][b01];
+ let u = rx0 * q[0] + ry1 * q[1];
+ let q = self.gradient[color_channel][b11];
+ let v = rx1 * q[0] + ry1 * q[1];
+ let b = lerp(sx, u, v);
+ lerp(sy, a, b)
+ }
+
+ fn turbulence(&self, color_channel: usize, point: [f64; 2], tile_x: f64, tile_y: f64) -> f64 {
+ let mut stitch_info = None;
+ let mut base_frequency = self.base_frequency;
+
+ // Adjust the base frequencies if necessary for stitching.
+ if self.stitch_tiles == StitchTiles::Stitch {
+ // When stitching tiled turbulence, the frequencies must be adjusted
+ // so that the tile borders will be continuous.
+ if base_frequency.0 != 0.0 {
+ let freq_lo = (self.tile_width * base_frequency.0).floor() / self.tile_width;
+ let freq_hi = (self.tile_width * base_frequency.0).ceil() / self.tile_width;
+ if base_frequency.0 / freq_lo < freq_hi / base_frequency.0 {
+ base_frequency.0 = freq_lo;
+ } else {
+ base_frequency.0 = freq_hi;
+ }
+ }
+ if base_frequency.1 != 0.0 {
+ let freq_lo = (self.tile_height * base_frequency.1).floor() / self.tile_height;
+ let freq_hi = (self.tile_height * base_frequency.1).ceil() / self.tile_height;
+ if base_frequency.1 / freq_lo < freq_hi / base_frequency.1 {
+ base_frequency.1 = freq_lo;
+ } else {
+ base_frequency.1 = freq_hi;
+ }
+ }
+
+ // Set up initial stitch values.
+ let width = (self.tile_width * base_frequency.0 + 0.5) as usize;
+ let height = (self.tile_height * base_frequency.1 + 0.5) as usize;
+ stitch_info = Some(StitchInfo {
+ width,
+ wrap_x: (tile_x * base_frequency.0) as usize + PERLIN_N as usize + width,
+ height,
+ wrap_y: (tile_y * base_frequency.1) as usize + PERLIN_N as usize + height,
+ });
+ }
+
+ let mut sum = 0.0;
+ let mut vec = [point[0] * base_frequency.0, point[1] * base_frequency.1];
+ let mut ratio = 1.0;
+ for _ in 0..self.num_octaves {
+ if self.type_ == NoiseType::FractalNoise {
+ sum += self.noise2(color_channel, vec, stitch_info) / ratio;
+ } else {
+ sum += (self.noise2(color_channel, vec, stitch_info)).abs() / ratio;
+ }
+ vec[0] *= 2.0;
+ vec[1] *= 2.0;
+ ratio *= 2.0;
+ if let Some(stitch_info) = stitch_info.as_mut() {
+ // Update stitch values. Subtracting PerlinN before the multiplication and
+ // adding it afterward simplifies to subtracting it once.
+ stitch_info.width *= 2;
+ stitch_info.wrap_x = 2 * stitch_info.wrap_x - PERLIN_N as usize;
+ stitch_info.height *= 2;
+ stitch_info.wrap_y = 2 * stitch_info.wrap_y - PERLIN_N as usize;
+ }
+ }
+ sum
+ }
+}
+
+impl Turbulence {
+ pub fn render(
+ &self,
+ bounds_builder: BoundsBuilder,
+ ctx: &FilterContext,
+ _acquired_nodes: &mut AcquiredNodes<'_>,
+ _draw_ctx: &mut DrawingCtx,
+ ) -> Result<FilterOutput, FilterError> {
+ let bounds: IRect = bounds_builder.compute(ctx).clipped.into();
+
+ let affine = ctx.paffine().invert().unwrap();
+
+ let seed = clamp(
+ self.seed.trunc(), // per the spec, round towards zero
+ f64::from(i32::min_value()),
+ f64::from(i32::max_value()),
+ ) as i32;
+
+ // "Negative values are unsupported" -> set to the initial value which is 0.0
+ //
+ // https://drafts.fxtf.org/filter-effects/#element-attrdef-feturbulence-basefrequency
+ let base_frequency = {
+ let NumberOptionalNumber(base_freq_x, base_freq_y) = self.base_frequency;
+ let x = base_freq_x.max(0.0);
+ let y = base_freq_y.max(0.0);
+ (x, y)
+ };
+
+ let noise_generator = NoiseGenerator::new(
+ seed,
+ base_frequency,
+ self.num_octaves,
+ self.type_,
+ self.stitch_tiles,
+ f64::from(bounds.width()),
+ f64::from(bounds.height()),
+ );
+
+ // The generated color values are in the color space determined by
+ // color-interpolation-filters.
+ let surface_type = SurfaceType::from(self.color_interpolation_filters);
+
+ let mut surface = ExclusiveImageSurface::new(
+ ctx.source_graphic().width(),
+ ctx.source_graphic().height(),
+ surface_type,
+ )?;
+
+ surface.modify(&mut |data, stride| {
+ for y in bounds.y_range() {
+ for x in bounds.x_range() {
+ let point = affine.transform_point(f64::from(x), f64::from(y));
+ let point = [point.0, point.1];
+
+ let generate = |color_channel| {
+ let v = noise_generator.turbulence(
+ color_channel,
+ point,
+ f64::from(x - bounds.x0),
+ f64::from(y - bounds.y0),
+ );
+
+ let v = match self.type_ {
+ NoiseType::FractalNoise => (v * 255.0 + 255.0) / 2.0,
+ NoiseType::Turbulence => v * 255.0,
+ };
+
+ (clamp(v, 0.0, 255.0) + 0.5) as u8
+ };
+
+ let pixel = Pixel {
+ r: generate(0),
+ g: generate(1),
+ b: generate(2),
+ a: generate(3),
+ }
+ .premultiply();
+
+ data.set_pixel(stride, pixel, x as u32, y as u32);
+ }
+ }
+ });
+
+ Ok(FilterOutput {
+ surface: surface.share()?,
+ bounds,
+ })
+ }
+}
+
+impl FilterEffect for FeTurbulence {
+ fn resolve(
+ &self,
+ _acquired_nodes: &mut AcquiredNodes<'_>,
+ node: &Node,
+ ) -> Result<Vec<ResolvedPrimitive>, FilterResolveError> {
+ let cascaded = CascadedValues::new_from_node(node);
+ let values = cascaded.get();
+
+ let mut params = self.params.clone();
+ params.color_interpolation_filters = values.color_interpolation_filters();
+
+ Ok(vec![ResolvedPrimitive {
+ primitive: self.base.clone(),
+ params: PrimitiveParams::Turbulence(params),
+ }])
+ }
+}
+
+impl Parse for StitchTiles {
+ fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<Self, ParseError<'i>> {
+ Ok(parse_identifiers!(
+ parser,
+ "stitch" => StitchTiles::Stitch,
+ "noStitch" => StitchTiles::NoStitch,
+ )?)
+ }
+}
+
+impl Parse for NoiseType {
+ fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<Self, ParseError<'i>> {
+ Ok(parse_identifiers!(
+ parser,
+ "fractalNoise" => NoiseType::FractalNoise,
+ "turbulence" => NoiseType::Turbulence,
+ )?)
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn turbulence_rng() {
+ let mut r = 1;
+ r = setup_seed(r);
+
+ for _ in 0..10_000 {
+ r = random(r);
+ }
+
+ assert_eq!(r, 1043618065);
+ }
+}
diff --git a/rsvg/src/float_eq_cairo.rs b/rsvg/src/float_eq_cairo.rs
new file mode 100644
index 00000000..74a14d9f
--- /dev/null
+++ b/rsvg/src/float_eq_cairo.rs
@@ -0,0 +1,154 @@
+//! Utilities to compare floating-point numbers.
+
+use float_cmp::ApproxEq;
+
+// The following are copied from cairo/src/{cairo-fixed-private.h,
+// cairo-fixed-type-private.h}
+
+const CAIRO_FIXED_FRAC_BITS: u64 = 8;
+const CAIRO_MAGIC_NUMBER_FIXED: f64 = (1u64 << (52 - CAIRO_FIXED_FRAC_BITS)) as f64 * 1.5;
+
+fn cairo_magic_double(d: f64) -> f64 {
+ d + CAIRO_MAGIC_NUMBER_FIXED
+}
+
+fn cairo_fixed_from_double(d: f64) -> i32 {
+ let bits = cairo_magic_double(d).to_bits();
+ let lower = bits & 0xffffffff;
+ lower as i32
+}
+
+/// Implements a method to check whether two `f64` numbers would have
+/// the same fixed-point representation in Cairo.
+///
+/// This generally means that the absolute difference between them,
+/// when taken as floating-point numbers, is less than the smallest
+/// representable fraction that Cairo can represent in fixed-point.
+///
+/// Implementation detail: Cairo fixed-point numbers use 24 bits for
+/// the integral part, and 8 bits for the fractional part. That is,
+/// the smallest fraction they can represent is 1/256.
+pub trait FixedEqCairo {
+ fn fixed_eq_cairo(&self, other: &Self) -> bool;
+}
+
+impl FixedEqCairo for f64 {
+ fn fixed_eq_cairo(&self, other: &f64) -> bool {
+ // FIXME: Here we have the same problem as Cairo itself: we
+ // don't check for overflow in the conversion of double to
+ // fixed-point.
+ cairo_fixed_from_double(*self) == cairo_fixed_from_double(*other)
+ }
+}
+
+/// Checks whether two floating-point numbers are approximately equal,
+/// considering Cairo's limitations on numeric representation.
+///
+/// Cairo uses fixed-point numbers internally. We implement this
+/// trait for `f64`, so that two numbers can be considered "close
+/// enough to equal" if their absolute difference is smaller than the
+/// smallest fixed-point fraction that Cairo can represent.
+///
+/// Note that this trait is reliable even if the given numbers are
+/// outside of the range that Cairo's fixed-point numbers can
+/// represent. In that case, we check for the absolute difference,
+/// and finally allow a difference of 1 unit-in-the-last-place (ULP)
+/// for very large f64 values.
+pub trait ApproxEqCairo: ApproxEq {
+ fn approx_eq_cairo(self, other: Self) -> bool;
+}
+
+impl ApproxEqCairo for f64 {
+ fn approx_eq_cairo(self, other: f64) -> bool {
+ let cairo_smallest_fraction = 1.0 / f64::from(1 << CAIRO_FIXED_FRAC_BITS);
+ self.approx_eq(other, (cairo_smallest_fraction, 1))
+ }
+}
+
+// Macro for usage in unit tests
+#[macro_export]
+macro_rules! assert_approx_eq_cairo {
+ ($left:expr, $right:expr) => {{
+ match ($left, $right) {
+ (l, r) => {
+ if !l.approx_eq_cairo(r) {
+ panic!(
+ r#"assertion failed: `(left == right)`
+ left: `{:?}`,
+ right: `{:?}`"#,
+ l, r
+ )
+ }
+ }
+ }
+ }};
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn numbers_equal_in_cairo_fixed_point() {
+ assert!(1.0_f64.fixed_eq_cairo(&1.0_f64));
+
+ assert!(1.0_f64.fixed_eq_cairo(&1.001953125_f64)); // 1 + 1/512 - cairo rounds to 1
+
+ assert!(!1.0_f64.fixed_eq_cairo(&1.00390625_f64)); // 1 + 1/256 - cairo can represent it
+ }
+
+ #[test]
+ fn numbers_approx_equal() {
+ // 0 == 1/256 - cairo can represent it, so not equal
+ assert!(!0.0_f64.approx_eq_cairo(0.00390635_f64));
+
+ // 1 == 1 + 1/256 - cairo can represent it, so not equal
+ assert!(!1.0_f64.approx_eq_cairo(1.00390635_f64));
+
+ // 0 == 1/256 - cairo can represent it, so not equal
+ assert!(!0.0_f64.approx_eq_cairo(-0.00390635_f64));
+
+ // 1 == 1 - 1/256 - cairo can represent it, so not equal
+ assert!(!1.0_f64.approx_eq_cairo(0.99609365_f64));
+
+ // 0 == 1/512 - cairo approximates to 0, so equal
+ assert!(0.0_f64.approx_eq_cairo(0.001953125_f64));
+
+ // 1 == 1 + 1/512 - cairo approximates to 1, so equal
+ assert!(1.0_f64.approx_eq_cairo(1.001953125_f64));
+
+ // 0 == -1/512 - cairo approximates to 0, so equal
+ assert!(0.0_f64.approx_eq_cairo(-0.001953125_f64));
+
+ // 1 == 1 - 1/512 - cairo approximates to 1, so equal
+ assert!(1.0_f64.approx_eq_cairo(0.998046875_f64));
+
+ // This is 2^53 compared to (2^53 + 2). When represented as
+ // f64, they are 1 unit-in-the-last-place (ULP) away from each
+ // other, since the mantissa has 53 bits (52 bits plus 1
+ // "hidden" bit). The first number is an exact double, and
+ // the second one is the next biggest double. We consider a
+ // difference of 1 ULP to mean that numbers are "equal", to
+ // account for slight imprecision in floating-point
+ // calculations. Most of the time, for small values, we will
+ // be using the cairo_smallest_fraction from the
+ // implementation of approx_eq_cairo() above. For large
+ // values, we want the ULPs.
+ //
+ // In the second assertion, we compare 2^53 with (2^53 + 4). Those are
+ // 2 ULPs away, and we don't consider them equal.
+ assert!(9_007_199_254_740_992.0.approx_eq_cairo(9_007_199_254_740_994.0));
+ assert!(!9_007_199_254_740_992.0.approx_eq_cairo(9_007_199_254_740_996.0));
+ }
+
+ #[test]
+ fn assert_approx_eq_cairo_should_not_panic() {
+ assert_approx_eq_cairo!(42_f64, 42_f64);
+ }
+
+ #[test]
+ #[should_panic]
+ fn assert_approx_eq_cairo_should_panic() {
+ assert_approx_eq_cairo!(3_f64, 42_f64);
+ }
+}
diff --git a/rsvg/src/font_props.rs b/rsvg/src/font_props.rs
new file mode 100644
index 00000000..e4babe02
--- /dev/null
+++ b/rsvg/src/font_props.rs
@@ -0,0 +1,878 @@
+//! CSS font properties.
+//!
+//! Do not import things directly from this module; use the `properties` module instead,
+//! which re-exports things from here.
+
+use cast::{f64, u16};
+use cssparser::{Parser, Token};
+
+use crate::error::*;
+use crate::length::*;
+use crate::parsers::{finite_f32, Parse};
+use crate::properties::ComputedValues;
+use crate::property_defs::{FontStretch, FontStyle, FontVariant};
+
+/// `font` shorthand property.
+///
+/// CSS2: <https://www.w3.org/TR/CSS2/fonts.html#font-shorthand>
+///
+/// CSS Fonts 3: <https://www.w3.org/TR/css-fonts-3/#propdef-font>
+///
+/// CSS Fonts 4: <https://drafts.csswg.org/css-fonts-4/#font-prop>
+///
+/// This is a shorthand, which expands to the longhands `font-family`, `font-size`, etc.
+// servo/components/style/properties/shorthands/font.mako.rs is a good reference for this
+#[derive(Debug, Clone, PartialEq)]
+pub enum Font {
+ Caption,
+ Icon,
+ Menu,
+ MessageBox,
+ SmallCaption,
+ StatusBar,
+ Spec(FontSpec),
+}
+
+/// Parameters from the `font` shorthand property.
+#[derive(Debug, Default, Clone, PartialEq)]
+pub struct FontSpec {
+ pub style: FontStyle,
+ pub variant: FontVariant,
+ pub weight: FontWeight,
+ pub stretch: FontStretch,
+ pub size: FontSize,
+ pub line_height: LineHeight,
+ pub family: FontFamily,
+}
+
+impl Parse for Font {
+ fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<Font, ParseError<'i>> {
+ if let Ok(f) = parse_font_spec_identifiers(parser) {
+ return Ok(f);
+ }
+
+ // The following is stolen from servo/components/style/properties/shorthands/font.mako.rs
+
+ let mut nb_normals = 0;
+ let mut style = None;
+ let mut variant_caps = None;
+ let mut weight = None;
+ let mut stretch = None;
+ let size;
+
+ loop {
+ // Special-case 'normal' because it is valid in each of
+ // font-style, font-weight, font-variant and font-stretch.
+ // Leaves the values to None, 'normal' is the initial value for each of them.
+ if parser
+ .try_parse(|input| input.expect_ident_matching("normal"))
+ .is_ok()
+ {
+ nb_normals += 1;
+ continue;
+ }
+ if style.is_none() {
+ if let Ok(value) = parser.try_parse(FontStyle::parse) {
+ style = Some(value);
+ continue;
+ }
+ }
+ if weight.is_none() {
+ if let Ok(value) = parser.try_parse(FontWeight::parse) {
+ weight = Some(value);
+ continue;
+ }
+ }
+ if variant_caps.is_none() {
+ if let Ok(value) = parser.try_parse(FontVariant::parse) {
+ variant_caps = Some(value);
+ continue;
+ }
+ }
+ if stretch.is_none() {
+ if let Ok(value) = parser.try_parse(FontStretch::parse) {
+ stretch = Some(value);
+ continue;
+ }
+ }
+ size = FontSize::parse(parser)?;
+ break;
+ }
+
+ let line_height = if parser.try_parse(|input| input.expect_delim('/')).is_ok() {
+ Some(LineHeight::parse(parser)?)
+ } else {
+ None
+ };
+
+ #[inline]
+ fn count<T>(opt: &Option<T>) -> u8 {
+ if opt.is_some() {
+ 1
+ } else {
+ 0
+ }
+ }
+
+ if (count(&style) + count(&weight) + count(&variant_caps) + count(&stretch) + nb_normals)
+ > 4
+ {
+ return Err(parser.new_custom_error(ValueErrorKind::parse_error(
+ "invalid syntax for 'font' property",
+ )));
+ }
+
+ let family = FontFamily::parse(parser)?;
+
+ Ok(Font::Spec(FontSpec {
+ style: style.unwrap_or_default(),
+ variant: variant_caps.unwrap_or_default(),
+ weight: weight.unwrap_or_default(),
+ stretch: stretch.unwrap_or_default(),
+ size,
+ line_height: line_height.unwrap_or_default(),
+ family,
+ }))
+ }
+}
+
+impl Font {
+ pub fn to_font_spec(&self) -> FontSpec {
+ match *self {
+ Font::Caption
+ | Font::Icon
+ | Font::Menu
+ | Font::MessageBox
+ | Font::SmallCaption
+ | Font::StatusBar => {
+ // We don't actually pick up the systme fonts, so reduce them to a default.
+ FontSpec::default()
+ }
+
+ Font::Spec(ref spec) => spec.clone(),
+ }
+ }
+}
+
+/// Parses identifiers used for system fonts.
+#[rustfmt::skip]
+fn parse_font_spec_identifiers<'i>(parser: &mut Parser<'i, '_>) -> Result<Font, ParseError<'i>> {
+ Ok(parser.try_parse(|p| {
+ parse_identifiers! {
+ p,
+ "caption" => Font::Caption,
+ "icon" => Font::Icon,
+ "menu" => Font::Menu,
+ "message-box" => Font::MessageBox,
+ "small-caption" => Font::SmallCaption,
+ "status-bar" => Font::StatusBar,
+ }
+ })?)
+}
+
+/// `font-size` property.
+///
+/// SVG1.1: <https://www.w3.org/TR/SVG11/text.html#FontSizeProperty>
+///
+/// CSS2: <https://www.w3.org/TR/2008/REC-CSS2-20080411/fonts.html#propdef-font-size>
+///
+/// CSS Fonts 3: <https://www.w3.org/TR/css-fonts-3/#font-size-prop>
+#[allow(clippy::upper_case_acronyms)]
+#[derive(Debug, Clone, PartialEq)]
+pub enum FontSize {
+ Smaller,
+ Larger,
+ XXSmall,
+ XSmall,
+ Small,
+ Medium,
+ Large,
+ XLarge,
+ XXLarge,
+ Value(Length<Both>),
+}
+
+impl FontSize {
+ pub fn value(&self) -> Length<Both> {
+ match self {
+ FontSize::Value(s) => *s,
+ _ => unreachable!(),
+ }
+ }
+
+ pub fn compute(&self, v: &ComputedValues) -> Self {
+ let compute_points = |p| 12.0 * 1.2f64.powf(p) / POINTS_PER_INCH;
+
+ let parent = v.font_size().value();
+
+ // The parent must already have resolved to an absolute unit
+ assert!(
+ parent.unit != LengthUnit::Percent
+ && parent.unit != LengthUnit::Em
+ && parent.unit != LengthUnit::Ex
+ );
+
+ use FontSize::*;
+
+ #[rustfmt::skip]
+ let new_size = match self {
+ Smaller => Length::<Both>::new(parent.length / 1.2, parent.unit),
+ Larger => Length::<Both>::new(parent.length * 1.2, parent.unit),
+ XXSmall => Length::<Both>::new(compute_points(-3.0), LengthUnit::In),
+ XSmall => Length::<Both>::new(compute_points(-2.0), LengthUnit::In),
+ Small => Length::<Both>::new(compute_points(-1.0), LengthUnit::In),
+ Medium => Length::<Both>::new(compute_points(0.0), LengthUnit::In),
+ Large => Length::<Both>::new(compute_points(1.0), LengthUnit::In),
+ XLarge => Length::<Both>::new(compute_points(2.0), LengthUnit::In),
+ XXLarge => Length::<Both>::new(compute_points(3.0), LengthUnit::In),
+
+ Value(s) if s.unit == LengthUnit::Percent => {
+ Length::<Both>::new(parent.length * s.length, parent.unit)
+ }
+
+ Value(s) if s.unit == LengthUnit::Em => {
+ Length::<Both>::new(parent.length * s.length, parent.unit)
+ }
+
+ Value(s) if s.unit == LengthUnit::Ex => {
+ // FIXME: it would be nice to know the actual Ex-height
+ // of the font.
+ Length::<Both>::new(parent.length * s.length / 2.0, parent.unit)
+ }
+
+ Value(s) => *s,
+ };
+
+ FontSize::Value(new_size)
+ }
+
+ pub fn to_user(&self, params: &NormalizeParams) -> f64 {
+ self.value().to_user(params)
+ }
+}
+
+impl Parse for FontSize {
+ #[rustfmt::skip]
+ fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<FontSize, ParseError<'i>> {
+ parser
+ .try_parse(|p| Length::<Both>::parse(p))
+ .map(FontSize::Value)
+ .or_else(|_| {
+ Ok(parse_identifiers!(
+ parser,
+ "smaller" => FontSize::Smaller,
+ "larger" => FontSize::Larger,
+ "xx-small" => FontSize::XXSmall,
+ "x-small" => FontSize::XSmall,
+ "small" => FontSize::Small,
+ "medium" => FontSize::Medium,
+ "large" => FontSize::Large,
+ "x-large" => FontSize::XLarge,
+ "xx-large" => FontSize::XXLarge,
+ )?)
+ })
+ }
+}
+
+/// `font-weight` property.
+///
+/// CSS Fonts 3: <https://www.w3.org/TR/css-fonts-3/#propdef-font-weight>
+///
+/// CSS Fonts 4: <https://drafts.csswg.org/css-fonts-4/#font-weight-prop>
+#[derive(Debug, Copy, Clone, PartialEq)]
+pub enum FontWeight {
+ Normal,
+ Bold,
+ Bolder,
+ Lighter,
+ Weight(u16),
+}
+
+impl Parse for FontWeight {
+ fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<FontWeight, ParseError<'i>> {
+ parser
+ .try_parse(|p| {
+ Ok(parse_identifiers!(
+ p,
+ "normal" => FontWeight::Normal,
+ "bold" => FontWeight::Bold,
+ "bolder" => FontWeight::Bolder,
+ "lighter" => FontWeight::Lighter,
+ )?)
+ })
+ .or_else(|_: ParseError<'_>| {
+ let loc = parser.current_source_location();
+ let i = parser.expect_integer()?;
+ if (1..=1000).contains(&i) {
+ Ok(FontWeight::Weight(u16(i).unwrap()))
+ } else {
+ Err(loc.new_custom_error(ValueErrorKind::value_error(
+ "value must be between 1 and 1000 inclusive",
+ )))
+ }
+ })
+ }
+}
+
+impl FontWeight {
+ #[rustfmt::skip]
+ pub fn compute(&self, v: &Self) -> Self {
+ use FontWeight::*;
+
+ // Here, note that we assume that Normal=W400 and Bold=W700, per the spec. Also,
+ // this must match `impl From<FontWeight> for pango::Weight`.
+ //
+ // See the table at https://drafts.csswg.org/css-fonts-4/#relative-weights
+
+ match *self {
+ Bolder => match v.numeric_weight() {
+ w if ( 1..100).contains(&w) => Weight(400),
+ w if (100..350).contains(&w) => Weight(400),
+ w if (350..550).contains(&w) => Weight(700),
+ w if (550..750).contains(&w) => Weight(900),
+ w if (750..900).contains(&w) => Weight(900),
+ w if 900 <= w => Weight(w),
+
+ _ => unreachable!(),
+ }
+
+ Lighter => match v.numeric_weight() {
+ w if ( 1..100).contains(&w) => Weight(w),
+ w if (100..350).contains(&w) => Weight(100),
+ w if (350..550).contains(&w) => Weight(100),
+ w if (550..750).contains(&w) => Weight(400),
+ w if (750..900).contains(&w) => Weight(700),
+ w if 900 <= w => Weight(700),
+
+ _ => unreachable!(),
+ }
+
+ _ => *self,
+ }
+ }
+
+ // Converts the symbolic weights to numeric weights. Will panic on `Bolder` or `Lighter`.
+ pub fn numeric_weight(self) -> u16 {
+ use FontWeight::*;
+
+ // Here, note that we assume that Normal=W400 and Bold=W700, per the spec. Also,
+ // this must match `impl From<FontWeight> for pango::Weight`.
+ match self {
+ Normal => 400,
+ Bold => 700,
+ Bolder | Lighter => unreachable!(),
+ Weight(w) => w,
+ }
+ }
+}
+
+/// `letter-spacing` property.
+///
+/// SVG1.1: <https://www.w3.org/TR/SVG11/text.html#LetterSpacingProperty>
+///
+/// CSS Text 3: <https://www.w3.org/TR/css-text-3/#letter-spacing-property>
+#[derive(Debug, Clone, PartialEq)]
+pub enum LetterSpacing {
+ Normal,
+ Value(Length<Horizontal>),
+}
+
+impl LetterSpacing {
+ pub fn value(&self) -> Length<Horizontal> {
+ match self {
+ LetterSpacing::Value(s) => *s,
+ _ => unreachable!(),
+ }
+ }
+
+ pub fn compute(&self) -> Self {
+ let spacing = match self {
+ LetterSpacing::Normal => Length::<Horizontal>::new(0.0, LengthUnit::Px),
+ LetterSpacing::Value(s) => *s,
+ };
+
+ LetterSpacing::Value(spacing)
+ }
+
+ pub fn to_user(&self, params: &NormalizeParams) -> f64 {
+ self.value().to_user(params)
+ }
+}
+
+impl Parse for LetterSpacing {
+ fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<LetterSpacing, ParseError<'i>> {
+ parser
+ .try_parse(|p| Length::<Horizontal>::parse(p))
+ .map(LetterSpacing::Value)
+ .or_else(|_| {
+ Ok(parse_identifiers!(
+ parser,
+ "normal" => LetterSpacing::Normal,
+ )?)
+ })
+ }
+}
+
+/// `line-height` property.
+///
+/// CSS2: <https://www.w3.org/TR/CSS2/visudet.html#propdef-line-height>
+#[derive(Debug, Clone, PartialEq)]
+pub enum LineHeight {
+ Normal,
+ Number(f32),
+ Length(Length<Both>),
+ Percentage(f32),
+}
+
+impl LineHeight {
+ pub fn value(&self) -> Length<Both> {
+ match self {
+ LineHeight::Length(l) => *l,
+ _ => unreachable!(),
+ }
+ }
+
+ pub fn compute(&self, values: &ComputedValues) -> Self {
+ let font_size = values.font_size().value();
+
+ match *self {
+ LineHeight::Normal => LineHeight::Length(font_size),
+
+ LineHeight::Number(f) | LineHeight::Percentage(f) => {
+ LineHeight::Length(Length::new(font_size.length * f64(f), font_size.unit))
+ }
+
+ LineHeight::Length(l) => LineHeight::Length(l),
+ }
+ }
+
+ pub fn to_user(&self, params: &NormalizeParams) -> f64 {
+ self.value().to_user(params)
+ }
+}
+
+impl Parse for LineHeight {
+ fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<LineHeight, ParseError<'i>> {
+ let state = parser.state();
+ let loc = parser.current_source_location();
+
+ let token = parser.next()?.clone();
+
+ match token {
+ Token::Ident(ref cow) => {
+ if cow.eq_ignore_ascii_case("normal") {
+ Ok(LineHeight::Normal)
+ } else {
+ Err(parser
+ .new_basic_unexpected_token_error(token.clone())
+ .into())
+ }
+ }
+
+ Token::Number { value, .. } => Ok(LineHeight::Number(
+ finite_f32(value).map_err(|e| loc.new_custom_error(e))?,
+ )),
+
+ Token::Percentage { unit_value, .. } => Ok(LineHeight::Percentage(unit_value)),
+
+ Token::Dimension { .. } => {
+ parser.reset(&state);
+ Ok(LineHeight::Length(Length::<Both>::parse(parser)?))
+ }
+
+ _ => Err(parser.new_basic_unexpected_token_error(token).into()),
+ }
+ }
+}
+
+/// `font-family` property.
+///
+/// SVG1.1: <https://www.w3.org/TR/SVG11/text.html#FontFamilyProperty>
+///
+/// CSS 2: <https://www.w3.org/TR/2008/REC-CSS2-20080411/fonts.html#propdef-font-family>
+///
+/// CSS Fonts 3: <https://www.w3.org/TR/css-fonts-3/#font-family-prop>
+#[derive(Debug, Clone, PartialEq)]
+pub struct FontFamily(pub String);
+
+impl Parse for FontFamily {
+ fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<FontFamily, ParseError<'i>> {
+ let loc = parser.current_source_location();
+
+ let fonts = parser.parse_comma_separated(|parser| {
+ if let Ok(cow) = parser.try_parse(|p| p.expect_string_cloned()) {
+ if cow == "" {
+ return Err(loc.new_custom_error(ValueErrorKind::value_error(
+ "empty string is not a valid font family name",
+ )));
+ }
+
+ return Ok(cow);
+ }
+
+ let first_ident = parser.expect_ident()?.clone();
+ let mut value = first_ident.as_ref().to_owned();
+
+ while let Ok(cow) = parser.try_parse(|p| p.expect_ident_cloned()) {
+ value.push(' ');
+ value.push_str(&cow);
+ }
+ Ok(cssparser::CowRcStr::from(value))
+ })?;
+
+ Ok(FontFamily(fonts.join(",")))
+ }
+}
+
+impl FontFamily {
+ pub fn as_str(&self) -> &str {
+ &self.0
+ }
+}
+
+/// `glyph-orientation-vertical` property.
+///
+/// Note that in SVG1.1 this could be `auto` or `<angle>`, but in SVG2/CSS3 it is
+/// deprecated, and turned into a shorthand for the `text-orientation` property. Also,
+/// now it only takes values `auto`, `0deg`, `90deg`, `0`, `90`. At parsing time, this
+/// gets translated to fixed enum values.
+///
+/// CSS Writing Modes 3: <https://www.w3.org/TR/css-writing-modes-3/#propdef-glyph-orientation-vertical>
+///
+/// Obsolete SVG1.1: <https://www.w3.org/TR/SVG11/text.html#GlyphOrientationVerticalProperty>
+#[derive(Debug, Copy, Clone, PartialEq)]
+pub enum GlyphOrientationVertical {
+ Auto,
+ Angle0,
+ Angle90,
+}
+
+impl Parse for GlyphOrientationVertical {
+ fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<GlyphOrientationVertical, ParseError<'i>> {
+ let loc = parser.current_source_location();
+
+ if parser
+ .try_parse(|p| p.expect_ident_matching("auto"))
+ .is_ok()
+ {
+ return Ok(GlyphOrientationVertical::Auto);
+ }
+
+ let token = parser.next()?.clone();
+
+ // Apart from "auto" (handled above),
+ // https://www.w3.org/TR/css-writing-modes-3/#propdef-glyph-orientation-vertical
+ // only allows the values "0", "90", "0deg", "90deg". So, we will look at
+ // individual tokens. We'll reject non-integer numbers or non-integer dimensions.
+ match token {
+ Token::Number {
+ int_value: Some(0), ..
+ } => Ok(GlyphOrientationVertical::Angle0),
+
+ Token::Number {
+ int_value: Some(90),
+ ..
+ } => Ok(GlyphOrientationVertical::Angle90),
+
+ Token::Dimension {
+ int_value: Some(0),
+ unit,
+ ..
+ } if unit.eq_ignore_ascii_case("deg") => Ok(GlyphOrientationVertical::Angle0),
+
+ Token::Dimension {
+ int_value: Some(90),
+ unit,
+ ..
+ } if unit.eq_ignore_ascii_case("deg") => Ok(GlyphOrientationVertical::Angle90),
+ _ => Err(loc.new_unexpected_token_error(token.clone())),
+ }
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ use crate::properties::{ParsedProperty, SpecifiedValue, SpecifiedValues};
+
+ #[test]
+ fn parses_font_shorthand() {
+ assert_eq!(
+ Font::parse_str("small-caption").unwrap(),
+ Font::SmallCaption,
+ );
+
+ assert_eq!(
+ Font::parse_str("italic bold 12px sans").unwrap(),
+ Font::Spec(FontSpec {
+ style: FontStyle::Italic,
+ variant: Default::default(),
+ weight: FontWeight::Bold,
+ stretch: Default::default(),
+ size: FontSize::Value(Length::new(12.0, LengthUnit::Px)),
+ line_height: Default::default(),
+ family: FontFamily("sans".to_string()),
+ }),
+ );
+
+ assert_eq!(
+ Font::parse_str("bold 14cm/2 serif").unwrap(),
+ Font::Spec(FontSpec {
+ style: Default::default(),
+ variant: Default::default(),
+ weight: FontWeight::Bold,
+ stretch: Default::default(),
+ size: FontSize::Value(Length::new(14.0, LengthUnit::Cm)),
+ line_height: LineHeight::Number(2.0),
+ family: FontFamily("serif".to_string()),
+ }),
+ );
+ }
+
+ #[test]
+ fn detects_invalid_invalid_font_size() {
+ assert!(FontSize::parse_str("furlong").is_err());
+ }
+
+ #[test]
+ fn computes_parent_relative_font_size() {
+ let mut specified = SpecifiedValues::default();
+ specified.set_parsed_property(&ParsedProperty::FontSize(SpecifiedValue::Specified(
+ FontSize::parse_str("10px").unwrap(),
+ )));
+
+ let mut values = ComputedValues::default();
+ specified.to_computed_values(&mut values);
+
+ assert_eq!(
+ FontSize::parse_str("150%").unwrap().compute(&values),
+ FontSize::parse_str("15px").unwrap()
+ );
+
+ assert_eq!(
+ FontSize::parse_str("1.5em").unwrap().compute(&values),
+ FontSize::parse_str("15px").unwrap()
+ );
+
+ assert_eq!(
+ FontSize::parse_str("1ex").unwrap().compute(&values),
+ FontSize::parse_str("5px").unwrap()
+ );
+
+ let smaller = FontSize::parse_str("smaller").unwrap().compute(&values);
+ if let FontSize::Value(v) = smaller {
+ assert!(v.length < 10.0);
+ assert_eq!(v.unit, LengthUnit::Px);
+ } else {
+ unreachable!();
+ }
+
+ let larger = FontSize::parse_str("larger").unwrap().compute(&values);
+ if let FontSize::Value(v) = larger {
+ assert!(v.length > 10.0);
+ assert_eq!(v.unit, LengthUnit::Px);
+ } else {
+ unreachable!();
+ }
+ }
+
+ #[test]
+ fn parses_font_weight() {
+ assert_eq!(
+ <FontWeight as Parse>::parse_str("normal").unwrap(),
+ FontWeight::Normal
+ );
+ assert_eq!(
+ <FontWeight as Parse>::parse_str("bold").unwrap(),
+ FontWeight::Bold
+ );
+ assert_eq!(
+ <FontWeight as Parse>::parse_str("100").unwrap(),
+ FontWeight::Weight(100)
+ );
+ }
+
+ #[test]
+ fn detects_invalid_font_weight() {
+ assert!(<FontWeight as Parse>::parse_str("").is_err());
+ assert!(<FontWeight as Parse>::parse_str("strange").is_err());
+ assert!(<FontWeight as Parse>::parse_str("0").is_err());
+ assert!(<FontWeight as Parse>::parse_str("-1").is_err());
+ assert!(<FontWeight as Parse>::parse_str("1001").is_err());
+ assert!(<FontWeight as Parse>::parse_str("3.14").is_err());
+ }
+
+ #[test]
+ fn parses_letter_spacing() {
+ assert_eq!(
+ <LetterSpacing as Parse>::parse_str("normal").unwrap(),
+ LetterSpacing::Normal
+ );
+ assert_eq!(
+ <LetterSpacing as Parse>::parse_str("10em").unwrap(),
+ LetterSpacing::Value(Length::<Horizontal>::new(10.0, LengthUnit::Em,))
+ );
+ }
+
+ #[test]
+ fn computes_letter_spacing() {
+ assert_eq!(
+ <LetterSpacing as Parse>::parse_str("normal")
+ .map(|s| s.compute())
+ .unwrap(),
+ LetterSpacing::Value(Length::<Horizontal>::new(0.0, LengthUnit::Px,))
+ );
+ assert_eq!(
+ <LetterSpacing as Parse>::parse_str("10em")
+ .map(|s| s.compute())
+ .unwrap(),
+ LetterSpacing::Value(Length::<Horizontal>::new(10.0, LengthUnit::Em,))
+ );
+ }
+
+ #[test]
+ fn detects_invalid_invalid_letter_spacing() {
+ assert!(LetterSpacing::parse_str("furlong").is_err());
+ }
+
+ #[test]
+ fn parses_font_family() {
+ assert_eq!(
+ <FontFamily as Parse>::parse_str("'Hello world'").unwrap(),
+ FontFamily("Hello world".to_owned())
+ );
+
+ assert_eq!(
+ <FontFamily as Parse>::parse_str("\"Hello world\"").unwrap(),
+ FontFamily("Hello world".to_owned())
+ );
+
+ assert_eq!(
+ <FontFamily as Parse>::parse_str("\"Hello world with spaces\"").unwrap(),
+ FontFamily("Hello world with spaces".to_owned())
+ );
+
+ assert_eq!(
+ <FontFamily as Parse>::parse_str(" Hello world ").unwrap(),
+ FontFamily("Hello world".to_owned())
+ );
+
+ assert_eq!(
+ <FontFamily as Parse>::parse_str("Plonk").unwrap(),
+ FontFamily("Plonk".to_owned())
+ );
+ }
+
+ #[test]
+ fn parses_multiple_font_family() {
+ assert_eq!(
+ <FontFamily as Parse>::parse_str("serif,monospace,\"Hello world\", with spaces ")
+ .unwrap(),
+ FontFamily("serif,monospace,Hello world,with spaces".to_owned())
+ );
+ }
+
+ #[test]
+ fn detects_invalid_font_family() {
+ assert!(<FontFamily as Parse>::parse_str("").is_err());
+ assert!(<FontFamily as Parse>::parse_str("''").is_err());
+ assert!(<FontFamily as Parse>::parse_str("42").is_err());
+ }
+
+ #[test]
+ fn parses_line_height() {
+ assert_eq!(
+ <LineHeight as Parse>::parse_str("normal").unwrap(),
+ LineHeight::Normal
+ );
+
+ assert_eq!(
+ <LineHeight as Parse>::parse_str("2").unwrap(),
+ LineHeight::Number(2.0)
+ );
+
+ assert_eq!(
+ <LineHeight as Parse>::parse_str("2cm").unwrap(),
+ LineHeight::Length(Length::new(2.0, LengthUnit::Cm))
+ );
+
+ assert_eq!(
+ <LineHeight as Parse>::parse_str("150%").unwrap(),
+ LineHeight::Percentage(1.5)
+ );
+ }
+
+ #[test]
+ fn detects_invalid_line_height() {
+ assert!(<LineHeight as Parse>::parse_str("").is_err());
+ assert!(<LineHeight as Parse>::parse_str("florp").is_err());
+ assert!(<LineHeight as Parse>::parse_str("3florp").is_err());
+ }
+
+ #[test]
+ fn computes_line_height() {
+ let mut specified = SpecifiedValues::default();
+ specified.set_parsed_property(&ParsedProperty::FontSize(SpecifiedValue::Specified(
+ FontSize::parse_str("10px").unwrap(),
+ )));
+
+ let mut values = ComputedValues::default();
+ specified.to_computed_values(&mut values);
+
+ assert_eq!(
+ LineHeight::Normal.compute(&values),
+ LineHeight::Length(Length::new(10.0, LengthUnit::Px)),
+ );
+
+ assert_eq!(
+ LineHeight::Number(2.0).compute(&values),
+ LineHeight::Length(Length::new(20.0, LengthUnit::Px)),
+ );
+
+ assert_eq!(
+ LineHeight::Length(Length::new(3.0, LengthUnit::Cm)).compute(&values),
+ LineHeight::Length(Length::new(3.0, LengthUnit::Cm)),
+ );
+
+ assert_eq!(
+ LineHeight::parse_str("150%").unwrap().compute(&values),
+ LineHeight::Length(Length::new(15.0, LengthUnit::Px)),
+ );
+ }
+
+ #[test]
+ fn parses_glyph_orientation_vertical() {
+ assert_eq!(
+ <GlyphOrientationVertical as Parse>::parse_str("auto").unwrap(),
+ GlyphOrientationVertical::Auto
+ );
+ assert_eq!(
+ <GlyphOrientationVertical as Parse>::parse_str("0").unwrap(),
+ GlyphOrientationVertical::Angle0
+ );
+ assert_eq!(
+ <GlyphOrientationVertical as Parse>::parse_str("0deg").unwrap(),
+ GlyphOrientationVertical::Angle0
+ );
+ assert_eq!(
+ <GlyphOrientationVertical as Parse>::parse_str("90").unwrap(),
+ GlyphOrientationVertical::Angle90
+ );
+ assert_eq!(
+ <GlyphOrientationVertical as Parse>::parse_str("90deg").unwrap(),
+ GlyphOrientationVertical::Angle90
+ );
+ }
+
+ #[test]
+ fn detects_invalid_glyph_orientation_vertical() {
+ assert!(<GlyphOrientationVertical as Parse>::parse_str("").is_err());
+ assert!(<GlyphOrientationVertical as Parse>::parse_str("0.0").is_err());
+ assert!(<GlyphOrientationVertical as Parse>::parse_str("90.0").is_err());
+ assert!(<GlyphOrientationVertical as Parse>::parse_str("0.0deg").is_err());
+ assert!(<GlyphOrientationVertical as Parse>::parse_str("90.0deg").is_err());
+ assert!(<GlyphOrientationVertical as Parse>::parse_str("0rad").is_err());
+ assert!(<GlyphOrientationVertical as Parse>::parse_str("0.0rad").is_err());
+ }
+}
diff --git a/rsvg/src/gradient.rs b/rsvg/src/gradient.rs
new file mode 100644
index 00000000..311343cb
--- /dev/null
+++ b/rsvg/src/gradient.rs
@@ -0,0 +1,748 @@
+//! Gradient paint servers; the `linearGradient` and `radialGradient` elements.
+
+use cssparser::Parser;
+use markup5ever::{
+ expanded_name, local_name, namespace_url, ns, ExpandedName, LocalName, Namespace,
+};
+
+use crate::coord_units::CoordUnits;
+use crate::document::{AcquiredNodes, NodeId, NodeStack};
+use crate::drawing_ctx::Viewport;
+use crate::element::{set_attribute, ElementData, ElementTrait};
+use crate::error::*;
+use crate::href::{is_href, set_href};
+use crate::length::*;
+use crate::node::{CascadedValues, Node, NodeBorrow};
+use crate::paint_server::resolve_color;
+use crate::parsers::{Parse, ParseValue};
+use crate::rect::{rect_to_transform, Rect};
+use crate::session::Session;
+use crate::transform::{Transform, TransformAttribute};
+use crate::unit_interval::UnitInterval;
+use crate::xml::Attributes;
+
+/// Contents of a <stop> element for gradient color stops
+#[derive(Copy, Clone)]
+pub struct ColorStop {
+ /// <stop offset="..."/>
+ pub offset: UnitInterval,
+
+ /// <stop stop-color="..." stop-opacity="..."/>
+ pub rgba: cssparser::RGBA,
+}
+
+// gradientUnits attribute; its default is objectBoundingBox
+coord_units!(GradientUnits, CoordUnits::ObjectBoundingBox);
+
+/// spreadMethod attribute for gradients
+#[derive(Debug, Copy, Clone, PartialEq)]
+pub enum SpreadMethod {
+ Pad,
+ Reflect,
+ Repeat,
+}
+
+enum_default!(SpreadMethod, SpreadMethod::Pad);
+
+impl Parse for SpreadMethod {
+ fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<SpreadMethod, ParseError<'i>> {
+ Ok(parse_identifiers!(
+ parser,
+ "pad" => SpreadMethod::Pad,
+ "reflect" => SpreadMethod::Reflect,
+ "repeat" => SpreadMethod::Repeat,
+ )?)
+ }
+}
+
+/// Node for the <stop> element
+#[derive(Default)]
+pub struct Stop {
+ /// <stop offset="..."/>
+ offset: UnitInterval,
+ /* stop-color and stop-opacity are not attributes; they are properties, so
+ * they go into property_defs.rs */
+}
+
+impl ElementTrait for Stop {
+ fn set_attributes(&mut self, attrs: &Attributes, session: &Session) {
+ for (attr, value) in attrs.iter() {
+ if attr.expanded() == expanded_name!("", "offset") {
+ set_attribute(&mut self.offset, attr.parse(value), session);
+ }
+ }
+ }
+}
+
+/// Parameters specific to each gradient type, before being resolved.
+/// These will be composed together with UnreseolvedVariant from fallback
+/// nodes (referenced with e.g. <linearGradient xlink:href="#fallback">) to form
+/// a final, resolved Variant.
+#[derive(Copy, Clone)]
+enum UnresolvedVariant {
+ Linear {
+ x1: Option<Length<Horizontal>>,
+ y1: Option<Length<Vertical>>,
+ x2: Option<Length<Horizontal>>,
+ y2: Option<Length<Vertical>>,
+ },
+
+ Radial {
+ cx: Option<Length<Horizontal>>,
+ cy: Option<Length<Vertical>>,
+ r: Option<Length<Both>>,
+ fx: Option<Length<Horizontal>>,
+ fy: Option<Length<Vertical>>,
+ fr: Option<Length<Both>>,
+ },
+}
+
+/// Parameters specific to each gradient type, after resolving.
+#[derive(Clone)]
+enum ResolvedGradientVariant {
+ Linear {
+ x1: Length<Horizontal>,
+ y1: Length<Vertical>,
+ x2: Length<Horizontal>,
+ y2: Length<Vertical>,
+ },
+
+ Radial {
+ cx: Length<Horizontal>,
+ cy: Length<Vertical>,
+ r: Length<Both>,
+ fx: Length<Horizontal>,
+ fy: Length<Vertical>,
+ fr: Length<Both>,
+ },
+}
+
+/// Parameters specific to each gradient type, after normalizing to user-space units.
+pub enum GradientVariant {
+ Linear {
+ x1: f64,
+ y1: f64,
+ x2: f64,
+ y2: f64,
+ },
+
+ Radial {
+ cx: f64,
+ cy: f64,
+ r: f64,
+ fx: f64,
+ fy: f64,
+ fr: f64,
+ },
+}
+
+impl UnresolvedVariant {
+ fn into_resolved(self) -> ResolvedGradientVariant {
+ assert!(self.is_resolved());
+
+ match self {
+ UnresolvedVariant::Linear { x1, y1, x2, y2 } => ResolvedGradientVariant::Linear {
+ x1: x1.unwrap(),
+ y1: y1.unwrap(),
+ x2: x2.unwrap(),
+ y2: y2.unwrap(),
+ },
+
+ UnresolvedVariant::Radial {
+ cx,
+ cy,
+ r,
+ fx,
+ fy,
+ fr,
+ } => ResolvedGradientVariant::Radial {
+ cx: cx.unwrap(),
+ cy: cy.unwrap(),
+ r: r.unwrap(),
+ fx: fx.unwrap(),
+ fy: fy.unwrap(),
+ fr: fr.unwrap(),
+ },
+ }
+ }
+
+ fn is_resolved(&self) -> bool {
+ match *self {
+ UnresolvedVariant::Linear { x1, y1, x2, y2 } => {
+ x1.is_some() && y1.is_some() && x2.is_some() && y2.is_some()
+ }
+
+ UnresolvedVariant::Radial {
+ cx,
+ cy,
+ r,
+ fx,
+ fy,
+ fr,
+ } => {
+ cx.is_some()
+ && cy.is_some()
+ && r.is_some()
+ && fx.is_some()
+ && fy.is_some()
+ && fr.is_some()
+ }
+ }
+ }
+
+ fn resolve_from_fallback(&self, fallback: &UnresolvedVariant) -> UnresolvedVariant {
+ match (*self, *fallback) {
+ (
+ UnresolvedVariant::Linear { x1, y1, x2, y2 },
+ UnresolvedVariant::Linear {
+ x1: fx1,
+ y1: fy1,
+ x2: fx2,
+ y2: fy2,
+ },
+ ) => UnresolvedVariant::Linear {
+ x1: x1.or(fx1),
+ y1: y1.or(fy1),
+ x2: x2.or(fx2),
+ y2: y2.or(fy2),
+ },
+
+ (
+ UnresolvedVariant::Radial {
+ cx,
+ cy,
+ r,
+ fx,
+ fy,
+ fr,
+ },
+ UnresolvedVariant::Radial {
+ cx: f_cx,
+ cy: f_cy,
+ r: f_r,
+ fx: f_fx,
+ fy: f_fy,
+ fr: f_fr,
+ },
+ ) => UnresolvedVariant::Radial {
+ cx: cx.or(f_cx),
+ cy: cy.or(f_cy),
+ r: r.or(f_r),
+ fx: fx.or(f_fx),
+ fy: fy.or(f_fy),
+ fr: fr.or(f_fr),
+ },
+
+ _ => *self, // If variants are of different types, then nothing to resolve
+ }
+ }
+
+ // https://www.w3.org/TR/SVG/pservers.html#LinearGradients
+ // https://www.w3.org/TR/SVG/pservers.html#RadialGradients
+ fn resolve_from_defaults(&self) -> UnresolvedVariant {
+ match self {
+ UnresolvedVariant::Linear { x1, y1, x2, y2 } => UnresolvedVariant::Linear {
+ x1: x1.or_else(|| Some(Length::<Horizontal>::parse_str("0%").unwrap())),
+ y1: y1.or_else(|| Some(Length::<Vertical>::parse_str("0%").unwrap())),
+ x2: x2.or_else(|| Some(Length::<Horizontal>::parse_str("100%").unwrap())),
+ y2: y2.or_else(|| Some(Length::<Vertical>::parse_str("0%").unwrap())),
+ },
+
+ UnresolvedVariant::Radial {
+ cx,
+ cy,
+ r,
+ fx,
+ fy,
+ fr,
+ } => {
+ let cx = cx.or_else(|| Some(Length::<Horizontal>::parse_str("50%").unwrap()));
+ let cy = cy.or_else(|| Some(Length::<Vertical>::parse_str("50%").unwrap()));
+ let r = r.or_else(|| Some(Length::<Both>::parse_str("50%").unwrap()));
+
+ // fx and fy fall back to the presentational value of cx and cy
+ let fx = fx.or(cx);
+ let fy = fy.or(cy);
+ let fr = fr.or_else(|| Some(Length::<Both>::parse_str("0%").unwrap()));
+
+ UnresolvedVariant::Radial {
+ cx,
+ cy,
+ r,
+ fx,
+ fy,
+ fr,
+ }
+ }
+ }
+ }
+}
+
+/// Fields shared by all gradient nodes
+#[derive(Default)]
+struct Common {
+ units: Option<GradientUnits>,
+ transform: Option<TransformAttribute>,
+ spread: Option<SpreadMethod>,
+
+ fallback: Option<NodeId>,
+}
+
+/// Node for the <linearGradient> element
+#[derive(Default)]
+pub struct LinearGradient {
+ common: Common,
+
+ x1: Option<Length<Horizontal>>,
+ y1: Option<Length<Vertical>>,
+ x2: Option<Length<Horizontal>>,
+ y2: Option<Length<Vertical>>,
+}
+
+/// Node for the <radialGradient> element
+#[derive(Default)]
+pub struct RadialGradient {
+ common: Common,
+
+ cx: Option<Length<Horizontal>>,
+ cy: Option<Length<Vertical>>,
+ r: Option<Length<Both>>,
+ fx: Option<Length<Horizontal>>,
+ fy: Option<Length<Vertical>>,
+ fr: Option<Length<Both>>,
+}
+
+/// Main structure used during gradient resolution. For unresolved
+/// gradients, we store all fields as Option<T> - if None, it means
+/// that the field is not specified; if Some(T), it means that the
+/// field was specified.
+struct UnresolvedGradient {
+ units: Option<GradientUnits>,
+ transform: Option<TransformAttribute>,
+ spread: Option<SpreadMethod>,
+ stops: Option<Vec<ColorStop>>,
+
+ variant: UnresolvedVariant,
+}
+
+/// Resolved gradient; this is memoizable after the initial resolution.
+#[derive(Clone)]
+pub struct ResolvedGradient {
+ units: GradientUnits,
+ transform: TransformAttribute,
+ spread: SpreadMethod,
+ stops: Vec<ColorStop>,
+
+ variant: ResolvedGradientVariant,
+}
+
+/// Gradient normalized to user-space units.
+pub struct UserSpaceGradient {
+ pub transform: Transform,
+ pub spread: SpreadMethod,
+ pub stops: Vec<ColorStop>,
+
+ pub variant: GradientVariant,
+}
+
+impl UnresolvedGradient {
+ fn into_resolved(self) -> ResolvedGradient {
+ assert!(self.is_resolved());
+
+ let UnresolvedGradient {
+ units,
+ transform,
+ spread,
+ stops,
+ variant,
+ } = self;
+
+ match variant {
+ UnresolvedVariant::Linear { .. } => ResolvedGradient {
+ units: units.unwrap(),
+ transform: transform.unwrap(),
+ spread: spread.unwrap(),
+ stops: stops.unwrap(),
+
+ variant: variant.into_resolved(),
+ },
+
+ UnresolvedVariant::Radial { .. } => ResolvedGradient {
+ units: units.unwrap(),
+ transform: transform.unwrap(),
+ spread: spread.unwrap(),
+ stops: stops.unwrap(),
+
+ variant: variant.into_resolved(),
+ },
+ }
+ }
+
+ /// Helper for add_color_stops_from_node()
+ fn add_color_stop(&mut self, offset: UnitInterval, rgba: cssparser::RGBA) {
+ if self.stops.is_none() {
+ self.stops = Some(Vec::<ColorStop>::new());
+ }
+
+ if let Some(ref mut stops) = self.stops {
+ let last_offset = if !stops.is_empty() {
+ stops[stops.len() - 1].offset
+ } else {
+ UnitInterval(0.0)
+ };
+
+ let offset = if offset > last_offset {
+ offset
+ } else {
+ last_offset
+ };
+
+ stops.push(ColorStop { offset, rgba });
+ } else {
+ unreachable!();
+ }
+ }
+
+ /// Looks for <stop> children inside a linearGradient or radialGradient node,
+ /// and adds their info to the UnresolvedGradient &self.
+ fn add_color_stops_from_node(&mut self, node: &Node, opacity: UnitInterval) {
+ assert!(matches!(
+ *node.borrow_element_data(),
+ ElementData::LinearGradient(_) | ElementData::RadialGradient(_)
+ ));
+
+ for child in node.children().filter(|c| c.is_element()) {
+ if let ElementData::Stop(ref stop) = &*child.borrow_element_data() {
+ let cascaded = CascadedValues::new_from_node(&child);
+ let values = cascaded.get();
+
+ let UnitInterval(stop_opacity) = values.stop_opacity().0;
+ let UnitInterval(o) = opacity;
+
+ let composed_opacity = UnitInterval(stop_opacity * o);
+
+ let rgba =
+ resolve_color(&values.stop_color().0, composed_opacity, values.color().0);
+
+ self.add_color_stop(stop.offset, rgba);
+ }
+ }
+ }
+
+ fn is_resolved(&self) -> bool {
+ self.units.is_some()
+ && self.transform.is_some()
+ && self.spread.is_some()
+ && self.stops.is_some()
+ && self.variant.is_resolved()
+ }
+
+ fn resolve_from_fallback(&self, fallback: &UnresolvedGradient) -> UnresolvedGradient {
+ let units = self.units.or(fallback.units);
+ let transform = self.transform.or(fallback.transform);
+ let spread = self.spread.or(fallback.spread);
+ let stops = self.stops.clone().or_else(|| fallback.stops.clone());
+ let variant = self.variant.resolve_from_fallback(&fallback.variant);
+
+ UnresolvedGradient {
+ units,
+ transform,
+ spread,
+ stops,
+ variant,
+ }
+ }
+
+ fn resolve_from_defaults(&self) -> UnresolvedGradient {
+ let units = self.units.or_else(|| Some(GradientUnits::default()));
+ let transform = self
+ .transform
+ .or_else(|| Some(TransformAttribute::default()));
+ let spread = self.spread.or_else(|| Some(SpreadMethod::default()));
+ let stops = self.stops.clone().or_else(|| Some(Vec::<ColorStop>::new()));
+ let variant = self.variant.resolve_from_defaults();
+
+ UnresolvedGradient {
+ units,
+ transform,
+ spread,
+ stops,
+ variant,
+ }
+ }
+}
+
+/// State used during the gradient resolution process
+///
+/// This is the current node's gradient information, plus the fallback
+/// that should be used in case that information is not complete for a
+/// resolved gradient yet.
+struct Unresolved {
+ gradient: UnresolvedGradient,
+ fallback: Option<NodeId>,
+}
+
+impl LinearGradient {
+ fn get_unresolved_variant(&self) -> UnresolvedVariant {
+ UnresolvedVariant::Linear {
+ x1: self.x1,
+ y1: self.y1,
+ x2: self.x2,
+ y2: self.y2,
+ }
+ }
+}
+
+impl RadialGradient {
+ fn get_unresolved_variant(&self) -> UnresolvedVariant {
+ UnresolvedVariant::Radial {
+ cx: self.cx,
+ cy: self.cy,
+ r: self.r,
+ fx: self.fx,
+ fy: self.fy,
+ fr: self.fr,
+ }
+ }
+}
+
+impl Common {
+ fn set_attributes(&mut self, attrs: &Attributes, session: &Session) {
+ for (attr, value) in attrs.iter() {
+ match attr.expanded() {
+ expanded_name!("", "gradientUnits") => {
+ set_attribute(&mut self.units, attr.parse(value), session)
+ }
+ expanded_name!("", "gradientTransform") => {
+ set_attribute(&mut self.transform, attr.parse(value), session);
+ }
+ expanded_name!("", "spreadMethod") => {
+ set_attribute(&mut self.spread, attr.parse(value), session)
+ }
+ ref a if is_href(a) => {
+ let mut href = None;
+ set_attribute(
+ &mut href,
+ NodeId::parse(value).map(Some).attribute(attr.clone()),
+ session,
+ );
+ set_href(a, &mut self.fallback, href);
+ }
+ _ => (),
+ }
+ }
+ }
+}
+
+impl ElementTrait for LinearGradient {
+ fn set_attributes(&mut self, attrs: &Attributes, session: &Session) {
+ self.common.set_attributes(attrs, session);
+
+ for (attr, value) in attrs.iter() {
+ match attr.expanded() {
+ expanded_name!("", "x1") => set_attribute(&mut self.x1, attr.parse(value), session),
+ expanded_name!("", "y1") => set_attribute(&mut self.y1, attr.parse(value), session),
+ expanded_name!("", "x2") => set_attribute(&mut self.x2, attr.parse(value), session),
+ expanded_name!("", "y2") => set_attribute(&mut self.y2, attr.parse(value), session),
+
+ _ => (),
+ }
+ }
+ }
+}
+
+macro_rules! impl_gradient {
+ ($gradient_type:ident, $other_type:ident) => {
+ impl $gradient_type {
+ fn get_unresolved(&self, node: &Node, opacity: UnitInterval) -> Unresolved {
+ let mut gradient = UnresolvedGradient {
+ units: self.common.units,
+ transform: self.common.transform,
+ spread: self.common.spread,
+ stops: None,
+ variant: self.get_unresolved_variant(),
+ };
+
+ gradient.add_color_stops_from_node(node, opacity);
+
+ Unresolved {
+ gradient,
+ fallback: self.common.fallback.clone(),
+ }
+ }
+
+ pub fn resolve(
+ &self,
+ node: &Node,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ opacity: UnitInterval,
+ ) -> Result<ResolvedGradient, AcquireError> {
+ let Unresolved {
+ mut gradient,
+ mut fallback,
+ } = self.get_unresolved(node, opacity);
+
+ let mut stack = NodeStack::new();
+
+ while !gradient.is_resolved() {
+ if let Some(node_id) = fallback {
+ let acquired = acquired_nodes.acquire(&node_id)?;
+ let acquired_node = acquired.get();
+
+ if stack.contains(acquired_node) {
+ return Err(AcquireError::CircularReference(acquired_node.clone()));
+ }
+
+ let unresolved = match *acquired_node.borrow_element_data() {
+ ElementData::$gradient_type(ref g) => {
+ g.get_unresolved(&acquired_node, opacity)
+ }
+ ElementData::$other_type(ref g) => {
+ g.get_unresolved(&acquired_node, opacity)
+ }
+ _ => return Err(AcquireError::InvalidLinkType(node_id.clone())),
+ };
+
+ gradient = gradient.resolve_from_fallback(&unresolved.gradient);
+ fallback = unresolved.fallback;
+
+ stack.push(acquired_node);
+ } else {
+ gradient = gradient.resolve_from_defaults();
+ break;
+ }
+ }
+
+ Ok(gradient.into_resolved())
+ }
+ }
+ };
+}
+
+impl_gradient!(LinearGradient, RadialGradient);
+impl_gradient!(RadialGradient, LinearGradient);
+
+impl ElementTrait for RadialGradient {
+ fn set_attributes(&mut self, attrs: &Attributes, session: &Session) {
+ self.common.set_attributes(attrs, session);
+
+ // Create a local expanded name for "fr" because markup5ever doesn't have built-in
+ let expanded_name_fr = ExpandedName {
+ ns: &Namespace::from(""),
+ local: &LocalName::from("fr"),
+ };
+
+ for (attr, value) in attrs.iter() {
+ let attr_expanded = attr.expanded();
+ match attr_expanded {
+ expanded_name!("", "cx") => set_attribute(&mut self.cx, attr.parse(value), session),
+ expanded_name!("", "cy") => set_attribute(&mut self.cy, attr.parse(value), session),
+ expanded_name!("", "r") => set_attribute(&mut self.r, attr.parse(value), session),
+ expanded_name!("", "fx") => set_attribute(&mut self.fx, attr.parse(value), session),
+ expanded_name!("", "fy") => set_attribute(&mut self.fy, attr.parse(value), session),
+ a if a == expanded_name_fr => {
+ set_attribute(&mut self.fr, attr.parse(value), session)
+ }
+
+ _ => (),
+ }
+ }
+ }
+}
+
+impl ResolvedGradient {
+ pub fn to_user_space(
+ &self,
+ object_bbox: &Option<Rect>,
+ viewport: &Viewport,
+ values: &NormalizeValues,
+ ) -> Option<UserSpaceGradient> {
+ let units = self.units.0;
+ let transform = rect_to_transform(object_bbox, units).ok()?;
+ let view_params = viewport.with_units(units);
+ let params = NormalizeParams::from_values(values, &view_params);
+
+ let gradient_transform = self.transform.to_transform();
+ let transform = transform.pre_transform(&gradient_transform).invert()?;
+
+ let variant = match self.variant {
+ ResolvedGradientVariant::Linear { x1, y1, x2, y2 } => GradientVariant::Linear {
+ x1: x1.to_user(&params),
+ y1: y1.to_user(&params),
+ x2: x2.to_user(&params),
+ y2: y2.to_user(&params),
+ },
+
+ ResolvedGradientVariant::Radial {
+ cx,
+ cy,
+ r,
+ fx,
+ fy,
+ fr,
+ } => GradientVariant::Radial {
+ cx: cx.to_user(&params),
+ cy: cy.to_user(&params),
+ r: r.to_user(&params),
+ fx: fx.to_user(&params),
+ fy: fy.to_user(&params),
+ fr: fr.to_user(&params),
+ },
+ };
+
+ Some(UserSpaceGradient {
+ transform,
+ spread: self.spread,
+ stops: self.stops.clone(),
+ variant,
+ })
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+ use crate::node::{Node, NodeData};
+ use markup5ever::{namespace_url, ns, QualName};
+
+ #[test]
+ fn parses_spread_method() {
+ assert_eq!(SpreadMethod::parse_str("pad").unwrap(), SpreadMethod::Pad);
+ assert_eq!(
+ SpreadMethod::parse_str("reflect").unwrap(),
+ SpreadMethod::Reflect
+ );
+ assert_eq!(
+ SpreadMethod::parse_str("repeat").unwrap(),
+ SpreadMethod::Repeat
+ );
+ assert!(SpreadMethod::parse_str("foobar").is_err());
+ }
+
+ #[test]
+ fn gradient_resolved_from_defaults_is_really_resolved() {
+ let session = Session::default();
+
+ let node = Node::new(NodeData::new_element(
+ &session,
+ &QualName::new(None, ns!(svg), local_name!("linearGradient")),
+ Attributes::new(),
+ ));
+
+ let unresolved = borrow_element_as!(node, LinearGradient)
+ .get_unresolved(&node, UnitInterval::clamp(1.0));
+ let gradient = unresolved.gradient.resolve_from_defaults();
+ assert!(gradient.is_resolved());
+
+ let node = Node::new(NodeData::new_element(
+ &session,
+ &QualName::new(None, ns!(svg), local_name!("radialGradient")),
+ Attributes::new(),
+ ));
+
+ let unresolved = borrow_element_as!(node, RadialGradient)
+ .get_unresolved(&node, UnitInterval::clamp(1.0));
+ let gradient = unresolved.gradient.resolve_from_defaults();
+ assert!(gradient.is_resolved());
+ }
+}
diff --git a/rsvg/src/handle.rs b/rsvg/src/handle.rs
new file mode 100644
index 00000000..86428008
--- /dev/null
+++ b/rsvg/src/handle.rs
@@ -0,0 +1,388 @@
+//! Toplevel handle for a loaded SVG document.
+//!
+//! This module provides the primitives on which the public APIs are implemented.
+
+use std::sync::Arc;
+
+use crate::accept_language::UserLanguage;
+use crate::bbox::BoundingBox;
+use crate::css::{Origin, Stylesheet};
+use crate::document::{AcquiredNodes, Document, NodeId};
+use crate::dpi::Dpi;
+use crate::drawing_ctx::{draw_tree, with_saved_cr, DrawingMode, Viewport};
+use crate::error::{DefsLookupErrorKind, LoadingError, RenderingError};
+use crate::length::*;
+use crate::node::{CascadedValues, Node, NodeBorrow};
+use crate::rect::Rect;
+use crate::session::Session;
+use crate::structure::IntrinsicDimensions;
+use crate::url_resolver::{AllowedUrl, UrlResolver};
+
+/// Loading options for SVG documents.
+pub struct LoadOptions {
+ /// Load url resolver; all references will be resolved with respect to this.
+ pub url_resolver: UrlResolver,
+
+ /// Whether to turn off size limits in libxml2.
+ pub unlimited_size: bool,
+
+ /// Whether to keep original (undecoded) image data to embed in Cairo PDF surfaces.
+ pub keep_image_data: bool,
+}
+
+impl LoadOptions {
+ /// Creates a `LoadOptions` with defaults, and sets the `url resolver`.
+ pub fn new(url_resolver: UrlResolver) -> Self {
+ LoadOptions {
+ url_resolver,
+ unlimited_size: false,
+ keep_image_data: false,
+ }
+ }
+
+ /// Sets whether libxml2's limits on memory usage should be turned off.
+ ///
+ /// This should only be done for trusted data.
+ pub fn with_unlimited_size(mut self, unlimited: bool) -> Self {
+ self.unlimited_size = unlimited;
+ self
+ }
+
+ /// Sets whether to keep the original compressed image data from referenced JPEG/PNG images.
+ ///
+ /// This is only useful for rendering to Cairo PDF
+ /// surfaces, which can embed the original, compressed image data instead of uncompressed
+ /// RGB buffers.
+ pub fn keep_image_data(mut self, keep: bool) -> Self {
+ self.keep_image_data = keep;
+ self
+ }
+
+ /// Creates a new `LoadOptions` with a different `url resolver`.
+ ///
+ /// This is used when loading a referenced file that may in turn cause other files
+ /// to be loaded, for example `<image xlink:href="subimage.svg"/>`
+ pub fn copy_with_base_url(&self, base_url: &AllowedUrl) -> Self {
+ let mut url_resolver = self.url_resolver.clone();
+ url_resolver.base_url = Some((**base_url).clone());
+
+ LoadOptions {
+ url_resolver,
+ unlimited_size: self.unlimited_size,
+ keep_image_data: self.keep_image_data,
+ }
+ }
+}
+
+/// Main handle to an SVG document.
+///
+/// This is the main object in librsvg. It gets created with the [`from_stream`] method
+/// and then provides access to all the primitives needed to implement the public APIs.
+///
+/// [`from_stream`]: #method.from_stream
+pub struct Handle {
+ session: Session,
+ document: Document,
+}
+
+impl Handle {
+ /// Loads an SVG document into a `Handle`.
+ pub fn from_stream(
+ session: Session,
+ load_options: Arc<LoadOptions>,
+ stream: &gio::InputStream,
+ cancellable: Option<&gio::Cancellable>,
+ ) -> Result<Handle, LoadingError> {
+ Ok(Handle {
+ session: session.clone(),
+ document: Document::load_from_stream(session, load_options, stream, cancellable)?,
+ })
+ }
+
+ /// Queries whether a document has a certain element `#foo`.
+ ///
+ /// The `id` must be an URL fragment identifier, i.e. something
+ /// like `#element_id`.
+ pub fn has_sub(&self, id: &str) -> Result<bool, RenderingError> {
+ match self.lookup_node(id) {
+ Ok(_) => Ok(true),
+
+ Err(DefsLookupErrorKind::NotFound) => Ok(false),
+
+ Err(e) => Err(e.into()),
+ }
+ }
+
+ /// Normalizes the svg's width/height properties with a 0-sized viewport
+ ///
+ /// This assumes that if one of the properties is in percentage units, then
+ /// its corresponding value will not be used. E.g. if width=100%, the caller
+ /// will ignore the resulting width value.
+ pub fn width_height_to_user(&self, dpi: Dpi) -> (f64, f64) {
+ let dimensions = self.get_intrinsic_dimensions();
+
+ let width = dimensions.width;
+ let height = dimensions.height;
+
+ let view_params = Viewport::new(dpi, 0.0, 0.0);
+ let root = self.document.root();
+ let cascaded = CascadedValues::new_from_node(&root);
+ let values = cascaded.get();
+
+ let params = NormalizeParams::new(values, &view_params);
+
+ (width.to_user(&params), height.to_user(&params))
+ }
+
+ fn get_node_or_root(&self, id: Option<&str>) -> Result<Node, RenderingError> {
+ if let Some(id) = id {
+ Ok(self.lookup_node(id)?)
+ } else {
+ Ok(self.document.root())
+ }
+ }
+
+ fn geometry_for_layer(
+ &self,
+ node: Node,
+ viewport: Rect,
+ user_language: &UserLanguage,
+ dpi: Dpi,
+ is_testing: bool,
+ ) -> Result<(Rect, Rect), RenderingError> {
+ let root = self.document.root();
+
+ let target = cairo::ImageSurface::create(cairo::Format::Rgb24, 1, 1)?;
+ let cr = cairo::Context::new(&target)?;
+
+ let bbox = draw_tree(
+ self.session.clone(),
+ DrawingMode::LimitToStack { node, root },
+ &cr,
+ viewport,
+ user_language,
+ dpi,
+ true,
+ is_testing,
+ &mut AcquiredNodes::new(&self.document),
+ )?;
+
+ let ink_rect = bbox.ink_rect.unwrap_or_default();
+ let logical_rect = bbox.rect.unwrap_or_default();
+
+ Ok((ink_rect, logical_rect))
+ }
+
+ pub fn get_geometry_for_layer(
+ &self,
+ id: Option<&str>,
+ viewport: &cairo::Rectangle,
+ user_language: &UserLanguage,
+ dpi: Dpi,
+ is_testing: bool,
+ ) -> Result<(cairo::Rectangle, cairo::Rectangle), RenderingError> {
+ let viewport = Rect::from(*viewport);
+ let node = self.get_node_or_root(id)?;
+
+ let (ink_rect, logical_rect) =
+ self.geometry_for_layer(node, viewport, user_language, dpi, is_testing)?;
+
+ Ok((
+ cairo::Rectangle::from(ink_rect),
+ cairo::Rectangle::from(logical_rect),
+ ))
+ }
+
+ fn lookup_node(&self, id: &str) -> Result<Node, DefsLookupErrorKind> {
+ let node_id = NodeId::parse(id).map_err(|_| DefsLookupErrorKind::InvalidId)?;
+
+ // The public APIs to get geometries of individual elements, or to render
+ // them, should only allow referencing elements within the main handle's
+ // SVG file; that is, only plain "#foo" fragment IDs are allowed here.
+ // Otherwise, a calling program could request "another-file#foo" and cause
+ // another-file to be loaded, even if it is not part of the set of
+ // resources that the main SVG actually references. In the future we may
+ // relax this requirement to allow lookups within that set, but not to
+ // other random files.
+ match node_id {
+ NodeId::Internal(id) => self
+ .document
+ .lookup_internal_node(&id)
+ .ok_or(DefsLookupErrorKind::NotFound),
+ NodeId::External(_, _) => {
+ rsvg_log!(
+ self.session,
+ "the public API is not allowed to look up external references: {}",
+ node_id
+ );
+
+ Err(DefsLookupErrorKind::CannotLookupExternalReferences)
+ }
+ }
+ }
+
+ pub fn render_document(
+ &self,
+ cr: &cairo::Context,
+ viewport: &cairo::Rectangle,
+ user_language: &UserLanguage,
+ dpi: Dpi,
+ is_testing: bool,
+ ) -> Result<(), RenderingError> {
+ self.render_layer(cr, None, viewport, user_language, dpi, is_testing)
+ }
+
+ pub fn render_layer(
+ &self,
+ cr: &cairo::Context,
+ id: Option<&str>,
+ viewport: &cairo::Rectangle,
+ user_language: &UserLanguage,
+ dpi: Dpi,
+ is_testing: bool,
+ ) -> Result<(), RenderingError> {
+ cr.status()?;
+
+ let node = self.get_node_or_root(id)?;
+ let root = self.document.root();
+
+ let viewport = Rect::from(*viewport);
+
+ with_saved_cr(cr, || {
+ draw_tree(
+ self.session.clone(),
+ DrawingMode::LimitToStack { node, root },
+ cr,
+ viewport,
+ user_language,
+ dpi,
+ false,
+ is_testing,
+ &mut AcquiredNodes::new(&self.document),
+ )
+ .map(|_bbox| ())
+ })
+ }
+
+ fn get_bbox_for_element(
+ &self,
+ node: &Node,
+ user_language: &UserLanguage,
+ dpi: Dpi,
+ is_testing: bool,
+ ) -> Result<BoundingBox, RenderingError> {
+ let target = cairo::ImageSurface::create(cairo::Format::Rgb24, 1, 1)?;
+ let cr = cairo::Context::new(&target)?;
+
+ let node = node.clone();
+
+ draw_tree(
+ self.session.clone(),
+ DrawingMode::OnlyNode(node),
+ &cr,
+ unit_rectangle(),
+ user_language,
+ dpi,
+ true,
+ is_testing,
+ &mut AcquiredNodes::new(&self.document),
+ )
+ }
+
+ /// Returns (ink_rect, logical_rect)
+ pub fn get_geometry_for_element(
+ &self,
+ id: Option<&str>,
+ user_language: &UserLanguage,
+ dpi: Dpi,
+ is_testing: bool,
+ ) -> Result<(cairo::Rectangle, cairo::Rectangle), RenderingError> {
+ let node = self.get_node_or_root(id)?;
+
+ let bbox = self.get_bbox_for_element(&node, user_language, dpi, is_testing)?;
+
+ let ink_rect = bbox.ink_rect.unwrap_or_default();
+ let logical_rect = bbox.rect.unwrap_or_default();
+
+ // Translate so ink_rect is always at offset (0, 0)
+ let ofs = (-ink_rect.x0, -ink_rect.y0);
+
+ Ok((
+ cairo::Rectangle::from(ink_rect.translate(ofs)),
+ cairo::Rectangle::from(logical_rect.translate(ofs)),
+ ))
+ }
+
+ pub fn render_element(
+ &self,
+ cr: &cairo::Context,
+ id: Option<&str>,
+ element_viewport: &cairo::Rectangle,
+ user_language: &UserLanguage,
+ dpi: Dpi,
+ is_testing: bool,
+ ) -> Result<(), RenderingError> {
+ cr.status()?;
+
+ let node = self.get_node_or_root(id)?;
+
+ let bbox = self.get_bbox_for_element(&node, user_language, dpi, is_testing)?;
+
+ if bbox.ink_rect.is_none() || bbox.rect.is_none() {
+ // Nothing to draw
+ return Ok(());
+ }
+
+ let ink_r = bbox.ink_rect.unwrap_or_default();
+
+ if ink_r.is_empty() {
+ return Ok(());
+ }
+
+ // Render, transforming so element is at the new viewport's origin
+
+ with_saved_cr(cr, || {
+ let factor = (element_viewport.width() / ink_r.width())
+ .min(element_viewport.height() / ink_r.height());
+
+ cr.translate(element_viewport.x(), element_viewport.y());
+ cr.scale(factor, factor);
+ cr.translate(-ink_r.x0, -ink_r.y0);
+
+ draw_tree(
+ self.session.clone(),
+ DrawingMode::OnlyNode(node),
+ cr,
+ unit_rectangle(),
+ user_language,
+ dpi,
+ false,
+ is_testing,
+ &mut AcquiredNodes::new(&self.document),
+ )
+ .map(|_bbox| ())
+ })
+ }
+
+ pub fn get_intrinsic_dimensions(&self) -> IntrinsicDimensions {
+ let root = self.document.root();
+ let cascaded = CascadedValues::new_from_node(&root);
+ let values = cascaded.get();
+ borrow_element_as!(self.document.root(), Svg).get_intrinsic_dimensions(values)
+ }
+
+ pub fn set_stylesheet(&mut self, css: &str) -> Result<(), LoadingError> {
+ let stylesheet = Stylesheet::from_data(
+ css,
+ &UrlResolver::new(None),
+ Origin::User,
+ self.session.clone(),
+ )?;
+ self.document.cascade(&[stylesheet], &self.session);
+ Ok(())
+ }
+}
+
+fn unit_rectangle() -> Rect {
+ Rect::from_size(1.0, 1.0)
+}
diff --git a/rsvg/src/href.rs b/rsvg/src/href.rs
new file mode 100644
index 00000000..b2626221
--- /dev/null
+++ b/rsvg/src/href.rs
@@ -0,0 +1,50 @@
+//! Handling of `xlink:href` and `href` attributes
+//!
+//! In SVG1.1, links to elements are done with the `xlink:href` attribute. However, SVG2
+//! reduced this to just plain `href` with no namespace:
+//! <https://svgwg.org/svg2-draft/linking.html#XLinkRefAttrs>
+//!
+//! If an element has both `xlink:href` and `href` attributes, the `href` overrides the
+//! other. We implement that logic in this module.
+
+use markup5ever::{expanded_name, local_name, namespace_url, ns, ExpandedName};
+
+/// Returns whether the attribute is either of `xlink:href` or `href`.
+///
+/// # Example
+///
+/// Use with an `if` pattern inside a `match`:
+///
+/// ```
+/// # use markup5ever::{expanded_name, local_name, namespace_url, ns, QualName, Prefix, Namespace, LocalName, ExpandedName};
+/// # use rsvg::doctest_only::{is_href,set_href};
+///
+/// let qual_name = QualName::new(
+/// Some(Prefix::from("xlink")),
+/// Namespace::from("http://www.w3.org/1999/xlink"),
+/// LocalName::from("href"),
+/// );
+///
+/// let value = "some_url";
+/// let mut my_field: Option<String> = None;
+///
+/// match qual_name.expanded() {
+/// ref name if is_href(name) => set_href(name, &mut my_field, Some(value.to_string())),
+/// _ => unreachable!(),
+/// }
+/// ```
+pub fn is_href(name: &ExpandedName<'_>) -> bool {
+ matches!(
+ *name,
+ expanded_name!(xlink "href") | expanded_name!("", "href")
+ )
+}
+
+/// Sets an `href` attribute in preference over an `xlink:href` one.
+///
+/// See [`is_href`] for example usage.
+pub fn set_href<T>(name: &ExpandedName<'_>, dest: &mut Option<T>, href: Option<T>) {
+ if dest.is_none() || *name != expanded_name!(xlink "href") {
+ *dest = href;
+ }
+}
diff --git a/rsvg/src/image.rs b/rsvg/src/image.rs
new file mode 100644
index 00000000..ece7f741
--- /dev/null
+++ b/rsvg/src/image.rs
@@ -0,0 +1,119 @@
+//! The `image` element.
+
+use markup5ever::{expanded_name, local_name, namespace_url, ns};
+
+use crate::aspect_ratio::AspectRatio;
+use crate::bbox::BoundingBox;
+use crate::document::AcquiredNodes;
+use crate::drawing_ctx::{DrawingCtx, Viewport};
+use crate::element::{set_attribute, ElementTrait};
+use crate::error::*;
+use crate::href::{is_href, set_href};
+use crate::layout::{self, Layer, LayerKind, StackingContext};
+use crate::length::*;
+use crate::node::{CascadedValues, Node, NodeBorrow};
+use crate::parsers::ParseValue;
+use crate::rect::Rect;
+use crate::session::Session;
+use crate::xml::Attributes;
+
+/// The `<image>` element.
+///
+/// Note that its x/y/width/height are properties in SVG2, so they are
+/// defined as part of [the properties machinery](properties.rs).
+#[derive(Default)]
+pub struct Image {
+ aspect: AspectRatio,
+ href: Option<String>,
+}
+
+impl ElementTrait for Image {
+ fn set_attributes(&mut self, attrs: &Attributes, session: &Session) {
+ for (attr, value) in attrs.iter() {
+ match attr.expanded() {
+ expanded_name!("", "preserveAspectRatio") => {
+ set_attribute(&mut self.aspect, attr.parse(value), session)
+ }
+
+ // "path" is used by some older Adobe Illustrator versions
+ ref a if is_href(a) || *a == expanded_name!("", "path") => {
+ set_href(a, &mut self.href, Some(value.to_string()))
+ }
+
+ _ => (),
+ }
+ }
+ }
+
+ fn draw(
+ &self,
+ node: &Node,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ cascaded: &CascadedValues<'_>,
+ viewport: &Viewport,
+ draw_ctx: &mut DrawingCtx,
+ clipping: bool,
+ ) -> Result<BoundingBox, RenderingError> {
+ let surface = match self.href {
+ Some(ref url) => match acquired_nodes.lookup_image(url) {
+ Ok(surf) => surf,
+ Err(e) => {
+ rsvg_log!(
+ draw_ctx.session(),
+ "could not load image \"{}\": {}",
+ url,
+ e
+ );
+ return Ok(draw_ctx.empty_bbox());
+ }
+ },
+ None => return Ok(draw_ctx.empty_bbox()),
+ };
+
+ let values = cascaded.get();
+
+ let params = NormalizeParams::new(values, viewport);
+
+ let x = values.x().0.to_user(&params);
+ let y = values.y().0.to_user(&params);
+
+ let w = match values.width().0 {
+ LengthOrAuto::Length(l) => l.to_user(&params),
+ LengthOrAuto::Auto => surface.width() as f64,
+ };
+ let h = match values.height().0 {
+ LengthOrAuto::Length(l) => l.to_user(&params),
+ LengthOrAuto::Auto => surface.height() as f64,
+ };
+
+ let is_visible = values.is_visible();
+
+ let rect = Rect::new(x, y, x + w, y + h);
+
+ let overflow = values.overflow();
+
+ let image = Box::new(layout::Image {
+ surface,
+ is_visible,
+ rect,
+ aspect: self.aspect,
+ overflow,
+ });
+
+ let elt = node.borrow_element();
+ let stacking_ctx = StackingContext::new(
+ draw_ctx.session(),
+ acquired_nodes,
+ &elt,
+ values.transform(),
+ values,
+ );
+
+ let layer = Layer {
+ kind: LayerKind::Image(image),
+ stacking_ctx,
+ };
+
+ draw_ctx.draw_layer(&layer, acquired_nodes, clipping, viewport)
+ }
+}
diff --git a/rsvg/src/io.rs b/rsvg/src/io.rs
new file mode 100644
index 00000000..a5748aa3
--- /dev/null
+++ b/rsvg/src/io.rs
@@ -0,0 +1,122 @@
+//! Utilities to acquire streams and data from from URLs.
+
+use data_url::{mime::Mime, DataUrl};
+use gio::{prelude::FileExt, Cancellable, File as GFile, InputStream, MemoryInputStream};
+use glib::{self, Bytes as GBytes, Cast};
+use std::fmt;
+use std::str::FromStr;
+
+use crate::url_resolver::AllowedUrl;
+
+pub enum IoError {
+ BadDataUrl,
+ Glib(glib::Error),
+}
+
+impl From<glib::Error> for IoError {
+ fn from(e: glib::Error) -> IoError {
+ IoError::Glib(e)
+ }
+}
+
+impl fmt::Display for IoError {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ match *self {
+ IoError::BadDataUrl => write!(f, "invalid data: URL"),
+ IoError::Glib(ref e) => e.fmt(f),
+ }
+ }
+}
+
+pub struct BinaryData {
+ pub data: Vec<u8>,
+ pub mime_type: Mime,
+}
+
+fn decode_data_uri(uri: &str) -> Result<BinaryData, IoError> {
+ let data_url = DataUrl::process(uri).map_err(|_| IoError::BadDataUrl)?;
+
+ let mime = data_url.mime_type();
+
+ // data_url::mime::Mime doesn't impl Clone, so do it by hand
+
+ let mime_type = Mime {
+ type_: mime.type_.clone(),
+ subtype: mime.subtype.clone(),
+ parameters: mime.parameters.clone(),
+ };
+
+ let (bytes, fragment_id) = data_url.decode_to_vec().map_err(|_| IoError::BadDataUrl)?;
+
+ // See issue #377 - per the data: URL spec
+ // (https://fetch.spec.whatwg.org/#data-urls), those URLs cannot
+ // have fragment identifiers. So, just return an error if we find
+ // one. This probably indicates mis-quoted SVG data inside the
+ // data: URL.
+ if fragment_id.is_some() {
+ return Err(IoError::BadDataUrl);
+ }
+
+ Ok(BinaryData {
+ data: bytes,
+ mime_type,
+ })
+}
+
+/// Creates a stream for reading. The url can be a data: URL or a plain URI.
+pub fn acquire_stream(
+ aurl: &AllowedUrl,
+ cancellable: Option<&Cancellable>,
+) -> Result<InputStream, IoError> {
+ let uri = aurl.as_str();
+
+ if uri.starts_with("data:") {
+ let BinaryData { data, .. } = decode_data_uri(uri)?;
+
+ // {
+ // use std::fs::File;
+ // use std::io::prelude::*;
+ //
+ // let mut file = File::create("data.bin").unwrap();
+ // file.write_all(&data).unwrap();
+ // }
+
+ let stream = MemoryInputStream::from_bytes(&GBytes::from_owned(data));
+ Ok(stream.upcast::<InputStream>())
+ } else {
+ let file = GFile::for_uri(uri);
+ let stream = file.read(cancellable)?;
+
+ Ok(stream.upcast::<InputStream>())
+ }
+}
+
+/// Reads the entire contents pointed by an URL. The url can be a data: URL or a plain URI.
+pub fn acquire_data(
+ aurl: &AllowedUrl,
+ cancellable: Option<&Cancellable>,
+) -> Result<BinaryData, IoError> {
+ let uri = aurl.as_str();
+
+ if uri.starts_with("data:") {
+ Ok(decode_data_uri(uri)?)
+ } else {
+ let file = GFile::for_uri(uri);
+ let (contents, _etag) = file.load_contents(cancellable)?;
+
+ let (content_type, _uncertain) = gio::content_type_guess(Some(uri), &contents);
+
+ let mime_type = if let Some(mime_type_str) = gio::content_type_get_mime_type(&content_type)
+ {
+ Mime::from_str(&mime_type_str)
+ .expect("gio::content_type_get_mime_type returned an invalid MIME-type!?")
+ } else {
+ Mime::from_str("application/octet-stream").unwrap()
+ };
+
+ Ok(BinaryData {
+ data: contents,
+ mime_type,
+ })
+ }
+}
diff --git a/rsvg/src/iri.rs b/rsvg/src/iri.rs
new file mode 100644
index 00000000..e3272fe6
--- /dev/null
+++ b/rsvg/src/iri.rs
@@ -0,0 +1,90 @@
+//! CSS funciri values.
+
+use cssparser::Parser;
+
+use crate::document::NodeId;
+use crate::error::*;
+use crate::parsers::Parse;
+
+/// Used where style properties take a funciri or "none"
+///
+/// This is not to be used for values which don't come from properties.
+/// For example, the `xlink:href` attribute in the `<image>` element
+/// does not take a funciri value (which looks like `url(...)`), but rather
+/// it takes a plain URL.
+#[derive(Debug, Clone, PartialEq)]
+pub enum Iri {
+ None,
+ Resource(Box<NodeId>),
+}
+
+impl Iri {
+ /// Returns the contents of an `IRI::Resource`, or `None`
+ pub fn get(&self) -> Option<&NodeId> {
+ match *self {
+ Iri::None => None,
+ Iri::Resource(ref f) => Some(f),
+ }
+ }
+}
+
+impl Parse for Iri {
+ fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<Iri, ParseError<'i>> {
+ if parser
+ .try_parse(|i| i.expect_ident_matching("none"))
+ .is_ok()
+ {
+ Ok(Iri::None)
+ } else {
+ let loc = parser.current_source_location();
+ let url = parser.expect_url()?;
+ let node_id =
+ NodeId::parse(&url).map_err(|e| loc.new_custom_error(ValueErrorKind::from(e)))?;
+
+ Ok(Iri::Resource(Box::new(node_id)))
+ }
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn parses_none() {
+ assert_eq!(Iri::parse_str("none").unwrap(), Iri::None);
+ }
+
+ #[test]
+ fn parses_url() {
+ assert_eq!(
+ Iri::parse_str("url(#bar)").unwrap(),
+ Iri::Resource(Box::new(NodeId::Internal("bar".to_string())))
+ );
+
+ assert_eq!(
+ Iri::parse_str("url(foo#bar)").unwrap(),
+ Iri::Resource(Box::new(NodeId::External(
+ "foo".to_string(),
+ "bar".to_string()
+ )))
+ );
+
+ // be permissive if the closing ) is missing
+ assert_eq!(
+ Iri::parse_str("url(#bar").unwrap(),
+ Iri::Resource(Box::new(NodeId::Internal("bar".to_string())))
+ );
+ assert_eq!(
+ Iri::parse_str("url(foo#bar").unwrap(),
+ Iri::Resource(Box::new(NodeId::External(
+ "foo".to_string(),
+ "bar".to_string()
+ )))
+ );
+
+ assert!(Iri::parse_str("").is_err());
+ assert!(Iri::parse_str("foo").is_err());
+ assert!(Iri::parse_str("url(foo)bar").is_err());
+ }
+}
diff --git a/rsvg/src/layout.rs b/rsvg/src/layout.rs
new file mode 100644
index 00000000..434ae9a7
--- /dev/null
+++ b/rsvg/src/layout.rs
@@ -0,0 +1,387 @@
+//! Layout tree.
+//!
+//! The idea is to take the DOM tree and produce a layout tree with SVG concepts.
+
+use std::rc::Rc;
+use std::sync::Arc;
+
+use cssparser::RGBA;
+use float_cmp::approx_eq;
+
+use crate::aspect_ratio::AspectRatio;
+use crate::bbox::BoundingBox;
+use crate::coord_units::CoordUnits;
+use crate::dasharray::Dasharray;
+use crate::document::AcquiredNodes;
+use crate::element::{Element, ElementData};
+use crate::filter::FilterValueList;
+use crate::length::*;
+use crate::node::*;
+use crate::paint_server::{PaintSource, UserSpacePaintSource};
+use crate::path_builder::Path;
+use crate::properties::{
+ self, ClipRule, ComputedValues, Direction, FillRule, FontFamily, FontStretch, FontStyle,
+ FontVariant, FontWeight, Isolation, MixBlendMode, Opacity, Overflow, PaintOrder,
+ ShapeRendering, StrokeDasharray, StrokeLinecap, StrokeLinejoin, StrokeMiterlimit,
+ TextDecoration, TextRendering, UnicodeBidi, VectorEffect, XmlLang,
+};
+use crate::rect::Rect;
+use crate::session::Session;
+use crate::surface_utils::shared_surface::SharedImageSurface;
+use crate::transform::Transform;
+use crate::unit_interval::UnitInterval;
+
+/// SVG Stacking context, an inner node in the layout tree.
+///
+/// <https://www.w3.org/TR/SVG2/render.html#EstablishingStackingContex>
+///
+/// This is not strictly speaking an SVG2 stacking context, but a
+/// looser version of it. For example. the SVG spec mentions that a
+/// an element should establish a stacking context if the `filter`
+/// property applies to the element and is not `none`. In that case,
+/// the element is rendered as an "isolated group" -
+/// <https://www.w3.org/TR/2015/CR-compositing-1-20150113/#csscompositingrules_SVG>
+///
+/// Here we store all the parameters that may lead to the decision to actually
+/// render an element as an isolated group.
+pub struct StackingContext {
+ pub element_name: String,
+ pub transform: Transform,
+ pub opacity: Opacity,
+ pub filter: Option<Filter>,
+ pub clip_in_user_space: Option<Node>,
+ pub clip_in_object_space: Option<Node>,
+ pub mask: Option<Node>,
+ pub mix_blend_mode: MixBlendMode,
+ pub isolation: Isolation,
+
+ /// Target from an <a> element
+ pub link_target: Option<String>,
+}
+
+/// The item being rendered inside a stacking context.
+pub struct Layer {
+ pub kind: LayerKind,
+ pub stacking_ctx: StackingContext,
+}
+pub enum LayerKind {
+ Shape(Box<Shape>),
+ Text(Box<Text>),
+ Image(Box<Image>),
+}
+
+/// Stroke parameters in user-space coordinates.
+pub struct Stroke {
+ pub width: f64,
+ pub miter_limit: StrokeMiterlimit,
+ pub line_cap: StrokeLinecap,
+ pub line_join: StrokeLinejoin,
+ pub dash_offset: f64,
+ pub dashes: Box<[f64]>,
+ // https://svgwg.org/svg2-draft/painting.html#non-scaling-stroke
+ pub non_scaling: bool,
+}
+
+/// Paths and basic shapes resolved to a path.
+pub struct Shape {
+ pub path: Rc<Path>,
+ pub extents: Option<Rect>,
+ pub is_visible: bool,
+ pub paint_order: PaintOrder,
+ pub stroke: Stroke,
+ pub stroke_paint: UserSpacePaintSource,
+ pub fill_paint: UserSpacePaintSource,
+ pub fill_rule: FillRule,
+ pub clip_rule: ClipRule,
+ pub shape_rendering: ShapeRendering,
+ pub marker_start: Marker,
+ pub marker_mid: Marker,
+ pub marker_end: Marker,
+}
+
+pub struct Marker {
+ pub node_ref: Option<Node>,
+ pub context_stroke: Arc<PaintSource>,
+ pub context_fill: Arc<PaintSource>,
+}
+
+/// Image in user-space coordinates.
+pub struct Image {
+ pub surface: SharedImageSurface,
+ pub is_visible: bool,
+ pub rect: Rect,
+ pub aspect: AspectRatio,
+ pub overflow: Overflow,
+}
+
+/// A single text span in user-space coordinates.
+pub struct TextSpan {
+ pub layout: pango::Layout,
+ pub gravity: pango::Gravity,
+ pub bbox: Option<BoundingBox>,
+ pub is_visible: bool,
+ pub x: f64,
+ pub y: f64,
+ pub paint_order: PaintOrder,
+ pub stroke: Stroke,
+ pub stroke_paint: UserSpacePaintSource,
+ pub fill_paint: UserSpacePaintSource,
+ pub text_rendering: TextRendering,
+ pub link_target: Option<String>,
+}
+
+/// Fully laid-out text in user-space coordinates.
+pub struct Text {
+ pub spans: Vec<TextSpan>,
+}
+
+/// Font-related properties extracted from `ComputedValues`.
+pub struct FontProperties {
+ pub xml_lang: XmlLang,
+ pub unicode_bidi: UnicodeBidi,
+ pub direction: Direction,
+ pub font_family: FontFamily,
+ pub font_style: FontStyle,
+ pub font_variant: FontVariant,
+ pub font_weight: FontWeight,
+ pub font_stretch: FontStretch,
+ pub font_size: f64,
+ pub letter_spacing: f64,
+ pub text_decoration: TextDecoration,
+}
+
+pub struct Filter {
+ pub filter_list: FilterValueList,
+ pub current_color: RGBA,
+ pub stroke_paint_source: Arc<PaintSource>,
+ pub fill_paint_source: Arc<PaintSource>,
+ pub normalize_values: NormalizeValues,
+}
+
+fn get_filter(
+ values: &ComputedValues,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ session: &Session,
+) -> Option<Filter> {
+ match values.filter() {
+ properties::Filter::None => None,
+
+ properties::Filter::List(filter_list) => Some(get_filter_from_filter_list(
+ filter_list,
+ acquired_nodes,
+ values,
+ session,
+ )),
+ }
+}
+
+fn get_filter_from_filter_list(
+ filter_list: FilterValueList,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ values: &ComputedValues,
+ session: &Session,
+) -> Filter {
+ let current_color = values.color().0;
+
+ let stroke_paint_source = values.stroke().0.resolve(
+ acquired_nodes,
+ values.stroke_opacity().0,
+ current_color,
+ None,
+ None,
+ session,
+ );
+
+ let fill_paint_source = values.fill().0.resolve(
+ acquired_nodes,
+ values.fill_opacity().0,
+ current_color,
+ None,
+ None,
+ session,
+ );
+
+ let normalize_values = NormalizeValues::new(values);
+
+ Filter {
+ filter_list,
+ current_color,
+ stroke_paint_source,
+ fill_paint_source,
+ normalize_values,
+ }
+}
+
+impl StackingContext {
+ pub fn new(
+ session: &Session,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ element: &Element,
+ transform: Transform,
+ values: &ComputedValues,
+ ) -> StackingContext {
+ let element_name = format!("{element}");
+
+ let opacity;
+ let filter;
+
+ match element.element_data {
+ // "The opacity, filter and display properties do not apply to the mask element"
+ // https://drafts.fxtf.org/css-masking-1/#MaskElement
+ ElementData::Mask(_) => {
+ opacity = Opacity(UnitInterval::clamp(1.0));
+ filter = None;
+ }
+
+ _ => {
+ opacity = values.opacity();
+ filter = get_filter(values, acquired_nodes, session);
+ }
+ }
+
+ let clip_path = values.clip_path();
+ let clip_uri = clip_path.0.get();
+ let (clip_in_user_space, clip_in_object_space) = clip_uri
+ .and_then(|node_id| {
+ acquired_nodes
+ .acquire(node_id)
+ .ok()
+ .filter(|a| is_element_of_type!(*a.get(), ClipPath))
+ })
+ .map(|acquired| {
+ let clip_node = acquired.get().clone();
+
+ let units = borrow_element_as!(clip_node, ClipPath).get_units();
+
+ match units {
+ CoordUnits::UserSpaceOnUse => (Some(clip_node), None),
+ CoordUnits::ObjectBoundingBox => (None, Some(clip_node)),
+ }
+ })
+ .unwrap_or((None, None));
+
+ let mask = values.mask().0.get().and_then(|mask_id| {
+ if let Ok(acquired) = acquired_nodes.acquire(mask_id) {
+ let node = acquired.get();
+ match *node.borrow_element_data() {
+ ElementData::Mask(_) => Some(node.clone()),
+
+ _ => {
+ rsvg_log!(
+ session,
+ "element {} references \"{}\" which is not a mask",
+ element,
+ mask_id
+ );
+
+ None
+ }
+ }
+ } else {
+ rsvg_log!(
+ session,
+ "element {} references nonexistent mask \"{}\"",
+ element,
+ mask_id
+ );
+
+ None
+ }
+ });
+
+ let mix_blend_mode = values.mix_blend_mode();
+ let isolation = values.isolation();
+
+ StackingContext {
+ element_name,
+ transform,
+ opacity,
+ filter,
+ clip_in_user_space,
+ clip_in_object_space,
+ mask,
+ mix_blend_mode,
+ isolation,
+ link_target: None,
+ }
+ }
+
+ pub fn new_with_link(
+ session: &Session,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ element: &Element,
+ transform: Transform,
+ values: &ComputedValues,
+ link_target: Option<String>,
+ ) -> StackingContext {
+ let mut ctx = Self::new(session, acquired_nodes, element, transform, values);
+ ctx.link_target = link_target;
+ ctx
+ }
+
+ pub fn should_isolate(&self) -> bool {
+ let Opacity(UnitInterval(opacity)) = self.opacity;
+ match self.isolation {
+ Isolation::Auto => {
+ let is_opaque = approx_eq!(f64, opacity, 1.0);
+ !(is_opaque
+ && self.filter.is_none()
+ && self.mask.is_none()
+ && self.mix_blend_mode == MixBlendMode::Normal
+ && self.clip_in_object_space.is_none())
+ }
+ Isolation::Isolate => true,
+ }
+ }
+}
+
+impl Stroke {
+ pub fn new(values: &ComputedValues, params: &NormalizeParams) -> Stroke {
+ let width = values.stroke_width().0.to_user(params);
+ let miter_limit = values.stroke_miterlimit();
+ let line_cap = values.stroke_line_cap();
+ let line_join = values.stroke_line_join();
+ let dash_offset = values.stroke_dashoffset().0.to_user(params);
+ let non_scaling = values.vector_effect() == VectorEffect::NonScalingStroke;
+
+ let dashes = match values.stroke_dasharray() {
+ StrokeDasharray(Dasharray::None) => Box::new([]),
+ StrokeDasharray(Dasharray::Array(dashes)) => dashes
+ .iter()
+ .map(|l| l.to_user(params))
+ .collect::<Box<[f64]>>(),
+ };
+
+ Stroke {
+ width,
+ miter_limit,
+ line_cap,
+ line_join,
+ dash_offset,
+ dashes,
+ non_scaling,
+ }
+ }
+}
+
+impl FontProperties {
+ /// Collects font properties from a `ComputedValues`.
+ ///
+ /// The `writing-mode` property is passed separately, as it must come from the `<text>` element,
+ /// not the `<tspan>` whose computed values are being passed.
+ pub fn new(values: &ComputedValues, params: &NormalizeParams) -> FontProperties {
+ FontProperties {
+ xml_lang: values.xml_lang(),
+ unicode_bidi: values.unicode_bidi(),
+ direction: values.direction(),
+ font_family: values.font_family(),
+ font_style: values.font_style(),
+ font_variant: values.font_variant(),
+ font_weight: values.font_weight(),
+ font_stretch: values.font_stretch(),
+ font_size: values.font_size().to_user(params),
+ letter_spacing: values.letter_spacing().to_user(params),
+ text_decoration: values.text_decoration(),
+ }
+ }
+}
diff --git a/rsvg/src/length.rs b/rsvg/src/length.rs
new file mode 100644
index 00000000..56156d41
--- /dev/null
+++ b/rsvg/src/length.rs
@@ -0,0 +1,736 @@
+//! CSS length values.
+//!
+//! [`CssLength`] is the struct librsvg uses to represent CSS lengths.
+//! See its documentation for examples of how to construct it.
+//!
+//! `CssLength` values need to know whether they will be normalized with respect to the width,
+//! height, or both dimensions of the current viewport. `CssLength` values can be signed or
+//! unsigned. So, a `CssLength` has two type parameters, [`Normalize`] and [`Validate`];
+//! the full type is `CssLength<N: Normalize, V: Validate>`. We provide [`Horizontal`],
+//! [`Vertical`], and [`Both`] implementations of [`Normalize`]; these let length values know
+//! how to normalize themselves with respect to the current viewport. We also provide
+//! [`Signed`] and [`Unsigned`] implementations of [`Validate`].
+//!
+//! For ease of use, we define two type aliases [`Length`] and [`ULength`] corresponding to
+//! signed and unsigned.
+//!
+//! For example, the implementation of [`Circle`][crate::shapes::Circle] defines this
+//! structure with fields for the `(center_x, center_y, radius)`:
+//!
+//! ```
+//! # use rsvg::doctest_only::{Length,ULength,Horizontal,Vertical,Both};
+//! pub struct Circle {
+//! cx: Length<Horizontal>,
+//! cy: Length<Vertical>,
+//! r: ULength<Both>,
+//! }
+//! ```
+//!
+//! This means that:
+//!
+//! * `cx` and `cy` define the center of the circle, they can be positive or negative, and
+//! they will be normalized with respect to the current viewport's width and height,
+//! respectively. If the SVG document specified `<circle cx="50%" cy="30%">`, the values
+//! would be normalized to be at 50% of the the viewport's width, and 30% of the viewport's
+//! height.
+//!
+//! * `r` is non-negative and needs to be resolved against the [normalized diagonal][diag]
+//! of the current viewport.
+//!
+//! The `N` type parameter of `CssLength<N, I>` is enough to know how to normalize a length
+//! value; the [`CssLength::to_user`] method will handle it automatically.
+//!
+//! [diag]: https://www.w3.org/TR/SVG/coords.html#Units
+
+use cssparser::{match_ignore_ascii_case, Parser, Token, _cssparser_internal_to_lowercase};
+use std::f64::consts::*;
+use std::fmt;
+use std::marker::PhantomData;
+
+use crate::dpi::Dpi;
+use crate::drawing_ctx::Viewport;
+use crate::error::*;
+use crate::parsers::{finite_f32, Parse};
+use crate::properties::{ComputedValues, FontSize};
+use crate::rect::Rect;
+use crate::viewbox::ViewBox;
+
+/// Units for length values.
+// This needs to be kept in sync with `rsvg.h:RsvgUnit`.
+#[repr(C)]
+#[derive(Debug, PartialEq, Copy, Clone)]
+pub enum LengthUnit {
+ /// `1.0` means 100%
+ Percent,
+
+ /// Pixels, or the CSS default unit
+ Px,
+
+ /// Size of the current font
+ Em,
+
+ /// x-height of the current font
+ Ex,
+
+ /// Inches (25.4 mm)
+ In,
+
+ /// Centimeters
+ Cm,
+
+ /// Millimeters
+ Mm,
+
+ /// Points (1/72 inch)
+ Pt,
+
+ /// Picas (12 points)
+ Pc,
+}
+
+/// A CSS length value.
+///
+/// This is equivalent to [CSS lengths].
+///
+/// [CSS lengths]: https://www.w3.org/TR/CSS22/syndata.html#length-units
+///
+/// It is up to the calling application to convert lengths in non-pixel units (i.e. those
+/// where the [`unit`][RsvgLength::unit] field is not [`LengthUnit::Px`]) into something
+/// meaningful to the application. For example, if your application knows the
+/// dots-per-inch (DPI) it is using, it can convert lengths with [`unit`] in
+/// [`LengthUnit::In`] or other physical units.
+// Keep this in sync with rsvg.h:RsvgLength
+#[repr(C)]
+#[derive(Debug, PartialEq, Copy, Clone)]
+pub struct RsvgLength {
+ /// Numeric part of the length
+ pub length: f64,
+
+ /// Unit part of the length
+ pub unit: LengthUnit,
+}
+
+impl RsvgLength {
+ pub fn new(l: f64, unit: LengthUnit) -> RsvgLength {
+ RsvgLength { length: l, unit }
+ }
+}
+
+/// Used for the `N` type parameter of `CssLength<N: Normalize, V: Validate>`.
+pub trait Normalize {
+ /// Computes an orientation-based scaling factor.
+ ///
+ /// This is used in the [`CssLength::to_user`] method to resolve lengths with percentage
+ /// units; they need to be resolved with respect to the width, height, or [normalized
+ /// diagonal][diag] of the current viewport.
+ ///
+ /// [diag]: https://www.w3.org/TR/SVG/coords.html#Units
+ fn normalize(x: f64, y: f64) -> f64;
+}
+
+/// Allows declaring `CssLength<Horizontal>`.
+#[derive(Debug, PartialEq, Copy, Clone)]
+pub struct Horizontal;
+
+/// Allows declaring `CssLength<Vertical>`.
+#[derive(Debug, PartialEq, Copy, Clone)]
+pub struct Vertical;
+
+/// Allows declaring `CssLength<Both>`.
+#[derive(Debug, PartialEq, Copy, Clone)]
+pub struct Both;
+
+impl Normalize for Horizontal {
+ #[inline]
+ fn normalize(x: f64, _y: f64) -> f64 {
+ x
+ }
+}
+
+impl Normalize for Vertical {
+ #[inline]
+ fn normalize(_x: f64, y: f64) -> f64 {
+ y
+ }
+}
+
+impl Normalize for Both {
+ #[inline]
+ fn normalize(x: f64, y: f64) -> f64 {
+ viewport_percentage(x, y)
+ }
+}
+
+/// Used for the `V` type parameter of `CssLength<N: Normalize, V: Validate>`.
+pub trait Validate {
+ /// Checks if the specified value is acceptable
+ ///
+ /// This is used when parsing a length value
+ fn validate(v: f64) -> Result<f64, ValueErrorKind> {
+ Ok(v)
+ }
+}
+
+#[derive(Debug, PartialEq, Copy, Clone)]
+pub struct Signed;
+
+impl Validate for Signed {}
+
+#[derive(Debug, PartialEq, Copy, Clone)]
+pub struct Unsigned;
+
+impl Validate for Unsigned {
+ fn validate(v: f64) -> Result<f64, ValueErrorKind> {
+ if v >= 0.0 {
+ Ok(v)
+ } else {
+ Err(ValueErrorKind::Value(
+ "value must be non-negative".to_string(),
+ ))
+ }
+ }
+}
+
+/// A CSS length value.
+///
+/// This is equivalent to [CSS lengths].
+///
+/// [CSS lengths]: https://www.w3.org/TR/CSS22/syndata.html#length-units
+///
+/// `CssLength` implements the [`Parse`] trait, so it can be parsed out of a
+/// [`cssparser::Parser`].
+///
+/// This type will be normally used through the type aliases [`Length`] and [`ULength`]
+///
+/// Examples of construction:
+///
+/// ```
+/// # use rsvg::doctest_only::{Length,ULength,LengthUnit,Horizontal,Vertical,Both};
+/// # use rsvg::doctest_only::Parse;
+/// // Explicit type
+/// let width: Length<Horizontal> = Length::new(42.0, LengthUnit::Cm);
+///
+/// // Inferred type
+/// let height = Length::<Vertical>::new(42.0, LengthUnit::Cm);
+///
+/// // Parsed
+/// let radius = ULength::<Both>::parse_str("5px").unwrap();
+/// ```
+///
+/// During the rendering phase, a `CssLength` needs to be converted to user-space
+/// coordinates with the [`CssLength::to_user`] method.
+#[derive(Debug, PartialEq, Copy, Clone)]
+pub struct CssLength<N: Normalize, V: Validate> {
+ /// Numeric part of the length
+ pub length: f64,
+
+ /// Unit part of the length
+ pub unit: LengthUnit,
+
+ /// Dummy; used internally for the type parameter `N`
+ orientation: PhantomData<N>,
+
+ /// Dummy; used internally for the type parameter `V`
+ validation: PhantomData<V>,
+}
+
+impl<N: Normalize, V: Validate> From<CssLength<N, V>> for RsvgLength {
+ fn from(l: CssLength<N, V>) -> RsvgLength {
+ RsvgLength {
+ length: l.length,
+ unit: l.unit,
+ }
+ }
+}
+
+impl<N: Normalize, V: Validate> Default for CssLength<N, V> {
+ fn default() -> Self {
+ CssLength::new(0.0, LengthUnit::Px)
+ }
+}
+
+pub const POINTS_PER_INCH: f64 = 72.0;
+const CM_PER_INCH: f64 = 2.54;
+const MM_PER_INCH: f64 = 25.4;
+const PICA_PER_INCH: f64 = 6.0;
+
+impl<N: Normalize, V: Validate> Parse for CssLength<N, V> {
+ fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<CssLength<N, V>, ParseError<'i>> {
+ let l_value;
+ let l_unit;
+
+ let token = parser.next()?.clone();
+
+ match token {
+ Token::Number { value, .. } => {
+ l_value = value;
+ l_unit = LengthUnit::Px;
+ }
+
+ Token::Percentage { unit_value, .. } => {
+ l_value = unit_value;
+ l_unit = LengthUnit::Percent;
+ }
+
+ Token::Dimension {
+ value, ref unit, ..
+ } => {
+ l_value = value;
+
+ l_unit = match_ignore_ascii_case! {unit.as_ref(),
+ "px" => LengthUnit::Px,
+ "em" => LengthUnit::Em,
+ "ex" => LengthUnit::Ex,
+ "in" => LengthUnit::In,
+ "cm" => LengthUnit::Cm,
+ "mm" => LengthUnit::Mm,
+ "pt" => LengthUnit::Pt,
+ "pc" => LengthUnit::Pc,
+
+ _ => return Err(parser.new_unexpected_token_error(token)),
+ };
+ }
+
+ _ => return Err(parser.new_unexpected_token_error(token)),
+ }
+
+ let l_value = f64::from(finite_f32(l_value).map_err(|e| parser.new_custom_error(e))?);
+
+ <V as Validate>::validate(l_value)
+ .map_err(|e| parser.new_custom_error(e))
+ .map(|l_value| CssLength::new(l_value, l_unit))
+ }
+}
+
+/// Parameters for length normalization extractedfrom [`ComputedValues`].
+///
+/// This is a precursor to [`NormalizeParams::from_values`], for cases where it is inconvenient
+/// to keep a [`ComputedValues`] around.
+pub struct NormalizeValues {
+ font_size: FontSize,
+}
+
+impl NormalizeValues {
+ pub fn new(values: &ComputedValues) -> NormalizeValues {
+ NormalizeValues {
+ font_size: values.font_size(),
+ }
+ }
+}
+
+/// Parameters to normalize [`Length`] values to user-space distances.
+pub struct NormalizeParams {
+ vbox: ViewBox,
+ font_size: f64,
+ dpi: Dpi,
+}
+
+impl NormalizeParams {
+ /// Extracts the information needed to normalize [`Length`] values from a set of
+ /// [`ComputedValues`] and the viewport size in [`Viewport`].
+ pub fn new(values: &ComputedValues, viewport: &Viewport) -> NormalizeParams {
+ let v = NormalizeValues::new(values);
+ NormalizeParams::from_values(&v, viewport)
+ }
+
+ pub fn from_values(v: &NormalizeValues, viewport: &Viewport) -> NormalizeParams {
+ NormalizeParams {
+ vbox: viewport.vbox,
+ font_size: font_size_from_values(v, viewport.dpi),
+ dpi: viewport.dpi,
+ }
+ }
+
+ /// Just used by rsvg-convert, where there is no font size nor viewport.
+ pub fn from_dpi(dpi: Dpi) -> NormalizeParams {
+ NormalizeParams {
+ vbox: ViewBox::from(Rect::default()),
+ font_size: 1.0,
+ dpi,
+ }
+ }
+}
+
+impl<N: Normalize, V: Validate> CssLength<N, V> {
+ /// Creates a CssLength.
+ ///
+ /// The compiler needs to know the type parameters `N` and `V` which represents the
+ /// length's orientation and validation.
+ /// You can specify them explicitly, or call the parametrized method:
+ ///
+ /// ```
+ /// # use rsvg::doctest_only::{Length,LengthUnit,Horizontal,Vertical};
+ /// // Explicit type
+ /// let width: Length<Horizontal> = Length::new(42.0, LengthUnit::Cm);
+ ///
+ /// // Inferred type
+ /// let height = Length::<Vertical>::new(42.0, LengthUnit::Cm);
+ /// ```
+ pub fn new(l: f64, unit: LengthUnit) -> CssLength<N, V> {
+ CssLength {
+ length: l,
+ unit,
+ orientation: PhantomData,
+ validation: PhantomData,
+ }
+ }
+
+ /// Convert a Length with units into user-space coordinates.
+ ///
+ /// Lengths may come with non-pixel units, and when rendering, they need to be normalized
+ /// to pixels based on the current viewport (e.g. for lengths with percent units), and
+ /// based on the current element's set of [`ComputedValues`] (e.g. for lengths with `Em`
+ /// units that need to be resolved against the current font size).
+ ///
+ /// Those parameters can be obtained with [`NormalizeParams::new()`].
+ pub fn to_user(&self, params: &NormalizeParams) -> f64 {
+ match self.unit {
+ LengthUnit::Px => self.length,
+
+ LengthUnit::Percent => {
+ self.length * <N as Normalize>::normalize(params.vbox.width(), params.vbox.height())
+ }
+
+ LengthUnit::Em => self.length * params.font_size,
+
+ LengthUnit::Ex => self.length * params.font_size / 2.0,
+
+ LengthUnit::In => self.length * <N as Normalize>::normalize(params.dpi.x, params.dpi.y),
+
+ LengthUnit::Cm => {
+ self.length * <N as Normalize>::normalize(params.dpi.x, params.dpi.y) / CM_PER_INCH
+ }
+
+ LengthUnit::Mm => {
+ self.length * <N as Normalize>::normalize(params.dpi.x, params.dpi.y) / MM_PER_INCH
+ }
+
+ LengthUnit::Pt => {
+ self.length * <N as Normalize>::normalize(params.dpi.x, params.dpi.y)
+ / POINTS_PER_INCH
+ }
+
+ LengthUnit::Pc => {
+ self.length * <N as Normalize>::normalize(params.dpi.x, params.dpi.y)
+ / PICA_PER_INCH
+ }
+ }
+ }
+
+ /// Converts a Length to points. Pixels are taken to be respect with the DPI.
+ ///
+ /// # Panics
+ ///
+ /// Will panic if the length is in Percent, Em, or Ex units.
+ pub fn to_points(&self, params: &NormalizeParams) -> f64 {
+ match self.unit {
+ LengthUnit::Px => {
+ self.length / <N as Normalize>::normalize(params.dpi.x, params.dpi.y) * 72.0
+ }
+
+ LengthUnit::Percent => {
+ panic!("Cannot convert a percentage length into an absolute length");
+ }
+
+ LengthUnit::Em => {
+ panic!("Cannot convert an Em length into an absolute length");
+ }
+
+ LengthUnit::Ex => {
+ panic!("Cannot convert an Ex length into an absolute length");
+ }
+
+ LengthUnit::In => self.length * POINTS_PER_INCH,
+
+ LengthUnit::Cm => self.length / CM_PER_INCH * POINTS_PER_INCH,
+
+ LengthUnit::Mm => self.length / MM_PER_INCH * POINTS_PER_INCH,
+
+ LengthUnit::Pt => self.length,
+
+ LengthUnit::Pc => self.length / PICA_PER_INCH * POINTS_PER_INCH,
+ }
+ }
+
+ pub fn to_inches(&self, params: &NormalizeParams) -> f64 {
+ self.to_points(params) / POINTS_PER_INCH
+ }
+
+ pub fn to_cm(&self, params: &NormalizeParams) -> f64 {
+ self.to_inches(params) * CM_PER_INCH
+ }
+
+ pub fn to_mm(&self, params: &NormalizeParams) -> f64 {
+ self.to_inches(params) * MM_PER_INCH
+ }
+
+ pub fn to_picas(&self, params: &NormalizeParams) -> f64 {
+ self.to_inches(params) * PICA_PER_INCH
+ }
+}
+
+fn font_size_from_values(values: &NormalizeValues, dpi: Dpi) -> f64 {
+ let v = values.font_size.value();
+
+ match v.unit {
+ LengthUnit::Percent => unreachable!("ComputedValues can't have a relative font size"),
+
+ LengthUnit::Px => v.length,
+
+ // The following implies that our default font size is 12, which
+ // matches the default from the FontSize property.
+ LengthUnit::Em => v.length * 12.0,
+ LengthUnit::Ex => v.length * 12.0 / 2.0,
+
+ // FontSize always is a Both, per properties.rs
+ LengthUnit::In => v.length * Both::normalize(dpi.x, dpi.y),
+ LengthUnit::Cm => v.length * Both::normalize(dpi.x, dpi.y) / CM_PER_INCH,
+ LengthUnit::Mm => v.length * Both::normalize(dpi.x, dpi.y) / MM_PER_INCH,
+ LengthUnit::Pt => v.length * Both::normalize(dpi.x, dpi.y) / POINTS_PER_INCH,
+ LengthUnit::Pc => v.length * Both::normalize(dpi.x, dpi.y) / PICA_PER_INCH,
+ }
+}
+
+fn viewport_percentage(x: f64, y: f64) -> f64 {
+ // https://www.w3.org/TR/SVG/coords.html#Units
+ // "For any other length value expressed as a percentage of the viewport, the
+ // percentage is calculated as the specified percentage of
+ // sqrt((actual-width)**2 + (actual-height)**2))/sqrt(2)."
+ (x * x + y * y).sqrt() / SQRT_2
+}
+
+/// Alias for `CssLength` types that can have negative values
+pub type Length<N> = CssLength<N, Signed>;
+
+/// Alias for `CssLength` types that are non negative
+pub type ULength<N> = CssLength<N, Unsigned>;
+
+#[derive(Debug, Default, PartialEq, Copy, Clone)]
+pub enum LengthOrAuto<N: Normalize> {
+ #[default]
+ Auto,
+ Length(CssLength<N, Unsigned>),
+}
+
+impl<N: Normalize> Parse for LengthOrAuto<N> {
+ fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<LengthOrAuto<N>, ParseError<'i>> {
+ if parser
+ .try_parse(|i| i.expect_ident_matching("auto"))
+ .is_ok()
+ {
+ Ok(LengthOrAuto::Auto)
+ } else {
+ Ok(LengthOrAuto::Length(CssLength::parse(parser)?))
+ }
+ }
+}
+
+impl fmt::Display for LengthUnit {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ let unit = match &self {
+ LengthUnit::Percent => "%",
+ LengthUnit::Px => "px",
+ LengthUnit::Em => "em",
+ LengthUnit::Ex => "ex",
+ LengthUnit::In => "in",
+ LengthUnit::Cm => "cm",
+ LengthUnit::Mm => "mm",
+ LengthUnit::Pt => "pt",
+ LengthUnit::Pc => "pc",
+ };
+
+ write!(f, "{unit}")
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ use crate::float_eq_cairo::ApproxEqCairo;
+
+ #[test]
+ fn parses_default() {
+ assert_eq!(
+ Length::<Horizontal>::parse_str("42").unwrap(),
+ Length::<Horizontal>::new(42.0, LengthUnit::Px)
+ );
+
+ assert_eq!(
+ Length::<Horizontal>::parse_str("-42px").unwrap(),
+ Length::<Horizontal>::new(-42.0, LengthUnit::Px)
+ );
+ }
+
+ #[test]
+ fn parses_percent() {
+ assert_eq!(
+ Length::<Horizontal>::parse_str("50.0%").unwrap(),
+ Length::<Horizontal>::new(0.5, LengthUnit::Percent)
+ );
+ }
+
+ #[test]
+ fn parses_font_em() {
+ assert_eq!(
+ Length::<Vertical>::parse_str("22.5em").unwrap(),
+ Length::<Vertical>::new(22.5, LengthUnit::Em)
+ );
+ }
+
+ #[test]
+ fn parses_font_ex() {
+ assert_eq!(
+ Length::<Vertical>::parse_str("22.5ex").unwrap(),
+ Length::<Vertical>::new(22.5, LengthUnit::Ex)
+ );
+ }
+
+ #[test]
+ fn parses_physical_units() {
+ assert_eq!(
+ Length::<Both>::parse_str("72pt").unwrap(),
+ Length::<Both>::new(72.0, LengthUnit::Pt)
+ );
+
+ assert_eq!(
+ Length::<Both>::parse_str("-22.5in").unwrap(),
+ Length::<Both>::new(-22.5, LengthUnit::In)
+ );
+
+ assert_eq!(
+ Length::<Both>::parse_str("-254cm").unwrap(),
+ Length::<Both>::new(-254.0, LengthUnit::Cm)
+ );
+
+ assert_eq!(
+ Length::<Both>::parse_str("254mm").unwrap(),
+ Length::<Both>::new(254.0, LengthUnit::Mm)
+ );
+
+ assert_eq!(
+ Length::<Both>::parse_str("60pc").unwrap(),
+ Length::<Both>::new(60.0, LengthUnit::Pc)
+ );
+ }
+
+ #[test]
+ fn parses_unsigned() {
+ assert_eq!(
+ ULength::<Horizontal>::parse_str("42").unwrap(),
+ ULength::<Horizontal>::new(42.0, LengthUnit::Px)
+ );
+
+ assert_eq!(
+ ULength::<Both>::parse_str("0pt").unwrap(),
+ ULength::<Both>::new(0.0, LengthUnit::Pt)
+ );
+
+ assert!(ULength::<Horizontal>::parse_str("-42px").is_err());
+ }
+
+ #[test]
+ fn empty_length_yields_error() {
+ assert!(Length::<Both>::parse_str("").is_err());
+ }
+
+ #[test]
+ fn invalid_unit_yields_error() {
+ assert!(Length::<Both>::parse_str("8furlong").is_err());
+ }
+
+ #[test]
+ fn normalize_default_works() {
+ let view_params = Viewport::new(Dpi::new(40.0, 40.0), 100.0, 100.0);
+ let values = ComputedValues::default();
+ let params = NormalizeParams::new(&values, &view_params);
+
+ assert_approx_eq_cairo!(
+ Length::<Both>::new(10.0, LengthUnit::Px).to_user(&params),
+ 10.0
+ );
+ }
+
+ #[test]
+ fn normalize_absolute_units_works() {
+ let view_params = Viewport::new(Dpi::new(40.0, 50.0), 100.0, 100.0);
+ let values = ComputedValues::default();
+ let params = NormalizeParams::new(&values, &view_params);
+
+ assert_approx_eq_cairo!(
+ Length::<Horizontal>::new(10.0, LengthUnit::In).to_user(&params),
+ 400.0
+ );
+ assert_approx_eq_cairo!(
+ Length::<Vertical>::new(10.0, LengthUnit::In).to_user(&params),
+ 500.0
+ );
+
+ assert_approx_eq_cairo!(
+ Length::<Horizontal>::new(10.0, LengthUnit::Cm).to_user(&params),
+ 400.0 / CM_PER_INCH
+ );
+ assert_approx_eq_cairo!(
+ Length::<Horizontal>::new(10.0, LengthUnit::Mm).to_user(&params),
+ 400.0 / MM_PER_INCH
+ );
+ assert_approx_eq_cairo!(
+ Length::<Horizontal>::new(10.0, LengthUnit::Pt).to_user(&params),
+ 400.0 / POINTS_PER_INCH
+ );
+ assert_approx_eq_cairo!(
+ Length::<Horizontal>::new(10.0, LengthUnit::Pc).to_user(&params),
+ 400.0 / PICA_PER_INCH
+ );
+ }
+
+ #[test]
+ fn normalize_percent_works() {
+ let view_params = Viewport::new(Dpi::new(40.0, 40.0), 100.0, 200.0);
+ let values = ComputedValues::default();
+ let params = NormalizeParams::new(&values, &view_params);
+
+ assert_approx_eq_cairo!(
+ Length::<Horizontal>::new(0.05, LengthUnit::Percent).to_user(&params),
+ 5.0
+ );
+ assert_approx_eq_cairo!(
+ Length::<Vertical>::new(0.05, LengthUnit::Percent).to_user(&params),
+ 10.0
+ );
+ }
+
+ #[test]
+ fn normalize_font_em_ex_works() {
+ let view_params = Viewport::new(Dpi::new(40.0, 40.0), 100.0, 200.0);
+ let values = ComputedValues::default();
+ let params = NormalizeParams::new(&values, &view_params);
+
+ // These correspond to the default size for the font-size
+ // property and the way we compute Em/Ex from that.
+
+ assert_approx_eq_cairo!(
+ Length::<Vertical>::new(1.0, LengthUnit::Em).to_user(&params),
+ 12.0
+ );
+
+ assert_approx_eq_cairo!(
+ Length::<Vertical>::new(1.0, LengthUnit::Ex).to_user(&params),
+ 6.0
+ );
+ }
+
+ #[test]
+ fn to_points_works() {
+ let params = NormalizeParams::from_dpi(Dpi::new(40.0, 96.0));
+
+ assert_approx_eq_cairo!(
+ Length::<Horizontal>::new(80.0, LengthUnit::Px).to_points(&params),
+ 2.0 * 72.0
+ );
+ assert_approx_eq_cairo!(
+ Length::<Vertical>::new(192.0, LengthUnit::Px).to_points(&params),
+ 2.0 * 72.0
+ );
+ }
+}
diff --git a/rsvg/src/lib.rs b/rsvg/src/lib.rs
new file mode 100644
index 00000000..345c559e
--- /dev/null
+++ b/rsvg/src/lib.rs
@@ -0,0 +1,254 @@
+//! Load and render SVG images into Cairo surfaces.
+//!
+//! This crate can load SVG images and render them to Cairo surfaces,
+//! using a mixture of SVG's [static mode] and [secure static mode].
+//! Librsvg does not do animation nor scripting, and can load
+//! references to external data only in some situations; see below.
+//!
+//! Librsvg supports reading [SVG 1.1] data, and is gradually adding
+//! support for features in [SVG 2]. Librsvg also supports SVGZ
+//! files, which are just an SVG stream compressed with the GZIP
+//! algorithm.
+//!
+//! # Basic usage
+//!
+//! * Create a [`Loader`] struct.
+//! * Get an [`SvgHandle`] from the [`Loader`].
+//! * Create a [`CairoRenderer`] for the [`SvgHandle`] and render to a Cairo context.
+//!
+//! You can put the following in your `Cargo.toml`:
+//!
+//! ```toml
+//! [dependencies]
+//! rsvg = { git="https://gitlab.gnome.org/GNOME/librsvg" }
+//! cairo-rs = "0.8.0"
+//! glib = "0.9.0" # only if you need streams
+//! gio = { version="0.8.1", features=["v2_50"] } # likewise
+//! ```
+//!
+//! # Example
+//!
+//! ```
+//!
+//! const WIDTH: i32 = 640;
+//! const HEIGHT: i32 = 480;
+//!
+//! fn main() {
+//! // Loading from a file
+//!
+//! let handle = rsvg::Loader::new().read_path("example.svg").unwrap();
+//!
+//! let surface = cairo::ImageSurface::create(cairo::Format::ARgb32, WIDTH, HEIGHT).unwrap();
+//! let cr = cairo::Context::new(&surface).expect("Failed to create a cairo context");
+//!
+//! let renderer = rsvg::CairoRenderer::new(&handle);
+//! renderer.render_document(
+//! &cr,
+//! &cairo::Rectangle::new(0.0, 0.0, f64::from(WIDTH), f64::from(HEIGHT))
+//! ).unwrap();
+//!
+//! // Loading from a static SVG asset
+//!
+//! let bytes = glib::Bytes::from_static(
+//! br#"<?xml version="1.0" encoding="UTF-8"?>
+//! <svg xmlns="http://www.w3.org/2000/svg" width="50" height="50">
+//! <rect id="foo" x="10" y="10" width="30" height="30"/>
+//! </svg>
+//! "#
+//! );
+//! let stream = gio::MemoryInputStream::from_bytes(&bytes);
+//!
+//! let handle = rsvg::Loader::new().read_stream(
+//! &stream,
+//! None::<&gio::File>, // no base file as this document has no references
+//! None::<&gio::Cancellable>, // no cancellable
+//! ).unwrap();
+//! }
+//! ```
+//!
+//! # The "base file" and resolving references to external files
+//!
+//! When you load an SVG, librsvg needs to know the location of the "base file"
+//! for it. This is so that librsvg can determine the location of referenced
+//! entities. For example, say you have an SVG in <filename>/foo/bar/foo.svg</filename>
+//! and that it has an image element like this:
+//!
+//! ```xml
+//! <image href="resources/foo.png" .../>
+//! ```
+//!
+//! In this case, librsvg needs to know the location of the toplevel
+//! `/foo/bar/foo.svg` so that it can generate the appropriate
+//! reference to `/foo/bar/resources/foo.png`.
+//!
+//! ## Security and locations of referenced files
+//!
+//! When processing an SVG, librsvg will only load referenced files if
+//! they are in the same directory as the base file, or in a
+//! subdirectory of it. That is, if the base file is
+//! `/foo/bar/baz.svg`, then librsvg will only try to load referenced
+//! files (from SVG's `<image>` element, for example, or from content
+//! included through XML entities) if those files are in `/foo/bar/*`
+//! or in `/foo/bar/*/.../*`. This is so that malicious SVG documents
+//! cannot include files that are in a directory above.
+//!
+//! The full set of rules for deciding which URLs may be loaded is as follows;
+//! they are applied in order. A referenced URL will not be loaded as soon as
+//! one of these rules fails:
+//!
+//! 1. All `data:` URLs may be loaded. These are sometimes used to
+//! include raster image data, encoded as base-64, directly in an SVG
+//! file.
+//!
+//! 2. All other URL schemes in references require a base URL. For
+//! example, this means that if you load an SVG with [`Loader::read_stream`]
+//! without providing a `base_file`, then any referenced files will not
+//! be allowed (e.g. raster images to be loaded from other files will
+//! not work).
+//!
+//! 3. If referenced URLs are absolute, rather than relative, then
+//! they must have the same scheme as the base URL. For example, if
+//! the base URL has a "`file`" scheme, then all URL references inside
+//! the SVG must also have the "`file`" scheme, or be relative
+//! references which will be resolved against the base URL.
+//!
+//! 4. If referenced URLs have a "`resource`" scheme, that is, if they
+//! are included into your binary program with GLib's resource
+//! mechanism, they are allowed to be loaded (provided that the base
+//! URL is also a "`resource`", per the previous rule).
+//!
+//! 5. Otherwise, non-`file` schemes are not allowed. For example,
+//! librsvg will not load `http` resources, to keep malicious SVG data
+//! from "phoning home".
+//!
+//! 6. A relative URL must resolve to the same directory as the base
+//! URL, or to one of its subdirectories. Librsvg will canonicalize
+//! filenames, by removing "`..`" path components and resolving symbolic
+//! links, to decide whether files meet these conditions.
+//!
+//! [static mode]: https://www.w3.org/TR/SVG2/conform.html#static-mode
+//! [secure static mode]: https://www.w3.org/TR/SVG2/conform.html#secure-static-mode
+//! [SVG 1.1]: https://www.w3.org/TR/SVG11/
+//! [SVG 2]: https://www.w3.org/TR/SVG2/
+
+#![doc(html_logo_url = "https://gnome.pages.gitlab.gnome.org/librsvg/Rsvg-2.0/librsvg-r.svg")]
+#![allow(rustdoc::private_intra_doc_links)]
+#![allow(clippy::clone_on_ref_ptr)]
+#![allow(clippy::not_unsafe_ptr_arg_deref)]
+#![allow(clippy::too_many_arguments)]
+#![allow(clippy::derive_partial_eq_without_eq)]
+#![warn(nonstandard_style, rust_2018_idioms, unused)]
+// Some lints no longer exist
+#![warn(renamed_and_removed_lints)]
+// Standalone lints
+#![warn(trivial_casts, trivial_numeric_casts)]
+// The public API is exported here
+pub use crate::api::*;
+
+pub use crate::color::Color;
+
+pub use crate::rect::{IRect, Rect};
+
+#[macro_use]
+pub mod log;
+
+#[macro_use]
+mod parsers;
+
+#[macro_use]
+mod coord_units;
+
+#[macro_use]
+mod float_eq_cairo;
+
+#[macro_use]
+mod node;
+
+#[macro_use]
+mod property_macros;
+
+#[macro_use]
+mod util;
+
+mod accept_language;
+mod angle;
+mod api;
+mod aspect_ratio;
+mod bbox;
+pub mod c_api;
+mod color;
+mod cond;
+mod css;
+mod dasharray;
+mod document;
+mod dpi;
+mod drawing_ctx;
+mod element;
+mod error;
+mod filter;
+mod filter_func;
+pub mod filters;
+mod font_props;
+mod gradient;
+mod handle;
+mod href;
+mod image;
+mod io;
+mod iri;
+mod layout;
+mod length;
+mod limits;
+mod marker;
+mod paint_server;
+mod path_builder;
+mod path_parser;
+mod pattern;
+mod properties;
+mod property_defs;
+mod rect;
+mod session;
+mod shapes;
+mod space;
+mod structure;
+mod style;
+pub mod surface_utils;
+mod text;
+mod transform;
+mod unit_interval;
+mod url_resolver;
+mod viewbox;
+mod xml;
+
+#[doc(hidden)]
+pub mod bench_only {
+ pub use crate::path_builder::PathBuilder;
+ pub use crate::path_parser::Lexer;
+}
+
+#[doc(hidden)]
+pub mod doctest_only {
+ pub use crate::aspect_ratio::AspectRatio;
+ pub use crate::error::AttributeResultExt;
+ pub use crate::error::ElementError;
+ pub use crate::error::ValueErrorKind;
+ pub use crate::href::is_href;
+ pub use crate::href::set_href;
+ pub use crate::length::{Both, CssLength, Horizontal, Length, LengthUnit, ULength, Vertical};
+ pub use crate::parsers::{Parse, ParseValue};
+}
+
+#[doc(hidden)]
+pub mod rsvg_convert_only {
+ pub use crate::aspect_ratio::AspectRatio;
+ pub use crate::c_api::handle::PathOrUrl;
+ pub use crate::c_api::sizing::LegacySize;
+ pub use crate::dpi::Dpi;
+ pub use crate::error::ParseError;
+ pub use crate::length::{
+ CssLength, Horizontal, Length, Normalize, NormalizeParams, Signed, ULength, Unsigned,
+ Validate, Vertical,
+ };
+ pub use crate::parsers::{Parse, ParseValue};
+ pub use crate::rect::Rect;
+ pub use crate::viewbox::ViewBox;
+}
diff --git a/rsvg/src/limits.rs b/rsvg/src/limits.rs
new file mode 100644
index 00000000..e287767b
--- /dev/null
+++ b/rsvg/src/limits.rs
@@ -0,0 +1,52 @@
+//! Processing limits to mitigate malicious SVGs.
+
+/// Maximum number of times that elements can be referenced through URL fragments.
+///
+/// This is a mitigation for the security-related bugs:
+/// <https://gitlab.gnome.org/GNOME/librsvg/issues/323>
+/// <https://gitlab.gnome.org/GNOME/librsvg/issues/515>
+///
+/// Imagine the XML [billion laughs attack], but done in SVG's terms:
+///
+/// - #323 above creates deeply nested groups of `<use>` elements.
+/// The first one references the second one ten times, the second one
+/// references the third one ten times, and so on. In the file given,
+/// this causes 10^17 objects to be rendered. While this does not
+/// exhaust memory, it would take a really long time.
+///
+/// - #515 has deeply nested references of `<pattern>` elements. Each
+/// object inside each pattern has an attribute
+/// fill="url(#next_pattern)", so the number of final rendered objects
+/// grows exponentially.
+///
+/// We deal with both cases by placing a limit on how many references
+/// will be resolved during the SVG rendering process, that is,
+/// how many `url(#foo)` will be resolved.
+///
+/// [billion laughs attack]: https://bitbucket.org/tiran/defusedxml
+pub const MAX_REFERENCED_ELEMENTS: usize = 500_000;
+
+/// Maximum number of elements loadable per document.
+///
+/// This is a mitigation for SVG files which create millions of elements
+/// in an attempt to exhaust memory. We don't allow loading more than
+/// this number of elements during the initial streaming load process.
+pub const MAX_LOADED_ELEMENTS: usize = 1_000_000;
+
+/// Maximum number of attributes loadable per document.
+///
+/// This is here because librsvg uses u16 to address attributes. It should
+/// be essentially impossible to actually hit this limit, because the number
+/// of attributes that the SVG standard ascribes meaning to are lower than
+/// this limit.
+pub const MAX_LOADED_ATTRIBUTES: usize = u16::MAX as usize;
+
+/// Maximum level of nesting for XInclude (XML Include) files.
+///
+/// See <https://gitlab.gnome.org/GNOME/librsvg/-/issues/942>. With
+/// the use of XML like `<xi:include parse="xml" href="foo.xml"/>`, an
+/// SVG document can recursively include other XML files. This value
+/// defines a maximum level of nesting for XInclude, to prevent cases
+/// where the base document is included within itself, or when two
+/// documents recursively include each other.
+pub const MAX_XINCLUDE_DEPTH: usize = 20;
diff --git a/rsvg/src/log.rs b/rsvg/src/log.rs
new file mode 100644
index 00000000..36a363e2
--- /dev/null
+++ b/rsvg/src/log.rs
@@ -0,0 +1,75 @@
+//! Utilities for logging messages from the library.
+
+#[macro_export]
+macro_rules! rsvg_log {
+ (
+ $session:expr,
+ $($arg:tt)+
+ ) => {
+ if $session.log_enabled() {
+ println!("{}", format_args!($($arg)+));
+ }
+ };
+}
+
+/// Captures the basic state of a [`cairo::Context`] for logging purposes.
+///
+/// A librsvg "transaction" like rendering a
+/// [`crate::api::SvgHandle`], which takes a Cairo context, depends on the state of the
+/// context as it was passed in by the caller. For example, librsvg may decide to
+/// operate differently depending on the context's target surface type, or its current
+/// transformation matrix. This struct captures that sort of information.
+#[derive(Copy, Clone, Debug, PartialEq)]
+struct CairoContextState {
+ surface_type: cairo::SurfaceType,
+ matrix: cairo::Matrix,
+}
+
+impl CairoContextState {
+ #[cfg(test)]
+ fn new(cr: &cairo::Context) -> Self {
+ let surface_type = cr.target().type_();
+ let matrix = cr.matrix();
+
+ Self {
+ surface_type,
+ matrix,
+ }
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn captures_cr_state() {
+ let surface = cairo::ImageSurface::create(cairo::Format::ARgb32, 10, 10).unwrap();
+ let cr = cairo::Context::new(&surface).unwrap();
+ let state = CairoContextState::new(&cr);
+
+ assert_eq!(
+ CairoContextState {
+ surface_type: cairo::SurfaceType::Image,
+ matrix: cairo::Matrix::identity(),
+ },
+ state,
+ );
+
+ let surface = cairo::RecordingSurface::create(cairo::Content::ColorAlpha, None).unwrap();
+ let cr = cairo::Context::new(&surface).unwrap();
+ cr.scale(2.0, 3.0);
+ let state = CairoContextState::new(&cr);
+
+ let mut matrix = cairo::Matrix::identity();
+ matrix.scale(2.0, 3.0);
+
+ assert_eq!(
+ CairoContextState {
+ surface_type: cairo::SurfaceType::Recording,
+ matrix,
+ },
+ state,
+ );
+ }
+}
diff --git a/rsvg/src/marker.rs b/rsvg/src/marker.rs
new file mode 100644
index 00000000..ba2006c6
--- /dev/null
+++ b/rsvg/src/marker.rs
@@ -0,0 +1,1215 @@
+//! The `marker` element, and geometry computations for markers.
+
+use std::f64::consts::*;
+use std::ops::Deref;
+
+use cssparser::Parser;
+use markup5ever::{expanded_name, local_name, namespace_url, ns};
+
+use crate::angle::Angle;
+use crate::aspect_ratio::*;
+use crate::bbox::BoundingBox;
+use crate::document::AcquiredNodes;
+use crate::drawing_ctx::{DrawingCtx, Viewport};
+use crate::element::{set_attribute, ElementTrait};
+use crate::error::*;
+use crate::float_eq_cairo::ApproxEqCairo;
+use crate::layout::{self, Shape, StackingContext};
+use crate::length::*;
+use crate::node::{CascadedValues, Node, NodeBorrow, NodeDraw};
+use crate::parsers::{Parse, ParseValue};
+use crate::path_builder::{arc_segment, ArcParameterization, CubicBezierCurve, Path, PathCommand};
+use crate::rect::Rect;
+use crate::session::Session;
+use crate::transform::Transform;
+use crate::viewbox::*;
+use crate::xml::Attributes;
+
+// markerUnits attribute: https://www.w3.org/TR/SVG/painting.html#MarkerElement
+#[derive(Debug, Copy, Clone, PartialEq)]
+enum MarkerUnits {
+ UserSpaceOnUse,
+ StrokeWidth,
+}
+
+enum_default!(MarkerUnits, MarkerUnits::StrokeWidth);
+
+impl Parse for MarkerUnits {
+ fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<MarkerUnits, ParseError<'i>> {
+ Ok(parse_identifiers!(
+ parser,
+ "userSpaceOnUse" => MarkerUnits::UserSpaceOnUse,
+ "strokeWidth" => MarkerUnits::StrokeWidth,
+ )?)
+ }
+}
+
+// orient attribute: https://www.w3.org/TR/SVG/painting.html#MarkerElement
+#[derive(Debug, Copy, Clone, PartialEq)]
+enum MarkerOrient {
+ Auto,
+ AutoStartReverse,
+ Angle(Angle),
+}
+
+enum_default!(MarkerOrient, MarkerOrient::Angle(Angle::new(0.0)));
+
+impl Parse for MarkerOrient {
+ fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<MarkerOrient, ParseError<'i>> {
+ if parser
+ .try_parse(|p| p.expect_ident_matching("auto"))
+ .is_ok()
+ {
+ return Ok(MarkerOrient::Auto);
+ }
+
+ if parser
+ .try_parse(|p| p.expect_ident_matching("auto-start-reverse"))
+ .is_ok()
+ {
+ Ok(MarkerOrient::AutoStartReverse)
+ } else {
+ Angle::parse(parser).map(MarkerOrient::Angle)
+ }
+ }
+}
+
+pub struct Marker {
+ units: MarkerUnits,
+ ref_x: Length<Horizontal>,
+ ref_y: Length<Vertical>,
+ width: ULength<Horizontal>,
+ height: ULength<Vertical>,
+ orient: MarkerOrient,
+ aspect: AspectRatio,
+ vbox: Option<ViewBox>,
+}
+
+impl Default for Marker {
+ fn default() -> Marker {
+ Marker {
+ units: MarkerUnits::default(),
+ ref_x: Default::default(),
+ ref_y: Default::default(),
+ // the following two are per the spec
+ width: ULength::<Horizontal>::parse_str("3").unwrap(),
+ height: ULength::<Vertical>::parse_str("3").unwrap(),
+ orient: MarkerOrient::default(),
+ aspect: AspectRatio::default(),
+ vbox: None,
+ }
+ }
+}
+
+impl Marker {
+ fn render(
+ &self,
+ node: &Node,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ viewport: &Viewport,
+ draw_ctx: &mut DrawingCtx,
+ xpos: f64,
+ ypos: f64,
+ computed_angle: Angle,
+ line_width: f64,
+ clipping: bool,
+ marker_type: MarkerType,
+ marker: &layout::Marker,
+ ) -> Result<BoundingBox, RenderingError> {
+ let mut cascaded = CascadedValues::new_from_node(node);
+ cascaded.context_fill = Some(marker.context_fill.clone());
+ cascaded.context_stroke = Some(marker.context_stroke.clone());
+
+ let values = cascaded.get();
+
+ let params = NormalizeParams::new(values, viewport);
+
+ let marker_width = self.width.to_user(&params);
+ let marker_height = self.height.to_user(&params);
+
+ if marker_width.approx_eq_cairo(0.0) || marker_height.approx_eq_cairo(0.0) {
+ // markerWidth or markerHeight set to 0 disables rendering of the element
+ // https://www.w3.org/TR/SVG/painting.html#MarkerWidthAttribute
+ return Ok(draw_ctx.empty_bbox());
+ }
+
+ let rotation = match self.orient {
+ MarkerOrient::Auto => computed_angle,
+ MarkerOrient::AutoStartReverse => {
+ if marker_type == MarkerType::Start {
+ computed_angle.flip()
+ } else {
+ computed_angle
+ }
+ }
+ MarkerOrient::Angle(a) => a,
+ };
+
+ let mut transform = Transform::new_translate(xpos, ypos).pre_rotate(rotation);
+
+ if self.units == MarkerUnits::StrokeWidth {
+ transform = transform.pre_scale(line_width, line_width);
+ }
+
+ let content_viewport = if let Some(vbox) = self.vbox {
+ if vbox.is_empty() {
+ return Ok(draw_ctx.empty_bbox());
+ }
+
+ let r = self
+ .aspect
+ .compute(&vbox, &Rect::from_size(marker_width, marker_height));
+
+ let (vb_width, vb_height) = vbox.size();
+ transform = transform.pre_scale(r.width() / vb_width, r.height() / vb_height);
+
+ viewport.with_view_box(vb_width, vb_height)
+ } else {
+ viewport.with_view_box(marker_width, marker_height)
+ };
+
+ let content_params = NormalizeParams::new(values, &content_viewport);
+
+ transform = transform.pre_translate(
+ -self.ref_x.to_user(&content_params),
+ -self.ref_y.to_user(&content_params),
+ );
+
+ let clip = if values.is_overflow() {
+ None
+ } else {
+ Some(
+ self.vbox
+ .map_or_else(|| Rect::from_size(marker_width, marker_height), |vb| *vb),
+ )
+ };
+
+ let elt = node.borrow_element();
+ let stacking_ctx =
+ StackingContext::new(draw_ctx.session(), acquired_nodes, &elt, transform, values);
+
+ // FIXME: use content_viewport
+ draw_ctx.with_discrete_layer(
+ &stacking_ctx,
+ acquired_nodes,
+ &content_viewport,
+ clipping,
+ clip,
+ &mut |an, dc| node.draw_children(an, &cascaded, &content_viewport, dc, clipping),
+ )
+ }
+}
+
+impl ElementTrait for Marker {
+ fn set_attributes(&mut self, attrs: &Attributes, session: &Session) {
+ for (attr, value) in attrs.iter() {
+ match attr.expanded() {
+ expanded_name!("", "markerUnits") => {
+ set_attribute(&mut self.units, attr.parse(value), session)
+ }
+ expanded_name!("", "refX") => {
+ set_attribute(&mut self.ref_x, attr.parse(value), session)
+ }
+ expanded_name!("", "refY") => {
+ set_attribute(&mut self.ref_y, attr.parse(value), session)
+ }
+ expanded_name!("", "markerWidth") => {
+ set_attribute(&mut self.width, attr.parse(value), session)
+ }
+ expanded_name!("", "markerHeight") => {
+ set_attribute(&mut self.height, attr.parse(value), session)
+ }
+ expanded_name!("", "orient") => {
+ set_attribute(&mut self.orient, attr.parse(value), session)
+ }
+ expanded_name!("", "preserveAspectRatio") => {
+ set_attribute(&mut self.aspect, attr.parse(value), session)
+ }
+ expanded_name!("", "viewBox") => {
+ set_attribute(&mut self.vbox, attr.parse(value), session)
+ }
+ _ => (),
+ }
+ }
+ }
+}
+
+// Machinery to figure out marker orientations
+#[derive(Debug, PartialEq)]
+enum Segment {
+ Degenerate {
+ // A single lone point
+ x: f64,
+ y: f64,
+ },
+
+ LineOrCurve {
+ x1: f64,
+ y1: f64,
+ x2: f64,
+ y2: f64,
+ x3: f64,
+ y3: f64,
+ x4: f64,
+ y4: f64,
+ },
+}
+
+impl Segment {
+ fn degenerate(x: f64, y: f64) -> Segment {
+ Segment::Degenerate { x, y }
+ }
+
+ fn curve(x1: f64, y1: f64, x2: f64, y2: f64, x3: f64, y3: f64, x4: f64, y4: f64) -> Segment {
+ Segment::LineOrCurve {
+ x1,
+ y1,
+ x2,
+ y2,
+ x3,
+ y3,
+ x4,
+ y4,
+ }
+ }
+
+ fn line(x1: f64, y1: f64, x2: f64, y2: f64) -> Segment {
+ Segment::curve(x1, y1, x2, y2, x1, y1, x2, y2)
+ }
+
+ // If the segment has directionality, returns two vectors (v1x, v1y, v2x, v2y); otherwise,
+ // returns None. The vectors are the tangents at the beginning and at the end of the segment,
+ // respectively. A segment does not have directionality if it is degenerate (i.e. a single
+ // point) or a zero-length segment, i.e. where all four control points are coincident (the first
+ // and last control points may coincide, but the others may define a loop - thus nonzero length)
+ fn get_directionalities(&self) -> Option<(f64, f64, f64, f64)> {
+ match *self {
+ Segment::Degenerate { .. } => None,
+
+ Segment::LineOrCurve {
+ x1,
+ y1,
+ x2,
+ y2,
+ x3,
+ y3,
+ x4,
+ y4,
+ } => {
+ let coincide_1_and_2 = points_equal(x1, y1, x2, y2);
+ let coincide_1_and_3 = points_equal(x1, y1, x3, y3);
+ let coincide_1_and_4 = points_equal(x1, y1, x4, y4);
+ let coincide_2_and_3 = points_equal(x2, y2, x3, y3);
+ let coincide_2_and_4 = points_equal(x2, y2, x4, y4);
+ let coincide_3_and_4 = points_equal(x3, y3, x4, y4);
+
+ if coincide_1_and_2 && coincide_1_and_3 && coincide_1_and_4 {
+ None
+ } else if coincide_1_and_2 && coincide_1_and_3 {
+ Some((x4 - x1, y4 - y1, x4 - x3, y4 - y3))
+ } else if coincide_1_and_2 && coincide_3_and_4 {
+ Some((x4 - x1, y4 - y1, x4 - x1, y4 - y1))
+ } else if coincide_2_and_3 && coincide_2_and_4 {
+ Some((x2 - x1, y2 - y1, x4 - x1, y4 - y1))
+ } else if coincide_1_and_2 {
+ Some((x3 - x1, y3 - y1, x4 - x3, y4 - y3))
+ } else if coincide_3_and_4 {
+ Some((x2 - x1, y2 - y1, x4 - x2, y4 - y2))
+ } else {
+ Some((x2 - x1, y2 - y1, x4 - x3, y4 - y3))
+ }
+ }
+ }
+ }
+}
+
+fn points_equal(x1: f64, y1: f64, x2: f64, y2: f64) -> bool {
+ x1.approx_eq_cairo(x2) && y1.approx_eq_cairo(y2)
+}
+
+enum SegmentState {
+ Initial,
+ NewSubpath,
+ InSubpath,
+ ClosedSubpath,
+}
+
+#[derive(Debug, PartialEq)]
+struct Segments(Vec<Segment>);
+
+impl Deref for Segments {
+ type Target = [Segment];
+
+ fn deref(&self) -> &[Segment] {
+ &self.0
+ }
+}
+
+// This converts a path builder into a vector of curveto-like segments.
+// Each segment can be:
+//
+// 1. Segment::Degenerate => the segment is actually a single point (x, y)
+//
+// 2. Segment::LineOrCurve => either a lineto or a curveto (or the effective
+// lineto that results from a closepath).
+// We have the following points:
+// P1 = (x1, y1)
+// P2 = (x2, y2)
+// P3 = (x3, y3)
+// P4 = (x4, y4)
+//
+// The start and end points are P1 and P4, respectively.
+// The tangent at the start point is given by the vector (P2 - P1).
+// The tangent at the end point is given by the vector (P4 - P3).
+// The tangents also work if the segment refers to a lineto (they will
+// both just point in the same direction).
+impl From<&Path> for Segments {
+ fn from(path: &Path) -> Segments {
+ let mut last_x: f64;
+ let mut last_y: f64;
+
+ let mut cur_x: f64 = 0.0;
+ let mut cur_y: f64 = 0.0;
+ let mut subpath_start_x: f64 = 0.0;
+ let mut subpath_start_y: f64 = 0.0;
+
+ let mut segments = Vec::new();
+ let mut state = SegmentState::Initial;
+
+ for path_command in path.iter() {
+ last_x = cur_x;
+ last_y = cur_y;
+
+ match path_command {
+ PathCommand::MoveTo(x, y) => {
+ cur_x = x;
+ cur_y = y;
+
+ subpath_start_x = cur_x;
+ subpath_start_y = cur_y;
+
+ match state {
+ SegmentState::Initial | SegmentState::InSubpath => {
+ // Ignore the very first moveto in a sequence (Initial state),
+ // or if we were already drawing within a subpath, start
+ // a new subpath.
+ state = SegmentState::NewSubpath;
+ }
+
+ SegmentState::NewSubpath => {
+ // We had just begun a new subpath (i.e. from a moveto) and we got
+ // another moveto? Output a stray point for the
+ // previous moveto.
+ segments.push(Segment::degenerate(last_x, last_y));
+ state = SegmentState::NewSubpath;
+ }
+
+ SegmentState::ClosedSubpath => {
+ // Cairo outputs a moveto after every closepath, so that subsequent
+ // lineto/curveto commands will start at the closed vertex.
+ // We don't want to actually emit a point (a degenerate segment) in
+ // that artificial-moveto case.
+ //
+ // We'll reset to the Initial state so that a subsequent "real"
+ // moveto will be handled as the beginning of a new subpath, or a
+ // degenerate point, as usual.
+ state = SegmentState::Initial;
+ }
+ }
+ }
+
+ PathCommand::LineTo(x, y) => {
+ cur_x = x;
+ cur_y = y;
+
+ segments.push(Segment::line(last_x, last_y, cur_x, cur_y));
+
+ state = SegmentState::InSubpath;
+ }
+
+ PathCommand::CurveTo(curve) => {
+ let CubicBezierCurve {
+ pt1: (x2, y2),
+ pt2: (x3, y3),
+ to,
+ } = curve;
+ cur_x = to.0;
+ cur_y = to.1;
+
+ segments.push(Segment::curve(last_x, last_y, x2, y2, x3, y3, cur_x, cur_y));
+
+ state = SegmentState::InSubpath;
+ }
+
+ PathCommand::Arc(arc) => {
+ cur_x = arc.to.0;
+ cur_y = arc.to.1;
+
+ match arc.center_parameterization() {
+ ArcParameterization::CenterParameters {
+ center,
+ radii,
+ theta1,
+ delta_theta,
+ } => {
+ let rot = arc.x_axis_rotation;
+ let theta2 = theta1 + delta_theta;
+ let n_segs = (delta_theta / (PI * 0.5 + 0.001)).abs().ceil() as u32;
+ let d_theta = delta_theta / f64::from(n_segs);
+
+ let segment1 =
+ arc_segment(center, radii, rot, theta1, theta1 + d_theta);
+ let segment2 =
+ arc_segment(center, radii, rot, theta2 - d_theta, theta2);
+
+ let (x2, y2) = segment1.pt1;
+ let (x3, y3) = segment2.pt2;
+ segments
+ .push(Segment::curve(last_x, last_y, x2, y2, x3, y3, cur_x, cur_y));
+
+ state = SegmentState::InSubpath;
+ }
+ ArcParameterization::LineTo => {
+ segments.push(Segment::line(last_x, last_y, cur_x, cur_y));
+
+ state = SegmentState::InSubpath;
+ }
+ ArcParameterization::Omit => {}
+ }
+ }
+
+ PathCommand::ClosePath => {
+ cur_x = subpath_start_x;
+ cur_y = subpath_start_y;
+
+ segments.push(Segment::line(last_x, last_y, cur_x, cur_y));
+
+ state = SegmentState::ClosedSubpath;
+ }
+ }
+ }
+
+ if let SegmentState::NewSubpath = state {
+ // Output a lone point if we started a subpath with a moveto
+ // command, but there are no subsequent commands.
+ segments.push(Segment::degenerate(cur_x, cur_y));
+ };
+
+ Segments(segments)
+ }
+}
+
+// The SVG spec 1.1 says http://www.w3.org/TR/SVG/implnote.html#PathElementImplementationNotes
+// Certain line-capping and line-joining situations and markers
+// require that a path segment have directionality at its start and
+// end points. Zero-length path segments have no directionality. In
+// these cases, the following algorithm is used to establish
+// directionality: to determine the directionality of the start
+// point of a zero-length path segment, go backwards in the path
+// data specification within the current subpath until you find a
+// segment which has directionality at its end point (e.g., a path
+// segment with non-zero length) and use its ending direction;
+// otherwise, temporarily consider the start point to lack
+// directionality. Similarly, to determine the directionality of the
+// end point of a zero-length path segment, go forwards in the path
+// data specification within the current subpath until you find a
+// segment which has directionality at its start point (e.g., a path
+// segment with non-zero length) and use its starting direction;
+// otherwise, temporarily consider the end point to lack
+// directionality. If the start point has directionality but the end
+// point doesn't, then the end point uses the start point's
+// directionality. If the end point has directionality but the start
+// point doesn't, then the start point uses the end point's
+// directionality. Otherwise, set the directionality for the path
+// segment's start and end points to align with the positive x-axis
+// in user space.
+impl Segments {
+ fn find_incoming_angle_backwards(&self, start_index: usize) -> Option<Angle> {
+ // "go backwards ... within the current subpath until ... segment which has directionality
+ // at its end point"
+ for segment in self[..=start_index].iter().rev() {
+ match *segment {
+ Segment::Degenerate { .. } => {
+ return None; // reached the beginning of the subpath as we ran into a standalone point
+ }
+
+ Segment::LineOrCurve { .. } => match segment.get_directionalities() {
+ Some((_, _, v2x, v2y)) => {
+ return Some(Angle::from_vector(v2x, v2y));
+ }
+ None => {
+ continue;
+ }
+ },
+ }
+ }
+
+ None
+ }
+
+ fn find_outgoing_angle_forwards(&self, start_index: usize) -> Option<Angle> {
+ // "go forwards ... within the current subpath until ... segment which has directionality at
+ // its start point"
+ for segment in &self[start_index..] {
+ match *segment {
+ Segment::Degenerate { .. } => {
+ return None; // reached the end of a subpath as we ran into a standalone point
+ }
+
+ Segment::LineOrCurve { .. } => match segment.get_directionalities() {
+ Some((v1x, v1y, _, _)) => {
+ return Some(Angle::from_vector(v1x, v1y));
+ }
+ None => {
+ continue;
+ }
+ },
+ }
+ }
+
+ None
+ }
+}
+
+// From SVG's marker-start, marker-mid, marker-end properties
+#[derive(Debug, Copy, Clone, PartialEq)]
+enum MarkerType {
+ Start,
+ Middle,
+ End,
+}
+
+fn emit_marker_by_node(
+ viewport: &Viewport,
+ draw_ctx: &mut DrawingCtx,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ marker: &layout::Marker,
+ xpos: f64,
+ ypos: f64,
+ computed_angle: Angle,
+ line_width: f64,
+ clipping: bool,
+ marker_type: MarkerType,
+) -> Result<BoundingBox, RenderingError> {
+ match acquired_nodes.acquire_ref(marker.node_ref.as_ref().unwrap()) {
+ Ok(acquired) => {
+ let node = acquired.get();
+
+ let marker_elt = borrow_element_as!(node, Marker);
+
+ marker_elt.render(
+ node,
+ acquired_nodes,
+ viewport,
+ draw_ctx,
+ xpos,
+ ypos,
+ computed_angle,
+ line_width,
+ clipping,
+ marker_type,
+ marker,
+ )
+ }
+
+ Err(e) => {
+ rsvg_log!(draw_ctx.session(), "could not acquire marker: {}", e);
+ Ok(draw_ctx.empty_bbox())
+ }
+ }
+}
+
+#[derive(Debug, Copy, Clone, PartialEq)]
+enum MarkerEndpoint {
+ Start,
+ End,
+}
+
+fn emit_marker<E>(
+ segment: &Segment,
+ endpoint: MarkerEndpoint,
+ marker_type: MarkerType,
+ orient: Angle,
+ emit_fn: &mut E,
+) -> Result<BoundingBox, RenderingError>
+where
+ E: FnMut(MarkerType, f64, f64, Angle) -> Result<BoundingBox, RenderingError>,
+{
+ let (x, y) = match *segment {
+ Segment::Degenerate { x, y } => (x, y),
+
+ Segment::LineOrCurve { x1, y1, x4, y4, .. } => match endpoint {
+ MarkerEndpoint::Start => (x1, y1),
+ MarkerEndpoint::End => (x4, y4),
+ },
+ };
+
+ emit_fn(marker_type, x, y, orient)
+}
+
+pub fn render_markers_for_shape(
+ shape: &Shape,
+ viewport: &Viewport,
+ draw_ctx: &mut DrawingCtx,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ clipping: bool,
+) -> Result<BoundingBox, RenderingError> {
+ if shape.stroke.width.approx_eq_cairo(0.0) {
+ return Ok(draw_ctx.empty_bbox());
+ }
+
+ if shape.marker_start.node_ref.is_none()
+ && shape.marker_mid.node_ref.is_none()
+ && shape.marker_end.node_ref.is_none()
+ {
+ return Ok(draw_ctx.empty_bbox());
+ }
+
+ emit_markers_for_path(
+ &shape.path,
+ draw_ctx.empty_bbox(),
+ &mut |marker_type: MarkerType, x: f64, y: f64, computed_angle: Angle| {
+ let marker = match marker_type {
+ MarkerType::Start => &shape.marker_start,
+ MarkerType::Middle => &shape.marker_mid,
+ MarkerType::End => &shape.marker_end,
+ };
+
+ if marker.node_ref.is_some() {
+ emit_marker_by_node(
+ viewport,
+ draw_ctx,
+ acquired_nodes,
+ marker,
+ x,
+ y,
+ computed_angle,
+ shape.stroke.width,
+ clipping,
+ marker_type,
+ )
+ } else {
+ Ok(draw_ctx.empty_bbox())
+ }
+ },
+ )
+}
+
+fn emit_markers_for_path<E>(
+ path: &Path,
+ empty_bbox: BoundingBox,
+ emit_fn: &mut E,
+) -> Result<BoundingBox, RenderingError>
+where
+ E: FnMut(MarkerType, f64, f64, Angle) -> Result<BoundingBox, RenderingError>,
+{
+ enum SubpathState {
+ NoSubpath,
+ InSubpath,
+ }
+
+ let mut bbox = empty_bbox;
+
+ // Convert the path to a list of segments and bare points
+ let segments = Segments::from(path);
+
+ let mut subpath_state = SubpathState::NoSubpath;
+
+ for (i, segment) in segments.iter().enumerate() {
+ match *segment {
+ Segment::Degenerate { .. } => {
+ if let SubpathState::InSubpath = subpath_state {
+ assert!(i > 0);
+
+ // Got a lone point after a subpath; render the subpath's end marker first
+ let angle = segments
+ .find_incoming_angle_backwards(i - 1)
+ .unwrap_or_else(|| Angle::new(0.0));
+ let marker_bbox = emit_marker(
+ &segments[i - 1],
+ MarkerEndpoint::End,
+ MarkerType::End,
+ angle,
+ emit_fn,
+ )?;
+ bbox.insert(&marker_bbox);
+ }
+
+ // Render marker for the lone point; no directionality
+ let marker_bbox = emit_marker(
+ segment,
+ MarkerEndpoint::Start,
+ MarkerType::Middle,
+ Angle::new(0.0),
+ emit_fn,
+ )?;
+ bbox.insert(&marker_bbox);
+
+ subpath_state = SubpathState::NoSubpath;
+ }
+
+ Segment::LineOrCurve { .. } => {
+ // Not a degenerate segment
+ match subpath_state {
+ SubpathState::NoSubpath => {
+ let angle = segments
+ .find_outgoing_angle_forwards(i)
+ .unwrap_or_else(|| Angle::new(0.0));
+ let marker_bbox = emit_marker(
+ segment,
+ MarkerEndpoint::Start,
+ MarkerType::Start,
+ angle,
+ emit_fn,
+ )?;
+ bbox.insert(&marker_bbox);
+
+ subpath_state = SubpathState::InSubpath;
+ }
+
+ SubpathState::InSubpath => {
+ assert!(i > 0);
+
+ let incoming = segments.find_incoming_angle_backwards(i - 1);
+ let outgoing = segments.find_outgoing_angle_forwards(i);
+
+ let angle = match (incoming, outgoing) {
+ (Some(incoming), Some(outgoing)) => incoming.bisect(outgoing),
+ (Some(incoming), _) => incoming,
+ (_, Some(outgoing)) => outgoing,
+ _ => Angle::new(0.0),
+ };
+
+ let marker_bbox = emit_marker(
+ segment,
+ MarkerEndpoint::Start,
+ MarkerType::Middle,
+ angle,
+ emit_fn,
+ )?;
+ bbox.insert(&marker_bbox);
+ }
+ }
+ }
+ }
+ }
+
+ // Finally, render the last point
+ if !segments.is_empty() {
+ let segment = &segments[segments.len() - 1];
+ if let Segment::LineOrCurve { .. } = *segment {
+ let incoming = segments
+ .find_incoming_angle_backwards(segments.len() - 1)
+ .unwrap_or_else(|| Angle::new(0.0));
+
+ let angle = {
+ if let PathCommand::ClosePath = path.iter().nth(segments.len()).unwrap() {
+ let outgoing = segments
+ .find_outgoing_angle_forwards(0)
+ .unwrap_or_else(|| Angle::new(0.0));
+ incoming.bisect(outgoing)
+ } else {
+ incoming
+ }
+ };
+
+ let marker_bbox = emit_marker(
+ segment,
+ MarkerEndpoint::End,
+ MarkerType::End,
+ angle,
+ emit_fn,
+ )?;
+ bbox.insert(&marker_bbox);
+ }
+ }
+
+ Ok(bbox)
+}
+
+#[cfg(test)]
+mod parser_tests {
+ use super::*;
+
+ #[test]
+ fn parsing_invalid_marker_units_yields_error() {
+ assert!(MarkerUnits::parse_str("").is_err());
+ assert!(MarkerUnits::parse_str("foo").is_err());
+ }
+
+ #[test]
+ fn parses_marker_units() {
+ assert_eq!(
+ MarkerUnits::parse_str("userSpaceOnUse").unwrap(),
+ MarkerUnits::UserSpaceOnUse
+ );
+ assert_eq!(
+ MarkerUnits::parse_str("strokeWidth").unwrap(),
+ MarkerUnits::StrokeWidth
+ );
+ }
+
+ #[test]
+ fn parsing_invalid_marker_orient_yields_error() {
+ assert!(MarkerOrient::parse_str("").is_err());
+ assert!(MarkerOrient::parse_str("blah").is_err());
+ assert!(MarkerOrient::parse_str("45blah").is_err());
+ }
+
+ #[test]
+ fn parses_marker_orient() {
+ assert_eq!(MarkerOrient::parse_str("auto").unwrap(), MarkerOrient::Auto);
+ assert_eq!(
+ MarkerOrient::parse_str("auto-start-reverse").unwrap(),
+ MarkerOrient::AutoStartReverse
+ );
+
+ assert_eq!(
+ MarkerOrient::parse_str("0").unwrap(),
+ MarkerOrient::Angle(Angle::new(0.0))
+ );
+ assert_eq!(
+ MarkerOrient::parse_str("180").unwrap(),
+ MarkerOrient::Angle(Angle::from_degrees(180.0))
+ );
+ assert_eq!(
+ MarkerOrient::parse_str("180deg").unwrap(),
+ MarkerOrient::Angle(Angle::from_degrees(180.0))
+ );
+ assert_eq!(
+ MarkerOrient::parse_str("-400grad").unwrap(),
+ MarkerOrient::Angle(Angle::from_degrees(-360.0))
+ );
+ assert_eq!(
+ MarkerOrient::parse_str("1rad").unwrap(),
+ MarkerOrient::Angle(Angle::new(1.0))
+ );
+ }
+}
+
+#[cfg(test)]
+mod directionality_tests {
+ use super::*;
+ use crate::path_builder::PathBuilder;
+
+ // Single open path; the easy case
+ fn setup_open_path() -> Segments {
+ let mut builder = PathBuilder::default();
+
+ builder.move_to(10.0, 10.0);
+ builder.line_to(20.0, 10.0);
+ builder.line_to(20.0, 20.0);
+
+ Segments::from(&builder.into_path())
+ }
+
+ #[test]
+ fn path_to_segments_handles_open_path() {
+ let expected_segments: Segments = Segments(vec![
+ Segment::line(10.0, 10.0, 20.0, 10.0),
+ Segment::line(20.0, 10.0, 20.0, 20.0),
+ ]);
+
+ assert_eq!(setup_open_path(), expected_segments);
+ }
+
+ fn setup_multiple_open_subpaths() -> Segments {
+ let mut builder = PathBuilder::default();
+
+ builder.move_to(10.0, 10.0);
+ builder.line_to(20.0, 10.0);
+ builder.line_to(20.0, 20.0);
+
+ builder.move_to(30.0, 30.0);
+ builder.line_to(40.0, 30.0);
+ builder.curve_to(50.0, 35.0, 60.0, 60.0, 70.0, 70.0);
+ builder.line_to(80.0, 90.0);
+
+ Segments::from(&builder.into_path())
+ }
+
+ #[test]
+ fn path_to_segments_handles_multiple_open_subpaths() {
+ let expected_segments: Segments = Segments(vec![
+ Segment::line(10.0, 10.0, 20.0, 10.0),
+ Segment::line(20.0, 10.0, 20.0, 20.0),
+ Segment::line(30.0, 30.0, 40.0, 30.0),
+ Segment::curve(40.0, 30.0, 50.0, 35.0, 60.0, 60.0, 70.0, 70.0),
+ Segment::line(70.0, 70.0, 80.0, 90.0),
+ ]);
+
+ assert_eq!(setup_multiple_open_subpaths(), expected_segments);
+ }
+
+ // Closed subpath; must have a line segment back to the first point
+ fn setup_closed_subpath() -> Segments {
+ let mut builder = PathBuilder::default();
+
+ builder.move_to(10.0, 10.0);
+ builder.line_to(20.0, 10.0);
+ builder.line_to(20.0, 20.0);
+ builder.close_path();
+
+ Segments::from(&builder.into_path())
+ }
+
+ #[test]
+ fn path_to_segments_handles_closed_subpath() {
+ let expected_segments: Segments = Segments(vec![
+ Segment::line(10.0, 10.0, 20.0, 10.0),
+ Segment::line(20.0, 10.0, 20.0, 20.0),
+ Segment::line(20.0, 20.0, 10.0, 10.0),
+ ]);
+
+ assert_eq!(setup_closed_subpath(), expected_segments);
+ }
+
+ // Multiple closed subpaths; each must have a line segment back to their
+ // initial points, with no degenerate segments between subpaths.
+ fn setup_multiple_closed_subpaths() -> Segments {
+ let mut builder = PathBuilder::default();
+
+ builder.move_to(10.0, 10.0);
+ builder.line_to(20.0, 10.0);
+ builder.line_to(20.0, 20.0);
+ builder.close_path();
+
+ builder.move_to(30.0, 30.0);
+ builder.line_to(40.0, 30.0);
+ builder.curve_to(50.0, 35.0, 60.0, 60.0, 70.0, 70.0);
+ builder.line_to(80.0, 90.0);
+ builder.close_path();
+
+ Segments::from(&builder.into_path())
+ }
+
+ #[test]
+ fn path_to_segments_handles_multiple_closed_subpaths() {
+ let expected_segments: Segments = Segments(vec![
+ Segment::line(10.0, 10.0, 20.0, 10.0),
+ Segment::line(20.0, 10.0, 20.0, 20.0),
+ Segment::line(20.0, 20.0, 10.0, 10.0),
+ Segment::line(30.0, 30.0, 40.0, 30.0),
+ Segment::curve(40.0, 30.0, 50.0, 35.0, 60.0, 60.0, 70.0, 70.0),
+ Segment::line(70.0, 70.0, 80.0, 90.0),
+ Segment::line(80.0, 90.0, 30.0, 30.0),
+ ]);
+
+ assert_eq!(setup_multiple_closed_subpaths(), expected_segments);
+ }
+
+ // A lineto follows the first closed subpath, with no moveto to start the second subpath.
+ // The lineto must start at the first point of the first subpath.
+ fn setup_no_moveto_after_closepath() -> Segments {
+ let mut builder = PathBuilder::default();
+
+ builder.move_to(10.0, 10.0);
+ builder.line_to(20.0, 10.0);
+ builder.line_to(20.0, 20.0);
+ builder.close_path();
+
+ builder.line_to(40.0, 30.0);
+
+ Segments::from(&builder.into_path())
+ }
+
+ #[test]
+ fn path_to_segments_handles_no_moveto_after_closepath() {
+ let expected_segments: Segments = Segments(vec![
+ Segment::line(10.0, 10.0, 20.0, 10.0),
+ Segment::line(20.0, 10.0, 20.0, 20.0),
+ Segment::line(20.0, 20.0, 10.0, 10.0),
+ Segment::line(10.0, 10.0, 40.0, 30.0),
+ ]);
+
+ assert_eq!(setup_no_moveto_after_closepath(), expected_segments);
+ }
+
+ // Sequence of moveto; should generate degenerate points.
+ // This test is not enabled right now! We create the
+ // path fixtures with Cairo, and Cairo compresses
+ // sequences of moveto into a single one. So, we can't
+ // really test this, as we don't get the fixture we want.
+ //
+ // Eventually we'll probably have to switch librsvg to
+ // its own internal path representation which should
+ // allow for unelided path commands, and which should
+ // only build a cairo_path_t for the final rendering step.
+ //
+ // fn setup_sequence_of_moveto () -> Segments {
+ // let mut builder = PathBuilder::default ();
+ //
+ // builder.move_to (10.0, 10.0);
+ // builder.move_to (20.0, 20.0);
+ // builder.move_to (30.0, 30.0);
+ // builder.move_to (40.0, 40.0);
+ //
+ // Segments::from(&builder.into_path())
+ // }
+ //
+ // #[test]
+ // fn path_to_segments_handles_sequence_of_moveto () {
+ // let expected_segments: Segments = Segments(vec! [
+ // Segment::degenerate(10.0, 10.0),
+ // Segment::degenerate(20.0, 20.0),
+ // Segment::degenerate(30.0, 30.0),
+ // Segment::degenerate(40.0, 40.0),
+ // ]);
+ //
+ // assert_eq!(setup_sequence_of_moveto(), expected_segments);
+ // }
+
+ #[test]
+ fn degenerate_segment_has_no_directionality() {
+ let s = Segment::degenerate(1.0, 2.0);
+ assert!(s.get_directionalities().is_none());
+ }
+
+ #[test]
+ fn line_segment_has_directionality() {
+ let s = Segment::line(1.0, 2.0, 3.0, 4.0);
+ let (v1x, v1y, v2x, v2y) = s.get_directionalities().unwrap();
+ assert_eq!((2.0, 2.0), (v1x, v1y));
+ assert_eq!((2.0, 2.0), (v2x, v2y));
+ }
+
+ #[test]
+ fn line_segment_with_coincident_ends_has_no_directionality() {
+ let s = Segment::line(1.0, 2.0, 1.0, 2.0);
+ assert!(s.get_directionalities().is_none());
+ }
+
+ #[test]
+ fn curve_has_directionality() {
+ let s = Segment::curve(1.0, 2.0, 3.0, 5.0, 8.0, 13.0, 20.0, 33.0);
+ let (v1x, v1y, v2x, v2y) = s.get_directionalities().unwrap();
+ assert_eq!((2.0, 3.0), (v1x, v1y));
+ assert_eq!((12.0, 20.0), (v2x, v2y));
+ }
+
+ #[test]
+ fn curves_with_loops_and_coincident_ends_have_directionality() {
+ let s = Segment::curve(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 1.0, 2.0);
+ let (v1x, v1y, v2x, v2y) = s.get_directionalities().unwrap();
+ assert_eq!((2.0, 2.0), (v1x, v1y));
+ assert_eq!((-4.0, -4.0), (v2x, v2y));
+
+ let s = Segment::curve(1.0, 2.0, 1.0, 2.0, 3.0, 4.0, 1.0, 2.0);
+ let (v1x, v1y, v2x, v2y) = s.get_directionalities().unwrap();
+ assert_eq!((2.0, 2.0), (v1x, v1y));
+ assert_eq!((-2.0, -2.0), (v2x, v2y));
+
+ let s = Segment::curve(1.0, 2.0, 3.0, 4.0, 1.0, 2.0, 1.0, 2.0);
+ let (v1x, v1y, v2x, v2y) = s.get_directionalities().unwrap();
+ assert_eq!((2.0, 2.0), (v1x, v1y));
+ assert_eq!((-2.0, -2.0), (v2x, v2y));
+ }
+
+ #[test]
+ fn curve_with_coincident_control_points_has_no_directionality() {
+ let s = Segment::curve(1.0, 2.0, 1.0, 2.0, 1.0, 2.0, 1.0, 2.0);
+ assert!(s.get_directionalities().is_none());
+ }
+
+ #[test]
+ fn curve_with_123_coincident_has_directionality() {
+ let s = Segment::curve(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 20.0, 40.0);
+ let (v1x, v1y, v2x, v2y) = s.get_directionalities().unwrap();
+ assert_eq!((20.0, 40.0), (v1x, v1y));
+ assert_eq!((20.0, 40.0), (v2x, v2y));
+ }
+
+ #[test]
+ fn curve_with_234_coincident_has_directionality() {
+ let s = Segment::curve(20.0, 40.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0);
+ let (v1x, v1y, v2x, v2y) = s.get_directionalities().unwrap();
+ assert_eq!((-20.0, -40.0), (v1x, v1y));
+ assert_eq!((-20.0, -40.0), (v2x, v2y));
+ }
+
+ #[test]
+ fn curve_with_12_34_coincident_has_directionality() {
+ let s = Segment::curve(20.0, 40.0, 20.0, 40.0, 60.0, 70.0, 60.0, 70.0);
+ let (v1x, v1y, v2x, v2y) = s.get_directionalities().unwrap();
+ assert_eq!((40.0, 30.0), (v1x, v1y));
+ assert_eq!((40.0, 30.0), (v2x, v2y));
+ }
+}
+
+#[cfg(test)]
+mod marker_tests {
+ use super::*;
+ use crate::path_builder::PathBuilder;
+
+ #[test]
+ fn emits_for_open_subpath() {
+ let mut builder = PathBuilder::default();
+ builder.move_to(0.0, 0.0);
+ builder.line_to(1.0, 0.0);
+ builder.line_to(1.0, 1.0);
+ builder.line_to(0.0, 1.0);
+
+ let mut v = Vec::new();
+
+ assert!(emit_markers_for_path(
+ &builder.into_path(),
+ BoundingBox::new(),
+ &mut |marker_type: MarkerType,
+ x: f64,
+ y: f64,
+ computed_angle: Angle|
+ -> Result<BoundingBox, RenderingError> {
+ v.push((marker_type, x, y, computed_angle));
+ Ok(BoundingBox::new())
+ }
+ )
+ .is_ok());
+
+ assert_eq!(
+ v,
+ vec![
+ (MarkerType::Start, 0.0, 0.0, Angle::new(0.0)),
+ (MarkerType::Middle, 1.0, 0.0, Angle::from_vector(1.0, 1.0)),
+ (MarkerType::Middle, 1.0, 1.0, Angle::from_vector(-1.0, 1.0)),
+ (MarkerType::End, 0.0, 1.0, Angle::from_vector(-1.0, 0.0)),
+ ]
+ );
+ }
+
+ #[test]
+ fn emits_for_closed_subpath() {
+ let mut builder = PathBuilder::default();
+ builder.move_to(0.0, 0.0);
+ builder.line_to(1.0, 0.0);
+ builder.line_to(1.0, 1.0);
+ builder.line_to(0.0, 1.0);
+ builder.close_path();
+
+ let mut v = Vec::new();
+
+ assert!(emit_markers_for_path(
+ &builder.into_path(),
+ BoundingBox::new(),
+ &mut |marker_type: MarkerType,
+ x: f64,
+ y: f64,
+ computed_angle: Angle|
+ -> Result<BoundingBox, RenderingError> {
+ v.push((marker_type, x, y, computed_angle));
+ Ok(BoundingBox::new())
+ }
+ )
+ .is_ok());
+
+ assert_eq!(
+ v,
+ vec![
+ (MarkerType::Start, 0.0, 0.0, Angle::new(0.0)),
+ (MarkerType::Middle, 1.0, 0.0, Angle::from_vector(1.0, 1.0)),
+ (MarkerType::Middle, 1.0, 1.0, Angle::from_vector(-1.0, 1.0)),
+ (MarkerType::Middle, 0.0, 1.0, Angle::from_vector(-1.0, -1.0)),
+ (MarkerType::End, 0.0, 0.0, Angle::from_vector(1.0, -1.0)),
+ ]
+ );
+ }
+}
diff --git a/rsvg/src/node.rs b/rsvg/src/node.rs
new file mode 100644
index 00000000..1db4ea52
--- /dev/null
+++ b/rsvg/src/node.rs
@@ -0,0 +1,377 @@
+//! Tree nodes, the representation of SVG elements.
+//!
+//! Librsvg uses the [rctree crate][rctree] to represent the SVG tree of elements.
+//! Its [`rctree::Node`] struct provides a generic wrapper over nodes in a tree.
+//! Librsvg puts a [`NodeData`] as the type parameter of [`rctree::Node`]. For convenience,
+//! librsvg has a type alias [`Node`]` = rctree::Node<NodeData>`.
+//!
+//! Nodes are not constructed directly by callers;
+
+use markup5ever::QualName;
+use std::cell::{Ref, RefMut};
+use std::fmt;
+use std::sync::Arc;
+
+use crate::bbox::BoundingBox;
+use crate::document::AcquiredNodes;
+use crate::drawing_ctx::{DrawingCtx, Viewport};
+use crate::element::*;
+use crate::error::*;
+use crate::paint_server::PaintSource;
+use crate::properties::ComputedValues;
+use crate::session::Session;
+use crate::text::Chars;
+use crate::xml::Attributes;
+
+/// Strong reference to an element in the SVG tree.
+///
+/// See the [module documentation][self] for more information.
+pub type Node = rctree::Node<NodeData>;
+
+/// Weak reference to an element in the SVG tree.
+///
+/// See the [module documentation][self] for more information.
+pub type WeakNode = rctree::WeakNode<NodeData>;
+
+/// Data for a single DOM node.
+///
+/// ## Memory consumption
+///
+/// SVG files look like this, roughly:
+///
+/// ```xml
+/// <svg>
+/// <rect x="10" y="20"/>
+/// <path d="..."/>
+/// <text x="10" y="20">Hello</text>
+/// <!-- etc -->
+/// </svg>
+/// ```
+///
+/// Each element has a bunch of data, including the styles, which is
+/// the biggest consumer of memory within the `Element` struct. But
+/// between each element there is a text node; in the example above
+/// there are a bunch of text nodes with just whitespace (newlines and
+/// spaces), and a single text node with "`Hello`" in it from the
+/// `<text>` element.
+///
+/// ## Accessing the node's contents
+///
+/// Code that traverses the DOM tree needs to find out at runtime what
+/// each node stands for. First, use the `is_chars` or `is_element`
+/// methods from the `NodeBorrow` trait to see if you can then call
+/// `borrow_chars`, `borrow_element`, or `borrow_element_mut`.
+pub enum NodeData {
+ Element(Box<Element>),
+ Text(Box<Chars>),
+}
+
+impl NodeData {
+ pub fn new_element(session: &Session, name: &QualName, attrs: Attributes) -> NodeData {
+ NodeData::Element(Box::new(Element::new(session, name, attrs)))
+ }
+
+ pub fn new_chars(initial_text: &str) -> NodeData {
+ NodeData::Text(Box::new(Chars::new(initial_text)))
+ }
+}
+
+impl fmt::Display for NodeData {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ match *self {
+ NodeData::Element(ref e) => {
+ write!(f, "{e}")?;
+ }
+ NodeData::Text(_) => {
+ write!(f, "Chars")?;
+ }
+ }
+
+ Ok(())
+ }
+}
+
+/// Can obtain computed values from a node
+///
+/// In our tree of SVG elements (Node in our parlance), each node stores a `ComputedValues` that
+/// gets computed during the initial CSS cascade. However, sometimes nodes need to be rendered
+/// outside the normal hierarchy. For example, the `<use>` element can "instance" a subtree from
+/// elsewhere in the SVG; it causes the instanced subtree to re-cascade from the computed values for
+/// the `<use>` element.
+///
+/// You can then call the `get()` method on the resulting `CascadedValues` to get a
+/// `&ComputedValues` whose fields you can access.
+pub struct CascadedValues<'a> {
+ inner: CascadedInner<'a>,
+ pub context_stroke: Option<Arc<PaintSource>>,
+ pub context_fill: Option<Arc<PaintSource>>,
+}
+
+enum CascadedInner<'a> {
+ FromNode(Ref<'a, Element>),
+ FromValues(Box<ComputedValues>),
+}
+
+impl<'a> CascadedValues<'a> {
+ /// Creates a `CascadedValues` that has the same cascading mode as &self
+ ///
+ /// This is what nodes should normally use to draw their children from their `draw()` method.
+ /// Nodes that need to override the cascade for their children can use `new_from_values()`
+ /// instead.
+ pub fn clone_with_node(&self, node: &'a Node) -> CascadedValues<'a> {
+ match self.inner {
+ CascadedInner::FromNode(_) => CascadedValues {
+ inner: CascadedInner::FromNode(node.borrow_element()),
+ context_fill: self.context_fill.clone(),
+ context_stroke: self.context_stroke.clone(),
+ },
+
+ CascadedInner::FromValues(ref v) => CascadedValues::new_from_values(
+ node,
+ v,
+ self.context_fill.clone(),
+ self.context_stroke.clone(),
+ ),
+ }
+ }
+
+ /// Creates a `CascadedValues` that will hold the `node`'s computed values
+ ///
+ /// This is to be used only in the toplevel drawing function, or in elements like `<marker>`
+ /// that don't propagate their parent's cascade to their children. All others should use
+ /// `new()` to derive the cascade from an existing one.
+ pub fn new_from_node(node: &Node) -> CascadedValues<'_> {
+ CascadedValues {
+ inner: CascadedInner::FromNode(node.borrow_element()),
+ context_fill: None,
+ context_stroke: None,
+ }
+ }
+
+ /// Creates a `CascadedValues` that will override the `node`'s cascade with the specified
+ /// `values`
+ ///
+ /// This is for the `<use>` element, which draws the element which it references with the
+ /// `<use>`'s own cascade, not with the element's original cascade.
+ pub fn new_from_values(
+ node: &'a Node,
+ values: &ComputedValues,
+ fill: Option<Arc<PaintSource>>,
+ stroke: Option<Arc<PaintSource>>,
+ ) -> CascadedValues<'a> {
+ let mut v = Box::new(values.clone());
+ node.borrow_element()
+ .get_specified_values()
+ .to_computed_values(&mut v);
+
+ CascadedValues {
+ inner: CascadedInner::FromValues(v),
+ context_fill: fill,
+ context_stroke: stroke,
+ }
+ }
+
+ /// Returns the cascaded `ComputedValues`.
+ ///
+ /// Nodes should use this from their `Draw::draw()` implementation to get the
+ /// `ComputedValues` from the `CascadedValues` that got passed to `draw()`.
+ pub fn get(&'a self) -> &'a ComputedValues {
+ match self.inner {
+ CascadedInner::FromNode(ref e) => e.get_computed_values(),
+ CascadedInner::FromValues(ref v) => v,
+ }
+
+ // if values.fill == "context-fill" {
+ // values.fill=self.context_fill
+ // }
+ // if values.stroke == "context-stroke" {
+ // values.stroke=self.context_stroke
+ // }
+ }
+}
+
+/// Helper trait to get different NodeData variants
+pub trait NodeBorrow {
+ /// Returns `false` for NodeData::Text, `true` otherwise.
+ fn is_element(&self) -> bool;
+
+ /// Returns `true` for NodeData::Text, `false` otherwise.
+ fn is_chars(&self) -> bool;
+
+ /// Borrows a `Chars` reference.
+ ///
+ /// Panics: will panic if `&self` is not a `NodeData::Text` node
+ fn borrow_chars(&self) -> Ref<'_, Chars>;
+
+ /// Borrows an `Element` reference
+ ///
+ /// Panics: will panic if `&self` is not a `NodeData::Element` node
+ fn borrow_element(&self) -> Ref<'_, Element>;
+
+ /// Borrows an `Element` reference mutably
+ ///
+ /// Panics: will panic if `&self` is not a `NodeData::Element` node
+ fn borrow_element_mut(&mut self) -> RefMut<'_, Element>;
+
+ /// Borrows an `ElementData` reference to the concrete element type.
+ ///
+ /// Panics: will panic if `&self` is not a `NodeData::Element` node
+ fn borrow_element_data(&self) -> Ref<'_, ElementData>;
+}
+
+impl NodeBorrow for Node {
+ fn is_element(&self) -> bool {
+ matches!(*self.borrow(), NodeData::Element(_))
+ }
+
+ fn is_chars(&self) -> bool {
+ matches!(*self.borrow(), NodeData::Text(_))
+ }
+
+ fn borrow_chars(&self) -> Ref<'_, Chars> {
+ Ref::map(self.borrow(), |n| match n {
+ NodeData::Text(c) => &**c,
+ _ => panic!("tried to borrow_chars for a non-text node"),
+ })
+ }
+
+ fn borrow_element(&self) -> Ref<'_, Element> {
+ Ref::map(self.borrow(), |n| match n {
+ NodeData::Element(e) => &**e,
+ _ => panic!("tried to borrow_element for a non-element node"),
+ })
+ }
+
+ fn borrow_element_mut(&mut self) -> RefMut<'_, Element> {
+ RefMut::map(self.borrow_mut(), |n| match &mut *n {
+ NodeData::Element(e) => &mut **e,
+ _ => panic!("tried to borrow_element_mut for a non-element node"),
+ })
+ }
+
+ fn borrow_element_data(&self) -> Ref<'_, ElementData> {
+ Ref::map(self.borrow(), |n| match n {
+ NodeData::Element(e) => &e.element_data,
+ _ => panic!("tried to borrow_element_data for a non-element node"),
+ })
+ }
+}
+
+#[macro_export]
+macro_rules! is_element_of_type {
+ ($node:expr, $element_type:ident) => {
+ matches!(
+ $node.borrow_element().element_data,
+ $crate::element::ElementData::$element_type(_)
+ )
+ };
+}
+
+#[macro_export]
+macro_rules! borrow_element_as {
+ ($node:expr, $element_type:ident) => {
+ std::cell::Ref::map($node.borrow_element_data(), |d| match d {
+ $crate::element::ElementData::$element_type(ref e) => &*e,
+ _ => panic!("tried to borrow_element_as {}", stringify!($element_type)),
+ })
+ };
+}
+
+/// Helper trait for cascading recursively
+pub trait NodeCascade {
+ fn cascade(&mut self, values: &ComputedValues);
+}
+
+impl NodeCascade for Node {
+ fn cascade(&mut self, values: &ComputedValues) {
+ let mut values = values.clone();
+
+ {
+ let mut elt = self.borrow_element_mut();
+
+ elt.get_specified_values().to_computed_values(&mut values);
+ elt.set_computed_values(&values);
+ }
+
+ for mut child in self.children().filter(|c| c.is_element()) {
+ child.cascade(&values);
+ }
+ }
+}
+
+/// Helper trait for drawing recursively.
+///
+/// This is a trait because [`Node`] is a type alias over [`rctree::Node`], not a concrete type.
+pub trait NodeDraw {
+ fn draw(
+ &self,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ cascaded: &CascadedValues<'_>,
+ viewport: &Viewport,
+ draw_ctx: &mut DrawingCtx,
+ clipping: bool,
+ ) -> Result<BoundingBox, RenderingError>;
+
+ fn draw_children(
+ &self,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ cascaded: &CascadedValues<'_>,
+ viewport: &Viewport,
+ draw_ctx: &mut DrawingCtx,
+ clipping: bool,
+ ) -> Result<BoundingBox, RenderingError>;
+}
+
+impl NodeDraw for Node {
+ fn draw(
+ &self,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ cascaded: &CascadedValues<'_>,
+ viewport: &Viewport,
+ draw_ctx: &mut DrawingCtx,
+ clipping: bool,
+ ) -> Result<BoundingBox, RenderingError> {
+ match *self.borrow() {
+ NodeData::Element(ref e) => {
+ match e.draw(self, acquired_nodes, cascaded, viewport, draw_ctx, clipping) {
+ Ok(bbox) => Ok(bbox),
+
+ // https://www.w3.org/TR/css-transforms-1/#transform-function-lists
+ //
+ // "If a transform function causes the current transformation matrix of an
+ // object to be non-invertible, the object and its content do not get
+ // displayed."
+ Err(RenderingError::InvalidTransform) => Ok(draw_ctx.empty_bbox()),
+
+ Err(e) => Err(e),
+ }
+ }
+
+ _ => Ok(draw_ctx.empty_bbox()),
+ }
+ }
+
+ fn draw_children(
+ &self,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ cascaded: &CascadedValues<'_>,
+ viewport: &Viewport,
+ draw_ctx: &mut DrawingCtx,
+ clipping: bool,
+ ) -> Result<BoundingBox, RenderingError> {
+ let mut bbox = draw_ctx.empty_bbox();
+
+ for child in self.children().filter(|c| c.is_element()) {
+ let child_bbox = draw_ctx.draw_node_from_stack(
+ &child,
+ acquired_nodes,
+ &CascadedValues::clone_with_node(cascaded, &child),
+ viewport,
+ clipping,
+ )?;
+ bbox.insert(&child_bbox);
+ }
+
+ Ok(bbox)
+ }
+}
diff --git a/rsvg/src/paint_server.rs b/rsvg/src/paint_server.rs
new file mode 100644
index 00000000..01393b8d
--- /dev/null
+++ b/rsvg/src/paint_server.rs
@@ -0,0 +1,413 @@
+//! SVG paint servers.
+
+use std::sync::Arc;
+
+use cssparser::Parser;
+
+use crate::document::{AcquiredNodes, NodeId};
+use crate::drawing_ctx::Viewport;
+use crate::element::ElementData;
+use crate::error::{AcquireError, NodeIdError, ParseError, ValueErrorKind};
+use crate::gradient::{ResolvedGradient, UserSpaceGradient};
+use crate::length::NormalizeValues;
+use crate::node::NodeBorrow;
+use crate::parsers::Parse;
+use crate::pattern::{ResolvedPattern, UserSpacePattern};
+use crate::rect::Rect;
+use crate::session::Session;
+use crate::unit_interval::UnitInterval;
+use crate::util;
+
+/// Unresolved SVG paint server straight from the DOM data.
+///
+/// This is either a solid color (which if `currentColor` needs to be extracted from the
+/// `ComputedValues`), or a paint server like a gradient or pattern which is referenced by
+/// a URL that points to a certain document node.
+///
+/// Use [`PaintServer.resolve`](#method.resolve) to turn this into a [`PaintSource`].
+#[derive(Debug, Clone, PartialEq)]
+pub enum PaintServer {
+ /// For example, `fill="none"`.
+ None,
+
+ /// For example, `fill="url(#some_gradient) fallback_color"`.
+ Iri {
+ iri: Box<NodeId>,
+ alternate: Option<cssparser::Color>,
+ },
+
+ /// For example, `fill="blue"`.
+ SolidColor(cssparser::Color),
+
+ /// For example, `fill="context-fill"`
+ ContextFill,
+
+ /// For example, `fill="context-stroke"`
+ ContextStroke,
+}
+
+/// Paint server with resolved references, with unnormalized lengths.
+///
+/// Use [`PaintSource.to_user_space`](#method.to_user_space) to turn this into a
+/// [`UserSpacePaintSource`].
+pub enum PaintSource {
+ None,
+ Gradient(ResolvedGradient, Option<cssparser::RGBA>),
+ Pattern(ResolvedPattern, Option<cssparser::RGBA>),
+ SolidColor(cssparser::RGBA),
+}
+
+/// Fully resolved paint server, in user-space units.
+///
+/// This has everything required for rendering.
+pub enum UserSpacePaintSource {
+ None,
+ Gradient(UserSpaceGradient, Option<cssparser::RGBA>),
+ Pattern(UserSpacePattern, Option<cssparser::RGBA>),
+ SolidColor(cssparser::RGBA),
+}
+
+impl Parse for PaintServer {
+ fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<PaintServer, ParseError<'i>> {
+ if parser
+ .try_parse(|i| i.expect_ident_matching("none"))
+ .is_ok()
+ {
+ Ok(PaintServer::None)
+ } else if parser
+ .try_parse(|i| i.expect_ident_matching("context-fill"))
+ .is_ok()
+ {
+ Ok(PaintServer::ContextFill)
+ } else if parser
+ .try_parse(|i| i.expect_ident_matching("context-stroke"))
+ .is_ok()
+ {
+ Ok(PaintServer::ContextStroke)
+ } else if let Ok(url) = parser.try_parse(|i| i.expect_url()) {
+ let loc = parser.current_source_location();
+
+ let alternate = if !parser.is_exhausted() {
+ if parser
+ .try_parse(|i| i.expect_ident_matching("none"))
+ .is_ok()
+ {
+ None
+ } else {
+ Some(parser.try_parse(cssparser::Color::parse)?)
+ }
+ } else {
+ None
+ };
+
+ Ok(PaintServer::Iri {
+ iri: Box::new(
+ NodeId::parse(&url)
+ .map_err(|e: NodeIdError| -> ValueErrorKind { e.into() })
+ .map_err(|e| loc.new_custom_error(e))?,
+ ),
+ alternate,
+ })
+ } else {
+ Ok(cssparser::Color::parse(parser).map(PaintServer::SolidColor)?)
+ }
+ }
+}
+
+impl PaintServer {
+ /// Resolves colors, plus node references for gradients and patterns.
+ ///
+ /// `opacity` depends on `strokeOpacity` or `fillOpacity` depending on whether
+ /// the paint server is for the `stroke` or `fill` properties.
+ ///
+ /// `current_color` should be the value of `ComputedValues.color()`.
+ ///
+ /// After a paint server is resolved, the resulting [`PaintSource`] can be used in
+ /// many places: for an actual shape, or for the `context-fill` of a marker for that
+ /// shape. Therefore, this returns an [`Arc`] so that the `PaintSource` may be shared
+ /// easily.
+ pub fn resolve(
+ &self,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ opacity: UnitInterval,
+ current_color: cssparser::RGBA,
+ context_fill: Option<Arc<PaintSource>>,
+ context_stroke: Option<Arc<PaintSource>>,
+ session: &Session,
+ ) -> Arc<PaintSource> {
+ match self {
+ PaintServer::Iri {
+ ref iri,
+ ref alternate,
+ } => acquired_nodes
+ .acquire(iri)
+ .and_then(|acquired| {
+ let node = acquired.get();
+ assert!(node.is_element());
+
+ match *node.borrow_element_data() {
+ ElementData::LinearGradient(ref g) => {
+ g.resolve(node, acquired_nodes, opacity).map(|g| {
+ Arc::new(PaintSource::Gradient(
+ g,
+ alternate.map(|c| resolve_color(&c, opacity, current_color)),
+ ))
+ })
+ }
+ ElementData::Pattern(ref p) => {
+ p.resolve(node, acquired_nodes, opacity, session).map(|p| {
+ Arc::new(PaintSource::Pattern(
+ p,
+ alternate.map(|c| resolve_color(&c, opacity, current_color)),
+ ))
+ })
+ }
+ ElementData::RadialGradient(ref g) => {
+ g.resolve(node, acquired_nodes, opacity).map(|g| {
+ Arc::new(PaintSource::Gradient(
+ g,
+ alternate.map(|c| resolve_color(&c, opacity, current_color)),
+ ))
+ })
+ }
+ _ => Err(AcquireError::InvalidLinkType(iri.as_ref().clone())),
+ }
+ })
+ .unwrap_or_else(|_| match alternate {
+ // The following cases catch AcquireError::CircularReference and
+ // AcquireError::MaxReferencesExceeded.
+ //
+ // Circular references mean that there is a pattern or gradient with a
+ // reference cycle in its "href" attribute. This is an invalid paint
+ // server, and per
+ // https://www.w3.org/TR/SVG2/painting.html#SpecifyingPaint we should
+ // try to fall back to the alternate color.
+ //
+ // Exceeding the maximum number of references will get caught again
+ // later in the drawing code, so it should be fine to translate this
+ // condition to that for an invalid paint server.
+ Some(color) => {
+ rsvg_log!(
+ session,
+ "could not resolve paint server \"{}\", using alternate color",
+ iri
+ );
+
+ Arc::new(PaintSource::SolidColor(resolve_color(
+ color,
+ opacity,
+ current_color,
+ )))
+ }
+
+ None => {
+ rsvg_log!(
+ session,
+ "could not resolve paint server \"{}\", no alternate color specified",
+ iri
+ );
+
+ Arc::new(PaintSource::None)
+ }
+ }),
+
+ PaintServer::SolidColor(color) => Arc::new(PaintSource::SolidColor(resolve_color(
+ color,
+ opacity,
+ current_color,
+ ))),
+
+ PaintServer::ContextFill => {
+ if let Some(paint) = context_fill {
+ paint
+ } else {
+ Arc::new(PaintSource::None)
+ }
+ }
+
+ PaintServer::ContextStroke => {
+ if let Some(paint) = context_stroke {
+ paint
+ } else {
+ Arc::new(PaintSource::None)
+ }
+ }
+
+ PaintServer::None => Arc::new(PaintSource::None),
+ }
+ }
+}
+
+impl PaintSource {
+ /// Converts lengths to user-space.
+ pub fn to_user_space(
+ &self,
+ object_bbox: &Option<Rect>,
+ viewport: &Viewport,
+ values: &NormalizeValues,
+ ) -> UserSpacePaintSource {
+ match *self {
+ PaintSource::None => UserSpacePaintSource::None,
+ PaintSource::SolidColor(c) => UserSpacePaintSource::SolidColor(c),
+
+ PaintSource::Gradient(ref g, c) => {
+ match (g.to_user_space(object_bbox, viewport, values), c) {
+ (Some(gradient), c) => UserSpacePaintSource::Gradient(gradient, c),
+ (None, Some(c)) => UserSpacePaintSource::SolidColor(c),
+ (None, None) => UserSpacePaintSource::None,
+ }
+ }
+
+ PaintSource::Pattern(ref p, c) => {
+ match (p.to_user_space(object_bbox, viewport, values), c) {
+ (Some(pattern), c) => UserSpacePaintSource::Pattern(pattern, c),
+ (None, Some(c)) => UserSpacePaintSource::SolidColor(c),
+ (None, None) => UserSpacePaintSource::None,
+ }
+ }
+ }
+ }
+}
+
+/// Resolves a CSS color into an RGBA value.
+///
+/// A CSS color can be `currentColor`, in which case the computed value comes from
+/// the `color` property. You should pass the `color` property's value for `current_color`.
+pub fn resolve_color(
+ color: &cssparser::Color,
+ opacity: UnitInterval,
+ current_color: cssparser::RGBA,
+) -> cssparser::RGBA {
+ let rgba = match *color {
+ cssparser::Color::RGBA(rgba) => rgba,
+ cssparser::Color::CurrentColor => current_color,
+ };
+
+ let UnitInterval(o) = opacity;
+
+ let alpha = (f64::from(rgba.alpha) * o).round();
+ let alpha = util::clamp(alpha, 0.0, 255.0);
+ let alpha = cast::u8(alpha).unwrap();
+
+ cssparser::RGBA { alpha, ..rgba }
+}
+
+impl std::fmt::Debug for PaintSource {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> {
+ match *self {
+ PaintSource::None => f.write_str("PaintSource::None"),
+ PaintSource::Gradient(_, _) => f.write_str("PaintSource::Gradient"),
+ PaintSource::Pattern(_, _) => f.write_str("PaintSource::Pattern"),
+ PaintSource::SolidColor(_) => f.write_str("PaintSource::SolidColor"),
+ }
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn catches_invalid_syntax() {
+ assert!(PaintServer::parse_str("").is_err());
+ assert!(PaintServer::parse_str("42").is_err());
+ assert!(PaintServer::parse_str("invalid").is_err());
+ }
+
+ #[test]
+ fn parses_none() {
+ assert_eq!(PaintServer::parse_str("none").unwrap(), PaintServer::None);
+ }
+
+ #[test]
+ fn parses_solid_color() {
+ assert_eq!(
+ PaintServer::parse_str("rgb(255, 128, 64, 0.5)").unwrap(),
+ PaintServer::SolidColor(cssparser::Color::RGBA(cssparser::RGBA::new(
+ 255, 128, 64, 128
+ )))
+ );
+
+ assert_eq!(
+ PaintServer::parse_str("currentColor").unwrap(),
+ PaintServer::SolidColor(cssparser::Color::CurrentColor)
+ );
+ }
+
+ #[test]
+ fn parses_iri() {
+ assert_eq!(
+ PaintServer::parse_str("url(#link)").unwrap(),
+ PaintServer::Iri {
+ iri: Box::new(NodeId::Internal("link".to_string())),
+ alternate: None,
+ }
+ );
+
+ assert_eq!(
+ PaintServer::parse_str("url(foo#link) none").unwrap(),
+ PaintServer::Iri {
+ iri: Box::new(NodeId::External("foo".to_string(), "link".to_string())),
+ alternate: None,
+ }
+ );
+
+ assert_eq!(
+ PaintServer::parse_str("url(#link) #ff8040").unwrap(),
+ PaintServer::Iri {
+ iri: Box::new(NodeId::Internal("link".to_string())),
+ alternate: Some(cssparser::Color::RGBA(cssparser::RGBA::new(
+ 255, 128, 64, 255
+ ))),
+ }
+ );
+
+ assert_eq!(
+ PaintServer::parse_str("url(#link) rgb(255, 128, 64, 0.5)").unwrap(),
+ PaintServer::Iri {
+ iri: Box::new(NodeId::Internal("link".to_string())),
+ alternate: Some(cssparser::Color::RGBA(cssparser::RGBA::new(
+ 255, 128, 64, 128
+ ))),
+ }
+ );
+
+ assert_eq!(
+ PaintServer::parse_str("url(#link) currentColor").unwrap(),
+ PaintServer::Iri {
+ iri: Box::new(NodeId::Internal("link".to_string())),
+ alternate: Some(cssparser::Color::CurrentColor),
+ }
+ );
+
+ assert!(PaintServer::parse_str("url(#link) invalid").is_err());
+ }
+
+ #[test]
+ fn resolves_explicit_color() {
+ use cssparser::{Color, RGBA};
+
+ assert_eq!(
+ resolve_color(
+ &Color::RGBA(RGBA::new(255, 0, 0, 128)),
+ UnitInterval::clamp(0.5),
+ RGBA::new(0, 255, 0, 255)
+ ),
+ RGBA::new(255, 0, 0, 64),
+ );
+ }
+
+ #[test]
+ fn resolves_current_color() {
+ use cssparser::{Color, RGBA};
+
+ assert_eq!(
+ resolve_color(
+ &Color::CurrentColor,
+ UnitInterval::clamp(0.5),
+ RGBA::new(0, 255, 0, 128)
+ ),
+ RGBA::new(0, 255, 0, 64),
+ );
+ }
+}
diff --git a/rsvg/src/parsers.rs b/rsvg/src/parsers.rs
new file mode 100644
index 00000000..7dd3e441
--- /dev/null
+++ b/rsvg/src/parsers.rs
@@ -0,0 +1,424 @@
+//! The `Parse` trait for CSS properties, and utilities for parsers.
+
+use cssparser::{Parser, ParserInput, Token};
+use markup5ever::QualName;
+use std::str;
+
+use crate::error::*;
+
+/// Trait to parse values using `cssparser::Parser`.
+pub trait Parse: Sized {
+ /// Parses a value out of the `parser`.
+ ///
+ /// All value types should implement this for composability.
+ fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<Self, ParseError<'i>>;
+
+ /// Convenience function to parse a value out of a `&str`.
+ ///
+ /// This is useful mostly for tests which want to avoid creating a
+ /// `cssparser::Parser` by hand. Property types do not need to reimplement this.
+ fn parse_str(s: &str) -> Result<Self, ParseError<'_>> {
+ let mut input = ParserInput::new(s);
+ let mut parser = Parser::new(&mut input);
+
+ let res = Self::parse(&mut parser)?;
+ parser.expect_exhausted()?;
+
+ Ok(res)
+ }
+}
+
+/// Consumes a comma if it exists, or does nothing.
+pub fn optional_comma(parser: &mut Parser<'_, '_>) {
+ let _ = parser.try_parse(|p| p.expect_comma());
+}
+
+/// Parses an `f32` and ensures that it is not an infinity or NaN.
+pub fn finite_f32(n: f32) -> Result<f32, ValueErrorKind> {
+ if n.is_finite() {
+ Ok(n)
+ } else {
+ Err(ValueErrorKind::Value("expected finite number".to_string()))
+ }
+}
+
+pub trait ParseValue<T: Parse> {
+ /// Parses a `value` string into a type `T`.
+ fn parse(&self, value: &str) -> Result<T, ElementError>;
+}
+
+impl<T: Parse> ParseValue<T> for QualName {
+ fn parse(&self, value: &str) -> Result<T, ElementError> {
+ let mut input = ParserInput::new(value);
+ let mut parser = Parser::new(&mut input);
+
+ T::parse(&mut parser).attribute(self.clone())
+ }
+}
+
+impl<T: Parse> Parse for Option<T> {
+ fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<Self, ParseError<'i>> {
+ T::parse(parser).map(Some)
+ }
+}
+
+impl Parse for f64 {
+ fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<Self, ParseError<'i>> {
+ let loc = parser.current_source_location();
+ let n = parser.expect_number()?;
+ if n.is_finite() {
+ Ok(f64::from(n))
+ } else {
+ Err(loc.new_custom_error(ValueErrorKind::value_error("expected finite number")))
+ }
+ }
+}
+
+/// Non-Negative number
+#[derive(Debug, Copy, Clone, PartialEq)]
+pub struct NonNegative(pub f64);
+
+impl Parse for NonNegative {
+ fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<Self, ParseError<'i>> {
+ let loc = parser.current_source_location();
+ let n = Parse::parse(parser)?;
+ if n >= 0.0 {
+ Ok(NonNegative(n))
+ } else {
+ Err(loc.new_custom_error(ValueErrorKind::value_error("expected non negative number")))
+ }
+ }
+}
+
+/// CSS number-optional-number
+///
+/// SVG1.1: <https://www.w3.org/TR/SVG11/types.html#DataTypeNumberOptionalNumber>
+#[derive(Debug, Copy, Clone, PartialEq)]
+pub struct NumberOptionalNumber<T: Parse>(pub T, pub T);
+
+impl<T: Parse + Copy> Parse for NumberOptionalNumber<T> {
+ fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<Self, ParseError<'i>> {
+ let x = Parse::parse(parser)?;
+
+ if !parser.is_exhausted() {
+ optional_comma(parser);
+ let y = Parse::parse(parser)?;
+ Ok(NumberOptionalNumber(x, y))
+ } else {
+ Ok(NumberOptionalNumber(x, x))
+ }
+ }
+}
+
+/// CSS number-percentage
+///
+/// CSS Values and Units 3: <https://www.w3.org/TR/css3-values/#typedef-number-percentage>
+#[derive(Debug, Copy, Clone, PartialEq)]
+pub struct NumberOrPercentage {
+ pub value: f64,
+}
+
+impl Parse for NumberOrPercentage {
+ fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<Self, ParseError<'i>> {
+ let loc = parser.current_source_location();
+
+ let value = match parser.next()? {
+ Token::Number { value, .. } => Ok(*value),
+ Token::Percentage { unit_value, .. } => Ok(*unit_value),
+ tok => Err(loc.new_unexpected_token_error(tok.clone())),
+ }?;
+
+ let v = finite_f32(value).map_err(|e| parser.new_custom_error(e))?;
+ Ok(NumberOrPercentage {
+ value: f64::from(v),
+ })
+ }
+}
+
+impl Parse for i32 {
+ /// CSS integer
+ ///
+ /// SVG1.1: <https://www.w3.org/TR/SVG11/types.html#DataTypeInteger>
+ fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<Self, ParseError<'i>> {
+ Ok(parser.expect_integer()?)
+ }
+}
+
+impl Parse for u32 {
+ fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<Self, ParseError<'i>> {
+ let loc = parser.current_source_location();
+ let n = parser.expect_integer()?;
+ if n >= 0 {
+ Ok(n as u32)
+ } else {
+ Err(loc.new_custom_error(ValueErrorKind::value_error("expected unsigned number")))
+ }
+ }
+}
+
+/// Number lists with bounds for the required and maximum number of items.
+#[derive(Clone, Debug, PartialEq)]
+pub struct NumberList<const REQUIRED: usize, const MAX: usize>(pub Vec<f64>);
+
+impl<const REQUIRED: usize, const MAX: usize> Parse for NumberList<REQUIRED, MAX> {
+ fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<Self, ParseError<'i>> {
+ let loc = parser.current_source_location();
+ let mut v = Vec::<f64>::with_capacity(MAX);
+ for i in 0..MAX {
+ if i != 0 {
+ optional_comma(parser);
+ }
+
+ v.push(f64::parse(parser)?);
+
+ if parser.is_exhausted() {
+ break;
+ }
+ }
+
+ if REQUIRED > 0 && v.len() < REQUIRED {
+ Err(loc.new_custom_error(ValueErrorKind::value_error("expected more numbers")))
+ } else {
+ Ok(NumberList(v))
+ }
+ }
+}
+
+/// Parses a list of identifiers from a `cssparser::Parser`
+///
+/// # Example
+///
+/// ```
+/// # use cssparser::{ParserInput, Parser};
+/// # use rsvg::parse_identifiers;
+/// # fn main() -> Result<(), cssparser::BasicParseError<'static>> {
+/// # let mut input = ParserInput::new("true");
+/// # let mut parser = Parser::new(&mut input);
+/// let my_boolean = parse_identifiers!(
+/// parser,
+/// "true" => true,
+/// "false" => false,
+/// )?;
+/// # Ok(())
+/// # }
+/// ```
+#[macro_export]
+macro_rules! parse_identifiers {
+ ($parser:expr,
+ $($str:expr => $val:expr,)+) => {
+ {
+ let loc = $parser.current_source_location();
+ let token = $parser.next()?;
+
+ match token {
+ $(cssparser::Token::Ident(ref cow) if cow.eq_ignore_ascii_case($str) => Ok($val),)+
+
+ _ => Err(loc.new_basic_unexpected_token_error(token.clone()))
+ }
+ }
+ };
+}
+
+/// CSS Custom identifier.
+///
+/// CSS Values and Units 4: <https://www.w3.org/TR/css-values-4/#custom-idents>
+#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+pub struct CustomIdent(pub String);
+
+impl Parse for CustomIdent {
+ fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<Self, ParseError<'i>> {
+ let loc = parser.current_source_location();
+ let token = parser.next()?;
+
+ match token {
+ // CSS-wide keywords and "default" are errors here
+ // https://www.w3.org/TR/css-values-4/#css-wide-keywords
+ Token::Ident(ref cow) => {
+ for s in &["initial", "inherit", "unset", "default"] {
+ if cow.eq_ignore_ascii_case(s) {
+ return Err(loc.new_basic_unexpected_token_error(token.clone()).into());
+ }
+ }
+
+ Ok(CustomIdent(cow.as_ref().to_string()))
+ }
+
+ _ => Err(loc.new_basic_unexpected_token_error(token.clone()).into()),
+ }
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn parses_number_optional_number() {
+ assert_eq!(
+ NumberOptionalNumber::parse_str("1, 2").unwrap(),
+ NumberOptionalNumber(1.0, 2.0)
+ );
+ assert_eq!(
+ NumberOptionalNumber::parse_str("1 2").unwrap(),
+ NumberOptionalNumber(1.0, 2.0)
+ );
+ assert_eq!(
+ NumberOptionalNumber::parse_str("1").unwrap(),
+ NumberOptionalNumber(1.0, 1.0)
+ );
+
+ assert_eq!(
+ NumberOptionalNumber::parse_str("-1, -2").unwrap(),
+ NumberOptionalNumber(-1.0, -2.0)
+ );
+ assert_eq!(
+ NumberOptionalNumber::parse_str("-1 -2").unwrap(),
+ NumberOptionalNumber(-1.0, -2.0)
+ );
+ assert_eq!(
+ NumberOptionalNumber::parse_str("-1").unwrap(),
+ NumberOptionalNumber(-1.0, -1.0)
+ );
+ }
+
+ #[test]
+ fn invalid_number_optional_number() {
+ assert!(NumberOptionalNumber::<f64>::parse_str("").is_err());
+ assert!(NumberOptionalNumber::<f64>::parse_str("1x").is_err());
+ assert!(NumberOptionalNumber::<f64>::parse_str("x1").is_err());
+ assert!(NumberOptionalNumber::<f64>::parse_str("1 x").is_err());
+ assert!(NumberOptionalNumber::<f64>::parse_str("1 , x").is_err());
+ assert!(NumberOptionalNumber::<f64>::parse_str("1 , 2x").is_err());
+ assert!(NumberOptionalNumber::<f64>::parse_str("1 2 x").is_err());
+ }
+
+ #[test]
+ fn parses_integer() {
+ assert_eq!(i32::parse_str("0").unwrap(), 0);
+ assert_eq!(i32::parse_str("1").unwrap(), 1);
+ assert_eq!(i32::parse_str("-1").unwrap(), -1);
+
+ assert_eq!(u32::parse_str("0").unwrap(), 0);
+ assert_eq!(u32::parse_str("1").unwrap(), 1);
+ }
+
+ #[test]
+ fn invalid_integer() {
+ assert!(i32::parse_str("").is_err());
+ assert!(i32::parse_str("1x").is_err());
+ assert!(i32::parse_str("1.5").is_err());
+
+ assert!(u32::parse_str("").is_err());
+ assert!(u32::parse_str("1x").is_err());
+ assert!(u32::parse_str("1.5").is_err());
+ assert!(u32::parse_str("-1").is_err());
+ }
+
+ #[test]
+ fn parses_integer_optional_integer() {
+ assert_eq!(
+ NumberOptionalNumber::parse_str("1, 2").unwrap(),
+ NumberOptionalNumber(1, 2)
+ );
+ assert_eq!(
+ NumberOptionalNumber::parse_str("1 2").unwrap(),
+ NumberOptionalNumber(1, 2)
+ );
+ assert_eq!(
+ NumberOptionalNumber::parse_str("1").unwrap(),
+ NumberOptionalNumber(1, 1)
+ );
+
+ assert_eq!(
+ NumberOptionalNumber::parse_str("-1, -2").unwrap(),
+ NumberOptionalNumber(-1, -2)
+ );
+ assert_eq!(
+ NumberOptionalNumber::parse_str("-1 -2").unwrap(),
+ NumberOptionalNumber(-1, -2)
+ );
+ assert_eq!(
+ NumberOptionalNumber::parse_str("-1").unwrap(),
+ NumberOptionalNumber(-1, -1)
+ );
+ }
+
+ #[test]
+ fn invalid_integer_optional_integer() {
+ assert!(NumberOptionalNumber::<i32>::parse_str("").is_err());
+ assert!(NumberOptionalNumber::<i32>::parse_str("1x").is_err());
+ assert!(NumberOptionalNumber::<i32>::parse_str("x1").is_err());
+ assert!(NumberOptionalNumber::<i32>::parse_str("1 x").is_err());
+ assert!(NumberOptionalNumber::<i32>::parse_str("1 , x").is_err());
+ assert!(NumberOptionalNumber::<i32>::parse_str("1 , 2x").is_err());
+ assert!(NumberOptionalNumber::<i32>::parse_str("1 2 x").is_err());
+ assert!(NumberOptionalNumber::<i32>::parse_str("1.5").is_err());
+ assert!(NumberOptionalNumber::<i32>::parse_str("1 2.5").is_err());
+ assert!(NumberOptionalNumber::<i32>::parse_str("1, 2.5").is_err());
+ }
+
+ #[test]
+ fn parses_number_list() {
+ assert_eq!(
+ NumberList::<1, 1>::parse_str("5").unwrap(),
+ NumberList(vec![5.0])
+ );
+
+ assert_eq!(
+ NumberList::<4, 4>::parse_str("1 2 3 4").unwrap(),
+ NumberList(vec![1.0, 2.0, 3.0, 4.0])
+ );
+
+ assert_eq!(
+ NumberList::<0, 5>::parse_str("1 2 3 4 5").unwrap(),
+ NumberList(vec![1.0, 2.0, 3.0, 4.0, 5.0])
+ );
+
+ assert_eq!(
+ NumberList::<0, 5>::parse_str("1 2 3").unwrap(),
+ NumberList(vec![1.0, 2.0, 3.0])
+ );
+ }
+
+ #[test]
+ fn errors_on_invalid_number_list() {
+ // empty
+ assert!(NumberList::<1, 1>::parse_str("").is_err());
+ assert!(NumberList::<0, 1>::parse_str("").is_err());
+
+ // garbage
+ assert!(NumberList::<1, 1>::parse_str("foo").is_err());
+ assert!(NumberList::<2, 2>::parse_str("1foo").is_err());
+ assert!(NumberList::<2, 2>::parse_str("1 foo").is_err());
+ assert!(NumberList::<2, 2>::parse_str("1 foo 2").is_err());
+ assert!(NumberList::<2, 2>::parse_str("1,foo").is_err());
+
+ // too many
+ assert!(NumberList::<1, 1>::parse_str("1 2").is_err());
+
+ // extra token
+ assert!(NumberList::<1, 1>::parse_str("1,").is_err());
+ assert!(NumberList::<0, 1>::parse_str("1,").is_err());
+
+ // too few
+ assert!(NumberList::<2, 2>::parse_str("1").is_err());
+ assert!(NumberList::<3, 3>::parse_str("1 2").is_err());
+ }
+
+ #[test]
+ fn parses_custom_ident() {
+ assert_eq!(
+ CustomIdent::parse_str("hello").unwrap(),
+ CustomIdent("hello".to_string())
+ );
+ }
+
+ #[test]
+ fn invalid_custom_ident_yields_error() {
+ assert!(CustomIdent::parse_str("initial").is_err());
+ assert!(CustomIdent::parse_str("inherit").is_err());
+ assert!(CustomIdent::parse_str("unset").is_err());
+ assert!(CustomIdent::parse_str("default").is_err());
+ assert!(CustomIdent::parse_str("").is_err());
+ }
+}
diff --git a/rsvg/src/path_builder.rs b/rsvg/src/path_builder.rs
new file mode 100644
index 00000000..1e6b5bd8
--- /dev/null
+++ b/rsvg/src/path_builder.rs
@@ -0,0 +1,875 @@
+//! Representation of Bézier paths.
+//!
+//! Path data can consume a significant amount of memory in complex SVG documents. This
+//! module deals with this as follows:
+//!
+//! * The path parser pushes commands into a [`PathBuilder`]. This is a mutable,
+//! temporary storage for path data.
+//!
+//! * Then, the [`PathBuilder`] gets turned into a long-term, immutable [`Path`] that has
+//! a more compact representation.
+//!
+//! The code tries to reduce work in the allocator, by using a [`TinyVec`] with space for at
+//! least 32 commands on the stack for `PathBuilder`; most paths in SVGs in the wild have
+//! fewer than 32 commands, and larger ones will spill to the heap.
+//!
+//! See these blog posts for details and profiles:
+//!
+//! * [Compact representation for path data](https://people.gnome.org/~federico/blog/reducing-memory-consumption-in-librsvg-4.html)
+//! * [Reducing slack space and allocator work](https://people.gnome.org/~federico/blog/reducing-memory-consumption-in-librsvg-3.html)
+
+use tinyvec::TinyVec;
+
+use std::f64;
+use std::f64::consts::*;
+use std::slice;
+
+use crate::float_eq_cairo::ApproxEqCairo;
+use crate::path_parser::{ParseError, PathParser};
+use crate::util::clamp;
+
+/// Whether an arc's sweep should be >= 180 degrees, or smaller.
+#[derive(Debug, Copy, Clone, PartialEq)]
+pub struct LargeArc(pub bool);
+
+/// Angular direction in which an arc is drawn.
+#[derive(Debug, Copy, Clone, PartialEq)]
+pub enum Sweep {
+ Negative,
+ Positive,
+}
+
+/// "c" command for paths; describes a cubic Bézier segment.
+#[derive(Debug, Clone, PartialEq, Default)]
+pub struct CubicBezierCurve {
+ /// The (x, y) coordinates of the first control point.
+ pub pt1: (f64, f64),
+ /// The (x, y) coordinates of the second control point.
+ pub pt2: (f64, f64),
+ /// The (x, y) coordinates of the end point of this path segment.
+ pub to: (f64, f64),
+}
+
+impl CubicBezierCurve {
+ /// Consumes 6 coordinates and creates a curve segment.
+ fn from_coords(coords: &mut slice::Iter<'_, f64>) -> CubicBezierCurve {
+ let pt1 = take_two(coords);
+ let pt2 = take_two(coords);
+ let to = take_two(coords);
+
+ CubicBezierCurve { pt1, pt2, to }
+ }
+
+ /// Pushes 6 coordinates to `coords` and returns `PackedCommand::CurveTo`.
+ fn to_packed_and_coords(&self, coords: &mut Vec<f64>) -> PackedCommand {
+ coords.push(self.pt1.0);
+ coords.push(self.pt1.1);
+ coords.push(self.pt2.0);
+ coords.push(self.pt2.1);
+ coords.push(self.to.0);
+ coords.push(self.to.1);
+ PackedCommand::CurveTo
+ }
+}
+
+/// Conversion from endpoint parameterization to center parameterization.
+///
+/// SVG path data specifies elliptical arcs in terms of their endpoints, but
+/// they are easier to process if they are converted to a center parameterization.
+///
+/// When attempting to compute the center parameterization of the arc,
+/// out of range parameters may see an arc omitted or treated as a line.
+pub enum ArcParameterization {
+ /// Center parameterization of the arc.
+ CenterParameters {
+ /// Center of the ellipse.
+ center: (f64, f64),
+ /// Radii of the ellipse (corrected).
+ radii: (f64, f64),
+ /// Angle of the start point.
+ theta1: f64,
+ /// Delta angle to the end point.
+ delta_theta: f64,
+ },
+ /// Treat the arc as a line to the end point.
+ LineTo,
+ /// Omit the arc.
+ Omit,
+}
+
+/// "a" command for paths; describes an elliptical arc in terms of its endpoints.
+#[derive(Debug, Clone, PartialEq)]
+pub struct EllipticalArc {
+ /// The (x-axis, y-axis) radii for the ellipse.
+ pub r: (f64, f64),
+ /// The rotation angle in degrees for the ellipse's x-axis
+ /// relative to the x-axis of the user coordinate system.
+ pub x_axis_rotation: f64,
+ /// Flag indicating whether the arc sweep should be
+ /// greater than or equal to 180 degrees, or smaller than 180 degrees.
+ pub large_arc: LargeArc,
+ /// Flag indicating the angular direction in which the arc is drawn.
+ pub sweep: Sweep,
+ /// The (x, y) coordinates for the start point of this path segment.
+ pub from: (f64, f64),
+ /// The (x, y) coordinates for the end point of this path segment.
+ pub to: (f64, f64),
+}
+
+impl EllipticalArc {
+ /// Calculates a center parameterization from the endpoint parameterization.
+ ///
+ /// Radii may be adjusted if there is no solution.
+ ///
+ /// See section [B.2.4. Conversion from endpoint to center
+ /// parameterization](https://www.w3.org/TR/SVG2/implnote.html#ArcConversionEndpointToCenter)
+ pub(crate) fn center_parameterization(&self) -> ArcParameterization {
+ let Self {
+ r: (mut rx, mut ry),
+ x_axis_rotation,
+ large_arc,
+ sweep,
+ from: (x1, y1),
+ to: (x2, y2),
+ } = *self;
+
+ // Ensure radii are non-zero.
+ // Otherwise this arc is treated as a line segment joining the end points.
+ //
+ // A bit further down we divide by the square of the radii.
+ // Check that we won't divide by zero.
+ // See http://bugs.debian.org/508443
+ if rx * rx < f64::EPSILON || ry * ry < f64::EPSILON {
+ return ArcParameterization::LineTo;
+ }
+
+ let is_large_arc = large_arc.0;
+ let is_positive_sweep = sweep == Sweep::Positive;
+
+ let phi = x_axis_rotation * PI / 180.0;
+ let (sin_phi, cos_phi) = phi.sin_cos();
+
+ // Ensure radii are positive.
+ rx = rx.abs();
+ ry = ry.abs();
+
+ // The equations simplify after a translation which places
+ // the origin at the midpoint of the line joining (x1, y1) to (x2, y2),
+ // followed by a rotation to line up the coordinate axes
+ // with the axes of the ellipse.
+ // All transformed coordinates will be written with primes.
+ //
+ // Compute (x1', y1').
+ let mid_x = (x1 - x2) / 2.0;
+ let mid_y = (y1 - y2) / 2.0;
+ let x1_ = cos_phi * mid_x + sin_phi * mid_y;
+ let y1_ = -sin_phi * mid_x + cos_phi * mid_y;
+
+ // Ensure radii are large enough.
+ let lambda = (x1_ / rx).powi(2) + (y1_ / ry).powi(2);
+ if lambda > 1.0 {
+ // If not, scale up the ellipse uniformly
+ // until there is exactly one solution.
+ rx *= lambda.sqrt();
+ ry *= lambda.sqrt();
+ }
+
+ // Compute the transformed center (cx', cy').
+ let d = (rx * y1_).powi(2) + (ry * x1_).powi(2);
+ if d == 0.0 {
+ return ArcParameterization::Omit;
+ }
+ let k = {
+ let mut k = ((rx * ry).powi(2) / d - 1.0).abs().sqrt();
+ if is_positive_sweep == is_large_arc {
+ k = -k;
+ }
+ k
+ };
+ let cx_ = k * rx * y1_ / ry;
+ let cy_ = -k * ry * x1_ / rx;
+
+ // Compute the center (cx, cy).
+ let cx = cos_phi * cx_ - sin_phi * cy_ + (x1 + x2) / 2.0;
+ let cy = sin_phi * cx_ + cos_phi * cy_ + (y1 + y2) / 2.0;
+
+ // Compute the start angle θ1.
+ let ux = (x1_ - cx_) / rx;
+ let uy = (y1_ - cy_) / ry;
+ let u_len = (ux * ux + uy * uy).abs().sqrt();
+ if u_len == 0.0 {
+ return ArcParameterization::Omit;
+ }
+ let cos_theta1 = clamp(ux / u_len, -1.0, 1.0);
+ let theta1 = {
+ let mut theta1 = cos_theta1.acos();
+ if uy < 0.0 {
+ theta1 = -theta1;
+ }
+ theta1
+ };
+
+ // Compute the total delta angle Δθ.
+ let vx = (-x1_ - cx_) / rx;
+ let vy = (-y1_ - cy_) / ry;
+ let v_len = (vx * vx + vy * vy).abs().sqrt();
+ if v_len == 0.0 {
+ return ArcParameterization::Omit;
+ }
+ let dp_uv = ux * vx + uy * vy;
+ let cos_delta_theta = clamp(dp_uv / (u_len * v_len), -1.0, 1.0);
+ let delta_theta = {
+ let mut delta_theta = cos_delta_theta.acos();
+ if ux * vy - uy * vx < 0.0 {
+ delta_theta = -delta_theta;
+ }
+ if is_positive_sweep && delta_theta < 0.0 {
+ delta_theta += PI * 2.0;
+ } else if !is_positive_sweep && delta_theta > 0.0 {
+ delta_theta -= PI * 2.0;
+ }
+ delta_theta
+ };
+
+ ArcParameterization::CenterParameters {
+ center: (cx, cy),
+ radii: (rx, ry),
+ theta1,
+ delta_theta,
+ }
+ }
+
+ /// Consumes 7 coordinates and creates an arc segment.
+ fn from_coords(
+ large_arc: LargeArc,
+ sweep: Sweep,
+ coords: &mut slice::Iter<'_, f64>,
+ ) -> EllipticalArc {
+ let r = take_two(coords);
+ let x_axis_rotation = take_one(coords);
+ let from = take_two(coords);
+ let to = take_two(coords);
+
+ EllipticalArc {
+ r,
+ x_axis_rotation,
+ large_arc,
+ sweep,
+ from,
+ to,
+ }
+ }
+
+ /// Pushes 7 coordinates to `coords` and returns one of `PackedCommand::Arc*`.
+ fn to_packed_and_coords(&self, coords: &mut Vec<f64>) -> PackedCommand {
+ coords.push(self.r.0);
+ coords.push(self.r.1);
+ coords.push(self.x_axis_rotation);
+ coords.push(self.from.0);
+ coords.push(self.from.1);
+ coords.push(self.to.0);
+ coords.push(self.to.1);
+
+ match (self.large_arc, self.sweep) {
+ (LargeArc(false), Sweep::Negative) => PackedCommand::ArcSmallNegative,
+ (LargeArc(false), Sweep::Positive) => PackedCommand::ArcSmallPositive,
+ (LargeArc(true), Sweep::Negative) => PackedCommand::ArcLargeNegative,
+ (LargeArc(true), Sweep::Positive) => PackedCommand::ArcLargePositive,
+ }
+ }
+}
+
+/// Turns an arc segment into a cubic bezier curve.
+///
+/// Takes the center, the radii and the x-axis rotation of the ellipse,
+/// the angles of the start and end points,
+/// and returns cubic bezier curve parameters.
+pub(crate) fn arc_segment(
+ c: (f64, f64),
+ r: (f64, f64),
+ x_axis_rotation: f64,
+ th0: f64,
+ th1: f64,
+) -> CubicBezierCurve {
+ let (cx, cy) = c;
+ let (rx, ry) = r;
+ let phi = x_axis_rotation * PI / 180.0;
+ let (sin_phi, cos_phi) = phi.sin_cos();
+ let (sin_th0, cos_th0) = th0.sin_cos();
+ let (sin_th1, cos_th1) = th1.sin_cos();
+
+ let th_half = 0.5 * (th1 - th0);
+ let t = (8.0 / 3.0) * (th_half * 0.5).sin().powi(2) / th_half.sin();
+ let x1 = rx * (cos_th0 - t * sin_th0);
+ let y1 = ry * (sin_th0 + t * cos_th0);
+ let x3 = rx * cos_th1;
+ let y3 = ry * sin_th1;
+ let x2 = x3 + rx * (t * sin_th1);
+ let y2 = y3 + ry * (-t * cos_th1);
+
+ CubicBezierCurve {
+ pt1: (
+ cx + cos_phi * x1 - sin_phi * y1,
+ cy + sin_phi * x1 + cos_phi * y1,
+ ),
+ pt2: (
+ cx + cos_phi * x2 - sin_phi * y2,
+ cy + sin_phi * x2 + cos_phi * y2,
+ ),
+ to: (
+ cx + cos_phi * x3 - sin_phi * y3,
+ cy + sin_phi * x3 + cos_phi * y3,
+ ),
+ }
+}
+
+/// Long-form version of a single path command.
+///
+/// This is returned from iterators on paths and subpaths.
+#[derive(Clone, Debug, PartialEq)]
+pub enum PathCommand {
+ MoveTo(f64, f64),
+ LineTo(f64, f64),
+ CurveTo(CubicBezierCurve),
+ Arc(EllipticalArc),
+ ClosePath,
+}
+
+// This is just so we can use TinyVec, whose type parameter requires T: Default.
+// There is no actual default for path commands in the SVG spec; this is just our
+// implementation detail.
+enum_default!(
+ PathCommand,
+ PathCommand::CurveTo(CubicBezierCurve::default())
+);
+
+impl PathCommand {
+ /// Returns the number of coordinate values that this command will generate in a `Path`.
+ fn num_coordinates(&self) -> usize {
+ match *self {
+ PathCommand::MoveTo(..) => 2,
+ PathCommand::LineTo(..) => 2,
+ PathCommand::CurveTo(_) => 6,
+ PathCommand::Arc(_) => 7,
+ PathCommand::ClosePath => 0,
+ }
+ }
+
+ /// Pushes a command's coordinates to `coords` and returns the corresponding `PackedCommand`.
+ fn to_packed(&self, coords: &mut Vec<f64>) -> PackedCommand {
+ match *self {
+ PathCommand::MoveTo(x, y) => {
+ coords.push(x);
+ coords.push(y);
+ PackedCommand::MoveTo
+ }
+
+ PathCommand::LineTo(x, y) => {
+ coords.push(x);
+ coords.push(y);
+ PackedCommand::LineTo
+ }
+
+ PathCommand::CurveTo(ref c) => c.to_packed_and_coords(coords),
+
+ PathCommand::Arc(ref a) => a.to_packed_and_coords(coords),
+
+ PathCommand::ClosePath => PackedCommand::ClosePath,
+ }
+ }
+
+ /// Consumes a packed command's coordinates from the `coords` iterator and returns the rehydrated `PathCommand`.
+ fn from_packed(packed: PackedCommand, coords: &mut slice::Iter<'_, f64>) -> PathCommand {
+ match packed {
+ PackedCommand::MoveTo => {
+ let x = take_one(coords);
+ let y = take_one(coords);
+ PathCommand::MoveTo(x, y)
+ }
+
+ PackedCommand::LineTo => {
+ let x = take_one(coords);
+ let y = take_one(coords);
+ PathCommand::LineTo(x, y)
+ }
+
+ PackedCommand::CurveTo => PathCommand::CurveTo(CubicBezierCurve::from_coords(coords)),
+
+ PackedCommand::ClosePath => PathCommand::ClosePath,
+
+ PackedCommand::ArcSmallNegative => PathCommand::Arc(EllipticalArc::from_coords(
+ LargeArc(false),
+ Sweep::Negative,
+ coords,
+ )),
+
+ PackedCommand::ArcSmallPositive => PathCommand::Arc(EllipticalArc::from_coords(
+ LargeArc(false),
+ Sweep::Positive,
+ coords,
+ )),
+
+ PackedCommand::ArcLargeNegative => PathCommand::Arc(EllipticalArc::from_coords(
+ LargeArc(true),
+ Sweep::Negative,
+ coords,
+ )),
+
+ PackedCommand::ArcLargePositive => PathCommand::Arc(EllipticalArc::from_coords(
+ LargeArc(true),
+ Sweep::Positive,
+ coords,
+ )),
+ }
+ }
+}
+
+/// Constructs a path out of commands.
+///
+/// Create this with `PathBuilder::default`; you can then add commands to it or call the
+/// `parse` method. When you are finished constructing a path builder, turn it into a
+/// `Path` with `into_path`. You can then iterate on that `Path`'s commands with its
+/// methods.
+#[derive(Default)]
+pub struct PathBuilder {
+ path_commands: TinyVec<[PathCommand; 32]>,
+}
+
+/// An immutable path with a compact representation.
+///
+/// This is constructed from a `PathBuilder` once it is finished. You
+/// can get an iterator for the path's commands with the `iter`
+/// method, or an iterator for its subpaths (subsequences of commands that
+/// start with a MoveTo) with the `iter_subpath` method.
+///
+/// The variants in `PathCommand` have different sizes, so a simple array of `PathCommand`
+/// would have a lot of slack space. We reduce this to a minimum by separating the
+/// commands from their coordinates. Then, we can have two dense arrays: one with a compact
+/// representation of commands, and another with a linear list of the coordinates for each
+/// command.
+///
+/// Both `PathCommand` and `PackedCommand` know how many coordinates they ought to
+/// produce, with their `num_coordinates` methods.
+///
+/// This struct implements `Default`, and it yields an empty path.
+#[derive(Default)]
+pub struct Path {
+ commands: Box<[PackedCommand]>,
+ coords: Box<[f64]>,
+}
+
+/// Packed version of a `PathCommand`, used in `Path`.
+///
+/// MoveTo/LineTo/CurveTo have only pairs of coordinates, while ClosePath has no coordinates,
+/// and EllipticalArc has a bunch of coordinates plus two flags. Here we represent the flags
+/// as four variants.
+///
+/// This is `repr(u8)` to keep it as small as possible.
+#[repr(u8)]
+#[derive(Debug, Clone, Copy)]
+enum PackedCommand {
+ MoveTo,
+ LineTo,
+ CurveTo,
+ ArcSmallNegative,
+ ArcSmallPositive,
+ ArcLargeNegative,
+ ArcLargePositive,
+ ClosePath,
+}
+
+impl PackedCommand {
+ // Returns the number of coordinate values that this command will generate in a `Path`.
+ fn num_coordinates(&self) -> usize {
+ match *self {
+ PackedCommand::MoveTo => 2,
+ PackedCommand::LineTo => 2,
+ PackedCommand::CurveTo => 6,
+ PackedCommand::ArcSmallNegative
+ | PackedCommand::ArcSmallPositive
+ | PackedCommand::ArcLargeNegative
+ | PackedCommand::ArcLargePositive => 7,
+ PackedCommand::ClosePath => 0,
+ }
+ }
+}
+
+impl PathBuilder {
+ pub fn parse(&mut self, path_str: &str) -> Result<(), ParseError> {
+ let mut parser = PathParser::new(self, path_str);
+ parser.parse()
+ }
+
+ /// Consumes the `PathBuilder` and returns a compact, immutable representation as a `Path`.
+ pub fn into_path(self) -> Path {
+ let num_coords = self
+ .path_commands
+ .iter()
+ .map(PathCommand::num_coordinates)
+ .sum();
+
+ let mut coords = Vec::with_capacity(num_coords);
+ let packed_commands: Vec<_> = self
+ .path_commands
+ .iter()
+ .map(|cmd| cmd.to_packed(&mut coords))
+ .collect();
+
+ Path {
+ commands: packed_commands.into_boxed_slice(),
+ coords: coords.into_boxed_slice(),
+ }
+ }
+
+ /// Adds a MoveTo command to the path.
+ pub fn move_to(&mut self, x: f64, y: f64) {
+ self.path_commands.push(PathCommand::MoveTo(x, y));
+ }
+
+ /// Adds a LineTo command to the path.
+ pub fn line_to(&mut self, x: f64, y: f64) {
+ self.path_commands.push(PathCommand::LineTo(x, y));
+ }
+
+ /// Adds a CurveTo command to the path.
+ pub fn curve_to(&mut self, x2: f64, y2: f64, x3: f64, y3: f64, x4: f64, y4: f64) {
+ let curve = CubicBezierCurve {
+ pt1: (x2, y2),
+ pt2: (x3, y3),
+ to: (x4, y4),
+ };
+ self.path_commands.push(PathCommand::CurveTo(curve));
+ }
+
+ /// Adds an EllipticalArc command to the path.
+ pub fn arc(
+ &mut self,
+ x1: f64,
+ y1: f64,
+ rx: f64,
+ ry: f64,
+ x_axis_rotation: f64,
+ large_arc: LargeArc,
+ sweep: Sweep,
+ x2: f64,
+ y2: f64,
+ ) {
+ let arc = EllipticalArc {
+ r: (rx, ry),
+ x_axis_rotation,
+ large_arc,
+ sweep,
+ from: (x1, y1),
+ to: (x2, y2),
+ };
+ self.path_commands.push(PathCommand::Arc(arc));
+ }
+
+ /// Adds a ClosePath command to the path.
+ pub fn close_path(&mut self) {
+ self.path_commands.push(PathCommand::ClosePath);
+ }
+}
+
+/// An iterator over the subpaths of a `Path`.
+pub struct SubPathIter<'a> {
+ path: &'a Path,
+ commands_start: usize,
+ coords_start: usize,
+}
+
+/// A slice of commands and coordinates with a single `MoveTo` at the beginning.
+pub struct SubPath<'a> {
+ commands: &'a [PackedCommand],
+ coords: &'a [f64],
+}
+
+/// An iterator over the commands/coordinates of a subpath.
+pub struct SubPathCommandsIter<'a> {
+ commands_iter: slice::Iter<'a, PackedCommand>,
+ coords_iter: slice::Iter<'a, f64>,
+}
+
+impl<'a> SubPath<'a> {
+ /// Returns an iterator over the subpath's commands.
+ pub fn iter_commands(&self) -> SubPathCommandsIter<'_> {
+ SubPathCommandsIter {
+ commands_iter: self.commands.iter(),
+ coords_iter: self.coords.iter(),
+ }
+ }
+
+ /// Each subpath starts with a MoveTo; this returns its `(x, y)` coordinates.
+ pub fn origin(&self) -> (f64, f64) {
+ let first = *self.commands.first().unwrap();
+ assert!(matches!(first, PackedCommand::MoveTo));
+ let command = PathCommand::from_packed(first, &mut self.coords.iter());
+
+ match command {
+ PathCommand::MoveTo(x, y) => (x, y),
+ _ => unreachable!(),
+ }
+ }
+
+ /// Returns whether the length of a subpath is approximately zero.
+ pub fn is_zero_length(&self) -> bool {
+ let (cur_x, cur_y) = self.origin();
+
+ for cmd in self.iter_commands().skip(1) {
+ let (end_x, end_y) = match cmd {
+ PathCommand::MoveTo(_, _) => unreachable!(
+ "A MoveTo cannot appear in a subpath if it's not the first element"
+ ),
+ PathCommand::LineTo(x, y) => (x, y),
+ PathCommand::CurveTo(curve) => curve.to,
+ PathCommand::Arc(arc) => arc.to,
+ // If we get a `ClosePath and haven't returned yet then we haven't moved at all making
+ // it an empty subpath`
+ PathCommand::ClosePath => return true,
+ };
+
+ if !end_x.approx_eq_cairo(cur_x) || !end_y.approx_eq_cairo(cur_y) {
+ return false;
+ }
+ }
+
+ true
+ }
+}
+
+impl<'a> Iterator for SubPathIter<'a> {
+ type Item = SubPath<'a>;
+
+ fn next(&mut self) -> Option<Self::Item> {
+ // If we ended on our last command in the previous iteration, we're done here
+ if self.commands_start >= self.path.commands.len() {
+ return None;
+ }
+
+ // Otherwise we have at least one command left, we setup the slice to be all the remaining
+ // commands.
+ let commands = &self.path.commands[self.commands_start..];
+
+ assert!(matches!(commands.first().unwrap(), PackedCommand::MoveTo));
+ let mut num_coords = PackedCommand::MoveTo.num_coordinates();
+
+ // Skip over the initial MoveTo
+ for (i, cmd) in commands.iter().enumerate().skip(1) {
+ // If we encounter a MoveTo , we ended our current subpath, we
+ // return the commands until this command and set commands_start to be the index of the
+ // next command
+ if let PackedCommand::MoveTo = cmd {
+ let subpath_coords_start = self.coords_start;
+
+ self.commands_start += i;
+ self.coords_start += num_coords;
+
+ return Some(SubPath {
+ commands: &commands[..i],
+ coords: &self.path.coords
+ [subpath_coords_start..subpath_coords_start + num_coords],
+ });
+ } else {
+ num_coords += cmd.num_coordinates();
+ }
+ }
+
+ // If we didn't find any MoveTo, we're done here. We return the rest of the path
+ // and set commands_start so next iteration will return None.
+
+ self.commands_start = self.path.commands.len();
+
+ let subpath_coords_start = self.coords_start;
+ assert!(subpath_coords_start + num_coords == self.path.coords.len());
+ self.coords_start = self.path.coords.len();
+
+ Some(SubPath {
+ commands,
+ coords: &self.path.coords[subpath_coords_start..],
+ })
+ }
+}
+
+impl<'a> Iterator for SubPathCommandsIter<'a> {
+ type Item = PathCommand;
+
+ fn next(&mut self) -> Option<Self::Item> {
+ self.commands_iter
+ .next()
+ .map(|packed| PathCommand::from_packed(*packed, &mut self.coords_iter))
+ }
+}
+
+impl Path {
+ /// Get an iterator over a path `Subpath`s.
+ pub fn iter_subpath(&self) -> SubPathIter<'_> {
+ SubPathIter {
+ path: self,
+ commands_start: 0,
+ coords_start: 0,
+ }
+ }
+
+ /// Get an iterator over a path's commands.
+ pub fn iter(&self) -> impl Iterator<Item = PathCommand> + '_ {
+ let commands = self.commands.iter();
+ let mut coords = self.coords.iter();
+
+ commands.map(move |cmd| PathCommand::from_packed(*cmd, &mut coords))
+ }
+
+ /// Returns whether there are no commands in the path.
+ pub fn is_empty(&self) -> bool {
+ self.commands.is_empty()
+ }
+}
+
+fn take_one(iter: &mut slice::Iter<'_, f64>) -> f64 {
+ *iter.next().unwrap()
+}
+
+fn take_two(iter: &mut slice::Iter<'_, f64>) -> (f64, f64) {
+ (take_one(iter), take_one(iter))
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn empty_builder() {
+ let builder = PathBuilder::default();
+ let path = builder.into_path();
+ assert!(path.is_empty());
+ assert_eq!(path.iter().count(), 0);
+ }
+
+ #[test]
+ fn empty_path() {
+ let path = Path::default();
+ assert!(path.is_empty());
+ assert_eq!(path.iter().count(), 0);
+ }
+
+ #[test]
+ fn all_commands() {
+ let mut builder = PathBuilder::default();
+ builder.move_to(42.0, 43.0);
+ builder.line_to(42.0, 43.0);
+ builder.curve_to(42.0, 43.0, 44.0, 45.0, 46.0, 47.0);
+ builder.arc(
+ 42.0,
+ 43.0,
+ 44.0,
+ 45.0,
+ 46.0,
+ LargeArc(true),
+ Sweep::Positive,
+ 47.0,
+ 48.0,
+ );
+ builder.close_path();
+ let path = builder.into_path();
+ assert!(path.iter().eq(vec![
+ PathCommand::MoveTo(42.0, 43.0),
+ PathCommand::LineTo(42.0, 43.0),
+ PathCommand::CurveTo(CubicBezierCurve {
+ pt1: (42.0, 43.0),
+ pt2: (44.0, 45.0),
+ to: (46.0, 47.0),
+ }),
+ PathCommand::Arc(EllipticalArc {
+ from: (42.0, 43.0),
+ r: (44.0, 45.0),
+ to: (47.0, 48.0),
+ x_axis_rotation: 46.0,
+ large_arc: LargeArc(true),
+ sweep: Sweep::Positive,
+ }),
+ PathCommand::ClosePath,
+ ]));
+ }
+
+ #[test]
+ fn subpath_iter() {
+ let mut builder = PathBuilder::default();
+ builder.move_to(42.0, 43.0);
+ builder.line_to(42.0, 43.0);
+ builder.close_path();
+
+ builder.move_to(22.0, 22.0);
+ builder.curve_to(22.0, 22.0, 44.0, 45.0, 46.0, 47.0);
+
+ builder.move_to(69.0, 69.0);
+ builder.line_to(42.0, 43.0);
+ let path = builder.into_path();
+
+ let subpaths = path
+ .iter_subpath()
+ .map(|subpath| {
+ (
+ subpath.origin(),
+ subpath.iter_commands().collect::<Vec<PathCommand>>(),
+ )
+ })
+ .collect::<Vec<((f64, f64), Vec<PathCommand>)>>();
+
+ assert_eq!(
+ subpaths,
+ vec![
+ (
+ (42.0, 43.0),
+ vec![
+ PathCommand::MoveTo(42.0, 43.0),
+ PathCommand::LineTo(42.0, 43.0),
+ PathCommand::ClosePath
+ ]
+ ),
+ (
+ (22.0, 22.0),
+ vec![
+ PathCommand::MoveTo(22.0, 22.0),
+ PathCommand::CurveTo(CubicBezierCurve {
+ pt1: (22.0, 22.0),
+ pt2: (44.0, 45.0),
+ to: (46.0, 47.0)
+ })
+ ]
+ ),
+ (
+ (69.0, 69.0),
+ vec![
+ PathCommand::MoveTo(69.0, 69.0),
+ PathCommand::LineTo(42.0, 43.0)
+ ]
+ )
+ ]
+ );
+ }
+
+ #[test]
+ fn zero_length_subpaths() {
+ let mut builder = PathBuilder::default();
+ builder.move_to(42.0, 43.0);
+ builder.move_to(44.0, 45.0);
+ builder.close_path();
+ builder.move_to(46.0, 47.0);
+ builder.line_to(48.0, 49.0);
+
+ let path = builder.into_path();
+
+ let subpaths = path
+ .iter_subpath()
+ .map(|subpath| (subpath.is_zero_length(), subpath.origin()))
+ .collect::<Vec<(bool, (f64, f64))>>();
+
+ assert_eq!(
+ subpaths,
+ vec![
+ (true, (42.0, 43.0)),
+ (true, (44.0, 45.0)),
+ (false, (46.0, 47.0)),
+ ]
+ );
+ }
+}
diff --git a/rsvg/src/path_parser.rs b/rsvg/src/path_parser.rs
new file mode 100644
index 00000000..9b6ae0c9
--- /dev/null
+++ b/rsvg/src/path_parser.rs
@@ -0,0 +1,2223 @@
+//! Parser for SVG path data.
+
+use std::fmt;
+use std::iter::Enumerate;
+use std::str;
+use std::str::Bytes;
+
+use crate::path_builder::*;
+
+#[derive(Debug, PartialEq, Copy, Clone)]
+pub enum Token {
+ // pub to allow benchmarking
+ Number(f64),
+ Flag(bool),
+ Command(u8),
+ Comma,
+}
+
+use crate::path_parser::Token::{Comma, Command, Flag, Number};
+
+#[derive(Debug)]
+pub struct Lexer<'a> {
+ // pub to allow benchmarking
+ input: &'a [u8],
+ ci: Enumerate<Bytes<'a>>,
+ current: Option<(usize, u8)>,
+ flags_required: u8,
+}
+
+#[derive(Debug, PartialEq, Copy, Clone)]
+pub enum LexError {
+ // pub to allow benchmarking
+ ParseFloatError,
+ UnexpectedByte(u8),
+ UnexpectedEof,
+}
+
+impl<'a> Lexer<'_> {
+ pub fn new(input: &'a str) -> Lexer<'a> {
+ let mut ci = input.bytes().enumerate();
+ let current = ci.next();
+ Lexer {
+ input: input.as_bytes(),
+ ci,
+ current,
+ flags_required: 0,
+ }
+ }
+
+ // The way Flag tokens work is a little annoying. We don't have
+ // any way to distinguish between numbers and flags without context
+ // from the parser. The only time we need to return flags is within the
+ // argument sequence of an elliptical arc, and then we need 2 in a row
+ // or it's an error. So, when the parser gets to that point, it calls
+ // this method and we switch from our usual mode of handling digits as
+ // numbers to looking for two 'flag' characters (either 0 or 1) in a row
+ // (with optional intervening whitespace, and possibly comma tokens.)
+ // Every time we find a flag we decrement flags_required.
+ pub fn require_flags(&mut self) {
+ self.flags_required = 2;
+ }
+
+ fn current_pos(&mut self) -> usize {
+ match self.current {
+ None => self.input.len(),
+ Some((pos, _)) => pos,
+ }
+ }
+
+ fn advance(&mut self) {
+ self.current = self.ci.next();
+ }
+
+ fn advance_over_whitespace(&mut self) -> bool {
+ let mut found_some = false;
+ while self.current.is_some() && self.current.unwrap().1.is_ascii_whitespace() {
+ found_some = true;
+ self.current = self.ci.next();
+ }
+ found_some
+ }
+
+ fn advance_over_optional(&mut self, needle: u8) -> bool {
+ match self.current {
+ Some((_, c)) if c == needle => {
+ self.advance();
+ true
+ }
+ _ => false,
+ }
+ }
+
+ fn advance_over_digits(&mut self) -> bool {
+ let mut found_some = false;
+ while self.current.is_some() && self.current.unwrap().1.is_ascii_digit() {
+ found_some = true;
+ self.current = self.ci.next();
+ }
+ found_some
+ }
+
+ fn advance_over_simple_number(&mut self) -> bool {
+ let _ = self.advance_over_optional(b'-') || self.advance_over_optional(b'+');
+ let found_digit = self.advance_over_digits();
+ let _ = self.advance_over_optional(b'.');
+ self.advance_over_digits() || found_digit
+ }
+
+ fn match_number(&mut self) -> Result<Token, LexError> {
+ // remember the beginning
+ let (start_pos, _) = self.current.unwrap();
+ if !self.advance_over_simple_number() && start_pos != self.current_pos() {
+ match self.current {
+ None => return Err(LexError::UnexpectedEof),
+ Some((_pos, c)) => return Err(LexError::UnexpectedByte(c)),
+ }
+ }
+ if self.advance_over_optional(b'e') || self.advance_over_optional(b'E') {
+ let _ = self.advance_over_optional(b'-') || self.advance_over_optional(b'+');
+ let _ = self.advance_over_digits();
+ }
+ let end_pos = match self.current {
+ None => self.input.len(),
+ Some((i, _)) => i,
+ };
+
+ // If you need path parsing to be faster, you can do from_utf8_unchecked to
+ // avoid re-validating all the chars, and std::str::parse<i*> calls are
+ // faster than std::str::parse<f64> for numbers that are not floats.
+
+ // bare unwrap here should be safe since we've already checked all the bytes
+ // in the range
+ match std::str::from_utf8(&self.input[start_pos..end_pos])
+ .unwrap()
+ .parse::<f64>()
+ {
+ Ok(n) => Ok(Number(n)),
+ Err(_e) => Err(LexError::ParseFloatError),
+ }
+ }
+}
+
+impl Iterator for Lexer<'_> {
+ type Item = (usize, Result<Token, LexError>);
+
+ fn next(&mut self) -> Option<Self::Item> {
+ // eat whitespace
+ self.advance_over_whitespace();
+
+ match self.current {
+ // commas are separators
+ Some((pos, c)) if c == b',' => {
+ self.advance();
+ Some((pos, Ok(Comma)))
+ }
+
+ // alphabetic chars are commands
+ Some((pos, c)) if c.is_ascii_alphabetic() => {
+ let token = Command(c);
+ self.advance();
+ Some((pos, Ok(token)))
+ }
+
+ Some((pos, c)) if self.flags_required > 0 && c.is_ascii_digit() => match c {
+ b'0' => {
+ self.flags_required -= 1;
+ self.advance();
+ Some((pos, Ok(Flag(false))))
+ }
+ b'1' => {
+ self.flags_required -= 1;
+ self.advance();
+ Some((pos, Ok(Flag(true))))
+ }
+ _ => Some((pos, Err(LexError::UnexpectedByte(c)))),
+ },
+
+ Some((pos, c)) if c.is_ascii_digit() || c == b'-' || c == b'+' || c == b'.' => {
+ Some((pos, self.match_number()))
+ }
+
+ Some((pos, c)) => {
+ self.advance();
+ Some((pos, Err(LexError::UnexpectedByte(c))))
+ }
+
+ None => None,
+ }
+ }
+}
+
+pub struct PathParser<'b> {
+ tokens: Lexer<'b>,
+ current_pos_and_token: Option<(usize, Result<Token, LexError>)>,
+
+ builder: &'b mut PathBuilder,
+
+ // Current point; adjusted at every command
+ current_x: f64,
+ current_y: f64,
+
+ // Last control point from previous cubic curve command, used to reflect
+ // the new control point for smooth cubic curve commands.
+ cubic_reflection_x: f64,
+ cubic_reflection_y: f64,
+
+ // Last control point from previous quadratic curve command, used to reflect
+ // the new control point for smooth quadratic curve commands.
+ quadratic_reflection_x: f64,
+ quadratic_reflection_y: f64,
+
+ // Start point of current subpath (i.e. position of last moveto);
+ // used for closepath.
+ subpath_start_x: f64,
+ subpath_start_y: f64,
+}
+
+// This is a recursive descent parser for path data in SVG files,
+// as specified in https://www.w3.org/TR/SVG/paths.html#PathDataBNF
+// Some peculiarities:
+//
+// - SVG allows optional commas inside coordinate pairs, and between
+// coordinate pairs. So, for example, these are equivalent:
+//
+// M 10 20 30 40
+// M 10, 20 30, 40
+// M 10, 20, 30, 40
+//
+// - Whitespace is optional. These are equivalent:
+//
+// M10,20 30,40
+// M10,20,30,40
+//
+// These are also equivalent:
+//
+// M-10,20-30-40
+// M -10 20 -30 -40
+//
+// M.1-2,3E2-4
+// M 0.1 -2 300 -4
+impl<'b> PathParser<'b> {
+ pub fn new(builder: &'b mut PathBuilder, path_str: &'b str) -> PathParser<'b> {
+ let mut lexer = Lexer::new(path_str);
+ let pt = lexer.next();
+ PathParser {
+ tokens: lexer,
+ current_pos_and_token: pt,
+
+ builder,
+
+ current_x: 0.0,
+ current_y: 0.0,
+
+ cubic_reflection_x: 0.0,
+ cubic_reflection_y: 0.0,
+
+ quadratic_reflection_x: 0.0,
+ quadratic_reflection_y: 0.0,
+
+ subpath_start_x: 0.0,
+ subpath_start_y: 0.0,
+ }
+ }
+
+ // Our match_* methods all either consume the token we requested
+ // and return the unwrapped value, or return an error without
+ // advancing the token stream.
+ //
+ // You can safely use them to probe for a particular kind of token,
+ // fail to match it, and try some other type.
+
+ fn match_command(&mut self) -> Result<u8, ParseError> {
+ let result = match &self.current_pos_and_token {
+ Some((_, Ok(Command(c)))) => Ok(*c),
+ Some((pos, Ok(t))) => Err(ParseError::new(*pos, UnexpectedToken(*t))),
+ Some((pos, Err(e))) => Err(ParseError::new(*pos, LexError(*e))),
+ None => Err(ParseError::new(self.tokens.input.len(), UnexpectedEof)),
+ };
+ if result.is_ok() {
+ self.current_pos_and_token = self.tokens.next();
+ }
+ result
+ }
+
+ fn match_number(&mut self) -> Result<f64, ParseError> {
+ let result = match &self.current_pos_and_token {
+ Some((_, Ok(Number(n)))) => Ok(*n),
+ Some((pos, Ok(t))) => Err(ParseError::new(*pos, UnexpectedToken(*t))),
+ Some((pos, Err(e))) => Err(ParseError::new(*pos, LexError(*e))),
+ None => Err(ParseError::new(self.tokens.input.len(), UnexpectedEof)),
+ };
+ if result.is_ok() {
+ self.current_pos_and_token = self.tokens.next();
+ }
+ result
+ }
+
+ fn match_number_and_flags(&mut self) -> Result<(f64, bool, bool), ParseError> {
+ // We can't just do self.match_number() here, because we have to
+ // tell the lexer, if we do find a number, to switch to looking for flags
+ // before we advance it to the next token. Otherwise it will treat the flag
+ // characters as numbers.
+ //
+ // So, first we do the guts of match_number...
+ let n = match &self.current_pos_and_token {
+ Some((_, Ok(Number(n)))) => Ok(*n),
+ Some((pos, Ok(t))) => Err(ParseError::new(*pos, UnexpectedToken(*t))),
+ Some((pos, Err(e))) => Err(ParseError::new(*pos, LexError(*e))),
+ None => Err(ParseError::new(self.tokens.input.len(), UnexpectedEof)),
+ }?;
+
+ // Then we tell the lexer that we're going to need to find Flag tokens,
+ // *then* we can advance the token stream.
+ self.tokens.require_flags();
+ self.current_pos_and_token = self.tokens.next();
+
+ self.eat_optional_comma();
+ let f1 = self.match_flag()?;
+
+ self.eat_optional_comma();
+ let f2 = self.match_flag()?;
+
+ Ok((n, f1, f2))
+ }
+
+ fn match_comma(&mut self) -> Result<(), ParseError> {
+ let result = match &self.current_pos_and_token {
+ Some((_, Ok(Comma))) => Ok(()),
+ Some((pos, Ok(t))) => Err(ParseError::new(*pos, UnexpectedToken(*t))),
+ Some((pos, Err(e))) => Err(ParseError::new(*pos, LexError(*e))),
+ None => Err(ParseError::new(self.tokens.input.len(), UnexpectedEof)),
+ };
+ if result.is_ok() {
+ self.current_pos_and_token = self.tokens.next();
+ }
+ result
+ }
+
+ fn eat_optional_comma(&mut self) {
+ let _ = self.match_comma();
+ }
+
+ // Convenience function; like match_number, but eats a leading comma if present.
+ fn match_comma_number(&mut self) -> Result<f64, ParseError> {
+ self.eat_optional_comma();
+ self.match_number()
+ }
+
+ fn match_flag(&mut self) -> Result<bool, ParseError> {
+ let result = match self.current_pos_and_token {
+ Some((_, Ok(Flag(f)))) => Ok(f),
+ Some((pos, Ok(t))) => Err(ParseError::new(pos, UnexpectedToken(t))),
+ Some((pos, Err(e))) => Err(ParseError::new(pos, LexError(e))),
+ None => Err(ParseError::new(self.tokens.input.len(), UnexpectedEof)),
+ };
+ if result.is_ok() {
+ self.current_pos_and_token = self.tokens.next();
+ }
+ result
+ }
+
+ // peek_* methods are the twins of match_*, but don't consume the token, and so
+ // can't return ParseError
+
+ fn peek_command(&mut self) -> Option<u8> {
+ match &self.current_pos_and_token {
+ Some((_, Ok(Command(c)))) => Some(*c),
+ _ => None,
+ }
+ }
+
+ fn peek_number(&mut self) -> Option<f64> {
+ match &self.current_pos_and_token {
+ Some((_, Ok(Number(n)))) => Some(*n),
+ _ => None,
+ }
+ }
+
+ // This is the entry point for parsing a given blob of path data.
+ // All the parsing just uses various match_* methods to consume tokens
+ // and retrieve the values.
+ pub fn parse(&mut self) -> Result<(), ParseError> {
+ if self.current_pos_and_token.is_none() {
+ return Ok(());
+ }
+
+ self.moveto_drawto_command_groups()
+ }
+
+ fn error(&self, kind: ErrorKind) -> ParseError {
+ match self.current_pos_and_token {
+ Some((pos, _)) => ParseError {
+ position: pos,
+ kind,
+ },
+ None => ParseError { position: 0, kind }, // FIXME: ???
+ }
+ }
+
+ fn coordinate_pair(&mut self) -> Result<(f64, f64), ParseError> {
+ Ok((self.match_number()?, self.match_comma_number()?))
+ }
+
+ fn set_current_point(&mut self, x: f64, y: f64) {
+ self.current_x = x;
+ self.current_y = y;
+
+ self.cubic_reflection_x = self.current_x;
+ self.cubic_reflection_y = self.current_y;
+
+ self.quadratic_reflection_x = self.current_x;
+ self.quadratic_reflection_y = self.current_y;
+ }
+
+ fn set_cubic_reflection_and_current_point(&mut self, x3: f64, y3: f64, x4: f64, y4: f64) {
+ self.cubic_reflection_x = x3;
+ self.cubic_reflection_y = y3;
+
+ self.current_x = x4;
+ self.current_y = y4;
+
+ self.quadratic_reflection_x = self.current_x;
+ self.quadratic_reflection_y = self.current_y;
+ }
+
+ fn set_quadratic_reflection_and_current_point(&mut self, a: f64, b: f64, c: f64, d: f64) {
+ self.quadratic_reflection_x = a;
+ self.quadratic_reflection_y = b;
+
+ self.current_x = c;
+ self.current_y = d;
+
+ self.cubic_reflection_x = self.current_x;
+ self.cubic_reflection_y = self.current_y;
+ }
+
+ fn emit_move_to(&mut self, x: f64, y: f64) {
+ self.set_current_point(x, y);
+
+ self.subpath_start_x = self.current_x;
+ self.subpath_start_y = self.current_y;
+
+ self.builder.move_to(self.current_x, self.current_y);
+ }
+
+ fn emit_line_to(&mut self, x: f64, y: f64) {
+ self.set_current_point(x, y);
+
+ self.builder.line_to(self.current_x, self.current_y);
+ }
+
+ fn emit_curve_to(&mut self, x2: f64, y2: f64, x3: f64, y3: f64, x4: f64, y4: f64) {
+ self.set_cubic_reflection_and_current_point(x3, y3, x4, y4);
+
+ self.builder.curve_to(x2, y2, x3, y3, x4, y4);
+ }
+
+ fn emit_quadratic_curve_to(&mut self, a: f64, b: f64, c: f64, d: f64) {
+ // raise quadratic Bézier to cubic
+ let x2 = (self.current_x + 2.0 * a) / 3.0;
+ let y2 = (self.current_y + 2.0 * b) / 3.0;
+ let x4 = c;
+ let y4 = d;
+ let x3 = (x4 + 2.0 * a) / 3.0;
+ let y3 = (y4 + 2.0 * b) / 3.0;
+
+ self.set_quadratic_reflection_and_current_point(a, b, c, d);
+
+ self.builder.curve_to(x2, y2, x3, y3, x4, y4);
+ }
+
+ fn emit_arc(
+ &mut self,
+ rx: f64,
+ ry: f64,
+ x_axis_rotation: f64,
+ large_arc: LargeArc,
+ sweep: Sweep,
+ x: f64,
+ y: f64,
+ ) {
+ let (start_x, start_y) = (self.current_x, self.current_y);
+
+ self.set_current_point(x, y);
+
+ self.builder.arc(
+ start_x,
+ start_y,
+ rx,
+ ry,
+ x_axis_rotation,
+ large_arc,
+ sweep,
+ self.current_x,
+ self.current_y,
+ );
+ }
+
+ fn moveto_argument_sequence(&mut self, absolute: bool) -> Result<(), ParseError> {
+ let (mut x, mut y) = self.coordinate_pair()?;
+
+ if !absolute {
+ x += self.current_x;
+ y += self.current_y;
+ }
+
+ self.emit_move_to(x, y);
+
+ if self.match_comma().is_ok() || self.peek_number().is_some() {
+ self.lineto_argument_sequence(absolute)
+ } else {
+ Ok(())
+ }
+ }
+
+ fn moveto(&mut self) -> Result<(), ParseError> {
+ match self.match_command()? {
+ b'M' => self.moveto_argument_sequence(true),
+ b'm' => self.moveto_argument_sequence(false),
+ c => Err(self.error(ErrorKind::UnexpectedCommand(c))),
+ }
+ }
+
+ fn moveto_drawto_command_group(&mut self) -> Result<(), ParseError> {
+ self.moveto()?;
+ self.optional_drawto_commands().map(|_| ())
+ }
+
+ fn moveto_drawto_command_groups(&mut self) -> Result<(), ParseError> {
+ loop {
+ self.moveto_drawto_command_group()?;
+
+ if self.current_pos_and_token.is_none() {
+ break;
+ }
+ }
+
+ Ok(())
+ }
+
+ fn optional_drawto_commands(&mut self) -> Result<bool, ParseError> {
+ while self.drawto_command()? {
+ // everything happens in the drawto_command() calls.
+ }
+
+ Ok(false)
+ }
+
+ // FIXME: This should not just fail to match 'M' and 'm', but make sure the
+ // command is in the set of drawto command characters.
+ fn match_if_drawto_command_with_absolute(&mut self) -> Option<(u8, bool)> {
+ let cmd = self.peek_command();
+ let result = match cmd {
+ Some(b'M') => None,
+ Some(b'm') => None,
+ Some(c) => {
+ let c_up = c.to_ascii_uppercase();
+ if c == c_up {
+ Some((c_up, true))
+ } else {
+ Some((c_up, false))
+ }
+ }
+ _ => None,
+ };
+ if result.is_some() {
+ let _ = self.match_command();
+ }
+ result
+ }
+
+ fn drawto_command(&mut self) -> Result<bool, ParseError> {
+ match self.match_if_drawto_command_with_absolute() {
+ Some((b'Z', _)) => {
+ self.emit_close_path();
+ Ok(true)
+ }
+ Some((b'L', abs)) => {
+ self.lineto_argument_sequence(abs)?;
+ Ok(true)
+ }
+ Some((b'H', abs)) => {
+ self.horizontal_lineto_argument_sequence(abs)?;
+ Ok(true)
+ }
+ Some((b'V', abs)) => {
+ self.vertical_lineto_argument_sequence(abs)?;
+ Ok(true)
+ }
+ Some((b'C', abs)) => {
+ self.curveto_argument_sequence(abs)?;
+ Ok(true)
+ }
+ Some((b'S', abs)) => {
+ self.smooth_curveto_argument_sequence(abs)?;
+ Ok(true)
+ }
+ Some((b'Q', abs)) => {
+ self.quadratic_curveto_argument_sequence(abs)?;
+ Ok(true)
+ }
+ Some((b'T', abs)) => {
+ self.smooth_quadratic_curveto_argument_sequence(abs)?;
+ Ok(true)
+ }
+ Some((b'A', abs)) => {
+ self.elliptical_arc_argument_sequence(abs)?;
+ Ok(true)
+ }
+ _ => Ok(false),
+ }
+ }
+
+ fn emit_close_path(&mut self) {
+ let (x, y) = (self.subpath_start_x, self.subpath_start_y);
+ self.set_current_point(x, y);
+
+ self.builder.close_path();
+ }
+
+ fn should_break_arg_sequence(&mut self) -> bool {
+ if self.match_comma().is_ok() {
+ // if there is a comma (indicating we should continue to loop), eat the comma
+ // so we're ready at the next start of the loop to process the next token.
+ false
+ } else {
+ // continue to process args in the sequence unless the next token is a comma
+ self.peek_number().is_none()
+ }
+ }
+
+ fn lineto_argument_sequence(&mut self, absolute: bool) -> Result<(), ParseError> {
+ loop {
+ let (mut x, mut y) = self.coordinate_pair()?;
+
+ if !absolute {
+ x += self.current_x;
+ y += self.current_y;
+ }
+
+ self.emit_line_to(x, y);
+
+ if self.should_break_arg_sequence() {
+ break;
+ }
+ }
+
+ Ok(())
+ }
+
+ fn horizontal_lineto_argument_sequence(&mut self, absolute: bool) -> Result<(), ParseError> {
+ loop {
+ let mut x = self.match_number()?;
+
+ if !absolute {
+ x += self.current_x;
+ }
+
+ let y = self.current_y;
+
+ self.emit_line_to(x, y);
+
+ if self.should_break_arg_sequence() {
+ break;
+ }
+ }
+
+ Ok(())
+ }
+
+ fn vertical_lineto_argument_sequence(&mut self, absolute: bool) -> Result<(), ParseError> {
+ loop {
+ let mut y = self.match_number()?;
+
+ if !absolute {
+ y += self.current_y;
+ }
+
+ let x = self.current_x;
+
+ self.emit_line_to(x, y);
+
+ if self.should_break_arg_sequence() {
+ break;
+ }
+ }
+
+ Ok(())
+ }
+
+ fn curveto_argument_sequence(&mut self, absolute: bool) -> Result<(), ParseError> {
+ loop {
+ let (mut x2, mut y2) = self.coordinate_pair()?;
+
+ self.eat_optional_comma();
+ let (mut x3, mut y3) = self.coordinate_pair()?;
+
+ self.eat_optional_comma();
+ let (mut x4, mut y4) = self.coordinate_pair()?;
+
+ if !absolute {
+ x2 += self.current_x;
+ y2 += self.current_y;
+ x3 += self.current_x;
+ y3 += self.current_y;
+ x4 += self.current_x;
+ y4 += self.current_y;
+ }
+
+ self.emit_curve_to(x2, y2, x3, y3, x4, y4);
+
+ if self.should_break_arg_sequence() {
+ break;
+ }
+ }
+
+ Ok(())
+ }
+
+ fn smooth_curveto_argument_sequence(&mut self, absolute: bool) -> Result<(), ParseError> {
+ loop {
+ let (mut x3, mut y3) = self.coordinate_pair()?;
+ self.eat_optional_comma();
+ let (mut x4, mut y4) = self.coordinate_pair()?;
+
+ if !absolute {
+ x3 += self.current_x;
+ y3 += self.current_y;
+ x4 += self.current_x;
+ y4 += self.current_y;
+ }
+
+ let (x2, y2) = (
+ self.current_x + self.current_x - self.cubic_reflection_x,
+ self.current_y + self.current_y - self.cubic_reflection_y,
+ );
+
+ self.emit_curve_to(x2, y2, x3, y3, x4, y4);
+
+ if self.should_break_arg_sequence() {
+ break;
+ }
+ }
+
+ Ok(())
+ }
+
+ fn quadratic_curveto_argument_sequence(&mut self, absolute: bool) -> Result<(), ParseError> {
+ loop {
+ let (mut a, mut b) = self.coordinate_pair()?;
+ self.eat_optional_comma();
+ let (mut c, mut d) = self.coordinate_pair()?;
+
+ if !absolute {
+ a += self.current_x;
+ b += self.current_y;
+ c += self.current_x;
+ d += self.current_y;
+ }
+
+ self.emit_quadratic_curve_to(a, b, c, d);
+
+ if self.should_break_arg_sequence() {
+ break;
+ }
+ }
+
+ Ok(())
+ }
+
+ fn smooth_quadratic_curveto_argument_sequence(
+ &mut self,
+ absolute: bool,
+ ) -> Result<(), ParseError> {
+ loop {
+ let (mut c, mut d) = self.coordinate_pair()?;
+
+ if !absolute {
+ c += self.current_x;
+ d += self.current_y;
+ }
+
+ let (a, b) = (
+ self.current_x + self.current_x - self.quadratic_reflection_x,
+ self.current_y + self.current_y - self.quadratic_reflection_y,
+ );
+
+ self.emit_quadratic_curve_to(a, b, c, d);
+
+ if self.should_break_arg_sequence() {
+ break;
+ }
+ }
+
+ Ok(())
+ }
+
+ fn elliptical_arc_argument_sequence(&mut self, absolute: bool) -> Result<(), ParseError> {
+ loop {
+ let rx = self.match_number()?.abs();
+ let ry = self.match_comma_number()?.abs();
+
+ self.eat_optional_comma();
+ let (x_axis_rotation, f1, f2) = self.match_number_and_flags()?;
+
+ let large_arc = LargeArc(f1);
+
+ let sweep = if f2 { Sweep::Positive } else { Sweep::Negative };
+
+ self.eat_optional_comma();
+
+ let (mut x, mut y) = self.coordinate_pair()?;
+
+ if !absolute {
+ x += self.current_x;
+ y += self.current_y;
+ }
+
+ self.emit_arc(rx, ry, x_axis_rotation, large_arc, sweep, x, y);
+
+ if self.should_break_arg_sequence() {
+ break;
+ }
+ }
+
+ Ok(())
+ }
+}
+
+#[derive(Debug, PartialEq)]
+pub enum ErrorKind {
+ UnexpectedToken(Token),
+ UnexpectedCommand(u8),
+ UnexpectedEof,
+ LexError(LexError),
+}
+
+#[derive(Debug, PartialEq)]
+pub struct ParseError {
+ pub position: usize,
+ pub kind: ErrorKind,
+}
+
+impl ParseError {
+ fn new(pos: usize, k: ErrorKind) -> ParseError {
+ ParseError {
+ position: pos,
+ kind: k,
+ }
+ }
+}
+
+use crate::path_parser::ErrorKind::*;
+
+impl fmt::Display for ParseError {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ let description = match self.kind {
+ UnexpectedToken(_t) => "unexpected token",
+ UnexpectedCommand(_c) => "unexpected command",
+ UnexpectedEof => "unexpected end of data",
+ LexError(_le) => "error processing token",
+ };
+ write!(f, "error at position {}: {}", self.position, description)
+ }
+}
+
+#[cfg(test)]
+#[rustfmt::skip]
+mod tests {
+ use super::*;
+
+ fn find_error_pos(s: &str) -> Option<usize> {
+ s.find('^')
+ }
+
+ fn make_parse_result(
+ error_pos_str: &str,
+ error_kind: Option<ErrorKind>,
+ ) -> Result<(), ParseError> {
+ if let Some(pos) = find_error_pos(error_pos_str) {
+ Err(ParseError {
+ position: pos,
+ kind: error_kind.unwrap(),
+ })
+ } else {
+ assert!(error_kind.is_none());
+ Ok(())
+ }
+ }
+
+ fn test_parser(
+ path_str: &str,
+ error_pos_str: &str,
+ expected_commands: &[PathCommand],
+ expected_error_kind: Option<ErrorKind>,
+ ) {
+ let expected_result = make_parse_result(error_pos_str, expected_error_kind);
+
+ let mut builder = PathBuilder::default();
+ let result = builder.parse(path_str);
+
+ let path = builder.into_path();
+ let commands = path.iter().collect::<Vec<_>>();
+
+ assert_eq!(expected_commands, commands.as_slice());
+ assert_eq!(expected_result, result);
+ }
+
+ fn moveto(x: f64, y: f64) -> PathCommand {
+ PathCommand::MoveTo(x, y)
+ }
+
+ fn lineto(x: f64, y: f64) -> PathCommand {
+ PathCommand::LineTo(x, y)
+ }
+
+ fn curveto(x2: f64, y2: f64, x3: f64, y3: f64, x4: f64, y4: f64) -> PathCommand {
+ PathCommand::CurveTo(CubicBezierCurve {
+ pt1: (x2, y2),
+ pt2: (x3, y3),
+ to: (x4, y4),
+ })
+ }
+
+ fn arc(x2: f64, y2: f64, xr: f64, large_arc: bool, sweep: bool,
+ x3: f64, y3: f64, x4: f64, y4: f64) -> PathCommand {
+ PathCommand::Arc(EllipticalArc {
+ r: (x2, y2),
+ x_axis_rotation: xr,
+ large_arc: LargeArc(large_arc),
+ sweep: match sweep {
+ true => Sweep::Positive,
+ false => Sweep::Negative,
+ },
+ from: (x3, y3),
+ to: (x4, y4),
+ })
+ }
+
+ fn closepath() -> PathCommand {
+ PathCommand::ClosePath
+ }
+
+ #[test]
+ fn handles_empty_data() {
+ test_parser(
+ "",
+ "",
+ &Vec::<PathCommand>::new(),
+ None,
+ );
+ }
+
+ #[test]
+ fn handles_numbers() {
+ test_parser(
+ "M 10 20",
+ "",
+ &vec![moveto(10.0, 20.0)],
+ None,
+ );
+
+ test_parser(
+ "M -10 -20",
+ "",
+ &vec![moveto(-10.0, -20.0)],
+ None,
+ );
+
+ test_parser(
+ "M .10 0.20",
+ "",
+ &vec![moveto(0.10, 0.20)],
+ None,
+ );
+
+ test_parser(
+ "M -.10 -0.20",
+ "",
+ &vec![moveto(-0.10, -0.20)],
+ None,
+ );
+
+ test_parser(
+ "M-.10-0.20",
+ "",
+ &vec![moveto(-0.10, -0.20)],
+ None,
+ );
+
+ test_parser(
+ "M10.5.50",
+ "",
+ &vec![moveto(10.5, 0.50)],
+ None,
+ );
+
+ test_parser(
+ "M.10.20",
+ "",
+ &vec![moveto(0.10, 0.20)],
+ None,
+ );
+
+ test_parser(
+ "M .10E1 .20e-4",
+ "",
+ &vec![moveto(1.0, 0.000020)],
+ None,
+ );
+
+ test_parser(
+ "M-.10E1-.20",
+ "",
+ &vec![moveto(-1.0, -0.20)],
+ None,
+ );
+
+ test_parser(
+ "M10.10E2 -0.20e3",
+ "",
+ &vec![moveto(1010.0, -200.0)],
+ None,
+ );
+
+ test_parser(
+ "M-10.10E2-0.20e-3",
+ "",
+ &vec![moveto(-1010.0, -0.00020)],
+ None,
+ );
+
+ test_parser(
+ "M1e2.5", // a decimal after exponent start the next number
+ "",
+ &vec![moveto(100.0, 0.5)],
+ None,
+ );
+
+ test_parser(
+ "M1e-2.5", // but we are allowed a sign after exponent
+ "",
+ &vec![moveto(0.01, 0.5)],
+ None,
+ );
+
+ test_parser(
+ "M1e+2.5", // but we are allowed a sign after exponent
+ "",
+ &vec![moveto(100.0, 0.5)],
+ None,
+ );
+ }
+
+ #[test]
+ fn detects_bogus_numbers() {
+ test_parser(
+ "M+",
+ " ^",
+ &vec![],
+ Some(ErrorKind::LexError(LexError::UnexpectedEof)),
+ );
+
+ test_parser(
+ "M-",
+ " ^",
+ &vec![],
+ Some(ErrorKind::LexError(LexError::UnexpectedEof)),
+ );
+
+ test_parser(
+ "M+x",
+ " ^",
+ &vec![],
+ Some(ErrorKind::LexError(LexError::UnexpectedByte(b'x'))),
+ );
+
+ test_parser(
+ "M10e",
+ " ^",
+ &vec![],
+ Some(ErrorKind::LexError(LexError::ParseFloatError)),
+ );
+
+ test_parser(
+ "M10ex",
+ " ^",
+ &vec![],
+ Some(ErrorKind::LexError(LexError::ParseFloatError)),
+ );
+
+ test_parser(
+ "M10e-",
+ " ^",
+ &vec![],
+ Some(ErrorKind::LexError(LexError::ParseFloatError)),
+ );
+
+ test_parser(
+ "M10e+x",
+ " ^",
+ &vec![],
+ Some(ErrorKind::LexError(LexError::ParseFloatError)),
+ );
+ }
+
+ #[test]
+ fn handles_numbers_with_comma() {
+ test_parser(
+ "M 10, 20",
+ "",
+ &vec![moveto(10.0, 20.0)],
+ None,
+ );
+
+ test_parser(
+ "M -10,-20",
+ "",
+ &vec![moveto(-10.0, -20.0)],
+ None,
+ );
+
+ test_parser(
+ "M.10 , 0.20",
+ "",
+ &vec![moveto(0.10, 0.20)],
+ None,
+ );
+
+ test_parser(
+ "M -.10, -0.20 ",
+ "",
+ &vec![moveto(-0.10, -0.20)],
+ None,
+ );
+
+ test_parser(
+ "M-.10-0.20",
+ "",
+ &vec![moveto(-0.10, -0.20)],
+ None,
+ );
+
+ test_parser(
+ "M.10.20",
+ "",
+ &vec![moveto(0.10, 0.20)],
+ None,
+ );
+
+ test_parser(
+ "M .10E1,.20e-4",
+ "",
+ &vec![moveto(1.0, 0.000020)],
+ None,
+ );
+
+ test_parser(
+ "M-.10E-2,-.20",
+ "",
+ &vec![moveto(-0.0010, -0.20)],
+ None,
+ );
+
+ test_parser(
+ "M10.10E2,-0.20e3",
+ "",
+ &vec![moveto(1010.0, -200.0)],
+ None,
+ );
+
+ test_parser(
+ "M-10.10E2,-0.20e-3",
+ "",
+ &vec![moveto(-1010.0, -0.00020)],
+ None,
+ );
+ }
+
+ #[test]
+ fn handles_single_moveto() {
+ test_parser(
+ "M 10 20 ",
+ "",
+ &vec![moveto(10.0, 20.0)],
+ None,
+ );
+
+ test_parser(
+ "M10,20 ",
+ "",
+ &vec![moveto(10.0, 20.0)],
+ None,
+ );
+
+ test_parser(
+ "M10 20 ",
+ "",
+ &vec![moveto(10.0, 20.0)],
+ None,
+ );
+
+ test_parser(
+ " M10,20 ",
+ "",
+ &vec![moveto(10.0, 20.0)],
+ None,
+ );
+ }
+
+ #[test]
+ fn handles_relative_moveto() {
+ test_parser(
+ "m10 20",
+ "",
+ &vec![moveto(10.0, 20.0)],
+ None,
+ );
+ }
+
+ #[test]
+ fn handles_absolute_moveto_with_implicit_lineto() {
+ test_parser(
+ "M10 20 30 40",
+ "",
+ &vec![moveto(10.0, 20.0), lineto(30.0, 40.0)],
+ None,
+ );
+
+ test_parser(
+ "M10,20,30,40",
+ "",
+ &vec![moveto(10.0, 20.0), lineto(30.0, 40.0)],
+ None,
+ );
+
+ test_parser(
+ "M.1-2,3E2-4",
+ "",
+ &vec![moveto(0.1, -2.0), lineto(300.0, -4.0)],
+ None,
+ );
+ }
+
+ #[test]
+ fn handles_relative_moveto_with_implicit_lineto() {
+ test_parser(
+ "m10 20 30 40",
+ "",
+ &vec![moveto(10.0, 20.0), lineto(40.0, 60.0)],
+ None,
+ );
+ }
+
+ #[test]
+ fn handles_relative_moveto_with_relative_lineto_sequence() {
+ test_parser(
+ // 1 2 3 4 5
+ "m 46,447 l 0,0.5 -1,0 -1,0 0,1 0,12",
+ "",
+ &vec![moveto(46.0, 447.0), lineto(46.0, 447.5), lineto(45.0, 447.5),
+ lineto(44.0, 447.5), lineto(44.0, 448.5), lineto(44.0, 460.5)],
+ None,
+ );
+ }
+
+ #[test]
+ fn handles_absolute_moveto_with_implicit_linetos() {
+ test_parser(
+ "M10,20 30,40,50 60",
+ "",
+ &vec![moveto(10.0, 20.0), lineto(30.0, 40.0), lineto(50.0, 60.0)],
+ None,
+ );
+ }
+
+ #[test]
+ fn handles_relative_moveto_with_implicit_linetos() {
+ test_parser(
+ "m10 20 30 40 50 60",
+ "",
+ &vec![moveto(10.0, 20.0), lineto(40.0, 60.0), lineto(90.0, 120.0)],
+ None,
+ );
+ }
+
+ #[test]
+ fn handles_absolute_moveto_moveto() {
+ test_parser(
+ "M10 20 M 30 40",
+ "",
+ &vec![moveto(10.0, 20.0), moveto(30.0, 40.0)],
+ None,
+ );
+ }
+
+ #[test]
+ fn handles_relative_moveto_moveto() {
+ test_parser(
+ "m10 20 m 30 40",
+ "",
+ &vec![moveto(10.0, 20.0), moveto(40.0, 60.0)],
+ None,
+ );
+ }
+
+ #[test]
+ fn handles_relative_moveto_lineto_moveto() {
+ test_parser(
+ "m10 20 30 40 m 50 60",
+ "",
+ &vec![moveto(10.0, 20.0), lineto(40.0, 60.0), moveto(90.0, 120.0)],
+ None,
+ );
+ }
+
+ #[test]
+ fn handles_absolute_moveto_lineto() {
+ test_parser(
+ "M10 20 L30,40",
+ "",
+ &vec![moveto(10.0, 20.0), lineto(30.0, 40.0)],
+ None,
+ );
+ }
+
+ #[test]
+ fn handles_relative_moveto_lineto() {
+ test_parser(
+ "m10 20 l30,40",
+ "",
+ &vec![moveto(10.0, 20.0), lineto(40.0, 60.0)],
+ None,
+ );
+ }
+
+ #[test]
+ fn handles_relative_moveto_lineto_lineto_abs_lineto() {
+ test_parser(
+ "m10 20 30 40l30,40,50 60L200,300",
+ "",
+ &vec![
+ moveto(10.0, 20.0),
+ lineto(40.0, 60.0),
+ lineto(70.0, 100.0),
+ lineto(120.0, 160.0),
+ lineto(200.0, 300.0),
+ ],
+ None,
+ );
+ }
+
+ #[test]
+ fn handles_horizontal_lineto() {
+ test_parser(
+ "M10 20 H30",
+ "",
+ &vec![moveto(10.0, 20.0), lineto(30.0, 20.0)],
+ None,
+ );
+
+ test_parser(
+ "M10 20 H30 40",
+ "",
+ &vec![moveto(10.0, 20.0), lineto(30.0, 20.0), lineto(40.0, 20.0)],
+ None,
+ );
+
+ test_parser(
+ "M10 20 H30,40-50",
+ "",
+ &vec![
+ moveto(10.0, 20.0),
+ lineto(30.0, 20.0),
+ lineto(40.0, 20.0),
+ lineto(-50.0, 20.0),
+ ],
+ None,
+ );
+
+ test_parser(
+ "m10 20 h30,40-50",
+ "",
+ &vec![
+ moveto(10.0, 20.0),
+ lineto(40.0, 20.0),
+ lineto(80.0, 20.0),
+ lineto(30.0, 20.0),
+ ],
+ None,
+ );
+ }
+
+ #[test]
+ fn handles_vertical_lineto() {
+ test_parser(
+ "M10 20 V30",
+ "",
+ &vec![moveto(10.0, 20.0), lineto(10.0, 30.0)],
+ None,
+ );
+
+ test_parser(
+ "M10 20 V30 40",
+ "",
+ &vec![moveto(10.0, 20.0), lineto(10.0, 30.0), lineto(10.0, 40.0)],
+ None,
+ );
+
+ test_parser(
+ "M10 20 V30,40-50",
+ "",
+ &vec![
+ moveto(10.0, 20.0),
+ lineto(10.0, 30.0),
+ lineto(10.0, 40.0),
+ lineto(10.0, -50.0),
+ ],
+ None,
+ );
+
+ test_parser(
+ "m10 20 v30,40-50",
+ "",
+ &vec![
+ moveto(10.0, 20.0),
+ lineto(10.0, 50.0),
+ lineto(10.0, 90.0),
+ lineto(10.0, 40.0),
+ ],
+ None,
+ );
+ }
+
+ #[test]
+ fn handles_curveto() {
+ test_parser(
+ "M10 20 C 30,40 50 60-70,80",
+ "",
+ &vec![
+ moveto(10.0, 20.0),
+ curveto(30.0, 40.0, 50.0, 60.0, -70.0, 80.0),
+ ],
+ None,
+ );
+
+ test_parser(
+ "M10 20 C 30,40 50 60-70,80,90 100,110 120,130,140",
+ "",
+ &vec![
+ moveto(10.0, 20.0),
+ curveto(30.0, 40.0, 50.0, 60.0, -70.0, 80.0),
+ curveto(90.0, 100.0, 110.0, 120.0, 130.0, 140.0),
+ ],
+ None,
+ );
+
+ test_parser(
+ "m10 20 c 30,40 50 60-70,80,90 100,110 120,130,140",
+ "",
+ &vec![
+ moveto(10.0, 20.0),
+ curveto(40.0, 60.0, 60.0, 80.0, -60.0, 100.0),
+ curveto(30.0, 200.0, 50.0, 220.0, 70.0, 240.0),
+ ],
+ None,
+ );
+
+ test_parser(
+ "m10 20 c 30,40 50 60-70,80,90 100,110 120,130,140",
+ "",
+ &vec![
+ moveto(10.0, 20.0),
+ curveto(40.0, 60.0, 60.0, 80.0, -60.0, 100.0),
+ curveto(30.0, 200.0, 50.0, 220.0, 70.0, 240.0),
+ ],
+ None,
+ );
+ }
+
+ #[test]
+ fn handles_smooth_curveto() {
+ test_parser(
+ "M10 20 S 30,40-50,60",
+ "",
+ &vec![
+ moveto(10.0, 20.0),
+ curveto(10.0, 20.0, 30.0, 40.0, -50.0, 60.0),
+ ],
+ None,
+ );
+
+ test_parser(
+ "M10 20 S 30,40 50 60-70,80,90 100",
+ "",
+ &vec![
+ moveto(10.0, 20.0),
+ curveto(10.0, 20.0, 30.0, 40.0, 50.0, 60.0),
+ curveto(70.0, 80.0, -70.0, 80.0, 90.0, 100.0),
+ ],
+ None,
+ );
+
+ test_parser(
+ "m10 20 s 30,40 50 60-70,80,90 100",
+ "",
+ &vec![
+ moveto(10.0, 20.0),
+ curveto(10.0, 20.0, 40.0, 60.0, 60.0, 80.0),
+ curveto(80.0, 100.0, -10.0, 160.0, 150.0, 180.0),
+ ],
+ None,
+ );
+ }
+
+ #[test]
+ fn handles_quadratic_curveto() {
+ test_parser(
+ "M10 20 Q30 40 50 60",
+ "",
+ &vec![
+ moveto(10.0, 20.0),
+ curveto(
+ 70.0 / 3.0,
+ 100.0 / 3.0,
+ 110.0 / 3.0,
+ 140.0 / 3.0,
+ 50.0,
+ 60.0,
+ ),
+ ],
+ None,
+ );
+
+ test_parser(
+ "M10 20 Q30 40 50 60,70,80-90 100",
+ "",
+ &vec![
+ moveto(10.0, 20.0),
+ curveto(
+ 70.0 / 3.0,
+ 100.0 / 3.0,
+ 110.0 / 3.0,
+ 140.0 / 3.0,
+ 50.0,
+ 60.0,
+ ),
+ curveto(
+ 190.0 / 3.0,
+ 220.0 / 3.0,
+ 50.0 / 3.0,
+ 260.0 / 3.0,
+ -90.0,
+ 100.0,
+ ),
+ ],
+ None,
+ );
+
+ test_parser(
+ "m10 20 q 30,40 50 60-70,80 90 100",
+ "",
+ &vec![
+ moveto(10.0, 20.0),
+ curveto(
+ 90.0 / 3.0,
+ 140.0 / 3.0,
+ 140.0 / 3.0,
+ 200.0 / 3.0,
+ 60.0,
+ 80.0,
+ ),
+ curveto(
+ 40.0 / 3.0,
+ 400.0 / 3.0,
+ 130.0 / 3.0,
+ 500.0 / 3.0,
+ 150.0,
+ 180.0,
+ ),
+ ],
+ None,
+ );
+ }
+
+ #[test]
+ fn handles_smooth_quadratic_curveto() {
+ test_parser(
+ "M10 20 T30 40",
+ "",
+ &vec![
+ moveto(10.0, 20.0),
+ curveto(10.0, 20.0, 50.0 / 3.0, 80.0 / 3.0, 30.0, 40.0),
+ ],
+ None,
+ );
+
+ test_parser(
+ "M10 20 Q30 40 50 60 T70 80",
+ "",
+ &vec![
+ moveto(10.0, 20.0),
+ curveto(
+ 70.0 / 3.0,
+ 100.0 / 3.0,
+ 110.0 / 3.0,
+ 140.0 / 3.0,
+ 50.0,
+ 60.0,
+ ),
+ curveto(190.0 / 3.0, 220.0 / 3.0, 70.0, 80.0, 70.0, 80.0),
+ ],
+ None,
+ );
+
+ test_parser(
+ "m10 20 q 30,40 50 60t-70,80",
+ "",
+ &vec![
+ moveto(10.0, 20.0),
+ curveto(
+ 90.0 / 3.0,
+ 140.0 / 3.0,
+ 140.0 / 3.0,
+ 200.0 / 3.0,
+ 60.0,
+ 80.0,
+ ),
+ curveto(220.0 / 3.0, 280.0 / 3.0, 50.0, 120.0, -10.0, 160.0),
+ ],
+ None,
+ );
+ }
+
+ #[test]
+ fn handles_elliptical_arc() {
+ // no space required between arc flags
+ test_parser("M 1 2 A 1 2 3 00 6 7",
+ "",
+ &vec![moveto(1.0, 2.0),
+ arc(1.0, 2.0, 3.0, false, false, 1.0, 2.0, 6.0, 7.0)],
+ None);
+ // or after...
+ test_parser("M 1 2 A 1 2 3 016 7",
+ "",
+ &vec![moveto(1.0, 2.0),
+ arc(1.0, 2.0, 3.0, false, true, 1.0, 2.0, 6.0, 7.0)],
+ None);
+ // commas and whitespace are optionally allowed
+ test_parser("M 1 2 A 1 2 3 10,6 7",
+ "",
+ &vec![moveto(1.0, 2.0),
+ arc(1.0, 2.0, 3.0, true, false, 1.0, 2.0, 6.0, 7.0)],
+ None);
+ test_parser("M 1 2 A 1 2 3 1,16, 7",
+ "",
+ &vec![moveto(1.0, 2.0),
+ arc(1.0, 2.0, 3.0, true, true, 1.0, 2.0, 6.0, 7.0)],
+ None);
+ test_parser("M 1 2 A 1 2 3 1,1 6 7",
+ "",
+ &vec![moveto(1.0, 2.0),
+ arc(1.0, 2.0, 3.0, true, true, 1.0, 2.0, 6.0, 7.0)],
+ None);
+ test_parser("M 1 2 A 1 2 3 1 1 6 7",
+ "",
+ &vec![moveto(1.0, 2.0),
+ arc(1.0, 2.0, 3.0, true, true, 1.0, 2.0, 6.0, 7.0)],
+ None);
+ test_parser("M 1 2 A 1 2 3 1 16 7",
+ "",
+ &vec![moveto(1.0, 2.0),
+ arc(1.0, 2.0, 3.0, true, true, 1.0, 2.0, 6.0, 7.0)],
+ None);
+ }
+
+ #[test]
+ fn handles_close_path() {
+ test_parser("M10 20 Z", "", &vec![moveto(10.0, 20.0), closepath()], None);
+
+ test_parser(
+ "m10 20 30 40 m 50 60 70 80 90 100z",
+ "",
+ &vec![
+ moveto(10.0, 20.0),
+ lineto(40.0, 60.0),
+ moveto(90.0, 120.0),
+ lineto(160.0, 200.0),
+ lineto(250.0, 300.0),
+ closepath(),
+ ],
+ None,
+ );
+ }
+
+ #[test]
+ fn first_command_must_be_moveto() {
+ test_parser(
+ " L10 20",
+ " ^", // FIXME: why is this not at position 2?
+ &vec![],
+ Some(ErrorKind::UnexpectedCommand(b'L')),
+ );
+ }
+
+ #[test]
+ fn moveto_args() {
+ test_parser(
+ "M",
+ " ^",
+ &vec![],
+ Some(ErrorKind::UnexpectedEof),
+ );
+
+ test_parser(
+ "M,",
+ " ^",
+ &vec![],
+ Some(ErrorKind::UnexpectedToken(Comma)),
+ );
+
+ test_parser(
+ "M10",
+ " ^",
+ &vec![],
+ Some(ErrorKind::UnexpectedEof),
+ );
+
+ test_parser(
+ "M10,",
+ " ^",
+ &vec![],
+ Some(ErrorKind::UnexpectedEof),
+ );
+
+ test_parser(
+ "M10x",
+ " ^",
+ &vec![],
+ Some(ErrorKind::UnexpectedToken(Command(b'x'))),
+ );
+
+ test_parser(
+ "M10,x",
+ " ^",
+ &vec![],
+ Some(ErrorKind::UnexpectedToken(Command(b'x'))),
+ );
+ }
+
+ #[test]
+ fn moveto_implicit_lineto_args() {
+ test_parser(
+ "M10-20,",
+ " ^",
+ &vec![moveto(10.0, -20.0)],
+ Some(ErrorKind::UnexpectedEof),
+ );
+
+ test_parser(
+ "M10-20-30",
+ " ^",
+ &vec![moveto(10.0, -20.0)],
+ Some(ErrorKind::UnexpectedEof),
+ );
+
+ test_parser(
+ "M10-20-30 x",
+ " ^",
+ &vec![moveto(10.0, -20.0)],
+ Some(ErrorKind::UnexpectedToken(Command(b'x'))),
+ );
+ }
+
+ #[test]
+ fn closepath_no_args() {
+ test_parser(
+ "M10-20z10",
+ " ^",
+ &vec![moveto(10.0, -20.0), closepath()],
+ Some(ErrorKind::UnexpectedToken(Number(10.0))),
+ );
+
+ test_parser(
+ "M10-20z,",
+ " ^",
+ &vec![moveto(10.0, -20.0), closepath()],
+ Some(ErrorKind::UnexpectedToken(Comma)),
+ );
+ }
+
+ #[test]
+ fn lineto_args() {
+ test_parser(
+ "M10-20L10",
+ " ^",
+ &vec![moveto(10.0, -20.0)],
+ Some(ErrorKind::UnexpectedEof),
+ );
+
+ test_parser(
+ "M 10,10 L 20,20,30",
+ " ^",
+ &vec![moveto(10.0, 10.0), lineto(20.0, 20.0)],
+ Some(ErrorKind::UnexpectedEof),
+ );
+
+ test_parser(
+ "M 10,10 L 20,20,",
+ " ^",
+ &vec![moveto(10.0, 10.0), lineto(20.0, 20.0)],
+ Some(ErrorKind::UnexpectedEof),
+ );
+ }
+
+ #[test]
+ fn horizontal_lineto_args() {
+ test_parser(
+ "M10-20H",
+ " ^",
+ &vec![moveto(10.0, -20.0)],
+ Some(ErrorKind::UnexpectedEof),
+ );
+
+ test_parser(
+ "M10-20H,",
+ " ^",
+ &vec![moveto(10.0, -20.0)],
+ Some(ErrorKind::UnexpectedToken(Comma)),
+ );
+
+ test_parser(
+ "M10-20H30,",
+ " ^",
+ &vec![moveto(10.0, -20.0), lineto(30.0, -20.0)],
+ Some(ErrorKind::UnexpectedEof),
+ );
+ }
+
+ #[test]
+ fn vertical_lineto_args() {
+ test_parser(
+ "M10-20v",
+ " ^",
+ &vec![moveto(10.0, -20.0)],
+ Some(ErrorKind::UnexpectedEof),
+ );
+
+ test_parser(
+ "M10-20v,",
+ " ^",
+ &vec![moveto(10.0, -20.0)],
+ Some(ErrorKind::UnexpectedToken(Comma)),
+ );
+
+ test_parser(
+ "M10-20v30,",
+ " ^",
+ &vec![moveto(10.0, -20.0), lineto(10.0, 10.0)],
+ Some(ErrorKind::UnexpectedEof),
+ );
+ }
+
+ #[test]
+ fn curveto_args() {
+ test_parser(
+ "M10-20C1",
+ " ^",
+ &vec![moveto(10.0, -20.0)],
+ Some(ErrorKind::UnexpectedEof),
+ );
+ test_parser(
+ "M10-20C1,",
+ " ^",
+ &vec![moveto(10.0, -20.0)],
+ Some(ErrorKind::UnexpectedEof),
+ );
+
+ test_parser(
+ "M10-20C1 2",
+ " ^",
+ &vec![moveto(10.0, -20.0)],
+ Some(ErrorKind::UnexpectedEof),
+ );
+ test_parser(
+ "M10-20C1,2,",
+ " ^",
+ &vec![moveto(10.0, -20.0)],
+ Some(ErrorKind::UnexpectedEof),
+ );
+
+ test_parser(
+ "M10-20C1 2 3",
+ " ^",
+ &vec![moveto(10.0, -20.0)],
+ Some(ErrorKind::UnexpectedEof),
+ );
+ test_parser(
+ "M10-20C1,2,3",
+ " ^",
+ &vec![moveto(10.0, -20.0)],
+ Some(ErrorKind::UnexpectedEof),
+ );
+ test_parser(
+ "M10-20C1,2,3,",
+ " ^",
+ &vec![moveto(10.0, -20.0)],
+ Some(ErrorKind::UnexpectedEof),
+ );
+
+ test_parser(
+ "M10-20C1 2 3 4",
+ " ^",
+ &vec![moveto(10.0, -20.0)],
+ Some(ErrorKind::UnexpectedEof),
+ );
+ test_parser(
+ "M10-20C1,2,3,4",
+ " ^",
+ &vec![moveto(10.0, -20.0)],
+ Some(ErrorKind::UnexpectedEof),
+ );
+ test_parser(
+ "M10-20C1,2,3,4,",
+ " ^",
+ &vec![moveto(10.0, -20.0)],
+ Some(ErrorKind::UnexpectedEof),
+ );
+
+ test_parser(
+ "M10-20C1 2 3 4 5",
+ " ^",
+ &vec![moveto(10.0, -20.0)],
+ Some(ErrorKind::UnexpectedEof),
+ );
+ test_parser(
+ "M10-20C1,2,3,4,5",
+ " ^",
+ &vec![moveto(10.0, -20.0)],
+ Some(ErrorKind::UnexpectedEof),
+ );
+ test_parser(
+ "M10-20C1,2,3,4,5,",
+ " ^",
+ &vec![moveto(10.0, -20.0)],
+ Some(ErrorKind::UnexpectedEof),
+ );
+
+ test_parser(
+ "M10-20C1,2,3,4,5,6,",
+ " ^",
+ &vec![moveto(10.0, -20.0), curveto(1.0, 2.0, 3.0, 4.0, 5.0, 6.0)],
+ Some(ErrorKind::UnexpectedEof),
+ );
+ }
+
+ #[test]
+ fn smooth_curveto_args() {
+ test_parser(
+ "M10-20S1",
+ " ^",
+ &vec![moveto(10.0, -20.0)],
+ Some(ErrorKind::UnexpectedEof),
+ );
+ test_parser(
+ "M10-20S1,",
+ " ^",
+ &vec![moveto(10.0, -20.0)],
+ Some(ErrorKind::UnexpectedEof),
+ );
+
+ test_parser(
+ "M10-20S1 2",
+ " ^",
+ &vec![moveto(10.0, -20.0)],
+ Some(ErrorKind::UnexpectedEof),
+ );
+ test_parser(
+ "M10-20S1,2,",
+ " ^",
+ &vec![moveto(10.0, -20.0)],
+ Some(ErrorKind::UnexpectedEof),
+ );
+
+ test_parser(
+ "M10-20S1 2 3",
+ " ^",
+ &vec![moveto(10.0, -20.0)],
+ Some(ErrorKind::UnexpectedEof),
+ );
+ test_parser(
+ "M10-20S1,2,3",
+ " ^",
+ &vec![moveto(10.0, -20.0)],
+ Some(ErrorKind::UnexpectedEof),
+ );
+ test_parser(
+ "M10-20S1,2,3,",
+ " ^",
+ &vec![moveto(10.0, -20.0)],
+ Some(ErrorKind::UnexpectedEof),
+ );
+
+ test_parser(
+ "M10-20S1,2,3,4,",
+ " ^",
+ &vec![
+ moveto(10.0, -20.0),
+ curveto(10.0, -20.0, 1.0, 2.0, 3.0, 4.0),
+ ],
+ Some(ErrorKind::UnexpectedEof),
+ );
+ }
+
+ #[test]
+ fn quadratic_bezier_curveto_args() {
+ test_parser(
+ "M10-20Q1",
+ " ^",
+ &vec![moveto(10.0, -20.0)],
+ Some(ErrorKind::UnexpectedEof),
+ );
+ test_parser(
+ "M10-20Q1,",
+ " ^",
+ &vec![moveto(10.0, -20.0)],
+ Some(ErrorKind::UnexpectedEof),
+ );
+
+ test_parser(
+ "M10-20Q1 2",
+ " ^",
+ &vec![moveto(10.0, -20.0)],
+ Some(ErrorKind::UnexpectedEof),
+ );
+ test_parser(
+ "M10-20Q1,2,",
+ " ^",
+ &vec![moveto(10.0, -20.0)],
+ Some(ErrorKind::UnexpectedEof),
+ );
+
+ test_parser(
+ "M10-20Q1 2 3",
+ " ^",
+ &vec![moveto(10.0, -20.0)],
+ Some(ErrorKind::UnexpectedEof),
+ );
+ test_parser(
+ "M10-20Q1,2,3",
+ " ^",
+ &vec![moveto(10.0, -20.0)],
+ Some(ErrorKind::UnexpectedEof),
+ );
+ test_parser(
+ "M10-20Q1,2,3,",
+ " ^",
+ &vec![moveto(10.0, -20.0)],
+ Some(ErrorKind::UnexpectedEof),
+ );
+
+ test_parser(
+ "M10 20 Q30 40 50 60,",
+ " ^",
+ &vec![
+ moveto(10.0, 20.0),
+ curveto(
+ 70.0 / 3.0,
+ 100.0 / 3.0,
+ 110.0 / 3.0,
+ 140.0 / 3.0,
+ 50.0,
+ 60.0,
+ ),
+ ],
+ Some(ErrorKind::UnexpectedEof),
+ );
+ }
+
+ #[test]
+ fn smooth_quadratic_bezier_curveto_args() {
+ test_parser(
+ "M10-20T1",
+ " ^",
+ &vec![moveto(10.0, -20.0)],
+ Some(ErrorKind::UnexpectedEof),
+ );
+ test_parser(
+ "M10-20T1,",
+ " ^",
+ &vec![moveto(10.0, -20.0)],
+ Some(ErrorKind::UnexpectedEof),
+ );
+
+ test_parser(
+ "M10 20 T30 40,",
+ " ^",
+ &vec![
+ moveto(10.0, 20.0),
+ curveto(10.0, 20.0, 50.0 / 3.0, 80.0 / 3.0, 30.0, 40.0),
+ ],
+ Some(ErrorKind::UnexpectedEof),
+ );
+ }
+
+ #[test]
+ fn elliptical_arc_args() {
+ test_parser(
+ "M10-20A1",
+ " ^",
+ &vec![moveto(10.0, -20.0)],
+ Some(ErrorKind::UnexpectedEof),
+ );
+ test_parser(
+ "M10-20A1,",
+ " ^",
+ &vec![moveto(10.0, -20.0)],
+ Some(ErrorKind::UnexpectedEof),
+ );
+
+ test_parser(
+ "M10-20A1 2",
+ " ^",
+ &vec![moveto(10.0, -20.0)],
+ Some(ErrorKind::UnexpectedEof),
+ );
+ test_parser(
+ "M10-20A1 2,",
+ " ^",
+ &vec![moveto(10.0, -20.0)],
+ Some(ErrorKind::UnexpectedEof),
+ );
+
+ test_parser(
+ "M10-20A1 2 3",
+ " ^",
+ &vec![moveto(10.0, -20.0)],
+ Some(ErrorKind::UnexpectedEof),
+ );
+ test_parser(
+ "M10-20A1 2 3,",
+ " ^",
+ &vec![moveto(10.0, -20.0)],
+ Some(ErrorKind::UnexpectedEof),
+ );
+
+ test_parser(
+ "M10-20A1 2 3 4",
+ " ^",
+ &vec![moveto(10.0, -20.0)],
+ Some(ErrorKind::LexError(LexError::UnexpectedByte(b'4'))),
+ );
+
+ test_parser(
+ "M10-20A1 2 3 1",
+ " ^",
+ &vec![moveto(10.0, -20.0)],
+ Some(ErrorKind::UnexpectedEof),
+ );
+ test_parser(
+ "M10-20A1 2 3,1,",
+ " ^",
+ &vec![moveto(10.0, -20.0)],
+ Some(ErrorKind::UnexpectedEof),
+ );
+
+ test_parser(
+ "M10-20A1 2 3 1 5",
+ " ^",
+ &vec![moveto(10.0, -20.0)],
+ Some(ErrorKind::LexError(LexError::UnexpectedByte(b'5'))),
+ );
+
+ test_parser(
+ "M10-20A1 2 3 1 1",
+ " ^",
+ &vec![moveto(10.0, -20.0)],
+ Some(ErrorKind::UnexpectedEof),
+ );
+ test_parser(
+ "M10-20A1 2 3,1,1,",
+ " ^",
+ &vec![moveto(10.0, -20.0)],
+ Some(ErrorKind::UnexpectedEof),
+ );
+
+ test_parser(
+ "M10-20A1 2 3 1 1 6",
+ " ^",
+ &vec![moveto(10.0, -20.0)],
+ Some(ErrorKind::UnexpectedEof),
+ );
+ test_parser(
+ "M10-20A1 2 3,1,1,6,",
+ " ^",
+ &vec![moveto(10.0, -20.0)],
+ Some(ErrorKind::UnexpectedEof),
+ );
+
+ // no non 0|1 chars allowed for flags
+ test_parser("M 1 2 A 1 2 3 1.0 0.0 6 7",
+ " ^",
+ &vec![moveto(1.0, 2.0)],
+ Some(ErrorKind::UnexpectedToken(Number(0.0))));
+
+ test_parser("M10-20A1 2 3,1,1,6,7,",
+ " ^",
+ &vec![moveto(10.0, -20.0),
+ arc(1.0, 2.0, 3.0, true, true, 10.0, -20.0, 6.0, 7.0)],
+ Some(ErrorKind::UnexpectedEof));
+ }
+
+ #[test]
+ fn bugs() {
+ // https://gitlab.gnome.org/GNOME/librsvg/issues/345
+ test_parser(
+ "M.. 1,0 0,100000",
+ " ^", // FIXME: we have to report position of error in lexer errors to make this right
+ &vec![],
+ Some(ErrorKind::LexError(LexError::UnexpectedByte(b'.'))),
+ );
+ }
+}
diff --git a/rsvg/src/pattern.rs b/rsvg/src/pattern.rs
new file mode 100644
index 00000000..8a10317f
--- /dev/null
+++ b/rsvg/src/pattern.rs
@@ -0,0 +1,525 @@
+//! The `pattern` element.
+
+use markup5ever::{expanded_name, local_name, namespace_url, ns};
+
+use crate::aspect_ratio::*;
+use crate::coord_units::CoordUnits;
+use crate::document::{AcquiredNode, AcquiredNodes, NodeId, NodeStack};
+use crate::drawing_ctx::Viewport;
+use crate::element::{set_attribute, ElementData, ElementTrait};
+use crate::error::*;
+use crate::href::{is_href, set_href};
+use crate::length::*;
+use crate::node::{Node, NodeBorrow, WeakNode};
+use crate::parsers::ParseValue;
+use crate::rect::Rect;
+use crate::session::Session;
+use crate::transform::{Transform, TransformAttribute};
+use crate::unit_interval::UnitInterval;
+use crate::viewbox::*;
+use crate::xml::Attributes;
+
+coord_units!(PatternUnits, CoordUnits::ObjectBoundingBox);
+coord_units!(PatternContentUnits, CoordUnits::UserSpaceOnUse);
+
+#[derive(Clone, Default)]
+struct Common {
+ units: Option<PatternUnits>,
+ content_units: Option<PatternContentUnits>,
+ // This Option<Option<ViewBox>> is a bit strange. We want a field
+ // with value None to mean, "this field isn't resolved yet". However,
+ // the vbox can very well be *not* specified in the SVG file.
+ // In that case, the fully resolved pattern will have a .vbox=Some(None) value.
+ vbox: Option<Option<ViewBox>>,
+ preserve_aspect_ratio: Option<AspectRatio>,
+ transform: Option<TransformAttribute>,
+ x: Option<Length<Horizontal>>,
+ y: Option<Length<Vertical>>,
+ width: Option<ULength<Horizontal>>,
+ height: Option<ULength<Vertical>>,
+}
+
+/// State used during the pattern resolution process
+///
+/// This is the current node's pattern information, plus the fallback
+/// that should be used in case that information is not complete for a
+/// resolved pattern yet.
+struct Unresolved {
+ pattern: UnresolvedPattern,
+ fallback: Option<NodeId>,
+}
+
+/// Keeps track of which Pattern provided a non-empty set of children during pattern resolution
+#[derive(Clone)]
+enum UnresolvedChildren {
+ /// Points back to the original Pattern if it had no usable children
+ Unresolved,
+
+ /// Points back to the original Pattern, as no pattern in the
+ /// chain of fallbacks had usable children. This only gets returned
+ /// by resolve_from_defaults().
+ ResolvedEmpty,
+
+ /// Points back to the Pattern that had usable children.
+ WithChildren(WeakNode),
+}
+
+/// Keeps track of which Pattern provided a non-empty set of children during pattern resolution
+#[derive(Clone)]
+enum Children {
+ Empty,
+
+ /// Points back to the Pattern that had usable children
+ WithChildren(WeakNode),
+}
+
+/// Main structure used during pattern resolution. For unresolved
+/// patterns, we store all fields as Option<T> - if None, it means
+/// that the field is not specified; if Some(T), it means that the
+/// field was specified.
+struct UnresolvedPattern {
+ common: Common,
+
+ // Point back to our corresponding node, or to the fallback node which has children.
+ // If the value is None, it means we are fully resolved and didn't find any children
+ // among the fallbacks.
+ children: UnresolvedChildren,
+}
+
+#[derive(Clone)]
+pub struct ResolvedPattern {
+ units: PatternUnits,
+ content_units: PatternContentUnits,
+ vbox: Option<ViewBox>,
+ preserve_aspect_ratio: AspectRatio,
+ transform: TransformAttribute,
+ x: Length<Horizontal>,
+ y: Length<Vertical>,
+ width: ULength<Horizontal>,
+ height: ULength<Vertical>,
+ opacity: UnitInterval,
+
+ // Link to the node whose children are the pattern's resolved children.
+ children: Children,
+}
+
+/// Pattern normalized to user-space units.
+pub struct UserSpacePattern {
+ pub width: f64,
+ pub height: f64,
+ pub transform: Transform,
+ pub coord_transform: Transform,
+ pub content_transform: Transform,
+ pub opacity: UnitInterval,
+
+ // This one is private so the caller has to go through fn acquire_pattern_node()
+ node_with_children: Node,
+}
+
+#[derive(Default)]
+pub struct Pattern {
+ common: Common,
+ fallback: Option<NodeId>,
+}
+
+impl ElementTrait for Pattern {
+ fn set_attributes(&mut self, attrs: &Attributes, session: &Session) {
+ for (attr, value) in attrs.iter() {
+ match attr.expanded() {
+ expanded_name!("", "patternUnits") => {
+ set_attribute(&mut self.common.units, attr.parse(value), session)
+ }
+ expanded_name!("", "patternContentUnits") => {
+ set_attribute(&mut self.common.content_units, attr.parse(value), session);
+ }
+ expanded_name!("", "viewBox") => {
+ set_attribute(&mut self.common.vbox, attr.parse(value), session)
+ }
+ expanded_name!("", "preserveAspectRatio") => {
+ set_attribute(
+ &mut self.common.preserve_aspect_ratio,
+ attr.parse(value),
+ session,
+ );
+ }
+ expanded_name!("", "patternTransform") => {
+ set_attribute(&mut self.common.transform, attr.parse(value), session);
+ }
+ ref a if is_href(a) => {
+ let mut href = None;
+ set_attribute(
+ &mut href,
+ NodeId::parse(value).map(Some).attribute(attr.clone()),
+ session,
+ );
+ set_href(a, &mut self.fallback, href);
+ }
+ expanded_name!("", "x") => {
+ set_attribute(&mut self.common.x, attr.parse(value), session)
+ }
+ expanded_name!("", "y") => {
+ set_attribute(&mut self.common.y, attr.parse(value), session)
+ }
+ expanded_name!("", "width") => {
+ set_attribute(&mut self.common.width, attr.parse(value), session)
+ }
+ expanded_name!("", "height") => {
+ set_attribute(&mut self.common.height, attr.parse(value), session)
+ }
+ _ => (),
+ }
+ }
+ }
+}
+
+impl UnresolvedPattern {
+ fn into_resolved(self, opacity: UnitInterval) -> ResolvedPattern {
+ assert!(self.is_resolved());
+
+ ResolvedPattern {
+ units: self.common.units.unwrap(),
+ content_units: self.common.content_units.unwrap(),
+ vbox: self.common.vbox.unwrap(),
+ preserve_aspect_ratio: self.common.preserve_aspect_ratio.unwrap(),
+ transform: self.common.transform.unwrap(),
+ x: self.common.x.unwrap(),
+ y: self.common.y.unwrap(),
+ width: self.common.width.unwrap(),
+ height: self.common.height.unwrap(),
+ opacity,
+
+ children: self.children.to_resolved(),
+ }
+ }
+
+ fn is_resolved(&self) -> bool {
+ self.common.units.is_some()
+ && self.common.content_units.is_some()
+ && self.common.vbox.is_some()
+ && self.common.preserve_aspect_ratio.is_some()
+ && self.common.transform.is_some()
+ && self.common.x.is_some()
+ && self.common.y.is_some()
+ && self.common.width.is_some()
+ && self.common.height.is_some()
+ && self.children.is_resolved()
+ }
+
+ fn resolve_from_fallback(&self, fallback: &UnresolvedPattern) -> UnresolvedPattern {
+ let units = self.common.units.or(fallback.common.units);
+ let content_units = self.common.content_units.or(fallback.common.content_units);
+ let vbox = self.common.vbox.or(fallback.common.vbox);
+ let preserve_aspect_ratio = self
+ .common
+ .preserve_aspect_ratio
+ .or(fallback.common.preserve_aspect_ratio);
+ let transform = self.common.transform.or(fallback.common.transform);
+ let x = self.common.x.or(fallback.common.x);
+ let y = self.common.y.or(fallback.common.y);
+ let width = self.common.width.or(fallback.common.width);
+ let height = self.common.height.or(fallback.common.height);
+ let children = self.children.resolve_from_fallback(&fallback.children);
+
+ UnresolvedPattern {
+ common: Common {
+ units,
+ content_units,
+ vbox,
+ preserve_aspect_ratio,
+ transform,
+ x,
+ y,
+ width,
+ height,
+ },
+ children,
+ }
+ }
+
+ fn resolve_from_defaults(&self) -> UnresolvedPattern {
+ let units = self.common.units.or_else(|| Some(PatternUnits::default()));
+ let content_units = self
+ .common
+ .content_units
+ .or_else(|| Some(PatternContentUnits::default()));
+ let vbox = self.common.vbox.or(Some(None));
+ let preserve_aspect_ratio = self
+ .common
+ .preserve_aspect_ratio
+ .or_else(|| Some(AspectRatio::default()));
+ let transform = self
+ .common
+ .transform
+ .or_else(|| Some(TransformAttribute::default()));
+ let x = self.common.x.or_else(|| Some(Default::default()));
+ let y = self.common.y.or_else(|| Some(Default::default()));
+ let width = self.common.width.or_else(|| Some(Default::default()));
+ let height = self.common.height.or_else(|| Some(Default::default()));
+ let children = self.children.resolve_from_defaults();
+
+ UnresolvedPattern {
+ common: Common {
+ units,
+ content_units,
+ vbox,
+ preserve_aspect_ratio,
+ transform,
+ x,
+ y,
+ width,
+ height,
+ },
+ children,
+ }
+ }
+}
+
+impl UnresolvedChildren {
+ fn from_node(node: &Node) -> UnresolvedChildren {
+ let weak = node.downgrade();
+
+ if node.children().any(|child| child.is_element()) {
+ UnresolvedChildren::WithChildren(weak)
+ } else {
+ UnresolvedChildren::Unresolved
+ }
+ }
+
+ fn is_resolved(&self) -> bool {
+ !matches!(*self, UnresolvedChildren::Unresolved)
+ }
+
+ fn resolve_from_fallback(&self, fallback: &UnresolvedChildren) -> UnresolvedChildren {
+ use UnresolvedChildren::*;
+
+ match (self, fallback) {
+ (&Unresolved, &Unresolved) => Unresolved,
+ (WithChildren(wc), _) => WithChildren(wc.clone()),
+ (_, WithChildren(wc)) => WithChildren(wc.clone()),
+ (_, _) => unreachable!(),
+ }
+ }
+
+ fn resolve_from_defaults(&self) -> UnresolvedChildren {
+ use UnresolvedChildren::*;
+
+ match *self {
+ Unresolved => ResolvedEmpty,
+ _ => (*self).clone(),
+ }
+ }
+
+ fn to_resolved(&self) -> Children {
+ use UnresolvedChildren::*;
+
+ assert!(self.is_resolved());
+
+ match *self {
+ ResolvedEmpty => Children::Empty,
+ WithChildren(ref wc) => Children::WithChildren(wc.clone()),
+ _ => unreachable!(),
+ }
+ }
+}
+
+fn nonempty_rect(bbox: &Option<Rect>) -> Option<Rect> {
+ match *bbox {
+ None => None,
+ Some(r) if r.is_empty() => None,
+ Some(r) => Some(r),
+ }
+}
+
+impl ResolvedPattern {
+ fn node_with_children(&self) -> Option<Node> {
+ match self.children {
+ // This means we didn't find any children among the fallbacks,
+ // so there is nothing to render.
+ Children::Empty => None,
+
+ Children::WithChildren(ref wc) => Some(wc.upgrade().unwrap()),
+ }
+ }
+
+ fn get_rect(&self, params: &NormalizeParams) -> Rect {
+ let x = self.x.to_user(params);
+ let y = self.y.to_user(params);
+ let w = self.width.to_user(params);
+ let h = self.height.to_user(params);
+
+ Rect::new(x, y, x + w, y + h)
+ }
+
+ pub fn to_user_space(
+ &self,
+ object_bbox: &Option<Rect>,
+ viewport: &Viewport,
+ values: &NormalizeValues,
+ ) -> Option<UserSpacePattern> {
+ let node_with_children = self.node_with_children()?;
+
+ let view_params = viewport.with_units(self.units.0);
+ let params = NormalizeParams::from_values(values, &view_params);
+
+ let rect = self.get_rect(&params);
+
+ // Create the pattern coordinate system
+ let (width, height, coord_transform) = match self.units {
+ PatternUnits(CoordUnits::ObjectBoundingBox) => {
+ let bbrect = nonempty_rect(object_bbox)?;
+ (
+ rect.width() * bbrect.width(),
+ rect.height() * bbrect.height(),
+ Transform::new_translate(
+ bbrect.x0 + rect.x0 * bbrect.width(),
+ bbrect.y0 + rect.y0 * bbrect.height(),
+ ),
+ )
+ }
+ PatternUnits(CoordUnits::UserSpaceOnUse) => (
+ rect.width(),
+ rect.height(),
+ Transform::new_translate(rect.x0, rect.y0),
+ ),
+ };
+
+ let pattern_transform = self.transform.to_transform();
+
+ let coord_transform = coord_transform.post_transform(&pattern_transform);
+
+ // Create the pattern contents coordinate system
+ let content_transform = if let Some(vbox) = self.vbox {
+ // If there is a vbox, use that
+ let r = self
+ .preserve_aspect_ratio
+ .compute(&vbox, &Rect::from_size(width, height));
+
+ let sw = r.width() / vbox.width();
+ let sh = r.height() / vbox.height();
+ let x = r.x0 - vbox.x0 * sw;
+ let y = r.y0 - vbox.y0 * sh;
+
+ Transform::new_scale(sw, sh).pre_translate(x, y)
+ } else {
+ match self.content_units {
+ PatternContentUnits(CoordUnits::ObjectBoundingBox) => {
+ let bbrect = nonempty_rect(object_bbox)?;
+ Transform::new_scale(bbrect.width(), bbrect.height())
+ }
+ PatternContentUnits(CoordUnits::UserSpaceOnUse) => Transform::identity(),
+ }
+ };
+
+ Some(UserSpacePattern {
+ width,
+ height,
+ transform: pattern_transform,
+ coord_transform,
+ content_transform,
+ opacity: self.opacity,
+ node_with_children,
+ })
+ }
+}
+
+impl UserSpacePattern {
+ /// Gets the `<pattern>` node that contains the children to be drawn for the pattern's contents.
+ ///
+ /// This has to go through [AcquiredNodes] to catch circular references among
+ /// patterns and their children.
+ pub fn acquire_pattern_node(
+ &self,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ ) -> Result<AcquiredNode, AcquireError> {
+ acquired_nodes.acquire_ref(&self.node_with_children)
+ }
+}
+
+impl Pattern {
+ fn get_unresolved(&self, node: &Node) -> Unresolved {
+ let pattern = UnresolvedPattern {
+ common: self.common.clone(),
+ children: UnresolvedChildren::from_node(node),
+ };
+
+ Unresolved {
+ pattern,
+ fallback: self.fallback.clone(),
+ }
+ }
+
+ pub fn resolve(
+ &self,
+ node: &Node,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ opacity: UnitInterval,
+ session: &Session,
+ ) -> Result<ResolvedPattern, AcquireError> {
+ let Unresolved {
+ mut pattern,
+ mut fallback,
+ } = self.get_unresolved(node);
+
+ let mut stack = NodeStack::new();
+
+ while !pattern.is_resolved() {
+ if let Some(ref node_id) = fallback {
+ match acquired_nodes.acquire(node_id) {
+ Ok(acquired) => {
+ let acquired_node = acquired.get();
+
+ if stack.contains(acquired_node) {
+ return Err(AcquireError::CircularReference(acquired_node.clone()));
+ }
+
+ match *acquired_node.borrow_element_data() {
+ ElementData::Pattern(ref p) => {
+ let unresolved = p.get_unresolved(acquired_node);
+ pattern = pattern.resolve_from_fallback(&unresolved.pattern);
+ fallback = unresolved.fallback;
+
+ stack.push(acquired_node);
+ }
+ _ => return Err(AcquireError::InvalidLinkType(node_id.clone())),
+ }
+ }
+
+ Err(AcquireError::MaxReferencesExceeded) => {
+ return Err(AcquireError::MaxReferencesExceeded)
+ }
+
+ Err(e) => {
+ rsvg_log!(session, "Stopping pattern resolution: {}", e);
+ pattern = pattern.resolve_from_defaults();
+ break;
+ }
+ }
+ } else {
+ pattern = pattern.resolve_from_defaults();
+ break;
+ }
+ }
+
+ Ok(pattern.into_resolved(opacity))
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+ use crate::node::NodeData;
+ use markup5ever::{namespace_url, ns, QualName};
+
+ #[test]
+ fn pattern_resolved_from_defaults_is_really_resolved() {
+ let node = Node::new(NodeData::new_element(
+ &Session::default(),
+ &QualName::new(None, ns!(svg), local_name!("pattern")),
+ Attributes::new(),
+ ));
+
+ let unresolved = borrow_element_as!(node, Pattern).get_unresolved(&node);
+ let pattern = unresolved.pattern.resolve_from_defaults();
+ assert!(pattern.is_resolved());
+ }
+}
diff --git a/rsvg/src/properties.rs b/rsvg/src/properties.rs
new file mode 100644
index 00000000..dd48b76a
--- /dev/null
+++ b/rsvg/src/properties.rs
@@ -0,0 +1,1131 @@
+//! CSS properties, specified values, computed values.
+//!
+//! To implement support for a CSS property, do the following:
+//!
+//! * Create a type that will hold the property's values. Please do this in the file
+//! `property_defs.rs`; you should cut-and-paste from the existing property definitions or
+//! read the documentation of the [`make_property`] macro. You should read the
+//! documentation for the [`property_defs`][crate::property_defs] module to see all that
+//! is involved in creating a type for a property.
+//!
+//! * Modify the call to the `make_properties` macro in this module to include the new
+//! property's name.
+//!
+//! * Modify the rest of librsvg wherever the computed value of the property needs to be used.
+//! This is available in methods that take an argument of type [`ComputedValues`].
+
+use cssparser::{
+ self, BasicParseErrorKind, DeclarationListParser, ParseErrorKind, Parser, ParserInput, ToCss,
+};
+use markup5ever::{
+ expanded_name, local_name, namespace_url, ns, ExpandedName, LocalName, QualName,
+};
+use std::collections::HashSet;
+
+use crate::css::{DeclParser, Declaration, Origin};
+use crate::error::*;
+use crate::parsers::{Parse, ParseValue};
+use crate::property_macros::Property;
+use crate::session::Session;
+use crate::transform::{Transform, TransformAttribute, TransformProperty};
+use crate::xml::Attributes;
+
+// Re-export the actual properties so they are easy to find from a single place `properties::*`.
+pub use crate::font_props::*;
+pub use crate::property_defs::*;
+
+/// Representation of a single CSS property value.
+///
+/// `Unspecified` is the `Default`; it means that the corresponding property is not present.
+///
+/// `Inherit` means that the property is explicitly set to inherit
+/// from the parent element. This is useful for properties which the
+/// SVG or CSS specs mandate that should not be inherited by default.
+///
+/// `Specified` is a value given by the SVG or CSS stylesheet. This will later be
+/// resolved into part of a `ComputedValues` struct.
+#[derive(Clone)]
+pub enum SpecifiedValue<T>
+where
+ T: Property + Clone + Default,
+{
+ Unspecified,
+ Inherit,
+ Specified(T),
+}
+
+impl<T> SpecifiedValue<T>
+where
+ T: Property + Clone + Default,
+{
+ pub fn compute(&self, src: &T, src_values: &ComputedValues) -> T {
+ let value: T = match *self {
+ SpecifiedValue::Unspecified => {
+ if <T as Property>::inherits_automatically() {
+ src.clone()
+ } else {
+ Default::default()
+ }
+ }
+
+ SpecifiedValue::Inherit => src.clone(),
+
+ SpecifiedValue::Specified(ref v) => v.clone(),
+ };
+
+ value.compute(src_values)
+ }
+}
+
+/// Whether a property also has a presentation attribute.
+///
+/// <https://svgwg.org/svg2-draft/styling.html#PresentationAttributes>
+#[derive(PartialEq)]
+enum PresentationAttr {
+ No,
+ Yes,
+}
+
+/// How to parse a value, whether it comes from a property or from a presentation attribute
+#[derive(PartialEq)]
+pub enum ParseAs {
+ Property,
+ PresentationAttr,
+}
+
+impl PropertyId {
+ fn as_u8(&self) -> u8 {
+ *self as u8
+ }
+
+ fn as_usize(&self) -> usize {
+ *self as usize
+ }
+}
+
+/// Holds the specified values for the CSS properties of an element.
+#[derive(Clone)]
+pub struct SpecifiedValues {
+ indices: [u8; PropertyId::UnsetProperty as usize],
+ props: Vec<ParsedProperty>,
+
+ transform: Option<Transform>,
+}
+
+impl Default for SpecifiedValues {
+ fn default() -> Self {
+ SpecifiedValues {
+ // this many elements, with the same value
+ indices: [PropertyId::UnsetProperty.as_u8(); PropertyId::UnsetProperty as usize],
+ props: Vec::new(),
+ transform: None,
+ }
+ }
+}
+
+impl ComputedValues {
+ // TODO for madds: this function will go away, to be replaced by the one generated
+ // automatically by the macros.
+ pub fn transform(&self) -> Transform {
+ self.transform
+ }
+
+ pub fn is_overflow(&self) -> bool {
+ matches!(self.overflow(), Overflow::Auto | Overflow::Visible)
+ }
+
+ /// Whether we should draw the element or skip both space allocation
+ /// and drawing.
+ /// <https://www.w3.org/TR/SVG2/render.html#VisibilityControl>
+ pub fn is_displayed(&self) -> bool {
+ self.display() != Display::None
+ }
+
+ /// Whether we should draw the element or allocate its space but
+ /// skip drawing.
+ /// <https://www.w3.org/TR/SVG2/render.html#VisibilityControl>
+ pub fn is_visible(&self) -> bool {
+ self.visibility() == Visibility::Visible
+ }
+}
+
+/// Macro to generate all the machinery for properties.
+///
+/// This generates the following:
+///
+/// * `PropertyId`, an fieldless enum with simple values to identify all the properties.
+/// * `ParsedProperty`, a variant enum for all the specified property values.
+/// * `ComputedValue`, a variant enum for all the computed values.
+/// * `parse_value`, the main function to parse a property or attribute value from user input.
+///
+/// There is a lot of repetitive code, for example, because sometimes
+/// we need to operate on `PropertyId::Foo`, `ParsedProperty::Foo` and
+/// `ComputedValue::Foo` together. This is why all this is done with a macro.
+///
+/// See the only invocation of this macro to see how it is used; it is just
+/// a declarative list of property names.
+///
+/// **NOTE:** If you get a compiler error similar to this:
+///
+/// ```text
+/// 362 | "mix-blend-mode" => mix_blend_mode : MixBlendMode,
+/// | ^^^^^^^^^^^^^^^^ no rules expected this token in macro call
+/// ```
+///
+/// Then it may be that you put the name inside the `longhands` block, when it should be
+/// inside the `longhands_not_supported_by_markup5ever` block. This is because the
+/// [`markup5ever`] crate does not have predefined names for every single property out
+/// there; just the common ones.
+///
+/// [`markup5ever`]: https://docs.rs/markup5ever
+macro_rules! make_properties {
+ {
+ shorthands: {
+ $($short_str:tt => ( $short_presentation_attr:expr, $short_field:ident: $short_name:ident ),)*
+ }
+
+ longhands: {
+ $($long_str:tt => ( $long_presentation_attr:expr, $long_field:ident: $long_name:ident ),)+
+ }
+
+ // These are for when expanded_name!("" "foo") is not defined yet
+ // in markup5ever. We create an ExpandedName by hand in that case.
+ longhands_not_supported_by_markup5ever: {
+ $($long_m5e_str:tt => ($long_m5e_presentation_attr:expr, $long_m5e_field:ident: $long_m5e_name:ident ),)+
+ }
+
+ non_properties: {
+ $($nonprop_field:ident: $nonprop_name:ident,)+
+ }
+ }=> {
+ /// Used to match `ParsedProperty` to their discriminant
+ ///
+ /// The `PropertyId::UnsetProperty` can be used as a sentinel value, as
+ /// it does not match any `ParsedProperty` discriminant; it is really the
+ /// number of valid values in this enum.
+ #[repr(u8)]
+ #[derive(Copy, Clone, PartialEq)]
+ enum PropertyId {
+ $($short_name,)+
+ $($long_name,)+
+ $($long_m5e_name,)+
+ $($nonprop_name,)+
+
+ UnsetProperty,
+ }
+
+ impl PropertyId {
+ fn is_shorthand(self) -> bool {
+ match self {
+ $(PropertyId::$short_name => true,)+
+ _ => false,
+ }
+ }
+ }
+
+ /// Embodies "which property is this" plus the property's value
+ #[derive(Clone)]
+ pub enum ParsedProperty {
+ // we put all the properties here; these are for SpecifiedValues
+ $($short_name(SpecifiedValue<$short_name>),)+
+ $($long_name(SpecifiedValue<$long_name>),)+
+ $($long_m5e_name(SpecifiedValue<$long_m5e_name>),)+
+ $($nonprop_name(SpecifiedValue<$nonprop_name>),)+
+ }
+
+ enum ComputedValue {
+ $(
+ $long_name($long_name),
+ )+
+
+ $(
+ $long_m5e_name($long_m5e_name),
+ )+
+
+ $(
+ $nonprop_name($nonprop_name),
+ )+
+ }
+
+ /// Holds the computed values for the CSS properties of an element.
+ #[derive(Debug, Default, Clone)]
+ pub struct ComputedValues {
+ $(
+ $long_field: $long_name,
+ )+
+
+ $(
+ $long_m5e_field: $long_m5e_name,
+ )+
+
+ $(
+ $nonprop_field: $nonprop_name,
+ )+
+
+ transform: Transform,
+ }
+
+ impl ParsedProperty {
+ fn get_property_id(&self) -> PropertyId {
+ match *self {
+ $(ParsedProperty::$long_name(_) => PropertyId::$long_name,)+
+ $(ParsedProperty::$long_m5e_name(_) => PropertyId::$long_m5e_name,)+
+ $(ParsedProperty::$short_name(_) => PropertyId::$short_name,)+
+ $(ParsedProperty::$nonprop_name(_) => PropertyId::$nonprop_name,)+
+ }
+ }
+
+ fn unspecified(id: PropertyId) -> Self {
+ use SpecifiedValue::Unspecified;
+
+ match id {
+ $(PropertyId::$long_name => ParsedProperty::$long_name(Unspecified),)+
+ $(PropertyId::$long_m5e_name => ParsedProperty::$long_m5e_name(Unspecified),)+
+ $(PropertyId::$short_name => ParsedProperty::$short_name(Unspecified),)+
+ $(PropertyId::$nonprop_name => ParsedProperty::$nonprop_name(Unspecified),)+
+
+ PropertyId::UnsetProperty => unreachable!(),
+ }
+ }
+ }
+
+ impl ComputedValues {
+ $(
+ pub fn $long_field(&self) -> $long_name {
+ if let ComputedValue::$long_name(v) = self.get_value(PropertyId::$long_name) {
+ v
+ } else {
+ unreachable!();
+ }
+ }
+ )+
+
+ $(
+ pub fn $long_m5e_field(&self) -> $long_m5e_name {
+ if let ComputedValue::$long_m5e_name(v) = self.get_value(PropertyId::$long_m5e_name) {
+ v
+ } else {
+ unreachable!();
+ }
+ }
+ )+
+
+ $(
+ pub fn $nonprop_field(&self) -> $nonprop_name {
+ if let ComputedValue::$nonprop_name(v) = self.get_value(PropertyId::$nonprop_name) {
+ v
+ } else {
+ unreachable!();
+ }
+ }
+ )+
+
+ fn set_value(&mut self, computed: ComputedValue) {
+ match computed {
+ $(ComputedValue::$long_name(v) => self.$long_field = v,)+
+ $(ComputedValue::$long_m5e_name(v) => self.$long_m5e_field = v,)+
+ $(ComputedValue::$nonprop_name(v) => self.$nonprop_field = v,)+
+ }
+ }
+
+ fn get_value(&self, id: PropertyId) -> ComputedValue {
+ assert!(!id.is_shorthand());
+
+ match id {
+ $(
+ PropertyId::$long_name =>
+ ComputedValue::$long_name(self.$long_field.clone()),
+ )+
+ $(
+ PropertyId::$long_m5e_name =>
+ ComputedValue::$long_m5e_name(self.$long_m5e_field.clone()),
+ )+
+ $(
+ PropertyId::$nonprop_name =>
+ ComputedValue::$nonprop_name(self.$nonprop_field.clone()),
+ )+
+ _ => unreachable!(),
+ }
+ }
+ }
+
+ /// Parses a value from either a style property or from an element's attribute.
+ pub fn parse_value<'i>(
+ prop_name: &QualName,
+ input: &mut Parser<'i, '_>,
+ parse_as: ParseAs,
+ ) -> Result<ParsedProperty, ParseError<'i>> {
+ match prop_name.expanded() {
+ $(
+ expanded_name!("", $long_str) if !(parse_as == ParseAs::PresentationAttr && $long_presentation_attr == PresentationAttr::No) => {
+ Ok(ParsedProperty::$long_name(parse_input(input)?))
+ }
+ )+
+
+ $(
+ e if e == ExpandedName {
+ ns: &ns!(),
+ local: &LocalName::from($long_m5e_str),
+ } && !(parse_as == ParseAs::PresentationAttr && $long_m5e_presentation_attr == PresentationAttr::No) => {
+ Ok(ParsedProperty::$long_m5e_name(parse_input(input)?))
+ }
+ )+
+
+ $(
+ expanded_name!("", $short_str) if parse_as == ParseAs::Property => {
+ // No shorthand has a presentation attribute.
+ assert!($short_presentation_attr == PresentationAttr::No);
+
+ Ok(ParsedProperty::$short_name(parse_input(input)?))
+ }
+ )+
+
+ _ => {
+ let loc = input.current_source_location();
+ Err(loc.new_custom_error(ValueErrorKind::UnknownProperty))
+ }
+ }
+ }
+ };
+}
+
+#[rustfmt::skip]
+make_properties! {
+ shorthands: {
+ // No shorthand has a presentation attribute.
+ "font" => (PresentationAttr::No, font : Font),
+ "marker" => (PresentationAttr::No, marker : Marker),
+ }
+
+ // longhands that are presentation attributes right now, but need to be turned into properties:
+ // "d" - applies only to path
+
+ longhands: {
+ // "alignment-baseline" => (PresentationAttr::Yes, unimplemented),
+ "baseline-shift" => (PresentationAttr::Yes, baseline_shift : BaselineShift),
+ "clip-path" => (PresentationAttr::Yes, clip_path : ClipPath),
+ "clip-rule" => (PresentationAttr::Yes, clip_rule : ClipRule),
+ "color" => (PresentationAttr::Yes, color : Color),
+ // "color-interpolation" => (PresentationAttr::Yes, unimplemented),
+ "color-interpolation-filters" => (PresentationAttr::Yes, color_interpolation_filters : ColorInterpolationFilters),
+ // "cursor" => (PresentationAttr::Yes, unimplemented),
+ "cx" => (PresentationAttr::Yes, cx: CX),
+ "cy" => (PresentationAttr::Yes, cy: CY),
+ "direction" => (PresentationAttr::Yes, direction : Direction),
+ "display" => (PresentationAttr::Yes, display : Display),
+ // "dominant-baseline" => (PresentationAttr::Yes, unimplemented),
+ "enable-background" => (PresentationAttr::Yes, enable_background : EnableBackground),
+
+ // "applies to any element except animation elements"
+ // https://www.w3.org/TR/SVG2/styling.html#PresentationAttributes
+ "fill" => (PresentationAttr::Yes, fill : Fill),
+
+ "fill-opacity" => (PresentationAttr::Yes, fill_opacity : FillOpacity),
+ "fill-rule" => (PresentationAttr::Yes, fill_rule : FillRule),
+ "filter" => (PresentationAttr::Yes, filter : Filter),
+ "flood-color" => (PresentationAttr::Yes, flood_color : FloodColor),
+ "flood-opacity" => (PresentationAttr::Yes, flood_opacity : FloodOpacity),
+ "font-family" => (PresentationAttr::Yes, font_family : FontFamily),
+ "font-size" => (PresentationAttr::Yes, font_size : FontSize),
+ // "font-size-adjust" => (PresentationAttr::Yes, unimplemented),
+ "font-stretch" => (PresentationAttr::Yes, font_stretch : FontStretch),
+ "font-style" => (PresentationAttr::Yes, font_style : FontStyle),
+ "font-variant" => (PresentationAttr::Yes, font_variant : FontVariant),
+ "font-weight" => (PresentationAttr::Yes, font_weight : FontWeight),
+
+ // "glyph-orientation-horizontal" - obsolete, removed from SVG2
+
+ // "glyph-orientation-vertical" - obsolete, now shorthand -
+ // https://svgwg.org/svg2-draft/text.html#GlyphOrientationVerticalProperty
+ // https://www.w3.org/TR/css-writing-modes-3/#propdef-glyph-orientation-vertical
+ //
+ // Note that even though CSS Writing Modes 3 turned glyph-orientation-vertical
+ // into a shorthand, SVG1.1 still makes it available as a presentation attribute.
+ // So, we put the property here, not in the shorthands, and deal with it as a
+ // special case in the text handling code.
+ "glyph-orientation-vertical" => (PresentationAttr::Yes, glyph_orientation_vertical : GlyphOrientationVertical),
+ "height" => (PresentationAttr::Yes, height: Height),
+
+ // "image-rendering" => (PresentationAttr::Yes, unimplemented),
+ "letter-spacing" => (PresentationAttr::Yes, letter_spacing : LetterSpacing),
+ "lighting-color" => (PresentationAttr::Yes, lighting_color : LightingColor),
+ "marker-end" => (PresentationAttr::Yes, marker_end : MarkerEnd),
+ "marker-mid" => (PresentationAttr::Yes, marker_mid : MarkerMid),
+ "marker-start" => (PresentationAttr::Yes, marker_start : MarkerStart),
+ "mask" => (PresentationAttr::Yes, mask : Mask),
+ "opacity" => (PresentationAttr::Yes, opacity : Opacity),
+ "overflow" => (PresentationAttr::Yes, overflow : Overflow),
+ // "pointer-events" => (PresentationAttr::Yes, unimplemented),
+ "r" => (PresentationAttr::Yes, r: R),
+ "rx" => (PresentationAttr::Yes, rx: RX),
+ "ry" => (PresentationAttr::Yes, ry: RY),
+ "shape-rendering" => (PresentationAttr::Yes, shape_rendering : ShapeRendering),
+ "stop-color" => (PresentationAttr::Yes, stop_color : StopColor),
+ "stop-opacity" => (PresentationAttr::Yes, stop_opacity : StopOpacity),
+ "stroke" => (PresentationAttr::Yes, stroke : Stroke),
+ "stroke-dasharray" => (PresentationAttr::Yes, stroke_dasharray : StrokeDasharray),
+ "stroke-dashoffset" => (PresentationAttr::Yes, stroke_dashoffset : StrokeDashoffset),
+ "stroke-linecap" => (PresentationAttr::Yes, stroke_line_cap : StrokeLinecap),
+ "stroke-linejoin" => (PresentationAttr::Yes, stroke_line_join : StrokeLinejoin),
+ "stroke-miterlimit" => (PresentationAttr::Yes, stroke_miterlimit : StrokeMiterlimit),
+ "stroke-opacity" => (PresentationAttr::Yes, stroke_opacity : StrokeOpacity),
+ "stroke-width" => (PresentationAttr::Yes, stroke_width : StrokeWidth),
+ "text-anchor" => (PresentationAttr::Yes, text_anchor : TextAnchor),
+ "text-decoration" => (PresentationAttr::Yes, text_decoration : TextDecoration),
+ // "text-overflow" => (PresentationAttr::Yes, unimplemented),
+ "text-rendering" => (PresentationAttr::Yes, text_rendering : TextRendering),
+
+ // "transform" - Special case as presentation attribute:
+ // The SVG1.1 "transform" attribute has a different grammar than the
+ // SVG2 "transform" property. Here we define for the properties machinery,
+ // and it is handled specially as an attribute in parse_presentation_attributes().
+ "transform" => (PresentationAttr::No, transform_property : TransformProperty),
+
+ // "transform-box" => (PresentationAttr::Yes, unimplemented),
+ // "transform-origin" => (PresentationAttr::Yes, unimplemented),
+ "unicode-bidi" => (PresentationAttr::Yes, unicode_bidi : UnicodeBidi),
+ "visibility" => (PresentationAttr::Yes, visibility : Visibility),
+ // "white-space" => (PresentationAttr::Yes, unimplemented),
+ // "word-spacing" => (PresentationAttr::Yes, unimplemented),
+ "width" => (PresentationAttr::Yes, width: Width),
+ "writing-mode" => (PresentationAttr::Yes, writing_mode : WritingMode),
+ "x" => (PresentationAttr::Yes, x: X),
+ "y" => (PresentationAttr::Yes, y: Y),
+ }
+
+ longhands_not_supported_by_markup5ever: {
+ "isolation" => (PresentationAttr::No, isolation : Isolation),
+ "line-height" => (PresentationAttr::No, line_height : LineHeight),
+ "mask-type" => (PresentationAttr::Yes, mask_type : MaskType),
+ "mix-blend-mode" => (PresentationAttr::No, mix_blend_mode : MixBlendMode),
+ "paint-order" => (PresentationAttr::Yes, paint_order : PaintOrder),
+ "text-orientation" => (PresentationAttr::No, text_orientation : TextOrientation),
+ "vector-effect" => (PresentationAttr::Yes, vector_effect : VectorEffect),
+ }
+
+ // These are not properties, but presentation attributes. However,
+ // both xml:lang and xml:space *do* inherit. We are abusing the
+ // property inheritance code for these XML-specific attributes.
+ non_properties: {
+ xml_lang: XmlLang,
+ xml_space: XmlSpace,
+ }
+}
+
+impl SpecifiedValues {
+ fn property_index(&self, id: PropertyId) -> Option<usize> {
+ let v = self.indices[id.as_usize()];
+
+ if v == PropertyId::UnsetProperty.as_u8() {
+ None
+ } else {
+ Some(v as usize)
+ }
+ }
+
+ fn set_property(&mut self, prop: &ParsedProperty, replace: bool) {
+ let id = prop.get_property_id();
+ assert!(!id.is_shorthand());
+
+ if let Some(index) = self.property_index(id) {
+ if replace {
+ self.props[index] = prop.clone();
+ }
+ } else {
+ self.props.push(prop.clone());
+ let pos = self.props.len() - 1;
+ self.indices[id.as_usize()] = pos as u8;
+ }
+ }
+
+ fn get_property(&self, id: PropertyId) -> ParsedProperty {
+ assert!(!id.is_shorthand());
+
+ if let Some(index) = self.property_index(id) {
+ self.props[index].clone()
+ } else {
+ ParsedProperty::unspecified(id)
+ }
+ }
+
+ fn set_property_expanding_shorthands(&mut self, prop: &ParsedProperty, replace: bool) {
+ match *prop {
+ ParsedProperty::Font(SpecifiedValue::Specified(ref f)) => {
+ self.expand_font_shorthand(f, replace)
+ }
+ ParsedProperty::Marker(SpecifiedValue::Specified(ref m)) => {
+ self.expand_marker_shorthand(m, replace)
+ }
+ ParsedProperty::Font(SpecifiedValue::Inherit) => {
+ self.expand_font_shorthand_inherit(replace)
+ }
+ ParsedProperty::Marker(SpecifiedValue::Inherit) => {
+ self.expand_marker_shorthand_inherit(replace)
+ }
+
+ _ => self.set_property(prop, replace),
+ }
+ }
+
+ fn expand_font_shorthand(&mut self, font: &Font, replace: bool) {
+ let FontSpec {
+ style,
+ variant,
+ weight,
+ stretch,
+ size,
+ line_height,
+ family,
+ } = font.to_font_spec();
+
+ self.set_property(
+ &ParsedProperty::FontStyle(SpecifiedValue::Specified(style)),
+ replace,
+ );
+ self.set_property(
+ &ParsedProperty::FontVariant(SpecifiedValue::Specified(variant)),
+ replace,
+ );
+ self.set_property(
+ &ParsedProperty::FontWeight(SpecifiedValue::Specified(weight)),
+ replace,
+ );
+ self.set_property(
+ &ParsedProperty::FontStretch(SpecifiedValue::Specified(stretch)),
+ replace,
+ );
+ self.set_property(
+ &ParsedProperty::FontSize(SpecifiedValue::Specified(size)),
+ replace,
+ );
+ self.set_property(
+ &ParsedProperty::LineHeight(SpecifiedValue::Specified(line_height)),
+ replace,
+ );
+ self.set_property(
+ &ParsedProperty::FontFamily(SpecifiedValue::Specified(family)),
+ replace,
+ );
+ }
+
+ fn expand_marker_shorthand(&mut self, marker: &Marker, replace: bool) {
+ let Marker(v) = marker;
+
+ self.set_property(
+ &ParsedProperty::MarkerStart(SpecifiedValue::Specified(MarkerStart(v.clone()))),
+ replace,
+ );
+ self.set_property(
+ &ParsedProperty::MarkerMid(SpecifiedValue::Specified(MarkerMid(v.clone()))),
+ replace,
+ );
+ self.set_property(
+ &ParsedProperty::MarkerEnd(SpecifiedValue::Specified(MarkerEnd(v.clone()))),
+ replace,
+ );
+ }
+
+ fn expand_font_shorthand_inherit(&mut self, replace: bool) {
+ self.set_property(&ParsedProperty::FontStyle(SpecifiedValue::Inherit), replace);
+ self.set_property(
+ &ParsedProperty::FontVariant(SpecifiedValue::Inherit),
+ replace,
+ );
+ self.set_property(
+ &ParsedProperty::FontWeight(SpecifiedValue::Inherit),
+ replace,
+ );
+ self.set_property(
+ &ParsedProperty::FontStretch(SpecifiedValue::Inherit),
+ replace,
+ );
+ self.set_property(&ParsedProperty::FontSize(SpecifiedValue::Inherit), replace);
+ self.set_property(
+ &ParsedProperty::LineHeight(SpecifiedValue::Inherit),
+ replace,
+ );
+ self.set_property(
+ &ParsedProperty::FontFamily(SpecifiedValue::Inherit),
+ replace,
+ );
+ }
+
+ fn expand_marker_shorthand_inherit(&mut self, replace: bool) {
+ self.set_property(
+ &ParsedProperty::MarkerStart(SpecifiedValue::Inherit),
+ replace,
+ );
+ self.set_property(&ParsedProperty::MarkerMid(SpecifiedValue::Inherit), replace);
+ self.set_property(&ParsedProperty::MarkerEnd(SpecifiedValue::Inherit), replace);
+ }
+
+ pub fn set_parsed_property(&mut self, prop: &ParsedProperty) {
+ self.set_property_expanding_shorthands(prop, true);
+ }
+
+ /* user agent property have less priority than presentation attributes */
+ pub fn set_parsed_property_user_agent(&mut self, prop: &ParsedProperty) {
+ self.set_property_expanding_shorthands(prop, false);
+ }
+
+ pub fn to_computed_values(&self, computed: &mut ComputedValues) {
+ macro_rules! compute {
+ ($name:ident, $field:ident) => {{
+ // This extra block --------^
+ // is so that prop_val will be dropped within the macro invocation;
+ // otherwise all the temporary values cause this function to use
+ // an unreasonably large amount of stack space.
+ let prop_val = self.get_property(PropertyId::$name);
+ if let ParsedProperty::$name(s) = prop_val {
+ computed.set_value(ComputedValue::$name(
+ s.compute(&computed.$field(), computed),
+ ));
+ } else {
+ unreachable!();
+ }
+ }};
+ }
+
+ // First, compute font_size. It needs to be done before everything
+ // else, so that properties that depend on its computed value
+ // will be able to use it. For example, baseline-shift
+ // depends on font-size.
+
+ compute!(FontSize, font_size);
+
+ // Then, do all the other properties.
+
+ compute!(BaselineShift, baseline_shift);
+ compute!(ClipPath, clip_path);
+ compute!(ClipRule, clip_rule);
+ compute!(Color, color);
+ compute!(ColorInterpolationFilters, color_interpolation_filters);
+ compute!(CX, cx);
+ compute!(CY, cy);
+ compute!(Direction, direction);
+ compute!(Display, display);
+ compute!(EnableBackground, enable_background);
+ compute!(Fill, fill);
+ compute!(FillOpacity, fill_opacity);
+ compute!(FillRule, fill_rule);
+ compute!(Filter, filter);
+ compute!(FloodColor, flood_color);
+ compute!(FloodOpacity, flood_opacity);
+ compute!(FontFamily, font_family);
+ compute!(FontStretch, font_stretch);
+ compute!(FontStyle, font_style);
+ compute!(FontVariant, font_variant);
+ compute!(FontWeight, font_weight);
+ compute!(GlyphOrientationVertical, glyph_orientation_vertical);
+ compute!(Height, height);
+ compute!(Isolation, isolation);
+ compute!(LetterSpacing, letter_spacing);
+ compute!(LightingColor, lighting_color);
+ compute!(MarkerEnd, marker_end);
+ compute!(MarkerMid, marker_mid);
+ compute!(MarkerStart, marker_start);
+ compute!(Mask, mask);
+ compute!(MaskType, mask_type);
+ compute!(MixBlendMode, mix_blend_mode);
+ compute!(Opacity, opacity);
+ compute!(Overflow, overflow);
+ compute!(PaintOrder, paint_order);
+ compute!(R, r);
+ compute!(RX, rx);
+ compute!(RY, ry);
+ compute!(ShapeRendering, shape_rendering);
+ compute!(StopColor, stop_color);
+ compute!(StopOpacity, stop_opacity);
+ compute!(Stroke, stroke);
+ compute!(StrokeDasharray, stroke_dasharray);
+ compute!(StrokeDashoffset, stroke_dashoffset);
+ compute!(StrokeLinecap, stroke_line_cap);
+ compute!(StrokeLinejoin, stroke_line_join);
+ compute!(StrokeOpacity, stroke_opacity);
+ compute!(StrokeMiterlimit, stroke_miterlimit);
+ compute!(StrokeWidth, stroke_width);
+ compute!(TextAnchor, text_anchor);
+ compute!(TextDecoration, text_decoration);
+ compute!(TextOrientation, text_orientation);
+ compute!(TextRendering, text_rendering);
+ compute!(TransformProperty, transform_property);
+ compute!(UnicodeBidi, unicode_bidi);
+ compute!(VectorEffect, vector_effect);
+ compute!(Visibility, visibility);
+ compute!(Width, width);
+ compute!(WritingMode, writing_mode);
+ compute!(X, x);
+ compute!(XmlSpace, xml_space);
+ compute!(XmlLang, xml_lang);
+ compute!(Y, y);
+
+ computed.transform = self.transform.unwrap_or_else(|| {
+ match self.get_property(PropertyId::TransformProperty) {
+ ParsedProperty::TransformProperty(SpecifiedValue::Specified(ref t)) => {
+ t.to_transform()
+ }
+ _ => Transform::identity(),
+ }
+ });
+ }
+
+ /// This is a somewhat egregious hack to allow xml:lang to be stored as a presentational
+ /// attribute. Presentational attributes can often be influenced by stylesheets,
+ /// so they're cascaded after selector matching is done, but xml:lang can be queried by
+ /// CSS selectors, so they need to be cascaded *first*.
+ pub fn inherit_xml_lang(
+ &self,
+ computed: &mut ComputedValues,
+ parent: Option<crate::node::Node>,
+ ) {
+ use crate::node::NodeBorrow;
+ let prop_val = self.get_property(PropertyId::XmlLang);
+ if let ParsedProperty::XmlLang(s) = prop_val {
+ if let Some(parent) = parent {
+ computed.set_value(ComputedValue::XmlLang(
+ parent.borrow_element().get_computed_values().xml_lang(),
+ ));
+ }
+ computed.set_value(ComputedValue::XmlLang(
+ s.compute(&computed.xml_lang(), computed),
+ ));
+ } else {
+ unreachable!();
+ }
+ }
+
+ pub fn is_overflow(&self) -> bool {
+ if let Some(overflow_index) = self.property_index(PropertyId::Overflow) {
+ match self.props[overflow_index] {
+ ParsedProperty::Overflow(SpecifiedValue::Specified(Overflow::Auto)) => true,
+ ParsedProperty::Overflow(SpecifiedValue::Specified(Overflow::Visible)) => true,
+ ParsedProperty::Overflow(_) => false,
+ _ => unreachable!(),
+ }
+ } else {
+ false
+ }
+ }
+
+ fn parse_one_presentation_attribute(&mut self, session: &Session, attr: QualName, value: &str) {
+ let mut input = ParserInput::new(value);
+ let mut parser = Parser::new(&mut input);
+
+ match parse_value(&attr, &mut parser, ParseAs::PresentationAttr) {
+ Ok(prop) => {
+ if parser.expect_exhausted().is_ok() {
+ self.set_parsed_property(&prop);
+ } else {
+ rsvg_log!(
+ session,
+ "(ignoring invalid presentation attribute {:?}\n value=\"{}\")\n",
+ attr.expanded(),
+ value,
+ );
+ }
+ }
+
+ // not a presentation attribute; just ignore it
+ Err(ParseError {
+ kind: ParseErrorKind::Custom(ValueErrorKind::UnknownProperty),
+ ..
+ }) => (),
+
+ // https://www.w3.org/TR/CSS2/syndata.html#unsupported-values
+ // For all the following cases, ignore illegal values; don't set the whole node to
+ // be in error in that case.
+ Err(ParseError {
+ kind: ParseErrorKind::Basic(BasicParseErrorKind::UnexpectedToken(ref t)),
+ ..
+ }) => {
+ let mut tok = String::new();
+
+ t.to_css(&mut tok).unwrap(); // FIXME: what do we do with a fmt::Error?
+ rsvg_log!(
+ session,
+ "(ignoring invalid presentation attribute {:?}\n value=\"{}\"\n \
+ unexpected token '{}')",
+ attr.expanded(),
+ value,
+ tok,
+ );
+ }
+
+ Err(ParseError {
+ kind: ParseErrorKind::Basic(BasicParseErrorKind::EndOfInput),
+ ..
+ }) => {
+ rsvg_log!(
+ session,
+ "(ignoring invalid presentation attribute {:?}\n value=\"{}\"\n \
+ unexpected end of input)",
+ attr.expanded(),
+ value,
+ );
+ }
+
+ Err(ParseError {
+ kind: ParseErrorKind::Basic(_),
+ ..
+ }) => {
+ rsvg_log!(
+ session,
+ "(ignoring invalid presentation attribute {:?}\n value=\"{}\"\n \
+ unexpected error)",
+ attr.expanded(),
+ value,
+ );
+ }
+
+ Err(ParseError {
+ kind: ParseErrorKind::Custom(ref v),
+ ..
+ }) => {
+ rsvg_log!(
+ session,
+ "(ignoring invalid presentation attribute {:?}\n value=\"{}\"\n {})",
+ attr.expanded(),
+ value,
+ v
+ );
+ }
+ }
+ }
+
+ pub fn parse_presentation_attributes(&mut self, session: &Session, attrs: &Attributes) {
+ for (attr, value) in attrs.iter() {
+ match attr.expanded() {
+ expanded_name!("", "transform") => {
+ // FIXME: we parse the transform attribute here because we don't yet have
+ // a better way to distinguish attributes whose values have different
+ // grammars than properties.
+ let transform_attr = TransformAttribute::parse_str(value)
+ .unwrap_or_else(|_| TransformAttribute::default());
+ self.transform = Some(transform_attr.to_transform());
+ }
+
+ expanded_name!(xml "lang") => {
+ // xml:lang is a non-presentation attribute and as such cannot have the
+ // "inherit" value. So, we don't call parse_one_presentation_attribute()
+ // for it, but rather call its parser directly.
+ let parse_result: Result<XmlLang, _> = attr.parse(value);
+ match parse_result {
+ Ok(lang) => {
+ self.set_parsed_property(&ParsedProperty::XmlLang(
+ SpecifiedValue::Specified(lang),
+ ));
+ }
+
+ Err(e) => {
+ rsvg_log!(session, "ignoring attribute with invalid value: {}", e);
+ }
+ }
+ }
+
+ expanded_name!(xml "space") => {
+ // xml:space is a non-presentation attribute and as such cannot have the
+ // "inherit" value. So, we don't call parse_one_presentation_attribute()
+ // for it, but rather call its parser directly.
+ let parse_result: Result<XmlSpace, _> = attr.parse(value);
+ match parse_result {
+ Ok(space) => {
+ self.set_parsed_property(&ParsedProperty::XmlSpace(
+ SpecifiedValue::Specified(space),
+ ));
+ }
+
+ Err(e) => {
+ rsvg_log!(session, "ignoring attribute with invalid value: {}", e);
+ }
+ }
+ }
+
+ _ => self.parse_one_presentation_attribute(session, attr, value),
+ }
+ }
+ }
+
+ pub fn set_property_from_declaration(
+ &mut self,
+ declaration: &Declaration,
+ origin: Origin,
+ important_styles: &mut HashSet<QualName>,
+ ) {
+ if !declaration.important && important_styles.contains(&declaration.prop_name) {
+ return;
+ }
+
+ if declaration.important {
+ important_styles.insert(declaration.prop_name.clone());
+ }
+
+ if origin == Origin::UserAgent {
+ self.set_parsed_property_user_agent(&declaration.property);
+ } else {
+ self.set_parsed_property(&declaration.property);
+ }
+ }
+
+ pub fn parse_style_declarations(
+ &mut self,
+ declarations: &str,
+ origin: Origin,
+ important_styles: &mut HashSet<QualName>,
+ session: &Session,
+ ) {
+ let mut input = ParserInput::new(declarations);
+ let mut parser = Parser::new(&mut input);
+
+ DeclarationListParser::new(&mut parser, DeclParser)
+ .filter_map(|r| match r {
+ Ok(decl) => Some(decl),
+ Err(e) => {
+ rsvg_log!(session, "Invalid declaration; ignoring: {:?}", e);
+ None
+ }
+ })
+ .for_each(|decl| self.set_property_from_declaration(&decl, origin, important_styles));
+ }
+}
+
+// Parses the value for the type `T` of the property out of the Parser, including `inherit` values.
+fn parse_input<'i, T>(input: &mut Parser<'i, '_>) -> Result<SpecifiedValue<T>, ParseError<'i>>
+where
+ T: Property + Clone + Default + Parse,
+{
+ if input
+ .try_parse(|p| p.expect_ident_matching("inherit"))
+ .is_ok()
+ {
+ Ok(SpecifiedValue::Inherit)
+ } else {
+ Parse::parse(input).map(SpecifiedValue::Specified)
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+ use crate::iri::Iri;
+ use crate::length::*;
+
+ #[test]
+ fn empty_values_computes_to_defaults() {
+ let specified = SpecifiedValues::default();
+
+ let mut computed = ComputedValues::default();
+ specified.to_computed_values(&mut computed);
+
+ assert_eq!(computed.stroke_width(), StrokeWidth::default());
+ }
+
+ #[test]
+ fn set_one_property() {
+ let length = Length::<Both>::new(42.0, LengthUnit::Px);
+
+ let mut specified = SpecifiedValues::default();
+ specified.set_parsed_property(&ParsedProperty::StrokeWidth(SpecifiedValue::Specified(
+ StrokeWidth(length),
+ )));
+
+ let mut computed = ComputedValues::default();
+ specified.to_computed_values(&mut computed);
+
+ assert_eq!(computed.stroke_width(), StrokeWidth(length));
+ }
+
+ #[test]
+ fn replace_existing_property() {
+ let length1 = Length::<Both>::new(42.0, LengthUnit::Px);
+ let length2 = Length::<Both>::new(42.0, LengthUnit::Px);
+
+ let mut specified = SpecifiedValues::default();
+
+ specified.set_parsed_property(&ParsedProperty::StrokeWidth(SpecifiedValue::Specified(
+ StrokeWidth(length1),
+ )));
+
+ specified.set_parsed_property(&ParsedProperty::StrokeWidth(SpecifiedValue::Specified(
+ StrokeWidth(length2),
+ )));
+
+ let mut computed = ComputedValues::default();
+ specified.to_computed_values(&mut computed);
+
+ assert_eq!(computed.stroke_width(), StrokeWidth(length2));
+ }
+
+ #[test]
+ fn expands_marker_shorthand() {
+ let mut specified = SpecifiedValues::default();
+ let iri = Iri::parse_str("url(#foo)").unwrap();
+
+ let marker = Marker(iri.clone());
+ specified.set_parsed_property(&ParsedProperty::Marker(SpecifiedValue::Specified(marker)));
+
+ let mut computed = ComputedValues::default();
+ specified.to_computed_values(&mut computed);
+
+ assert_eq!(computed.marker_start(), MarkerStart(iri.clone()));
+ assert_eq!(computed.marker_mid(), MarkerMid(iri.clone()));
+ assert_eq!(computed.marker_end(), MarkerEnd(iri.clone()));
+ }
+
+ #[test]
+ fn replaces_marker_shorthand() {
+ let mut specified = SpecifiedValues::default();
+ let iri1 = Iri::parse_str("url(#foo)").unwrap();
+ let iri2 = Iri::None;
+
+ let marker1 = Marker(iri1.clone());
+ specified.set_parsed_property(&ParsedProperty::Marker(SpecifiedValue::Specified(marker1)));
+
+ let marker2 = Marker(iri2.clone());
+ specified.set_parsed_property(&ParsedProperty::Marker(SpecifiedValue::Specified(marker2)));
+
+ let mut computed = ComputedValues::default();
+ specified.to_computed_values(&mut computed);
+
+ assert_eq!(computed.marker_start(), MarkerStart(iri2.clone()));
+ assert_eq!(computed.marker_mid(), MarkerMid(iri2.clone()));
+ assert_eq!(computed.marker_end(), MarkerEnd(iri2.clone()));
+ }
+
+ #[test]
+ fn computes_property_that_does_not_inherit_automatically() {
+ assert_eq!(<Opacity as Property>::inherits_automatically(), false);
+
+ let half_opacity = Opacity::parse_str("0.5").unwrap();
+
+ // first level, as specified with opacity
+
+ let mut with_opacity = SpecifiedValues::default();
+ with_opacity.set_parsed_property(&ParsedProperty::Opacity(SpecifiedValue::Specified(
+ half_opacity.clone(),
+ )));
+
+ let mut computed_0_5 = ComputedValues::default();
+ with_opacity.to_computed_values(&mut computed_0_5);
+
+ assert_eq!(computed_0_5.opacity(), half_opacity.clone());
+
+ // second level, no opacity specified, and it doesn't inherit
+
+ let without_opacity = SpecifiedValues::default();
+
+ let mut computed = computed_0_5.clone();
+ without_opacity.to_computed_values(&mut computed);
+
+ assert_eq!(computed.opacity(), Opacity::default());
+
+ // another at second level, opacity set to explicitly inherit
+
+ let mut with_inherit_opacity = SpecifiedValues::default();
+ with_inherit_opacity.set_parsed_property(&ParsedProperty::Opacity(SpecifiedValue::Inherit));
+
+ let mut computed = computed_0_5.clone();
+ with_inherit_opacity.to_computed_values(&mut computed);
+
+ assert_eq!(computed.opacity(), half_opacity.clone());
+ }
+}
diff --git a/rsvg/src/property_defs.rs b/rsvg/src/property_defs.rs
new file mode 100644
index 00000000..0018bab2
--- /dev/null
+++ b/rsvg/src/property_defs.rs
@@ -0,0 +1,1328 @@
+//! Definitions for CSS property types.
+//!
+//! Do not import things directly from this module; use the `properties` module instead,
+//! which re-exports things from here.
+//!
+//! This module defines most of the CSS property types that librsvg supports. Each
+//! property requires a Rust type that will hold its values, and that type should
+//! implement a few traits, as follows.
+//!
+//! # Requirements for a property type
+//!
+//! You should call the [`make_property`] macro to take care of most of these requirements
+//! automatically:
+//!
+//! * A name for the type. For example, the `fill` property has a [`Fill`] type defined
+//! in this module.
+//!
+//! * An initial value per the CSS or SVG specs, given through an implementation of the
+//! [`Default`] trait.
+//!
+//! * Whether the property's computed value inherits to child elements, given through an
+//! implementation of the [`Property`] trait and its
+//! [`inherits_automatically`][Property::inherits_automatically] method.
+//!
+//! * A way to derive the CSS *computed value* for the property, given through an
+//! implementation of the [`Property`] trait and its [`compute`][Property::compute] method.
+//!
+//! * The actual underlying type. For example, the [`make_property`] macro can generate a
+//! field-less enum for properties like the `clip-rule` property, which just has
+//! identifier-based values like `nonzero` and `evenodd`. For general-purpose types like
+//! [`Length`], the macro can wrap them in a newtype like `struct`
+//! [`StrokeWidth`]`(`[`Length`]`)`. For custom types, the macro call can be used just to
+//! define the initial/default value and whether the property inherits automatically; you
+//! should provide the other required trait implementations separately.
+//!
+//! * An implementation of the [`Parse`] trait for the underlying type.
+use std::convert::TryInto;
+use std::str::FromStr;
+
+use cssparser::{Parser, Token};
+use language_tags::LanguageTag;
+
+use crate::dasharray::Dasharray;
+use crate::error::*;
+use crate::filter::FilterValueList;
+use crate::font_props::{
+ Font, FontFamily, FontSize, FontWeight, GlyphOrientationVertical, LetterSpacing, LineHeight,
+};
+use crate::iri::Iri;
+use crate::length::*;
+use crate::paint_server::PaintServer;
+use crate::parsers::Parse;
+use crate::properties::ComputedValues;
+use crate::property_macros::Property;
+use crate::rect::Rect;
+use crate::transform::TransformProperty;
+use crate::unit_interval::UnitInterval;
+
+make_property!(
+ /// `baseline-shift` property.
+ ///
+ /// SVG1.1: <https://www.w3.org/TR/SVG11/text.html#BaselineShiftProperty>
+ ///
+ /// SVG2: <https://www.w3.org/TR/SVG2/text.html#BaselineShiftProperty>
+ BaselineShift,
+ default: Length::<Both>::parse_str("0.0").unwrap(),
+ newtype: Length<Both>,
+ property_impl: {
+ impl Property for BaselineShift {
+ fn inherits_automatically() -> bool {
+ false
+ }
+
+ fn compute(&self, v: &ComputedValues) -> Self {
+ let font_size = v.font_size().value();
+ let parent = v.baseline_shift();
+
+ match (self.0.unit, parent.0.unit) {
+ (LengthUnit::Percent, _) => {
+ BaselineShift(Length::<Both>::new(self.0.length * font_size.length + parent.0.length, font_size.unit))
+ }
+
+ (x, y) if x == y || parent.0.length == 0.0 => {
+ BaselineShift(Length::<Both>::new(self.0.length + parent.0.length, self.0.unit))
+ }
+
+ _ => {
+ // FIXME: the limitation here is that the parent's baseline_shift
+ // and ours have different units. We should be able to normalize
+ // the lengths and add them even if they have different units, but
+ // at the moment that requires access to the draw_ctx, which we
+ // don't have here.
+ //
+ // So for now we won't add to the parent's baseline_shift.
+
+ parent
+ }
+ }
+ }
+ }
+ },
+ parse_impl: {
+ impl Parse for BaselineShift {
+ // These values come from Inkscape's SP_CSS_BASELINE_SHIFT_(SUB/SUPER/BASELINE);
+ // see sp_style_merge_baseline_shift_from_parent()
+ fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<BaselineShift, crate::error::ParseError<'i>> {
+ parser.try_parse(|p| Ok(BaselineShift(Length::<Both>::parse(p)?)))
+ .or_else(|_: ParseError<'_>| {
+ Ok(parse_identifiers!(
+ parser,
+ "baseline" => BaselineShift(Length::<Both>::new(0.0, LengthUnit::Percent)),
+ "sub" => BaselineShift(Length::<Both>::new(-0.2, LengthUnit::Percent)),
+
+ "super" => BaselineShift(Length::<Both>::new(0.4, LengthUnit::Percent)),
+ )?)
+ })
+ }
+ }
+ }
+);
+
+make_property!(
+ /// `clip-path` property.
+ ///
+ /// SVG1.1: <https://www.w3.org/TR/SVG11/masking.html#ClipPathProperty>
+ ///
+ /// CSS Masking 1: <https://www.w3.org/TR/css-masking-1/#the-clip-path>
+ ClipPath,
+ default: Iri::None,
+ inherits_automatically: false,
+ newtype_parse: Iri,
+);
+
+make_property!(
+ /// `clip-rule` property.
+ ///
+ /// SVG1.1: <https://www.w3.org/TR/SVG11/masking.html#ClipRuleProperty>
+ ///
+ /// CSS Masking 1: <https://www.w3.org/TR/css-masking-1/#the-clip-rule>
+ ClipRule,
+ default: NonZero,
+ inherits_automatically: true,
+
+ identifiers:
+ "nonzero" => NonZero,
+ "evenodd" => EvenOdd,
+);
+
+make_property!(
+ /// `color` property, the fallback for `currentColor` values.
+ ///
+ /// SVG1.1: <https://www.w3.org/TR/SVG11/color.html#ColorProperty>
+ ///
+ /// SVG2: <https://www.w3.org/TR/SVG2/painting.html#ColorProperty>
+ ///
+ /// The SVG spec allows the user agent to choose its own initial value for the "color"
+ /// property. Here we start with opaque black for the initial value. Clients can
+ /// override this by specifing a custom CSS stylesheet.
+ ///
+ /// Most of the time the `color` property is used to call
+ /// [`crate::paint_server::resolve_color`].
+ Color,
+ default: cssparser::RGBA::new(0, 0, 0, 0xff),
+ inherits_automatically: true,
+ newtype_parse: cssparser::RGBA,
+);
+
+make_property!(
+ /// `color-interpolation-filters` property.
+ ///
+ /// SVG1.1: <https://www.w3.org/TR/SVG11/painting.html#ColorInterpolationFiltersProperty>
+ ///
+ /// Filter Effects 1: <https://www.w3.org/TR/filter-effects/#propdef-color-interpolation-filters>
+ ColorInterpolationFilters,
+ default: LinearRgb,
+ inherits_automatically: true,
+
+ identifiers:
+ "auto" => Auto,
+ "linearRGB" => LinearRgb,
+ "sRGB" => Srgb,
+);
+
+make_property!(
+ /// `cx` property.
+ ///
+ /// SVG2: <https://www.w3.org/TR/SVG2/geometry.html#CX>
+ ///
+ /// Note that in SVG1.1, this was an attribute, not a property.
+ CX,
+ default: Length::<Horizontal>::parse_str("0").unwrap(),
+ inherits_automatically: false,
+ newtype_parse: Length<Horizontal>,
+);
+
+make_property!(
+ /// `cy` attribute.
+ ///
+ /// SVG2: <https://www.w3.org/TR/SVG2/geometry.html#CY>
+ ///
+ /// Note that in SVG1.1, this was an attribute, not a property.
+ CY,
+ default: Length::<Vertical>::parse_str("0").unwrap(),
+ inherits_automatically: false,
+ newtype_parse: Length<Vertical>,
+);
+
+make_property!(
+ /// `direction` property.
+ ///
+ /// SVG1.1: <https://www.w3.org/TR/SVG11/text.html#DirectionProperty>
+ ///
+ /// SVG2: <https://www.w3.org/TR/SVG2/text.html#DirectionProperty>
+ Direction,
+ default: Ltr,
+ inherits_automatically: true,
+
+ identifiers:
+ "ltr" => Ltr,
+ "rtl" => Rtl,
+);
+
+make_property!(
+ /// `display` property.
+ ///
+ /// SVG1.1: <https://www.w3.org/TR/CSS2/visuren.html#display-prop>
+ ///
+ /// SVG2: <https://www.w3.org/TR/SVG2/render.html#VisibilityControl>
+ Display,
+ default: Inline,
+ inherits_automatically: false,
+
+ identifiers:
+ "inline" => Inline,
+ "block" => Block,
+ "list-item" => ListItem,
+ "run-in" => RunIn,
+ "compact" => Compact,
+ "marker" => Marker,
+ "table" => Table,
+ "inline-table" => InlineTable,
+ "table-row-group" => TableRowGroup,
+ "table-header-group" => TableHeaderGroup,
+ "table-footer-group" => TableFooterGroup,
+ "table-row" => TableRow,
+ "table-column-group" => TableColumnGroup,
+ "table-column" => TableColumn,
+ "table-cell" => TableCell,
+ "table-caption" => TableCaption,
+ "none" => None,
+);
+
+/// `enable-background` property.
+///
+/// SVG1.1: <https://www.w3.org/TR/SVG11/filters.html#EnableBackgroundProperty>
+///
+/// This is deprecated in SVG2. We just have a parser for it to avoid setting elements in
+/// error if they have this property. Librsvg does not use the value of this property.
+#[derive(Debug, Clone, Copy, PartialEq)]
+pub enum EnableBackground {
+ Accumulate,
+ New(Option<Rect>),
+}
+
+make_property!(
+ EnableBackground,
+ default: EnableBackground::Accumulate,
+ inherits_automatically: false,
+
+ parse_impl: {
+ impl Parse for EnableBackground {
+ fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<Self, crate::error::ParseError<'i>> {
+ let loc = parser.current_source_location();
+
+ if parser
+ .try_parse(|p| p.expect_ident_matching("accumulate"))
+ .is_ok()
+ {
+ return Ok(EnableBackground::Accumulate);
+ }
+
+ if parser.try_parse(|p| p.expect_ident_matching("new")).is_ok() {
+ parser.try_parse(|p| -> Result<_, ParseError<'_>> {
+ let x = f64::parse(p)?;
+ let y = f64::parse(p)?;
+ let w = f64::parse(p)?;
+ let h = f64::parse(p)?;
+
+ Ok(EnableBackground::New(Some(Rect::new(x, y, x + w, y + h))))
+ }).or(Ok(EnableBackground::New(None)))
+ } else {
+ Err(loc.new_custom_error(ValueErrorKind::parse_error("invalid syntax for 'enable-background' property")))
+ }
+ }
+ }
+
+ }
+);
+
+#[cfg(test)]
+#[test]
+fn parses_enable_background() {
+ assert_eq!(
+ EnableBackground::parse_str("accumulate").unwrap(),
+ EnableBackground::Accumulate
+ );
+
+ assert_eq!(
+ EnableBackground::parse_str("new").unwrap(),
+ EnableBackground::New(None)
+ );
+
+ assert_eq!(
+ EnableBackground::parse_str("new 1 2 3 4").unwrap(),
+ EnableBackground::New(Some(Rect::new(1.0, 2.0, 4.0, 6.0)))
+ );
+
+ assert!(EnableBackground::parse_str("new foo").is_err());
+
+ assert!(EnableBackground::parse_str("plonk").is_err());
+}
+
+make_property!(
+ /// `fill` property.
+ ///
+ /// SVG1.1: <https://www.w3.org/TR/SVG11/painting.html#FillProperty>
+ ///
+ /// SVG2: <https://www.w3.org/TR/SVG2/painting.html#FillProperty>
+ Fill,
+ default: PaintServer::parse_str("#000").unwrap(),
+ inherits_automatically: true,
+ newtype_parse: PaintServer,
+);
+
+make_property!(
+ /// `fill-opacity` property.
+ ///
+ /// SVG1.1: <https://www.w3.org/TR/SVG11/painting.html#FillOpacityProperty>
+ ///
+ /// SVG2: <https://www.w3.org/TR/SVG2/painting.html#FillOpacity>
+ FillOpacity,
+ default: UnitInterval(1.0),
+ inherits_automatically: true,
+ newtype_parse: UnitInterval,
+);
+
+make_property!(
+ /// `fill-rule` property.
+ ///
+ /// SVG1.1: <https://www.w3.org/TR/SVG11/painting.html#FillRuleProperty>
+ ///
+ /// SVG2: <https://www.w3.org/TR/SVG2/painting.html#WindingRule>
+ FillRule,
+ default: NonZero,
+ inherits_automatically: true,
+
+ identifiers:
+ "nonzero" => NonZero,
+ "evenodd" => EvenOdd,
+);
+
+/// `filter` property.
+///
+/// SVG1.1: <https://www.w3.org/TR/SVG11/filters.html#FilterProperty>
+///
+/// Filter Effects 1: <https://www.w3.org/TR/filter-effects/#FilterProperty>
+///
+/// Note that in SVG2, the filters got offloaded to the [Filter Effects Module Level
+/// 1](https://www.w3.org/TR/filter-effects/) specification.
+#[derive(Debug, Clone, PartialEq)]
+pub enum Filter {
+ None,
+ List(FilterValueList),
+}
+
+make_property!(
+ Filter,
+ default: Filter::None,
+ inherits_automatically: false,
+ parse_impl: {
+ impl Parse for Filter {
+ fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<Self, crate::error::ParseError<'i>> {
+
+ if parser
+ .try_parse(|p| p.expect_ident_matching("none"))
+ .is_ok()
+ {
+ return Ok(Filter::None);
+ }
+
+ Ok(Filter::List(FilterValueList::parse(parser)?))
+ }
+ }
+ }
+);
+
+make_property!(
+ /// `flood-color` property, for `feFlood` and `feDropShadow` filter elements.
+ ///
+ /// SVG1.1: <https://www.w3.org/TR/SVG11/filters.html#feFloodElement>
+ ///
+ /// Filter Effects 1: <https://www.w3.org/TR/filter-effects/#FloodColorProperty>
+ FloodColor,
+ default: cssparser::Color::RGBA(cssparser::RGBA::new(0, 0, 0, 255)),
+ inherits_automatically: false,
+ newtype_parse: cssparser::Color,
+);
+
+make_property!(
+ /// `flood-opacity` property, for `feFlood` and `feDropShadow` filter elements.
+ ///
+ /// SVG1.1: <https://www.w3.org/TR/SVG11/filters.html#feFloodElement>
+ ///
+ /// Filter Effects 1: <https://www.w3.org/TR/filter-effects/#FloodOpacityProperty>
+ FloodOpacity,
+ default: UnitInterval(1.0),
+ inherits_automatically: false,
+ newtype_parse: UnitInterval,
+);
+
+make_property!(
+ // docs are in font_props.rs
+ Font,
+ default: Font::Spec(Default::default()),
+ inherits_automatically: true,
+);
+
+make_property!(
+ // docs are in font_props.rs
+ FontFamily,
+ default: FontFamily("Times New Roman".to_string()),
+ inherits_automatically: true,
+);
+
+make_property!(
+ // docs are in font_props.rs
+ FontSize,
+ default: FontSize::Value(Length::<Both>::parse_str("12.0").unwrap()),
+ property_impl: {
+ impl Property for FontSize {
+ fn inherits_automatically() -> bool {
+ true
+ }
+
+ fn compute(&self, v: &ComputedValues) -> Self {
+ self.compute(v)
+ }
+ }
+ }
+);
+
+make_property!(
+ /// `font-stretch` property.
+ ///
+ /// SVG1.1: <https://www.w3.org/TR/SVG11/text.html#FontStretchProperty>
+ ///
+ /// CSS Fonts 3: <https://www.w3.org/TR/css-fonts-3/#font-size-propstret>
+ FontStretch,
+ default: Normal,
+ inherits_automatically: true,
+
+ identifiers:
+ "normal" => Normal,
+ "wider" => Wider,
+ "narrower" => Narrower,
+ "ultra-condensed" => UltraCondensed,
+ "extra-condensed" => ExtraCondensed,
+ "condensed" => Condensed,
+ "semi-condensed" => SemiCondensed,
+ "semi-expanded" => SemiExpanded,
+ "expanded" => Expanded,
+ "extra-expanded" => ExtraExpanded,
+ "ultra-expanded" => UltraExpanded,
+);
+
+make_property!(
+ /// `font-style` property.
+ ///
+ /// SVG1.1: <https://www.w3.org/TR/SVG11/text.html#FontStyleProperty>
+ ///
+ /// CSS Fonts 3: <https://www.w3.org/TR/css-fonts-3/#font-size-propstret>
+ FontStyle,
+ default: Normal,
+ inherits_automatically: true,
+
+ identifiers:
+ "normal" => Normal,
+ "italic" => Italic,
+ "oblique" => Oblique,
+);
+
+make_property!(
+ /// `font-variant` property.
+ ///
+ /// SVG1.1: <https://www.w3.org/TR/SVG11/text.html#FontVariantProperty>
+ ///
+ /// CSS Fonts 3: <https://www.w3.org/TR/css-fonts-3/#propdef-font-variant>
+ ///
+ /// Note that in CSS3, this is a lot more complex than CSS2.1 / SVG1.1.
+ FontVariant,
+ default: Normal,
+ inherits_automatically: true,
+
+ identifiers:
+ "normal" => Normal,
+ "small-caps" => SmallCaps,
+);
+
+make_property!(
+ // docs are in font_props.rs
+ FontWeight,
+ default: FontWeight::Normal,
+ property_impl: {
+ impl Property for FontWeight {
+ fn inherits_automatically() -> bool {
+ true
+ }
+
+ fn compute(&self, v: &ComputedValues) -> Self {
+ self.compute(&v.font_weight())
+ }
+ }
+ }
+);
+
+make_property!(
+ // docs are in font_props.rs
+ //
+ // Although https://www.w3.org/TR/css-writing-modes-3/#propdef-glyph-orientation-vertical specifies
+ // "n/a" for both the initial value (default) and inheritance, we'll use Auto here for the default,
+ // since it translates to TextOrientation::Mixed - which is text-orientation's initial value.
+ GlyphOrientationVertical,
+ default: GlyphOrientationVertical::Auto,
+ inherits_automatically: false,
+);
+
+make_property!(
+ /// `height` property.
+ ///
+ /// SVG2: <https://www.w3.org/TR/SVG2/geometry.html#Sizing>
+ ///
+ /// Note that in SVG1.1, this was an attribute, not a property.
+ Height,
+ default: LengthOrAuto::<Vertical>::Auto,
+ inherits_automatically: false,
+ newtype_parse: LengthOrAuto<Vertical>,
+);
+
+make_property!(
+ /// `isolation` property.
+ ///
+ /// CSS Compositing and Blending 1: <https://www.w3.org/TR/compositing-1/#isolation>
+ Isolation,
+ default: Auto,
+ inherits_automatically: false,
+
+ identifiers:
+ "auto" => Auto,
+ "isolate" => Isolate,
+);
+
+make_property!(
+ // docs are in font_props.rs
+ LetterSpacing,
+ default: LetterSpacing::Normal,
+ property_impl: {
+ impl Property for LetterSpacing {
+ fn inherits_automatically() -> bool {
+ true
+ }
+
+ fn compute(&self, _v: &ComputedValues) -> Self {
+ self.compute()
+ }
+ }
+ }
+);
+
+make_property!(
+ // docs are in font_props.rs
+ LineHeight,
+ default: LineHeight::Normal,
+ inherits_automatically: true,
+);
+
+make_property!(
+ /// `lighting-color` property for `feDiffuseLighting` and `feSpecularLighting` filter elements.
+ ///
+ /// SVG1.1: <https://www.w3.org/TR/SVG11/filters.html#LightingColorProperty>
+ ///
+ /// Filter Effects 1: <https://www.w3.org/TR/filter-effects/#LightingColorProperty>
+ LightingColor,
+ default: cssparser::Color::RGBA(cssparser::RGBA::new(255, 255, 255, 255)),
+ inherits_automatically: false,
+ newtype_parse: cssparser::Color,
+);
+
+make_property!(
+ /// `marker` shorthand property.
+ ///
+ /// SVG2: <https://www.w3.org/TR/SVG2/painting.html#MarkerShorthand>
+ ///
+ /// This is a shorthand, which expands to the `marker-start`, `marker-mid`,
+ /// `marker-end` longhand properties.
+ Marker,
+ default: Iri::None,
+ inherits_automatically: true,
+ newtype_parse: Iri,
+);
+
+make_property!(
+ /// `marker-end` property.
+ ///
+ /// SVG2: <https://www.w3.org/TR/SVG2/painting.html#VertexMarkerProperties>
+ MarkerEnd,
+ default: Iri::None,
+ inherits_automatically: true,
+ newtype_parse: Iri,
+);
+
+make_property!(
+ /// `marker-mid` property.
+ ///
+ /// SVG2: <https://www.w3.org/TR/SVG2/painting.html#VertexMarkerProperties>
+ MarkerMid,
+ default: Iri::None,
+ inherits_automatically: true,
+ newtype_parse: Iri,
+);
+
+make_property!(
+ /// `marker-start` property.
+ ///
+ /// SVG2: <https://www.w3.org/TR/SVG2/painting.html#VertexMarkerProperties>
+ MarkerStart,
+ default: Iri::None,
+ inherits_automatically: true,
+ newtype_parse: Iri,
+);
+
+make_property!(
+ /// `mask` shorthand property.
+ ///
+ /// SVG1.1: <https://www.w3.org/TR/SVG11/masking.html#MaskProperty>
+ ///
+ /// CSS Masking 1: <https://www.w3.org/TR/css-masking-1/#the-mask>
+ ///
+ /// Note that librsvg implements SVG1.1 semantics, where this is not a shorthand.
+ Mask,
+ default: Iri::None,
+ inherits_automatically: false,
+ newtype_parse: Iri,
+);
+
+make_property!(
+ /// `mask-type` property.
+ ///
+ /// CSS Masking 1: <https://www.w3.org/TR/css-masking-1/#the-mask-type>
+ MaskType,
+ default: Luminance,
+ inherits_automatically: false,
+
+ identifiers:
+ "luminance" => Luminance,
+ "alpha" => Alpha,
+);
+
+make_property!(
+ /// `mix-blend-mode` property.
+ ///
+ /// Compositing and Blending 1: <https://www.w3.org/TR/compositing/#mix-blend-mode>
+ MixBlendMode,
+ default: Normal,
+ inherits_automatically: false,
+
+ identifiers:
+ "normal" => Normal,
+ "multiply" => Multiply,
+ "screen" => Screen,
+ "overlay" => Overlay,
+ "darken" => Darken,
+ "lighten" => Lighten,
+ "color-dodge" => ColorDodge,
+ "color-burn" => ColorBurn,
+ "hard-light" => HardLight,
+ "soft-light" => SoftLight,
+ "difference" => Difference,
+ "exclusion" => Exclusion,
+ "hue" => Hue,
+ "saturation" => Saturation,
+ "color" => Color,
+ "luminosity" => Luminosity,
+);
+
+make_property!(
+ /// `opacity` property.
+ ///
+ /// CSS Color 3: <https://www.w3.org/TR/css-color-3/#opacity>
+ Opacity,
+ default: UnitInterval(1.0),
+ inherits_automatically: false,
+ newtype_parse: UnitInterval,
+);
+
+make_property!(
+ /// `overflow` shorthand property.
+ ///
+ /// CSS2: <https://www.w3.org/TR/CSS2/visufx.html#overflow>
+ ///
+ /// CSS Overflow 3: <https://www.w3.org/TR/css-overflow-3/#propdef-overflow>
+ ///
+ /// Note that librsvg implements SVG1.1 semantics, where this is not a shorthand.
+ Overflow,
+ default: Visible,
+ inherits_automatically: false,
+
+ identifiers:
+ "visible" => Visible,
+ "hidden" => Hidden,
+ "scroll" => Scroll,
+ "auto" => Auto,
+);
+
+/// One of the three operations for the `paint-order` property; see [`PaintOrder`].
+#[repr(u8)]
+#[derive(Debug, Clone, Copy, Eq, PartialEq)]
+pub enum PaintTarget {
+ Fill,
+ Stroke,
+ Markers,
+}
+
+make_property!(
+ /// `paint-order` property.
+ ///
+ /// SVG2: <https://www.w3.org/TR/SVG2/painting.html#PaintOrder>
+ ///
+ /// The `targets` field specifies the order in which graphic elements should be filled/stroked.
+ /// Instead of hard-coding an order of fill/stroke/markers, use the order specified by the `targets`.
+ PaintOrder,
+ inherits_automatically: true,
+ fields: {
+ targets: [PaintTarget; 3], default: [PaintTarget::Fill, PaintTarget::Stroke, PaintTarget::Markers],
+ }
+
+ parse_impl: {
+ impl Parse for PaintOrder {
+ fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<PaintOrder, ParseError<'i>> {
+ let allowed_targets = 3;
+ let mut targets = Vec::with_capacity(allowed_targets);
+
+ if parser.try_parse(|p| p.expect_ident_matching("normal")).is_ok() {
+ return Ok(PaintOrder::default());
+ }
+
+ while !parser.is_exhausted() {
+ let loc = parser.current_source_location();
+ let token = parser.next()?;
+
+ let value = match token {
+ Token::Ident(ref cow) if cow.eq_ignore_ascii_case("fill") && !targets.contains(&PaintTarget::Fill) => PaintTarget::Fill,
+ Token::Ident(ref cow) if cow.eq_ignore_ascii_case("stroke") && !targets.contains(&PaintTarget::Stroke) => PaintTarget::Stroke,
+ Token::Ident(ref cow) if cow.eq_ignore_ascii_case("markers") && !targets.contains(&PaintTarget::Markers) => PaintTarget::Markers,
+ _ => return Err(loc.new_basic_unexpected_token_error(token.clone()).into()),
+ };
+
+ targets.push(value);
+ };
+
+ // any values which were not specfied should be painted in default order
+ // (fill, stroke, markers) following the values which were explicitly specified.
+ for &target in &[PaintTarget::Fill, PaintTarget::Stroke, PaintTarget::Markers] {
+ if !targets.contains(&target) {
+ targets.push(target);
+ }
+ }
+ Ok(PaintOrder {
+ targets: targets[..].try_into().expect("Incorrect number of targets in paint-order")
+ })
+ }
+ }
+ }
+);
+
+#[cfg(test)]
+#[test]
+fn parses_paint_order() {
+ assert_eq!(
+ PaintOrder::parse_str("normal").unwrap(),
+ PaintOrder {
+ targets: [PaintTarget::Fill, PaintTarget::Stroke, PaintTarget::Markers]
+ }
+ );
+
+ assert_eq!(
+ PaintOrder::parse_str("markers fill").unwrap(),
+ PaintOrder {
+ targets: [PaintTarget::Markers, PaintTarget::Fill, PaintTarget::Stroke]
+ }
+ );
+
+ assert_eq!(
+ PaintOrder::parse_str("stroke").unwrap(),
+ PaintOrder {
+ targets: [PaintTarget::Stroke, PaintTarget::Fill, PaintTarget::Markers]
+ }
+ );
+
+ assert!(PaintOrder::parse_str("stroke stroke").is_err());
+ assert!(PaintOrder::parse_str("markers stroke fill hello").is_err());
+}
+
+make_property!(
+ /// `r` property.
+ ///
+ /// SVG2: <https://www.w3.org/TR/SVG2/geometry.html#R>
+ ///
+ /// Note that in SVG1.1, this was an attribute, not a property.
+ R,
+ default: ULength::<Both>::parse_str("0").unwrap(),
+ inherits_automatically: false,
+ newtype_parse: ULength<Both>,
+);
+
+make_property!(
+ /// `rx` property.
+ ///
+ /// SVG2: <https://www.w3.org/TR/SVG2/geometry.html#RX>
+ ///
+ /// Note that in SVG1.1, this was an attribute, not a property.
+ RX,
+ default: LengthOrAuto::<Horizontal>::Auto,
+ inherits_automatically: false,
+ newtype_parse: LengthOrAuto<Horizontal>,
+);
+
+make_property!(
+ /// `ry` property.
+ ///
+ /// SVG2: <https://www.w3.org/TR/SVG2/geometry.html#RY>
+ ///
+ /// Note that in SVG1.1, this was an attribute, not a property.
+ RY,
+ default: LengthOrAuto::<Vertical>::Auto,
+ inherits_automatically: false,
+ newtype_parse: LengthOrAuto<Vertical>,
+);
+
+make_property!(
+ /// `shape-rendering` property.
+ ///
+ /// SVG2: <https://www.w3.org/TR/SVG2/painting.html#ShapeRendering>
+ ShapeRendering,
+ default: Auto,
+ inherits_automatically: true,
+
+ identifiers:
+ "auto" => Auto,
+ "optimizeSpeed" => OptimizeSpeed,
+ "geometricPrecision" => GeometricPrecision,
+ "crispEdges" => CrispEdges,
+);
+
+make_property!(
+ /// `stop-color` property for gradient stops.
+ ///
+ /// SVG2: <https://www.w3.org/TR/SVG2/pservers.html#StopColorProperty>
+ StopColor,
+ default: cssparser::Color::RGBA(cssparser::RGBA::new(0, 0, 0, 255)),
+ inherits_automatically: false,
+ newtype_parse: cssparser::Color,
+);
+
+make_property!(
+ /// `stop-opacity` property for gradient stops.
+ ///
+ /// SVG2: <https://www.w3.org/TR/SVG2/pservers.html#StopOpacityProperty>
+ StopOpacity,
+ default: UnitInterval(1.0),
+ inherits_automatically: false,
+ newtype_parse: UnitInterval,
+);
+
+make_property!(
+ /// `stroke` property.
+ ///
+ /// SVG2: <https://www.w3.org/TR/SVG2/painting.html#SpecifyingStrokePaint>
+ Stroke,
+ default: PaintServer::None,
+ inherits_automatically: true,
+ newtype_parse: PaintServer,
+);
+
+make_property!(
+ /// `stroke-dasharray` property.
+ ///
+ /// SVG2: <https://www.w3.org/TR/SVG2/painting.html#StrokeDashing>
+ StrokeDasharray,
+ default: Dasharray::default(),
+ inherits_automatically: true,
+ newtype_parse: Dasharray,
+);
+
+make_property!(
+ /// `stroke-dashoffset` property.
+ ///
+ /// SVG2: <https://www.w3.org/TR/SVG2/painting.html#StrokeDashingdas>
+ StrokeDashoffset,
+ default: Length::<Both>::default(),
+ inherits_automatically: true,
+ newtype_parse: Length<Both>,
+);
+
+make_property!(
+ /// `stroke-linecap` property.
+ ///
+ /// SVG2: <https://www.w3.org/TR/SVG2/painting.html#LineCaps>
+ StrokeLinecap,
+ default: Butt,
+ inherits_automatically: true,
+
+ identifiers:
+ "butt" => Butt,
+ "round" => Round,
+ "square" => Square,
+);
+
+make_property!(
+ /// `stroke-linejoin` property.
+ ///
+ /// SVG2: <https://www.w3.org/TR/SVG2/painting.html#LineJoin>
+ StrokeLinejoin,
+ default: Miter,
+ inherits_automatically: true,
+
+ identifiers:
+ "miter" => Miter,
+ "round" => Round,
+ "bevel" => Bevel,
+);
+
+make_property!(
+ /// `stroke-miterlimit` property.
+ ///
+ /// SVG2: <https://www.w3.org/TR/SVG2/painting.html#StrokeMiterlimitProperty>
+ StrokeMiterlimit,
+ default: 4f64,
+ inherits_automatically: true,
+ newtype_parse: f64,
+);
+
+make_property!(
+ /// `stroke-opacity` property.
+ ///
+ /// SVG2: <https://www.w3.org/TR/SVG2/painting.html#StrokeOpacity>
+ StrokeOpacity,
+ default: UnitInterval(1.0),
+ inherits_automatically: true,
+ newtype_parse: UnitInterval,
+);
+
+make_property!(
+ /// `stroke-width` property.
+ ///
+ /// SVG2: <https://www.w3.org/TR/SVG2/painting.html#StrokeWidth>
+ StrokeWidth,
+ default: Length::<Both>::parse_str("1.0").unwrap(),
+ inherits_automatically: true,
+ newtype_parse: Length::<Both>,
+);
+
+make_property!(
+ /// `text-anchor` property.
+ ///
+ /// SVG1.1: <https://www.w3.org/TR/SVG11/text.html#TextAnchorProperty>
+ TextAnchor,
+ default: Start,
+ inherits_automatically: true,
+
+ identifiers:
+ "start" => Start,
+ "middle" => Middle,
+ "end" => End,
+);
+
+make_property!(
+ /// `text-decoration` shorthand property.
+ ///
+ /// SVG1.1: <https://www.w3.org/TR/SVG11/text.html#TextDecorationProperty>
+ ///
+ /// CSS Text Decoration 3: <https://www.w3.org/TR/css-text-decor-3/#text-decoration-property>
+ ///
+ /// Note that librsvg implements SVG1.1 semantics, where this is not a shorthand.
+ TextDecoration,
+ inherits_automatically: false,
+
+ fields: {
+ overline: bool, default: false,
+ underline: bool, default: false,
+ strike: bool, default: false,
+ }
+
+ parse_impl: {
+ impl Parse for TextDecoration {
+ fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<TextDecoration, ParseError<'i>> {
+ let mut overline = false;
+ let mut underline = false;
+ let mut strike = false;
+
+ if parser.try_parse(|p| p.expect_ident_matching("none")).is_ok() {
+ return Ok(TextDecoration::default());
+ }
+
+ while !parser.is_exhausted() {
+ let loc = parser.current_source_location();
+ let token = parser.next()?;
+
+ match token {
+ Token::Ident(ref cow) if cow.eq_ignore_ascii_case("overline") => overline = true,
+ Token::Ident(ref cow) if cow.eq_ignore_ascii_case("underline") => underline = true,
+ Token::Ident(ref cow) if cow.eq_ignore_ascii_case("line-through") => strike = true,
+ _ => return Err(loc.new_basic_unexpected_token_error(token.clone()).into()),
+ }
+ }
+
+ Ok(TextDecoration {
+ overline,
+ underline,
+ strike,
+ })
+ }
+ }
+ }
+);
+
+#[cfg(test)]
+#[test]
+fn parses_text_decoration() {
+ assert_eq!(
+ TextDecoration::parse_str("none").unwrap(),
+ TextDecoration {
+ overline: false,
+ underline: false,
+ strike: false,
+ }
+ );
+
+ assert_eq!(
+ TextDecoration::parse_str("overline").unwrap(),
+ TextDecoration {
+ overline: true,
+ underline: false,
+ strike: false,
+ }
+ );
+
+ assert_eq!(
+ TextDecoration::parse_str("underline").unwrap(),
+ TextDecoration {
+ overline: false,
+ underline: true,
+ strike: false,
+ }
+ );
+
+ assert_eq!(
+ TextDecoration::parse_str("line-through").unwrap(),
+ TextDecoration {
+ overline: false,
+ underline: false,
+ strike: true,
+ }
+ );
+
+ assert_eq!(
+ TextDecoration::parse_str("underline overline").unwrap(),
+ TextDecoration {
+ overline: true,
+ underline: true,
+ strike: false,
+ }
+ );
+
+ assert!(TextDecoration::parse_str("airline").is_err())
+}
+
+make_property!(
+ /// `text-orientation` property.
+ ///
+ /// CSS Writing Modes 3: <https://www.w3.org/TR/css-writing-modes-3/#propdef-text-orientation>
+ TextOrientation,
+ default: Mixed,
+ inherits_automatically: true,
+
+ identifiers:
+ "mixed" => Mixed,
+ "upright" => Upright,
+ "sideways" => Sideways,
+);
+
+impl From<GlyphOrientationVertical> for TextOrientation {
+ /// Converts the `glyph-orientation-vertical` shorthand to a `text-orientation` longhand.
+ ///
+ /// See <https://www.w3.org/TR/css-writing-modes-3/#propdef-glyph-orientation-vertical> for the conversion table.
+ fn from(o: GlyphOrientationVertical) -> TextOrientation {
+ match o {
+ GlyphOrientationVertical::Auto => TextOrientation::Mixed,
+ GlyphOrientationVertical::Angle0 => TextOrientation::Upright,
+ GlyphOrientationVertical::Angle90 => TextOrientation::Sideways,
+ }
+ }
+}
+
+make_property!(
+ /// `text-rendering` property.
+ ///
+ /// SVG1.1: <https://www.w3.org/TR/SVG11/painting.html#TextRenderingProperty>
+ TextRendering,
+ default: Auto,
+ inherits_automatically: true,
+
+ identifiers:
+ "auto" => Auto,
+ "optimizeSpeed" => OptimizeSpeed,
+ "optimizeLegibility" => OptimizeLegibility,
+ "geometricPrecision" => GeometricPrecision,
+);
+
+make_property!(
+ /// `transform` property.
+ ///
+ /// CSS Transforms 1: <https://www.w3.org/TR/css-transforms-1/#transform-property>
+ Transform,
+ default: TransformProperty::None,
+ inherits_automatically: false,
+ newtype_parse: TransformProperty,
+);
+
+make_property!(
+ /// `unicode-bidi` property.
+ ///
+ /// CSS Writing Modes 3: <https://www.w3.org/TR/css-writing-modes-3/#unicode-bidi>
+ UnicodeBidi,
+ default: Normal,
+ inherits_automatically: false,
+
+ identifiers:
+ "normal" => Normal,
+ "embed" => Embed,
+ "isolate" => Isolate,
+ "bidi-override" => BidiOverride,
+ "isolate-override" => IsolateOverride,
+ "plaintext" => Plaintext,
+);
+
+make_property!(
+ /// `vector-effect` property.
+ ///
+ /// SVG2: <https://svgwg.org/svg2-draft/coords.html#VectorEffectProperty>
+ VectorEffect,
+ default: None,
+ inherits_automatically: false,
+
+ identifiers:
+ "none" => None,
+ "non-scaling-stroke" => NonScalingStroke,
+ // non-scaling-size, non-rotation, fixed-position not implemented
+);
+
+make_property!(
+ /// `visibility` property.
+ ///
+ /// CSS2: <https://www.w3.org/TR/CSS2/visufx.html#visibility>
+ Visibility,
+ default: Visible,
+ inherits_automatically: true,
+
+ identifiers:
+ "visible" => Visible,
+ "hidden" => Hidden,
+ "collapse" => Collapse,
+);
+
+make_property!(
+ /// `width` property.
+ ///
+ /// SVG2: <https://www.w3.org/TR/SVG2/geometry.html#Sizing>
+ ///
+ /// Note that in SVG1.1, this was an attribute, not a property.
+ Width,
+ default: LengthOrAuto::<Horizontal>::Auto,
+ inherits_automatically: false,
+ newtype_parse: LengthOrAuto<Horizontal>,
+);
+
+make_property!(
+ /// `writing-mode` property.
+ ///
+ /// SVG1.1: <https://www.w3.org/TR/SVG11/text.html#WritingModeProperty>
+ ///
+ /// SVG2: <https://svgwg.org/svg2-draft/text.html#WritingModeProperty>
+ ///
+ /// CSS Writing Modes 3: <https://www.w3.org/TR/css-writing-modes-3/#block-flow>
+ ///
+ /// See the comments in the SVG2 spec for how the SVG1.1 values must be translated
+ /// into CSS Writing Modes 3 values.
+ WritingMode,
+ default: HorizontalTb,
+ identifiers: {
+ "horizontal-tb" => HorizontalTb,
+ "vertical-rl" => VerticalRl,
+ "vertical-lr" => VerticalLr,
+ "lr" => Lr,
+ "lr-tb" => LrTb,
+ "rl" => Rl,
+ "rl-tb" => RlTb,
+ "tb" => Tb,
+ "tb-rl" => TbRl,
+ },
+ property_impl: {
+ impl Property for WritingMode {
+ fn inherits_automatically() -> bool {
+ true
+ }
+
+ fn compute(&self, _v: &ComputedValues) -> Self {
+ use WritingMode::*;
+
+ // Translate SVG1.1 compatibility values to SVG2 / CSS Writing Modes 3.
+ match *self {
+ Lr | LrTb | Rl | RlTb => HorizontalTb,
+ Tb | TbRl => VerticalRl,
+ _ => *self,
+ }
+ }
+ }
+ }
+);
+
+impl WritingMode {
+ pub fn is_horizontal(self) -> bool {
+ use WritingMode::*;
+
+ matches!(self, HorizontalTb | Lr | LrTb | Rl | RlTb)
+ }
+}
+
+make_property!(
+ /// `x` property.
+ ///
+ /// SVG2: <https://www.w3.org/TR/SVG2/geometry.html#X>
+ ///
+ /// Note that in SVG1.1, this was an attribute, not a property.
+ X,
+ default: Length::<Horizontal>::parse_str("0").unwrap(),
+ inherits_automatically: false,
+ newtype_parse: Length<Horizontal>,
+);
+
+make_property!(
+ /// `xml:lang` attribute.
+ ///
+ /// XML1.0: <https://www.w3.org/TR/xml/#sec-lang-tag>
+ ///
+ /// Similar to `XmlSpace`, this is a hack in librsvg: the `xml:lang` attribute is
+ /// supposed to apply to an element and all its children. This more or less matches
+ /// CSS property inheritance, so librsvg reuses the machinery for property inheritance
+ /// to propagate down the value of the `xml:lang` attribute to an element's children.
+ XmlLang,
+ default: None,
+ inherits_automatically: true,
+ newtype: Option<Box<LanguageTag>>,
+ parse_impl: {
+ impl Parse for XmlLang {
+ fn parse<'i>(
+ parser: &mut Parser<'i, '_>,
+ ) -> Result<XmlLang, ParseError<'i>> {
+ let language_tag = parser.expect_ident()?;
+ let language_tag = LanguageTag::from_str(language_tag).map_err(|_| {
+ parser.new_custom_error(ValueErrorKind::parse_error("invalid syntax for 'xml:lang' parameter"))
+ })?;
+ Ok(XmlLang(Some(Box::new(language_tag))))
+ }
+ }
+ },
+);
+
+#[cfg(test)]
+#[test]
+fn parses_xml_lang() {
+ assert_eq!(
+ XmlLang::parse_str("es-MX").unwrap(),
+ XmlLang(Some(Box::new(LanguageTag::from_str("es-MX").unwrap())))
+ );
+
+ assert!(XmlLang::parse_str("").is_err());
+}
+
+make_property!(
+ /// `xml:space` attribute.
+ ///
+ /// XML1.0: <https://www.w3.org/TR/xml/#sec-white-space>
+ ///
+ /// Similar to `XmlLang`, this is a hack in librsvg. The `xml:space` attribute is
+ /// supposed to be applied to all the children of the element in which it appears, so
+ /// it works more or less the same as CSS property inheritance. Librsvg reuses the
+ /// machinery for CSS property inheritance to propagate down the value of `xml:space`
+ /// to an element's children.
+ XmlSpace,
+ default: Default,
+ inherits_automatically: true,
+
+ identifiers:
+ "default" => Default,
+ "preserve" => Preserve,
+);
+
+make_property!(
+ /// `y` property.
+ ///
+ /// SVG2: <https://www.w3.org/TR/SVG2/geometry.html#Y>
+ ///
+ /// Note that in SVG1.1, this was an attribute, not a property.
+ Y,
+ default: Length::<Vertical>::parse_str("0").unwrap(),
+ inherits_automatically: false,
+ newtype_parse: Length<Vertical>,
+);
diff --git a/rsvg/src/property_macros.rs b/rsvg/src/property_macros.rs
new file mode 100644
index 00000000..0a51649e
--- /dev/null
+++ b/rsvg/src/property_macros.rs
@@ -0,0 +1,288 @@
+//! Macros to define CSS properties.
+
+use crate::properties::ComputedValues;
+
+/// Trait which all CSS property types should implement.
+pub trait Property {
+ /// Whether the property's computed value inherits from parent to child elements.
+ ///
+ /// For each property, the CSS or SVG specs say whether the property inherits
+ /// automatically. When a property is not specified in an element, the return value
+ /// of this method determines whether the property's value is copied from the parent
+ /// element (`true`), or whether it resets to the initial/default value (`false`).
+ fn inherits_automatically() -> bool;
+
+ /// Derive the CSS computed value from the parent element's
+ /// [`ComputedValues`][crate::properties::ComputedValues] and the
+ /// `self` value.
+ ///
+ /// The CSS or SVG specs say how to derive this for each property.
+ fn compute(&self, _: &ComputedValues) -> Self;
+}
+
+/// Generates a type for a CSS property.
+///
+/// Writing a property by hand takes a bit of boilerplate:
+///
+/// * Define a type to represent the property's values.
+///
+/// * A [`Parse`] implementation to parse the property.
+///
+/// * A [`Default`] implementation to define the property's *initial* value.
+///
+/// * A [`Property`] implementation to define whether the property
+/// inherits from the parent element, and how the property derives its
+/// computed value.
+///
+/// When going from [`SpecifiedValues`] to [`ComputedValues`],
+/// properties which inherit automatically from the parent element
+/// will just have their values cloned. Properties which do not
+/// inherit will be reset back to their initial value (i.e. their
+/// [`Default`]).
+///
+/// The default implementation of [`Property::compute()`] is to just
+/// clone the property's value. Properties which need more
+/// sophisticated computation can override this.
+///
+/// This macro allows defining properties of different kinds; see the following
+/// sections for examples.
+///
+/// # Simple identifiers
+///
+/// Many properties are just sets of identifiers and can be represented
+/// by simple enums. In this case, you can use the following:
+///
+/// ```text
+/// make_property!(
+/// /// Documentation here.
+/// StrokeLinejoin,
+/// default: Miter,
+/// inherits_automatically: true,
+///
+/// identifiers:
+/// "miter" => Miter,
+/// "round" => Round,
+/// "bevel" => Bevel,
+/// );
+/// ```
+///
+/// This generates a simple enum like the following, with implementations of [`Parse`],
+/// [`Default`], and [`Property`].
+///
+/// ```
+/// pub enum StrokeLinejoin { Miter, Round, Bevel }
+/// ```
+///
+/// # Properties from an existing, general-purpose type
+///
+/// For example, both the `lightingColor` and `floodColor` properties can be represented
+/// with a `cssparser::Color`, but their intial values are different. In this case, the macro
+/// can generate a newtype around `cssparser::Color` for each case:
+///
+/// ```text
+/// make_property!(
+/// /// Documentation here.
+/// FloodColor,
+/// default: cssparser::Color::RGBA(cssparser::RGBA::new(0, 0, 0, 0)),
+/// inherits_automatically: false,
+/// newtype_parse: cssparser::Color,
+/// );
+/// ```
+///
+/// # Properties from custom specific types
+///
+/// For example, font-related properties have custom, complex types that require an
+/// implentation of `Property::compute` that is more than a simple `clone`. In this case,
+/// define the custom type separately, and use the macro to specify the default value and
+/// the `Property` implementation.
+///
+/// [`Parse`]: crate::parsers::Parse
+/// [`Property`]: crate::property_macros::Property
+/// [`ComputedValues`]: crate::properties::ComputedValues
+/// [`SpecifiedValues`]: crate::properties::SpecifiedValues
+/// [`Property::compute()`]: crate::property_macros::Property::compute
+///
+#[macro_export]
+macro_rules! make_property {
+ ($(#[$attr:meta])*
+ $name: ident,
+ default: $default: ident,
+ inherits_automatically: $inherits_automatically: expr,
+ identifiers:
+ $($str_prop: expr => $variant: ident,)+
+ ) => {
+ $(#[$attr])*
+ #[derive(Debug, Copy, Clone, PartialEq)]
+ #[repr(C)]
+ pub enum $name {
+ $($variant),+
+ }
+
+ impl_default!($name, $name::$default);
+ impl_property!($name, $inherits_automatically);
+
+ impl $crate::parsers::Parse for $name {
+ fn parse<'i>(parser: &mut ::cssparser::Parser<'i, '_>) -> Result<$name, $crate::error::ParseError<'i>> {
+ Ok(parse_identifiers!(
+ parser,
+ $($str_prop => $name::$variant,)+
+ )?)
+ }
+ }
+ };
+
+ ($(#[$attr:meta])*
+ $name: ident,
+ default: $default: ident,
+ identifiers: { $($str_prop: expr => $variant: ident,)+ },
+ property_impl: { $prop: item }
+ ) => {
+ $(#[$attr])*
+ #[derive(Debug, Copy, Clone, PartialEq)]
+ #[repr(C)]
+ pub enum $name {
+ $($variant),+
+ }
+
+ impl_default!($name, $name::$default);
+ $prop
+
+ impl $crate::parsers::Parse for $name {
+ fn parse<'i>(parser: &mut ::cssparser::Parser<'i, '_>) -> Result<$name, $crate::error::ParseError<'i>> {
+ Ok(parse_identifiers!(
+ parser,
+ $($str_prop => $name::$variant,)+
+ )?)
+ }
+ }
+ };
+
+ ($(#[$attr:meta])*
+ $name: ident,
+ default: $default: expr,
+ inherits_automatically: $inherits_automatically: expr,
+ newtype_parse: $type: ty,
+ ) => {
+ $(#[$attr])*
+ #[derive(Debug, Clone, PartialEq)]
+ pub struct $name(pub $type);
+
+ impl_default!($name, $name($default));
+ impl_property!($name, $inherits_automatically);
+
+ impl $crate::parsers::Parse for $name {
+ fn parse<'i>(parser: &mut ::cssparser::Parser<'i, '_>) -> Result<$name, $crate::error::ParseError<'i>> {
+ Ok($name(<$type as $crate::parsers::Parse>::parse(parser)?))
+ }
+ }
+ };
+
+ ($(#[$attr:meta])*
+ $name: ident,
+ default: $default: expr,
+ property_impl: { $prop: item }
+ ) => {
+ impl_default!($name, $default);
+
+ $prop
+ };
+
+ ($name: ident,
+ default: $default: expr,
+ inherits_automatically: $inherits_automatically: expr,
+ ) => {
+ impl_default!($name, $default);
+ impl_property!($name, $inherits_automatically);
+ };
+
+ ($name: ident,
+ default: $default: expr,
+ inherits_automatically: $inherits_automatically: expr,
+ parse_impl: { $parse: item }
+ ) => {
+ impl_default!($name, $default);
+ impl_property!($name, $inherits_automatically);
+
+ $parse
+ };
+
+ ($(#[$attr:meta])*
+ $name: ident,
+ default: $default: expr,
+ newtype: $type: ty,
+ property_impl: { $prop: item },
+ parse_impl: { $parse: item }
+ ) => {
+ $(#[$attr])*
+ #[derive(Debug, Clone, PartialEq)]
+ pub struct $name(pub $type);
+
+ impl_default!($name, $name($default));
+
+ $prop
+
+ $parse
+ };
+
+ // pending - only XmlLang
+ ($(#[$attr:meta])*
+ $name: ident,
+ default: $default: expr,
+ inherits_automatically: $inherits_automatically: expr,
+ newtype: $type: ty,
+ parse_impl: { $parse: item },
+ ) => {
+ $(#[$attr])*
+ #[derive(Debug, Clone, PartialEq)]
+ pub struct $name(pub $type);
+
+ impl_default!($name, $name($default));
+ impl_property!($name, $inherits_automatically);
+
+ $parse
+ };
+
+ ($(#[$attr:meta])*
+ $name: ident,
+ inherits_automatically: $inherits_automatically: expr,
+ fields: {
+ $($field_name: ident : $field_type: ty, default: $field_default : expr,)+
+ }
+ parse_impl: { $parse: item }
+ ) => {
+ $(#[$attr])*
+ #[derive(Debug, Clone, PartialEq)]
+ pub struct $name {
+ $(pub $field_name: $field_type),+
+ }
+
+ impl_default!($name, $name { $($field_name: $field_default),+ });
+ impl_property!($name, $inherits_automatically);
+
+ $parse
+ };
+}
+
+macro_rules! impl_default {
+ ($name:ident, $default:expr) => {
+ impl Default for $name {
+ fn default() -> $name {
+ $default
+ }
+ }
+ };
+}
+
+macro_rules! impl_property {
+ ($name:ident, $inherits_automatically:expr) => {
+ impl $crate::property_macros::Property for $name {
+ fn inherits_automatically() -> bool {
+ $inherits_automatically
+ }
+
+ fn compute(&self, _v: &$crate::properties::ComputedValues) -> Self {
+ self.clone()
+ }
+ }
+ };
+}
diff --git a/rsvg/src/rect.rs b/rsvg/src/rect.rs
new file mode 100644
index 00000000..f805211e
--- /dev/null
+++ b/rsvg/src/rect.rs
@@ -0,0 +1,274 @@
+//! Types for rectangles.
+
+use crate::coord_units::CoordUnits;
+use crate::transform::Transform;
+
+#[allow(clippy::module_inception)]
+mod rect {
+ use crate::float_eq_cairo::ApproxEqCairo;
+ use core::ops::{Add, Range, Sub};
+ use float_cmp::approx_eq;
+ use num_traits::Zero;
+
+ // Use our own min() and max() that are acceptable for floating point
+
+ fn min<T: PartialOrd>(x: T, y: T) -> T {
+ if x <= y {
+ x
+ } else {
+ y
+ }
+ }
+
+ fn max<T: PartialOrd>(x: T, y: T) -> T {
+ if x >= y {
+ x
+ } else {
+ y
+ }
+ }
+
+ #[derive(Default, Debug, Clone, Copy, PartialEq, Eq)]
+ pub struct Rect<T> {
+ pub x0: T,
+ pub y0: T,
+ pub x1: T,
+ pub y1: T,
+ }
+
+ impl<T> Rect<T> {
+ #[inline]
+ pub fn new(x0: T, y0: T, x1: T, y1: T) -> Self {
+ Self { x0, y0, x1, y1 }
+ }
+ }
+
+ impl<T> Rect<T>
+ where
+ T: Copy + PartialOrd + PartialEq + Add<T, Output = T> + Sub<T, Output = T> + Zero,
+ {
+ #[inline]
+ pub fn from_size(w: T, h: T) -> Self {
+ Self {
+ x0: Zero::zero(),
+ y0: Zero::zero(),
+ x1: w,
+ y1: h,
+ }
+ }
+
+ #[inline]
+ pub fn width(&self) -> T {
+ self.x1 - self.x0
+ }
+
+ #[inline]
+ pub fn height(&self) -> T {
+ self.y1 - self.y0
+ }
+
+ #[inline]
+ pub fn size(&self) -> (T, T) {
+ (self.width(), self.height())
+ }
+
+ #[inline]
+ pub fn x_range(&self) -> Range<T> {
+ self.x0..self.x1
+ }
+
+ #[inline]
+ pub fn y_range(&self) -> Range<T> {
+ self.y0..self.y1
+ }
+
+ #[inline]
+ pub fn contains(self, x: T, y: T) -> bool {
+ x >= self.x0 && x < self.x1 && y >= self.y0 && y < self.y1
+ }
+
+ #[inline]
+ pub fn translate(&self, by: (T, T)) -> Self {
+ Self {
+ x0: self.x0 + by.0,
+ y0: self.y0 + by.1,
+ x1: self.x1 + by.0,
+ y1: self.y1 + by.1,
+ }
+ }
+
+ #[inline]
+ pub fn intersection(&self, rect: &Self) -> Option<Self> {
+ let (x0, y0, x1, y1) = (
+ max(self.x0, rect.x0),
+ max(self.y0, rect.y0),
+ min(self.x1, rect.x1),
+ min(self.y1, rect.y1),
+ );
+
+ if x1 > x0 && y1 > y0 {
+ Some(Self { x0, y0, x1, y1 })
+ } else {
+ None
+ }
+ }
+
+ #[inline]
+ pub fn union(&self, rect: &Self) -> Self {
+ Self {
+ x0: min(self.x0, rect.x0),
+ y0: min(self.y0, rect.y0),
+ x1: max(self.x1, rect.x1),
+ y1: max(self.y1, rect.y1),
+ }
+ }
+ }
+
+ impl Rect<i32> {
+ #[inline]
+ pub fn is_empty(&self) -> bool {
+ // Give an explicit type to the right hand side of the ==, since sometimes
+ // type inference fails to figure it out. I have no idea why.
+ self.width() == <i32 as Zero>::zero() || self.height() == <i32 as Zero>::zero()
+ }
+
+ #[inline]
+ pub fn scale(self, x: f64, y: f64) -> Self {
+ Self {
+ x0: (f64::from(self.x0) * x).floor() as i32,
+ y0: (f64::from(self.y0) * y).floor() as i32,
+ x1: (f64::from(self.x1) * x).ceil() as i32,
+ y1: (f64::from(self.y1) * y).ceil() as i32,
+ }
+ }
+ }
+
+ impl Rect<f64> {
+ #[inline]
+ pub fn is_empty(&self) -> bool {
+ self.width().approx_eq_cairo(0.0) || self.height().approx_eq_cairo(0.0)
+ }
+
+ #[inline]
+ pub fn scale(self, x: f64, y: f64) -> Self {
+ Self {
+ x0: self.x0 * x,
+ y0: self.y0 * y,
+ x1: self.x1 * x,
+ y1: self.y1 * y,
+ }
+ }
+
+ pub fn approx_eq(&self, other: &Self) -> bool {
+ // FIXME: this is super fishy; shouldn't we be using 2x the epsilon against the width/height
+ // instead of the raw coordinates?
+ approx_eq!(f64, self.x0, other.x0, epsilon = 0.0001)
+ && approx_eq!(f64, self.y0, other.y0, epsilon = 0.0001)
+ && approx_eq!(f64, self.x1, other.x1, epsilon = 0.0001)
+ && approx_eq!(f64, self.y1, other.y1, epsilon = 0.00012)
+ }
+ }
+}
+
+pub type Rect = rect::Rect<f64>;
+
+impl From<Rect> for IRect {
+ #[inline]
+ fn from(r: Rect) -> Self {
+ Self {
+ x0: r.x0.floor() as i32,
+ y0: r.y0.floor() as i32,
+ x1: r.x1.ceil() as i32,
+ y1: r.y1.ceil() as i32,
+ }
+ }
+}
+
+impl From<cairo::Rectangle> for Rect {
+ #[inline]
+ fn from(r: cairo::Rectangle) -> Self {
+ Self {
+ x0: r.x(),
+ y0: r.y(),
+ x1: r.x() + r.width(),
+ y1: r.y() + r.height(),
+ }
+ }
+}
+
+impl From<Rect> for cairo::Rectangle {
+ #[inline]
+ fn from(r: Rect) -> Self {
+ Self::new(r.x0, r.y0, r.x1 - r.x0, r.y1 - r.y0)
+ }
+}
+
+/// Creates a transform to map to a rectangle.
+///
+/// The rectangle is an `Option<Rect>` to indicate the possibility that there is no
+/// bounding box from where the rectangle could be obtained.
+///
+/// This depends on a `CoordUnits` parameter. When this is
+/// `CoordUnits::ObjectBoundingBox`, the bounding box must not be empty, since the calling
+/// code would then not have a usable size to work with. In that case, if the bbox is
+/// empty, this function returns `Err(())`.
+///
+/// Usually calling code can simply ignore the action it was about to take if this
+/// function returns an error.
+pub fn rect_to_transform(rect: &Option<Rect>, units: CoordUnits) -> Result<Transform, ()> {
+ match units {
+ CoordUnits::UserSpaceOnUse => Ok(Transform::identity()),
+ CoordUnits::ObjectBoundingBox => {
+ if rect.as_ref().map_or(true, |r| r.is_empty()) {
+ Err(())
+ } else {
+ let r = rect.as_ref().unwrap();
+ let t = Transform::new_unchecked(r.width(), 0.0, 0.0, r.height(), r.x0, r.y0);
+
+ if t.is_invertible() {
+ Ok(t)
+ } else {
+ Err(())
+ }
+ }
+ }
+ }
+}
+
+pub type IRect = rect::Rect<i32>;
+
+impl From<IRect> for Rect {
+ #[inline]
+ fn from(r: IRect) -> Self {
+ Self {
+ x0: f64::from(r.x0),
+ y0: f64::from(r.y0),
+ x1: f64::from(r.x1),
+ y1: f64::from(r.y1),
+ }
+ }
+}
+
+impl From<cairo::Rectangle> for IRect {
+ #[inline]
+ fn from(r: cairo::Rectangle) -> Self {
+ Self {
+ x0: r.x().floor() as i32,
+ y0: r.y().floor() as i32,
+ x1: (r.x() + r.width()).ceil() as i32,
+ y1: (r.y() + r.height()).ceil() as i32,
+ }
+ }
+}
+
+impl From<IRect> for cairo::Rectangle {
+ #[inline]
+ fn from(r: IRect) -> Self {
+ Self::new(
+ f64::from(r.x0),
+ f64::from(r.y0),
+ f64::from(r.x1 - r.x0),
+ f64::from(r.y1 - r.y0),
+ )
+ }
+}
diff --git a/rsvg/src/session.rs b/rsvg/src/session.rs
new file mode 100644
index 00000000..fe556cef
--- /dev/null
+++ b/rsvg/src/session.rs
@@ -0,0 +1,44 @@
+//! Tracks metadata for a loading/rendering session.
+
+use std::sync::Arc;
+
+/// Metadata for a loading/rendering session.
+///
+/// When the calling program first uses one of the API entry points (e.g. `Loader::new()`
+/// in the Rust API, or `rsvg_handle_new()` in the C API), there is no context yet where
+/// librsvg's code may start to track things. This struct provides that context.
+#[derive(Clone)]
+pub struct Session {
+ inner: Arc<SessionInner>,
+}
+
+struct SessionInner {
+ log_enabled: bool,
+}
+
+fn log_enabled_via_env_var() -> bool {
+ ::std::env::var_os("RSVG_LOG").is_some()
+}
+
+impl Default for Session {
+ fn default() -> Self {
+ Self {
+ inner: Arc::new(SessionInner {
+ log_enabled: log_enabled_via_env_var(),
+ }),
+ }
+ }
+}
+
+impl Session {
+ #[cfg(test)]
+ pub fn new_for_test_suite() -> Self {
+ Self {
+ inner: Arc::new(SessionInner { log_enabled: false }),
+ }
+ }
+
+ pub fn log_enabled(&self) -> bool {
+ self.inner.log_enabled
+ }
+}
diff --git a/rsvg/src/shapes.rs b/rsvg/src/shapes.rs
new file mode 100644
index 00000000..2aabd174
--- /dev/null
+++ b/rsvg/src/shapes.rs
@@ -0,0 +1,743 @@
+//! Basic SVG shapes: the `path`, `polygon`, `polyline`, `line`,
+//! `rect`, `circle`, `ellipse` elements.
+
+use cssparser::{Parser, Token};
+use markup5ever::{expanded_name, local_name, namespace_url, ns};
+use std::ops::Deref;
+use std::rc::Rc;
+
+use crate::bbox::BoundingBox;
+use crate::document::AcquiredNodes;
+use crate::drawing_ctx::{DrawingCtx, Viewport};
+use crate::element::{set_attribute, ElementTrait};
+use crate::error::*;
+use crate::iri::Iri;
+use crate::layout::{Layer, LayerKind, Marker, Shape, StackingContext, Stroke};
+use crate::length::*;
+use crate::node::{CascadedValues, Node, NodeBorrow};
+use crate::parsers::{optional_comma, Parse, ParseValue};
+use crate::path_builder::{LargeArc, Path as SvgPath, PathBuilder, Sweep};
+use crate::properties::ComputedValues;
+use crate::session::Session;
+use crate::xml::Attributes;
+
+#[derive(PartialEq)]
+enum Markers {
+ No,
+ Yes,
+}
+
+struct ShapeDef {
+ path: Rc<SvgPath>,
+ markers: Markers,
+}
+
+impl ShapeDef {
+ fn new(path: Rc<SvgPath>, markers: Markers) -> ShapeDef {
+ ShapeDef { path, markers }
+ }
+}
+
+trait BasicShape {
+ fn make_shape(&self, params: &NormalizeParams, values: &ComputedValues) -> ShapeDef;
+}
+
+fn draw_basic_shape(
+ basic_shape: &dyn BasicShape,
+ node: &Node,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ cascaded: &CascadedValues<'_>,
+ viewport: &Viewport,
+ draw_ctx: &mut DrawingCtx,
+ clipping: bool,
+) -> Result<BoundingBox, RenderingError> {
+ let values = cascaded.get();
+ let params = NormalizeParams::new(values, viewport);
+ let shape_def = basic_shape.make_shape(&params, values);
+
+ let is_visible = values.is_visible();
+ let paint_order = values.paint_order();
+
+ let stroke = Stroke::new(values, &params);
+
+ let session = draw_ctx.session();
+
+ let stroke_paint = values.stroke().0.resolve(
+ acquired_nodes,
+ values.stroke_opacity().0,
+ values.color().0,
+ cascaded.context_fill.clone(),
+ cascaded.context_stroke.clone(),
+ session,
+ );
+
+ let fill_paint = values.fill().0.resolve(
+ acquired_nodes,
+ values.fill_opacity().0,
+ values.color().0,
+ cascaded.context_fill.clone(),
+ cascaded.context_stroke.clone(),
+ session,
+ );
+
+ let fill_rule = values.fill_rule();
+ let clip_rule = values.clip_rule();
+ let shape_rendering = values.shape_rendering();
+
+ let marker_start_node;
+ let marker_mid_node;
+ let marker_end_node;
+
+ if shape_def.markers == Markers::Yes {
+ marker_start_node = acquire_marker(session, acquired_nodes, &values.marker_start().0);
+ marker_mid_node = acquire_marker(session, acquired_nodes, &values.marker_mid().0);
+ marker_end_node = acquire_marker(session, acquired_nodes, &values.marker_end().0);
+ } else {
+ marker_start_node = None;
+ marker_mid_node = None;
+ marker_end_node = None;
+ }
+
+ let marker_start = Marker {
+ node_ref: marker_start_node,
+ context_stroke: stroke_paint.clone(),
+ context_fill: fill_paint.clone(),
+ };
+
+ let marker_mid = Marker {
+ node_ref: marker_mid_node,
+ context_stroke: stroke_paint.clone(),
+ context_fill: fill_paint.clone(),
+ };
+
+ let marker_end = Marker {
+ node_ref: marker_end_node,
+ context_stroke: stroke_paint.clone(),
+ context_fill: fill_paint.clone(),
+ };
+
+ let extents = draw_ctx.compute_path_extents(&shape_def.path)?;
+
+ let normalize_values = NormalizeValues::new(values);
+
+ let stroke_paint = stroke_paint.to_user_space(&extents, viewport, &normalize_values);
+ let fill_paint = fill_paint.to_user_space(&extents, viewport, &normalize_values);
+
+ let shape = Box::new(Shape {
+ path: shape_def.path,
+ extents,
+ is_visible,
+ paint_order,
+ stroke,
+ stroke_paint,
+ fill_paint,
+ fill_rule,
+ clip_rule,
+ shape_rendering,
+ marker_start,
+ marker_mid,
+ marker_end,
+ });
+
+ let elt = node.borrow_element();
+ let stacking_ctx = StackingContext::new(
+ draw_ctx.session(),
+ acquired_nodes,
+ &elt,
+ values.transform(),
+ values,
+ );
+
+ let layer = Layer {
+ kind: LayerKind::Shape(shape),
+ stacking_ctx,
+ };
+
+ draw_ctx.draw_layer(&layer, acquired_nodes, clipping, viewport)
+}
+
+macro_rules! impl_draw {
+ () => {
+ fn draw(
+ &self,
+ node: &Node,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ cascaded: &CascadedValues<'_>,
+ viewport: &Viewport,
+ draw_ctx: &mut DrawingCtx,
+ clipping: bool,
+ ) -> Result<BoundingBox, RenderingError> {
+ draw_basic_shape(
+ self,
+ node,
+ acquired_nodes,
+ cascaded,
+ viewport,
+ draw_ctx,
+ clipping,
+ )
+ }
+ };
+}
+
+fn acquire_marker(
+ session: &Session,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ iri: &Iri,
+) -> Option<Node> {
+ iri.get().and_then(|id| {
+ acquired_nodes
+ .acquire(id)
+ .map_err(|e| {
+ rsvg_log!(session, "cannot render marker: {}", e);
+ })
+ .ok()
+ .and_then(|acquired| {
+ let node = acquired.get();
+
+ if is_element_of_type!(node, Marker) {
+ Some(node.clone())
+ } else {
+ rsvg_log!(session, "{} is not a marker element", id);
+ None
+ }
+ })
+ })
+}
+
+fn make_ellipse(cx: f64, cy: f64, rx: f64, ry: f64) -> SvgPath {
+ let mut builder = PathBuilder::default();
+
+ // Per the spec, rx and ry must be nonnegative
+ if rx <= 0.0 || ry <= 0.0 {
+ return builder.into_path();
+ }
+
+ // 4/3 * (1-cos 45°)/sin 45° = 4/3 * sqrt(2) - 1
+ let arc_magic: f64 = 0.5522847498;
+
+ // approximate an ellipse using 4 Bézier curves
+
+ builder.move_to(cx + rx, cy);
+
+ builder.curve_to(
+ cx + rx,
+ cy + arc_magic * ry,
+ cx + arc_magic * rx,
+ cy + ry,
+ cx,
+ cy + ry,
+ );
+
+ builder.curve_to(
+ cx - arc_magic * rx,
+ cy + ry,
+ cx - rx,
+ cy + arc_magic * ry,
+ cx - rx,
+ cy,
+ );
+
+ builder.curve_to(
+ cx - rx,
+ cy - arc_magic * ry,
+ cx - arc_magic * rx,
+ cy - ry,
+ cx,
+ cy - ry,
+ );
+
+ builder.curve_to(
+ cx + arc_magic * rx,
+ cy - ry,
+ cx + rx,
+ cy - arc_magic * ry,
+ cx + rx,
+ cy,
+ );
+
+ builder.close_path();
+
+ builder.into_path()
+}
+
+#[derive(Default)]
+pub struct Path {
+ path: Rc<SvgPath>,
+}
+
+impl ElementTrait for Path {
+ fn set_attributes(&mut self, attrs: &Attributes, session: &Session) {
+ for (attr, value) in attrs.iter() {
+ if attr.expanded() == expanded_name!("", "d") {
+ let mut builder = PathBuilder::default();
+ if let Err(e) = builder.parse(value) {
+ // Creating a partial path is OK per the spec; we don't throw away the partial
+ // result in case of an error.
+
+ rsvg_log!(session, "could not parse path: {}", e);
+ }
+ self.path = Rc::new(builder.into_path());
+ }
+ }
+ }
+
+ impl_draw!();
+}
+
+impl BasicShape for Path {
+ fn make_shape(&self, _params: &NormalizeParams, _values: &ComputedValues) -> ShapeDef {
+ ShapeDef::new(self.path.clone(), Markers::Yes)
+ }
+}
+
+/// List-of-points for polyline and polygon elements.
+///
+/// SVG1.1: <https://www.w3.org/TR/SVG/shapes.html#PointsBNF>
+///
+/// SVG2: <https://www.w3.org/TR/SVG/shapes.html#DataTypePoints>
+#[derive(Debug, Default, PartialEq)]
+struct Points(Vec<(f64, f64)>);
+
+impl Deref for Points {
+ type Target = [(f64, f64)];
+
+ fn deref(&self) -> &[(f64, f64)] {
+ &self.0
+ }
+}
+
+impl Parse for Points {
+ fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<Points, ParseError<'i>> {
+ let mut v = Vec::new();
+
+ loop {
+ let x = f64::parse(parser)?;
+ optional_comma(parser);
+ let y = f64::parse(parser)?;
+
+ v.push((x, y));
+
+ if parser.is_exhausted() {
+ break;
+ }
+
+ match parser.next_including_whitespace() {
+ Ok(&Token::WhiteSpace(_)) => (),
+ _ => optional_comma(parser),
+ }
+ }
+
+ Ok(Points(v))
+ }
+}
+
+fn make_poly(points: &Points, closed: bool) -> SvgPath {
+ let mut builder = PathBuilder::default();
+
+ for (i, &(x, y)) in points.iter().enumerate() {
+ if i == 0 {
+ builder.move_to(x, y);
+ } else {
+ builder.line_to(x, y);
+ }
+ }
+
+ if closed && !points.is_empty() {
+ builder.close_path();
+ }
+
+ builder.into_path()
+}
+
+#[derive(Default)]
+pub struct Polygon {
+ points: Points,
+}
+
+impl ElementTrait for Polygon {
+ fn set_attributes(&mut self, attrs: &Attributes, session: &Session) {
+ for (attr, value) in attrs.iter() {
+ if attr.expanded() == expanded_name!("", "points") {
+ set_attribute(&mut self.points, attr.parse(value), session);
+ }
+ }
+ }
+
+ impl_draw!();
+}
+
+impl BasicShape for Polygon {
+ fn make_shape(&self, _params: &NormalizeParams, _values: &ComputedValues) -> ShapeDef {
+ ShapeDef::new(Rc::new(make_poly(&self.points, true)), Markers::Yes)
+ }
+}
+
+#[derive(Default)]
+pub struct Polyline {
+ points: Points,
+}
+
+impl ElementTrait for Polyline {
+ fn set_attributes(&mut self, attrs: &Attributes, session: &Session) {
+ for (attr, value) in attrs.iter() {
+ if attr.expanded() == expanded_name!("", "points") {
+ set_attribute(&mut self.points, attr.parse(value), session);
+ }
+ }
+ }
+
+ impl_draw!();
+}
+
+impl BasicShape for Polyline {
+ fn make_shape(&self, _params: &NormalizeParams, _values: &ComputedValues) -> ShapeDef {
+ ShapeDef::new(Rc::new(make_poly(&self.points, false)), Markers::Yes)
+ }
+}
+
+#[derive(Default)]
+pub struct Line {
+ x1: Length<Horizontal>,
+ y1: Length<Vertical>,
+ x2: Length<Horizontal>,
+ y2: Length<Vertical>,
+}
+
+impl ElementTrait for Line {
+ fn set_attributes(&mut self, attrs: &Attributes, session: &Session) {
+ for (attr, value) in attrs.iter() {
+ match attr.expanded() {
+ expanded_name!("", "x1") => set_attribute(&mut self.x1, attr.parse(value), session),
+ expanded_name!("", "y1") => set_attribute(&mut self.y1, attr.parse(value), session),
+ expanded_name!("", "x2") => set_attribute(&mut self.x2, attr.parse(value), session),
+ expanded_name!("", "y2") => set_attribute(&mut self.y2, attr.parse(value), session),
+ _ => (),
+ }
+ }
+ }
+
+ impl_draw!();
+}
+
+impl BasicShape for Line {
+ fn make_shape(&self, params: &NormalizeParams, _values: &ComputedValues) -> ShapeDef {
+ let mut builder = PathBuilder::default();
+
+ let x1 = self.x1.to_user(params);
+ let y1 = self.y1.to_user(params);
+ let x2 = self.x2.to_user(params);
+ let y2 = self.y2.to_user(params);
+
+ builder.move_to(x1, y1);
+ builder.line_to(x2, y2);
+
+ ShapeDef::new(Rc::new(builder.into_path()), Markers::Yes)
+ }
+}
+
+/// The `<rect>` element.
+///
+/// Note that its x/y/width/height/rx/ry are properties in SVG2, so they are
+/// defined as part of [the properties machinery](properties.rs).
+#[derive(Default)]
+pub struct Rect {}
+
+impl ElementTrait for Rect {
+ impl_draw!();
+}
+
+impl BasicShape for Rect {
+ #[allow(clippy::many_single_char_names)]
+ fn make_shape(&self, params: &NormalizeParams, values: &ComputedValues) -> ShapeDef {
+ let x = values.x().0.to_user(params);
+ let y = values.y().0.to_user(params);
+
+ let w = match values.width().0 {
+ LengthOrAuto::Length(l) => l.to_user(params),
+ LengthOrAuto::Auto => 0.0,
+ };
+ let h = match values.height().0 {
+ LengthOrAuto::Length(l) => l.to_user(params),
+ LengthOrAuto::Auto => 0.0,
+ };
+
+ let norm_rx = match values.rx().0 {
+ LengthOrAuto::Length(l) => Some(l.to_user(params)),
+ LengthOrAuto::Auto => None,
+ };
+ let norm_ry = match values.ry().0 {
+ LengthOrAuto::Length(l) => Some(l.to_user(params)),
+ LengthOrAuto::Auto => None,
+ };
+
+ let mut rx;
+ let mut ry;
+
+ match (norm_rx, norm_ry) {
+ (None, None) => {
+ rx = 0.0;
+ ry = 0.0;
+ }
+
+ (Some(_rx), None) => {
+ rx = _rx;
+ ry = _rx;
+ }
+
+ (None, Some(_ry)) => {
+ rx = _ry;
+ ry = _ry;
+ }
+
+ (Some(_rx), Some(_ry)) => {
+ rx = _rx;
+ ry = _ry;
+ }
+ }
+
+ let mut builder = PathBuilder::default();
+
+ // Per the spec, w,h must be >= 0
+ if w <= 0.0 || h <= 0.0 {
+ return ShapeDef::new(Rc::new(builder.into_path()), Markers::No);
+ }
+
+ let half_w = w / 2.0;
+ let half_h = h / 2.0;
+
+ if rx > half_w {
+ rx = half_w;
+ }
+
+ if ry > half_h {
+ ry = half_h;
+ }
+
+ if rx == 0.0 {
+ ry = 0.0;
+ } else if ry == 0.0 {
+ rx = 0.0;
+ }
+
+ if rx == 0.0 {
+ // Easy case, no rounded corners
+ builder.move_to(x, y);
+ builder.line_to(x + w, y);
+ builder.line_to(x + w, y + h);
+ builder.line_to(x, y + h);
+ builder.line_to(x, y);
+ } else {
+ /* Hard case, rounded corners
+ *
+ * (top_x1, top_y) (top_x2, top_y)
+ * *--------------------------------*
+ * / \
+ * * (left_x, left_y1) * (right_x, right_y1)
+ * | |
+ * | |
+ * | |
+ * | |
+ * | |
+ * | |
+ * | |
+ * | |
+ * | |
+ * * (left_x, left_y2) * (right_x, right_y2)
+ * \ /
+ * *--------------------------------*
+ * (bottom_x1, bottom_y) (bottom_x2, bottom_y)
+ */
+
+ let top_x1 = x + rx;
+ let top_x2 = x + w - rx;
+ let top_y = y;
+
+ let bottom_x1 = top_x1;
+ let bottom_x2 = top_x2;
+ let bottom_y = y + h;
+
+ let left_x = x;
+ let left_y1 = y + ry;
+ let left_y2 = y + h - ry;
+
+ let right_x = x + w;
+ let right_y1 = left_y1;
+ let right_y2 = left_y2;
+
+ builder.move_to(top_x1, top_y);
+ builder.line_to(top_x2, top_y);
+
+ builder.arc(
+ top_x2,
+ top_y,
+ rx,
+ ry,
+ 0.0,
+ LargeArc(false),
+ Sweep::Positive,
+ right_x,
+ right_y1,
+ );
+
+ builder.line_to(right_x, right_y2);
+
+ builder.arc(
+ right_x,
+ right_y2,
+ rx,
+ ry,
+ 0.0,
+ LargeArc(false),
+ Sweep::Positive,
+ bottom_x2,
+ bottom_y,
+ );
+
+ builder.line_to(bottom_x1, bottom_y);
+
+ builder.arc(
+ bottom_x1,
+ bottom_y,
+ rx,
+ ry,
+ 0.0,
+ LargeArc(false),
+ Sweep::Positive,
+ left_x,
+ left_y2,
+ );
+
+ builder.line_to(left_x, left_y1);
+
+ builder.arc(
+ left_x,
+ left_y1,
+ rx,
+ ry,
+ 0.0,
+ LargeArc(false),
+ Sweep::Positive,
+ top_x1,
+ top_y,
+ );
+ }
+
+ builder.close_path();
+
+ ShapeDef::new(Rc::new(builder.into_path()), Markers::No)
+ }
+}
+
+/// The `<circle>` element.
+///
+/// Note that its cx/cy/r are properties in SVG2, so they are
+/// defined as part of [the properties machinery](properties.rs).
+#[derive(Default)]
+pub struct Circle {}
+
+impl ElementTrait for Circle {
+ impl_draw!();
+}
+
+impl BasicShape for Circle {
+ fn make_shape(&self, params: &NormalizeParams, values: &ComputedValues) -> ShapeDef {
+ let cx = values.cx().0.to_user(params);
+ let cy = values.cy().0.to_user(params);
+ let r = values.r().0.to_user(params);
+
+ ShapeDef::new(Rc::new(make_ellipse(cx, cy, r, r)), Markers::No)
+ }
+}
+
+/// The `<ellipse>` element.
+///
+/// Note that its cx/cy/rx/ry are properties in SVG2, so they are
+/// defined as part of [the properties machinery](properties.rs).
+#[derive(Default)]
+pub struct Ellipse {}
+
+impl ElementTrait for Ellipse {
+ impl_draw!();
+}
+
+impl BasicShape for Ellipse {
+ fn make_shape(&self, params: &NormalizeParams, values: &ComputedValues) -> ShapeDef {
+ let cx = values.cx().0.to_user(params);
+ let cy = values.cy().0.to_user(params);
+ let norm_rx = match values.rx().0 {
+ LengthOrAuto::Length(l) => Some(l.to_user(params)),
+ LengthOrAuto::Auto => None,
+ };
+ let norm_ry = match values.ry().0 {
+ LengthOrAuto::Length(l) => Some(l.to_user(params)),
+ LengthOrAuto::Auto => None,
+ };
+
+ let rx;
+ let ry;
+
+ match (norm_rx, norm_ry) {
+ (None, None) => {
+ rx = 0.0;
+ ry = 0.0;
+ }
+
+ (Some(_rx), None) => {
+ rx = _rx;
+ ry = _rx;
+ }
+
+ (None, Some(_ry)) => {
+ rx = _ry;
+ ry = _ry;
+ }
+
+ (Some(_rx), Some(_ry)) => {
+ rx = _rx;
+ ry = _ry;
+ }
+ }
+
+ ShapeDef::new(Rc::new(make_ellipse(cx, cy, rx, ry)), Markers::No)
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn parses_points() {
+ assert_eq!(
+ Points::parse_str(" 1 2 ").unwrap(),
+ Points(vec![(1.0, 2.0)])
+ );
+ assert_eq!(
+ Points::parse_str("1 2 3 4").unwrap(),
+ Points(vec![(1.0, 2.0), (3.0, 4.0)])
+ );
+ assert_eq!(
+ Points::parse_str("1,2,3,4").unwrap(),
+ Points(vec![(1.0, 2.0), (3.0, 4.0)])
+ );
+ assert_eq!(
+ Points::parse_str("1,2 3,4").unwrap(),
+ Points(vec![(1.0, 2.0), (3.0, 4.0)])
+ );
+ assert_eq!(
+ Points::parse_str("1,2 -3,4").unwrap(),
+ Points(vec![(1.0, 2.0), (-3.0, 4.0)])
+ );
+ assert_eq!(
+ Points::parse_str("1,2,-3,4").unwrap(),
+ Points(vec![(1.0, 2.0), (-3.0, 4.0)])
+ );
+ }
+
+ #[test]
+ fn errors_on_invalid_points() {
+ assert!(Points::parse_str("-1-2-3-4").is_err());
+ assert!(Points::parse_str("1 2-3,-4").is_err());
+ }
+}
diff --git a/rsvg/src/space.rs b/rsvg/src/space.rs
new file mode 100644
index 00000000..50f52807
--- /dev/null
+++ b/rsvg/src/space.rs
@@ -0,0 +1,184 @@
+//! Processing of the `xml:space` attribute.
+
+use itertools::Itertools;
+
+pub struct NormalizeDefault {
+ pub has_element_before: bool,
+ pub has_element_after: bool,
+}
+
+pub enum XmlSpaceNormalize {
+ Default(NormalizeDefault),
+ Preserve,
+}
+
+/// Implements `xml:space` handling per the SVG spec
+///
+/// Normalizes a string as it comes out of the XML parser's handler
+/// for character data according to the SVG rules in
+/// <https://www.w3.org/TR/SVG/text.html#WhiteSpace>
+pub fn xml_space_normalize(mode: XmlSpaceNormalize, s: &str) -> String {
+ match mode {
+ XmlSpaceNormalize::Default(d) => normalize_default(d, s),
+ XmlSpaceNormalize::Preserve => normalize_preserve(s),
+ }
+}
+
+// From https://www.w3.org/TR/SVG/text.html#WhiteSpace
+//
+// When xml:space="default", the SVG user agent will do the following
+// using a copy of the original character data content. First, it will
+// remove all newline characters. Then it will convert all tab
+// characters into space characters. Then, it will strip off all
+// leading and trailing space characters. Then, all contiguous space
+// characters will be consolidated.
+fn normalize_default(elements: NormalizeDefault, mut s: &str) -> String {
+ if !elements.has_element_before {
+ s = s.trim_start();
+ }
+
+ if !elements.has_element_after {
+ s = s.trim_end();
+ }
+
+ s.chars()
+ .filter(|ch| *ch != '\n')
+ .map(|ch| match ch {
+ '\t' => ' ',
+ c => c,
+ })
+ .coalesce(|current, next| match (current, next) {
+ (' ', ' ') => Ok(' '),
+ (_, _) => Err((current, next)),
+ })
+ .collect::<String>()
+}
+
+// From https://www.w3.org/TR/SVG/text.html#WhiteSpace
+//
+// When xml:space="preserve", the SVG user agent will do the following
+// using a copy of the original character data content. It will
+// convert all newline and tab characters into space characters. Then,
+// it will draw all space characters, including leading, trailing and
+// multiple contiguous space characters. Thus, when drawn with
+// xml:space="preserve", the string "a b" (three spaces between "a"
+// and "b") will produce a larger separation between "a" and "b" than
+// "a b" (one space between "a" and "b").
+fn normalize_preserve(s: &str) -> String {
+ s.chars()
+ .map(|ch| match ch {
+ '\n' | '\t' => ' ',
+
+ c => c,
+ })
+ .collect()
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn xml_space_default() {
+ assert_eq!(
+ xml_space_normalize(
+ XmlSpaceNormalize::Default(NormalizeDefault {
+ has_element_before: false,
+ has_element_after: false,
+ }),
+ "\n WS example\n indented lines\n "
+ ),
+ "WS example indented lines"
+ );
+ assert_eq!(
+ xml_space_normalize(
+ XmlSpaceNormalize::Default(NormalizeDefault {
+ has_element_before: false,
+ has_element_after: false,
+ }),
+ "\n \t \tWS \t\t\texample\n \t indented lines\t\t \n "
+ ),
+ "WS example indented lines"
+ );
+ assert_eq!(
+ xml_space_normalize(
+ XmlSpaceNormalize::Default(NormalizeDefault {
+ has_element_before: false,
+ has_element_after: false,
+ }),
+ "\n \t \tWS \t\t\texample\n \t duplicate letters\t\t \n "
+ ),
+ "WS example duplicate letters"
+ );
+ assert_eq!(
+ xml_space_normalize(
+ XmlSpaceNormalize::Default(NormalizeDefault {
+ has_element_before: false,
+ has_element_after: false,
+ }),
+ "\nWS example\nnon-indented lines\n "
+ ),
+ "WS examplenon-indented lines"
+ );
+ assert_eq!(
+ xml_space_normalize(
+ XmlSpaceNormalize::Default(NormalizeDefault {
+ has_element_before: false,
+ has_element_after: false,
+ }),
+ "\nWS example\tnon-indented lines\n "
+ ),
+ "WS example non-indented lines"
+ );
+ }
+
+ #[test]
+ fn xml_space_default_with_elements() {
+ assert_eq!(
+ xml_space_normalize(
+ XmlSpaceNormalize::Default(NormalizeDefault {
+ has_element_before: true,
+ has_element_after: false,
+ }),
+ " foo \n\t bar "
+ ),
+ " foo bar"
+ );
+
+ assert_eq!(
+ xml_space_normalize(
+ XmlSpaceNormalize::Default(NormalizeDefault {
+ has_element_before: false,
+ has_element_after: true,
+ }),
+ " foo \nbar "
+ ),
+ "foo bar "
+ );
+ }
+
+ #[test]
+ fn xml_space_preserve() {
+ assert_eq!(
+ xml_space_normalize(
+ XmlSpaceNormalize::Preserve,
+ "\n WS example\n indented lines\n "
+ ),
+ " WS example indented lines "
+ );
+ assert_eq!(
+ xml_space_normalize(
+ XmlSpaceNormalize::Preserve,
+ "\n \t \tWS \t\t\texample\n \t indented lines\t\t \n "
+ ),
+ " WS example indented lines "
+ );
+ assert_eq!(
+ xml_space_normalize(
+ XmlSpaceNormalize::Preserve,
+ "\n \t \tWS \t\t\texample\n \t duplicate letters\t\t \n "
+ ),
+ " WS example duplicate letters "
+ );
+ }
+}
diff --git a/rsvg/src/structure.rs b/rsvg/src/structure.rs
new file mode 100644
index 00000000..7e09ed1a
--- /dev/null
+++ b/rsvg/src/structure.rs
@@ -0,0 +1,632 @@
+//! Structural elements in SVG: the `g`, `switch`, `svg`, `use`, `symbol`, `clip_path`, `mask`, `link` elements.
+
+use markup5ever::{expanded_name, local_name, namespace_url, ns};
+
+use crate::aspect_ratio::*;
+use crate::bbox::BoundingBox;
+use crate::coord_units::CoordUnits;
+use crate::document::{AcquiredNodes, NodeId};
+use crate::drawing_ctx::{ClipMode, DrawingCtx, Viewport};
+use crate::element::{set_attribute, ElementData, ElementTrait};
+use crate::error::*;
+use crate::href::{is_href, set_href};
+use crate::layout::StackingContext;
+use crate::length::*;
+use crate::node::{CascadedValues, Node, NodeBorrow, NodeDraw};
+use crate::parsers::{Parse, ParseValue};
+use crate::properties::ComputedValues;
+use crate::rect::Rect;
+use crate::session::Session;
+use crate::viewbox::*;
+use crate::xml::Attributes;
+
+#[derive(Default)]
+pub struct Group();
+
+impl ElementTrait for Group {
+ fn draw(
+ &self,
+ node: &Node,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ cascaded: &CascadedValues<'_>,
+ viewport: &Viewport,
+ draw_ctx: &mut DrawingCtx,
+ clipping: bool,
+ ) -> Result<BoundingBox, RenderingError> {
+ let values = cascaded.get();
+
+ let elt = node.borrow_element();
+ let stacking_ctx = StackingContext::new(
+ draw_ctx.session(),
+ acquired_nodes,
+ &elt,
+ values.transform(),
+ values,
+ );
+
+ draw_ctx.with_discrete_layer(
+ &stacking_ctx,
+ acquired_nodes,
+ viewport,
+ clipping,
+ None,
+ &mut |an, dc| node.draw_children(an, cascaded, viewport, dc, clipping),
+ )
+ }
+}
+
+/// A no-op node that does not render anything
+///
+/// Sometimes we just need a node that can contain children, but doesn't
+/// render itself or its children. This is just that kind of node.
+#[derive(Default)]
+pub struct NonRendering;
+
+impl ElementTrait for NonRendering {}
+
+/// The `<switch>` element.
+#[derive(Default)]
+pub struct Switch();
+
+impl ElementTrait for Switch {
+ fn draw(
+ &self,
+ node: &Node,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ cascaded: &CascadedValues<'_>,
+ viewport: &Viewport,
+ draw_ctx: &mut DrawingCtx,
+ clipping: bool,
+ ) -> Result<BoundingBox, RenderingError> {
+ let values = cascaded.get();
+
+ let elt = node.borrow_element();
+ let stacking_ctx = StackingContext::new(
+ draw_ctx.session(),
+ acquired_nodes,
+ &elt,
+ values.transform(),
+ values,
+ );
+
+ draw_ctx.with_discrete_layer(
+ &stacking_ctx,
+ acquired_nodes,
+ viewport,
+ clipping,
+ None,
+ &mut |an, dc| {
+ if let Some(child) = node.children().filter(|c| c.is_element()).find(|c| {
+ let elt = c.borrow_element();
+ elt.get_cond(dc.user_language())
+ }) {
+ child.draw(
+ an,
+ &CascadedValues::clone_with_node(cascaded, &child),
+ viewport,
+ dc,
+ clipping,
+ )
+ } else {
+ Ok(dc.empty_bbox())
+ }
+ },
+ )
+ }
+}
+
+/// Intrinsic dimensions of an SVG document fragment: its `width/height` properties and `viewBox` attribute.
+///
+/// Note that in SVG2, `width` and `height` are properties, not
+/// attributes. If either is omitted, it defaults to `auto`. which
+/// computes to `100%`.
+///
+/// The `viewBox` attribute can also be omitted, hence an `Option`.
+#[derive(Debug, Copy, Clone, PartialEq)]
+pub struct IntrinsicDimensions {
+ /// Computed value of the `width` property.
+ pub width: ULength<Horizontal>,
+
+ /// Computed value of the `height` property.
+ pub height: ULength<Vertical>,
+
+ /// Contents of the `viewBox` attribute.
+ pub vbox: Option<ViewBox>,
+}
+
+/// The `<svg>` element.
+///
+/// Note that its x/y/width/height are properties in SVG2, so they are
+/// defined as part of [the properties machinery](properties.rs).
+#[derive(Default)]
+pub struct Svg {
+ preserve_aspect_ratio: AspectRatio,
+ vbox: Option<ViewBox>,
+}
+
+impl Svg {
+ pub fn get_intrinsic_dimensions(&self, values: &ComputedValues) -> IntrinsicDimensions {
+ let w = match values.width().0 {
+ LengthOrAuto::Auto => ULength::<Horizontal>::parse_str("100%").unwrap(),
+ LengthOrAuto::Length(l) => l,
+ };
+
+ let h = match values.height().0 {
+ LengthOrAuto::Auto => ULength::<Vertical>::parse_str("100%").unwrap(),
+ LengthOrAuto::Length(l) => l,
+ };
+
+ IntrinsicDimensions {
+ width: w,
+ height: h,
+ vbox: self.vbox,
+ }
+ }
+
+ fn get_unnormalized_offset(
+ &self,
+ values: &ComputedValues,
+ ) -> (Length<Horizontal>, Length<Vertical>) {
+ // these defaults are per the spec
+ let x = values.x().0;
+ let y = values.y().0;
+
+ (x, y)
+ }
+
+ fn get_unnormalized_size(
+ &self,
+ values: &ComputedValues,
+ ) -> (ULength<Horizontal>, ULength<Vertical>) {
+ // these defaults are per the spec
+ let w = match values.width().0 {
+ LengthOrAuto::Auto => ULength::<Horizontal>::parse_str("100%").unwrap(),
+ LengthOrAuto::Length(l) => l,
+ };
+ let h = match values.height().0 {
+ LengthOrAuto::Auto => ULength::<Vertical>::parse_str("100%").unwrap(),
+ LengthOrAuto::Length(l) => l,
+ };
+ (w, h)
+ }
+
+ fn get_viewport(
+ &self,
+ params: &NormalizeParams,
+ values: &ComputedValues,
+ outermost: bool,
+ ) -> Rect {
+ // x & y attributes have no effect on outermost svg
+ // http://www.w3.org/TR/SVG/struct.html#SVGElement
+ let (nx, ny) = if outermost {
+ (0.0, 0.0)
+ } else {
+ let (x, y) = self.get_unnormalized_offset(values);
+ (x.to_user(params), y.to_user(params))
+ };
+
+ let (w, h) = self.get_unnormalized_size(values);
+ let (nw, nh) = (w.to_user(params), h.to_user(params));
+
+ Rect::new(nx, ny, nx + nw, ny + nh)
+ }
+
+ pub fn get_viewbox(&self) -> Option<ViewBox> {
+ self.vbox
+ }
+
+ pub fn get_preserve_aspect_ratio(&self) -> AspectRatio {
+ self.preserve_aspect_ratio
+ }
+
+ fn make_svg_viewport(
+ &self,
+ node: &Node,
+ cascaded: &CascadedValues<'_>,
+ current_viewport: &Viewport,
+ draw_ctx: &mut DrawingCtx,
+ ) -> Option<Viewport> {
+ let values = cascaded.get();
+
+ let params = NormalizeParams::new(values, current_viewport);
+
+ let has_parent = node.parent().is_some();
+
+ // FIXME: do we need to look at preserveAspectRatio.slice, like in DrawingCtx::draw_image()?
+ let clip_mode = if !values.is_overflow() && has_parent {
+ ClipMode::ClipToViewport
+ } else {
+ ClipMode::NoClip
+ };
+
+ let svg_viewport = self.get_viewport(&params, values, !has_parent);
+
+ let is_measuring_toplevel_svg = !has_parent && draw_ctx.is_measuring();
+
+ let (viewport, vbox) = if is_measuring_toplevel_svg {
+ // We are obtaining the toplevel SVG's geometry. This means, don't care about the
+ // DrawingCtx's viewport, just use the SVG's intrinsic dimensions and see how far
+ // it wants to extend.
+ (svg_viewport, self.vbox)
+ } else {
+ (
+ // The client's viewport overrides the toplevel's x/y/w/h viewport
+ if has_parent {
+ svg_viewport
+ } else {
+ draw_ctx.toplevel_viewport()
+ },
+ // Use our viewBox if available, or try to derive one from
+ // the intrinsic dimensions.
+ self.vbox.or_else(|| {
+ Some(ViewBox::from(Rect::from_size(
+ svg_viewport.width(),
+ svg_viewport.height(),
+ )))
+ }),
+ )
+ };
+
+ draw_ctx.push_new_viewport(
+ current_viewport,
+ vbox,
+ viewport,
+ self.preserve_aspect_ratio,
+ clip_mode,
+ )
+ }
+}
+
+impl ElementTrait for Svg {
+ fn set_attributes(&mut self, attrs: &Attributes, session: &Session) {
+ for (attr, value) in attrs.iter() {
+ match attr.expanded() {
+ expanded_name!("", "preserveAspectRatio") => {
+ set_attribute(&mut self.preserve_aspect_ratio, attr.parse(value), session)
+ }
+ expanded_name!("", "viewBox") => {
+ set_attribute(&mut self.vbox, attr.parse(value), session)
+ }
+ _ => (),
+ }
+ }
+ }
+
+ fn draw(
+ &self,
+ node: &Node,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ cascaded: &CascadedValues<'_>,
+ viewport: &Viewport,
+ draw_ctx: &mut DrawingCtx,
+ clipping: bool,
+ ) -> Result<BoundingBox, RenderingError> {
+ let values = cascaded.get();
+
+ let elt = node.borrow_element();
+ let stacking_ctx = StackingContext::new(
+ draw_ctx.session(),
+ acquired_nodes,
+ &elt,
+ values.transform(),
+ values,
+ );
+
+ draw_ctx.with_discrete_layer(
+ &stacking_ctx,
+ acquired_nodes,
+ viewport, // FIXME: should this be the svg_viewport from below?
+ clipping,
+ None,
+ &mut |an, dc| {
+ if let Some(svg_viewport) = self.make_svg_viewport(node, cascaded, viewport, dc) {
+ node.draw_children(an, cascaded, &svg_viewport, dc, clipping)
+ } else {
+ Ok(dc.empty_bbox())
+ }
+ },
+ )
+ }
+}
+
+/// The `<use>` element.
+pub struct Use {
+ link: Option<NodeId>,
+ x: Length<Horizontal>,
+ y: Length<Vertical>,
+ width: ULength<Horizontal>,
+ height: ULength<Vertical>,
+}
+
+impl Use {
+ fn get_rect(&self, params: &NormalizeParams) -> Rect {
+ let x = self.x.to_user(params);
+ let y = self.y.to_user(params);
+ let w = self.width.to_user(params);
+ let h = self.height.to_user(params);
+
+ Rect::new(x, y, x + w, y + h)
+ }
+}
+
+impl Default for Use {
+ fn default() -> Use {
+ Use {
+ link: None,
+ x: Default::default(),
+ y: Default::default(),
+ width: ULength::<Horizontal>::parse_str("100%").unwrap(),
+ height: ULength::<Vertical>::parse_str("100%").unwrap(),
+ }
+ }
+}
+
+impl ElementTrait for Use {
+ fn set_attributes(&mut self, attrs: &Attributes, session: &Session) {
+ for (attr, value) in attrs.iter() {
+ match attr.expanded() {
+ ref a if is_href(a) => {
+ let mut href = None;
+ set_attribute(
+ &mut href,
+ NodeId::parse(value).map(Some).attribute(attr.clone()),
+ session,
+ );
+ set_href(a, &mut self.link, href);
+ }
+ expanded_name!("", "x") => set_attribute(&mut self.x, attr.parse(value), session),
+ expanded_name!("", "y") => set_attribute(&mut self.y, attr.parse(value), session),
+ expanded_name!("", "width") => {
+ set_attribute(&mut self.width, attr.parse(value), session)
+ }
+ expanded_name!("", "height") => {
+ set_attribute(&mut self.height, attr.parse(value), session)
+ }
+ _ => (),
+ }
+ }
+ }
+
+ fn draw(
+ &self,
+ node: &Node,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ cascaded: &CascadedValues<'_>,
+ viewport: &Viewport,
+ draw_ctx: &mut DrawingCtx,
+ clipping: bool,
+ ) -> Result<BoundingBox, RenderingError> {
+ if let Some(link) = self.link.as_ref() {
+ let values = cascaded.get();
+ let params = NormalizeParams::new(values, viewport);
+ let rect = self.get_rect(&params);
+
+ let stroke_paint = values.stroke().0.resolve(
+ acquired_nodes,
+ values.stroke_opacity().0,
+ values.color().0,
+ cascaded.context_fill.clone(),
+ cascaded.context_stroke.clone(),
+ draw_ctx.session(),
+ );
+
+ let fill_paint = values.fill().0.resolve(
+ acquired_nodes,
+ values.fill_opacity().0,
+ values.color().0,
+ cascaded.context_fill.clone(),
+ cascaded.context_stroke.clone(),
+ draw_ctx.session(),
+ );
+
+ draw_ctx.draw_from_use_node(
+ node,
+ acquired_nodes,
+ values,
+ rect,
+ link,
+ clipping,
+ viewport,
+ fill_paint,
+ stroke_paint,
+ )
+ } else {
+ Ok(draw_ctx.empty_bbox())
+ }
+ }
+}
+
+/// The `<symbol>` element.
+#[derive(Default)]
+pub struct Symbol {
+ preserve_aspect_ratio: AspectRatio,
+ vbox: Option<ViewBox>,
+}
+
+impl Symbol {
+ pub fn get_viewbox(&self) -> Option<ViewBox> {
+ self.vbox
+ }
+
+ pub fn get_preserve_aspect_ratio(&self) -> AspectRatio {
+ self.preserve_aspect_ratio
+ }
+}
+
+impl ElementTrait for Symbol {
+ fn set_attributes(&mut self, attrs: &Attributes, session: &Session) {
+ for (attr, value) in attrs.iter() {
+ match attr.expanded() {
+ expanded_name!("", "preserveAspectRatio") => {
+ set_attribute(&mut self.preserve_aspect_ratio, attr.parse(value), session)
+ }
+ expanded_name!("", "viewBox") => {
+ set_attribute(&mut self.vbox, attr.parse(value), session)
+ }
+ _ => (),
+ }
+ }
+ }
+}
+
+coord_units!(ClipPathUnits, CoordUnits::UserSpaceOnUse);
+
+/// The `<clipPath>` element.
+#[derive(Default)]
+pub struct ClipPath {
+ units: ClipPathUnits,
+}
+
+impl ClipPath {
+ pub fn get_units(&self) -> CoordUnits {
+ CoordUnits::from(self.units)
+ }
+}
+
+impl ElementTrait for ClipPath {
+ fn set_attributes(&mut self, attrs: &Attributes, session: &Session) {
+ for (attr, value) in attrs.iter() {
+ if attr.expanded() == expanded_name!("", "clipPathUnits") {
+ set_attribute(&mut self.units, attr.parse(value), session);
+ }
+ }
+ }
+}
+
+coord_units!(MaskUnits, CoordUnits::ObjectBoundingBox);
+coord_units!(MaskContentUnits, CoordUnits::UserSpaceOnUse);
+
+/// The `<mask>` element.
+pub struct Mask {
+ x: Length<Horizontal>,
+ y: Length<Vertical>,
+ width: ULength<Horizontal>,
+ height: ULength<Vertical>,
+
+ units: MaskUnits,
+ content_units: MaskContentUnits,
+}
+
+impl Default for Mask {
+ fn default() -> Mask {
+ Mask {
+ // these values are per the spec
+ x: Length::<Horizontal>::parse_str("-10%").unwrap(),
+ y: Length::<Vertical>::parse_str("-10%").unwrap(),
+ width: ULength::<Horizontal>::parse_str("120%").unwrap(),
+ height: ULength::<Vertical>::parse_str("120%").unwrap(),
+
+ units: MaskUnits::default(),
+ content_units: MaskContentUnits::default(),
+ }
+ }
+}
+
+impl Mask {
+ pub fn get_units(&self) -> CoordUnits {
+ CoordUnits::from(self.units)
+ }
+
+ pub fn get_content_units(&self) -> CoordUnits {
+ CoordUnits::from(self.content_units)
+ }
+
+ pub fn get_rect(&self, params: &NormalizeParams) -> Rect {
+ let x = self.x.to_user(params);
+ let y = self.y.to_user(params);
+ let w = self.width.to_user(params);
+ let h = self.height.to_user(params);
+
+ Rect::new(x, y, x + w, y + h)
+ }
+}
+
+impl ElementTrait for Mask {
+ fn set_attributes(&mut self, attrs: &Attributes, session: &Session) {
+ for (attr, value) in attrs.iter() {
+ match attr.expanded() {
+ expanded_name!("", "x") => set_attribute(&mut self.x, attr.parse(value), session),
+ expanded_name!("", "y") => set_attribute(&mut self.y, attr.parse(value), session),
+ expanded_name!("", "width") => {
+ set_attribute(&mut self.width, attr.parse(value), session)
+ }
+ expanded_name!("", "height") => {
+ set_attribute(&mut self.height, attr.parse(value), session)
+ }
+ expanded_name!("", "maskUnits") => {
+ set_attribute(&mut self.units, attr.parse(value), session)
+ }
+ expanded_name!("", "maskContentUnits") => {
+ set_attribute(&mut self.content_units, attr.parse(value), session)
+ }
+ _ => (),
+ }
+ }
+ }
+}
+
+/// The `<a>` element.
+#[derive(Default)]
+pub struct Link {
+ pub link: Option<String>,
+}
+
+impl ElementTrait for Link {
+ fn set_attributes(&mut self, attrs: &Attributes, _session: &Session) {
+ for (attr, value) in attrs.iter() {
+ let expanded = attr.expanded();
+ if is_href(&expanded) {
+ set_href(&expanded, &mut self.link, Some(value.to_owned()));
+ }
+ }
+ }
+
+ fn draw(
+ &self,
+ node: &Node,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ cascaded: &CascadedValues<'_>,
+ viewport: &Viewport,
+ draw_ctx: &mut DrawingCtx,
+ clipping: bool,
+ ) -> Result<BoundingBox, RenderingError> {
+ // If this element is inside of <text>, do not draw it.
+ // The <text> takes care of it.
+ for an in node.ancestors() {
+ if matches!(&*an.borrow_element_data(), ElementData::Text(_)) {
+ return Ok(draw_ctx.empty_bbox());
+ }
+ }
+
+ let cascaded = CascadedValues::clone_with_node(cascaded, node);
+ let values = cascaded.get();
+
+ let elt = node.borrow_element();
+
+ let link_is_empty = self.link.as_ref().map(|l| l.is_empty()).unwrap_or(true);
+
+ let link_target = if link_is_empty {
+ None
+ } else {
+ self.link.clone()
+ };
+
+ let stacking_ctx = StackingContext::new_with_link(
+ draw_ctx.session(),
+ acquired_nodes,
+ &elt,
+ values.transform(),
+ values,
+ link_target,
+ );
+
+ draw_ctx.with_discrete_layer(
+ &stacking_ctx,
+ acquired_nodes,
+ viewport,
+ clipping,
+ None,
+ &mut |an, dc| node.draw_children(an, &cascaded, viewport, dc, clipping),
+ )
+ }
+}
diff --git a/rsvg/src/style.rs b/rsvg/src/style.rs
new file mode 100644
index 00000000..29e65d78
--- /dev/null
+++ b/rsvg/src/style.rs
@@ -0,0 +1,84 @@
+//! The `style` element.
+
+use markup5ever::{expanded_name, local_name, namespace_url, ns};
+
+use crate::element::{set_attribute, ElementTrait};
+use crate::error::*;
+use crate::session::Session;
+use crate::xml::Attributes;
+
+/// Represents the syntax used in the <style> node.
+///
+/// Currently only "text/css" is supported.
+///
+/// <https://www.w3.org/TR/SVG11/styling.html#StyleElementTypeAttribute>
+/// <https://www.w3.org/TR/SVG11/styling.html#ContentStyleTypeAttribute>
+#[derive(Copy, Clone, PartialEq, Debug)]
+pub enum StyleType {
+ TextCss,
+}
+
+enum_default!(StyleType, StyleType::TextCss);
+
+impl StyleType {
+ fn parse(value: &str) -> Result<StyleType, ValueErrorKind> {
+ // https://html.spec.whatwg.org/multipage/semantics.html#the-style-element
+ //
+ // 4. If element's type attribute is present and its value is
+ // neither the empty string nor an ASCII case-insensitive
+ // match for "text/css", then return.
+
+ if value.eq_ignore_ascii_case("text/css") {
+ Ok(StyleType::TextCss)
+ } else {
+ Err(ValueErrorKind::parse_error(
+ "invalid value for type attribute in style element",
+ ))
+ }
+ }
+}
+
+/// Represents a <style> node.
+///
+/// It does not render itself, and just holds CSS stylesheet information for the rest of
+/// the code to use.
+#[derive(Default)]
+pub struct Style {
+ type_: StyleType,
+}
+
+impl Style {
+ pub fn style_type(&self) -> StyleType {
+ self.type_
+ }
+}
+
+impl ElementTrait for Style {
+ fn set_attributes(&mut self, attrs: &Attributes, session: &Session) {
+ for (attr, value) in attrs.iter() {
+ if attr.expanded() == expanded_name!("", "type") {
+ set_attribute(
+ &mut self.type_,
+ StyleType::parse(value).attribute(attr),
+ session,
+ );
+ }
+ }
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn parses_style_type() {
+ assert_eq!(StyleType::parse("text/css").unwrap(), StyleType::TextCss);
+ }
+
+ #[test]
+ fn invalid_style_type_yields_error() {
+ assert!(StyleType::parse("").is_err());
+ assert!(StyleType::parse("some-other-stylesheet-language").is_err());
+ }
+}
diff --git a/rsvg/src/surface_utils/iterators.rs b/rsvg/src/surface_utils/iterators.rs
new file mode 100644
index 00000000..5227c62c
--- /dev/null
+++ b/rsvg/src/surface_utils/iterators.rs
@@ -0,0 +1,247 @@
+//! Pixel iterators for `SharedImageSurface`.
+use crate::rect::IRect;
+use crate::util::clamp;
+
+use super::shared_surface::SharedImageSurface;
+use super::{EdgeMode, Pixel};
+
+/// Iterator over pixels of a `SharedImageSurface`.
+#[derive(Debug, Clone, Copy)]
+pub struct Pixels<'a> {
+ surface: &'a SharedImageSurface,
+ bounds: IRect,
+ x: u32,
+ y: u32,
+ offset: isize,
+}
+
+/// Iterator over a (potentially out of bounds) rectangle of pixels of a `SharedImageSurface`.
+#[derive(Debug, Clone, Copy)]
+pub struct PixelRectangle<'a> {
+ surface: &'a SharedImageSurface,
+ bounds: IRect,
+ rectangle: IRect,
+ edge_mode: EdgeMode,
+ x: i32,
+ y: i32,
+}
+
+impl<'a> Pixels<'a> {
+ /// Creates an iterator over the image surface pixels
+ #[inline]
+ pub fn new(surface: &'a SharedImageSurface) -> Self {
+ let bounds = IRect::from_size(surface.width(), surface.height());
+
+ Self::within(surface, bounds)
+ }
+
+ /// Creates an iterator over the image surface pixels, constrained within the given bounds.
+ #[inline]
+ pub fn within(surface: &'a SharedImageSurface, bounds: IRect) -> Self {
+ // Sanity checks.
+ assert!(bounds.x0 >= 0);
+ assert!(bounds.x0 <= surface.width());
+ assert!(bounds.x1 >= bounds.x0);
+ assert!(bounds.x1 <= surface.width());
+ assert!(bounds.y0 >= 0);
+ assert!(bounds.y0 <= surface.height());
+ assert!(bounds.y1 >= bounds.y0);
+ assert!(bounds.y1 <= surface.height());
+
+ Self {
+ surface,
+ bounds,
+ x: bounds.x0 as u32,
+ y: bounds.y0 as u32,
+ offset: bounds.y0 as isize * surface.stride() + bounds.x0 as isize * 4,
+ }
+ }
+}
+
+impl<'a> PixelRectangle<'a> {
+ /// Creates an iterator over the image surface pixels
+ #[inline]
+ pub fn new(surface: &'a SharedImageSurface, rectangle: IRect, edge_mode: EdgeMode) -> Self {
+ let bounds = IRect::from_size(surface.width(), surface.height());
+
+ Self::within(surface, bounds, rectangle, edge_mode)
+ }
+
+ /// Creates an iterator over the image surface pixels, constrained within the given bounds.
+ #[inline]
+ pub fn within(
+ surface: &'a SharedImageSurface,
+ bounds: IRect,
+ rectangle: IRect,
+ edge_mode: EdgeMode,
+ ) -> Self {
+ // Sanity checks.
+ assert!(bounds.x0 >= 0);
+ assert!(bounds.x0 <= surface.width());
+ assert!(bounds.x1 >= bounds.x0);
+ assert!(bounds.x1 <= surface.width());
+ assert!(bounds.y0 >= 0);
+ assert!(bounds.y0 <= surface.height());
+ assert!(bounds.y1 >= bounds.y0);
+ assert!(bounds.y1 <= surface.height());
+
+ // Non-None EdgeMode values need at least one pixel available.
+ if edge_mode != EdgeMode::None {
+ assert!(bounds.x1 > bounds.x0);
+ assert!(bounds.y1 > bounds.y0);
+ }
+
+ assert!(rectangle.x1 >= rectangle.x0);
+ assert!(rectangle.y1 >= rectangle.y0);
+
+ Self {
+ surface,
+ bounds,
+ rectangle,
+ edge_mode,
+ x: rectangle.x0,
+ y: rectangle.y0,
+ }
+ }
+}
+
+impl<'a> Iterator for Pixels<'a> {
+ type Item = (u32, u32, Pixel);
+
+ #[inline]
+ fn next(&mut self) -> Option<Self::Item> {
+ // This means we hit the end on the last iteration.
+ if self.x == self.bounds.x1 as u32 || self.y == self.bounds.y1 as u32 {
+ return None;
+ }
+
+ let rv = Some((
+ self.x,
+ self.y,
+ self.surface.get_pixel_by_offset(self.offset),
+ ));
+
+ if self.x + 1 == self.bounds.x1 as u32 {
+ self.x = self.bounds.x0 as u32;
+ self.y += 1;
+ self.offset += self.surface.stride() - (self.bounds.width() - 1) as isize * 4;
+ } else {
+ self.x += 1;
+ self.offset += 4;
+ }
+
+ rv
+ }
+}
+
+impl<'a> Iterator for PixelRectangle<'a> {
+ type Item = (i32, i32, Pixel);
+
+ #[inline(always)]
+ fn next(&mut self) -> Option<Self::Item> {
+ // This means we hit the end on the last iteration.
+ if self.x == self.rectangle.x1 || self.y == self.rectangle.y1 {
+ return None;
+ }
+
+ let rv = {
+ let get_pixel = |x, y| {
+ if !self.bounds.contains(x, y) {
+ match self.edge_mode {
+ EdgeMode::None => Pixel {
+ r: 0,
+ g: 0,
+ b: 0,
+ a: 0,
+ },
+ EdgeMode::Duplicate => {
+ let x = clamp(x, self.bounds.x0, self.bounds.x1 - 1);
+ let y = clamp(y, self.bounds.y0, self.bounds.y1 - 1);
+ self.surface.get_pixel(x as u32, y as u32)
+ }
+ EdgeMode::Wrap => {
+ let wrap = |mut x, v| {
+ while x < 0 {
+ x += v;
+ }
+ x % v
+ };
+
+ let x = self.bounds.x0 + wrap(x - self.bounds.x0, self.bounds.width());
+ let y = self.bounds.y0 + wrap(y - self.bounds.y0, self.bounds.height());
+ self.surface.get_pixel(x as u32, y as u32)
+ }
+ }
+ } else {
+ self.surface.get_pixel(x as u32, y as u32)
+ }
+ };
+
+ Some((self.x, self.y, get_pixel(self.x, self.y)))
+ };
+
+ if self.x + 1 == self.rectangle.x1 {
+ self.x = self.rectangle.x0;
+ self.y += 1;
+ } else {
+ self.x += 1;
+ }
+
+ rv
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+ use crate::surface_utils::shared_surface::SurfaceType;
+
+ #[test]
+ fn pixels_count() {
+ const WIDTH: i32 = 32;
+ const HEIGHT: i32 = 64;
+
+ let surface = SharedImageSurface::empty(WIDTH, HEIGHT, SurfaceType::SRgb).unwrap();
+
+ // Full image.
+ assert_eq!(Pixels::new(&surface).count(), (WIDTH * HEIGHT) as usize);
+
+ // 1-wide column.
+ let bounds = IRect::from_size(1, HEIGHT);
+ assert_eq!(Pixels::within(&surface, bounds).count(), HEIGHT as usize);
+
+ // 1-tall row.
+ let bounds = IRect::from_size(WIDTH, 1);
+ assert_eq!(Pixels::within(&surface, bounds).count(), WIDTH as usize);
+
+ // 1×1.
+ let bounds = IRect::from_size(1, 1);
+ assert_eq!(Pixels::within(&surface, bounds).count(), 1);
+
+ // Nothing (x0 == x1).
+ let bounds = IRect::from_size(0, HEIGHT);
+ assert_eq!(Pixels::within(&surface, bounds).count(), 0);
+
+ // Nothing (y0 == y1).
+ let bounds = IRect::from_size(WIDTH, 0);
+ assert_eq!(Pixels::within(&surface, bounds).count(), 0);
+
+ // Nothing (x0 == x1, y0 == y1).
+ let bounds = IRect::new(0, 0, 0, 0);
+ assert_eq!(Pixels::within(&surface, bounds).count(), 0);
+ }
+
+ #[test]
+ fn pixel_rectangle() {
+ const WIDTH: i32 = 32;
+ const HEIGHT: i32 = 64;
+
+ let surface = SharedImageSurface::empty(WIDTH, HEIGHT, SurfaceType::SRgb).unwrap();
+
+ let rect_bounds = IRect::new(-8, -8, 8, 8);
+ assert_eq!(
+ PixelRectangle::new(&surface, rect_bounds, EdgeMode::None).count(),
+ (16 * 16) as usize
+ );
+ }
+}
diff --git a/rsvg/src/surface_utils/mod.rs b/rsvg/src/surface_utils/mod.rs
new file mode 100644
index 00000000..8529bf68
--- /dev/null
+++ b/rsvg/src/surface_utils/mod.rs
@@ -0,0 +1,338 @@
+//! Various utilities for working with Cairo image surfaces.
+
+use std::alloc;
+use std::slice;
+
+pub mod iterators;
+pub mod shared_surface;
+pub mod srgb;
+
+// These two are for Cairo's platform-endian 0xaarrggbb pixels
+
+#[cfg(target_endian = "little")]
+use rgb::alt::BGRA8;
+#[cfg(target_endian = "little")]
+#[allow(clippy::upper_case_acronyms)]
+pub type CairoARGB = BGRA8;
+
+#[cfg(target_endian = "big")]
+use rgb::alt::ARGB8;
+#[cfg(target_endian = "big")]
+#[allow(clippy::upper_case_acronyms)]
+pub type CairoARGB = ARGB8;
+
+/// GdkPixbuf's endian-independent RGBA8 pixel layout.
+pub type GdkPixbufRGBA = rgb::RGBA8;
+
+/// GdkPixbuf's packed RGB pixel layout.
+pub type GdkPixbufRGB = rgb::RGB8;
+
+/// Analogous to `rgb::FromSlice`, to convert from `[T]` to `[CairoARGB]`
+#[allow(clippy::upper_case_acronyms)]
+pub trait AsCairoARGB {
+ /// Reinterpret slice as `CairoARGB` pixels.
+ fn as_cairo_argb(&self) -> &[CairoARGB];
+
+ /// Reinterpret mutable slice as `CairoARGB` pixels.
+ fn as_cairo_argb_mut(&mut self) -> &mut [CairoARGB];
+}
+
+// SAFETY: transmuting from u32 to CairoRGB is based on the following assumptions:
+// * there are no invalid bit representations for ARGB
+// * u32 and ARGB are the same size
+// * u32 is sufficiently aligned
+impl AsCairoARGB for [u32] {
+ fn as_cairo_argb(&self) -> &[CairoARGB] {
+ const LAYOUT_U32: alloc::Layout = alloc::Layout::new::<u32>();
+ const LAYOUT_ARGB: alloc::Layout = alloc::Layout::new::<CairoARGB>();
+ let _: [(); LAYOUT_U32.size()] = [(); LAYOUT_ARGB.size()];
+ let _: [(); 0] = [(); LAYOUT_U32.align() % LAYOUT_ARGB.align()];
+ unsafe { slice::from_raw_parts(self.as_ptr() as *const _, self.len()) }
+ }
+
+ fn as_cairo_argb_mut(&mut self) -> &mut [CairoARGB] {
+ unsafe { slice::from_raw_parts_mut(self.as_mut_ptr() as *mut _, self.len()) }
+ }
+}
+
+/// Modes which specify how the values of out of bounds pixels are computed.
+#[derive(Debug, Clone, Copy, Eq, PartialEq)]
+pub enum EdgeMode {
+ /// The nearest inbounds pixel value is returned.
+ Duplicate,
+ /// The image is extended by taking the color values from the opposite of the image.
+ ///
+ /// Imagine the image being tiled infinitely, with the original image at the origin.
+ Wrap,
+ /// Zero RGBA values are returned.
+ None,
+}
+
+/// Trait to convert pixels in various formats to RGBA, for GdkPixbuf.
+///
+/// GdkPixbuf unconditionally uses RGBA ordering regardless of endianness,
+/// but we need to convert to it from Cairo's endian-dependent 0xaarrggbb.
+pub trait ToGdkPixbufRGBA {
+ fn to_pixbuf_rgba(&self) -> GdkPixbufRGBA;
+}
+
+/// Trait to convert pixels in various formats to our own Pixel layout.
+pub trait ToPixel {
+ fn to_pixel(&self) -> Pixel;
+}
+
+/// Trait to convert pixels in various formats to Cairo's endian-dependent 0xaarrggbb.
+pub trait ToCairoARGB {
+ fn to_cairo_argb(&self) -> CairoARGB;
+}
+
+impl ToGdkPixbufRGBA for Pixel {
+ #[inline]
+ fn to_pixbuf_rgba(&self) -> GdkPixbufRGBA {
+ GdkPixbufRGBA {
+ r: self.r,
+ g: self.g,
+ b: self.b,
+ a: self.a,
+ }
+ }
+}
+
+impl ToPixel for CairoARGB {
+ #[inline]
+ fn to_pixel(&self) -> Pixel {
+ Pixel {
+ r: self.r,
+ g: self.g,
+ b: self.b,
+ a: self.a,
+ }
+ }
+}
+
+impl ToPixel for GdkPixbufRGBA {
+ #[inline]
+ fn to_pixel(&self) -> Pixel {
+ Pixel {
+ r: self.r,
+ g: self.g,
+ b: self.b,
+ a: self.a,
+ }
+ }
+}
+
+impl ToPixel for GdkPixbufRGB {
+ #[inline]
+ fn to_pixel(&self) -> Pixel {
+ Pixel {
+ r: self.r,
+ g: self.g,
+ b: self.b,
+ a: 255,
+ }
+ }
+}
+
+impl ToCairoARGB for Pixel {
+ #[inline]
+ fn to_cairo_argb(&self) -> CairoARGB {
+ CairoARGB {
+ r: self.r,
+ g: self.g,
+ b: self.b,
+ a: self.a,
+ }
+ }
+}
+
+/// Extension methods for `cairo::ImageSurfaceData`.
+pub trait ImageSurfaceDataExt {
+ /// Sets the pixel at the given coordinates. Assumes the `ARgb32` format.
+ fn set_pixel(&mut self, stride: usize, pixel: Pixel, x: u32, y: u32);
+}
+
+/// A pixel consisting of R, G, B and A values.
+pub type Pixel = rgb::RGBA8;
+
+pub trait PixelOps {
+ fn premultiply(self) -> Self;
+ fn unpremultiply(self) -> Self;
+ fn diff(&self, other: &Self) -> Self;
+ fn to_luminance_mask(&self) -> Self;
+ fn to_u32(&self) -> u32;
+ fn from_u32(x: u32) -> Self;
+}
+
+impl PixelOps for Pixel {
+ /// Returns an unpremultiplied value of this pixel.
+ ///
+ /// For a fully transparent pixel, a transparent black pixel will be returned.
+ #[inline]
+ fn unpremultiply(self) -> Self {
+ if self.a == 0 {
+ Self {
+ r: 0,
+ g: 0,
+ b: 0,
+ a: 0,
+ }
+ } else {
+ let alpha = f32::from(self.a) / 255.0;
+ self.map_rgb(|x| ((f32::from(x) / alpha) + 0.5) as u8)
+ }
+ }
+
+ /// Returns a premultiplied value of this pixel.
+ #[inline]
+ fn premultiply(self) -> Self {
+ let a = self.a as u32;
+ self.map_rgb(|x| (((x as u32) * a + 127) / 255) as u8)
+ }
+
+ #[inline]
+ fn diff(&self, other: &Pixel) -> Pixel {
+ self.iter()
+ .zip(other.iter())
+ .map(|(l, r)| (l as i32 - r as i32).unsigned_abs() as u8)
+ .collect()
+ }
+
+ /// Returns a 'mask' pixel with only the alpha channel
+ ///
+ /// Assuming, the pixel is linear RGB (not sRGB)
+ /// y = luminance
+ /// Y = 0.2126 R + 0.7152 G + 0.0722 B
+ /// 1.0 opacity = 255
+ ///
+ /// When Y = 1.0, pixel for mask should be 0xFFFFFFFF
+ /// (you get 1.0 luminance from 255 from R, G and B)
+ ///
+ /// r_mult = 0xFFFFFFFF / (255.0 * 255.0) * .2126 = 14042.45 ~= 14042
+ /// g_mult = 0xFFFFFFFF / (255.0 * 255.0) * .7152 = 47239.69 ~= 47240
+ /// b_mult = 0xFFFFFFFF / (255.0 * 255.0) * .0722 = 4768.88 ~= 4769
+ ///
+ /// This allows for the following expected behaviour:
+ /// (we only care about the most significant byte)
+ /// if pixel = 0x00FFFFFF, pixel' = 0xFF......
+ /// if pixel = 0x00020202, pixel' = 0x02......
+
+ /// if pixel = 0x00000000, pixel' = 0x00......
+ #[inline]
+ fn to_luminance_mask(&self) -> Self {
+ let r = u32::from(self.r);
+ let g = u32::from(self.g);
+ let b = u32::from(self.b);
+
+ Self {
+ r: 0,
+ g: 0,
+ b: 0,
+ a: (((r * 14042 + g * 47240 + b * 4769) * 255) >> 24) as u8,
+ }
+ }
+
+ /// Returns the pixel value as a `u32`, in the same format as `cairo::Format::ARgb32`.
+ #[inline]
+ fn to_u32(&self) -> u32 {
+ (u32::from(self.a) << 24)
+ | (u32::from(self.r) << 16)
+ | (u32::from(self.g) << 8)
+ | u32::from(self.b)
+ }
+
+ /// Converts a `u32` in the same format as `cairo::Format::ARgb32` into a `Pixel`.
+ #[inline]
+ fn from_u32(x: u32) -> Self {
+ Self {
+ r: ((x >> 16) & 0xFF) as u8,
+ g: ((x >> 8) & 0xFF) as u8,
+ b: (x & 0xFF) as u8,
+ a: ((x >> 24) & 0xFF) as u8,
+ }
+ }
+}
+
+impl<'a> ImageSurfaceDataExt for cairo::ImageSurfaceData<'a> {
+ #[inline]
+ fn set_pixel(&mut self, stride: usize, pixel: Pixel, x: u32, y: u32) {
+ let this: &mut [u8] = &mut *self;
+ // SAFETY: this code assumes that cairo image surface data is correctly
+ // aligned for u32. This assumption is justified by the Cairo docs,
+ // which say this:
+ //
+ // https://cairographics.org/manual/cairo-Image-Surfaces.html#cairo-image-surface-create-for-data
+ //
+ // > This pointer must be suitably aligned for any kind of variable,
+ // > (for example, a pointer returned by malloc).
+ #[allow(clippy::cast_ptr_alignment)]
+ let this: &mut [u32] =
+ unsafe { slice::from_raw_parts_mut(this.as_mut_ptr() as *mut u32, this.len() / 4) };
+ this.set_pixel(stride, pixel, x, y);
+ }
+}
+impl ImageSurfaceDataExt for [u8] {
+ #[inline]
+ fn set_pixel(&mut self, stride: usize, pixel: Pixel, x: u32, y: u32) {
+ use byteorder::{NativeEndian, WriteBytesExt};
+ let mut this = &mut self[y as usize * stride + x as usize * 4..];
+ this.write_u32::<NativeEndian>(pixel.to_u32())
+ .expect("out of bounds pixel access on [u8]");
+ }
+}
+impl ImageSurfaceDataExt for [u32] {
+ #[inline]
+ fn set_pixel(&mut self, stride: usize, pixel: Pixel, x: u32, y: u32) {
+ self[(y as usize * stride + x as usize * 4) / 4] = pixel.to_u32();
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+ use proptest::prelude::*;
+
+ #[test]
+ fn pixel_diff() {
+ let a = Pixel::new(0x10, 0x20, 0xf0, 0x40);
+ assert_eq!(a, a.diff(&Pixel::default()));
+ let b = Pixel::new(0x50, 0xff, 0x20, 0x10);
+ assert_eq!(a.diff(&b), Pixel::new(0x40, 0xdf, 0xd0, 0x30));
+ }
+
+ // Floating-point reference implementation
+ fn premultiply_float(pixel: Pixel) -> Pixel {
+ let alpha = f64::from(pixel.a) / 255.0;
+ pixel.map_rgb(|x| ((f64::from(x) * alpha) + 0.5) as u8)
+ }
+
+ prop_compose! {
+ fn arbitrary_pixel()(a: u8, r: u8, g: u8, b: u8) -> Pixel {
+ Pixel { r, g, b, a }
+ }
+ }
+
+ proptest! {
+ #[test]
+ fn pixel_premultiply(pixel in arbitrary_pixel()) {
+ prop_assert_eq!(pixel.premultiply(), premultiply_float(pixel));
+ }
+
+ #[test]
+ fn pixel_unpremultiply(pixel in arbitrary_pixel()) {
+ let roundtrip = pixel.premultiply().unpremultiply();
+ if pixel.a == 0 {
+ prop_assert_eq!(roundtrip, Pixel::default());
+ } else {
+ // roundtrip can't be perfect, the accepted error depends on alpha
+ let tolerance = 0xff / pixel.a;
+ let diff = roundtrip.diff(&pixel);
+ prop_assert!(diff.r <= tolerance, "red component value differs by more than {}: {:?}", tolerance, roundtrip);
+ prop_assert!(diff.g <= tolerance, "green component value differs by more than {}: {:?}", tolerance, roundtrip);
+ prop_assert!(diff.b <= tolerance, "blue component value differs by more than {}: {:?}", tolerance, roundtrip);
+
+ prop_assert_eq!(pixel.a, roundtrip.a);
+ }
+ }
+ }
+}
diff --git a/rsvg/src/surface_utils/shared_surface.rs b/rsvg/src/surface_utils/shared_surface.rs
new file mode 100644
index 00000000..b94f2ebb
--- /dev/null
+++ b/rsvg/src/surface_utils/shared_surface.rs
@@ -0,0 +1,1477 @@
+//! Shared access to Cairo image surfaces.
+use std::cmp::min;
+use std::marker::PhantomData;
+use std::ptr::NonNull;
+use std::slice;
+
+use gdk_pixbuf::{Colorspace, Pixbuf};
+use nalgebra::{storage::Storage, Dim, Matrix};
+use rgb::FromSlice;
+
+use crate::error::*;
+use crate::rect::{IRect, Rect};
+use crate::surface_utils::srgb;
+use crate::util::clamp;
+
+use super::{
+ iterators::{PixelRectangle, Pixels},
+ AsCairoARGB, CairoARGB, EdgeMode, ImageSurfaceDataExt, Pixel, PixelOps, ToCairoARGB,
+ ToGdkPixbufRGBA, ToPixel,
+};
+
+/// Types of pixel data in a `ImageSurface`.
+#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash)]
+pub enum SurfaceType {
+ /// The pixel data is in the sRGB color space.
+ SRgb,
+ /// The pixel data is in the linear sRGB color space.
+ LinearRgb,
+ /// The pixel data is alpha-only (contains meaningful data only in the alpha channel).
+ ///
+ /// A number of methods are optimized for alpha-only surfaces. For example, linearization and
+ /// unlinearization have no effect for alpha-only surfaces.
+ AlphaOnly,
+}
+
+impl SurfaceType {
+ /// Combines surface types
+ ///
+ /// If combining two alpha-only surfaces, the result is alpha-only.
+ /// If one is alpha-only, the result is the other.
+ /// If none is alpha-only, the types should be the same.
+ ///
+ /// # Panics
+ /// Panics if the surface types are not alpha-only and differ.
+ pub fn combine(self, other: SurfaceType) -> SurfaceType {
+ match (self, other) {
+ (SurfaceType::AlphaOnly, t) => t,
+ (t, SurfaceType::AlphaOnly) => t,
+ (t1, t2) if t1 == t2 => t1,
+ _ => panic!(),
+ }
+ }
+}
+
+/// Operators supported by `ImageSurface<Shared>::compose`.
+pub enum Operator {
+ Over,
+ In,
+ Out,
+ Atop,
+ Xor,
+ Multiply,
+ Screen,
+ Darken,
+ Lighten,
+ Overlay,
+ ColorDodge,
+ ColorBurn,
+ HardLight,
+ SoftLight,
+ Difference,
+ Exclusion,
+ HslHue,
+ HslSaturation,
+ HslColor,
+ HslLuminosity,
+}
+
+/// Wrapper for a Cairo image surface that enforces exclusive access when modifying it.
+///
+/// Shared access to `cairo::ImageSurface` is tricky since a read-only borrowed reference
+/// can still be cloned and then modified. We can't simply use `cairo::ImageSurface::data()`
+/// because in the filter code we have surfaces referenced from multiple places and it would
+/// probably add more complexity to remove that and start passing around references.
+///
+/// This wrapper asserts the uniqueness of its image surface.
+///
+/// It uses the typestate pattern to ensure that the surface can be modified only when
+/// it is in the `Exclusive` state, while in the `Shared` state it only allows read-only access.
+#[derive(Debug, Clone)]
+pub struct ImageSurface<T> {
+ surface: cairo::ImageSurface,
+
+ data_ptr: NonNull<u8>, // *const.
+ width: i32,
+ height: i32,
+ stride: isize,
+
+ surface_type: SurfaceType,
+
+ _state: PhantomData<T>,
+}
+
+#[derive(Debug, Clone)]
+pub struct Shared;
+
+/// Shared state of `ImageSurface`
+pub type SharedImageSurface = ImageSurface<Shared>;
+
+#[derive(Debug, Clone)]
+pub struct Exclusive;
+
+/// Exclusive state of `ImageSurface`
+pub type ExclusiveImageSurface = ImageSurface<Exclusive>;
+
+// The access is read-only, the ref-counting on an `cairo::ImageSurface` is atomic.
+unsafe impl Sync for SharedImageSurface {}
+
+/// A compile-time blur direction variable.
+pub trait BlurDirection {
+ const IS_VERTICAL: bool;
+}
+
+/// Vertical blur direction.
+pub enum Vertical {}
+/// Horizontal blur direction.
+pub enum Horizontal {}
+
+impl BlurDirection for Vertical {
+ const IS_VERTICAL: bool = true;
+}
+
+impl BlurDirection for Horizontal {
+ const IS_VERTICAL: bool = false;
+}
+
+/// A compile-time alpha-only marker variable.
+pub trait IsAlphaOnly {
+ const IS_ALPHA_ONLY: bool;
+}
+
+/// Alpha-only.
+pub enum AlphaOnly {}
+/// Not alpha-only.
+pub enum NotAlphaOnly {}
+
+/// Iterator over the rows of a `SharedImageSurface`.
+pub struct Rows<'a> {
+ surface: &'a SharedImageSurface,
+ next_row: i32,
+}
+
+/// Iterator over the mutable rows of an `ExclusiveImageSurface`.
+pub struct RowsMut<'a> {
+ // Keep an ImageSurfaceData here instead of a raw mutable pointer to the bytes,
+ // so that the ImageSurfaceData will mark the surface as dirty when it is dropped.
+ data: cairo::ImageSurfaceData<'a>,
+
+ width: i32,
+ height: i32,
+ stride: i32,
+
+ next_row: i32,
+}
+
+impl IsAlphaOnly for AlphaOnly {
+ const IS_ALPHA_ONLY: bool = true;
+}
+
+impl IsAlphaOnly for NotAlphaOnly {
+ const IS_ALPHA_ONLY: bool = false;
+}
+
+impl<T> ImageSurface<T> {
+ /// Returns the surface width.
+ #[inline]
+ pub fn width(&self) -> i32 {
+ self.width
+ }
+
+ /// Returns the surface height.
+ #[inline]
+ pub fn height(&self) -> i32 {
+ self.height
+ }
+
+ /// Returns the surface stride.
+ #[inline]
+ pub fn stride(&self) -> isize {
+ self.stride
+ }
+}
+
+impl ImageSurface<Shared> {
+ /// Creates a `SharedImageSurface` from a unique `cairo::ImageSurface`.
+ ///
+ /// # Panics
+ /// Panics if the surface format isn't `ARgb32` and if the surface is not unique, that is, its
+ /// reference count isn't 1.
+ #[inline]
+ pub fn wrap(
+ surface: cairo::ImageSurface,
+ surface_type: SurfaceType,
+ ) -> Result<SharedImageSurface, cairo::Error> {
+ // get_pixel() assumes ARgb32.
+ assert_eq!(surface.format(), cairo::Format::ARgb32);
+
+ let reference_count =
+ unsafe { cairo::ffi::cairo_surface_get_reference_count(surface.to_raw_none()) };
+ assert_eq!(reference_count, 1);
+
+ let (width, height) = (surface.width(), surface.height());
+
+ // Cairo allows zero-sized surfaces, but it does malloc(0), whose result
+ // is implementation-defined. So, we can't assume NonNull below. This is
+ // why we disallow zero-sized surfaces here.
+ assert!(width > 0 && height > 0);
+
+ surface.flush();
+
+ let data_ptr = NonNull::new(unsafe {
+ cairo::ffi::cairo_image_surface_get_data(surface.to_raw_none())
+ })
+ .unwrap();
+
+ let stride = surface.stride() as isize;
+
+ Ok(SharedImageSurface {
+ surface,
+ data_ptr,
+ width,
+ height,
+ stride,
+ surface_type,
+ _state: PhantomData,
+ })
+ }
+
+ /// Creates a `SharedImageSurface` copying from a `cairo::ImageSurface`, even if it
+ /// does not have a reference count of 1.
+ #[inline]
+ pub fn copy_from_surface(surface: &cairo::ImageSurface) -> Result<Self, cairo::Error> {
+ let copy =
+ cairo::ImageSurface::create(cairo::Format::ARgb32, surface.width(), surface.height())?;
+
+ {
+ let cr = cairo::Context::new(&copy)?;
+ cr.set_source_surface(surface, 0f64, 0f64)?;
+ cr.paint()?;
+ }
+
+ SharedImageSurface::wrap(copy, SurfaceType::SRgb)
+ }
+
+ /// Creates an empty `SharedImageSurface` of the given size and `type`.
+ #[inline]
+ pub fn empty(width: i32, height: i32, surface_type: SurfaceType) -> Result<Self, cairo::Error> {
+ let s = cairo::ImageSurface::create(cairo::Format::ARgb32, width, height)?;
+
+ SharedImageSurface::wrap(s, surface_type)
+ }
+
+ /// Converts this `SharedImageSurface` back into a Cairo image surface.
+ #[inline]
+ pub fn into_image_surface(self) -> Result<cairo::ImageSurface, cairo::Error> {
+ let reference_count =
+ unsafe { cairo::ffi::cairo_surface_get_reference_count(self.surface.to_raw_none()) };
+
+ if reference_count == 1 {
+ Ok(self.surface)
+ } else {
+ // If there are any other references, copy the underlying surface.
+ self.copy_surface(IRect::from_size(self.width, self.height))
+ }
+ }
+
+ pub fn from_pixbuf(
+ pixbuf: &Pixbuf,
+ content_type: Option<&str>,
+ mime_data: Option<Vec<u8>>,
+ ) -> Result<SharedImageSurface, cairo::Error> {
+ assert!(pixbuf.colorspace() == Colorspace::Rgb);
+ assert!(pixbuf.bits_per_sample() == 8);
+
+ let n_channels = pixbuf.n_channels();
+ assert!(n_channels == 3 || n_channels == 4);
+ let has_alpha = n_channels == 4;
+
+ let width = pixbuf.width();
+ let height = pixbuf.height();
+ let stride = pixbuf.rowstride() as usize;
+ assert!(width > 0 && height > 0 && stride > 0);
+
+ let pixbuf_data = unsafe { pixbuf.pixels() };
+
+ let mut surf = ExclusiveImageSurface::new(width, height, SurfaceType::SRgb)?;
+
+ // We use chunks(), not chunks_exact(), because gdk-pixbuf tends
+ // to make the last row *not* have the full stride (i.e. it is
+ // only as wide as the pixels in that row).
+ let pixbuf_rows = pixbuf_data.chunks(stride).take(height as usize);
+
+ if has_alpha {
+ pixbuf_rows
+ .map(|row| row.as_rgba())
+ .zip(surf.rows_mut())
+ .flat_map(|(src_row, dest_row)| src_row.iter().zip(dest_row.iter_mut()))
+ .for_each(|(src, dest)| *dest = src.to_pixel().premultiply().to_cairo_argb());
+ } else {
+ pixbuf_rows
+ .map(|row| row.as_rgb())
+ .zip(surf.rows_mut())
+ .flat_map(|(src_row, dest_row)| src_row.iter().zip(dest_row.iter_mut()))
+ .for_each(|(src, dest)| *dest = src.to_pixel().to_cairo_argb());
+ }
+
+ if let (Some(content_type), Some(bytes)) = (content_type, mime_data) {
+ surf.surface.set_mime_data(content_type, bytes)?;
+ }
+
+ surf.share()
+ }
+
+ pub fn to_pixbuf(&self) -> Option<Pixbuf> {
+ let width = self.width();
+ let height = self.height();
+
+ let pixbuf = Pixbuf::new(Colorspace::Rgb, true, 8, width, height)?;
+
+ assert!(pixbuf.colorspace() == Colorspace::Rgb);
+ assert!(pixbuf.bits_per_sample() == 8);
+ assert!(pixbuf.n_channels() == 4);
+
+ let pixbuf_data = unsafe { pixbuf.pixels() };
+ let stride = pixbuf.rowstride() as usize;
+
+ // We use chunks_mut(), not chunks_exact_mut(), because gdk-pixbuf tends
+ // to make the last row *not* have the full stride (i.e. it is
+ // only as wide as the pixels in that row).
+ pixbuf_data
+ .chunks_mut(stride)
+ .take(height as usize)
+ .map(|row| row.as_rgba_mut())
+ .zip(self.rows())
+ .flat_map(|(dest_row, src_row)| src_row.iter().zip(dest_row.iter_mut()))
+ .for_each(|(src, dest)| *dest = src.to_pixel().unpremultiply().to_pixbuf_rgba());
+
+ Some(pixbuf)
+ }
+
+ /// Returns `true` if the surface contains meaningful data only in the alpha channel.
+ #[inline]
+ fn is_alpha_only(&self) -> bool {
+ self.surface_type == SurfaceType::AlphaOnly
+ }
+
+ /// Returns the type of this surface.
+ #[inline]
+ pub fn surface_type(&self) -> SurfaceType {
+ self.surface_type
+ }
+
+ /// Retrieves the pixel value at the given coordinates.
+ #[inline]
+ pub fn get_pixel(&self, x: u32, y: u32) -> Pixel {
+ assert!(x < self.width as u32);
+ assert!(y < self.height as u32);
+
+ #[allow(clippy::cast_ptr_alignment)]
+ let value = unsafe {
+ *(self
+ .data_ptr
+ .as_ptr()
+ .offset(y as isize * self.stride + x as isize * 4) as *const u32)
+ };
+
+ Pixel::from_u32(value)
+ }
+
+ /// Retrieves the pixel value by offset into the pixel data array.
+ #[inline]
+ pub fn get_pixel_by_offset(&self, offset: isize) -> Pixel {
+ assert!(offset < self.stride * self.height as isize);
+
+ #[allow(clippy::cast_ptr_alignment)]
+ let value = unsafe { *(self.data_ptr.as_ptr().offset(offset) as *const u32) };
+ Pixel::from_u32(value)
+ }
+
+ /// Calls `set_source_surface()` on the given Cairo context.
+ #[inline]
+ pub fn set_as_source_surface(
+ &self,
+ cr: &cairo::Context,
+ x: f64,
+ y: f64,
+ ) -> Result<(), cairo::Error> {
+ cr.set_source_surface(&self.surface, x, y)
+ }
+
+ /// Creates a Cairo surface pattern from the surface
+ pub fn to_cairo_pattern(&self) -> cairo::SurfacePattern {
+ cairo::SurfacePattern::create(&self.surface)
+ }
+
+ /// Returns a new `cairo::ImageSurface` with the same contents as the one stored in this
+ /// `SharedImageSurface` within the given bounds.
+ fn copy_surface(&self, bounds: IRect) -> Result<cairo::ImageSurface, cairo::Error> {
+ let output_surface =
+ cairo::ImageSurface::create(cairo::Format::ARgb32, self.width, self.height)?;
+
+ let cr = cairo::Context::new(&output_surface)?;
+ let r = cairo::Rectangle::from(bounds);
+ cr.rectangle(r.x(), r.y(), r.width(), r.height());
+ cr.clip();
+
+ cr.set_source_surface(&self.surface, 0f64, 0f64)?;
+ cr.paint()?;
+
+ Ok(output_surface)
+ }
+
+ /// Scales the given surface by `x` and `y` into a surface `width`×`height` in size, clipped by
+ /// `bounds`.
+ pub fn scale_to(
+ &self,
+ width: i32,
+ height: i32,
+ bounds: IRect,
+ x: f64,
+ y: f64,
+ ) -> Result<SharedImageSurface, cairo::Error> {
+ let output_surface = cairo::ImageSurface::create(cairo::Format::ARgb32, width, height)?;
+
+ {
+ let cr = cairo::Context::new(&output_surface)?;
+ let r = cairo::Rectangle::from(bounds);
+ cr.rectangle(r.x(), r.y(), r.width(), r.height());
+ cr.clip();
+
+ cr.scale(x, y);
+ self.set_as_source_surface(&cr, 0.0, 0.0)?;
+ cr.paint()?;
+ }
+
+ SharedImageSurface::wrap(output_surface, self.surface_type)
+ }
+
+ /// Returns a scaled version of a surface and bounds.
+ #[inline]
+ pub fn scale(
+ &self,
+ bounds: IRect,
+ x: f64,
+ y: f64,
+ ) -> Result<(SharedImageSurface, IRect), cairo::Error> {
+ let new_width = (f64::from(self.width) * x).ceil() as i32;
+ let new_height = (f64::from(self.height) * y).ceil() as i32;
+ let new_bounds = bounds.scale(x, y);
+
+ Ok((
+ self.scale_to(new_width, new_height, new_bounds, x, y)?,
+ new_bounds,
+ ))
+ }
+
+ /// Returns a surface with black background and alpha channel matching this surface.
+ pub fn extract_alpha(&self, bounds: IRect) -> Result<SharedImageSurface, cairo::Error> {
+ let mut output_surface =
+ cairo::ImageSurface::create(cairo::Format::ARgb32, self.width, self.height)?;
+
+ let output_stride = output_surface.stride() as usize;
+ {
+ let mut output_data = output_surface.data().unwrap();
+
+ for (x, y, Pixel { a, .. }) in Pixels::within(self, bounds) {
+ let output_pixel = Pixel {
+ r: 0,
+ g: 0,
+ b: 0,
+ a,
+ };
+ output_data.set_pixel(output_stride, output_pixel, x, y);
+ }
+ }
+
+ SharedImageSurface::wrap(output_surface, SurfaceType::AlphaOnly)
+ }
+
+ /// Returns a surface whose alpha channel for each pixel is equal to the
+ /// luminance of that pixel's unpremultiplied RGB values. The resulting
+ /// surface's RGB values are not meanignful; only the alpha channel has
+ /// useful luminance data.
+ ///
+ /// This is to get a mask suitable for use with cairo_mask_surface().
+ pub fn to_luminance_mask(&self) -> Result<SharedImageSurface, cairo::Error> {
+ let bounds = IRect::from_size(self.width, self.height);
+
+ let mut output_surface =
+ cairo::ImageSurface::create(cairo::Format::ARgb32, self.width, self.height)?;
+
+ let stride = output_surface.stride() as usize;
+ {
+ let mut data = output_surface.data().unwrap();
+
+ for (x, y, pixel) in Pixels::within(self, bounds) {
+ data.set_pixel(stride, pixel.to_luminance_mask(), x, y);
+ }
+ }
+
+ SharedImageSurface::wrap(output_surface, self.surface_type)
+ }
+
+ /// Returns a surface with pre-multiplication of color values undone.
+ ///
+ /// HACK: this is storing unpremultiplied pixels in an ARGB32 image surface (which is supposed
+ /// to be premultiplied pixels).
+ pub fn unpremultiply(&self, bounds: IRect) -> Result<SharedImageSurface, cairo::Error> {
+ // Unpremultiplication doesn't affect the alpha channel.
+ if self.is_alpha_only() {
+ return Ok(self.clone());
+ }
+
+ let mut output_surface =
+ cairo::ImageSurface::create(cairo::Format::ARgb32, self.width, self.height)?;
+
+ let stride = output_surface.stride() as usize;
+ {
+ let mut data = output_surface.data().unwrap();
+
+ for (x, y, pixel) in Pixels::within(self, bounds) {
+ data.set_pixel(stride, pixel.unpremultiply(), x, y);
+ }
+ }
+
+ SharedImageSurface::wrap(output_surface, self.surface_type)
+ }
+
+ /// Converts the surface to the linear sRGB color space.
+ #[inline]
+ pub fn to_linear_rgb(&self, bounds: IRect) -> Result<SharedImageSurface, cairo::Error> {
+ match self.surface_type {
+ SurfaceType::LinearRgb | SurfaceType::AlphaOnly => Ok(self.clone()),
+ _ => srgb::linearize_surface(self, bounds),
+ }
+ }
+
+ /// Converts the surface to the sRGB color space.
+ #[inline]
+ pub fn to_srgb(&self, bounds: IRect) -> Result<SharedImageSurface, cairo::Error> {
+ match self.surface_type {
+ SurfaceType::SRgb | SurfaceType::AlphaOnly => Ok(self.clone()),
+ _ => srgb::unlinearize_surface(self, bounds),
+ }
+ }
+
+ /// Performs a convolution.
+ ///
+ /// Note that `kernel` is rotated 180 degrees.
+ ///
+ /// The `target` parameter determines the position of the kernel relative to each pixel of the
+ /// image. The value of `(0, 0)` indicates that the top left pixel of the (180-degrees-rotated)
+ /// kernel corresponds to the current pixel, and the rest of the kernel is to the right and
+ /// bottom of the pixel. The value of `(cols / 2, rows / 2)` centers a kernel with an odd
+ /// number of rows and columns.
+ ///
+ /// # Panics
+ /// Panics if `kernel` has zero rows or columns.
+ pub fn convolve<R: Dim, C: Dim, S: Storage<f64, R, C>>(
+ &self,
+ bounds: IRect,
+ target: (i32, i32),
+ kernel: &Matrix<f64, R, C, S>,
+ edge_mode: EdgeMode,
+ ) -> Result<SharedImageSurface, cairo::Error> {
+ assert!(kernel.nrows() >= 1);
+ assert!(kernel.ncols() >= 1);
+
+ let mut output_surface =
+ cairo::ImageSurface::create(cairo::Format::ARgb32, self.width, self.height)?;
+
+ let output_stride = output_surface.stride() as usize;
+ {
+ let mut output_data = output_surface.data().unwrap();
+
+ if self.is_alpha_only() {
+ for (x, y, _pixel) in Pixels::within(self, bounds) {
+ let kernel_bounds = IRect::new(
+ x as i32 - target.0,
+ y as i32 - target.1,
+ x as i32 - target.0 + kernel.ncols() as i32,
+ y as i32 - target.1 + kernel.nrows() as i32,
+ );
+
+ let mut a = 0.0;
+
+ for (x, y, pixel) in
+ PixelRectangle::within(self, bounds, kernel_bounds, edge_mode)
+ {
+ let kernel_x = (kernel_bounds.x1 - x - 1) as usize;
+ let kernel_y = (kernel_bounds.y1 - y - 1) as usize;
+ let factor = kernel[(kernel_y, kernel_x)];
+
+ a += f64::from(pixel.a) * factor;
+ }
+
+ let convert = |x: f64| (clamp(x, 0.0, 255.0) + 0.5) as u8;
+
+ let output_pixel = Pixel {
+ r: 0,
+ g: 0,
+ b: 0,
+ a: convert(a),
+ };
+
+ output_data.set_pixel(output_stride, output_pixel, x, y);
+ }
+ } else {
+ for (x, y, _pixel) in Pixels::within(self, bounds) {
+ let kernel_bounds = IRect::new(
+ x as i32 - target.0,
+ y as i32 - target.1,
+ x as i32 - target.0 + kernel.ncols() as i32,
+ y as i32 - target.1 + kernel.nrows() as i32,
+ );
+
+ let mut r = 0.0;
+ let mut g = 0.0;
+ let mut b = 0.0;
+ let mut a = 0.0;
+
+ for (x, y, pixel) in
+ PixelRectangle::within(self, bounds, kernel_bounds, edge_mode)
+ {
+ let kernel_x = (kernel_bounds.x1 - x - 1) as usize;
+ let kernel_y = (kernel_bounds.y1 - y - 1) as usize;
+ let factor = kernel[(kernel_y, kernel_x)];
+
+ r += f64::from(pixel.r) * factor;
+ g += f64::from(pixel.g) * factor;
+ b += f64::from(pixel.b) * factor;
+ a += f64::from(pixel.a) * factor;
+ }
+
+ let convert = |x: f64| (clamp(x, 0.0, 255.0) + 0.5) as u8;
+
+ let output_pixel = Pixel {
+ r: convert(r),
+ g: convert(g),
+ b: convert(b),
+ a: convert(a),
+ };
+
+ output_data.set_pixel(output_stride, output_pixel, x, y);
+ }
+ }
+ }
+
+ SharedImageSurface::wrap(output_surface, self.surface_type)
+ }
+
+ /// Performs a horizontal or vertical box blur.
+ ///
+ /// The `target` parameter determines the position of the kernel relative to each pixel of the
+ /// image. The value of `0` indicates that the first pixel of the kernel corresponds to the
+ /// current pixel, and the rest of the kernel is to the right or bottom of the pixel. The value
+ /// of `kernel_size / 2` centers a kernel with an odd size.
+ ///
+ /// # Panics
+ /// Panics if `kernel_size` is `0` or if `target >= kernel_size`.
+ // This is public (and not inlined into box_blur()) for the purpose of accessing it from the
+ // benchmarks.
+ pub fn box_blur_loop<B: BlurDirection, A: IsAlphaOnly>(
+ &self,
+ output_surface: &mut cairo::ImageSurface,
+ bounds: IRect,
+ kernel_size: usize,
+ target: usize,
+ ) {
+ assert_ne!(kernel_size, 0);
+ assert!(target < kernel_size);
+ assert_eq!(self.is_alpha_only(), A::IS_ALPHA_ONLY);
+
+ {
+ // The following code is needed for a parallel implementation of the blur loop. The
+ // blurring is done either for each row or for each column of pixels, depending on the
+ // value of `vertical`, independently of the others. Naturally, we want to run the
+ // outer loop on a thread pool.
+ //
+ // The case of `vertical == false` is simple since the input image slice can be
+ // partitioned into chunks for each row of pixels and processed in parallel with rayon.
+ // The case of `vertical == true`, however, is more involved because we can't just make
+ // mutable slices for all pixel columns (they would be overlapping which is forbidden
+ // by the aliasing rules).
+ //
+ // This is where the following struct comes into play: it stores a sub-slice of the
+ // pixel data and can be split at any row or column into two parts (similar to
+ // slice::split_at_mut()).
+ struct UnsafeSendPixelData<'a> {
+ width: u32,
+ height: u32,
+ stride: isize,
+ ptr: NonNull<u8>,
+ _marker: PhantomData<&'a mut ()>,
+ }
+
+ unsafe impl<'a> Send for UnsafeSendPixelData<'a> {}
+
+ impl<'a> UnsafeSendPixelData<'a> {
+ /// Creates a new `UnsafeSendPixelData`.
+ ///
+ /// # Safety
+ /// You must call `cairo_surface_mark_dirty()` on the surface once all instances of
+ /// `UnsafeSendPixelData` are dropped to make sure the pixel changes are committed
+ /// to Cairo.
+ #[inline]
+ unsafe fn new(surface: &mut cairo::ImageSurface) -> Self {
+ assert_eq!(surface.format(), cairo::Format::ARgb32);
+ let ptr = surface.data().unwrap().as_mut_ptr();
+
+ Self {
+ width: surface.width() as u32,
+ height: surface.height() as u32,
+ stride: surface.stride() as isize,
+ ptr: NonNull::new(ptr).unwrap(),
+ _marker: PhantomData,
+ }
+ }
+
+ /// Sets a pixel value at the given coordinates.
+ #[inline]
+ fn set_pixel(&mut self, pixel: Pixel, x: u32, y: u32) {
+ assert!(x < self.width);
+ assert!(y < self.height);
+
+ let value = pixel.to_u32();
+
+ #[allow(clippy::cast_ptr_alignment)]
+ unsafe {
+ let ptr = self
+ .ptr
+ .as_ptr()
+ .offset(y as isize * self.stride + x as isize * 4)
+ as *mut u32;
+ *ptr = value;
+ }
+ }
+
+ /// Splits this `UnsafeSendPixelData` into two at the given row.
+ ///
+ /// The first one contains rows `0..index` (`index` not included) and the second one
+ /// contains rows `index..height`.
+ #[inline]
+ fn split_at_row(self, index: u32) -> (Self, Self) {
+ assert!(index <= self.height);
+
+ (
+ UnsafeSendPixelData {
+ width: self.width,
+ height: index,
+ stride: self.stride,
+ ptr: self.ptr,
+ _marker: PhantomData,
+ },
+ UnsafeSendPixelData {
+ width: self.width,
+ height: self.height - index,
+ stride: self.stride,
+ ptr: NonNull::new(unsafe {
+ self.ptr.as_ptr().offset(index as isize * self.stride)
+ })
+ .unwrap(),
+ _marker: PhantomData,
+ },
+ )
+ }
+
+ /// Splits this `UnsafeSendPixelData` into two at the given column.
+ ///
+ /// The first one contains columns `0..index` (`index` not included) and the second
+ /// one contains columns `index..width`.
+ #[inline]
+ fn split_at_column(self, index: u32) -> (Self, Self) {
+ assert!(index <= self.width);
+
+ (
+ UnsafeSendPixelData {
+ width: index,
+ height: self.height,
+ stride: self.stride,
+ ptr: self.ptr,
+ _marker: PhantomData,
+ },
+ UnsafeSendPixelData {
+ width: self.width - index,
+ height: self.height,
+ stride: self.stride,
+ ptr: NonNull::new(unsafe {
+ self.ptr.as_ptr().offset(index as isize * 4)
+ })
+ .unwrap(),
+ _marker: PhantomData,
+ },
+ )
+ }
+ }
+
+ let output_data = unsafe { UnsafeSendPixelData::new(output_surface) };
+
+ // Shift is target into the opposite direction.
+ let shift = (kernel_size - target) as i32;
+ let target = target as i32;
+
+ // Convert to f64 once since we divide by it.
+ let kernel_size_f64 = kernel_size as f64;
+ let compute = |x: u32| (f64::from(x) / kernel_size_f64 + 0.5) as u8;
+
+ // Depending on `vertical`, we're blurring either horizontally line-by-line, or
+ // vertically column-by-column. In the code below, the main axis is the axis along
+ // which the blurring happens (so if `vertical` is false, the main axis is the
+ // horizontal axis). The other axis is the outer loop axis. The code uses `i` and `j`
+ // for the other axis and main axis coordinates, respectively.
+ let (main_axis_min, main_axis_max, other_axis_min, other_axis_max) = if B::IS_VERTICAL {
+ (bounds.y0, bounds.y1, bounds.x0, bounds.x1)
+ } else {
+ (bounds.x0, bounds.x1, bounds.y0, bounds.y1)
+ };
+
+ // Helper function for getting the pixels.
+ let pixel = |i, j| {
+ let (x, y) = if B::IS_VERTICAL { (i, j) } else { (j, i) };
+
+ self.get_pixel(x as u32, y as u32)
+ };
+
+ // The following loop assumes the first row or column of `output_data` is the first row
+ // or column inside `bounds`.
+ let mut output_data = if B::IS_VERTICAL {
+ output_data.split_at_column(bounds.x0 as u32).1
+ } else {
+ output_data.split_at_row(bounds.y0 as u32).1
+ };
+
+ rayon::scope(|s| {
+ for i in other_axis_min..other_axis_max {
+ // Split off one row or column and launch its processing on another thread.
+ // Thanks to the initial split before the loop, there's no special case for the
+ // very first split.
+ let (mut current, remaining) = if B::IS_VERTICAL {
+ output_data.split_at_column(1)
+ } else {
+ output_data.split_at_row(1)
+ };
+
+ output_data = remaining;
+
+ s.spawn(move |_| {
+ // Helper function for setting the pixels.
+ let mut set_pixel = |j, pixel| {
+ // We're processing rows or columns one-by-one, so the other coordinate
+ // is always 0.
+ let (x, y) = if B::IS_VERTICAL { (0, j) } else { (j, 0) };
+ current.set_pixel(pixel, x, y);
+ };
+
+ // The idea is that since all weights of the box blur kernel are equal, for
+ // each step along the main axis, instead of recomputing the full sum, we
+ // can take the previous sum, subtract the "oldest" pixel value and add the
+ // "newest" pixel value.
+ //
+ // The sum is u32 so that it can fit MAXIMUM_KERNEL_SIZE * 255.
+ let mut sum_r = 0;
+ let mut sum_g = 0;
+ let mut sum_b = 0;
+ let mut sum_a = 0;
+
+ // The whole sum needs to be computed for the first pixel. However, we know
+ // that values outside of bounds are transparent, so the loop starts on the
+ // first pixel in bounds.
+ for j in main_axis_min..min(main_axis_max, main_axis_min + shift) {
+ let Pixel { r, g, b, a } = pixel(i, j);
+
+ if !A::IS_ALPHA_ONLY {
+ sum_r += u32::from(r);
+ sum_g += u32::from(g);
+ sum_b += u32::from(b);
+ }
+
+ sum_a += u32::from(a);
+ }
+
+ set_pixel(
+ main_axis_min as u32,
+ Pixel {
+ r: compute(sum_r),
+ g: compute(sum_g),
+ b: compute(sum_b),
+ a: compute(sum_a),
+ },
+ );
+
+ // Now, go through all the other pixels.
+ //
+ // j - target - 1 >= main_axis_min
+ // j >= main_axis_min + target + 1
+ let start_subtracting_at = main_axis_min + target + 1;
+
+ // j + shift - 1 < main_axis_max
+ // j < main_axis_max - shift + 1
+ let stop_adding_at = main_axis_max - shift + 1;
+
+ for j in main_axis_min + 1..main_axis_max {
+ if j >= start_subtracting_at {
+ let old_pixel = pixel(i, j - target - 1);
+
+ if !A::IS_ALPHA_ONLY {
+ sum_r -= u32::from(old_pixel.r);
+ sum_g -= u32::from(old_pixel.g);
+ sum_b -= u32::from(old_pixel.b);
+ }
+
+ sum_a -= u32::from(old_pixel.a);
+ }
+
+ if j < stop_adding_at {
+ let new_pixel = pixel(i, j + shift - 1);
+
+ if !A::IS_ALPHA_ONLY {
+ sum_r += u32::from(new_pixel.r);
+ sum_g += u32::from(new_pixel.g);
+ sum_b += u32::from(new_pixel.b);
+ }
+
+ sum_a += u32::from(new_pixel.a);
+ }
+
+ set_pixel(
+ j as u32,
+ Pixel {
+ r: compute(sum_r),
+ g: compute(sum_g),
+ b: compute(sum_b),
+ a: compute(sum_a),
+ },
+ );
+ }
+ });
+ }
+ });
+ }
+
+ // Don't forget to manually mark the surface as dirty (due to usage of
+ // `UnsafeSendPixelData`).
+ unsafe { cairo::ffi::cairo_surface_mark_dirty(output_surface.to_raw_none()) }
+ }
+
+ /// Performs a horizontal or vertical box blur.
+ ///
+ /// The `target` parameter determines the position of the kernel relative to each pixel of the
+ /// image. The value of `0` indicates that the first pixel of the kernel corresponds to the
+ /// current pixel, and the rest of the kernel is to the right or bottom of the pixel. The value
+ /// of `kernel_size / 2` centers a kernel with an odd size.
+ ///
+ /// # Panics
+ /// Panics if `kernel_size` is `0` or if `target >= kernel_size`.
+ #[inline]
+ pub fn box_blur<B: BlurDirection>(
+ &self,
+ bounds: IRect,
+ kernel_size: usize,
+ target: usize,
+ ) -> Result<SharedImageSurface, cairo::Error> {
+ let mut output_surface =
+ cairo::ImageSurface::create(cairo::Format::ARgb32, self.width, self.height)?;
+
+ if self.is_alpha_only() {
+ self.box_blur_loop::<B, AlphaOnly>(&mut output_surface, bounds, kernel_size, target);
+ } else {
+ self.box_blur_loop::<B, NotAlphaOnly>(&mut output_surface, bounds, kernel_size, target);
+ }
+
+ SharedImageSurface::wrap(output_surface, self.surface_type)
+ }
+
+ /// Fills the with a specified color.
+ #[inline]
+ pub fn flood(
+ &self,
+ bounds: IRect,
+ color: cssparser::RGBA,
+ ) -> Result<SharedImageSurface, cairo::Error> {
+ let output_surface =
+ cairo::ImageSurface::create(cairo::Format::ARgb32, self.width, self.height)?;
+
+ if color.alpha > 0 {
+ let cr = cairo::Context::new(&output_surface)?;
+ let r = cairo::Rectangle::from(bounds);
+ cr.rectangle(r.x(), r.y(), r.width(), r.height());
+ cr.clip();
+
+ cr.set_source_rgba(
+ f64::from(color.red_f32()),
+ f64::from(color.green_f32()),
+ f64::from(color.blue_f32()),
+ f64::from(color.alpha_f32()),
+ );
+ cr.paint()?;
+ }
+
+ SharedImageSurface::wrap(output_surface, self.surface_type)
+ }
+
+ /// Offsets the image of the specified amount.
+ #[inline]
+ pub fn offset(
+ &self,
+ bounds: IRect,
+ dx: f64,
+ dy: f64,
+ ) -> Result<SharedImageSurface, cairo::Error> {
+ let output_surface =
+ cairo::ImageSurface::create(cairo::Format::ARgb32, self.width, self.height)?;
+
+ // output_bounds contains all pixels within bounds,
+ // for which (x - ox) and (y - oy) also lie within bounds.
+ if let Some(output_bounds) = bounds
+ .translate((dx as i32, dy as i32))
+ .intersection(&bounds)
+ {
+ let cr = cairo::Context::new(&output_surface)?;
+ let r = cairo::Rectangle::from(output_bounds);
+ cr.rectangle(r.x(), r.y(), r.width(), r.height());
+ cr.clip();
+
+ self.set_as_source_surface(&cr, dx, dy)?;
+ cr.paint()?;
+ }
+
+ SharedImageSurface::wrap(output_surface, self.surface_type)
+ }
+
+ /// Returns a new surface of the same size, with the contents of the
+ /// specified image, optionally transformed to match a given box
+ #[inline]
+ pub fn paint_image(
+ &self,
+ bounds: Rect,
+ image: &SharedImageSurface,
+ rect: Option<Rect>,
+ ) -> Result<SharedImageSurface, cairo::Error> {
+ let output_surface =
+ cairo::ImageSurface::create(cairo::Format::ARgb32, self.width, self.height)?;
+
+ if rect.is_none() || !rect.unwrap().is_empty() {
+ let cr = cairo::Context::new(&output_surface)?;
+ let r = cairo::Rectangle::from(bounds);
+ cr.rectangle(r.x(), r.y(), r.width(), r.height());
+ cr.clip();
+
+ image.set_as_source_surface(&cr, 0f64, 0f64)?;
+
+ if let Some(rect) = rect {
+ let mut matrix = cairo::Matrix::new(
+ rect.width() / f64::from(image.width()),
+ 0.0,
+ 0.0,
+ rect.height() / f64::from(image.height()),
+ rect.x0,
+ rect.y0,
+ );
+ matrix.invert();
+
+ cr.source().set_matrix(matrix);
+ }
+
+ cr.paint()?;
+ }
+
+ SharedImageSurface::wrap(output_surface, image.surface_type)
+ }
+
+ /// Creates a new surface with the size and content specified in `bounds`
+ ///
+ /// # Panics
+ /// Panics if `bounds` is an empty rectangle, since `SharedImageSurface` cannot
+ /// represent zero-sized images.
+ #[inline]
+ pub fn tile(&self, bounds: IRect) -> Result<SharedImageSurface, cairo::Error> {
+ // Cairo lets us create zero-sized surfaces, but the call to SharedImageSurface::wrap()
+ // below will panic in that case. So, disallow requesting a zero-sized subregion.
+ assert!(!bounds.is_empty());
+
+ let output_surface =
+ cairo::ImageSurface::create(cairo::Format::ARgb32, bounds.width(), bounds.height())?;
+
+ {
+ let cr = cairo::Context::new(&output_surface)?;
+ self.set_as_source_surface(&cr, f64::from(-bounds.x0), f64::from(-bounds.y0))?;
+ cr.paint()?;
+ }
+
+ SharedImageSurface::wrap(output_surface, self.surface_type)
+ }
+
+ /// Returns a new surface of the same size, with the contents of the specified
+ /// image repeated to fill the bounds and starting from the given position.
+ #[inline]
+ pub fn paint_image_tiled(
+ &self,
+ bounds: IRect,
+ image: &SharedImageSurface,
+ x: i32,
+ y: i32,
+ ) -> Result<SharedImageSurface, cairo::Error> {
+ let output_surface =
+ cairo::ImageSurface::create(cairo::Format::ARgb32, self.width, self.height)?;
+
+ {
+ let cr = cairo::Context::new(&output_surface)?;
+
+ let ptn = image.to_cairo_pattern();
+ ptn.set_extend(cairo::Extend::Repeat);
+ let mut mat = cairo::Matrix::identity();
+ mat.translate(f64::from(-x), f64::from(-y));
+ ptn.set_matrix(mat);
+
+ let r = cairo::Rectangle::from(bounds);
+ cr.rectangle(r.x(), r.y(), r.width(), r.height());
+ cr.clip();
+
+ cr.set_source(&ptn)?;
+ cr.paint()?;
+ }
+
+ SharedImageSurface::wrap(output_surface, image.surface_type)
+ }
+
+ /// Performs the combination of two input surfaces using Porter-Duff
+ /// compositing operators.
+ ///
+ /// # Panics
+ /// Panics if the two surface types are not compatible.
+ #[inline]
+ pub fn compose(
+ &self,
+ other: &SharedImageSurface,
+ bounds: IRect,
+ operator: Operator,
+ ) -> Result<SharedImageSurface, cairo::Error> {
+ let output_surface = other.copy_surface(bounds)?;
+
+ {
+ let cr = cairo::Context::new(&output_surface)?;
+ let r = cairo::Rectangle::from(bounds);
+ cr.rectangle(r.x(), r.y(), r.width(), r.height());
+ cr.clip();
+
+ self.set_as_source_surface(&cr, 0.0, 0.0)?;
+ cr.set_operator(operator.into());
+ cr.paint()?;
+ }
+
+ SharedImageSurface::wrap(
+ output_surface,
+ self.surface_type.combine(other.surface_type),
+ )
+ }
+
+ /// Performs the combination of two input surfaces.
+ ///
+ /// Each pixel of the resulting image is computed using the following formula:
+ /// `res = k1*i1*i2 + k2*i1 + k3*i2 + k4`
+ ///
+ /// # Panics
+ /// Panics if the two surface types are not compatible.
+ #[inline]
+ pub fn compose_arithmetic(
+ &self,
+ other: &SharedImageSurface,
+ bounds: IRect,
+ k1: f64,
+ k2: f64,
+ k3: f64,
+ k4: f64,
+ ) -> Result<SharedImageSurface, cairo::Error> {
+ let mut output_surface = ExclusiveImageSurface::new(
+ self.width,
+ self.height,
+ self.surface_type.combine(other.surface_type),
+ )?;
+
+ composite_arithmetic(self, other, &mut output_surface, bounds, k1, k2, k3, k4);
+
+ output_surface.share()
+ }
+
+ pub fn rows(&self) -> Rows<'_> {
+ Rows {
+ surface: self,
+ next_row: 0,
+ }
+ }
+}
+
+impl<'a> Iterator for Rows<'a> {
+ type Item = &'a [CairoARGB];
+
+ fn next(&mut self) -> Option<Self::Item> {
+ if self.next_row == self.surface.height {
+ return None;
+ }
+
+ let row = self.next_row;
+
+ self.next_row += 1;
+
+ // SAFETY: this code assumes that cairo image surface data is correctly
+ // aligned for u32. This assumption is justified by the Cairo docs,
+ // which say this:
+ //
+ // https://cairographics.org/manual/cairo-Image-Surfaces.html#cairo-image-surface-create-for-data
+ //
+ // > This pointer must be suitably aligned for any kind of variable,
+ // > (for example, a pointer returned by malloc).
+ unsafe {
+ let row_ptr: *const u8 = self
+ .surface
+ .data_ptr
+ .as_ptr()
+ .offset(row as isize * self.surface.stride);
+ let row_of_u32: &[u32] =
+ slice::from_raw_parts(row_ptr as *const u32, self.surface.width as usize);
+ let pixels = row_of_u32.as_cairo_argb();
+ assert!(pixels.len() == self.surface.width as usize);
+ Some(pixels)
+ }
+ }
+}
+
+impl<'a> Iterator for RowsMut<'a> {
+ type Item = &'a mut [CairoARGB];
+
+ fn next(&mut self) -> Option<Self::Item> {
+ if self.next_row == self.height {
+ return None;
+ }
+
+ let row = self.next_row as usize;
+
+ self.next_row += 1;
+
+ // SAFETY: this code assumes that cairo image surface data is correctly
+ // aligned for u32. This assumption is justified by the Cairo docs,
+ // which say this:
+ //
+ // https://cairographics.org/manual/cairo-Image-Surfaces.html#cairo-image-surface-create-for-data
+ //
+ // > This pointer must be suitably aligned for any kind of variable,
+ // > (for example, a pointer returned by malloc).
+ unsafe {
+ // We do this with raw pointers, instead of re-slicing the &mut self.data[....],
+ // because with the latter we can't synthesize an appropriate lifetime for
+ // the return value.
+
+ let data_ptr = self.data.as_mut_ptr();
+ let row_ptr: *mut u8 = data_ptr.offset(row as isize * self.stride as isize);
+ let row_of_u32: &mut [u32] =
+ slice::from_raw_parts_mut(row_ptr as *mut u32, self.width as usize);
+ let pixels = row_of_u32.as_cairo_argb_mut();
+ assert!(pixels.len() == self.width as usize);
+ Some(pixels)
+ }
+ }
+}
+
+/// Performs the arithmetic composite operation. Public for benchmarking.
+#[inline]
+pub fn composite_arithmetic(
+ surface1: &SharedImageSurface,
+ surface2: &SharedImageSurface,
+ output_surface: &mut ExclusiveImageSurface,
+ bounds: IRect,
+ k1: f64,
+ k2: f64,
+ k3: f64,
+ k4: f64,
+) {
+ output_surface.modify(&mut |data, stride| {
+ for (x, y, pixel, pixel_2) in
+ Pixels::within(surface1, bounds).map(|(x, y, p)| (x, y, p, surface2.get_pixel(x, y)))
+ {
+ let i1a = f64::from(pixel.a) / 255f64;
+ let i2a = f64::from(pixel_2.a) / 255f64;
+ let oa = k1 * i1a * i2a + k2 * i1a + k3 * i2a + k4;
+ let oa = clamp(oa, 0f64, 1f64);
+
+ // Contents of image surfaces are transparent by default, so if the resulting pixel is
+ // transparent there's no need to do anything.
+ if oa > 0f64 {
+ let compute = |i1, i2| {
+ let i1 = f64::from(i1) / 255f64;
+ let i2 = f64::from(i2) / 255f64;
+
+ let o = k1 * i1 * i2 + k2 * i1 + k3 * i2 + k4;
+ let o = clamp(o, 0f64, oa);
+
+ ((o * 255f64) + 0.5) as u8
+ };
+
+ let output_pixel = Pixel {
+ r: compute(pixel.r, pixel_2.r),
+ g: compute(pixel.g, pixel_2.g),
+ b: compute(pixel.b, pixel_2.b),
+ a: ((oa * 255f64) + 0.5) as u8,
+ };
+
+ data.set_pixel(stride, output_pixel, x, y);
+ }
+ }
+ });
+}
+
+impl ImageSurface<Exclusive> {
+ #[inline]
+ pub fn new(
+ width: i32,
+ height: i32,
+ surface_type: SurfaceType,
+ ) -> Result<ExclusiveImageSurface, cairo::Error> {
+ let surface = cairo::ImageSurface::create(cairo::Format::ARgb32, width, height)?;
+
+ let (width, height) = (surface.width(), surface.height());
+
+ // Cairo allows zero-sized surfaces, but it does malloc(0), whose result
+ // is implementation-defined. So, we can't assume NonNull below. This is
+ // why we disallow zero-sized surfaces here.
+ assert!(width > 0 && height > 0);
+
+ let data_ptr = NonNull::new(unsafe {
+ cairo::ffi::cairo_image_surface_get_data(surface.to_raw_none())
+ })
+ .unwrap();
+
+ let stride = surface.stride() as isize;
+
+ Ok(ExclusiveImageSurface {
+ surface,
+ data_ptr,
+ width,
+ height,
+ stride,
+ surface_type,
+ _state: PhantomData,
+ })
+ }
+
+ #[inline]
+ pub fn share(self) -> Result<SharedImageSurface, cairo::Error> {
+ SharedImageSurface::wrap(self.surface, self.surface_type)
+ }
+
+ /// Raw access to the image data as a slice
+ #[inline]
+ pub fn data(&mut self) -> cairo::ImageSurfaceData<'_> {
+ self.surface.data().unwrap()
+ }
+
+ /// Modify the image data
+ #[inline]
+ pub fn modify(&mut self, draw_fn: &mut dyn FnMut(&mut cairo::ImageSurfaceData<'_>, usize)) {
+ let stride = self.stride() as usize;
+ let mut data = self.data();
+
+ draw_fn(&mut data, stride)
+ }
+
+ /// Draw on the surface using cairo
+ #[inline]
+ pub fn draw(
+ &mut self,
+ draw_fn: &mut dyn FnMut(cairo::Context) -> Result<(), RenderingError>,
+ ) -> Result<(), RenderingError> {
+ let cr = cairo::Context::new(&self.surface)?;
+ draw_fn(cr)
+ }
+
+ pub fn rows_mut(&mut self) -> RowsMut<'_> {
+ let width = self.surface.width();
+ let height = self.surface.height();
+ let stride = self.surface.stride();
+
+ let data = self.surface.data().unwrap();
+
+ RowsMut {
+ width,
+ height,
+ stride,
+ data,
+ next_row: 0,
+ }
+ }
+}
+
+impl From<Operator> for cairo::Operator {
+ fn from(op: Operator) -> cairo::Operator {
+ use cairo::Operator as Cairo;
+ use Operator::*;
+
+ match op {
+ Over => Cairo::Over,
+ In => Cairo::In,
+ Out => Cairo::Out,
+ Atop => Cairo::Atop,
+ Xor => Cairo::Xor,
+ Multiply => Cairo::Multiply,
+ Screen => Cairo::Screen,
+ Darken => Cairo::Darken,
+ Lighten => Cairo::Lighten,
+ Overlay => Cairo::Overlay,
+ ColorDodge => Cairo::ColorDodge,
+ ColorBurn => Cairo::ColorBurn,
+ HardLight => Cairo::HardLight,
+ SoftLight => Cairo::SoftLight,
+ Difference => Cairo::Difference,
+ Exclusion => Cairo::Exclusion,
+ HslHue => Cairo::HslHue,
+ HslSaturation => Cairo::HslSaturation,
+ HslColor => Cairo::HslColor,
+ HslLuminosity => Cairo::HslLuminosity,
+ }
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+ use crate::surface_utils::iterators::Pixels;
+
+ #[test]
+ fn test_extract_alpha() {
+ const WIDTH: i32 = 32;
+ const HEIGHT: i32 = 64;
+
+ let bounds = IRect::new(8, 24, 16, 48);
+ let full_bounds = IRect::from_size(WIDTH, HEIGHT);
+
+ let mut surface = ExclusiveImageSurface::new(WIDTH, HEIGHT, SurfaceType::SRgb).unwrap();
+
+ // Fill the surface with some data.
+ {
+ let mut data = surface.data();
+
+ let mut counter = 0u16;
+ for x in data.iter_mut() {
+ *x = counter as u8;
+ counter = (counter + 1) % 256;
+ }
+ }
+
+ let surface = surface.share().unwrap();
+ let alpha = surface.extract_alpha(bounds).unwrap();
+
+ for (x, y, p, pa) in
+ Pixels::within(&surface, full_bounds).map(|(x, y, p)| (x, y, p, alpha.get_pixel(x, y)))
+ {
+ assert_eq!(pa.r, 0);
+ assert_eq!(pa.g, 0);
+ assert_eq!(pa.b, 0);
+
+ if !bounds.contains(x as i32, y as i32) {
+ assert_eq!(pa.a, 0);
+ } else {
+ assert_eq!(pa.a, p.a);
+ }
+ }
+ }
+}
diff --git a/rsvg/src/surface_utils/srgb.rs b/rsvg/src/surface_utils/srgb.rs
new file mode 100644
index 00000000..c745d0b4
--- /dev/null
+++ b/rsvg/src/surface_utils/srgb.rs
@@ -0,0 +1,95 @@
+//! Utility functions for dealing with sRGB colors.
+//!
+//! The constant values in this module are taken from <http://www.color.org/chardata/rgb/srgb.xalter>
+
+use crate::rect::IRect;
+use crate::surface_utils::{
+ iterators::Pixels,
+ shared_surface::{ExclusiveImageSurface, SharedImageSurface, SurfaceType},
+ ImageSurfaceDataExt, Pixel,
+};
+
+// Include the linearization and unlinearization tables.
+include!(concat!(env!("OUT_DIR"), "/srgb-codegen.rs"));
+
+/// Converts an sRGB color value to a linear sRGB color value (undoes the gamma correction).
+#[inline]
+pub fn linearize(c: u8) -> u8 {
+ LINEARIZE[usize::from(c)]
+}
+
+/// Converts a linear sRGB color value to a normal sRGB color value (applies the gamma correction).
+#[inline]
+pub fn unlinearize(c: u8) -> u8 {
+ UNLINEARIZE[usize::from(c)]
+}
+
+/// Processing loop of `map_unpremultiplied_components`. Extracted (and public) for benchmarking.
+#[inline]
+pub fn map_unpremultiplied_components_loop<F: Fn(u8) -> u8>(
+ surface: &SharedImageSurface,
+ output_surface: &mut ExclusiveImageSurface,
+ bounds: IRect,
+ f: F,
+) {
+ output_surface.modify(&mut |data, stride| {
+ for (x, y, pixel) in Pixels::within(surface, bounds) {
+ if pixel.a > 0 {
+ let alpha = f64::from(pixel.a) / 255f64;
+
+ let compute = |x| {
+ let x = f64::from(x) / alpha; // Unpremultiply alpha.
+ let x = (x + 0.5) as u8; // Round to nearest u8.
+ let x = f(x);
+ let x = f64::from(x) * alpha; // Premultiply alpha again.
+ (x + 0.5) as u8
+ };
+
+ let output_pixel = Pixel {
+ r: compute(pixel.r),
+ g: compute(pixel.g),
+ b: compute(pixel.b),
+ a: pixel.a,
+ };
+
+ data.set_pixel(stride, output_pixel, x, y);
+ }
+ }
+ });
+}
+
+/// Applies the function to each pixel component after unpremultiplying.
+fn map_unpremultiplied_components<F: Fn(u8) -> u8>(
+ surface: &SharedImageSurface,
+ bounds: IRect,
+ f: F,
+ new_type: SurfaceType,
+) -> Result<SharedImageSurface, cairo::Error> {
+ let (width, height) = (surface.width(), surface.height());
+ let mut output_surface = ExclusiveImageSurface::new(width, height, new_type)?;
+ map_unpremultiplied_components_loop(surface, &mut output_surface, bounds, f);
+
+ output_surface.share()
+}
+
+/// Converts an sRGB surface to a linear sRGB surface (undoes the gamma correction).
+#[inline]
+pub fn linearize_surface(
+ surface: &SharedImageSurface,
+ bounds: IRect,
+) -> Result<SharedImageSurface, cairo::Error> {
+ assert_eq!(surface.surface_type(), SurfaceType::SRgb);
+
+ map_unpremultiplied_components(surface, bounds, linearize, SurfaceType::LinearRgb)
+}
+
+/// Converts a linear sRGB surface to a normal sRGB surface (applies the gamma correction).
+#[inline]
+pub fn unlinearize_surface(
+ surface: &SharedImageSurface,
+ bounds: IRect,
+) -> Result<SharedImageSurface, cairo::Error> {
+ assert_eq!(surface.surface_type(), SurfaceType::LinearRgb);
+
+ map_unpremultiplied_components(surface, bounds, unlinearize, SurfaceType::SRgb)
+}
diff --git a/rsvg/src/text.rs b/rsvg/src/text.rs
new file mode 100644
index 00000000..a0e51fc6
--- /dev/null
+++ b/rsvg/src/text.rs
@@ -0,0 +1,1456 @@
+//! Text elements: `text`, `tspan`, `tref`.
+
+use markup5ever::{expanded_name, local_name, namespace_url, ns};
+use pango::IsAttribute;
+use std::cell::RefCell;
+use std::convert::TryFrom;
+use std::rc::Rc;
+use std::sync::Arc;
+
+use crate::bbox::BoundingBox;
+use crate::document::{AcquiredNodes, NodeId};
+use crate::drawing_ctx::{create_pango_context, DrawingCtx, FontOptions, Viewport};
+use crate::element::{set_attribute, ElementData, ElementTrait};
+use crate::error::*;
+use crate::layout::{self, FontProperties, Layer, LayerKind, StackingContext, Stroke, TextSpan};
+use crate::length::*;
+use crate::node::{CascadedValues, Node, NodeBorrow};
+use crate::paint_server::PaintSource;
+use crate::parsers::ParseValue;
+use crate::properties::{
+ ComputedValues, Direction, FontStretch, FontStyle, FontVariant, FontWeight, PaintOrder,
+ TextAnchor, TextRendering, UnicodeBidi, WritingMode, XmlLang, XmlSpace,
+};
+use crate::rect::Rect;
+use crate::session::Session;
+use crate::space::{xml_space_normalize, NormalizeDefault, XmlSpaceNormalize};
+use crate::transform::{Transform, ValidTransform};
+use crate::xml::Attributes;
+
+/// The state of a text layout operation.
+struct LayoutContext {
+ /// `writing-mode` property from the `<text>` element.
+ writing_mode: WritingMode,
+
+ /// Current transform in the DrawingCtx.
+ transform: ValidTransform,
+
+ /// Font options from the DrawingCtx.
+ font_options: FontOptions,
+
+ /// For normalizing lengths.
+ viewport: Viewport,
+
+ /// Session metadata for the document
+ session: Session,
+}
+
+/// An absolutely-positioned array of `Span`s
+///
+/// SVG defines a "[text chunk]" to occur when a text-related element
+/// has an absolute position adjustment, that is, `x` or `y`
+/// attributes.
+///
+/// A `<text>` element always starts with an absolute position from
+/// such attributes, or (0, 0) if they are not specified.
+///
+/// Subsequent children of the `<text>` element will create new chunks
+/// whenever they have `x` or `y` attributes.
+///
+/// [text chunk]: https://www.w3.org/TR/SVG11/text.html#TextLayoutIntroduction
+struct Chunk {
+ values: Rc<ComputedValues>,
+ x: Option<f64>,
+ y: Option<f64>,
+ spans: Vec<Span>,
+}
+
+struct MeasuredChunk {
+ values: Rc<ComputedValues>,
+ x: Option<f64>,
+ y: Option<f64>,
+ dx: f64,
+ dy: f64,
+ spans: Vec<MeasuredSpan>,
+}
+
+struct PositionedChunk {
+ next_chunk_x: f64,
+ next_chunk_y: f64,
+ spans: Vec<PositionedSpan>,
+}
+
+struct Span {
+ values: Rc<ComputedValues>,
+ text: String,
+ dx: f64,
+ dy: f64,
+ _depth: usize,
+ link_target: Option<String>,
+}
+
+struct MeasuredSpan {
+ values: Rc<ComputedValues>,
+ layout: pango::Layout,
+ layout_size: (f64, f64),
+ advance: (f64, f64),
+ dx: f64,
+ dy: f64,
+ link_target: Option<String>,
+}
+
+struct PositionedSpan {
+ layout: pango::Layout,
+ values: Rc<ComputedValues>,
+ rendered_position: (f64, f64),
+ next_span_position: (f64, f64),
+ link_target: Option<String>,
+}
+
+/// A laid-out and resolved text span.
+///
+/// The only thing not in user-space units are the `stroke_paint` and `fill_paint`.
+///
+/// This is the non-user-space version of `layout::TextSpan`.
+struct LayoutSpan {
+ layout: pango::Layout,
+ gravity: pango::Gravity,
+ bbox: Option<BoundingBox>,
+ is_visible: bool,
+ x: f64,
+ y: f64,
+ paint_order: PaintOrder,
+ stroke: Stroke,
+ stroke_paint: Arc<PaintSource>,
+ fill_paint: Arc<PaintSource>,
+ text_rendering: TextRendering,
+ link_target: Option<String>,
+ values: Rc<ComputedValues>,
+}
+
+impl Chunk {
+ fn new(values: &ComputedValues, x: Option<f64>, y: Option<f64>) -> Chunk {
+ Chunk {
+ values: Rc::new(values.clone()),
+ x,
+ y,
+ spans: Vec::new(),
+ }
+ }
+}
+
+impl MeasuredChunk {
+ fn from_chunk(layout_context: &LayoutContext, chunk: &Chunk) -> MeasuredChunk {
+ let mut measured_spans: Vec<MeasuredSpan> = chunk
+ .spans
+ .iter()
+ .filter_map(|span| MeasuredSpan::from_span(layout_context, span))
+ .collect();
+
+ // The first span contains the (dx, dy) that will be applied to the whole chunk.
+ // Make them 0 in the span, and extract the values to set them on the chunk.
+ // This is a hack until librsvg adds support for multiple dx/dy values per text/tspan.
+
+ let (chunk_dx, chunk_dy) = if let Some(first) = measured_spans.first_mut() {
+ let dx = first.dx;
+ let dy = first.dy;
+ first.dx = 0.0;
+ first.dy = 0.0;
+ (dx, dy)
+ } else {
+ (0.0, 0.0)
+ };
+
+ MeasuredChunk {
+ values: chunk.values.clone(),
+ x: chunk.x,
+ y: chunk.y,
+ dx: chunk_dx,
+ dy: chunk_dy,
+ spans: measured_spans,
+ }
+ }
+}
+
+impl PositionedChunk {
+ fn from_measured(
+ layout_context: &LayoutContext,
+ measured: &MeasuredChunk,
+ chunk_x: f64,
+ chunk_y: f64,
+ ) -> PositionedChunk {
+ let chunk_direction = measured.values.direction();
+
+ // Position the spans relatively to each other, starting at (0, 0)
+
+ let mut positioned = Vec::new();
+
+ // Start position of each span; gets advanced as each span is laid out.
+ // This is the text's start position, not the bounding box.
+ let mut x = 0.0;
+ let mut y = 0.0;
+
+ let mut chunk_bounds: Option<Rect> = None;
+
+ for mspan in &measured.spans {
+ let params = NormalizeParams::new(&mspan.values, &layout_context.viewport);
+
+ let layout = mspan.layout.clone();
+ let layout_size = mspan.layout_size;
+ let values = mspan.values.clone();
+ let dx = mspan.dx;
+ let dy = mspan.dy;
+ let advance = mspan.advance;
+
+ let baseline_offset = compute_baseline_offset(&layout, &values, &params);
+
+ let start_pos = match chunk_direction {
+ Direction::Ltr => (x, y),
+ Direction::Rtl => (x - advance.0, y),
+ };
+
+ let span_advance = match chunk_direction {
+ Direction::Ltr => (advance.0, advance.1),
+ Direction::Rtl => (-advance.0, advance.1),
+ };
+
+ let rendered_position = if layout_context.writing_mode.is_horizontal() {
+ (start_pos.0 + dx, start_pos.1 - baseline_offset + dy)
+ } else {
+ (start_pos.0 + baseline_offset + dx, start_pos.1 + dy)
+ };
+
+ let span_bounds =
+ Rect::from_size(layout_size.0, layout_size.1).translate(rendered_position);
+
+ if let Some(bounds) = chunk_bounds {
+ chunk_bounds = Some(bounds.union(&span_bounds));
+ } else {
+ chunk_bounds = Some(span_bounds);
+ }
+
+ x = x + span_advance.0 + dx;
+ y = y + span_advance.1 + dy;
+
+ let positioned_span = PositionedSpan {
+ layout,
+ values,
+ rendered_position,
+ next_span_position: (x, y),
+ link_target: mspan.link_target.clone(),
+ };
+
+ positioned.push(positioned_span);
+ }
+
+ // Compute the offsets needed to align the chunk per the text-anchor property (start, middle, end):
+
+ let anchor_offset = text_anchor_offset(
+ measured.values.text_anchor(),
+ chunk_direction,
+ layout_context.writing_mode,
+ chunk_bounds.unwrap_or_default(),
+ );
+
+ // Apply the text-anchor offset to each individually-positioned span, and compute the
+ // start position of the next chunk. Also add in the chunk's dx/dy.
+
+ let mut next_chunk_x = chunk_x;
+ let mut next_chunk_y = chunk_y;
+
+ for pspan in &mut positioned {
+ // Add the chunk's position, plus the text-anchor offset, plus the chunk's dx/dy.
+ // This last term is a hack until librsvg adds support for multiple dx/dy values per text/tspan;
+ // see the corresponding part in MeasuredChunk::from_chunk().
+ pspan.rendered_position.0 += chunk_x + anchor_offset.0 + measured.dx;
+ pspan.rendered_position.1 += chunk_y + anchor_offset.1 + measured.dy;
+
+ next_chunk_x = chunk_x + pspan.next_span_position.0 + anchor_offset.0 + measured.dx;
+ next_chunk_y = chunk_y + pspan.next_span_position.1 + anchor_offset.1 + measured.dy;
+ }
+
+ PositionedChunk {
+ next_chunk_x,
+ next_chunk_y,
+ spans: positioned,
+ }
+ }
+}
+
+fn compute_baseline_offset(
+ layout: &pango::Layout,
+ values: &ComputedValues,
+ params: &NormalizeParams,
+) -> f64 {
+ let baseline = f64::from(layout.baseline()) / f64::from(pango::SCALE);
+ let baseline_shift = values.baseline_shift().0.to_user(params);
+ baseline + baseline_shift
+}
+
+/// Computes the (x, y) offsets to be applied to spans after applying the text-anchor property (start, middle, end).
+#[rustfmt::skip]
+fn text_anchor_offset(
+ anchor: TextAnchor,
+ direction: Direction,
+ writing_mode: WritingMode,
+ chunk_bounds: Rect,
+) -> (f64, f64) {
+ let (w, h) = (chunk_bounds.width(), chunk_bounds.height());
+
+ let x0 = chunk_bounds.x0;
+
+ if writing_mode.is_horizontal() {
+ match (anchor, direction) {
+ (TextAnchor::Start, Direction::Ltr) => (-x0, 0.0),
+ (TextAnchor::Start, Direction::Rtl) => (-x0 - w, 0.0),
+
+ (TextAnchor::Middle, Direction::Ltr) => (-x0 - w / 2.0, 0.0),
+ (TextAnchor::Middle, Direction::Rtl) => (-x0 - w / 2.0, 0.0),
+
+ (TextAnchor::End, Direction::Ltr) => (-x0 - w, 0.0),
+ (TextAnchor::End, Direction::Rtl) => (-x0, 0.0),
+ }
+ } else {
+ // FIXME: we don't deal with text direction for vertical text yet.
+ match anchor {
+ TextAnchor::Start => (0.0, 0.0),
+ TextAnchor::Middle => (0.0, -h / 2.0),
+ TextAnchor::End => (0.0, -h),
+ }
+ }
+}
+
+impl Span {
+ fn new(
+ text: &str,
+ values: Rc<ComputedValues>,
+ dx: f64,
+ dy: f64,
+ depth: usize,
+ link_target: Option<String>,
+ ) -> Span {
+ Span {
+ values,
+ text: text.to_string(),
+ dx,
+ dy,
+ _depth: depth,
+ link_target,
+ }
+ }
+}
+
+/// Use as `PangoUnits::from_pixels()` so that we can check for overflow.
+struct PangoUnits(i32);
+
+impl PangoUnits {
+ fn from_pixels(v: f64) -> Option<Self> {
+ // We want (v * f64::from(pango::SCALE) + 0.5) as i32
+ //
+ // But check for overflow.
+
+ cast::i32(v * f64::from(pango::SCALE) + 0.5)
+ .ok()
+ .map(PangoUnits)
+ }
+}
+
+impl MeasuredSpan {
+ fn from_span(layout_context: &LayoutContext, span: &Span) -> Option<MeasuredSpan> {
+ let values = span.values.clone();
+
+ let params = NormalizeParams::new(&values, &layout_context.viewport);
+
+ let properties = FontProperties::new(&values, &params);
+
+ let bidi_control = BidiControl::from_unicode_bidi_and_direction(
+ properties.unicode_bidi,
+ properties.direction,
+ );
+
+ let with_control_chars = wrap_with_direction_control_chars(&span.text, &bidi_control);
+
+ if let Some(layout) = create_pango_layout(layout_context, &properties, &with_control_chars)
+ {
+ let (w, h) = layout.size();
+
+ let w = f64::from(w) / f64::from(pango::SCALE);
+ let h = f64::from(h) / f64::from(pango::SCALE);
+
+ let advance = if layout_context.writing_mode.is_horizontal() {
+ (w, 0.0)
+ } else {
+ (0.0, w)
+ };
+
+ Some(MeasuredSpan {
+ values,
+ layout,
+ layout_size: (w, h),
+ advance,
+ dx: span.dx,
+ dy: span.dy,
+ link_target: span.link_target.clone(),
+ })
+ } else {
+ None
+ }
+ }
+}
+
+// FIXME: should the pango crate provide this like PANGO_GRAVITY_IS_VERTICAL() ?
+fn gravity_is_vertical(gravity: pango::Gravity) -> bool {
+ matches!(gravity, pango::Gravity::East | pango::Gravity::West)
+}
+
+fn compute_text_box(
+ layout: &pango::Layout,
+ x: f64,
+ y: f64,
+ transform: Transform,
+ gravity: pango::Gravity,
+) -> Option<BoundingBox> {
+ #![allow(clippy::many_single_char_names)]
+
+ let (ink, _) = layout.extents();
+ if ink.width() == 0 || ink.height() == 0 {
+ return None;
+ }
+
+ let ink_x = f64::from(ink.x());
+ let ink_y = f64::from(ink.y());
+ let ink_width = f64::from(ink.width());
+ let ink_height = f64::from(ink.height());
+ let pango_scale = f64::from(pango::SCALE);
+
+ let (x, y, w, h) = if gravity_is_vertical(gravity) {
+ (
+ x + (ink_x - ink_height) / pango_scale,
+ y + ink_y / pango_scale,
+ ink_height / pango_scale,
+ ink_width / pango_scale,
+ )
+ } else {
+ (
+ x + ink_x / pango_scale,
+ y + ink_y / pango_scale,
+ ink_width / pango_scale,
+ ink_height / pango_scale,
+ )
+ };
+
+ let r = Rect::new(x, y, x + w, y + h);
+ let bbox = BoundingBox::new()
+ .with_transform(transform)
+ .with_rect(r)
+ .with_ink_rect(r);
+
+ Some(bbox)
+}
+
+impl PositionedSpan {
+ fn layout(
+ &self,
+ layout_context: &LayoutContext,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ ) -> LayoutSpan {
+ let params = NormalizeParams::new(&self.values, &layout_context.viewport);
+
+ let layout = self.layout.clone();
+ let is_visible = self.values.is_visible();
+ let (x, y) = self.rendered_position;
+
+ let stroke = Stroke::new(&self.values, &params);
+
+ let gravity = layout.context().gravity();
+
+ let bbox = compute_text_box(&layout, x, y, *layout_context.transform, gravity);
+
+ let stroke_paint = self.values.stroke().0.resolve(
+ acquired_nodes,
+ self.values.stroke_opacity().0,
+ self.values.color().0,
+ None,
+ None,
+ &layout_context.session,
+ );
+
+ let fill_paint = self.values.fill().0.resolve(
+ acquired_nodes,
+ self.values.fill_opacity().0,
+ self.values.color().0,
+ None,
+ None,
+ &layout_context.session,
+ );
+
+ let paint_order = self.values.paint_order();
+ let text_rendering = self.values.text_rendering();
+
+ LayoutSpan {
+ layout,
+ gravity,
+ bbox,
+ is_visible,
+ x,
+ y,
+ paint_order,
+ stroke,
+ stroke_paint,
+ fill_paint,
+ text_rendering,
+ values: self.values.clone(),
+ link_target: self.link_target.clone(),
+ }
+ }
+}
+
+/// Walks the children of a `<text>`, `<tspan>`, or `<tref>` element
+/// and appends chunks/spans from them into the specified `chunks`
+/// array.
+fn children_to_chunks(
+ chunks: &mut Vec<Chunk>,
+ node: &Node,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ cascaded: &CascadedValues<'_>,
+ layout_context: &LayoutContext,
+ dx: f64,
+ dy: f64,
+ depth: usize,
+ link: Option<String>,
+) {
+ let mut dx = dx;
+ let mut dy = dy;
+
+ for child in node.children() {
+ if child.is_chars() {
+ let values = cascaded.get();
+ child.borrow_chars().to_chunks(
+ &child,
+ Rc::new(values.clone()),
+ chunks,
+ dx,
+ dy,
+ depth,
+ link.clone(),
+ );
+ } else {
+ assert!(child.is_element());
+
+ match *child.borrow_element_data() {
+ ElementData::TSpan(ref tspan) => {
+ let cascaded = CascadedValues::clone_with_node(cascaded, &child);
+ tspan.to_chunks(
+ &child,
+ acquired_nodes,
+ &cascaded,
+ layout_context,
+ chunks,
+ dx,
+ dy,
+ depth + 1,
+ link.clone(),
+ );
+ }
+
+ ElementData::Link(ref link) => {
+ // TSpan::default sets all offsets to 0,
+ // which is what we want in links.
+ //
+ // FIXME: This is the only place in the code where an element's method (TSpan::to_chunks)
+ // is called with a node that is not the element itself: here, `child` is a Link, not a TSpan.
+ //
+ // The code works because the `tspan` is dropped immediately after calling to_chunks and no
+ // references are retained for it.
+ let tspan = TSpan::default();
+ let cascaded = CascadedValues::clone_with_node(cascaded, &child);
+ tspan.to_chunks(
+ &child,
+ acquired_nodes,
+ &cascaded,
+ layout_context,
+ chunks,
+ dx,
+ dy,
+ depth + 1,
+ link.link.clone(),
+ );
+ }
+
+ ElementData::TRef(ref tref) => {
+ let cascaded = CascadedValues::clone_with_node(cascaded, &child);
+ tref.to_chunks(
+ &child,
+ acquired_nodes,
+ &cascaded,
+ chunks,
+ depth + 1,
+ layout_context,
+ );
+ }
+
+ _ => (),
+ }
+ }
+
+ // After the first span, we don't need to carry over the parent's dx/dy.
+ dx = 0.0;
+ dy = 0.0;
+ }
+}
+
+/// In SVG text elements, we use `Chars` to store character data. For example,
+/// an element like `<text>Foo Bar</text>` will be a `Text` with a single child,
+/// and the child will be a `Chars` with "Foo Bar" for its contents.
+///
+/// Text elements can contain `<tspan>` sub-elements. In this case,
+/// those `tspan` nodes will also contain `Chars` children.
+///
+/// A text or tspan element can contain more than one `Chars` child, for example,
+/// if there is an XML comment that splits the character contents in two:
+///
+/// ```xml
+/// <text>
+/// This sentence will create a Chars.
+/// <!-- this comment is ignored -->
+/// This sentence will cretea another Chars.
+/// </text>
+/// ```
+///
+/// When rendering a text element, it will take care of concatenating the strings
+/// in its `Chars` children as appropriate, depending on the
+/// `xml:space="preserve"` attribute. A `Chars` stores the characters verbatim
+/// as they come out of the XML parser, after ensuring that they are valid UTF-8.
+
+#[derive(Default)]
+pub struct Chars {
+ string: RefCell<String>,
+ space_normalized: RefCell<Option<String>>,
+}
+
+impl Chars {
+ pub fn new(initial_text: &str) -> Chars {
+ Chars {
+ string: RefCell::new(String::from(initial_text)),
+ space_normalized: RefCell::new(None),
+ }
+ }
+
+ pub fn is_empty(&self) -> bool {
+ self.string.borrow().is_empty()
+ }
+
+ pub fn append(&self, s: &str) {
+ self.string.borrow_mut().push_str(s);
+ *self.space_normalized.borrow_mut() = None;
+ }
+
+ fn ensure_normalized_string(&self, node: &Node, values: &ComputedValues) {
+ let mut normalized = self.space_normalized.borrow_mut();
+
+ if (*normalized).is_none() {
+ let mode = match values.xml_space() {
+ XmlSpace::Default => XmlSpaceNormalize::Default(NormalizeDefault {
+ has_element_before: node.previous_sibling().is_some(),
+ has_element_after: node.next_sibling().is_some(),
+ }),
+
+ XmlSpace::Preserve => XmlSpaceNormalize::Preserve,
+ };
+
+ *normalized = Some(xml_space_normalize(mode, &self.string.borrow()));
+ }
+ }
+
+ fn make_span(
+ &self,
+ node: &Node,
+ values: Rc<ComputedValues>,
+ dx: f64,
+ dy: f64,
+ depth: usize,
+ link_target: Option<String>,
+ ) -> Span {
+ self.ensure_normalized_string(node, &values);
+
+ Span::new(
+ self.space_normalized.borrow().as_ref().unwrap(),
+ values,
+ dx,
+ dy,
+ depth,
+ link_target,
+ )
+ }
+
+ fn to_chunks(
+ &self,
+ node: &Node,
+ values: Rc<ComputedValues>,
+ chunks: &mut [Chunk],
+ dx: f64,
+ dy: f64,
+ depth: usize,
+ link_target: Option<String>,
+ ) {
+ let span = self.make_span(node, values, dx, dy, depth, link_target);
+ let num_chunks = chunks.len();
+ assert!(num_chunks > 0);
+
+ chunks[num_chunks - 1].spans.push(span);
+ }
+
+ pub fn get_string(&self) -> String {
+ self.string.borrow().clone()
+ }
+}
+
+#[derive(Default)]
+pub struct Text {
+ x: Length<Horizontal>,
+ y: Length<Vertical>,
+ dx: Length<Horizontal>,
+ dy: Length<Vertical>,
+}
+
+impl Text {
+ fn make_chunks(
+ &self,
+ node: &Node,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ cascaded: &CascadedValues<'_>,
+ layout_context: &LayoutContext,
+ x: f64,
+ y: f64,
+ ) -> Vec<Chunk> {
+ let mut chunks = Vec::new();
+
+ let values = cascaded.get();
+ let params = NormalizeParams::new(values, &layout_context.viewport);
+
+ chunks.push(Chunk::new(values, Some(x), Some(y)));
+
+ let dx = self.dx.to_user(&params);
+ let dy = self.dy.to_user(&params);
+
+ children_to_chunks(
+ &mut chunks,
+ node,
+ acquired_nodes,
+ cascaded,
+ layout_context,
+ dx,
+ dy,
+ 0,
+ None,
+ );
+ chunks
+ }
+}
+
+impl ElementTrait for Text {
+ fn set_attributes(&mut self, attrs: &Attributes, session: &Session) {
+ for (attr, value) in attrs.iter() {
+ match attr.expanded() {
+ expanded_name!("", "x") => set_attribute(&mut self.x, attr.parse(value), session),
+ expanded_name!("", "y") => set_attribute(&mut self.y, attr.parse(value), session),
+ expanded_name!("", "dx") => set_attribute(&mut self.dx, attr.parse(value), session),
+ expanded_name!("", "dy") => set_attribute(&mut self.dy, attr.parse(value), session),
+ _ => (),
+ }
+ }
+ }
+
+ fn draw(
+ &self,
+ node: &Node,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ cascaded: &CascadedValues<'_>,
+ viewport: &Viewport,
+ draw_ctx: &mut DrawingCtx,
+ clipping: bool,
+ ) -> Result<BoundingBox, RenderingError> {
+ let values = cascaded.get();
+ let params = NormalizeParams::new(values, viewport);
+
+ let elt = node.borrow_element();
+
+ let stacking_ctx = StackingContext::new(
+ draw_ctx.session(),
+ acquired_nodes,
+ &elt,
+ values.transform(),
+ values,
+ );
+
+ let layout_text = {
+ let transform = draw_ctx.get_transform_for_stacking_ctx(&stacking_ctx, clipping)?;
+
+ let layout_context = LayoutContext {
+ writing_mode: values.writing_mode(),
+ transform,
+ font_options: draw_ctx.get_font_options(),
+ viewport: viewport.clone(),
+ session: draw_ctx.session().clone(),
+ };
+
+ let mut x = self.x.to_user(&params);
+ let mut y = self.y.to_user(&params);
+
+ let chunks = self.make_chunks(node, acquired_nodes, cascaded, &layout_context, x, y);
+
+ let mut measured_chunks = Vec::new();
+ for chunk in &chunks {
+ measured_chunks.push(MeasuredChunk::from_chunk(&layout_context, chunk));
+ }
+
+ let mut positioned_chunks = Vec::new();
+ for chunk in &measured_chunks {
+ let chunk_x = chunk.x.unwrap_or(x);
+ let chunk_y = chunk.y.unwrap_or(y);
+
+ let positioned =
+ PositionedChunk::from_measured(&layout_context, chunk, chunk_x, chunk_y);
+
+ x = positioned.next_chunk_x;
+ y = positioned.next_chunk_y;
+
+ positioned_chunks.push(positioned);
+ }
+
+ let mut layout_spans = Vec::new();
+ for chunk in &positioned_chunks {
+ for span in &chunk.spans {
+ layout_spans.push(span.layout(&layout_context, acquired_nodes));
+ }
+ }
+
+ let empty_bbox = BoundingBox::new().with_transform(*transform);
+
+ let text_bbox = layout_spans.iter().fold(empty_bbox, |mut bbox, span| {
+ if let Some(ref span_bbox) = span.bbox {
+ bbox.insert(span_bbox);
+ }
+
+ bbox
+ });
+
+ let mut text_spans = Vec::new();
+ for span in layout_spans {
+ let normalize_values = NormalizeValues::new(&span.values);
+
+ let stroke_paint = span.stroke_paint.to_user_space(
+ &text_bbox.rect,
+ &layout_context.viewport,
+ &normalize_values,
+ );
+ let fill_paint = span.fill_paint.to_user_space(
+ &text_bbox.rect,
+ &layout_context.viewport,
+ &normalize_values,
+ );
+
+ let text_span = TextSpan {
+ layout: span.layout,
+ gravity: span.gravity,
+ bbox: span.bbox,
+ is_visible: span.is_visible,
+ x: span.x,
+ y: span.y,
+ paint_order: span.paint_order,
+ stroke: span.stroke,
+ stroke_paint,
+ fill_paint,
+ text_rendering: span.text_rendering,
+ link_target: span.link_target,
+ };
+
+ text_spans.push(text_span);
+ }
+
+ layout::Text { spans: text_spans }
+ };
+
+ let layer = Layer {
+ kind: LayerKind::Text(Box::new(layout_text)),
+ stacking_ctx,
+ };
+
+ draw_ctx.draw_layer(&layer, acquired_nodes, clipping, viewport)
+ }
+}
+
+#[derive(Default)]
+pub struct TRef {
+ link: Option<NodeId>,
+}
+
+impl TRef {
+ fn to_chunks(
+ &self,
+ node: &Node,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ cascaded: &CascadedValues<'_>,
+ chunks: &mut Vec<Chunk>,
+ depth: usize,
+ layout_context: &LayoutContext,
+ ) {
+ if self.link.is_none() {
+ return;
+ }
+
+ let link = self.link.as_ref().unwrap();
+
+ let values = cascaded.get();
+ if !values.is_displayed() {
+ return;
+ }
+
+ if let Ok(acquired) = acquired_nodes.acquire(link) {
+ let c = acquired.get();
+ extract_chars_children_to_chunks_recursively(chunks, c, Rc::new(values.clone()), depth);
+ } else {
+ rsvg_log!(
+ layout_context.session,
+ "element {} references a nonexistent text source \"{}\"",
+ node,
+ link,
+ );
+ }
+ }
+}
+
+fn extract_chars_children_to_chunks_recursively(
+ chunks: &mut Vec<Chunk>,
+ node: &Node,
+ values: Rc<ComputedValues>,
+ depth: usize,
+) {
+ for child in node.children() {
+ let values = values.clone();
+
+ if child.is_chars() {
+ child
+ .borrow_chars()
+ .to_chunks(&child, values, chunks, 0.0, 0.0, depth, None)
+ } else {
+ extract_chars_children_to_chunks_recursively(chunks, &child, values, depth + 1)
+ }
+ }
+}
+
+impl ElementTrait for TRef {
+ fn set_attributes(&mut self, attrs: &Attributes, _session: &Session) {
+ self.link = attrs
+ .iter()
+ .find(|(attr, _)| attr.expanded() == expanded_name!(xlink "href"))
+ // Unlike other elements which use `href` in SVG2 versus `xlink:href` in SVG1.1,
+ // the <tref> element got removed in SVG2. So, here we still use a match
+ // against the full namespaced version of the attribute.
+ .and_then(|(attr, value)| NodeId::parse(value).attribute(attr).ok());
+ }
+}
+
+#[derive(Default)]
+pub struct TSpan {
+ x: Option<Length<Horizontal>>,
+ y: Option<Length<Vertical>>,
+ dx: Length<Horizontal>,
+ dy: Length<Vertical>,
+}
+
+impl TSpan {
+ fn to_chunks(
+ &self,
+ node: &Node,
+ acquired_nodes: &mut AcquiredNodes<'_>,
+ cascaded: &CascadedValues<'_>,
+ layout_context: &LayoutContext,
+ chunks: &mut Vec<Chunk>,
+ dx: f64,
+ dy: f64,
+ depth: usize,
+ link: Option<String>,
+ ) {
+ let values = cascaded.get();
+ if !values.is_displayed() {
+ return;
+ }
+
+ let params = NormalizeParams::new(values, &layout_context.viewport);
+
+ let x = self.x.map(|l| l.to_user(&params));
+ let y = self.y.map(|l| l.to_user(&params));
+
+ let span_dx = dx + self.dx.to_user(&params);
+ let span_dy = dy + self.dy.to_user(&params);
+
+ if x.is_some() || y.is_some() {
+ chunks.push(Chunk::new(values, x, y));
+ }
+
+ children_to_chunks(
+ chunks,
+ node,
+ acquired_nodes,
+ cascaded,
+ layout_context,
+ span_dx,
+ span_dy,
+ depth,
+ link,
+ );
+ }
+}
+
+impl ElementTrait for TSpan {
+ fn set_attributes(&mut self, attrs: &Attributes, session: &Session) {
+ for (attr, value) in attrs.iter() {
+ match attr.expanded() {
+ expanded_name!("", "x") => set_attribute(&mut self.x, attr.parse(value), session),
+ expanded_name!("", "y") => set_attribute(&mut self.y, attr.parse(value), session),
+ expanded_name!("", "dx") => set_attribute(&mut self.dx, attr.parse(value), session),
+ expanded_name!("", "dy") => set_attribute(&mut self.dy, attr.parse(value), session),
+ _ => (),
+ }
+ }
+ }
+}
+
+impl From<FontStyle> for pango::Style {
+ fn from(s: FontStyle) -> pango::Style {
+ match s {
+ FontStyle::Normal => pango::Style::Normal,
+ FontStyle::Italic => pango::Style::Italic,
+ FontStyle::Oblique => pango::Style::Oblique,
+ }
+ }
+}
+
+impl From<FontVariant> for pango::Variant {
+ fn from(v: FontVariant) -> pango::Variant {
+ match v {
+ FontVariant::Normal => pango::Variant::Normal,
+ FontVariant::SmallCaps => pango::Variant::SmallCaps,
+ }
+ }
+}
+
+impl From<FontStretch> for pango::Stretch {
+ fn from(s: FontStretch) -> pango::Stretch {
+ match s {
+ FontStretch::Normal => pango::Stretch::Normal,
+ FontStretch::Wider => pango::Stretch::Expanded, // not quite correct
+ FontStretch::Narrower => pango::Stretch::Condensed, // not quite correct
+ FontStretch::UltraCondensed => pango::Stretch::UltraCondensed,
+ FontStretch::ExtraCondensed => pango::Stretch::ExtraCondensed,
+ FontStretch::Condensed => pango::Stretch::Condensed,
+ FontStretch::SemiCondensed => pango::Stretch::SemiCondensed,
+ FontStretch::SemiExpanded => pango::Stretch::SemiExpanded,
+ FontStretch::Expanded => pango::Stretch::Expanded,
+ FontStretch::ExtraExpanded => pango::Stretch::ExtraExpanded,
+ FontStretch::UltraExpanded => pango::Stretch::UltraExpanded,
+ }
+ }
+}
+
+impl From<FontWeight> for pango::Weight {
+ fn from(w: FontWeight) -> pango::Weight {
+ pango::Weight::__Unknown(w.numeric_weight().into())
+ }
+}
+
+impl From<Direction> for pango::Direction {
+ fn from(d: Direction) -> pango::Direction {
+ match d {
+ Direction::Ltr => pango::Direction::Ltr,
+ Direction::Rtl => pango::Direction::Rtl,
+ }
+ }
+}
+
+impl From<WritingMode> for pango::Direction {
+ fn from(m: WritingMode) -> pango::Direction {
+ use WritingMode::*;
+ match m {
+ HorizontalTb | VerticalRl | VerticalLr | LrTb | Lr | Tb | TbRl => pango::Direction::Ltr,
+ RlTb | Rl => pango::Direction::Rtl,
+ }
+ }
+}
+
+impl From<WritingMode> for pango::Gravity {
+ fn from(m: WritingMode) -> pango::Gravity {
+ use WritingMode::*;
+ match m {
+ HorizontalTb | LrTb | Lr | RlTb | Rl => pango::Gravity::South,
+ VerticalRl | Tb | TbRl => pango::Gravity::East,
+ VerticalLr => pango::Gravity::West,
+ }
+ }
+}
+
+/// Constants with Unicode's directional formatting characters
+///
+/// <https://unicode.org/reports/tr9/#Directional_Formatting_Characters>
+mod directional_formatting_characters {
+ /// Left-to-Right Embedding
+ ///
+ /// Treat the following text as embedded left-to-right.
+ pub const LRE: char = '\u{202a}';
+
+ /// Right-to-Left Embedding
+ ///
+ /// Treat the following text as embedded right-to-left.
+ pub const RLE: char = '\u{202b}';
+
+ /// Left-to-Right Override
+ ///
+ /// Force following characters to be treated as strong left-to-right characters.
+ pub const LRO: char = '\u{202d}';
+
+ /// Right-to-Left Override
+ ///
+ /// Force following characters to be treated as strong right-to-left characters.
+ pub const RLO: char = '\u{202e}';
+
+ /// Pop Directional Formatting
+ ///
+ /// End the scope of the last LRE, RLE, RLO, or LRO.
+ pub const PDF: char = '\u{202c}';
+
+ /// Left-to-Right Isolate
+ ///
+ /// Treat the following text as isolated and left-to-right.
+ pub const LRI: char = '\u{2066}';
+
+ /// Right-to-Left Isolate
+ ///
+ /// Treat the following text as isolated and right-to-left.
+ pub const RLI: char = '\u{2067}';
+
+ /// First Strong Isolate
+ ///
+ /// Treat the following text as isolated and in the direction of its first strong
+ /// directional character that is not inside a nested isolate.
+ pub const FSI: char = '\u{2068}';
+
+ /// Pop Directional Isolate
+ ///
+ /// End the scope of the last LRI, RLI, or FSI.
+ pub const PDI: char = '\u{2069}';
+}
+
+/// Unicode control characters to be inserted when `unicode-bidi` is specified.
+///
+/// The `unicode-bidi` property is used to change the embedding of a text span within
+/// another. This struct contains slices with the control characters that must be
+/// inserted into the text stream at the span's limits so that the bidi/shaping engine
+/// will know what to do.
+struct BidiControl {
+ start: &'static [char],
+ end: &'static [char],
+}
+
+impl BidiControl {
+ /// Creates a `BidiControl` from the properties that determine it.
+ ///
+ /// See the table titled "Bidi control codes injected..." in
+ /// <https://www.w3.org/TR/css-writing-modes-3/#unicode-bidi>
+ #[rustfmt::skip]
+ fn from_unicode_bidi_and_direction(unicode_bidi: UnicodeBidi, direction: Direction) -> BidiControl {
+ use UnicodeBidi::*;
+ use Direction::*;
+ use directional_formatting_characters::*;
+
+ let (start, end) = match (unicode_bidi, direction) {
+ (Normal, _) => (&[][..], &[][..]),
+ (Embed, Ltr) => (&[LRE][..], &[PDF][..]),
+ (Embed, Rtl) => (&[RLE][..], &[PDF][..]),
+ (Isolate, Ltr) => (&[LRI][..], &[PDI][..]),
+ (Isolate, Rtl) => (&[RLI][..], &[PDI][..]),
+ (BidiOverride, Ltr) => (&[LRO][..], &[PDF][..]),
+ (BidiOverride, Rtl) => (&[RLO][..], &[PDF][..]),
+ (IsolateOverride, Ltr) => (&[FSI, LRO][..], &[PDF, PDI][..]),
+ (IsolateOverride, Rtl) => (&[FSI, RLO][..], &[PDF, PDI][..]),
+ (Plaintext, Ltr) => (&[FSI][..], &[PDI][..]),
+ (Plaintext, Rtl) => (&[FSI][..], &[PDI][..]),
+ };
+
+ BidiControl { start, end }
+ }
+}
+
+/// Prepends and appends Unicode directional formatting characters.
+fn wrap_with_direction_control_chars(s: &str, bidi_control: &BidiControl) -> String {
+ let mut res =
+ String::with_capacity(s.len() + bidi_control.start.len() + bidi_control.end.len());
+
+ for &ch in bidi_control.start {
+ res.push(ch);
+ }
+
+ res.push_str(s);
+
+ for &ch in bidi_control.end {
+ res.push(ch);
+ }
+
+ res
+}
+
+/// Returns `None` if the layout would be invalid due to, for example, out-of-bounds font sizes.
+fn create_pango_layout(
+ layout_context: &LayoutContext,
+ props: &FontProperties,
+ text: &str,
+) -> Option<pango::Layout> {
+ let pango_context =
+ create_pango_context(&layout_context.font_options, &layout_context.transform);
+
+ if let XmlLang(Some(ref lang)) = props.xml_lang {
+ pango_context.set_language(Some(&pango::Language::from_string(lang.as_str())));
+ }
+
+ pango_context.set_base_gravity(pango::Gravity::from(layout_context.writing_mode));
+
+ match (props.unicode_bidi, props.direction) {
+ (UnicodeBidi::BidiOverride, _) | (UnicodeBidi::Embed, _) => {
+ pango_context.set_base_dir(pango::Direction::from(props.direction));
+ }
+
+ (_, direction) if direction != Direction::Ltr => {
+ pango_context.set_base_dir(pango::Direction::from(direction));
+ }
+
+ (_, _) => {
+ pango_context.set_base_dir(pango::Direction::from(layout_context.writing_mode));
+ }
+ }
+
+ let layout = pango::Layout::new(&pango_context);
+
+ let font_size = PangoUnits::from_pixels(props.font_size);
+ let letter_spacing = PangoUnits::from_pixels(props.letter_spacing);
+
+ if font_size.is_none() {
+ rsvg_log!(
+ &layout_context.session,
+ "font-size {} is out of bounds; ignoring span",
+ props.font_size
+ );
+ }
+
+ if letter_spacing.is_none() {
+ rsvg_log!(
+ &layout_context.session,
+ "letter-spacing {} is out of bounds; ignoring span",
+ props.letter_spacing
+ );
+ }
+
+ if let (Some(font_size), Some(letter_spacing)) = (font_size, letter_spacing) {
+ let attr_list = pango::AttrList::new();
+ add_pango_attributes(&attr_list, props, 0, text.len(), font_size, letter_spacing);
+
+ layout.set_attributes(Some(&attr_list));
+ layout.set_text(text);
+ layout.set_auto_dir(false);
+
+ Some(layout)
+ } else {
+ None
+ }
+}
+
+/// Adds Pango attributes, suitable for a span of text, to an `AttrList`.
+fn add_pango_attributes(
+ attr_list: &pango::AttrList,
+ props: &FontProperties,
+ start_index: usize,
+ end_index: usize,
+ font_size: PangoUnits,
+ letter_spacing: PangoUnits,
+) {
+ let start_index = u32::try_from(start_index).expect("Pango attribute index must fit in u32");
+ let end_index = u32::try_from(end_index).expect("Pango attribute index must fit in u32");
+ assert!(start_index <= end_index);
+
+ let mut attributes = Vec::new();
+
+ let mut font_desc = pango::FontDescription::new();
+ font_desc.set_family(props.font_family.as_str());
+ font_desc.set_style(pango::Style::from(props.font_style));
+
+ // PANGO_VARIANT_SMALL_CAPS does nothing: https://gitlab.gnome.org/GNOME/pango/-/issues/566
+ // see below for using the "smcp" OpenType feature for fonts that support it.
+ // font_desc.set_variant(pango::Variant::from(props.font_variant));
+
+ font_desc.set_weight(pango::Weight::from(props.font_weight));
+ font_desc.set_stretch(pango::Stretch::from(props.font_stretch));
+
+ font_desc.set_size(font_size.0);
+
+ attributes.push(pango::AttrFontDesc::new(&font_desc).upcast());
+
+ attributes.push(pango::AttrInt::new_letter_spacing(letter_spacing.0).upcast());
+
+ if props.text_decoration.overline {
+ attributes.push(pango::AttrInt::new_overline(pango::Overline::Single).upcast());
+ }
+
+ if props.text_decoration.underline {
+ attributes.push(pango::AttrInt::new_underline(pango::Underline::Single).upcast());
+ }
+
+ if props.text_decoration.strike {
+ attributes.push(pango::AttrInt::new_strikethrough(true).upcast());
+ }
+
+ // FIXME: Using the "smcp" OpenType feature only works for fonts that support it. We
+ // should query if the font supports small caps, and synthesize them if it doesn't.
+ if props.font_variant == FontVariant::SmallCaps {
+ // smcp - small capitals - https://docs.microsoft.com/en-ca/typography/opentype/spec/features_pt#smcp
+ attributes.push(pango::AttrFontFeatures::new("'smcp' 1").upcast());
+ }
+
+ // Set the range in each attribute
+
+ for attr in &mut attributes {
+ attr.set_start_index(start_index);
+ attr.set_end_index(end_index);
+ }
+
+ // Add the attributes to the attr_list
+
+ for attr in attributes {
+ attr_list.insert(attr);
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn chars_default() {
+ let c = Chars::default();
+ assert!(c.is_empty());
+ assert!(c.space_normalized.borrow().is_none());
+ }
+
+ #[test]
+ fn chars_new() {
+ let example = "Test 123";
+ let c = Chars::new(example);
+ assert_eq!(c.get_string(), example);
+ assert!(c.space_normalized.borrow().is_none());
+ }
+
+ // This is called _horizontal because the property value in "CSS Writing Modes 3"
+ // is `horizontal-tb`. Eventually we will support that and this will make more sense.
+ #[test]
+ fn adjusted_advance_horizontal_ltr() {
+ use Direction::*;
+ use TextAnchor::*;
+
+ assert_eq!(
+ text_anchor_offset(
+ Start,
+ Ltr,
+ WritingMode::Lr,
+ Rect::from_size(1.0, 2.0).translate((5.0, 6.0))
+ ),
+ (-5.0, 0.0)
+ );
+
+ assert_eq!(
+ text_anchor_offset(
+ Middle,
+ Ltr,
+ WritingMode::Lr,
+ Rect::from_size(1.0, 2.0).translate((5.0, 6.0))
+ ),
+ (-5.5, 0.0)
+ );
+
+ assert_eq!(
+ text_anchor_offset(
+ End,
+ Ltr,
+ WritingMode::Lr,
+ Rect::from_size(1.0, 2.0).translate((5.0, 6.0))
+ ),
+ (-6.0, 0.0)
+ );
+ }
+
+ #[test]
+ fn adjusted_advance_horizontal_rtl() {
+ use Direction::*;
+ use TextAnchor::*;
+
+ assert_eq!(
+ text_anchor_offset(
+ Start,
+ Rtl,
+ WritingMode::Rl,
+ Rect::from_size(1.0, 2.0).translate((5.0, 6.0))
+ ),
+ (-6.0, 0.0)
+ );
+ assert_eq!(
+ text_anchor_offset(
+ Middle,
+ Rtl,
+ WritingMode::Rl,
+ Rect::from_size(1.0, 2.0).translate((5.0, 6.0))
+ ),
+ (-5.5, 0.0)
+ );
+ assert_eq!(
+ text_anchor_offset(
+ TextAnchor::End,
+ Direction::Rtl,
+ WritingMode::Rl,
+ Rect::from_size(1.0, 2.0).translate((5.0, 6.0))
+ ),
+ (-5.0, 0.0)
+ );
+ }
+
+ // This is called _vertical because "CSS Writing Modes 3" has both `vertical-rl` (East
+ // Asia), and `vertical-lr` (Manchu, Mongolian), but librsvg does not support block
+ // flow direction properly yet. Eventually we will support that and this will make
+ // more sense.
+ #[test]
+ fn adjusted_advance_vertical() {
+ use Direction::*;
+ use TextAnchor::*;
+
+ assert_eq!(
+ text_anchor_offset(Start, Ltr, WritingMode::Tb, Rect::from_size(2.0, 4.0)),
+ (0.0, 0.0)
+ );
+
+ assert_eq!(
+ text_anchor_offset(Middle, Ltr, WritingMode::Tb, Rect::from_size(2.0, 4.0)),
+ (0.0, -2.0)
+ );
+
+ assert_eq!(
+ text_anchor_offset(End, Ltr, WritingMode::Tb, Rect::from_size(2.0, 4.0)),
+ (0.0, -4.0)
+ );
+ }
+
+ #[test]
+ fn pango_units_works() {
+ assert_eq!(PangoUnits::from_pixels(10.0).unwrap().0, pango::SCALE * 10);
+ }
+
+ #[test]
+ fn pango_units_detects_overflow() {
+ assert!(PangoUnits::from_pixels(1e7).is_none());
+ }
+}
diff --git a/rsvg/src/transform.rs b/rsvg/src/transform.rs
new file mode 100644
index 00000000..9f6c6789
--- /dev/null
+++ b/rsvg/src/transform.rs
@@ -0,0 +1,1127 @@
+//! Handling of transform values.
+//!
+//! This module contains the following:
+//!
+//! * [`Transform`] to represent 2D transforms in general; it's just a matrix.
+//!
+//! * [`TransformProperty`] for the [`transform` property][prop] in SVG2/CSS3.
+//!
+//! * [`Transform`] also handles the [`transform` attribute][attr] in SVG1.1, which has a different
+//! grammar than the `transform` property from SVG2.
+//!
+//! [prop]: https://www.w3.org/TR/css-transforms-1/#transform-property
+//! [attr]: https://www.w3.org/TR/SVG11/coords.html#TransformAttribute
+
+use cssparser::{Parser, Token};
+use std::ops::Deref;
+
+use crate::angle::Angle;
+use crate::error::*;
+use crate::length::*;
+use crate::parsers::{optional_comma, Parse};
+use crate::properties::ComputedValues;
+use crate::property_macros::Property;
+use crate::rect::Rect;
+
+/// A transform that has been checked to be invertible.
+///
+/// We need to validate user-supplied transforms before setting them on Cairo,
+/// so we use this type for that.
+#[derive(Debug, Copy, Clone, PartialEq)]
+pub struct ValidTransform(Transform);
+
+impl TryFrom<Transform> for ValidTransform {
+ type Error = InvalidTransform;
+
+ /// Validates a [`Transform`] before converting it to a [`ValidTransform`].
+ ///
+ /// A transform is valid if it is invertible. For example, a
+ /// matrix with all-zeros is not invertible, and it is invalid.
+ fn try_from(t: Transform) -> Result<ValidTransform, InvalidTransform> {
+ if t.is_invertible() {
+ Ok(ValidTransform(t))
+ } else {
+ Err(InvalidTransform)
+ }
+ }
+}
+
+impl Deref for ValidTransform {
+ type Target = Transform;
+
+ fn deref(&self) -> &Transform {
+ &self.0
+ }
+}
+
+/// A 2D transformation matrix.
+#[derive(Debug, Copy, Clone, PartialEq)]
+pub struct Transform {
+ pub xx: f64,
+ pub yx: f64,
+ pub xy: f64,
+ pub yy: f64,
+ pub x0: f64,
+ pub y0: f64,
+}
+
+/// The `transform` property from the CSS Transforms Module Level 1.
+///
+/// CSS Transforms 1: <https://www.w3.org/TR/css-transforms-1/#transform-property>
+#[derive(Debug, Default, Clone, PartialEq)]
+pub enum TransformProperty {
+ #[default]
+ None,
+ List(Vec<TransformFunction>),
+}
+
+/// The `transform` attribute from SVG1.1
+///
+/// SVG1.1: <https://www.w3.org/TR/SVG11/coords.html#TransformAttribute>
+#[derive(Copy, Clone, Default, Debug, PartialEq)]
+pub struct TransformAttribute(Transform);
+
+impl Property for TransformProperty {
+ fn inherits_automatically() -> bool {
+ false
+ }
+
+ fn compute(&self, _v: &ComputedValues) -> Self {
+ self.clone()
+ }
+}
+
+impl TransformProperty {
+ pub fn to_transform(&self) -> Transform {
+ // From the spec (https://www.w3.org/TR/css-transforms-1/#current-transformation-matrix):
+ // Start with the identity matrix.
+ // TODO: implement (#685) - Translate by the computed X and Y of transform-origin
+ // Multiply by each of the transform functions in transform property from left to right
+ // TODO: implement - Translate by the negated computed X and Y values of transform-origin
+
+ match self {
+ TransformProperty::None => Transform::identity(),
+
+ TransformProperty::List(l) => {
+ let mut final_transform = Transform::identity();
+
+ for f in l.iter() {
+ use TransformFunction::*;
+
+ let transform_matrix = match f {
+ Matrix(trans_matrix) => *trans_matrix,
+ Translate(h, v) => Transform::new_translate(h.length, v.length),
+ TranslateX(h) => Transform::new_translate(h.length, 0.0),
+ TranslateY(v) => Transform::new_translate(0.0, v.length),
+ Scale(x, y) => Transform::new_scale(*x, *y),
+ ScaleX(x) => Transform::new_scale(*x, 1.0),
+ ScaleY(y) => Transform::new_scale(1.0, *y),
+ Rotate(a) => Transform::new_rotate(*a),
+ Skew(ax, ay) => Transform::new_skew(*ax, *ay),
+ SkewX(ax) => Transform::new_skew(*ax, Angle::new(0.0)),
+ SkewY(ay) => Transform::new_skew(Angle::new(0.0), *ay),
+ };
+ final_transform = transform_matrix.post_transform(&final_transform);
+ }
+
+ final_transform
+ }
+ }
+ }
+}
+
+// https://www.w3.org/TR/css-transforms-1/#typedef-transform-function
+#[derive(Debug, Clone, PartialEq)]
+pub enum TransformFunction {
+ Matrix(Transform),
+ Translate(Length<Horizontal>, Length<Vertical>),
+ TranslateX(Length<Horizontal>),
+ TranslateY(Length<Vertical>),
+ Scale(f64, f64),
+ ScaleX(f64),
+ ScaleY(f64),
+ Rotate(Angle),
+ Skew(Angle, Angle),
+ SkewX(Angle),
+ SkewY(Angle),
+}
+
+impl Parse for TransformProperty {
+ fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<TransformProperty, ParseError<'i>> {
+ if parser
+ .try_parse(|p| p.expect_ident_matching("none"))
+ .is_ok()
+ {
+ Ok(TransformProperty::None)
+ } else {
+ let t = parse_transform_prop_function_list(parser)?;
+
+ Ok(TransformProperty::List(t))
+ }
+ }
+}
+
+fn parse_transform_prop_function_list<'i>(
+ parser: &mut Parser<'i, '_>,
+) -> Result<Vec<TransformFunction>, ParseError<'i>> {
+ let mut v = Vec::<TransformFunction>::new();
+
+ loop {
+ v.push(parse_transform_prop_function_command(parser)?);
+
+ if parser.is_exhausted() {
+ break;
+ }
+ }
+
+ Ok(v)
+}
+
+fn parse_transform_prop_function_command<'i>(
+ parser: &mut Parser<'i, '_>,
+) -> Result<TransformFunction, ParseError<'i>> {
+ let loc = parser.current_source_location();
+
+ match parser.next()?.clone() {
+ Token::Function(ref name) => parse_transform_prop_function_internal(name, parser),
+ tok => Err(loc.new_unexpected_token_error(tok.clone())),
+ }
+}
+
+fn parse_transform_prop_function_internal<'i>(
+ name: &str,
+ parser: &mut Parser<'i, '_>,
+) -> Result<TransformFunction, ParseError<'i>> {
+ let loc = parser.current_source_location();
+
+ match name {
+ "matrix" => parse_prop_matrix_args(parser),
+ "translate" => parse_prop_translate_args(parser),
+ "translateX" => parse_prop_translate_x_args(parser),
+ "translateY" => parse_prop_translate_y_args(parser),
+ "scale" => parse_prop_scale_args(parser),
+ "scaleX" => parse_prop_scale_x_args(parser),
+ "scaleY" => parse_prop_scale_y_args(parser),
+ "rotate" => parse_prop_rotate_args(parser),
+ "skew" => parse_prop_skew_args(parser),
+ "skewX" => parse_prop_skew_x_args(parser),
+ "skewY" => parse_prop_skew_y_args(parser),
+ _ => Err(loc.new_custom_error(ValueErrorKind::parse_error(
+ "expected matrix|translate|translateX|translateY|scale|scaleX|scaleY|rotate|skewX|skewY",
+ ))),
+ }
+}
+
+fn parse_prop_matrix_args<'i>(
+ parser: &mut Parser<'i, '_>,
+) -> Result<TransformFunction, ParseError<'i>> {
+ parser.parse_nested_block(|p| {
+ let xx = f64::parse(p)?;
+ p.expect_comma()?;
+ let yx = f64::parse(p)?;
+ p.expect_comma()?;
+ let xy = f64::parse(p)?;
+ p.expect_comma()?;
+ let yy = f64::parse(p)?;
+ p.expect_comma()?;
+ let x0 = f64::parse(p)?;
+ p.expect_comma()?;
+ let y0 = f64::parse(p)?;
+
+ Ok(TransformFunction::Matrix(Transform::new_unchecked(
+ xx, yx, xy, yy, x0, y0,
+ )))
+ })
+}
+
+fn length_is_in_pixels<N: Normalize>(l: &Length<N>) -> bool {
+ l.unit == LengthUnit::Px
+}
+
+fn only_pixels_error<'i>(loc: cssparser::SourceLocation) -> ParseError<'i> {
+ loc.new_custom_error(ValueErrorKind::parse_error(
+ "only translations in pixels are supported for now",
+ ))
+}
+
+fn parse_prop_translate_args<'i>(
+ parser: &mut Parser<'i, '_>,
+) -> Result<TransformFunction, ParseError<'i>> {
+ parser.parse_nested_block(|p| {
+ let loc = p.current_source_location();
+
+ let tx: Length<Horizontal> = Length::parse(p)?;
+
+ let ty: Length<Vertical> = if p.try_parse(|p| p.expect_comma()).is_ok() {
+ Length::parse(p)?
+ } else {
+ Length::new(0.0, LengthUnit::Px)
+ };
+
+ if !(length_is_in_pixels(&tx) && length_is_in_pixels(&ty)) {
+ return Err(only_pixels_error(loc));
+ }
+
+ Ok(TransformFunction::Translate(tx, ty))
+ })
+}
+
+fn parse_prop_translate_x_args<'i>(
+ parser: &mut Parser<'i, '_>,
+) -> Result<TransformFunction, ParseError<'i>> {
+ parser.parse_nested_block(|p| {
+ let loc = p.current_source_location();
+
+ let tx: Length<Horizontal> = Length::parse(p)?;
+
+ if !length_is_in_pixels(&tx) {
+ return Err(only_pixels_error(loc));
+ }
+
+ Ok(TransformFunction::TranslateX(tx))
+ })
+}
+
+fn parse_prop_translate_y_args<'i>(
+ parser: &mut Parser<'i, '_>,
+) -> Result<TransformFunction, ParseError<'i>> {
+ parser.parse_nested_block(|p| {
+ let loc = p.current_source_location();
+
+ let ty: Length<Vertical> = Length::parse(p)?;
+
+ if !length_is_in_pixels(&ty) {
+ return Err(only_pixels_error(loc));
+ }
+
+ Ok(TransformFunction::TranslateY(ty))
+ })
+}
+
+fn parse_prop_scale_args<'i>(
+ parser: &mut Parser<'i, '_>,
+) -> Result<TransformFunction, ParseError<'i>> {
+ parser.parse_nested_block(|p| {
+ let x = f64::parse(p)?;
+
+ let y = if p.try_parse(|p| p.expect_comma()).is_ok() {
+ f64::parse(p)?
+ } else {
+ x
+ };
+
+ Ok(TransformFunction::Scale(x, y))
+ })
+}
+
+fn parse_prop_scale_x_args<'i>(
+ parser: &mut Parser<'i, '_>,
+) -> Result<TransformFunction, ParseError<'i>> {
+ parser.parse_nested_block(|p| {
+ let x = f64::parse(p)?;
+
+ Ok(TransformFunction::ScaleX(x))
+ })
+}
+
+fn parse_prop_scale_y_args<'i>(
+ parser: &mut Parser<'i, '_>,
+) -> Result<TransformFunction, ParseError<'i>> {
+ parser.parse_nested_block(|p| {
+ let y = f64::parse(p)?;
+
+ Ok(TransformFunction::ScaleY(y))
+ })
+}
+
+fn parse_prop_rotate_args<'i>(
+ parser: &mut Parser<'i, '_>,
+) -> Result<TransformFunction, ParseError<'i>> {
+ parser.parse_nested_block(|p| {
+ let angle = Angle::parse(p)?;
+
+ Ok(TransformFunction::Rotate(angle))
+ })
+}
+
+fn parse_prop_skew_args<'i>(
+ parser: &mut Parser<'i, '_>,
+) -> Result<TransformFunction, ParseError<'i>> {
+ parser.parse_nested_block(|p| {
+ let ax = Angle::parse(p)?;
+
+ let ay = if p.try_parse(|p| p.expect_comma()).is_ok() {
+ Angle::parse(p)?
+ } else {
+ Angle::from_degrees(0.0)
+ };
+
+ Ok(TransformFunction::Skew(ax, ay))
+ })
+}
+
+fn parse_prop_skew_x_args<'i>(
+ parser: &mut Parser<'i, '_>,
+) -> Result<TransformFunction, ParseError<'i>> {
+ parser.parse_nested_block(|p| {
+ let angle = Angle::parse(p)?;
+ Ok(TransformFunction::SkewX(angle))
+ })
+}
+
+fn parse_prop_skew_y_args<'i>(
+ parser: &mut Parser<'i, '_>,
+) -> Result<TransformFunction, ParseError<'i>> {
+ parser.parse_nested_block(|p| {
+ let angle = Angle::parse(p)?;
+ Ok(TransformFunction::SkewY(angle))
+ })
+}
+
+impl Transform {
+ #[inline]
+ pub fn new_unchecked(xx: f64, yx: f64, xy: f64, yy: f64, x0: f64, y0: f64) -> Self {
+ Self {
+ xx,
+ yx,
+ xy,
+ yy,
+ x0,
+ y0,
+ }
+ }
+
+ #[inline]
+ pub fn identity() -> Self {
+ Self::new_unchecked(1.0, 0.0, 0.0, 1.0, 0.0, 0.0)
+ }
+
+ #[inline]
+ pub fn new_translate(tx: f64, ty: f64) -> Self {
+ Self::new_unchecked(1.0, 0.0, 0.0, 1.0, tx, ty)
+ }
+
+ #[inline]
+ pub fn new_scale(sx: f64, sy: f64) -> Self {
+ Self::new_unchecked(sx, 0.0, 0.0, sy, 0.0, 0.0)
+ }
+
+ #[inline]
+ pub fn new_rotate(a: Angle) -> Self {
+ let (s, c) = a.radians().sin_cos();
+ Self::new_unchecked(c, s, -s, c, 0.0, 0.0)
+ }
+
+ #[inline]
+ pub fn new_skew(ax: Angle, ay: Angle) -> Self {
+ Self::new_unchecked(1.0, ay.radians().tan(), ax.radians().tan(), 1.0, 0.0, 0.0)
+ }
+
+ #[must_use]
+ pub fn multiply(t1: &Transform, t2: &Transform) -> Self {
+ #[allow(clippy::suspicious_operation_groupings)]
+ Transform {
+ xx: t1.xx * t2.xx + t1.yx * t2.xy,
+ yx: t1.xx * t2.yx + t1.yx * t2.yy,
+ xy: t1.xy * t2.xx + t1.yy * t2.xy,
+ yy: t1.xy * t2.yx + t1.yy * t2.yy,
+ x0: t1.x0 * t2.xx + t1.y0 * t2.xy + t2.x0,
+ y0: t1.x0 * t2.yx + t1.y0 * t2.yy + t2.y0,
+ }
+ }
+
+ #[inline]
+ pub fn pre_transform(&self, t: &Transform) -> Self {
+ Self::multiply(t, self)
+ }
+
+ #[inline]
+ pub fn post_transform(&self, t: &Transform) -> Self {
+ Self::multiply(self, t)
+ }
+
+ #[inline]
+ pub fn pre_translate(&self, x: f64, y: f64) -> Self {
+ self.pre_transform(&Transform::new_translate(x, y))
+ }
+
+ #[inline]
+ pub fn pre_scale(&self, sx: f64, sy: f64) -> Self {
+ self.pre_transform(&Transform::new_scale(sx, sy))
+ }
+
+ #[inline]
+ pub fn pre_rotate(&self, angle: Angle) -> Self {
+ self.pre_transform(&Transform::new_rotate(angle))
+ }
+
+ #[inline]
+ pub fn post_translate(&self, x: f64, y: f64) -> Self {
+ self.post_transform(&Transform::new_translate(x, y))
+ }
+
+ #[inline]
+ pub fn post_scale(&self, sx: f64, sy: f64) -> Self {
+ self.post_transform(&Transform::new_scale(sx, sy))
+ }
+
+ #[inline]
+ pub fn post_rotate(&self, angle: Angle) -> Self {
+ self.post_transform(&Transform::new_rotate(angle))
+ }
+
+ #[inline]
+ fn determinant(&self) -> f64 {
+ self.xx * self.yy - self.xy * self.yx
+ }
+
+ #[inline]
+ pub fn is_invertible(&self) -> bool {
+ let det = self.determinant();
+
+ det != 0.0 && det.is_finite()
+ }
+
+ #[must_use]
+ pub fn invert(&self) -> Option<Self> {
+ let det = self.determinant();
+
+ if det == 0.0 || !det.is_finite() {
+ return None;
+ }
+
+ let inv_det = 1.0 / det;
+
+ Some(Transform::new_unchecked(
+ inv_det * self.yy,
+ inv_det * (-self.yx),
+ inv_det * (-self.xy),
+ inv_det * self.xx,
+ inv_det * (self.xy * self.y0 - self.yy * self.x0),
+ inv_det * (self.yx * self.x0 - self.xx * self.y0),
+ ))
+ }
+
+ #[inline]
+ pub fn transform_distance(&self, dx: f64, dy: f64) -> (f64, f64) {
+ (dx * self.xx + dy * self.xy, dx * self.yx + dy * self.yy)
+ }
+
+ #[inline]
+ pub fn transform_point(&self, px: f64, py: f64) -> (f64, f64) {
+ let (x, y) = self.transform_distance(px, py);
+ (x + self.x0, y + self.y0)
+ }
+
+ pub fn transform_rect(&self, rect: &Rect) -> Rect {
+ let points = [
+ self.transform_point(rect.x0, rect.y0),
+ self.transform_point(rect.x1, rect.y0),
+ self.transform_point(rect.x0, rect.y1),
+ self.transform_point(rect.x1, rect.y1),
+ ];
+
+ let (mut xmin, mut ymin, mut xmax, mut ymax) = {
+ let (x, y) = points[0];
+
+ (x, y, x, y)
+ };
+
+ for &(x, y) in points.iter().skip(1) {
+ if x < xmin {
+ xmin = x;
+ }
+
+ if x > xmax {
+ xmax = x;
+ }
+
+ if y < ymin {
+ ymin = y;
+ }
+
+ if y > ymax {
+ ymax = y;
+ }
+ }
+
+ Rect {
+ x0: xmin,
+ y0: ymin,
+ x1: xmax,
+ y1: ymax,
+ }
+ }
+}
+
+impl Default for Transform {
+ #[inline]
+ fn default() -> Transform {
+ Transform::identity()
+ }
+}
+
+impl TransformAttribute {
+ pub fn to_transform(self) -> Transform {
+ self.0
+ }
+}
+
+impl Parse for TransformAttribute {
+ fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<TransformAttribute, ParseError<'i>> {
+ Ok(TransformAttribute(parse_transform_list(parser)?))
+ }
+}
+
+fn parse_transform_list<'i>(parser: &mut Parser<'i, '_>) -> Result<Transform, ParseError<'i>> {
+ let mut t = Transform::identity();
+
+ loop {
+ if parser.is_exhausted() {
+ break;
+ }
+
+ t = parse_transform_command(parser)?.post_transform(&t);
+ optional_comma(parser);
+ }
+
+ Ok(t)
+}
+
+fn parse_transform_command<'i>(parser: &mut Parser<'i, '_>) -> Result<Transform, ParseError<'i>> {
+ let loc = parser.current_source_location();
+
+ match parser.next()?.clone() {
+ Token::Function(ref name) => parse_transform_function(name, parser),
+
+ Token::Ident(ref name) => {
+ parser.expect_parenthesis_block()?;
+ parse_transform_function(name, parser)
+ }
+
+ tok => Err(loc.new_unexpected_token_error(tok.clone())),
+ }
+}
+
+fn parse_transform_function<'i>(
+ name: &str,
+ parser: &mut Parser<'i, '_>,
+) -> Result<Transform, ParseError<'i>> {
+ let loc = parser.current_source_location();
+
+ match name {
+ "matrix" => parse_matrix_args(parser),
+ "translate" => parse_translate_args(parser),
+ "scale" => parse_scale_args(parser),
+ "rotate" => parse_rotate_args(parser),
+ "skewX" => parse_skew_x_args(parser),
+ "skewY" => parse_skew_y_args(parser),
+ _ => Err(loc.new_custom_error(ValueErrorKind::parse_error(
+ "expected matrix|translate|scale|rotate|skewX|skewY",
+ ))),
+ }
+}
+
+fn parse_matrix_args<'i>(parser: &mut Parser<'i, '_>) -> Result<Transform, ParseError<'i>> {
+ parser.parse_nested_block(|p| {
+ let xx = f64::parse(p)?;
+ optional_comma(p);
+
+ let yx = f64::parse(p)?;
+ optional_comma(p);
+
+ let xy = f64::parse(p)?;
+ optional_comma(p);
+
+ let yy = f64::parse(p)?;
+ optional_comma(p);
+
+ let x0 = f64::parse(p)?;
+ optional_comma(p);
+
+ let y0 = f64::parse(p)?;
+
+ Ok(Transform::new_unchecked(xx, yx, xy, yy, x0, y0))
+ })
+}
+
+fn parse_translate_args<'i>(parser: &mut Parser<'i, '_>) -> Result<Transform, ParseError<'i>> {
+ parser.parse_nested_block(|p| {
+ let tx = f64::parse(p)?;
+
+ let ty = p
+ .try_parse(|p| {
+ optional_comma(p);
+ f64::parse(p)
+ })
+ .unwrap_or(0.0);
+
+ Ok(Transform::new_translate(tx, ty))
+ })
+}
+
+fn parse_scale_args<'i>(parser: &mut Parser<'i, '_>) -> Result<Transform, ParseError<'i>> {
+ parser.parse_nested_block(|p| {
+ let x = f64::parse(p)?;
+
+ let y = p
+ .try_parse(|p| {
+ optional_comma(p);
+ f64::parse(p)
+ })
+ .unwrap_or(x);
+
+ Ok(Transform::new_scale(x, y))
+ })
+}
+
+fn parse_rotate_args<'i>(parser: &mut Parser<'i, '_>) -> Result<Transform, ParseError<'i>> {
+ parser.parse_nested_block(|p| {
+ let angle = Angle::from_degrees(f64::parse(p)?);
+
+ let (tx, ty) = p
+ .try_parse(|p| -> Result<_, ParseError<'_>> {
+ optional_comma(p);
+ let tx = f64::parse(p)?;
+
+ optional_comma(p);
+ let ty = f64::parse(p)?;
+
+ Ok((tx, ty))
+ })
+ .unwrap_or((0.0, 0.0));
+
+ Ok(Transform::new_translate(tx, ty)
+ .pre_rotate(angle)
+ .pre_translate(-tx, -ty))
+ })
+}
+
+fn parse_skew_x_args<'i>(parser: &mut Parser<'i, '_>) -> Result<Transform, ParseError<'i>> {
+ parser.parse_nested_block(|p| {
+ let angle = Angle::from_degrees(f64::parse(p)?);
+ Ok(Transform::new_skew(angle, Angle::new(0.0)))
+ })
+}
+
+fn parse_skew_y_args<'i>(parser: &mut Parser<'i, '_>) -> Result<Transform, ParseError<'i>> {
+ parser.parse_nested_block(|p| {
+ let angle = Angle::from_degrees(f64::parse(p)?);
+ Ok(Transform::new_skew(Angle::new(0.0), angle))
+ })
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+ use float_cmp::ApproxEq;
+ use std::f64;
+
+ fn rotation_transform(deg: f64, tx: f64, ty: f64) -> Transform {
+ Transform::new_translate(tx, ty)
+ .pre_rotate(Angle::from_degrees(deg))
+ .pre_translate(-tx, -ty)
+ }
+
+ fn parse_transform(s: &str) -> Result<Transform, ParseError<'_>> {
+ let transform_attr = TransformAttribute::parse_str(s)?;
+ Ok(transform_attr.to_transform())
+ }
+
+ fn parse_transform_prop(s: &str) -> Result<TransformProperty, ParseError<'_>> {
+ TransformProperty::parse_str(s)
+ }
+
+ fn assert_transform_eq(t1: &Transform, t2: &Transform) {
+ let epsilon = 8.0 * f64::EPSILON; // kind of arbitrary, but allow for some sloppiness
+
+ assert!(t1.xx.approx_eq(t2.xx, (epsilon, 1)));
+ assert!(t1.yx.approx_eq(t2.yx, (epsilon, 1)));
+ assert!(t1.xy.approx_eq(t2.xy, (epsilon, 1)));
+ assert!(t1.yy.approx_eq(t2.yy, (epsilon, 1)));
+ assert!(t1.x0.approx_eq(t2.x0, (epsilon, 1)));
+ assert!(t1.y0.approx_eq(t2.y0, (epsilon, 1)));
+ }
+
+ #[test]
+ fn test_multiply() {
+ let t1 = Transform::identity();
+ let t2 = Transform::new_unchecked(1.0, 2.0, 3.0, 4.0, 5.0, 6.0);
+ assert_transform_eq(&Transform::multiply(&t1, &t2), &t2);
+ assert_transform_eq(&Transform::multiply(&t2, &t1), &t2);
+
+ let t1 = Transform::new_unchecked(1.0, 2.0, 3.0, 4.0, 5.0, 6.0);
+ let t2 = Transform::new_unchecked(0.0, 0.0, 0.0, 0.0, 0.0, 0.0);
+ let r = Transform::new_unchecked(0.0, 0.0, 0.0, 0.0, 5.0, 6.0);
+ assert_transform_eq(&Transform::multiply(&t1, &t2), &t2);
+ assert_transform_eq(&Transform::multiply(&t2, &t1), &r);
+
+ let t1 = Transform::new_unchecked(0.5, 0.0, 0.0, 0.5, 10.0, 10.0);
+ let t2 = Transform::new_unchecked(1.0, 0.0, 0.0, 1.0, -10.0, -10.0);
+ let r1 = Transform::new_unchecked(0.5, 0.0, 0.0, 0.5, 0.0, 0.0);
+ let r2 = Transform::new_unchecked(0.5, 0.0, 0.0, 0.5, 5.0, 5.0);
+ assert_transform_eq(&Transform::multiply(&t1, &t2), &r1);
+ assert_transform_eq(&Transform::multiply(&t2, &t1), &r2);
+ }
+
+ #[test]
+ fn test_invert() {
+ let t = Transform::new_unchecked(2.0, 0.0, 0.0, 0.0, 0.0, 0.0);
+ assert!(!t.is_invertible());
+ assert!(t.invert().is_none());
+
+ let t = Transform::identity();
+ assert!(t.is_invertible());
+ assert!(t.invert().is_some());
+ let i = t.invert().unwrap();
+ assert_transform_eq(&i, &Transform::identity());
+
+ let t = Transform::new_unchecked(1.0, 2.0, 3.0, 4.0, 5.0, 6.0);
+ assert!(t.is_invertible());
+ assert!(t.invert().is_some());
+ let i = t.invert().unwrap();
+ assert_transform_eq(&t.pre_transform(&i), &Transform::identity());
+ assert_transform_eq(&t.post_transform(&i), &Transform::identity());
+ }
+
+ #[test]
+ pub fn test_transform_point() {
+ let t = Transform::new_translate(10.0, 10.0);
+ assert_eq!((11.0, 11.0), t.transform_point(1.0, 1.0));
+ }
+
+ #[test]
+ pub fn test_transform_distance() {
+ let t = Transform::new_translate(10.0, 10.0).pre_scale(2.0, 1.0);
+ assert_eq!((2.0, 1.0), t.transform_distance(1.0, 1.0));
+ }
+
+ #[test]
+ fn parses_valid_transform() {
+ let t = Transform::new_unchecked(1.0, 0.0, 0.0, 1.0, 20.0, 30.0);
+ let s = Transform::new_unchecked(10.0, 0.0, 0.0, 10.0, 0.0, 0.0);
+ let r = rotation_transform(30.0, 10.0, 10.0);
+
+ let a = Transform::multiply(&s, &t);
+ assert_transform_eq(
+ &parse_transform("translate(20, 30), scale (10) rotate (30 10 10)").unwrap(),
+ &Transform::multiply(&r, &a),
+ );
+ }
+
+ fn assert_parse_error(s: &str) {
+ assert!(parse_transform(s).is_err());
+ }
+
+ #[test]
+ fn syntax_error_yields_parse_error() {
+ assert_parse_error("foo");
+ assert_parse_error("matrix (1 2 3 4 5)");
+ assert_parse_error("translate(1 2 3 4 5)");
+ assert_parse_error("translate (1,)");
+ assert_parse_error("scale (1,)");
+ assert_parse_error("skewX (1,2)");
+ assert_parse_error("skewY ()");
+ assert_parse_error("skewY");
+ }
+
+ #[test]
+ fn parses_matrix() {
+ assert_transform_eq(
+ &parse_transform("matrix (1 2 3 4 5 6)").unwrap(),
+ &Transform::new_unchecked(1.0, 2.0, 3.0, 4.0, 5.0, 6.0),
+ );
+
+ assert_transform_eq(
+ &parse_transform("matrix(1,2,3,4 5 6)").unwrap(),
+ &Transform::new_unchecked(1.0, 2.0, 3.0, 4.0, 5.0, 6.0),
+ );
+
+ assert_transform_eq(
+ &parse_transform("matrix (1,2.25,-3.25e2,4 5 6)").unwrap(),
+ &Transform::new_unchecked(1.0, 2.25, -325.0, 4.0, 5.0, 6.0),
+ );
+ }
+
+ #[test]
+ fn parses_translate() {
+ assert_transform_eq(
+ &parse_transform("translate(-1 -2)").unwrap(),
+ &Transform::new_unchecked(1.0, 0.0, 0.0, 1.0, -1.0, -2.0),
+ );
+
+ assert_transform_eq(
+ &parse_transform("translate(-1, -2)").unwrap(),
+ &Transform::new_unchecked(1.0, 0.0, 0.0, 1.0, -1.0, -2.0),
+ );
+
+ assert_transform_eq(
+ &parse_transform("translate(-1)").unwrap(),
+ &Transform::new_unchecked(1.0, 0.0, 0.0, 1.0, -1.0, 0.0),
+ );
+ }
+
+ #[test]
+ fn parses_scale() {
+ assert_transform_eq(
+ &parse_transform("scale (-1)").unwrap(),
+ &Transform::new_unchecked(-1.0, 0.0, 0.0, -1.0, 0.0, 0.0),
+ );
+
+ assert_transform_eq(
+ &parse_transform("scale(-1 -2)").unwrap(),
+ &Transform::new_unchecked(-1.0, 0.0, 0.0, -2.0, 0.0, 0.0),
+ );
+
+ assert_transform_eq(
+ &parse_transform("scale(-1, -2)").unwrap(),
+ &Transform::new_unchecked(-1.0, 0.0, 0.0, -2.0, 0.0, 0.0),
+ );
+ }
+
+ #[test]
+ fn parses_rotate() {
+ assert_transform_eq(
+ &parse_transform("rotate (30)").unwrap(),
+ &rotation_transform(30.0, 0.0, 0.0),
+ );
+ assert_transform_eq(
+ &parse_transform("rotate (30,-1,-2)").unwrap(),
+ &rotation_transform(30.0, -1.0, -2.0),
+ );
+ assert_transform_eq(
+ &parse_transform("rotate(30, -1, -2)").unwrap(),
+ &rotation_transform(30.0, -1.0, -2.0),
+ );
+ }
+
+ #[test]
+ fn parses_skew_x() {
+ assert_transform_eq(
+ &parse_transform("skewX (30)").unwrap(),
+ &Transform::new_skew(Angle::from_degrees(30.0), Angle::new(0.0)),
+ );
+ }
+
+ #[test]
+ fn parses_skew_y() {
+ assert_transform_eq(
+ &parse_transform("skewY (30)").unwrap(),
+ &Transform::new_skew(Angle::new(0.0), Angle::from_degrees(30.0)),
+ );
+ }
+
+ #[test]
+ fn parses_transform_list() {
+ let t = Transform::new_unchecked(1.0, 0.0, 0.0, 1.0, 20.0, 30.0);
+ let s = Transform::new_unchecked(10.0, 0.0, 0.0, 10.0, 0.0, 0.0);
+ let r = rotation_transform(30.0, 10.0, 10.0);
+
+ assert_transform_eq(
+ &parse_transform("scale(10)rotate(30, 10, 10)").unwrap(),
+ &Transform::multiply(&r, &s),
+ );
+
+ assert_transform_eq(
+ &parse_transform("translate(20, 30), scale (10)").unwrap(),
+ &Transform::multiply(&s, &t),
+ );
+
+ let a = Transform::multiply(&s, &t);
+ assert_transform_eq(
+ &parse_transform("translate(20, 30), scale (10) rotate (30 10 10)").unwrap(),
+ &Transform::multiply(&r, &a),
+ );
+ }
+
+ #[test]
+ fn parses_empty() {
+ assert_transform_eq(&parse_transform("").unwrap(), &Transform::identity());
+ }
+
+ #[test]
+ fn test_parse_transform_property_none() {
+ assert_eq!(
+ parse_transform_prop("none").unwrap(),
+ TransformProperty::None
+ );
+ }
+
+ #[test]
+ fn none_transform_is_identity() {
+ assert_eq!(
+ parse_transform_prop("none").unwrap().to_transform(),
+ Transform::identity()
+ );
+ }
+
+ #[test]
+ fn empty_transform_property_is_error() {
+ // https://www.w3.org/TR/css-transforms-1/#transform-property
+ //
+ // <transform-list> = <transform-function>+
+ // ^ one or more required
+ assert!(parse_transform_prop("").is_err());
+ }
+
+ #[test]
+ fn test_parse_transform_property_matrix() {
+ let tp = TransformProperty::List(vec![TransformFunction::Matrix(
+ Transform::new_unchecked(1.0, 2.0, 3.0, 4.0, 5.0, 6.0),
+ )]);
+
+ assert_eq!(&tp, &parse_transform_prop("matrix(1,2,3,4,5,6)").unwrap());
+ assert!(parse_transform_prop("matrix(1 2 3 4 5 6)").is_err());
+ assert!(parse_transform_prop("Matrix(1,2,3,4,5,6)").is_err());
+ }
+
+ #[test]
+ fn test_parse_transform_property_translate() {
+ let tpt = TransformProperty::List(vec![TransformFunction::Translate(
+ Length::<Horizontal>::new(100.0, LengthUnit::Px),
+ Length::<Vertical>::new(200.0, LengthUnit::Px),
+ )]);
+
+ assert_eq!(
+ &tpt,
+ &parse_transform_prop("translate(100px,200px)").unwrap()
+ );
+
+ assert_eq!(
+ parse_transform_prop("translate(1)").unwrap(),
+ parse_transform_prop("translate(1, 0)").unwrap()
+ );
+
+ assert!(parse_transform_prop("translate(100, foo)").is_err());
+ assert!(parse_transform_prop("translate(100, )").is_err());
+ assert!(parse_transform_prop("translate(100 200)").is_err());
+ assert!(parse_transform_prop("translate(1px,2px,3px,4px)").is_err());
+ }
+
+ #[test]
+ fn test_parse_transform_property_translate_x() {
+ let tptx = TransformProperty::List(vec![TransformFunction::TranslateX(
+ Length::<Horizontal>::new(100.0, LengthUnit::Px),
+ )]);
+
+ assert_eq!(&tptx, &parse_transform_prop("translateX(100px)").unwrap());
+ assert!(parse_transform_prop("translateX(1)").is_ok());
+ assert!(parse_transform_prop("translateX(100 100)").is_err());
+ assert!(parse_transform_prop("translatex(1px)").is_err());
+ assert!(parse_transform_prop("translatex(1rad)").is_err());
+ }
+
+ #[test]
+ fn test_parse_transform_property_translate_y() {
+ let tpty = TransformProperty::List(vec![TransformFunction::TranslateY(
+ Length::<Vertical>::new(100.0, LengthUnit::Px),
+ )]);
+
+ assert_eq!(&tpty, &parse_transform_prop("translateY(100px)").unwrap());
+ assert!(parse_transform_prop("translateY(1)").is_ok());
+ assert!(parse_transform_prop("translateY(100 100)").is_err());
+ assert!(parse_transform_prop("translatey(1px)").is_err());
+ }
+
+ #[test]
+ fn test_translate_only_supports_pixel_units() {
+ assert!(parse_transform_prop("translate(1in, 2)").is_err());
+ assert!(parse_transform_prop("translate(1, 2in)").is_err());
+ assert!(parse_transform_prop("translateX(1cm)").is_err());
+ assert!(parse_transform_prop("translateY(1cm)").is_err());
+ }
+
+ #[test]
+ fn test_parse_transform_property_scale() {
+ let tps = TransformProperty::List(vec![TransformFunction::Scale(1.0, 10.0)]);
+
+ assert_eq!(&tps, &parse_transform_prop("scale(1,10)").unwrap());
+
+ assert_eq!(
+ parse_transform_prop("scale(2)").unwrap(),
+ parse_transform_prop("scale(2, 2)").unwrap()
+ );
+
+ assert!(parse_transform_prop("scale(100, foo)").is_err());
+ assert!(parse_transform_prop("scale(100, )").is_err());
+ assert!(parse_transform_prop("scale(1 10)").is_err());
+ assert!(parse_transform_prop("scale(1px,10px)").is_err());
+ assert!(parse_transform_prop("scale(1%)").is_err());
+ }
+
+ #[test]
+ fn test_parse_transform_property_scale_x() {
+ let tpsx = TransformProperty::List(vec![TransformFunction::ScaleX(10.0)]);
+
+ assert_eq!(&tpsx, &parse_transform_prop("scaleX(10)").unwrap());
+
+ assert!(parse_transform_prop("scaleX(100 100)").is_err());
+ assert!(parse_transform_prop("scalex(10)").is_err());
+ assert!(parse_transform_prop("scaleX(10px)").is_err());
+ }
+
+ #[test]
+ fn test_parse_transform_property_scale_y() {
+ let tpsy = TransformProperty::List(vec![TransformFunction::ScaleY(10.0)]);
+
+ assert_eq!(&tpsy, &parse_transform_prop("scaleY(10)").unwrap());
+ assert!(parse_transform_prop("scaleY(10 1)").is_err());
+ assert!(parse_transform_prop("scaleY(1px)").is_err());
+ }
+
+ #[test]
+ fn test_parse_transform_property_rotate() {
+ let tpr =
+ TransformProperty::List(vec![TransformFunction::Rotate(Angle::from_degrees(100.0))]);
+ assert_eq!(&tpr, &parse_transform_prop("rotate(100deg)").unwrap());
+ assert!(parse_transform_prop("rotate(100deg 100)").is_err());
+ assert!(parse_transform_prop("rotate(3px)").is_err());
+ }
+
+ #[test]
+ fn test_parse_transform_property_skew() {
+ let tpsk = TransformProperty::List(vec![TransformFunction::Skew(
+ Angle::from_degrees(90.0),
+ Angle::from_degrees(120.0),
+ )]);
+
+ assert_eq!(&tpsk, &parse_transform_prop("skew(90deg,120deg)").unwrap());
+
+ assert_eq!(
+ parse_transform_prop("skew(45deg)").unwrap(),
+ parse_transform_prop("skew(45deg, 0)").unwrap()
+ );
+
+ assert!(parse_transform_prop("skew(1.0,1.0)").is_ok());
+ assert!(parse_transform_prop("skew(1rad,1rad)").is_ok());
+
+ assert!(parse_transform_prop("skew(100, foo)").is_err());
+ assert!(parse_transform_prop("skew(100, )").is_err());
+ assert!(parse_transform_prop("skew(1.0px)").is_err());
+ assert!(parse_transform_prop("skew(1.0,1.0,1deg)").is_err());
+ }
+
+ #[test]
+ fn test_parse_transform_property_skew_x() {
+ let tpskx =
+ TransformProperty::List(vec![TransformFunction::SkewX(Angle::from_degrees(90.0))]);
+
+ assert_eq!(&tpskx, &parse_transform_prop("skewX(90deg)").unwrap());
+ assert!(parse_transform_prop("skewX(1.0)").is_ok());
+ assert!(parse_transform_prop("skewX(1rad)").is_ok());
+ assert!(parse_transform_prop("skewx(1.0)").is_err());
+ assert!(parse_transform_prop("skewX(1.0,1.0)").is_err());
+ }
+
+ #[test]
+ fn test_parse_transform_property_skew_y() {
+ let tpsky =
+ TransformProperty::List(vec![TransformFunction::SkewY(Angle::from_degrees(90.0))]);
+
+ assert_eq!(&tpsky, &parse_transform_prop("skewY(90deg)").unwrap());
+ assert!(parse_transform_prop("skewY(1.0)").is_ok());
+ assert!(parse_transform_prop("skewY(1rad)").is_ok());
+ assert!(parse_transform_prop("skewy(1.0)").is_err());
+ assert!(parse_transform_prop("skewY(1.0,1.0)").is_err());
+ }
+}
diff --git a/rsvg/src/ua.css b/rsvg/src/ua.css
new file mode 100644
index 00000000..3292f8ac
--- /dev/null
+++ b/rsvg/src/ua.css
@@ -0,0 +1,41 @@
+/* See https://www.w3.org/TR/SVG/styling.html#UAStyleSheet
+ *
+ * Commented out rules cannot yet be parsed.
+ */
+
+/*
+@namespace url(http://www.w3.org/2000/svg);
+@namespace xml url(http://www.w3.org/XML/1998/namespace);
+*/
+
+svg:not(:root), image, marker, pattern, symbol { overflow: hidden; }
+
+/*
+*:not(svg),
+*:not(foreignObject) > svg {
+ transform-origin: 0 0;
+}
+
+*[xml|space=preserve] {
+ text-space-collapse: preserve-spaces;
+}
+*/
+
+defs,
+clipPath, mask, marker,
+desc, title, metadata,
+pattern, linearGradient, radialGradient,
+script, style,
+symbol {
+ display: none !important;
+}
+
+:host(use) > symbol {
+ display: inline !important;
+}
+
+/*
+:link, :visited {
+ cursor: pointer;
+}
+*
diff --git a/rsvg/src/unit_interval.rs b/rsvg/src/unit_interval.rs
new file mode 100644
index 00000000..65cc3d94
--- /dev/null
+++ b/rsvg/src/unit_interval.rs
@@ -0,0 +1,94 @@
+//! Type for values in the [0.0, 1.0] range.
+
+use cssparser::Parser;
+
+use crate::error::*;
+use crate::length::*;
+use crate::parsers::Parse;
+use crate::util;
+
+#[derive(Debug, Default, Copy, Clone, PartialEq, PartialOrd)]
+pub struct UnitInterval(pub f64);
+
+impl UnitInterval {
+ pub fn clamp(val: f64) -> UnitInterval {
+ UnitInterval(util::clamp(val, 0.0, 1.0))
+ }
+}
+
+impl Parse for UnitInterval {
+ fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<UnitInterval, ParseError<'i>> {
+ let loc = parser.current_source_location();
+ let l: Length<Both> = Parse::parse(parser)?;
+ match l.unit {
+ LengthUnit::Px | LengthUnit::Percent => Ok(UnitInterval::clamp(l.length)),
+ _ => Err(loc.new_custom_error(ValueErrorKind::value_error(
+ "<unit-interval> must be in default or percent units",
+ ))),
+ }
+ }
+}
+
+impl From<UnitInterval> for u8 {
+ fn from(val: UnitInterval) -> u8 {
+ let UnitInterval(x) = val;
+ (x * 255.0 + 0.5).floor() as u8
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn clamps() {
+ assert_eq!(UnitInterval::clamp(-1.0), UnitInterval(0.0));
+ assert_eq!(UnitInterval::clamp(0.0), UnitInterval(0.0));
+ assert_eq!(UnitInterval::clamp(0.5), UnitInterval(0.5));
+ assert_eq!(UnitInterval::clamp(1.0), UnitInterval(1.0));
+ assert_eq!(UnitInterval::clamp(2.0), UnitInterval(1.0));
+ }
+
+ #[test]
+ fn parses_percentages() {
+ assert_eq!(UnitInterval::parse_str("-100%").unwrap(), UnitInterval(0.0));
+ assert_eq!(UnitInterval::parse_str("0%").unwrap(), UnitInterval(0.0));
+ assert_eq!(UnitInterval::parse_str("50%").unwrap(), UnitInterval(0.5));
+ assert_eq!(UnitInterval::parse_str("100%").unwrap(), UnitInterval(1.0));
+ assert_eq!(
+ UnitInterval::parse_str("100.1%").unwrap(),
+ UnitInterval(1.0)
+ );
+ assert_eq!(UnitInterval::parse_str("200%").unwrap(), UnitInterval(1.0));
+ }
+
+ #[test]
+ fn parses_number() {
+ assert_eq!(UnitInterval::parse_str("0").unwrap(), UnitInterval(0.0));
+ assert_eq!(UnitInterval::parse_str("1").unwrap(), UnitInterval(1.0));
+ assert_eq!(UnitInterval::parse_str("0.5").unwrap(), UnitInterval(0.5));
+ }
+
+ #[test]
+ fn parses_out_of_range_number() {
+ assert_eq!(UnitInterval::parse_str("-10").unwrap(), UnitInterval(0.0));
+ assert_eq!(UnitInterval::parse_str("10").unwrap(), UnitInterval(1.0));
+ }
+
+ #[test]
+ fn errors_on_invalid_input() {
+ assert!(UnitInterval::parse_str("").is_err());
+ assert!(UnitInterval::parse_str("foo").is_err());
+ assert!(UnitInterval::parse_str("-x").is_err());
+ assert!(UnitInterval::parse_str("0.0foo").is_err());
+ assert!(UnitInterval::parse_str("0.0%%").is_err());
+ assert!(UnitInterval::parse_str("%").is_err());
+ }
+
+ #[test]
+ fn convert() {
+ assert_eq!(u8::from(UnitInterval(0.0)), 0);
+ assert_eq!(u8::from(UnitInterval(0.5)), 128);
+ assert_eq!(u8::from(UnitInterval(1.0)), 255);
+ }
+}
diff --git a/rsvg/src/url_resolver.rs b/rsvg/src/url_resolver.rs
new file mode 100644
index 00000000..d62c4483
--- /dev/null
+++ b/rsvg/src/url_resolver.rs
@@ -0,0 +1,256 @@
+//! Determine which URLs are allowed for loading.
+
+use std::fmt;
+use std::io;
+use std::ops::Deref;
+use std::path::{Path, PathBuf};
+use url::Url;
+
+use crate::error::AllowedUrlError;
+
+/// Currently only contains the base URL.
+///
+/// The plan is to add:
+/// base_only: Only allow to load content from the same base URL. By default
+// this restriction is enabled and requires to provide base_url.
+/// include_xml: Allows to use xi:include with XML. Enabled by default.
+/// include_text: Allows to use xi:include with text. Enabled by default.
+/// local_only: Only allow to load content from the local filesystem.
+/// Enabled by default.
+#[derive(Clone)]
+pub struct UrlResolver {
+ /// Base URL; all relative references will be resolved with respect to this.
+ pub base_url: Option<Url>,
+}
+
+impl UrlResolver {
+ /// Creates a `UrlResolver` with defaults, and sets the `base_url`.
+ pub fn new(base_url: Option<Url>) -> Self {
+ UrlResolver { base_url }
+ }
+
+ pub fn resolve_href(&self, href: &str) -> Result<AllowedUrl, AllowedUrlError> {
+ let url = Url::options()
+ .base_url(self.base_url.as_ref())
+ .parse(href)
+ .map_err(AllowedUrlError::UrlParseError)?;
+
+ // Allow loads of data: from any location
+ if url.scheme() == "data" {
+ return Ok(AllowedUrl(url));
+ }
+
+ // All other sources require a base url
+ if self.base_url.is_none() {
+ return Err(AllowedUrlError::BaseRequired);
+ }
+
+ let base_url = self.base_url.as_ref().unwrap();
+
+ // Deny loads from differing URI schemes
+ if url.scheme() != base_url.scheme() {
+ return Err(AllowedUrlError::DifferentUriSchemes);
+ }
+
+ // resource: is allowed to load anything from other resources
+ if url.scheme() == "resource" {
+ return Ok(AllowedUrl(url));
+ }
+
+ // Non-file: isn't allowed to load anything
+ if url.scheme() != "file" {
+ return Err(AllowedUrlError::DisallowedScheme);
+ }
+
+ // We have two file: URIs. Now canonicalize them (remove .. and symlinks, etc.)
+ // and see if the directories match
+
+ let url_path = url
+ .to_file_path()
+ .map_err(|_| AllowedUrlError::InvalidPath)?;
+ let base_path = base_url
+ .to_file_path()
+ .map_err(|_| AllowedUrlError::InvalidPath)?;
+
+ let base_parent = base_path.parent();
+ if base_parent.is_none() {
+ return Err(AllowedUrlError::BaseIsRoot);
+ }
+
+ let base_parent = base_parent.unwrap();
+
+ let url_canon =
+ canonicalize(url_path).map_err(|_| AllowedUrlError::CanonicalizationError)?;
+ let parent_canon =
+ canonicalize(base_parent).map_err(|_| AllowedUrlError::CanonicalizationError)?;
+
+ if url_canon.starts_with(parent_canon) {
+ Ok(AllowedUrl(url))
+ } else {
+ Err(AllowedUrlError::NotSiblingOrChildOfBaseFile)
+ }
+ }
+}
+
+/// Wrapper for URLs which are allowed to be loaded
+///
+/// SVG files can reference other files (PNG/JPEG images, other SVGs,
+/// CSS files, etc.). This object is constructed by checking whether
+/// a specified `href` (a possibly-relative filename, for example)
+/// should be allowed to be loaded, given the base URL of the SVG
+/// being loaded.
+#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+pub struct AllowedUrl(Url);
+
+impl Deref for AllowedUrl {
+ type Target = Url;
+
+ fn deref(&self) -> &Url {
+ &self.0
+ }
+}
+
+impl fmt::Display for AllowedUrl {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ self.0.fmt(f)
+ }
+}
+
+// For tests, we don't want to touch the filesystem. In that case,
+// assume that we are being passed canonical file names.
+#[cfg(not(test))]
+fn canonicalize<P: AsRef<Path>>(path: P) -> Result<PathBuf, io::Error> {
+ path.as_ref().canonicalize()
+}
+#[cfg(test)]
+fn canonicalize<P: AsRef<Path>>(path: P) -> Result<PathBuf, io::Error> {
+ Ok(path.as_ref().to_path_buf())
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn disallows_relative_file_with_no_base_file() {
+ let url_resolver = UrlResolver::new(None);
+ assert!(matches!(
+ url_resolver.resolve_href("foo.svg"),
+ Err(AllowedUrlError::UrlParseError(
+ url::ParseError::RelativeUrlWithoutBase
+ ))
+ ));
+ }
+
+ #[test]
+ fn disallows_different_schemes() {
+ let url_resolver = UrlResolver::new(Some(
+ Url::parse("http://example.com/malicious.svg").unwrap(),
+ ));
+ assert!(matches!(
+ url_resolver.resolve_href("file:///etc/passwd"),
+ Err(AllowedUrlError::DifferentUriSchemes)
+ ));
+ }
+
+ fn make_file_uri(p: &str) -> String {
+ if cfg!(windows) {
+ format!("file:///c:{}", p)
+ } else {
+ format!("file://{}", p)
+ }
+ }
+
+ #[test]
+ fn disallows_base_is_root() {
+ let url_resolver = UrlResolver::new(Some(Url::parse(&make_file_uri("/")).unwrap()));
+ assert!(matches!(
+ url_resolver.resolve_href("foo.svg"),
+ Err(AllowedUrlError::BaseIsRoot)
+ ));
+ }
+
+ #[test]
+ fn disallows_non_file_scheme() {
+ let url_resolver = UrlResolver::new(Some(Url::parse("http://foo.bar/baz.svg").unwrap()));
+ assert!(matches!(
+ url_resolver.resolve_href("foo.svg"),
+ Err(AllowedUrlError::DisallowedScheme)
+ ));
+ }
+
+ #[test]
+ fn allows_data_url_with_no_base_file() {
+ let url_resolver = UrlResolver::new(None);
+ assert_eq!(
+ url_resolver
+ .resolve_href("data:image/jpeg;base64,xxyyzz")
+ .unwrap()
+ .as_ref(),
+ "data:image/jpeg;base64,xxyyzz",
+ );
+ }
+
+ #[test]
+ fn allows_relative() {
+ let url_resolver = UrlResolver::new(Some(
+ Url::parse(&make_file_uri("/example/bar.svg")).unwrap(),
+ ));
+ let resolved = url_resolver.resolve_href("foo.svg").unwrap();
+ let expected = make_file_uri("/example/foo.svg");
+ assert_eq!(resolved.as_ref(), expected);
+ }
+
+ #[test]
+ fn allows_sibling() {
+ let url_resolver = UrlResolver::new(Some(
+ Url::parse(&make_file_uri("/example/bar.svg")).unwrap(),
+ ));
+ let resolved = url_resolver
+ .resolve_href(&make_file_uri("/example/foo.svg"))
+ .unwrap();
+ let expected = make_file_uri("/example/foo.svg");
+ assert_eq!(resolved.as_ref(), expected);
+ }
+
+ #[test]
+ fn allows_child_of_sibling() {
+ let url_resolver = UrlResolver::new(Some(
+ Url::parse(&make_file_uri("/example/bar.svg")).unwrap(),
+ ));
+ let resolved = url_resolver
+ .resolve_href(&make_file_uri("/example/subdir/foo.svg"))
+ .unwrap();
+ let expected = make_file_uri("/example/subdir/foo.svg");
+ assert_eq!(resolved.as_ref(), expected);
+ }
+
+ #[test]
+ fn disallows_non_sibling() {
+ let url_resolver = UrlResolver::new(Some(
+ Url::parse(&make_file_uri("/example/bar.svg")).unwrap(),
+ ));
+ assert!(matches!(
+ url_resolver.resolve_href(&make_file_uri("/etc/passwd")),
+ Err(AllowedUrlError::NotSiblingOrChildOfBaseFile)
+ ));
+ }
+
+ #[cfg(windows)]
+ #[test]
+ fn invalid_url_from_test_suite() {
+ // This is required for Url to panic.
+ let resolver =
+ UrlResolver::new(Some(Url::parse("file:///c:/foo.svg").expect("initial url")));
+ // With this, it doesn't panic:
+ // let resolver = UrlResolver::new(None);
+
+ // The following panics, when using a base URL
+ // match resolver.resolve_href("file://invalid.css") {
+ // so, use a less problematic case, hopefully
+ match resolver.resolve_href("file://") {
+ Ok(_) => println!("yay!"),
+ Err(e) => println!("err: {}", e),
+ }
+ }
+}
diff --git a/rsvg/src/util.rs b/rsvg/src/util.rs
new file mode 100644
index 00000000..1375b860
--- /dev/null
+++ b/rsvg/src/util.rs
@@ -0,0 +1,75 @@
+//! Miscellaneous utilities.
+
+use std::borrow::Cow;
+use std::ffi::CStr;
+use std::mem::transmute;
+use std::str;
+
+/// Converts a `char *` which is known to be valid UTF-8 into a `&str`
+///
+/// The usual `from_glib_none(s)` allocates an owned String. The
+/// purpose of `utf8_cstr()` is to get a temporary string slice into a
+/// C string which is already known to be valid UTF-8; for example,
+/// as for strings which come from `libxml2`.
+pub unsafe fn utf8_cstr<'a>(s: *const libc::c_char) -> &'a str {
+ assert!(!s.is_null());
+
+ str::from_utf8_unchecked(CStr::from_ptr(s).to_bytes())
+}
+
+pub unsafe fn opt_utf8_cstr<'a>(s: *const libc::c_char) -> Option<&'a str> {
+ if s.is_null() {
+ None
+ } else {
+ Some(utf8_cstr(s))
+ }
+}
+
+/// Error-tolerant C string import
+pub unsafe fn cstr<'a>(s: *const libc::c_char) -> Cow<'a, str> {
+ if s.is_null() {
+ return Cow::Borrowed("(null)");
+ }
+ CStr::from_ptr(s).to_string_lossy()
+}
+
+/// Casts a pointer to `c_char` to a pointer to `u8`.
+///
+/// The obvious `p as *const u8` or `p as *const _` produces a
+/// trivial_casts warning when compiled on aarch64, where `c_char` is
+/// unsigned (on Intel, it is signed, so the cast works).
+///
+/// We do this here with a `transmute`, which is awkward to type,
+/// so wrap it in a function.
+pub unsafe fn c_char_as_u8_ptr(p: *const libc::c_char) -> *const u8 {
+ transmute::<_, *const u8>(p)
+}
+
+/// Casts a pointer to `c_char` to a pointer to mutable `u8`.
+///
+/// See [`c_char_as_u8_ptr`] for the reason for this.
+pub unsafe fn c_char_as_u8_ptr_mut(p: *mut libc::c_char) -> *mut u8 {
+ transmute::<_, *mut u8>(p)
+}
+
+pub fn clamp<T: PartialOrd>(val: T, low: T, high: T) -> T {
+ if val < low {
+ low
+ } else if val > high {
+ high
+ } else {
+ val
+ }
+}
+
+#[macro_export]
+macro_rules! enum_default {
+ ($name:ident, $default:expr) => {
+ impl Default for $name {
+ #[inline]
+ fn default() -> $name {
+ $default
+ }
+ }
+ };
+}
diff --git a/rsvg/src/viewbox.rs b/rsvg/src/viewbox.rs
new file mode 100644
index 00000000..e6ad39a9
--- /dev/null
+++ b/rsvg/src/viewbox.rs
@@ -0,0 +1,87 @@
+//! Parser for the `viewBox` attribute.
+
+use cssparser::Parser;
+use std::ops::Deref;
+
+use crate::error::*;
+use crate::parsers::{NumberList, Parse};
+use crate::rect::Rect;
+
+/// Newtype around a [`Rect`], used to represent the `viewBox` attribute.
+///
+/// A `ViewBox` is a new user-space coordinate system mapped onto the rectangle defined by
+/// the current viewport. See <https://www.w3.org/TR/SVG2/coords.html#ViewBoxAttribute>
+///
+/// `ViewBox` derefs to [`Rect`], so you can use [`Rect`]'s methods and fields directly like
+/// `vbox.x0` or `vbox.width()`.
+#[derive(Debug, Copy, Clone, PartialEq)]
+pub struct ViewBox(Rect);
+
+impl Deref for ViewBox {
+ type Target = Rect;
+
+ fn deref(&self) -> &Rect {
+ &self.0
+ }
+}
+
+impl From<Rect> for ViewBox {
+ fn from(r: Rect) -> ViewBox {
+ ViewBox(r)
+ }
+}
+
+impl Parse for ViewBox {
+ // Parse a viewBox attribute
+ // https://www.w3.org/TR/SVG/coords.html#ViewBoxAttribute
+ //
+ // viewBox: double [,] double [,] double [,] double [,]
+ //
+ // x, y, w, h
+ //
+ // Where w and h must be nonnegative.
+ fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<ViewBox, ParseError<'i>> {
+ let loc = parser.current_source_location();
+
+ let NumberList::<4, 4>(v) = NumberList::parse(parser)?;
+ let (x, y, width, height) = (v[0], v[1], v[2], v[3]);
+
+ if width >= 0.0 && height >= 0.0 {
+ Ok(ViewBox(Rect::new(x, y, x + width, y + height)))
+ } else {
+ Err(loc.new_custom_error(ValueErrorKind::value_error(
+ "width and height must not be negative",
+ )))
+ }
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn parses_valid_viewboxes() {
+ assert_eq!(
+ ViewBox::parse_str(" 1 2 3 4").unwrap(),
+ ViewBox(Rect::new(1.0, 2.0, 4.0, 6.0))
+ );
+
+ assert_eq!(
+ ViewBox::parse_str(" -1.5 -2.5e1,34,56e2 ").unwrap(),
+ ViewBox(Rect::new(-1.5, -25.0, 32.5, 5575.0))
+ );
+ }
+
+ #[test]
+ fn parsing_invalid_viewboxes_yields_error() {
+ assert!(ViewBox::parse_str("").is_err());
+ assert!(ViewBox::parse_str(" 1,2,-3,-4 ").is_err());
+ assert!(ViewBox::parse_str("qwerasdfzxcv").is_err());
+ assert!(ViewBox::parse_str(" 1 2 3 4 5").is_err());
+ assert!(ViewBox::parse_str(" 1 2 foo 3 4").is_err());
+
+ // https://gitlab.gnome.org/GNOME/librsvg/issues/344
+ assert!(ViewBox::parse_str("0 0 9E80.7").is_err());
+ }
+}
diff --git a/rsvg/src/xml/attributes.rs b/rsvg/src/xml/attributes.rs
new file mode 100644
index 00000000..844066cd
--- /dev/null
+++ b/rsvg/src/xml/attributes.rs
@@ -0,0 +1,257 @@
+//! Store XML element attributes and their values.
+
+use std::slice;
+use std::str;
+
+use markup5ever::{
+ expanded_name, local_name, namespace_url, ns, LocalName, Namespace, Prefix, QualName,
+};
+use string_cache::DefaultAtom;
+
+use crate::error::{ImplementationLimit, LoadingError};
+use crate::limits;
+use crate::util::{c_char_as_u8_ptr, opt_utf8_cstr, utf8_cstr};
+
+/// Type used to store attribute values.
+///
+/// Attribute values are often repeated in an SVG file, so we intern them using the
+/// string_cache crate.
+pub type AttributeValue = DefaultAtom;
+
+/// Iterable wrapper for libxml2's representation of attribute/value.
+///
+/// See the [`new_from_xml2_attributes`] function for information.
+///
+/// [`new_from_xml2_attributes`]: #method.new_from_xml2_attributes
+#[derive(Clone)]
+pub struct Attributes {
+ attrs: Box<[(QualName, AttributeValue)]>,
+ id_idx: Option<u16>,
+ class_idx: Option<u16>,
+}
+
+/// Iterator from `Attributes.iter`.
+pub struct AttributesIter<'a>(slice::Iter<'a, (QualName, AttributeValue)>);
+
+impl Attributes {
+ #[cfg(test)]
+ pub fn new() -> Attributes {
+ Attributes {
+ attrs: [].into(),
+ id_idx: None,
+ class_idx: None,
+ }
+ }
+
+ /// Creates an iterable `Attributes` from the C array of borrowed C strings.
+ ///
+ /// With libxml2's SAX parser, the caller's startElementNsSAX2Func
+ /// callback gets passed a `xmlChar **` for attributes, which
+ /// comes in groups of (localname/prefix/URI/value_start/value_end).
+ /// In those, localname/prefix/URI are NUL-terminated strings;
+ /// value_start and value_end point to the start-inclusive and
+ /// end-exclusive bytes in the attribute's value.
+ ///
+ /// # Safety
+ ///
+ /// This function is unsafe because the caller must guarantee the following:
+ ///
+ /// * `attrs` is a valid pointer, with (n_attributes * 5) elements.
+ ///
+ /// * All strings are valid UTF-8.
+ pub unsafe fn new_from_xml2_attributes(
+ n_attributes: usize,
+ attrs: *const *const libc::c_char,
+ ) -> Result<Attributes, LoadingError> {
+ let mut array = Vec::with_capacity(n_attributes);
+ let mut id_idx = None;
+ let mut class_idx = None;
+
+ if n_attributes > limits::MAX_LOADED_ATTRIBUTES {
+ return Err(LoadingError::LimitExceeded(
+ ImplementationLimit::TooManyAttributes,
+ ));
+ }
+
+ if n_attributes > 0 && !attrs.is_null() {
+ for attr in slice::from_raw_parts(attrs, n_attributes * 5).chunks_exact(5) {
+ let localname = attr[0];
+ let prefix = attr[1];
+ let uri = attr[2];
+ let value_start = attr[3];
+ let value_end = attr[4];
+
+ assert!(!localname.is_null());
+
+ let localname = utf8_cstr(localname);
+
+ let prefix = opt_utf8_cstr(prefix);
+ let uri = opt_utf8_cstr(uri);
+ let qual_name = QualName::new(
+ prefix.map(Prefix::from),
+ uri.map(Namespace::from)
+ .unwrap_or_else(|| namespace_url!("")),
+ LocalName::from(localname),
+ );
+
+ if !value_start.is_null() && !value_end.is_null() {
+ assert!(value_end >= value_start);
+
+ // FIXME: ptr::offset_from() is nightly-only.
+ // We'll do the computation of the length by hand.
+ let start = value_start as usize;
+ let end = value_end as usize;
+ let len = end - start;
+
+ let value_slice = slice::from_raw_parts(c_char_as_u8_ptr(value_start), len);
+ let value_str = str::from_utf8_unchecked(value_slice);
+ let value_atom = DefaultAtom::from(value_str);
+
+ let idx = array.len() as u16;
+ match qual_name.expanded() {
+ expanded_name!("", "id") => id_idx = Some(idx),
+ expanded_name!("", "class") => class_idx = Some(idx),
+ _ => (),
+ }
+
+ array.push((qual_name, value_atom));
+ }
+ }
+ }
+
+ Ok(Attributes {
+ attrs: array.into(),
+ id_idx,
+ class_idx,
+ })
+ }
+
+ /// Returns the number of attributes.
+ pub fn len(&self) -> usize {
+ self.attrs.len()
+ }
+
+ /// Creates an iterator that yields `(QualName, &'a str)` tuples.
+ pub fn iter(&self) -> AttributesIter<'_> {
+ AttributesIter(self.attrs.iter())
+ }
+
+ pub fn get_id(&self) -> Option<&str> {
+ self.id_idx.and_then(|idx| {
+ self.attrs
+ .get(usize::from(idx))
+ .map(|(_name, value)| &value[..])
+ })
+ }
+
+ pub fn get_class(&self) -> Option<&str> {
+ self.class_idx.and_then(|idx| {
+ self.attrs
+ .get(usize::from(idx))
+ .map(|(_name, value)| &value[..])
+ })
+ }
+
+ pub fn clear_class(&mut self) {
+ self.class_idx = None;
+ }
+}
+
+impl<'a> Iterator for AttributesIter<'a> {
+ type Item = (QualName, &'a str);
+
+ fn next(&mut self) -> Option<Self::Item> {
+ self.0.next().map(|(a, v)| (a.clone(), v.as_ref()))
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+ use markup5ever::{expanded_name, local_name, namespace_url, ns};
+ use std::ffi::CString;
+ use std::ptr;
+
+ #[test]
+ fn empty_attributes() {
+ let map = unsafe { Attributes::new_from_xml2_attributes(0, ptr::null()).unwrap() };
+ assert_eq!(map.len(), 0);
+ }
+
+ #[test]
+ fn attributes_with_namespaces() {
+ let attrs = [
+ (
+ CString::new("href").unwrap(),
+ Some(CString::new("xlink").unwrap()),
+ Some(CString::new("http://www.w3.org/1999/xlink").unwrap()),
+ CString::new("1").unwrap(),
+ ),
+ (
+ CString::new("ry").unwrap(),
+ None,
+ None,
+ CString::new("2").unwrap(),
+ ),
+ (
+ CString::new("d").unwrap(),
+ None,
+ None,
+ CString::new("").unwrap(),
+ ),
+ ];
+
+ let mut v: Vec<*const libc::c_char> = Vec::new();
+
+ for (localname, prefix, uri, val) in &attrs {
+ v.push(localname.as_ptr());
+ v.push(
+ prefix
+ .as_ref()
+ .map(|p: &CString| p.as_ptr())
+ .unwrap_or_else(|| ptr::null()),
+ );
+ v.push(
+ uri.as_ref()
+ .map(|p: &CString| p.as_ptr())
+ .unwrap_or_else(|| ptr::null()),
+ );
+
+ let val_start = val.as_ptr();
+ let val_end = unsafe { val_start.offset(val.as_bytes().len() as isize) };
+ v.push(val_start); // value_start
+ v.push(val_end); // value_end
+ }
+
+ let attrs = unsafe { Attributes::new_from_xml2_attributes(3, v.as_ptr()).unwrap() };
+
+ let mut had_href: bool = false;
+ let mut had_ry: bool = false;
+ let mut had_d: bool = false;
+
+ for (a, v) in attrs.iter() {
+ match a.expanded() {
+ expanded_name!(xlink "href") => {
+ assert!(v == "1");
+ had_href = true;
+ }
+
+ expanded_name!("", "ry") => {
+ assert!(v == "2");
+ had_ry = true;
+ }
+
+ expanded_name!("", "d") => {
+ assert!(v == "");
+ had_d = true;
+ }
+
+ _ => unreachable!(),
+ }
+ }
+
+ assert!(had_href);
+ assert!(had_ry);
+ assert!(had_d);
+ }
+}
diff --git a/rsvg/src/xml/mod.rs b/rsvg/src/xml/mod.rs
new file mode 100644
index 00000000..0c75f8a8
--- /dev/null
+++ b/rsvg/src/xml/mod.rs
@@ -0,0 +1,787 @@
+//! The main XML parser.
+
+use encoding_rs::Encoding;
+use gio::{
+ prelude::BufferedInputStreamExt, BufferedInputStream, Cancellable, ConverterInputStream,
+ InputStream, ZlibCompressorFormat, ZlibDecompressor,
+};
+use glib::Cast;
+use markup5ever::{
+ expanded_name, local_name, namespace_url, ns, ExpandedName, LocalName, Namespace, QualName,
+};
+use std::cell::RefCell;
+use std::collections::HashMap;
+use std::rc::Rc;
+use std::str;
+use std::string::ToString;
+use std::sync::Arc;
+use xml5ever::buffer_queue::BufferQueue;
+use xml5ever::tendril::format_tendril;
+use xml5ever::tokenizer::{TagKind, Token, TokenSink, XmlTokenizer, XmlTokenizerOpts};
+
+use crate::css::{Origin, Stylesheet};
+use crate::document::{Document, DocumentBuilder};
+use crate::error::{ImplementationLimit, LoadingError};
+use crate::handle::LoadOptions;
+use crate::io::{self, IoError};
+use crate::limits::{MAX_LOADED_ELEMENTS, MAX_XINCLUDE_DEPTH};
+use crate::node::{Node, NodeBorrow};
+use crate::session::Session;
+use crate::style::StyleType;
+use crate::url_resolver::AllowedUrl;
+
+use xml2_load::Xml2Parser;
+
+mod attributes;
+mod xml2;
+mod xml2_load;
+
+pub use attributes::Attributes;
+
+#[derive(Clone)]
+enum Context {
+ // Starting state
+ Start,
+
+ // Creating nodes for elements under the current node
+ ElementCreation,
+
+ // Inside <style>; accumulate text to include in a stylesheet
+ Style,
+
+ // An unsupported element inside a `<style>` element, to be ignored
+ UnsupportedStyleChild,
+
+ // Inside <xi:include>
+ XInclude(XIncludeContext),
+
+ // An unsupported element inside a <xi:include> context, to be ignored
+ UnsupportedXIncludeChild,
+
+ // Insie <xi::fallback>
+ XIncludeFallback(XIncludeContext),
+
+ // An XML parsing error was found. We will no-op upon any further XML events.
+ FatalError(LoadingError),
+}
+
+#[derive(Clone)]
+struct XIncludeContext {
+ need_fallback: bool,
+}
+
+// This is to hold an xmlEntityPtr from libxml2; we just hold an opaque pointer
+// that is freed in impl Drop for XmlState
+type XmlEntityPtr = *mut libc::c_void;
+
+extern "C" {
+ // The original function takes an xmlNodePtr, but that is compatible
+ // with xmlEntityPtr for the purposes of this function.
+ fn xmlFreeNode(node: XmlEntityPtr);
+}
+
+// Creates an ExpandedName from the XInclude namespace and a local_name
+//
+// The markup5ever crate doesn't have built-in namespaces for XInclude,
+// so we make our own.
+macro_rules! xinclude_name {
+ ($local_name:expr) => {
+ ExpandedName {
+ ns: &Namespace::from("http://www.w3.org/2001/XInclude"),
+ local: &LocalName::from($local_name),
+ }
+ };
+}
+
+/// Holds the state used for XML processing
+///
+/// These methods are called when an XML event is parsed out of the XML stream: `start_element`,
+/// `end_element`, `characters`.
+///
+/// When an element starts, we push a corresponding `Context` into the `context_stack`. Within
+/// that context, all XML events will be forwarded to it, and processed in one of the `XmlHandler`
+/// trait objects. Normally the context refers to a `NodeCreationContext` implementation which is
+/// what creates normal graphical elements.
+struct XmlStateInner {
+ document_builder: DocumentBuilder,
+ num_loaded_elements: usize,
+ xinclude_depth: usize,
+ context_stack: Vec<Context>,
+ current_node: Option<Node>,
+
+ // Note that neither XmlStateInner nor Xmlstate implement Drop.
+ //
+ // An XmlState is finally consumed in XmlState::build_document(), and that
+ // function is responsible for freeing all the XmlEntityPtr from this field.
+ //
+ // (The structs cannot impl Drop because build_document()
+ // destructures and consumes them at the same time.)
+ entities: HashMap<String, XmlEntityPtr>,
+}
+
+pub struct XmlState {
+ inner: RefCell<XmlStateInner>,
+
+ session: Session,
+ load_options: Arc<LoadOptions>,
+}
+
+/// Errors returned from XmlState::acquire()
+///
+/// These follow the terminology from <https://www.w3.org/TR/xinclude/#terminology>
+enum AcquireError {
+ /// Resource could not be acquired (file not found), or I/O error.
+ /// In this case, the `xi:fallback` can be used if present.
+ ResourceError,
+
+ /// Resource could not be parsed/decoded
+ FatalError(String),
+}
+
+impl XmlStateInner {
+ fn context(&self) -> Context {
+ // We can unwrap since the stack is never empty
+ self.context_stack.last().unwrap().clone()
+ }
+}
+
+impl XmlState {
+ fn new(
+ session: Session,
+ document_builder: DocumentBuilder,
+ load_options: Arc<LoadOptions>,
+ ) -> XmlState {
+ XmlState {
+ inner: RefCell::new(XmlStateInner {
+ document_builder,
+ num_loaded_elements: 0,
+ xinclude_depth: 0,
+ context_stack: vec![Context::Start],
+ current_node: None,
+ entities: HashMap::new(),
+ }),
+
+ session,
+ load_options,
+ }
+ }
+
+ fn check_last_error(&self) -> Result<(), LoadingError> {
+ let inner = self.inner.borrow();
+
+ match inner.context() {
+ Context::FatalError(e) => Err(e),
+ _ => Ok(()),
+ }
+ }
+
+ fn check_limits(&self) -> Result<(), ()> {
+ if self.inner.borrow().num_loaded_elements > MAX_LOADED_ELEMENTS {
+ self.error(LoadingError::LimitExceeded(
+ ImplementationLimit::TooManyLoadedElements,
+ ));
+ Err(())
+ } else {
+ Ok(())
+ }
+ }
+
+ pub fn start_element(&self, name: QualName, attrs: Attributes) -> Result<(), ()> {
+ self.check_limits()?;
+
+ let context = self.inner.borrow().context();
+
+ if let Context::FatalError(_) = context {
+ return Err(());
+ }
+
+ self.inner.borrow_mut().num_loaded_elements += 1;
+
+ let new_context = match context {
+ Context::Start => self.element_creation_start_element(&name, attrs),
+ Context::ElementCreation => self.element_creation_start_element(&name, attrs),
+
+ Context::Style => self.inside_style_start_element(&name),
+ Context::UnsupportedStyleChild => self.unsupported_style_start_element(&name),
+
+ Context::XInclude(ref ctx) => self.inside_xinclude_start_element(ctx, &name),
+ Context::UnsupportedXIncludeChild => self.unsupported_xinclude_start_element(&name),
+ Context::XIncludeFallback(ref ctx) => {
+ self.xinclude_fallback_start_element(ctx, &name, attrs)
+ }
+
+ Context::FatalError(_) => unreachable!(),
+ };
+
+ self.inner.borrow_mut().context_stack.push(new_context);
+
+ Ok(())
+ }
+
+ pub fn end_element(&self, _name: QualName) {
+ let context = self.inner.borrow().context();
+
+ match context {
+ Context::Start => panic!("end_element: XML handler stack is empty!?"),
+ Context::ElementCreation => self.element_creation_end_element(),
+
+ Context::Style => self.style_end_element(),
+ Context::UnsupportedStyleChild => (),
+
+ Context::XInclude(_) => (),
+ Context::UnsupportedXIncludeChild => (),
+ Context::XIncludeFallback(_) => (),
+
+ Context::FatalError(_) => return,
+ }
+
+ // We can unwrap since start_element() always adds a context to the stack
+ self.inner.borrow_mut().context_stack.pop().unwrap();
+ }
+
+ pub fn characters(&self, text: &str) {
+ let context = self.inner.borrow().context();
+
+ match context {
+ Context::Start => {
+ // This is character data before the first element, i.e. something like
+ // <?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg"/>
+ // ^ note the space here
+ // libxml2 is not finished reading the file yet; it will emit an error
+ // on its own when it finishes. So, ignore this condition.
+ }
+
+ Context::ElementCreation => self.element_creation_characters(text),
+
+ Context::Style => self.element_creation_characters(text),
+ Context::UnsupportedStyleChild => (),
+
+ Context::XInclude(_) => (),
+ Context::UnsupportedXIncludeChild => (),
+ Context::XIncludeFallback(ref ctx) => self.xinclude_fallback_characters(ctx, text),
+ Context::FatalError(_) => (),
+ }
+ }
+
+ pub fn processing_instruction(&self, target: &str, data: &str) {
+ if target != "xml-stylesheet" {
+ return;
+ }
+
+ if let Ok(pairs) = parse_xml_stylesheet_processing_instruction(data) {
+ let mut alternate = None;
+ let mut type_ = None;
+ let mut href = None;
+
+ for (att, value) in pairs {
+ match att.as_str() {
+ "alternate" => alternate = Some(value),
+ "type" => type_ = Some(value),
+ "href" => href = Some(value),
+ _ => (),
+ }
+ }
+
+ let mut inner = self.inner.borrow_mut();
+
+ if type_.as_deref() != Some("text/css")
+ || (alternate.is_some() && alternate.as_deref() != Some("no"))
+ {
+ rsvg_log!(
+ self.session,
+ "invalid parameters in XML processing instruction for stylesheet",
+ );
+ return;
+ }
+
+ if let Some(href) = href {
+ if let Ok(aurl) = self.load_options.url_resolver.resolve_href(&href) {
+ if let Ok(stylesheet) =
+ Stylesheet::from_href(&aurl, Origin::Author, self.session.clone())
+ {
+ inner.document_builder.append_stylesheet(stylesheet);
+ } else {
+ // FIXME: https://www.w3.org/TR/xml-stylesheet/ does not seem to specify
+ // what to do if the stylesheet cannot be loaded, so here we ignore the error.
+ rsvg_log!(
+ self.session,
+ "could not create stylesheet from {} in XML processing instruction",
+ href
+ );
+ }
+ } else {
+ rsvg_log!(
+ self.session,
+ "{} not allowed for xml-stylesheet in XML processing instruction",
+ href
+ );
+ }
+ } else {
+ rsvg_log!(
+ self.session,
+ "xml-stylesheet processing instruction does not have href; ignoring"
+ );
+ }
+ } else {
+ self.error(LoadingError::XmlParseError(String::from(
+ "invalid processing instruction data in xml-stylesheet",
+ )));
+ }
+ }
+
+ pub fn error(&self, e: LoadingError) {
+ self.inner
+ .borrow_mut()
+ .context_stack
+ .push(Context::FatalError(e));
+ }
+
+ pub fn entity_lookup(&self, entity_name: &str) -> Option<XmlEntityPtr> {
+ self.inner.borrow().entities.get(entity_name).copied()
+ }
+
+ pub fn entity_insert(&self, entity_name: &str, entity: XmlEntityPtr) {
+ let mut inner = self.inner.borrow_mut();
+
+ let old_value = inner.entities.insert(entity_name.to_string(), entity);
+
+ if let Some(v) = old_value {
+ unsafe {
+ xmlFreeNode(v);
+ }
+ }
+ }
+
+ fn element_creation_start_element(&self, name: &QualName, attrs: Attributes) -> Context {
+ if name.expanded() == xinclude_name!("include") {
+ self.xinclude_start_element(name, attrs)
+ } else {
+ let mut inner = self.inner.borrow_mut();
+
+ let parent = inner.current_node.clone();
+ let node = inner.document_builder.append_element(name, attrs, parent);
+ inner.current_node = Some(node);
+
+ if name.expanded() == expanded_name!(svg "style") {
+ Context::Style
+ } else {
+ Context::ElementCreation
+ }
+ }
+ }
+
+ fn element_creation_end_element(&self) {
+ let mut inner = self.inner.borrow_mut();
+ let node = inner.current_node.take().unwrap();
+ inner.current_node = node.parent();
+ }
+
+ fn element_creation_characters(&self, text: &str) {
+ let mut inner = self.inner.borrow_mut();
+
+ let mut parent = inner.current_node.clone().unwrap();
+ inner.document_builder.append_characters(text, &mut parent);
+ }
+
+ fn style_end_element(&self) {
+ self.add_inline_stylesheet();
+ self.element_creation_end_element()
+ }
+
+ fn add_inline_stylesheet(&self) {
+ let mut inner = self.inner.borrow_mut();
+ let current_node = inner.current_node.as_ref().unwrap();
+
+ let style_type = borrow_element_as!(current_node, Style).style_type();
+
+ if style_type == StyleType::TextCss {
+ let stylesheet_text = current_node
+ .children()
+ .map(|child| {
+ // Note that here we assume that the only children of <style>
+ // are indeed text nodes.
+ let child_borrow = child.borrow_chars();
+ child_borrow.get_string()
+ })
+ .collect::<String>();
+
+ if let Ok(stylesheet) = Stylesheet::from_data(
+ &stylesheet_text,
+ &self.load_options.url_resolver,
+ Origin::Author,
+ self.session.clone(),
+ ) {
+ inner.document_builder.append_stylesheet(stylesheet);
+ } else {
+ rsvg_log!(self.session, "invalid inline stylesheet");
+ }
+ }
+ }
+
+ fn inside_style_start_element(&self, name: &QualName) -> Context {
+ self.unsupported_style_start_element(name)
+ }
+
+ fn unsupported_style_start_element(&self, _name: &QualName) -> Context {
+ Context::UnsupportedStyleChild
+ }
+
+ fn xinclude_start_element(&self, _name: &QualName, attrs: Attributes) -> Context {
+ let mut href = None;
+ let mut parse = None;
+ let mut encoding = None;
+
+ let ln_parse = LocalName::from("parse");
+
+ for (attr, value) in attrs.iter() {
+ match attr.expanded() {
+ expanded_name!("", "href") => href = Some(value),
+ ref v
+ if *v
+ == ExpandedName {
+ ns: &ns!(),
+ local: &ln_parse,
+ } =>
+ {
+ parse = Some(value)
+ }
+ expanded_name!("", "encoding") => encoding = Some(value),
+ _ => (),
+ }
+ }
+
+ let need_fallback = match self.acquire(href, parse, encoding) {
+ Ok(()) => false,
+ Err(AcquireError::ResourceError) => true,
+ Err(AcquireError::FatalError(s)) => {
+ return Context::FatalError(LoadingError::XmlParseError(s))
+ }
+ };
+
+ Context::XInclude(XIncludeContext { need_fallback })
+ }
+
+ fn inside_xinclude_start_element(&self, ctx: &XIncludeContext, name: &QualName) -> Context {
+ if name.expanded() == xinclude_name!("fallback") {
+ Context::XIncludeFallback(ctx.clone())
+ } else {
+ // https://www.w3.org/TR/xinclude/#include_element
+ //
+ // "Other content (text, processing instructions,
+ // comments, elements not in the XInclude namespace,
+ // descendants of child elements) is not constrained by
+ // this specification and is ignored by the XInclude
+ // processor"
+
+ self.unsupported_xinclude_start_element(name)
+ }
+ }
+
+ fn xinclude_fallback_start_element(
+ &self,
+ ctx: &XIncludeContext,
+ name: &QualName,
+ attrs: Attributes,
+ ) -> Context {
+ if ctx.need_fallback {
+ if name.expanded() == xinclude_name!("include") {
+ self.xinclude_start_element(name, attrs)
+ } else {
+ self.element_creation_start_element(name, attrs)
+ }
+ } else {
+ Context::UnsupportedXIncludeChild
+ }
+ }
+
+ fn xinclude_fallback_characters(&self, ctx: &XIncludeContext, text: &str) {
+ if ctx.need_fallback && self.inner.borrow().current_node.is_some() {
+ // We test for is_some() because with a bad "SVG" file like this:
+ //
+ // <xi:include href="blah"><xi:fallback>foo</xi:fallback></xi:include>
+ //
+ // at the point we get "foo" here, there is no current_node because
+ // no nodes have been created before the xi:include.
+ self.element_creation_characters(text);
+ }
+ }
+
+ fn acquire(
+ &self,
+ href: Option<&str>,
+ parse: Option<&str>,
+ encoding: Option<&str>,
+ ) -> Result<(), AcquireError> {
+ if let Some(href) = href {
+ let aurl = self
+ .load_options
+ .url_resolver
+ .resolve_href(href)
+ .map_err(|e| {
+ // FIXME: should AlloweUrlError::UrlParseError be a fatal error,
+ // not a resource error?
+ rsvg_log!(self.session, "could not acquire \"{}\": {}", href, e);
+ AcquireError::ResourceError
+ })?;
+
+ // https://www.w3.org/TR/xinclude/#include_element
+ //
+ // "When omitted, the value of "xml" is implied (even in
+ // the absence of a default value declaration). Values
+ // other than "xml" and "text" are a fatal error."
+ match parse {
+ None | Some("xml") => self.include_xml(&aurl),
+
+ Some("text") => self.acquire_text(&aurl, encoding),
+
+ Some(v) => Err(AcquireError::FatalError(format!(
+ "unknown 'parse' attribute value: \"{v}\""
+ ))),
+ }
+ } else {
+ // The href attribute is not present. Per
+ // https://www.w3.org/TR/xinclude/#include_element we
+ // should use the xpointer attribute, but we do not
+ // support that yet. So, we'll just say, "OK" and not
+ // actually include anything.
+ Ok(())
+ }
+ }
+
+ fn include_xml(&self, aurl: &AllowedUrl) -> Result<(), AcquireError> {
+ self.increase_xinclude_depth(aurl)?;
+
+ let result = self.acquire_xml(aurl);
+
+ self.decrease_xinclude_depth();
+
+ result
+ }
+
+ fn increase_xinclude_depth(&self, aurl: &AllowedUrl) -> Result<(), AcquireError> {
+ let mut inner = self.inner.borrow_mut();
+
+ if inner.xinclude_depth == MAX_XINCLUDE_DEPTH {
+ Err(AcquireError::FatalError(format!(
+ "exceeded maximum level of nested xinclude in {aurl}"
+ )))
+ } else {
+ inner.xinclude_depth += 1;
+ Ok(())
+ }
+ }
+
+ fn decrease_xinclude_depth(&self) {
+ let mut inner = self.inner.borrow_mut();
+ inner.xinclude_depth -= 1;
+ }
+
+ fn acquire_text(&self, aurl: &AllowedUrl, encoding: Option<&str>) -> Result<(), AcquireError> {
+ let binary = io::acquire_data(aurl, None).map_err(|e| {
+ rsvg_log!(self.session, "could not acquire \"{}\": {}", aurl, e);
+ AcquireError::ResourceError
+ })?;
+
+ let encoding = encoding.unwrap_or("utf-8");
+
+ let encoder = Encoding::for_label_no_replacement(encoding.as_bytes()).ok_or_else(|| {
+ AcquireError::FatalError(format!("unknown encoding \"{encoding}\" for \"{aurl}\""))
+ })?;
+
+ let utf8_data = encoder
+ .decode_without_bom_handling_and_without_replacement(&binary.data)
+ .ok_or_else(|| {
+ AcquireError::FatalError(format!("could not convert contents of \"{aurl}\" from character encoding \"{encoding}\""))
+ })?;
+
+ self.element_creation_characters(&utf8_data);
+ Ok(())
+ }
+
+ fn acquire_xml(&self, aurl: &AllowedUrl) -> Result<(), AcquireError> {
+ // FIXME: distinguish between "file not found" and "invalid XML"
+
+ let stream = io::acquire_stream(aurl, None).map_err(|e| match e {
+ IoError::BadDataUrl => AcquireError::FatalError(String::from("malformed data: URL")),
+ _ => AcquireError::ResourceError,
+ })?;
+
+ // FIXME: pass a cancellable
+ self.parse_from_stream(&stream, None).map_err(|e| match e {
+ LoadingError::Io(_) => AcquireError::ResourceError,
+ LoadingError::XmlParseError(s) => AcquireError::FatalError(s),
+ _ => AcquireError::FatalError(String::from("unknown error")),
+ })
+ }
+
+ // Parses XML from a stream into an XmlState.
+ //
+ // This can be called "in the middle" of an XmlState's processing status,
+ // for example, when including another XML file via xi:include.
+ fn parse_from_stream(
+ &self,
+ stream: &gio::InputStream,
+ cancellable: Option<&gio::Cancellable>,
+ ) -> Result<(), LoadingError> {
+ Xml2Parser::from_stream(self, self.load_options.unlimited_size, stream, cancellable)
+ .and_then(|parser| parser.parse())
+ .and_then(|_: ()| self.check_last_error())
+ }
+
+ fn unsupported_xinclude_start_element(&self, _name: &QualName) -> Context {
+ Context::UnsupportedXIncludeChild
+ }
+
+ fn build_document(
+ self,
+ stream: &gio::InputStream,
+ cancellable: Option<&gio::Cancellable>,
+ ) -> Result<Document, LoadingError> {
+ self.parse_from_stream(stream, cancellable)?;
+
+ // consume self, then consume inner, then consume document_builder by calling .build()
+
+ let XmlState { inner, .. } = self;
+ let mut inner = inner.into_inner();
+
+ // Free the hash of XmlEntityPtr. We cannot do this in Drop because we will
+ // consume inner by destructuring it after the for() loop.
+ for (_key, entity) in inner.entities.drain() {
+ unsafe {
+ xmlFreeNode(entity);
+ }
+ }
+
+ let XmlStateInner {
+ document_builder, ..
+ } = inner;
+ document_builder.build()
+ }
+}
+
+/// Temporary holding space for data in an XML processing instruction
+#[derive(Default)]
+struct ProcessingInstructionData {
+ attributes: Vec<(String, String)>,
+ error: bool,
+}
+
+struct ProcessingInstructionSink(Rc<RefCell<ProcessingInstructionData>>);
+
+impl TokenSink for ProcessingInstructionSink {
+ fn process_token(&mut self, token: Token) {
+ let mut data = self.0.borrow_mut();
+
+ match token {
+ Token::TagToken(tag) if tag.kind == TagKind::EmptyTag => {
+ for a in &tag.attrs {
+ let name = a.name.local.as_ref().to_string();
+ let value = a.value.to_string();
+
+ data.attributes.push((name, value));
+ }
+ }
+
+ Token::ParseError(_) => data.error = true,
+
+ _ => (),
+ }
+ }
+}
+
+// https://www.w3.org/TR/xml-stylesheet/
+//
+// The syntax for the xml-stylesheet processing instruction we support
+// is this:
+//
+// <?xml-stylesheet href="uri" alternate="no" type="text/css"?>
+//
+// XML parsers just feed us the raw data after the target name
+// ("xml-stylesheet"), so we'll create a mini-parser with a hackish
+// element just to extract the data as attributes.
+fn parse_xml_stylesheet_processing_instruction(data: &str) -> Result<Vec<(String, String)>, ()> {
+ let pi_data = Rc::new(RefCell::new(ProcessingInstructionData {
+ attributes: Vec::new(),
+ error: false,
+ }));
+
+ let mut queue = BufferQueue::new();
+ queue.push_back(format_tendril!("<rsvg-hack {} />", data));
+
+ let sink = ProcessingInstructionSink(pi_data.clone());
+
+ let mut tokenizer = XmlTokenizer::new(sink, XmlTokenizerOpts::default());
+ tokenizer.run(&mut queue);
+
+ let pi_data = pi_data.borrow();
+
+ if pi_data.error {
+ Err(())
+ } else {
+ Ok(pi_data.attributes.clone())
+ }
+}
+
+pub fn xml_load_from_possibly_compressed_stream(
+ session: Session,
+ document_builder: DocumentBuilder,
+ load_options: Arc<LoadOptions>,
+ stream: &gio::InputStream,
+ cancellable: Option<&gio::Cancellable>,
+) -> Result<Document, LoadingError> {
+ let state = XmlState::new(session, document_builder, load_options);
+
+ let stream = get_input_stream_for_loading(stream, cancellable)?;
+
+ state.build_document(&stream, cancellable)
+}
+
+// Header of a gzip data stream
+const GZ_MAGIC_0: u8 = 0x1f;
+const GZ_MAGIC_1: u8 = 0x8b;
+
+fn get_input_stream_for_loading(
+ stream: &InputStream,
+ cancellable: Option<&Cancellable>,
+) -> Result<InputStream, LoadingError> {
+ // detect gzipped streams (svgz)
+
+ let buffered = BufferedInputStream::new(stream);
+ let num_read = buffered.fill(2, cancellable)?;
+ if num_read < 2 {
+ // FIXME: this string was localized in the original; localize it
+ return Err(LoadingError::XmlParseError(String::from(
+ "Input file is too short",
+ )));
+ }
+
+ let buf = buffered.peek_buffer();
+ assert!(buf.len() >= 2);
+ if buf[0..2] == [GZ_MAGIC_0, GZ_MAGIC_1] {
+ let decomp = ZlibDecompressor::new(ZlibCompressorFormat::Gzip);
+ let converter = ConverterInputStream::new(&buffered, &decomp);
+ Ok(converter.upcast::<InputStream>())
+ } else {
+ Ok(buffered.upcast::<InputStream>())
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn parses_processing_instruction_data() {
+ let mut r =
+ parse_xml_stylesheet_processing_instruction("foo=\"bar\" baz=\"beep\"").unwrap();
+ r.sort_by(|a, b| a.0.cmp(&b.0));
+
+ assert_eq!(
+ r,
+ vec![
+ ("baz".to_string(), "beep".to_string()),
+ ("foo".to_string(), "bar".to_string())
+ ]
+ );
+ }
+}
diff --git a/rsvg/src/xml/xml2.rs b/rsvg/src/xml/xml2.rs
new file mode 100644
index 00000000..b2f9785f
--- /dev/null
+++ b/rsvg/src/xml/xml2.rs
@@ -0,0 +1,212 @@
+//! Hand-written binding to the very minimal part of libxml2 that we need.
+
+#![allow(clippy::upper_case_acronyms)]
+#![allow(non_snake_case, non_camel_case_types)]
+
+use glib::ffi::gpointer;
+
+pub const XML_CHAR_ENCODING_NONE: libc::c_int = 0;
+
+pub const XML_INTERNAL_GENERAL_ENTITY: libc::c_int = 1;
+
+pub const XML_PARSE_NONET: libc::c_int = 1 << 11;
+pub const XML_PARSE_HUGE: libc::c_int = 1 << 19;
+pub const XML_PARSE_BIG_LINES: libc::c_int = 1 << 22;
+
+pub const XML_SAX2_MAGIC: libc::c_uint = 0xDEEDBEAF;
+
+pub type xmlDocPtr = gpointer;
+
+pub type xmlEntityPtr = gpointer;
+
+pub type UnusedFn = Option<unsafe extern "C" fn()>;
+
+#[rustfmt::skip]
+#[repr(C)]
+pub struct xmlSAXHandler {
+ pub internalSubset: UnusedFn,
+ pub isStandalone: UnusedFn,
+ pub hasInternalSubset: UnusedFn,
+ pub hasExternalSubset: UnusedFn,
+ pub resolveEntity: UnusedFn,
+
+ pub getEntity: Option<unsafe extern "C" fn(
+ ctx: *mut libc::c_void,
+ name: *const libc::c_char,
+ ) -> xmlEntityPtr>,
+
+ pub entityDecl: Option<unsafe extern "C" fn(
+ ctx: *mut libc::c_void,
+ name: *const libc::c_char,
+ type_: libc::c_int,
+ public_id: *const libc::c_char,
+ system_id: *const libc::c_char,
+ content: *const libc::c_char,
+ )>,
+
+ pub notationDecl: UnusedFn,
+ pub attributeDecl: UnusedFn,
+ pub elementDecl: UnusedFn,
+
+ pub unparsedEntityDecl: Option<unsafe extern "C" fn(
+ ctx: *mut libc::c_void,
+ name: *const libc::c_char,
+ public_id: *const libc::c_char,
+ system_id: *const libc::c_char,
+ notation_name: *const libc::c_char,
+ )>,
+
+ pub setDocumentLocator: UnusedFn,
+ pub startDocument: UnusedFn,
+ pub endDocument: UnusedFn,
+ pub startElement: UnusedFn,
+ pub endElement: UnusedFn,
+
+ pub reference: UnusedFn,
+
+ pub characters: Option<unsafe extern "C" fn(
+ ctx: *mut libc::c_void,
+ ch: *const libc::c_char,
+ len: libc::c_int,
+ )>,
+
+ pub ignorableWhitespace: UnusedFn,
+
+ pub processingInstruction: Option<unsafe extern "C" fn(
+ ctx: *mut libc::c_void,
+ target: *const libc::c_char,
+ data: *const libc::c_char,
+ )>,
+
+ pub comment: UnusedFn,
+ pub warning: UnusedFn,
+
+ pub error: UnusedFn,
+
+ pub fatalError: UnusedFn,
+
+ pub getParameterEntity: Option<unsafe extern "C" fn(
+ ctx: *mut libc::c_void,
+ name: *const libc::c_char,
+ ) -> xmlEntityPtr>,
+
+ pub cdataBlock: Option<unsafe extern "C" fn(
+ ctx: *mut libc::c_void,
+ value: *const libc::c_char,
+ len: libc::c_int,
+ )>,
+
+ pub externalSubset: UnusedFn,
+
+ pub initialized: libc::c_uint,
+
+ pub _private: gpointer,
+
+ pub startElementNs: Option<unsafe extern "C" fn(
+ ctx: *mut libc::c_void,
+ localname: *mut libc::c_char,
+ prefix: *mut libc::c_char,
+ uri: *mut libc::c_char,
+ nb_namespaces: libc::c_int,
+ namespaces: *mut *mut libc::c_char,
+ nb_attributes: libc::c_int,
+ nb_defaulted: libc::c_int,
+ attributes: *mut *mut libc::c_char,
+ )>,
+
+ pub endElementNs: Option<unsafe extern "C" fn(
+ ctx: *mut libc::c_void,
+ localname: *mut libc::c_char,
+ prefix: *mut libc::c_char,
+ uri: *mut libc::c_char,
+ )>,
+
+ pub serror: Option<unsafe extern "C" fn(user_data: *mut libc::c_void, error: xmlErrorPtr)>,
+}
+
+pub type xmlSAXHandlerPtr = *mut xmlSAXHandler;
+
+// The original struct _xmlParserCtxt in libxml2 has a *ton* of
+// fields; mostly are implementation details. We only require access
+// to fields up to replaceEntities, so we'll represent up to that
+// field, and ignore subsequent ones. This struct is used just to
+// cast the xmlParserCtxtPtr that we get out of libxml2 into a
+// Rust-visible structure; we don't need a complete representation of the
+// original struct.
+#[repr(C)]
+pub struct xmlParserCtxt {
+ pub sax: gpointer,
+ pub userData: gpointer,
+ pub myDoc: xmlDocPtr,
+ pub wellFormed: libc::c_int,
+ pub replaceEntities: libc::c_int,
+ // ... libxml2 has more fields here; we don't use them
+}
+
+pub type xmlParserCtxtPtr = *mut xmlParserCtxt;
+
+#[repr(C)]
+pub struct xmlError {
+ pub domain: libc::c_int,
+ pub code: libc::c_int,
+ pub message: *const libc::c_char,
+ pub level: libc::c_int,
+ pub file: *const libc::c_char,
+ pub line: libc::c_int,
+ pub str1: *const libc::c_char,
+ pub str2: *const libc::c_char,
+ pub str3: *const libc::c_char,
+ pub int1: libc::c_int,
+ pub int2: libc::c_int,
+ pub ctxt: gpointer,
+ pub node: gpointer,
+}
+
+pub type xmlErrorPtr = *mut xmlError;
+
+pub type xmlInputReadCallback = Option<
+ unsafe extern "C" fn(
+ context: *mut libc::c_void,
+ buffer: *mut libc::c_char,
+ len: libc::c_int,
+ ) -> libc::c_int,
+>;
+
+pub type xmlInputCloseCallback =
+ Option<unsafe extern "C" fn(context: *mut libc::c_void) -> libc::c_int>;
+
+pub type xmlCharEncoding = libc::c_int;
+
+extern "C" {
+ pub fn xmlInitParser();
+
+ pub fn xmlCreateIOParserCtxt(
+ sax: xmlSAXHandlerPtr,
+ user_data: *mut libc::c_void,
+ ioread: xmlInputReadCallback,
+ ioclose: xmlInputCloseCallback,
+ ioctx: *mut libc::c_void,
+ enc: xmlCharEncoding,
+ ) -> xmlParserCtxtPtr;
+
+ pub fn xmlStopParser(ctxt: xmlParserCtxtPtr);
+
+ pub fn xmlParseDocument(ctxt: xmlParserCtxtPtr) -> libc::c_int;
+
+ pub fn xmlFreeDoc(doc: xmlDocPtr);
+
+ pub fn xmlFreeParserCtxt(ctxt: xmlParserCtxtPtr);
+
+ pub fn xmlCtxtGetLastError(ctxt: *mut libc::c_void) -> xmlErrorPtr;
+
+ pub fn xmlCtxtUseOptions(ctxt: xmlParserCtxtPtr, options: libc::c_int) -> libc::c_int;
+
+ pub fn xmlNewEntity(
+ doc: xmlDocPtr,
+ name: *const libc::c_char,
+ type_: libc::c_int,
+ external_id: *const libc::c_char,
+ system_id: *const libc::c_char,
+ content: *const libc::c_char,
+ ) -> xmlEntityPtr;
+}
diff --git a/rsvg/src/xml/xml2_load.rs b/rsvg/src/xml/xml2_load.rs
new file mode 100644
index 00000000..9dcdac4e
--- /dev/null
+++ b/rsvg/src/xml/xml2_load.rs
@@ -0,0 +1,517 @@
+//! Glue between the libxml2 API and our xml parser module.
+//!
+//! This file provides functions to create a libxml2 xmlParserCtxtPtr, configured
+//! to read from a gio::InputStream, and to maintain its loading data in an XmlState.
+
+use gio::prelude::*;
+use std::borrow::Cow;
+use std::cell::{Cell, RefCell};
+use std::ptr;
+use std::rc::Rc;
+use std::slice;
+use std::str;
+use std::sync::Once;
+
+use glib::translate::*;
+use markup5ever::{namespace_url, ns, LocalName, Namespace, Prefix, QualName};
+
+use crate::error::LoadingError;
+use crate::util::{c_char_as_u8_ptr, c_char_as_u8_ptr_mut, cstr, opt_utf8_cstr, utf8_cstr};
+
+use super::xml2::*;
+use super::Attributes;
+use super::XmlState;
+
+#[rustfmt::skip]
+fn get_xml2_sax_handler() -> xmlSAXHandler {
+ xmlSAXHandler {
+ // first the unused callbacks
+ internalSubset: None,
+ isStandalone: None,
+ hasInternalSubset: None,
+ hasExternalSubset: None,
+ resolveEntity: None,
+ notationDecl: None,
+ attributeDecl: None,
+ elementDecl: None,
+ setDocumentLocator: None,
+ startDocument: None,
+ endDocument: None,
+ reference: None,
+ ignorableWhitespace: None,
+ comment: None,
+ warning: None,
+ error: None,
+ fatalError: None,
+ externalSubset: None,
+
+ _private: ptr::null_mut(),
+
+ // then the used callbacks
+ getEntity: Some(sax_get_entity_cb),
+ entityDecl: Some(sax_entity_decl_cb),
+ unparsedEntityDecl: Some(sax_unparsed_entity_decl_cb),
+ getParameterEntity: Some(sax_get_parameter_entity_cb),
+ characters: Some(sax_characters_cb),
+ cdataBlock: Some(sax_characters_cb),
+ startElement: None,
+ endElement: None,
+ processingInstruction: Some(sax_processing_instruction_cb),
+ startElementNs: Some(sax_start_element_ns_cb),
+ endElementNs: Some(sax_end_element_ns_cb),
+ serror: Some(rsvg_sax_serror_cb),
+
+ initialized: XML_SAX2_MAGIC,
+ }
+}
+
+unsafe extern "C" fn rsvg_sax_serror_cb(user_data: *mut libc::c_void, error: xmlErrorPtr) {
+ let xml2_parser = &*(user_data as *mut Xml2Parser<'_>);
+ let error = error.as_ref().unwrap();
+
+ let level_name = match error.level {
+ 1 => "warning",
+ 2 => "error",
+ 3 => "fatal error",
+ _ => "unknown error",
+ };
+
+ // "int2" is the column number
+ let column = if error.int2 > 0 {
+ Cow::Owned(format!(":{}", error.int2))
+ } else {
+ Cow::Borrowed("")
+ };
+
+ let full_error_message = format!(
+ "{} code={} ({}) in {}:{}{}: {}",
+ level_name,
+ error.code,
+ error.domain,
+ cstr(error.file),
+ error.line,
+ column,
+ cstr(error.message)
+ );
+ xml2_parser
+ .state
+ .error(LoadingError::XmlParseError(full_error_message));
+}
+
+fn free_xml_parser_and_doc(parser: xmlParserCtxtPtr) {
+ // Free the ctxt and its ctxt->myDoc - libxml2 doesn't free them together
+ // http://xmlsoft.org/html/libxml-parser.html#xmlFreeParserCtxt
+ unsafe {
+ if !parser.is_null() {
+ let rparser = &mut *parser;
+
+ if !rparser.myDoc.is_null() {
+ xmlFreeDoc(rparser.myDoc);
+ rparser.myDoc = ptr::null_mut();
+ }
+
+ xmlFreeParserCtxt(parser);
+ }
+ }
+}
+
+unsafe extern "C" fn sax_get_entity_cb(
+ user_data: *mut libc::c_void,
+ name: *const libc::c_char,
+) -> xmlEntityPtr {
+ let xml2_parser = &*(user_data as *mut Xml2Parser<'_>);
+
+ assert!(!name.is_null());
+ let name = utf8_cstr(name);
+
+ xml2_parser
+ .state
+ .entity_lookup(name)
+ .unwrap_or(ptr::null_mut())
+}
+
+unsafe extern "C" fn sax_entity_decl_cb(
+ user_data: *mut libc::c_void,
+ name: *const libc::c_char,
+ type_: libc::c_int,
+ _public_id: *const libc::c_char,
+ _system_id: *const libc::c_char,
+ content: *const libc::c_char,
+) {
+ let xml2_parser = &*(user_data as *mut Xml2Parser<'_>);
+
+ assert!(!name.is_null());
+
+ if type_ != XML_INTERNAL_GENERAL_ENTITY {
+ // We don't allow loading external entities; we don't support
+ // defining parameter entities in the DTD, and libxml2 should
+ // handle internal predefined entities by itself (e.g. "&amp;").
+ return;
+ }
+
+ let entity = xmlNewEntity(
+ ptr::null_mut(),
+ name,
+ type_,
+ ptr::null(),
+ ptr::null(),
+ content,
+ );
+ assert!(!entity.is_null());
+
+ let name = utf8_cstr(name);
+ xml2_parser.state.entity_insert(name, entity);
+}
+
+unsafe extern "C" fn sax_unparsed_entity_decl_cb(
+ user_data: *mut libc::c_void,
+ name: *const libc::c_char,
+ public_id: *const libc::c_char,
+ system_id: *const libc::c_char,
+ _notation_name: *const libc::c_char,
+) {
+ sax_entity_decl_cb(
+ user_data,
+ name,
+ XML_INTERNAL_GENERAL_ENTITY,
+ public_id,
+ system_id,
+ ptr::null(),
+ );
+}
+
+fn make_qual_name(prefix: Option<&str>, uri: Option<&str>, localname: &str) -> QualName {
+ // FIXME: If the element doesn't have a namespace URI, we are falling back
+ // to the SVG namespace. In reality we need to take namespace scoping into account,
+ // i.e. handle the "default namespace" active at that point in the XML stack.
+ let element_ns = uri.map_or_else(|| ns!(svg), Namespace::from);
+
+ QualName::new(
+ prefix.map(Prefix::from),
+ element_ns,
+ LocalName::from(localname),
+ )
+}
+
+unsafe extern "C" fn sax_start_element_ns_cb(
+ user_data: *mut libc::c_void,
+ localname: *mut libc::c_char,
+ prefix: *mut libc::c_char,
+ uri: *mut libc::c_char,
+ _nb_namespaces: libc::c_int,
+ _namespaces: *mut *mut libc::c_char,
+ nb_attributes: libc::c_int,
+ _nb_defaulted: libc::c_int,
+ attributes: *mut *mut libc::c_char,
+) {
+ let xml2_parser = &*(user_data as *mut Xml2Parser<'_>);
+
+ assert!(!localname.is_null());
+
+ let prefix = opt_utf8_cstr(prefix);
+ let uri = opt_utf8_cstr(uri);
+ let localname = utf8_cstr(localname);
+
+ let qual_name = make_qual_name(prefix, uri, localname);
+
+ let nb_attributes = nb_attributes as usize;
+ let attrs =
+ match Attributes::new_from_xml2_attributes(nb_attributes, attributes as *const *const _) {
+ Ok(attrs) => attrs,
+ Err(e) => {
+ xml2_parser.state.error(e);
+ let parser = xml2_parser.parser.get();
+ xmlStopParser(parser);
+ return;
+ }
+ };
+
+ // This clippy::let_unit_value is for the "let _: () = e" guard below.
+ #[allow(clippy::let_unit_value)]
+ if let Err(e) = xml2_parser.state.start_element(qual_name, attrs) {
+ let _: () = e; // guard in case we change the error type later
+
+ let parser = xml2_parser.parser.get();
+ xmlStopParser(parser);
+ }
+}
+
+unsafe extern "C" fn sax_end_element_ns_cb(
+ user_data: *mut libc::c_void,
+ localname: *mut libc::c_char,
+ prefix: *mut libc::c_char,
+ uri: *mut libc::c_char,
+) {
+ let xml2_parser = &*(user_data as *mut Xml2Parser<'_>);
+
+ assert!(!localname.is_null());
+
+ let prefix = opt_utf8_cstr(prefix);
+ let uri = opt_utf8_cstr(uri);
+ let localname = utf8_cstr(localname);
+
+ let qual_name = make_qual_name(prefix, uri, localname);
+
+ xml2_parser.state.end_element(qual_name);
+}
+
+unsafe extern "C" fn sax_characters_cb(
+ user_data: *mut libc::c_void,
+ unterminated_text: *const libc::c_char,
+ len: libc::c_int,
+) {
+ let xml2_parser = &*(user_data as *mut Xml2Parser<'_>);
+
+ assert!(!unterminated_text.is_null());
+ assert!(len >= 0);
+
+ // libxml2 already validated the incoming string as UTF-8. Note that
+ // it is *not* nul-terminated; this is why we create a byte slice first.
+ let bytes = std::slice::from_raw_parts(c_char_as_u8_ptr(unterminated_text), len as usize);
+ let utf8 = str::from_utf8_unchecked(bytes);
+
+ xml2_parser.state.characters(utf8);
+}
+
+unsafe extern "C" fn sax_processing_instruction_cb(
+ user_data: *mut libc::c_void,
+ target: *const libc::c_char,
+ data: *const libc::c_char,
+) {
+ let xml2_parser = &*(user_data as *mut Xml2Parser<'_>);
+
+ assert!(!target.is_null());
+ let target = utf8_cstr(target);
+
+ let data = if data.is_null() { "" } else { utf8_cstr(data) };
+
+ xml2_parser.state.processing_instruction(target, data);
+}
+
+unsafe extern "C" fn sax_get_parameter_entity_cb(
+ user_data: *mut libc::c_void,
+ name: *const libc::c_char,
+) -> xmlEntityPtr {
+ sax_get_entity_cb(user_data, name)
+}
+
+fn set_xml_parse_options(parser: xmlParserCtxtPtr, unlimited_size: bool) {
+ let mut options: libc::c_int = XML_PARSE_NONET | XML_PARSE_BIG_LINES;
+
+ if unlimited_size {
+ options |= XML_PARSE_HUGE;
+ }
+
+ unsafe {
+ xmlCtxtUseOptions(parser, options);
+
+ // If false, external entities work, but internal ones don't. if
+ // true, internal entities work, but external ones don't. favor
+ // internal entities, in order to not cause a regression
+ (*parser).replaceEntities = 1;
+ }
+}
+
+// Struct used as closure data for xmlCreateIOParserCtxt(). In conjunction
+// with stream_ctx_read() and stream_ctx_close(), this struct provides the
+// I/O callbacks and their context for libxml2.
+//
+// We call I/O methods on the stream, and as soon as we get an error
+// we store it in the gio_error field. Libxml2 just allows us to
+// return -1 from the I/O callbacks in that case; it doesn't actually
+// see the error code.
+//
+// The gio_error field comes from the place that constructs the
+// StreamCtx. That place is later responsible for seeing if the error
+// is set; if it is, it means that there was an I/O error. Otherwise,
+// there were no I/O errors but the caller must then ask libxml2 for
+// XML parsing errors.
+struct StreamCtx {
+ stream: gio::InputStream,
+ cancellable: Option<gio::Cancellable>,
+ gio_error: Rc<RefCell<Option<glib::Error>>>,
+}
+
+// read() callback from xmlCreateIOParserCtxt()
+unsafe extern "C" fn stream_ctx_read(
+ context: *mut libc::c_void,
+ buffer: *mut libc::c_char,
+ len: libc::c_int,
+) -> libc::c_int {
+ let ctx = &mut *(context as *mut StreamCtx);
+
+ let mut err_ref = ctx.gio_error.borrow_mut();
+
+ // has the error been set already?
+ if err_ref.is_some() {
+ return -1;
+ }
+
+ let buf: &mut [u8] = slice::from_raw_parts_mut(c_char_as_u8_ptr_mut(buffer), len as usize);
+
+ match ctx.stream.read(buf, ctx.cancellable.as_ref()) {
+ Ok(size) => size as libc::c_int,
+
+ Err(e) => {
+ // Just store the first I/O error we get; ignore subsequent ones.
+ *err_ref = Some(e);
+ -1
+ }
+ }
+}
+
+// close() callback from xmlCreateIOParserCtxt()
+unsafe extern "C" fn stream_ctx_close(context: *mut libc::c_void) -> libc::c_int {
+ let ctx = &mut *(context as *mut StreamCtx);
+
+ let ret = match ctx.stream.close(ctx.cancellable.as_ref()) {
+ Ok(()) => 0,
+
+ Err(e) => {
+ let mut err_ref = ctx.gio_error.borrow_mut();
+
+ // don't overwrite a previous error
+ if err_ref.is_none() {
+ *err_ref = Some(e);
+ }
+
+ -1
+ }
+ };
+
+ drop(Box::from_raw(ctx));
+
+ ret
+}
+
+fn init_libxml2() {
+ static ONCE: Once = Once::new();
+
+ ONCE.call_once(|| unsafe {
+ xmlInitParser();
+ });
+}
+
+pub struct Xml2Parser<'a> {
+ parser: Cell<xmlParserCtxtPtr>,
+ state: &'a XmlState,
+ gio_error: Rc<RefCell<Option<glib::Error>>>,
+}
+
+impl<'a> Xml2Parser<'a> {
+ pub fn from_stream(
+ state: &'a XmlState,
+ unlimited_size: bool,
+ stream: &gio::InputStream,
+ cancellable: Option<&gio::Cancellable>,
+ ) -> Result<Box<Xml2Parser<'a>>, LoadingError> {
+ init_libxml2();
+
+ // The Xml2Parser we end up creating, if
+ // xmlCreateIOParserCtxt() is successful, needs to hold a
+ // location to place a GError from within the I/O callbacks
+ // stream_ctx_read() and stream_ctx_close(). We put this
+ // location in an Rc so that it can outlive the call to
+ // xmlCreateIOParserCtxt() in case that fails, since on
+ // failure that function frees the StreamCtx.
+ let gio_error = Rc::new(RefCell::new(None));
+
+ let ctx = Box::new(StreamCtx {
+ stream: stream.clone(),
+ cancellable: cancellable.cloned(),
+ gio_error: gio_error.clone(),
+ });
+
+ let mut sax_handler = get_xml2_sax_handler();
+
+ let mut xml2_parser = Box::new(Xml2Parser {
+ parser: Cell::new(ptr::null_mut()),
+ state,
+ gio_error,
+ });
+
+ unsafe {
+ let xml2_parser_ptr: *mut Xml2Parser<'a> = xml2_parser.as_mut();
+ let parser = xmlCreateIOParserCtxt(
+ &mut sax_handler,
+ xml2_parser_ptr as *mut _,
+ Some(stream_ctx_read),
+ Some(stream_ctx_close),
+ Box::into_raw(ctx) as *mut _,
+ XML_CHAR_ENCODING_NONE,
+ );
+
+ if parser.is_null() {
+ // on error, xmlCreateIOParserCtxt() frees our ctx via the
+ // stream_ctx_close function
+ Err(LoadingError::OutOfMemory(String::from(
+ "could not create XML parser",
+ )))
+ } else {
+ xml2_parser.parser.set(parser);
+
+ set_xml_parse_options(parser, unlimited_size);
+
+ Ok(xml2_parser)
+ }
+ }
+ }
+
+ pub fn parse(&self) -> Result<(), LoadingError> {
+ unsafe {
+ let parser = self.parser.get();
+
+ let xml_parse_success = xmlParseDocument(parser) == 0;
+
+ let mut err_ref = self.gio_error.borrow_mut();
+
+ let io_error = err_ref.take();
+
+ if let Some(io_error) = io_error {
+ Err(LoadingError::from(io_error))
+ } else if !xml_parse_success {
+ let xerr = xmlCtxtGetLastError(parser as *mut _);
+ let msg = xml2_error_to_string(xerr);
+ Err(LoadingError::XmlParseError(msg))
+ } else {
+ Ok(())
+ }
+ }
+ }
+}
+
+impl<'a> Drop for Xml2Parser<'a> {
+ fn drop(&mut self) {
+ let parser = self.parser.get();
+ free_xml_parser_and_doc(parser);
+ self.parser.set(ptr::null_mut());
+ }
+}
+
+fn xml2_error_to_string(xerr: xmlErrorPtr) -> String {
+ unsafe {
+ if !xerr.is_null() {
+ let xerr = &*xerr;
+
+ let file = if xerr.file.is_null() {
+ "data".to_string()
+ } else {
+ from_glib_none(xerr.file)
+ };
+
+ let message = if xerr.message.is_null() {
+ "-".to_string()
+ } else {
+ from_glib_none(xerr.message)
+ };
+
+ format!(
+ "Error domain {} code {} on line {} column {} of {}: {}",
+ xerr.domain, xerr.code, xerr.line, xerr.int2, file, message
+ )
+ } else {
+ // The error is not set? Return a generic message :(
+ "Error parsing XML data".to_string()
+ }
+ }
+}
diff --git a/rsvg/tests/Makefile.am b/rsvg/tests/Makefile.am
new file mode 100644
index 00000000..b645ea6d
--- /dev/null
+++ b/rsvg/tests/Makefile.am
@@ -0,0 +1,95 @@
+include $(top_srcdir)/glib-tap.mk
+
+test_sources = \
+ src/api.rs \
+ src/bugs.rs \
+ src/compare_surfaces.rs \
+ src/errors.rs \
+ src/filters.rs \
+ src/geometries.rs \
+ src/intrinsic_dimensions.rs \
+ src/legacy_sizing.rs \
+ src/loading_crash.rs \
+ src/main.rs \
+ src/primitive_geometries.rs \
+ src/primitives.rs \
+ src/reference.rs \
+ src/reference_utils.rs \
+ src/render_crash.rs \
+ src/shapes.rs \
+ src/text.rs \
+ src/utils.rs \
+ src/cmdline/mod.rs \
+ src/cmdline/rsvg_convert.rs \
+ src/predicates/file.rs \
+ src/predicates/mod.rs \
+ src/predicates/pdf.rs \
+ src/predicates/png.rs \
+ src/predicates/svg.rs \
+ $(NULL)
+
+test_programs = api
+
+api_SOURCES = \
+ api.c \
+ test-utils.c \
+ test-utils.h \
+ $(NULL)
+
+api_LDADD = $(top_builddir)/librsvg_c_api.la \
+ $(LIBRSVG_LIBS) \
+ $(LIBM)
+
+api_LDFLAGS = -static
+
+AM_CPPFLAGS = \
+ -I$(srcdir) \
+ -I$(top_srcdir)/include \
+ -I$(top_builddir)/include \
+ -DTEST_DATA_DIR="\"$(srcdir)\"" \
+ -DTEST_SRC_DIR="\"$(PWD)\"" \
+ -DTOP_SRC_DIR="\"$(top_srcdir)\"" \
+ $(LIBRSVG_CFLAGS)
+
+test_resources = \
+ $(wildcard $(srcdir)/resources/*.ttf)
+
+test_fixtures = \
+ $(wildcard $(srcdir)/fixtures/api/*.svg) \
+ $(wildcard $(srcdir)/fixtures/cmdline/*.svg) \
+ $(wildcard $(srcdir)/fixtures/cmdline/*.png) \
+ $(wildcard $(srcdir)/fixtures/crash/*.svg) \
+ $(wildcard $(srcdir)/fixtures/crash/*.png) \
+ $(wildcard $(srcdir)/fixtures/errors/*) \
+ $(wildcard $(srcdir)/fixtures/geometries/*) \
+ $(wildcard $(srcdir)/fixtures/loading/*) \
+ $(wildcard $(srcdir)/fixtures/primitive_geometries/*) \
+ $(wildcard $(srcdir)/fixtures/reftests/*.css) \
+ $(wildcard $(srcdir)/fixtures/reftests/*.svg) \
+ $(wildcard $(srcdir)/fixtures/reftests/*.png) \
+ $(wildcard $(srcdir)/fixtures/reftests/*.txt) \
+ $(wildcard $(srcdir)/fixtures/reftests/adwaita/*.svg) \
+ $(wildcard $(srcdir)/fixtures/reftests/adwaita/*.png) \
+ $(wildcard $(srcdir)/fixtures/reftests/bugs/*.svg) \
+ $(wildcard $(srcdir)/fixtures/reftests/bugs/*.png) \
+ $(wildcard $(srcdir)/fixtures/reftests/svg1.1/*.svg) \
+ $(wildcard $(srcdir)/fixtures/reftests/svg1.1/*.png) \
+ $(wildcard $(srcdir)/fixtures/reftests/svg1.1/images/*) \
+ $(wildcard $(srcdir)/fixtures/reftests/svg1.1/resources/*) \
+ $(wildcard $(srcdir)/fixtures/reftests/svg2/*.svg) \
+ $(wildcard $(srcdir)/fixtures/reftests/svg2/*.png) \
+ $(wildcard $(srcdir)/fixtures/reftests/bugs-reftests/*.svg) \
+ $(wildcard $(srcdir)/fixtures/reftests/svg2-reftests/*.svg) \
+ $(wildcard $(srcdir)/fixtures/render-crash/*.svg) \
+ $(wildcard $(srcdir)/fixtures/text/*.svg) \
+ $(wildcard $(srcdir)/fixtures/dimensions/*.svg)
+
+EXTRA_DIST += \
+ $(test_sources) \
+ $(test_resources) \
+ $(test_fixtures) \
+ README.md \
+ $(NULL)
+
+clean-local:
+ rm -rf output
diff --git a/rsvg/tests/README.md b/rsvg/tests/README.md
new file mode 100644
index 00000000..1009d12f
--- /dev/null
+++ b/rsvg/tests/README.md
@@ -0,0 +1,344 @@
+Librsvg test suite
+==================
+
+Librsvg's test suite is split like this:
+
+* Unit tests in the Rust code, run normally with "cargo test".
+
+* Rust integration tests in this tests/ directory.
+
+* C API tests in this tests/ directory.
+
+The C API and Rust tests run the library with its public APIs in
+both languages. In addition, the Rust tests also exercise the
+rsvg-convert program.
+
+**For the impatient:** you can use `cargo test` to run most of the
+test suite; this is fine for regular development. This will *not* run
+the C API tests or some of the long-running tests that exercise the
+hard-coded limits of the library.
+
+To run the full test suite, see ["Running the test
+suite"](#running-the-test-suite) below.
+
+Unit tests
+----------
+
+The library's source code has small unit tests for particular sections
+of the code.
+
+**It is better to catch errors early**, in the unit tests, if
+possible. The test suite in this tests/ directory is for black box
+tests, which run the library as a normal program would use it.
+
+* **What should be in a unit test** - a small test of an algorithm; a
+ check for computed values given some starting values; checks for
+ edge cases.
+
+* **What should be in these black-box tests** - rendering tests that
+ exercise a particular part of the code; CSS cascading tests; images
+ that expose bugs and that we want to avoid regressing on later.
+
+For example, there are unit tests of the path data parser (the `<path
+d="M10 10 L20 20 ...">` element and its `d` attribute, to ensure that
+the parser handles all the path commands and catches errors
+appropriately. Correspondingly, there are a bunch of black-box tests
+that exercise particular features of path rendering ("does this
+actually draw a line, or an arc?").
+
+
+Running the test suite
+----------------------
+
+For regular development, use `cargo test`. This will run most of the
+test suite, except for the C API tests and the long-running tests
+which exercise the hard-coded limits of the library.
+
+To run the full test suite, you need to go through autotools. Run the
+following commands in the toplevel source directory:
+
+```sh
+export TESTS_OUTPUT_DIR=/some/directory/for/test/failures
+./autogen.sh
+make check
+```
+
+## Artifacts produced from the tests
+
+**Failures for reference tests:** Tests that render a document and
+compare the result to a reference image will write details on failures
+to files under the `TESTS_OUTPUT_DIR` environment variable. If this
+variable is missing, the files will appear under `$TMPDIR/rsvg-test-output`.
+
+**Test logs:** the C API tests produce a `$builddir/tests/*.log`
+series of files with a list of test results.
+
+## C API tests - `api.c`
+
+These test the full C API of librsvg: all the public functions; the
+RsvgHandle class, its methods, and its GObject properties; all the
+deprecated functions. Any new public APIs should get tested here.
+
+The tests are intended to preserve the historical peculiarities of the
+C API, to ensure ABI compatibility across versions of the library.
+
+These tests are not meant to exhaustively test librsvg's features.
+For those, you should look at the [Rust integration
+tests][#rust-integration-tests].
+
+This C API test suite is built upon [Glib's GTest utility
+functions][gtest], which let you define tests in the C language.
+
+## Rust integration tests
+
+These are built as a Rust binary in this tests/ directory, and are
+runnable with `cargo test`.
+
+### Rust API tests - `api.rs`
+
+Tests the public Rust API of librsvg.
+
+### Crash tests - `loading_crash.rs`
+
+These load and parse an SVG, and ensure that there are no crashes in
+the process. Note that this does *not* render the images.
+
+The SVG images live in the `fixtures/crash` directory. The files are
+just tested to not cause crashes during the loading process; it does
+not matter if the files are well-formed XML, for example.
+
+## Rendering crash tests - `render_crash.rs`
+
+We use these tests to ensure there are no regressions after fixing a
+bug where a particular SVG loads fine, but it crashes the renderer.
+
+The test files are in the `fixtures/render-crash` directory. The
+module loads the files and renders them, without comparing the results
+to anything in particular.
+
+## General bug regression tests - `bugs.rs`
+
+These test fixes for specific bugs in the library, so that the bugs don't recur.
+
+## Error tests - `errors.rs`
+
+These test conditions which should produce errors during loading or rendering.
+
+During loading, librsvg will report malformed XML as errors. It will
+also report an error if an SVG file has more elements than what is
+configured in librsvg's internal limits; this is intended to prevent
+uncontrolled memory consumption.
+
+During rendering, librsvg will report errors if the SVG document hits
+librsvg's internal limits for the number of instanced objects; this is
+intended to prevent uncontrolled CPU consumption from malicious SVG
+files.
+
+The test files are in the `fixtures/errors` directory.
+
+## Tests for SVG filter effects - `filters.rs`
+
+These test the semantics of the `filter` property, and specific filter functions.
+
+## Reference tests - `reference.rs`
+
+These are the bulk of the rendering tests, where the results of
+rendering SVG files are compared against reference PNG images.
+
+The reference tests allow for minor differences in the pixel values of
+the results. Each pixel's RGBA components gets compared to the
+corresponding one in the reference image:
+
+* If the absolute value of the difference between corresponding RGBA
+ components is more than 2, the test suite considers the result to be
+ *distinguishable* from the reference, but otherwise acceptable.
+
+* If the absolute value of the difference is more than the number in
+ the `RSVG_TEST_TOLERANCE` environment variable, the result is
+ *inacceptable* and the test suite fails; the default is 2 if that
+ variable is not set. You can tweak this value if your machine's
+ floating-point unit produces wildly different results.
+
+The test files are in the `fixtures/reftests/` directory. Each
+image-based reference test uses two files: `foo.svg` and
+`foo-ref.png`. The test harness will render `foo.svg` and compare the
+results to `foo-ref.png`.
+
+Failing tests will appear as part of the `cargo test` output. It will
+print the filenames for the output and difference images for failed
+tests, as follows.
+
+Each `foo.svg` test file produces a `foo-out.png` result, and if that
+result is *distinguishable* from the reference PNG (per the
+terminology above), the test will also produce a `foo-diff.png` which
+you can examine by hand. See "[Examining failed reference
+tests](#examining-failed-reference-tests)" below.
+
+**Ignoring tests:** SVG test files in `fixtures/reftests` whose names
+begin with "`ignore`" will be skipped from the tests. That is,
+anything that matches "ignore*.svg`" will not be included in the
+tests. You can use this to skip a few problematic files temporarily.
+
+As of 2020/Oct/22 we have an informal organization of these files:
+
+* `fixtures/reftests/svg1.1` - Tests from the W3C's SVG1.1 test suite.
+ These are supposed to test all of SVG's features; we will add them one
+ by one as librsvg starts implementing the features.
+
+* `fixtures/reftests/svg2` - Tests for SVG2 or CSS3 features.
+
+* `fixtures/reftests/bugs/*.svg` - Tests for particular bug numbers.
+ Please use the bug number from Gitlab, like `1234-blah.svg`, and the
+ corresponding `1234-blah-ref.png` for the known-good reference image.
+
+ **Note:** Librsvg migrated from git.gnome.org and bugzilla.gnome.org
+ to gitlab.gnome.org. Bug numbers in Bugzilla were around 6 digits
+ in length; in Gitlab, they are small numbers.
+
+* `fixtures/reftests/*.svg` - Tests for special situations
+ that arose during development.
+
+* `fixtures/reftests/adwaita/*.svg` - A snapshot of the Adwaita icon
+ theme (GNOME's default icon theme), to ensure that librsvg renders
+ it correctly.
+
+### Examining failed reference tests
+
+Let's say you run `make check` and see that one of the tests fails. The test log may have lines like these:
+
+```
+---- reference::svg_1_1_tests_fixtures_reftests_svg1_1_painting_stroke_01_t_svg stdout ----
+output: output/painting-stroke-01-t-out.png
+painting-stroke-01-t: 12414 pixels changed with maximum difference of 255
+diff: output/painting-stroke-01-t-diff.png
+thread 'reference::svg_1_1_tests_fixtures_reftests_svg1_1_painting_stroke_01_t_svg' panicked at 'surfaces are too different', tests/src/reference.rs:319:25
+
+```
+
+This means that the test file
+`fixtures/reftests/svg1.1/painting-stroke-01-t.svg` got rendered, and
+produced incorrect output when compared to
+`fixtures/reftests/svg1.1/painting-stroke-01-t-ref.png`.
+
+When a test fails, rsvg-test creates two images in `tests/output`:
+
+```
+tests/output/foo-out.png
+tests/output/foo-diff.png
+```
+
+In this case, `foo-out.png` is the actual rendered output, which is presumed to
+be incorrect, since it differs from the `foo-ref.png` reference image.
+The `foo-diff.png` is a "visual diff" that you can see in an image
+viewer; pixels that differ are highlighted.
+
+It is up to you to decide what to do next:
+
+* If the `foo-out.png` image looks correct, and the only difference
+ with respect to the `foo-ref.png` reference image is that
+ antialiased edges look different, or font rendering is slightly
+ different due to the font-rendering machinery in your system, you
+ can just regenerate the test image. See
+ "[Regenerating reference images](#regenerating-reference-images)" below.
+
+* If the `foo-out.png` image is obviously wrong when compared to the
+ `foo-ref.png` reference, you can [file a bug][bug]. You can wait
+ until someone fixes it, or try to [fix the bug yourself][pull-requests]!
+
+* Any other situation of course deserves attention. Feel free to [ask
+ the maintainers][maintainer] about it; even if you figure out the problem
+ yourself, a failed test almost always indicates a problem that is
+ not just on your end.
+
+
+### Regenerating reference images
+
+Let's say the test `tests/fixtures/reftests/.../foo.svg` failed. Then you
+fix the bug, or determine that the output image is in fact correct,
+and it just differs from the reference image due to antialiasing
+artifacts. In this case, your next step is to regenerate the
+reference image so the test passes again.
+
+**You should not just use rsvg-convert to render test files!** The
+test machinery sets up conditions for [reproducible font
+rendering][#reproducible-font-rendering], which are not available to
+rsvg-convert.
+
+Run `cargo test`, and copy the resulting `foo-out.png` to the
+`tests/fixtures/.../foo-ref.png` that corresponds to `foo.svg`.
+
+You can then run `cargo test` again and ensure that the tests pass.
+
+### Issues with the official SVG test suite
+
+Our SVG files in tests/fixtures/reftests/svg1.1 come from the "SVG 1.1
+Second Edition test suite" archive linked here:
+
+https://www.w3.org/Graphics/SVG/WG/wiki/Test_Suite_Overview
+
+We don't know how the reference PNG files in that archive are
+generated. However, they are done in such a way that objects tend not
+to be pixel-aligned. For example, many tests have a rectangular frame
+around the whole viewport, defined like this:
+
+```
+<rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+```
+
+This specifies no stroke width, so it uses 1 by default. The desired
+effect is "stroke this rectangle with a 1-pixel wide line".
+
+However, notice that the (x, y) coordinates of the rect are (1, 1).
+This means that the actual bounds of the stroked outline are from
+(0.5, 0.5) to (479.5, 359.5). The result is a fuzzy outline: it
+occupies two pixels of width, with each pixel having half-black
+coverage.
+
+Some elements in the reference PNG images from the official SVG test
+suite are pixel-aligned, and some are not, like the example test-frame
+above. It looks like their renderer uses a (0.5, 0.5) offset just for
+strokes, but not for fills, which sounds hackish.
+
+Our test suite **does not** use special offsets, so that SVG images
+not from the official test suite are rendered "normally". **This means
+that the reference images from the official test suite will always
+fail initially**, since stroke outlines will be fuzzy in librsvg, but
+not in the test suite (and conversely, SVGs *not* from the test suite
+would be crisp in librsvg but probably not in the test suite's
+renderer renderer).
+
+Also, the original reference PNGs from the SVG 1.1 test suite either
+use fonts that are different from those usually on free software
+systems, or they use SVG fonts which librsvg currently doesn't support
+(i.e. with glyph shapes referenced from a secondary SVG).
+
+In any case, look at the results by hand, and compare them by eye to
+the official reference image. If the thing being tested looks
+correct, and just the outlines are fuzzy — and also it is just the
+actual font shapes that are different — then the test is probably
+correct. Follow the procedure as in
+"[Regenerating reference images](#regenerating-reference-images)"
+listed above in order to have a reference image suitable for librsvg.
+
+### Reproducible font rendering
+
+The test runners set up special conditions so that font rendering is
+reproducible across systems. Normally, font rendering can vary quite
+a bit depending on various factors:
+
+* Versions of fontconfig, freetype, cairo, and pango.
+* Installed fonts.
+* The system's font mappings.
+* The user's settings for font antialiasing, hinting, etc.
+
+The test suite includes part of the **Roboto** fonts in
+`librsvg/tests/resources`, and creates a configuration font map with
+just those fonts. In addition, the Pango context used for rendering
+is set up with a hardcoded mode for antialiasing, hinting, and hint
+metrics.
+
+
+[gtest]: https://docs.gtk.org/glib/testing.html
+[bug]: ../CONTRIBUTING.md#reporting-bugs
+[pull-requests]: ../CONTRIBUTING.md#pull-requests
+[maintainer]: README.md#maintainers
diff --git a/rsvg/tests/api.c b/rsvg/tests/api.c
new file mode 100644
index 00000000..f7b01c2e
--- /dev/null
+++ b/rsvg/tests/api.c
@@ -0,0 +1,1709 @@
+/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/* vim: set ts=4 nowrap ai expandtab sw=4: */
+
+/* These are the C API tests for librsvg. These test the complete C
+ * API, especially its historical peculiarities to ensure ABI
+ * compatibility.
+ *
+ * These tests are not meant to exhaustively test librsvg's features.
+ * For those, you should look at the Rust integration tests. See
+ * tests/README.md for details.
+ */
+
+#include "config.h"
+
+#include <stdio.h>
+#include <glib.h>
+#include <cairo.h>
+
+#define RSVG_DISABLE_DEPRECATION_WARNINGS /* so we can test deprecated API */
+#include <librsvg/rsvg.h>
+#include "test-utils.h"
+
+/*
+ Untested:
+ rsvg_handle_internal_set_testing
+*/
+
+static void
+handle_has_correct_type_info (void)
+{
+ GTypeQuery q;
+ RsvgHandle *handle;
+
+ g_type_query (RSVG_TYPE_HANDLE, &q);
+ g_assert (q.type == RSVG_TYPE_HANDLE);
+ g_assert (q.type == rsvg_handle_get_type ());
+
+ g_assert_cmpstr (q.type_name, ==, "RsvgHandle");
+
+ /* These test that the sizes of the structs in the header file actually match the
+ * sizes of structs and the glib-subclass machinery in the Rust side.
+ */
+ g_assert (sizeof (RsvgHandleClass) == (gsize) q.class_size);
+ g_assert (sizeof (RsvgHandle) == (gsize) q.instance_size);
+
+ handle = rsvg_handle_new();
+ g_assert (G_OBJECT_TYPE (handle) == RSVG_TYPE_HANDLE);
+ g_object_unref (handle);
+}
+
+static void
+assert_flags_value_matches (GFlagsValue *v,
+ guint value,
+ const char *value_name,
+ const char *value_nick)
+{
+ g_assert_cmpint(v->value, ==, value);
+ g_assert_cmpstr(v->value_name, ==, value_name);
+ g_assert_cmpstr(v->value_nick, ==, value_nick);
+}
+
+static void
+flags_registration (void)
+{
+ GType ty;
+ GTypeQuery q;
+ GTypeClass *type_class;
+ GFlagsClass *flags_class;
+
+ ty = RSVG_TYPE_HANDLE_FLAGS;
+
+ g_assert (ty != G_TYPE_INVALID);
+
+ g_type_query (RSVG_TYPE_HANDLE_FLAGS, &q);
+ g_assert (q.type == ty);
+ g_assert (G_TYPE_IS_FLAGS (q.type));
+ g_assert_cmpstr (q.type_name, ==, "RsvgHandleFlags");
+
+ type_class = g_type_class_ref (ty);
+ g_assert (G_IS_FLAGS_CLASS (type_class));
+ g_assert (G_FLAGS_CLASS_TYPE (type_class) == ty);
+
+ flags_class = G_FLAGS_CLASS (type_class);
+ g_assert_cmpint (flags_class->n_values, ==, 3);
+
+ assert_flags_value_matches(&flags_class->values[0],
+ RSVG_HANDLE_FLAGS_NONE,
+ "RSVG_HANDLE_FLAGS_NONE",
+ "flags-none");
+
+ assert_flags_value_matches(&flags_class->values[1],
+ RSVG_HANDLE_FLAG_UNLIMITED,
+ "RSVG_HANDLE_FLAG_UNLIMITED",
+ "flag-unlimited");
+
+ assert_flags_value_matches(&flags_class->values[2],
+ RSVG_HANDLE_FLAG_KEEP_IMAGE_DATA,
+ "RSVG_HANDLE_FLAG_KEEP_IMAGE_DATA",
+ "flag-keep-image-data");
+
+ g_type_class_unref (type_class);
+}
+
+static void
+assert_enum_value_matches (GEnumValue *v,
+ gint value,
+ const char *value_name,
+ const char *value_nick)
+{
+ g_assert_cmpint (v->value, ==, value);
+ g_assert_cmpstr (v->value_name, ==, value_name);
+ g_assert_cmpstr (v->value_nick, ==, value_nick);
+}
+
+static void
+error_registration (void)
+{
+ GType ty;
+ GTypeQuery q;
+ GTypeClass *type_class;
+ GEnumClass *enum_class;
+
+ g_assert_cmpint (RSVG_ERROR, !=, 0);
+
+ ty = RSVG_TYPE_ERROR;
+
+ g_assert (ty != G_TYPE_INVALID);
+
+ g_type_query (ty, &q);
+ g_assert (q.type == ty);
+ g_assert (G_TYPE_IS_ENUM (q.type));
+ g_assert_cmpstr (q.type_name, ==, "RsvgError");
+
+ type_class = g_type_class_ref (ty);
+ g_assert (G_IS_ENUM_CLASS (type_class));
+ g_assert (G_ENUM_CLASS_TYPE (type_class) == ty);
+
+ enum_class = G_ENUM_CLASS (type_class);
+ g_assert_cmpint (enum_class->n_values, ==, 1);
+
+ assert_enum_value_matches (&enum_class->values[0],
+ RSVG_ERROR_FAILED,
+ "RSVG_ERROR_FAILED",
+ "failed");
+
+ g_type_class_unref (type_class);
+}
+
+static char *
+get_test_filename (const char *basename) {
+ return g_build_filename (test_utils_get_test_data_path (),
+ "api",
+ basename,
+ NULL);
+}
+
+static RsvgHandle *
+load_test_document (const char *basename) {
+ char *filename = get_test_filename (basename);
+ GError *error = NULL;
+
+ RsvgHandle *handle = rsvg_handle_new_from_file (filename, &error);
+ g_free (filename);
+
+ g_assert_nonnull (handle);
+ g_assert_no_error (error);
+
+ return handle;
+}
+
+#define EXAMPLE_WIDTH 100
+#define EXAMPLE_HEIGHT 400
+
+#define XZOOM 2
+#define YZOOM 3
+
+#define MAX_WIDTH 10
+#define MAX_HEIGHT 40
+
+#define MAX_ZOOMED_WIDTH 20
+#define MAX_ZOOMED_HEIGHT 120
+
+#define EXAMPLE_ONE_ID "#one"
+#define EXAMPLE_TWO_ID "#two"
+#define EXAMPLE_NONEXISTENT_ID "#nonexistent"
+
+#define EXAMPLE_ONE_X 0
+#define EXAMPLE_ONE_Y 0
+#define EXAMPLE_ONE_W 100
+#define EXAMPLE_ONE_H 200
+
+#define EXAMPLE_TWO_X 0
+#define EXAMPLE_TWO_Y 200
+#define EXAMPLE_TWO_W 100
+#define EXAMPLE_TWO_H 200
+
+static GdkPixbuf *
+pixbuf_from_file (const char *filename, GError **error)
+{
+ return rsvg_pixbuf_from_file (filename, error);
+}
+
+static GdkPixbuf *
+pixbuf_from_file_at_zoom (const char *filename, GError **error)
+{
+ return rsvg_pixbuf_from_file_at_zoom (filename, (double) XZOOM, (double) YZOOM, error);
+}
+
+static GdkPixbuf *
+pixbuf_from_file_at_size (const char *filename, GError **error)
+{
+ return rsvg_pixbuf_from_file_at_size (filename, EXAMPLE_WIDTH * XZOOM, EXAMPLE_HEIGHT * YZOOM, error);
+}
+
+static GdkPixbuf *
+pixbuf_from_file_at_max_size (const char *filename, GError **error)
+{
+ return rsvg_pixbuf_from_file_at_max_size (filename, MAX_WIDTH, MAX_HEIGHT, error);
+}
+
+static GdkPixbuf *
+pixbuf_from_file_at_zoom_with_max (const char *filename, GError **error)
+{
+ return rsvg_pixbuf_from_file_at_zoom_with_max (filename,
+ XZOOM, YZOOM,
+ MAX_ZOOMED_WIDTH, MAX_ZOOMED_HEIGHT,
+ error);
+}
+
+typedef GdkPixbuf *(* PixbufCreateFn) (const char *filename, GError **error);
+
+typedef struct {
+ const char *test_name;
+ PixbufCreateFn pixbuf_create_fn;
+ int expected_width;
+ int expected_height;
+} PixbufTest;
+
+static const PixbufTest pixbuf_tests[] = {
+ {
+ "/api/pixbuf_from_file",
+ pixbuf_from_file,
+ EXAMPLE_WIDTH,
+ EXAMPLE_HEIGHT
+ },
+ {
+ "/api/pixbuf_from_file_at_zoom",
+ pixbuf_from_file_at_zoom,
+ EXAMPLE_WIDTH * XZOOM,
+ EXAMPLE_HEIGHT * YZOOM
+ },
+ {
+ "/api/pixbuf_from_file_at_size",
+ pixbuf_from_file_at_size,
+ EXAMPLE_WIDTH * XZOOM,
+ EXAMPLE_HEIGHT * YZOOM
+ },
+ {
+ "/api/pixbuf_from_file_at_max_size",
+ pixbuf_from_file_at_max_size,
+ MAX_WIDTH,
+ MAX_HEIGHT
+ },
+ {
+ "/api/pixbuf_from_file_at_zoom_with_max",
+ pixbuf_from_file_at_zoom_with_max,
+ MAX_ZOOMED_WIDTH,
+ MAX_ZOOMED_HEIGHT
+ },
+};
+
+static void
+test_pixbuf (gconstpointer data)
+{
+ const PixbufTest *test = data;
+
+ char *filename = get_test_filename ("example.svg");
+ GError *error = NULL;
+
+ GdkPixbuf *pixbuf = test->pixbuf_create_fn (filename, &error);
+
+ g_free (filename);
+
+ g_assert_nonnull (pixbuf);
+ g_assert_no_error (error);
+ g_assert_cmpint (gdk_pixbuf_get_width (pixbuf), ==, test->expected_width);
+ g_assert_cmpint (gdk_pixbuf_get_height (pixbuf), ==, test->expected_height);
+
+ g_object_unref (pixbuf);
+}
+
+static void
+pixbuf_overflow (void)
+{
+ char *filename = get_test_filename ("example.svg");
+ GError *error = NULL;
+
+ g_assert (!rsvg_pixbuf_from_file_at_zoom (filename, 1000000.0, 1000000.0, &error));
+ g_assert_error (error, RSVG_ERROR, RSVG_ERROR_FAILED);
+ g_error_free (error);
+ g_free (filename);
+}
+
+static void
+noops (void)
+{
+ /* Just to test that these functions are present in the binary, I guess */
+ rsvg_init ();
+ rsvg_term ();
+ rsvg_cleanup ();
+}
+
+static void
+noops_return_null (void)
+{
+ RsvgHandle *handle = rsvg_handle_new ();
+
+ g_assert_null (rsvg_handle_get_title (handle));
+ g_assert_null (rsvg_handle_get_desc (handle));
+ g_assert_null (rsvg_handle_get_metadata (handle));
+
+ g_object_unref (handle);
+}
+
+static void
+set_dpi (void)
+{
+ RsvgHandle *handle;
+ RsvgDimensionData dim;
+
+ rsvg_set_default_dpi (100.0);
+
+ handle = load_test_document ("dpi.svg");
+
+ rsvg_handle_get_dimensions (handle, &dim);
+ g_assert_cmpint (dim.width, ==, 100);
+ g_assert_cmpint (dim.height, ==, 400);
+
+ rsvg_handle_set_dpi (handle, 200.0);
+ rsvg_handle_get_dimensions (handle, &dim);
+ g_assert_cmpint (dim.width, ==, 200);
+ g_assert_cmpint (dim.height, ==, 800);
+ g_object_unref (handle);
+
+ handle = load_test_document ("dpi.svg");
+
+ rsvg_handle_set_dpi_x_y (handle, 400.0, 300.0);
+ rsvg_handle_get_dimensions (handle, &dim);
+ g_assert_cmpint (dim.width, ==, 400);
+ g_assert_cmpint (dim.height, ==, 1200);
+ g_object_unref (handle);
+}
+
+static void
+base_uri (void)
+{
+ RsvgHandle *handle = rsvg_handle_new ();
+ const char *uri;
+
+ uri = rsvg_handle_get_base_uri (handle);
+ g_assert_null (uri);
+
+ rsvg_handle_set_base_uri (handle, "file:///foo/bar.svg");
+ uri = rsvg_handle_get_base_uri (handle);
+
+ g_assert_cmpstr (uri, ==, "file:///foo/bar.svg");
+
+ g_object_unref (handle);
+}
+
+static void
+base_gfile (void)
+{
+ RsvgHandle *handle = rsvg_handle_new ();
+ GFile *file;
+ const char *uri;
+
+ uri = rsvg_handle_get_base_uri (handle);
+ g_assert_null (uri);
+
+ file = g_file_new_for_uri ("file:///foo/bar.svg");
+
+ rsvg_handle_set_base_gfile (handle, file);
+ uri = rsvg_handle_get_base_uri (handle);
+
+ g_assert_cmpstr (uri, ==, "file:///foo/bar.svg");
+
+ g_object_unref (file);
+ g_object_unref (handle);
+}
+
+static void
+handle_write_close_free (void)
+{
+ char *filename = get_test_filename ("dpi.svg");
+ char *data;
+ gsize length;
+ gsize i;
+ GError *error = NULL;
+
+ g_assert (g_file_get_contents (filename, &data, &length, &error));
+ g_free (filename);
+
+ g_assert_nonnull (data);
+ g_assert_no_error (error);
+
+ RsvgHandle *handle = rsvg_handle_new_with_flags (RSVG_HANDLE_FLAGS_NONE);
+
+ for (i = 0; i < length; i++) {
+ g_assert (rsvg_handle_write (handle, (guchar *) &data[i], 1, &error));
+ g_assert_no_error (error);
+ }
+
+ g_assert (rsvg_handle_close (handle, &error));
+ g_assert_no_error (error);
+
+ /* Test that close() is idempotent in the happy case */
+ g_assert (rsvg_handle_close (handle, &error));
+ g_assert_no_error (error);
+
+ rsvg_handle_free (handle);
+ g_free (data);
+}
+
+static void
+handle_new_from_file (void)
+{
+ char *filename = get_test_filename ("dpi.svg");
+ char *uri = g_strconcat ("file://", filename, NULL);
+
+ RsvgHandle *handle;
+ GError *error = NULL;
+
+ /* rsvg_handle_new_from_file() can take both filenames and URIs */
+
+ handle = rsvg_handle_new_from_file (filename, &error);
+ g_assert_nonnull (handle);
+ g_assert_no_error (error);
+ g_object_unref (handle);
+
+ handle = rsvg_handle_new_from_file (uri, &error);
+ g_assert_nonnull (handle);
+ g_assert_no_error (error);
+ g_object_unref (handle);
+
+ g_free (filename);
+ g_free (uri);
+}
+
+static void
+handle_new_from_data (void)
+{
+ char *filename = get_test_filename ("dpi.svg");
+ char *data;
+ gsize length;
+ GError *error = NULL;
+
+ g_assert (g_file_get_contents (filename, &data, &length, &error));
+ g_free (filename);
+
+ g_assert_nonnull (data);
+ g_assert_no_error (error);
+
+ RsvgHandle *handle = rsvg_handle_new_from_data ((guint8 *) data, length, &error);
+ g_assert_nonnull (handle);
+ g_assert_no_error (error);
+
+ g_object_unref (handle);
+ g_free (data);
+}
+
+static void
+handle_new_from_gfile_sync (void)
+{
+ char *filename = get_test_filename ("dpi.svg");
+ GError *error = NULL;
+ GFile *file = g_file_new_for_path (filename);
+ g_assert_nonnull (file);
+
+ g_free (filename);
+
+ RsvgHandle *handle = rsvg_handle_new_from_gfile_sync (file,
+ RSVG_HANDLE_FLAGS_NONE,
+ NULL,
+ &error);
+
+ g_assert_nonnull (handle);
+ g_assert_no_error (error);
+
+ g_object_unref (handle);
+ g_object_unref (file);
+}
+
+static void
+handle_new_from_stream_sync (void)
+{
+ char *filename = get_test_filename ("dpi.svg");
+ GError *error = NULL;
+ GFile *file = g_file_new_for_path (filename);
+ g_assert_nonnull (file);
+
+ g_free (filename);
+
+ GFileInputStream *stream = g_file_read (file, NULL, &error);
+ g_assert (stream != NULL);
+ g_assert_no_error (error);
+
+ RsvgHandle *handle = rsvg_handle_new_from_stream_sync (G_INPUT_STREAM (stream),
+ file,
+ RSVG_HANDLE_FLAGS_NONE,
+ NULL,
+ &error);
+
+ g_assert_nonnull (handle);
+ g_assert_no_error (error);
+
+ g_object_unref (handle);
+ g_object_unref (file);
+ g_object_unref (stream);
+}
+
+static void
+handle_read_stream_sync (void)
+{
+ char *filename = get_test_filename ("dpi.svg");
+ GError *error = NULL;
+ GFile *file = g_file_new_for_path (filename);
+ g_assert_nonnull (file);
+
+ g_free (filename);
+
+ GFileInputStream *stream = g_file_read (file, NULL, &error);
+ g_assert_nonnull (stream);
+ g_assert_no_error (error);
+
+ RsvgHandle *handle = rsvg_handle_new ();
+
+ g_assert (rsvg_handle_read_stream_sync (handle, G_INPUT_STREAM (stream), NULL, &error));
+ g_assert_no_error (error);
+
+ g_object_unref (handle);
+ g_object_unref (file);
+ g_object_unref (stream);
+}
+
+static void
+handle_has_sub (void)
+{
+ RsvgHandle *handle = load_test_document ("example.svg");
+
+ g_assert (rsvg_handle_has_sub (handle, EXAMPLE_ONE_ID));
+ g_assert (rsvg_handle_has_sub (handle, EXAMPLE_TWO_ID));
+ g_assert (!rsvg_handle_has_sub (handle, "#foo"));
+
+ g_object_unref (handle);
+}
+
+static void
+test_get_pixbuf (gboolean sub)
+{
+ RsvgHandle *handle = load_test_document ("example.svg");
+
+ GdkPixbuf *pixbuf;
+ if (sub) {
+ pixbuf = rsvg_handle_get_pixbuf_sub (handle, EXAMPLE_ONE_ID);
+ } else {
+ pixbuf = rsvg_handle_get_pixbuf (handle);
+ }
+
+ g_assert_nonnull (pixbuf);
+
+ /* Note that rsvg_handle_get_pixbuf_sub() creates a surface the size of the
+ * whole SVG, not just the size of the sub-element.
+ */
+ g_assert_cmpint (gdk_pixbuf_get_width (pixbuf), ==, EXAMPLE_WIDTH);
+ g_assert_cmpint (gdk_pixbuf_get_height (pixbuf), ==, EXAMPLE_HEIGHT);
+
+ cairo_surface_t *surface_a = test_utils_cairo_surface_from_pixbuf (pixbuf);
+ cairo_surface_t *surface_b = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, EXAMPLE_WIDTH, EXAMPLE_HEIGHT);
+ cairo_surface_t *surface_diff = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, EXAMPLE_WIDTH, EXAMPLE_HEIGHT);
+
+ g_object_unref (pixbuf);
+
+ g_assert_nonnull (surface_a);
+ g_assert_nonnull (surface_b);
+ g_assert_nonnull (surface_diff);
+
+ cairo_t *cr = cairo_create (surface_b);
+ if (sub) {
+ g_assert (rsvg_handle_render_cairo_sub (handle, cr, EXAMPLE_ONE_ID));
+ } else {
+ g_assert (rsvg_handle_render_cairo (handle, cr));
+ }
+ cairo_destroy (cr);
+
+ g_object_unref (handle);
+
+ TestUtilsBufferDiffResult result = {0, 0};
+ test_utils_compare_surfaces (surface_a, surface_b, surface_diff, &result);
+
+ if (result.pixels_changed && result.max_diff > 0) {
+ g_test_fail ();
+ }
+
+ cairo_surface_destroy (surface_a);
+ cairo_surface_destroy (surface_b);
+ cairo_surface_destroy (surface_diff);
+}
+
+static void
+handle_get_pixbuf (void)
+{
+ test_get_pixbuf (FALSE);
+}
+
+static void
+handle_get_pixbuf_sub (void)
+{
+ test_get_pixbuf (TRUE);
+}
+
+static void
+dimensions_and_position (void)
+{
+ RsvgHandle *handle = load_test_document ("example.svg");
+ RsvgDimensionData dim;
+
+ g_assert (rsvg_handle_get_dimensions_sub (handle, &dim, EXAMPLE_TWO_ID));
+ g_assert_cmpint (dim.width, ==, EXAMPLE_TWO_W);
+ g_assert_cmpint (dim.height, ==, EXAMPLE_TWO_H);
+
+ RsvgPositionData pos;
+ g_assert (rsvg_handle_get_position_sub (handle, &pos, EXAMPLE_TWO_ID));
+ g_assert_cmpint (pos.x, ==, EXAMPLE_TWO_X);
+ g_assert_cmpint (pos.y, ==, EXAMPLE_TWO_Y);
+
+ g_assert_false (rsvg_handle_get_position_sub (handle, &pos, EXAMPLE_NONEXISTENT_ID));
+ g_assert_false (rsvg_handle_get_dimensions_sub (handle, &dim, EXAMPLE_NONEXISTENT_ID));
+
+ /* Asking for "position of the whole SVG" (id=NULL) always returns (0, 0) */
+ g_assert (rsvg_handle_get_position_sub (handle, &pos, NULL));
+ g_assert_cmpint (pos.x, ==, 0);
+ g_assert_cmpint (pos.y, ==, 0);
+
+ g_object_unref (handle);
+}
+
+struct size_func_data
+{
+ gboolean called;
+ gboolean destroyed;
+ gboolean testing_size_func_calls;
+};
+
+static void
+size_func (gint *width, gint *height, gpointer user_data)
+{
+ struct size_func_data *data = user_data;
+
+ if (data->testing_size_func_calls) {
+ g_assert_false (data->called);
+ data->called = TRUE;
+
+ g_assert_false (data->destroyed);
+ }
+
+ *width = 42;
+ *height = 43;
+}
+
+static void
+size_func_destroy (gpointer user_data)
+{
+ struct size_func_data *data = user_data;
+
+ if (data->testing_size_func_calls) {
+ g_assert_false (data->destroyed);
+ data->destroyed = TRUE;
+ }
+}
+
+static void
+set_size_callback (void)
+{
+ RsvgHandle *handle;
+ struct size_func_data data;
+ RsvgDimensionData dim;
+
+ handle = load_test_document ("example.svg");
+
+ data.called = FALSE;
+ data.destroyed = FALSE;
+ data.testing_size_func_calls = TRUE;
+
+ rsvg_handle_set_size_callback (handle, size_func, &data, size_func_destroy);
+
+ rsvg_handle_get_dimensions (handle, &dim);
+ g_assert_cmpint (dim.width, ==, 42);
+ g_assert_cmpint (dim.height, ==, 43);
+
+ g_object_unref (handle);
+
+ g_assert_true (data.called);
+ g_assert_true (data.destroyed);
+}
+
+static void
+reset_size_callback (void)
+{
+ RsvgHandle *handle;
+ struct size_func_data data_1;
+ struct size_func_data data_2;
+
+ handle = load_test_document ("example.svg");
+
+ data_1.called = FALSE;
+ data_1.destroyed = FALSE;
+ data_1.testing_size_func_calls = TRUE;
+
+ rsvg_handle_set_size_callback (handle, size_func, &data_1, size_func_destroy);
+
+ data_2.called = FALSE;
+ data_2.destroyed = FALSE;
+ data_2.testing_size_func_calls = TRUE;
+
+ rsvg_handle_set_size_callback (handle, size_func, &data_2, size_func_destroy);
+ g_assert_true (data_1.destroyed);
+
+ g_object_unref (handle);
+
+ g_assert_true (data_2.destroyed);
+}
+
+static void
+zero_size_func (gint *width, gint *height, gpointer user_data)
+{
+ *width = 0;
+ *height = 0;
+}
+
+static void
+render_with_zero_size_callback (void)
+{
+ /* gdk_pixbuf_get_file_info() uses a GdkPixbufLoader, but in its
+ * "size-prepared" callback it saves the computed size, and then calls
+ * gdk_pixbuf_loader_set_size(loader, 0, 0). Presumably it does to tell
+ * loaders that it only wanted to know the size, but that they shouldn't
+ * decode or render the image to a pixbuf buffer.
+ *
+ * Librsvg used to panic when getting (0, 0) from the size_callback; this
+ * test is to check that there is no such crash now. Instead, librsvg
+ * will return a 1x1 transparent pixbuf.
+ */
+ RsvgHandle *handle;
+ GdkPixbuf *pixbuf;
+
+ handle = load_test_document ("example.svg");
+
+ rsvg_handle_set_size_callback (handle, zero_size_func, NULL, NULL);
+
+ pixbuf = rsvg_handle_get_pixbuf (handle);
+ g_assert_nonnull (pixbuf);
+ g_assert_cmpint (gdk_pixbuf_get_width (pixbuf), ==, 1);
+ g_assert_cmpint (gdk_pixbuf_get_height (pixbuf), ==, 1);
+
+ g_object_unref (pixbuf);
+ g_object_unref (handle);
+}
+
+static void
+pixbuf_size_func (gint *width, gint *height, gpointer user_data)
+{
+ *width = 420;
+ *height = 430;
+}
+
+static void
+get_pixbuf_with_size_callback (void)
+{
+ RsvgHandle *handle = rsvg_handle_new ();
+
+ rsvg_handle_set_size_callback (handle, pixbuf_size_func, NULL, NULL);
+
+ char *filename = get_test_filename ("example.svg");
+ guchar *data = NULL;
+ gsize length;
+ GError *error = NULL;
+
+ g_assert (g_file_get_contents (filename, (gchar **) &data, &length, &error));
+ g_assert_nonnull (data);
+
+ g_free (filename);
+
+ g_assert (rsvg_handle_write (handle, data, length, &error));
+ g_assert_no_error (error);
+
+ g_assert (rsvg_handle_close (handle, &error));
+ g_assert_no_error (error);
+
+ GdkPixbuf *pixbuf = rsvg_handle_get_pixbuf (handle);
+ g_assert_nonnull (pixbuf);
+ g_assert_cmpint (gdk_pixbuf_get_width (pixbuf), ==, 420);
+ g_assert_cmpint (gdk_pixbuf_get_height (pixbuf), ==, 430);
+
+ g_object_unref (pixbuf);
+ g_free (data);
+ g_object_unref (handle);
+}
+
+static void
+detects_cairo_context_in_error (void)
+{
+ if (g_test_subprocess ()) {
+ RsvgHandle *handle = load_test_document ("example.svg");
+
+ /* this is wrong; it is to simulate creating a surface and a cairo_t in error */
+ cairo_surface_t *surf = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, -1, -1);
+ cairo_t *cr = cairo_create (surf);
+ /* rsvg_handle_render_cairo() should return FALSE when it gets a cr in an error state */
+ g_assert_false (rsvg_handle_render_cairo (handle, cr));
+
+ return;
+ }
+
+ g_test_trap_subprocess (NULL, 0, 0);
+ g_test_trap_assert_failed ();
+ g_test_trap_assert_stderr ("*WARNING*cannot render on a cairo_t with a failure status*");
+}
+
+static gboolean
+matrixes_are_equal (cairo_matrix_t *a, cairo_matrix_t *b)
+{
+ return (a->xx == b->xx &&
+ a->yx == b->yx &&
+ a->xy == b->xy &&
+ a->yy == b->yy &&
+ a->x0 == b->x0 &&
+ a->y0 == b->y0);
+}
+
+static void
+can_draw_to_non_image_surface (void)
+{
+ cairo_rectangle_t rect;
+ cairo_surface_t *surface;
+ cairo_t *cr;
+
+ RsvgHandle *handle = load_test_document ("example.svg");
+
+ rect.x = 0.0;
+ rect.y = 0.0;
+ rect.width = 100.0;
+ rect.height = 100.0;
+
+ /* We create a surface that is not a Cairo image surface,
+ * so we can test that in fact we can render to non-image surfaces.
+ */
+ surface = cairo_recording_surface_create (CAIRO_CONTENT_COLOR_ALPHA, &rect);
+ cr = cairo_create (surface);
+
+ cairo_translate (cr, 42.0, 42.0);
+
+ cairo_matrix_t original_affine;
+ cairo_get_matrix (cr, &original_affine);
+
+ g_assert (rsvg_handle_render_cairo (handle, cr));
+
+ cairo_matrix_t new_affine;
+ cairo_get_matrix (cr, &new_affine);
+
+ g_assert (matrixes_are_equal (&original_affine, &new_affine));
+
+ g_object_unref (handle);
+
+ cairo_destroy (cr);
+ cairo_surface_destroy (surface);
+}
+
+/* Test that we preserve the affine transformation in the cr during a call
+ * to rsvg_handle_render_cairo_sub().
+ */
+static void
+render_cairo_sub (void)
+{
+ RsvgHandle *handle = load_test_document ("bug334-element-positions.svg");
+
+ cairo_surface_t *surf = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 200, 200);
+ cairo_t *cr = cairo_create (surf);
+
+ cairo_translate (cr, 42.0, 42.0);
+
+ cairo_matrix_t original_affine;
+ cairo_get_matrix (cr, &original_affine);
+
+ g_assert (rsvg_handle_render_cairo_sub (handle, cr, "#button5-leader"));
+
+ cairo_matrix_t new_affine;
+ cairo_get_matrix (cr, &new_affine);
+
+ g_assert (matrixes_are_equal (&original_affine, &new_affine));
+
+ g_object_unref (handle);
+ cairo_destroy (cr);
+ cairo_surface_destroy (surf);
+}
+
+static void
+get_intrinsic_dimensions (void)
+{
+ RsvgHandle *handle = load_test_document ("example.svg");
+
+ gboolean has_width;
+ RsvgLength width;
+ gboolean has_height;
+ RsvgLength height;
+ gboolean has_viewbox;
+ RsvgRectangle viewbox;
+
+ rsvg_handle_get_intrinsic_dimensions (handle, &has_width, &width, &has_height, &height, &has_viewbox, &viewbox);
+
+ g_assert (has_width);
+ g_assert_cmpfloat (width.length, ==, 100.0);
+ g_assert (width.unit == RSVG_UNIT_PX);
+
+ g_assert (has_height);
+ g_assert_cmpfloat (height.length, ==, 400.0);
+ g_assert (height.unit == RSVG_UNIT_PX);
+
+ g_assert (has_viewbox);
+ g_assert_cmpfloat (viewbox.x, ==, 0.0);
+ g_assert_cmpfloat (viewbox.y, ==, 0.0);
+ g_assert_cmpfloat (viewbox.width, ==, 100.0);
+ g_assert_cmpfloat (viewbox.height, ==, 400.0);
+
+ g_object_unref (handle);
+}
+
+static void
+get_intrinsic_dimensions_missing_values (void)
+{
+ RsvgHandle *handle = load_test_document ("no-viewbox.svg");
+
+ gboolean has_width;
+ RsvgLength width;
+ gboolean has_height;
+ RsvgLength height;
+ gboolean has_viewbox;
+ RsvgRectangle viewbox;
+
+ rsvg_handle_get_intrinsic_dimensions (handle, &has_width, &width, &has_height, &height, &has_viewbox, &viewbox);
+ g_assert_true (has_width);
+ g_assert_true (has_height);
+ g_assert_false (has_viewbox);
+ g_object_unref (handle);
+}
+
+static void
+get_intrinsic_size_in_pixels_yes (void)
+{
+ RsvgHandle *handle = load_test_document ("size.svg");
+ gdouble width, height;
+
+ rsvg_handle_set_dpi (handle, 96.0);
+
+ /* Test optional parameters */
+ g_assert (rsvg_handle_get_intrinsic_size_in_pixels (handle, NULL, NULL));
+
+ /* Test the actual result */
+ g_assert (rsvg_handle_get_intrinsic_size_in_pixels (handle, &width, &height));
+ g_assert_cmpfloat (width, ==, 192.0);
+ g_assert_cmpfloat (height, ==, 288.0);
+
+ g_object_unref (handle);
+}
+
+static void
+get_intrinsic_size_in_pixels_no (void)
+{
+ RsvgHandle *handle = load_test_document ("no-size.svg");
+ gdouble width, height;
+
+ rsvg_handle_set_dpi (handle, 96.0);
+ g_assert (!rsvg_handle_get_intrinsic_size_in_pixels (handle, &width, &height));
+ g_assert_cmpfloat (width, ==, 0.0);
+ g_assert_cmpfloat (height, ==, 0.0);
+
+ g_object_unref (handle);
+}
+
+static void
+set_stylesheet (void)
+{
+ const char *css = "rect { fill: #00ff00; }";
+
+ RsvgHandle *handle = load_test_document ("stylesheet.svg");
+ RsvgHandle *ref_handle = load_test_document ("stylesheet-ref.svg");
+
+ cairo_surface_t *output = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 100, 100);
+ cairo_surface_t *reference = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 100, 100);
+
+ RsvgRectangle viewport = { 0.0, 0.0, 100.0, 100.0 };
+
+ cairo_t *output_cr = cairo_create (output);
+ cairo_t *ref_cr = cairo_create (reference);
+
+ GError *error = NULL;
+ g_assert (rsvg_handle_set_stylesheet (handle, (const guint8 *) css, strlen (css), &error));
+ g_assert_no_error (error);
+
+ g_assert (rsvg_handle_render_document (handle, output_cr, &viewport, &error));
+ g_assert_no_error (error);
+
+ g_assert (rsvg_handle_render_document (ref_handle, ref_cr, &viewport, &error));
+ g_assert_no_error (error);
+
+ cairo_surface_t *diff = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 100, 100);
+
+ TestUtilsBufferDiffResult result = {0, 0};
+ test_utils_compare_surfaces (output, reference, diff, &result);
+
+ if (result.pixels_changed && result.max_diff > 0) {
+ g_test_fail ();
+ }
+
+ cairo_surface_destroy (diff);
+ cairo_destroy (ref_cr);
+ cairo_destroy (output_cr);
+ cairo_surface_destroy (reference);
+ cairo_surface_destroy (output);
+ g_object_unref (ref_handle);
+ g_object_unref (handle);
+}
+
+static void
+render_document (void)
+{
+ RsvgHandle *handle = load_test_document ("document.svg");
+
+ cairo_surface_t *output = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 150, 150);
+ cairo_t *cr = cairo_create (output);
+
+ RsvgRectangle viewport = { 50.0, 50.0, 50.0, 50.0 };
+
+ GError *error = NULL;
+ g_assert (rsvg_handle_render_document (handle, cr, &viewport, &error));
+ g_assert_no_error (error);
+
+ cairo_destroy (cr);
+
+ cairo_surface_t *expected = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 150, 150);
+ cr = cairo_create (expected);
+
+ cairo_translate (cr, 50.0, 50.0);
+ cairo_rectangle (cr, 10.0, 10.0, 30.0, 30.0);
+ cairo_set_source_rgba (cr, 0.0, 0.0, 1.0, 0.5);
+ cairo_fill (cr);
+ cairo_destroy (cr);
+
+ cairo_surface_t *diff = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 150, 150);
+
+ TestUtilsBufferDiffResult result = {0, 0};
+ test_utils_compare_surfaces (output, expected, diff, &result);
+
+ if (result.pixels_changed && result.max_diff > 0) {
+ g_test_fail ();
+ }
+
+ cairo_surface_destroy (diff);
+ cairo_surface_destroy (expected);
+ cairo_surface_destroy (output);
+ g_object_unref (handle);
+}
+
+static void
+get_geometry_for_layer (void)
+{
+ RsvgHandle *handle = load_test_document ("geometry.svg");
+
+ RsvgRectangle viewport = { 0.0, 0.0, 100.0, 400.0 };
+ RsvgRectangle ink_rect;
+ RsvgRectangle logical_rect;
+
+ GError *error = NULL;
+
+ g_assert_false (rsvg_handle_get_geometry_for_layer (handle, "#nonexistent", &viewport,
+ &ink_rect, &logical_rect, &error));
+ g_assert_nonnull (error);
+
+ g_clear_error (&error);
+
+ g_assert (rsvg_handle_get_geometry_for_layer (handle, "#two", &viewport,
+ &ink_rect, &logical_rect, &error));
+ g_assert_no_error (error);
+
+ g_assert_cmpfloat (ink_rect.x, ==, 5.0);
+ g_assert_cmpfloat (ink_rect.y, ==, 195.0);
+ g_assert_cmpfloat (ink_rect.width, ==, 90.0);
+ g_assert_cmpfloat (ink_rect.height, ==, 110.0);
+
+ g_assert_cmpfloat (logical_rect.x, ==, 10.0);
+ g_assert_cmpfloat (logical_rect.y, ==, 200.0);
+ g_assert_cmpfloat (logical_rect.width, ==, 80.0);
+ g_assert_cmpfloat (logical_rect.height, ==, 100.0);
+
+ g_object_unref (handle);
+}
+
+static void
+render_layer (void)
+{
+ RsvgHandle *handle = load_test_document ("layers.svg");
+
+ cairo_surface_t *output = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 300, 300);
+ cairo_t *cr = cairo_create (output);
+
+ RsvgRectangle viewport = { 100.0, 100.0, 100.0, 100.0 };
+
+ GError *error = NULL;
+
+ g_assert (rsvg_handle_render_layer (handle, cr, "#bar", &viewport, &error));
+ g_assert_no_error (error);
+
+ cairo_destroy (cr);
+
+ cairo_surface_t *expected = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 300, 300);
+ cr = cairo_create (expected);
+
+ cairo_translate (cr, 100.0, 100.0);
+ cairo_rectangle (cr, 20.0, 20.0, 30.0, 30.0);
+ cairo_set_source_rgba (cr, 0.0, 0.0, 1.0, 1.0);
+ cairo_fill (cr);
+ cairo_destroy (cr);
+
+ cairo_surface_t *diff = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 300, 300);
+
+ TestUtilsBufferDiffResult result = {0, 0};
+ test_utils_compare_surfaces (output, expected, diff, &result);
+
+ if (result.pixels_changed && result.max_diff > 0) {
+ g_test_fail ();
+ }
+
+ cairo_surface_destroy (diff);
+ cairo_surface_destroy (expected);
+ cairo_surface_destroy (output);
+ g_object_unref (handle);
+}
+
+static void
+untransformed_element (void)
+{
+ RsvgHandle *handle = load_test_document ("geometry-element.svg");
+
+ RsvgRectangle ink_rect;
+ RsvgRectangle logical_rect;
+
+ GError *error = NULL;
+
+ g_assert (!rsvg_handle_get_geometry_for_element (handle, "#nonexistent",
+ &ink_rect, &logical_rect, &error));
+ g_assert_nonnull (error);
+
+ g_clear_error (&error);
+
+ g_assert (rsvg_handle_get_geometry_for_element (handle, "#foo",
+ &ink_rect, &logical_rect, &error));
+ g_assert_no_error (error);
+
+ g_assert_cmpfloat (ink_rect.x, ==, 0.0);
+ g_assert_cmpfloat (ink_rect.y, ==, 0.0);
+ g_assert_cmpfloat (ink_rect.width, ==, 40.0);
+ g_assert_cmpfloat (ink_rect.height, ==, 50.0);
+
+ g_assert_cmpfloat (logical_rect.x, ==, 5.0);
+ g_assert_cmpfloat (logical_rect.y, ==, 5.0);
+ g_assert_cmpfloat (logical_rect.width, ==, 30.0);
+ g_assert_cmpfloat (logical_rect.height, ==, 40.0);
+
+ cairo_surface_t *output = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 300, 300);
+ cairo_t *cr = cairo_create (output);
+
+ RsvgRectangle viewport = { 100.0, 100.0, 100.0, 100.0 };
+
+ g_assert (rsvg_handle_render_element (handle, cr, "#foo", &viewport, &error));
+ g_assert_no_error (error);
+
+ cairo_destroy (cr);
+
+ cairo_surface_t *expected = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 300, 300);
+ cr = cairo_create (expected);
+
+ cairo_translate (cr, 100.0, 100.0);
+ cairo_rectangle (cr, 10.0, 10.0, 60.0, 80.0);
+ cairo_set_source_rgba (cr, 0.0, 0.0, 1.0, 1.0);
+ cairo_fill_preserve (cr);
+
+ cairo_set_line_width (cr, 20.0);
+ cairo_set_source_rgba (cr, 0.0, 0.0, 0.0, 1.0);
+ cairo_stroke (cr);
+
+ cairo_destroy (cr);
+
+ cairo_surface_t *diff = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 300, 300);
+
+ TestUtilsBufferDiffResult result = {0, 0};
+ test_utils_compare_surfaces (output, expected, diff, &result);
+
+ if (result.pixels_changed && result.max_diff > 0) {
+ g_test_fail ();
+ }
+
+ cairo_surface_destroy (diff);
+ cairo_surface_destroy (expected);
+ cairo_surface_destroy (output);
+ g_object_unref (handle);
+}
+
+/* https://gitlab.gnome.org/GNOME/librsvg/issues/385 */
+static void
+no_write_before_close (void)
+{
+ RsvgHandle *handle = rsvg_handle_new();
+ GError *error = NULL;
+
+ g_assert_false (rsvg_handle_close (handle, &error));
+ g_assert_error (error, RSVG_ERROR, RSVG_ERROR_FAILED);
+ g_error_free (error);
+ error = NULL;
+
+ /* Test that close() is idempotent in the error case */
+ g_assert (rsvg_handle_close (handle, &error));
+ g_assert_no_error (error);
+
+ g_object_unref (handle);
+}
+
+static void
+empty_write_close (void)
+{
+ RsvgHandle *handle = rsvg_handle_new();
+ GError *error = NULL;
+ guchar buf = 0;
+
+ g_assert_true (rsvg_handle_write (handle, &buf, 0, &error));
+ g_assert_no_error (error);
+
+ g_assert_false (rsvg_handle_close (handle, &error));
+ g_assert_error (error, RSVG_ERROR, RSVG_ERROR_FAILED);
+
+ g_error_free (error);
+
+ g_object_unref (handle);
+}
+
+static void
+cannot_request_external_elements (void)
+{
+ /* We want to test that using one of the _sub() functions will fail
+ * if the element's id is within an external file.
+ */
+
+ RsvgHandle *handle = load_test_document ("example.svg");
+ RsvgPositionData pos;
+
+ g_assert_false (rsvg_handle_get_position_sub (handle, &pos, "dpi.svg#one"));
+
+ g_object_unref (handle);
+}
+
+static void
+test_flags (RsvgHandleFlags flags)
+{
+ guint read_flags;
+
+ RsvgHandle *handle = g_object_new (RSVG_TYPE_HANDLE,
+ "flags", flags,
+ NULL);
+ g_object_get (handle, "flags", &read_flags, NULL);
+ g_assert (read_flags == flags);
+
+ g_object_unref (handle);
+}
+
+static void
+property_flags (void)
+{
+ test_flags (RSVG_HANDLE_FLAGS_NONE);
+ test_flags (RSVG_HANDLE_FLAG_UNLIMITED);
+ test_flags (RSVG_HANDLE_FLAG_KEEP_IMAGE_DATA);
+ test_flags (RSVG_HANDLE_FLAG_UNLIMITED | RSVG_HANDLE_FLAG_KEEP_IMAGE_DATA);
+}
+
+static void
+property_dpi (void)
+{
+ RsvgHandle *handle = g_object_new (RSVG_TYPE_HANDLE,
+ "dpi-x", 42.0,
+ "dpi-y", 43.0,
+ NULL);
+ double x, y;
+
+ g_object_get (handle,
+ "dpi-x", &x,
+ "dpi-y", &y,
+ NULL);
+
+ g_assert_cmpfloat (x, ==, 42.0);
+ g_assert_cmpfloat (y, ==, 43.0);
+
+ g_object_unref (handle);
+}
+
+static void
+property_base_uri (void)
+{
+ RsvgHandle *handle = g_object_new (RSVG_TYPE_HANDLE,
+ "base-uri", "file:///foo/bar.svg",
+ NULL);
+ char *uri;
+
+ g_object_get (handle,
+ "base-uri", &uri,
+ NULL);
+
+ g_assert_cmpstr (uri, ==, "file:///foo/bar.svg");
+ g_free (uri);
+
+ g_object_unref (handle);
+}
+
+static void
+property_dimensions (void)
+{
+ RsvgHandle *handle = load_test_document ("example.svg");
+
+ int width;
+ int height;
+ double em;
+ double ex;
+
+ g_object_get (handle,
+ "width", &width,
+ "height", &height,
+ "em", &em,
+ "ex", &ex,
+ NULL);
+
+ g_assert_cmpint (width, ==, EXAMPLE_WIDTH);
+ g_assert_cmpint (height, ==, EXAMPLE_HEIGHT);
+
+ g_assert_cmpfloat (em, ==, (double) EXAMPLE_WIDTH);
+ g_assert_cmpfloat (ex, ==, (double) EXAMPLE_HEIGHT);
+
+ g_object_unref (handle);
+}
+
+static void
+property_deprecated (void)
+{
+ RsvgHandle *handle = load_test_document ("example.svg");
+
+ char *title;
+ char *desc;
+ char *metadata;
+
+ g_object_get (handle,
+ "title", &title,
+ "desc", &desc,
+ "metadata", &metadata,
+ NULL);
+
+ g_assert_null (title);
+ g_assert_null (desc);
+ g_assert_null (metadata);
+
+ g_object_unref (handle);
+}
+
+static void
+return_if_fail (void)
+{
+ if (g_test_subprocess ()) {
+ RsvgHandle *handle;
+
+ handle = rsvg_handle_new();
+ g_assert_nonnull (handle);
+
+ /* NULL is an invalid argument... */
+ rsvg_handle_set_base_uri (handle, NULL);
+ g_object_unref (handle);
+ }
+
+ g_test_trap_subprocess (NULL, 0, 0);
+ /* ... and here we catch that it was validated */
+ g_test_trap_assert_stderr ("*rsvg_handle_set_base_uri*assertion*failed*");
+}
+
+static void
+return_if_fail_null_check (void)
+{
+ if (g_test_subprocess ()) {
+ /* Pass NULL as an argument, incorrectly... */
+ g_assert_null (rsvg_handle_get_base_uri (NULL));
+ }
+
+ g_test_trap_subprocess (NULL, 0, 0);
+ /* ... and here we catch that it was validated */
+ g_test_trap_assert_stderr ("*rsvg_handle_get_base_uri*assertion*handle*failed*");
+}
+
+static void
+return_if_fail_type_check (void)
+{
+ if (g_test_subprocess ()) {
+ /* Create a random GObject that is not an RsvgHandle... */
+ GInputStream *stream = g_memory_input_stream_new();
+
+ /* Feed it to an RsvgHandle function so it will bail out */
+ g_assert_null (rsvg_handle_get_base_uri ((RsvgHandle *) stream));
+
+ g_object_unref (stream);
+ }
+
+ g_test_trap_subprocess (NULL, 0, 0);
+ /* ... and here we catch that it was validated */
+ g_test_trap_assert_stderr ("*rsvg_handle_get_base_uri*assertion*handle*failed*");
+}
+
+static void
+library_version_defines (void)
+{
+ gchar *version = g_strdup_printf ("%u.%u.%u",
+ LIBRSVG_MAJOR_VERSION, LIBRSVG_MINOR_VERSION, LIBRSVG_MICRO_VERSION);
+ g_assert_cmpstr (version, ==, LIBRSVG_VERSION);
+ g_free (version);
+}
+
+static void
+library_version_check (void)
+{
+ g_assert_true(LIBRSVG_CHECK_VERSION(1, 99, 9));
+ g_assert_true(LIBRSVG_CHECK_VERSION(2, 0, 0));
+ g_assert_true(LIBRSVG_CHECK_VERSION(2, 50, 7));
+ g_assert_false(LIBRSVG_CHECK_VERSION(2, 99, 0));
+ g_assert_false(LIBRSVG_CHECK_VERSION(3, 0, 0));
+}
+
+static void
+library_version_constants (void)
+{
+ g_assert_cmpuint (rsvg_major_version, ==, LIBRSVG_MAJOR_VERSION);
+ g_assert_cmpuint (rsvg_minor_version, ==, LIBRSVG_MINOR_VERSION);
+ g_assert_cmpuint (rsvg_micro_version, ==, LIBRSVG_MICRO_VERSION);
+}
+
+typedef struct
+{
+ const gchar *test_name;
+ const gchar *file_path;
+ const gchar *id;
+ gdouble x;
+ gdouble y;
+ gdouble width;
+ gdouble height;
+ gboolean has_position;
+ gboolean has_dimensions;
+} DimensionsFixtureData;
+
+static void
+test_dimensions (DimensionsFixtureData *fixture)
+{
+ RsvgHandle *handle;
+ RsvgPositionData position;
+ RsvgDimensionData dimension;
+ gchar *target_file;
+ GError *error = NULL;
+
+ target_file = g_build_filename (test_utils_get_test_data_path (),
+ fixture->file_path, NULL);
+ handle = rsvg_handle_new_from_file (target_file, &error);
+ g_free (target_file);
+ g_assert_no_error (error);
+
+ if (fixture->id) {
+ g_assert (rsvg_handle_has_sub (handle, fixture->id));
+ g_assert (rsvg_handle_get_position_sub (handle, &position, fixture->id));
+ g_assert (rsvg_handle_get_dimensions_sub (handle, &dimension, fixture->id));
+ } else {
+ rsvg_handle_get_dimensions (handle, &dimension);
+ }
+
+ if (fixture->has_position) {
+ g_assert_cmpint (fixture->x, ==, position.x);
+ g_assert_cmpint (fixture->y, ==, position.y);
+ }
+
+ if (fixture->has_dimensions) {
+ g_assert_cmpint (fixture->width, ==, dimension.width);
+ g_assert_cmpint (fixture->height, ==, dimension.height);
+ }
+
+ g_object_unref (handle);
+}
+
+static DimensionsFixtureData dimensions_fixtures[] =
+{
+ {
+ "/dimensions/viewbox_only",
+ "dimensions/bug608102.svg",
+ NULL,
+ 0, 0, 16, 16,
+ FALSE, TRUE
+ },
+ {
+ "/dimensions/hundred_percent_width_and_height",
+ "dimensions/bug612951.svg",
+ NULL,
+ 0, 0, 47, 47.14,
+ FALSE, TRUE
+ },
+ {
+ "/dimensions/viewbox_only_2",
+ "dimensions/bug614018.svg",
+ NULL,
+ 0, 0, 972, 546,
+ FALSE, TRUE
+ },
+ {
+ "/dimensions/sub/rect_no_unit",
+ "dimensions/sub-rect-no-unit.svg",
+ "#rect-no-unit",
+ 0, 0, 44, 45,
+ FALSE, TRUE
+ },
+ {
+ "/dimensions/with_viewbox",
+ "dimensions/bug521-with-viewbox.svg",
+ "#foo",
+ 50.0, 60.0, 70.0, 80.0,
+ TRUE, TRUE
+ },
+ {
+ "/dimensions/sub/823",
+ "dimensions/bug823-position-sub.svg",
+ "#pad_width",
+ 444.0, 139.0, 0.0, 0.0,
+ TRUE, FALSE
+ },
+};
+
+typedef struct
+{
+ const char *test_name;
+ const char *fixture;
+ size_t buf_size;
+} LoadingTestData;
+
+static void
+load_n_bytes_at_a_time (gconstpointer data)
+{
+ const LoadingTestData *fixture_data = data;
+ char *filename = g_build_filename (test_utils_get_test_data_path (), fixture_data->fixture, NULL);
+ guchar *buf = g_new (guchar, fixture_data->buf_size);
+ gboolean done;
+
+ RsvgHandle *handle;
+ FILE *file;
+
+ file = fopen (filename, "rb");
+ g_assert_nonnull (file);
+
+ handle = rsvg_handle_new_with_flags (RSVG_HANDLE_FLAGS_NONE);
+
+ done = FALSE;
+
+ do {
+ size_t num_read;
+
+ num_read = fread (buf, 1, fixture_data->buf_size, file);
+
+ if (num_read > 0) {
+ g_assert_true (rsvg_handle_write (handle, buf, num_read, NULL));
+ } else {
+ g_assert_cmpint (ferror (file), ==, 0);
+
+ if (feof (file)) {
+ done = TRUE;
+ }
+ }
+ } while (!done);
+
+ fclose (file);
+ g_free (filename);
+
+ g_assert_true (rsvg_handle_close (handle, NULL));
+
+ g_object_unref (handle);
+
+ g_free (buf);
+}
+
+static LoadingTestData loading_tests[] = {
+ { "/loading/one-byte-at-a-time", "loading/gnome-cool.svg", 1 },
+ { "/loading/compressed-one-byte-at-a-time", "loading/gnome-cool.svgz", 1 },
+ { "/loading/compressed-two-bytes-at-a-time", "loading/gnome-cool.svgz", 2 } /* to test reading the entire gzip header */
+};
+
+/* Tests for the deprecated GdkPixbuf-based API */
+static void
+add_pixbuf_tests (void)
+{
+ int i;
+
+ for (i = 0; i < G_N_ELEMENTS (pixbuf_tests); i++) {
+ g_test_add_data_func (pixbuf_tests[i].test_name, &pixbuf_tests[i], test_pixbuf);
+ }
+
+ g_test_add_func ("/api/pixbuf_overflow", pixbuf_overflow);
+}
+
+/* Tests for the C API of librsvg*/
+static void
+add_api_tests (void)
+{
+ g_test_add_func ("/api/handle_has_correct_type_info", handle_has_correct_type_info);
+ g_test_add_func ("/api/flags_registration", flags_registration);
+ g_test_add_func ("/api/error_registration", error_registration);
+ g_test_add_func ("/api/noops", noops);
+ g_test_add_func ("/api/noops_return_null", noops_return_null);
+ g_test_add_func ("/api/set_dpi", set_dpi);
+ g_test_add_func ("/api/base_uri", base_uri);
+ g_test_add_func ("/api/base_gfile", base_gfile);
+ g_test_add_func ("/api/handle_write_close_free", handle_write_close_free);
+ g_test_add_func ("/api/handle_new_from_file", handle_new_from_file);
+ g_test_add_func ("/api/handle_new_from_data", handle_new_from_data);
+ g_test_add_func ("/api/handle_new_from_gfile_sync", handle_new_from_gfile_sync);
+ g_test_add_func ("/api/handle_new_from_stream_sync", handle_new_from_stream_sync);
+ g_test_add_func ("/api/handle_read_stream_sync", handle_read_stream_sync);
+ g_test_add_func ("/api/handle_has_sub", handle_has_sub);
+ g_test_add_func ("/api/handle_get_pixbuf", handle_get_pixbuf);
+ g_test_add_func ("/api/handle_get_pixbuf_sub", handle_get_pixbuf_sub);
+ g_test_add_func ("/api/dimensions_and_position", dimensions_and_position);
+ g_test_add_func ("/api/set_size_callback", set_size_callback);
+ g_test_add_func ("/api/reset_size_callback", reset_size_callback);
+ g_test_add_func ("/api/render_with_zero_size_callback", render_with_zero_size_callback);
+ g_test_add_func ("/api/get_pixbuf_with_size_callback", get_pixbuf_with_size_callback);
+ g_test_add_func ("/api/detects_cairo_context_in_error", detects_cairo_context_in_error);
+ g_test_add_func ("/api/can_draw_to_non_image_surface", can_draw_to_non_image_surface);
+ g_test_add_func ("/api/render_cairo_sub", render_cairo_sub);
+ g_test_add_func ("/api/get_intrinsic_dimensions", get_intrinsic_dimensions);
+ g_test_add_func ("/api/get_intrinsic_dimensions_missing_values", get_intrinsic_dimensions_missing_values);
+ g_test_add_func ("/api/get_intrinsic_size_in_pixels/yes", get_intrinsic_size_in_pixels_yes);
+ g_test_add_func ("/api/get_intrinsic_size_in_pixels/no", get_intrinsic_size_in_pixels_no);
+ g_test_add_func ("/api/set_stylesheet", set_stylesheet);
+ g_test_add_func ("/api/render_document", render_document);
+ g_test_add_func ("/api/get_geometry_for_layer", get_geometry_for_layer);
+ g_test_add_func ("/api/render_layer", render_layer);
+ g_test_add_func ("/api/untransformed_element", untransformed_element);
+ g_test_add_func ("/api/no_write_before_close", no_write_before_close);
+ g_test_add_func ("/api/empty_write_close", empty_write_close);
+ g_test_add_func ("/api/cannot_request_external_elements", cannot_request_external_elements);
+ g_test_add_func ("/api/property_flags", property_flags);
+ g_test_add_func ("/api/property_dpi", property_dpi);
+ g_test_add_func ("/api/property_base_uri", property_base_uri);
+ g_test_add_func ("/api/property_dimensions", property_dimensions);
+ g_test_add_func ("/api/property_deprecated", property_deprecated);
+ g_test_add_func ("/api/return_if_fail", return_if_fail);
+ g_test_add_func ("/api/return_if_fail_null_check", return_if_fail_null_check);
+ g_test_add_func ("/api/return_if_fail_type_check", return_if_fail_type_check);
+ g_test_add_func ("/api/library_version_defines", library_version_defines);
+ g_test_add_func ("/api/library_version_check", library_version_check);
+ g_test_add_func ("/api/library_version_constants", library_version_constants);
+}
+
+/* Tests for the deprecated APIs to get geometries */
+static void
+add_geometry_tests (void)
+{
+ int i;
+
+ for (i = 0; i < G_N_ELEMENTS (dimensions_fixtures); i++)
+ g_test_add_data_func (dimensions_fixtures[i].test_name, &dimensions_fixtures[i], (void*)test_dimensions);
+}
+
+/* Tests for the deprecated API for loading bytes at a time */
+static void
+add_loading_tests (void)
+{
+ int i;
+
+ for (i = 0; i < G_N_ELEMENTS (loading_tests); i++) {
+ g_test_add_data_func (loading_tests[i].test_name, &loading_tests[i], load_n_bytes_at_a_time);
+ }
+}
+
+int
+main (int argc, char **argv)
+{
+ g_test_init (&argc, &argv, NULL);
+
+ test_utils_print_dependency_versions ();
+
+ add_pixbuf_tests ();
+ add_api_tests ();
+ add_geometry_tests ();
+ add_loading_tests ();
+
+ return g_test_run ();
+}
diff --git a/rsvg/tests/fixtures/api/bug334-element-positions.svg b/rsvg/tests/fixtures/api/bug334-element-positions.svg
new file mode 100644
index 00000000..4619e13c
--- /dev/null
+++ b/rsvg/tests/fixtures/api/bug334-element-positions.svg
@@ -0,0 +1,380 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="409.2084"
+ height="411.271"
+ viewBox="0 0 409.2084 411.27099"
+ version="1.1"
+ id="svg8"
+ inkscape:version="0.92.1 r"
+ sodipodi:docname="logitech-g403.svg"
+ inkscape:export-filename="/home/jimmac/logitech-g403.png"
+ inkscape:export-xdpi="96"
+ inkscape:export-ydpi="96">
+ <defs
+ id="defs2" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1.4142135"
+ inkscape:cx="223.25242"
+ inkscape:cy="156.77583"
+ inkscape:document-units="px"
+ inkscape:current-layer="LEDs"
+ inkscape:document-rotation="0"
+ showgrid="false"
+ units="px"
+ borderlayer="true"
+ inkscape:showpageshadow="false"
+ inkscape:pagecheckerboard="false"
+ showguides="true"
+ inkscape:window-width="1366"
+ inkscape:window-height="704"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ fit-margin-top="20"
+ fit-margin-left="20"
+ fit-margin-bottom="20"
+ fit-margin-right="0">
+ <inkscape:grid
+ type="xygrid"
+ id="grid956"
+ originx="-68.791593"
+ originy="1.2767161" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata5">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="Device"
+ inkscape:label="Device"
+ transform="translate(-68.791597,-390.00576)">
+ <path
+ inkscape:connector-curvature="0"
+ style="color:#000000;overflow:visible;opacity:1;vector-effect:none;fill:#d3d3ce;fill-opacity:1;stroke:#babdb6;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal"
+ d="m 175.34499,424.02062 c -24.661,4.08226 -60.18056,22.01925 -69.18502,28.18484 -7.932853,5.43184 -10.801193,13.70196 -10.925233,20.94538 -0.72438,42.30084 10.273313,88.0482 7.561093,130.50252 -1.21026,18.94414 -7.437413,51.01218 -9.969593,64.24176 -1.65073,6.85296 -2.50133,13.87513 -2.53464,20.92508 2.7e-4,50.2338 40.610433,90.95628 90.705683,90.95655 45.46938,-0.0495 82.39643,-34.07041 89.82748,-79.05254 10.66083,-64.53278 10.42629,-136.39723 11.98541,-204.91567 0.28464,-12.50912 -1.94334,-23.29335 -8.32377,-31.80289 -13.26086,-21.57098 -66.73071,-40.02924 -66.73071,-40.02924 v 7.19061 h -32.4107 z"
+ id="path870"
+ sodipodi:nodetypes="cssscccssccccc" />
+ <path
+ style="color:#000000;overflow:visible;opacity:1;vector-effect:none;fill:#eeeeec;fill-opacity:1;stroke:#babdb6;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal"
+ d="m 208.56756,431.16702 -3,141.31424 c -0.14923,7.02936 -6.07063,12.69123 -13.61129,12.69123 -7.54065,0 -13.46205,-5.66187 -13.61128,-12.69123 l -3,-141.31424 z"
+ id="rect913"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cssscc" />
+ <path
+ sodipodi:nodetypes="cscsc"
+ inkscape:connector-curvature="0"
+ id="path950"
+ d="m 95.373251,486.43435 c 38.955159,101.12102 48.667459,140.67087 51.422819,177.84397 2.03646,27.47435 -36.96151,79.62933 -36.96151,79.62933 0,0 -24.033873,-37.15986 -19.463976,-61.45137 10.258966,-54.53208 19.996276,-75.99616 5.002667,-196.02193 z"
+ style="color:#000000;overflow:visible;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#bfc2bb;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal" />
+ <path
+ style="color:#000000;overflow:visible;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#babdb6;stroke-width:1;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal"
+ d="m 104.9358,539.80779 c 2.40195,-0.25238 2.7176,0.9048 2.96999,3.30675 l 5.69164,54.1678 c 0.25238,2.40194 -1.47813,4.53882 -3.88008,4.7912 -2.40195,0.25239 -5.44876,-8.75375 -5.55682,-11.1665 l -2.02953,-45.3135 c -0.10806,-2.41275 0.40286,-5.53337 2.8048,-5.78575 z"
+ id="button4"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="sssssss"
+ inkscape:label="#rect921" />
+ <path
+ sodipodi:nodetypes="sssssss"
+ inkscape:connector-curvature="0"
+ id="button3"
+ d="m 109.77779,602.64876 c 2.40195,-0.25239 4.53882,1.47813 4.79121,3.88007 l 5.69164,54.1678 c 0.25238,2.40195 -1.47814,4.53883 -3.88008,4.79121 -2.40195,0.25238 -7.77772,-8.87659 -7.89239,-11.28904 l -1.91843,-40.36308 c -0.11466,-2.41244 0.8061,-10.93458 3.20805,-11.18696 z"
+ style="color:#000000;overflow:visible;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#babdb6;stroke-width:1;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal"
+ inkscape:label="#path924" />
+ <rect
+ style="color:#000000;overflow:visible;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#babdb6;stroke-width:1;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal"
+ id="button2"
+ width="23.155933"
+ height="69.467796"
+ x="180.55382"
+ y="454.99139"
+ rx="11.577967"
+ ry="11.577967"
+ inkscape:label="#rect932" />
+ <path
+ sodipodi:nodetypes="cssscc"
+ inkscape:connector-curvature="0"
+ id="button5"
+ d="m 201.20722,551.97605 -0.65676,17.92859 c -0.16469,4.49569 -3.83301,8.12045 -8.59419,8.12045 -4.76117,0 -8.49995,-3.62273 -8.59417,-8.12045 l -0.65677,-17.92859 z"
+ style="color:#000000;overflow:visible;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#babdb6;stroke-width:1;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal"
+ inkscape:label="#path942" />
+ <path
+ style="color:#000000;overflow:visible;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#bfc2bb;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal"
+ d="m 281.45725,491.14612 c -30.15796,102.59778 -42.11413,137.63368 -50.74442,173.1322 -6.50823,26.76995 22.13723,79.62933 22.13723,79.62933 0,0 13.58979,-21.97214 16.0745,-32.60727 16.80373,-71.92371 12.53269,-220.15426 12.53269,-220.15426 z"
+ id="path946"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cscsc" />
+ <path
+ style="color:#000000;overflow:visible;opacity:1;vector-effect:none;fill:#d3d3ce;fill-opacity:1;stroke:#bfc2bb;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal"
+ d="m 207.75569,423.97641 -1.77476,128.93066 47.96839,25.54626 27.50793,-87.30721 c 4.86457,-36.68335 -44.6715,-55.30429 -73.70156,-67.16971 z"
+ id="button1"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc"
+ inkscape:label="#path944" />
+ <path
+ sodipodi:nodetypes="ccccsc"
+ inkscape:connector-curvature="0"
+ id="button0"
+ d="m 174.78525,423.6101 3.03798,129.76808 -49.23161,25.07515 -33.218369,-92.01898 c -1.039426,-19.85252 -0.81982,-28.05969 15.888469,-37.87541 17.53477,-10.30125 42.4825,-20.7564 63.52353,-24.94884 z"
+ style="color:#000000;overflow:visible;opacity:1;vector-effect:none;fill:#d3d3ce;fill-opacity:1;stroke:#bfc2bb;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal"
+ inkscape:label="#path948" />
+ <path
+ style="color:#000000;display:inline;overflow:visible;vector-effect:none;fill:none;fill-opacity:1;stroke:#babdb6;stroke-width:10;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="led0"
+ sodipodi:type="arc"
+ sodipodi:cx="-656.78052"
+ sodipodi:cy="189.57951"
+ sodipodi:rx="19.936752"
+ sodipodi:ry="19.936752"
+ sodipodi:start="0.78539816"
+ sodipodi:end="5.4977871"
+ sodipodi:arc-type="arc"
+ d="m -642.6831,203.67693 a 19.936752,19.936752 0 0 1 -28.19483,0 19.936752,19.936752 0 0 1 0,-28.19483 19.936752,19.936752 0 0 1 28.19482,0"
+ sodipodi:open="true"
+ transform="rotate(-90)"
+ inkscape:label="#path883" />
+ <path
+ style="fill:#babdb6;fill-opacity:1;stroke:#babdb6;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 192.13178,454.61765 c 0,70.18035 0,70.18035 0,70.18035"
+ id="led1"
+ inkscape:connector-curvature="0"
+ inkscape:label="#path42" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="Buttons"
+ inkscape:label="Buttons"
+ style="display:inline"
+ transform="translate(-68.791597,9.994236)">
+ <g
+ id="button1-path"
+ inkscape:label="#g131">
+ <path
+ sodipodi:nodetypes="cc"
+ style="color:#000000;overflow:visible;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#888a85;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal"
+ d="M 242.94764,50.505764 H 477"
+ id="path958"
+ inkscape:connector-curvature="0" />
+ <rect
+ style="color:#000000;overflow:visible;opacity:1;vector-effect:none;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal"
+ id="rect968"
+ width="6.999999"
+ height="6.999999"
+ x="237"
+ y="47.005764" />
+ <rect
+ inkscape:label="#rect867"
+ style="color:#000000;text-align:start;overflow:visible;vector-effect:none;fill:#888a85;fill-opacity:1;stroke:none;stroke-linecap:round"
+ id="button1-leader"
+ width="1"
+ height="1"
+ x="477"
+ y="50.005764" />
+ </g>
+ <g
+ id="button0-path"
+ inkscape:label="#g141">
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path960"
+ d="M 477,130.50576 H 161.34398"
+ style="color:#000000;overflow:visible;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#888a85;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal" />
+ <rect
+ y="127.00576"
+ x="157"
+ height="6.999999"
+ width="6.999999"
+ id="rect970"
+ style="color:#000000;overflow:visible;opacity:1;vector-effect:none;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal" />
+ <rect
+ inkscape:label="#rect871"
+ style="color:#000000;text-align:start;overflow:visible;vector-effect:none;fill:#888a85;fill-opacity:1;stroke:none;stroke-linecap:round"
+ id="button0-leader"
+ width="1"
+ height="1"
+ x="477"
+ y="130.00577" />
+ </g>
+ <g
+ id="button4-path"
+ inkscape:label="#g151">
+ <path
+ sodipodi:nodetypes="ccc"
+ inkscape:connector-curvature="0"
+ id="path964"
+ d="M 109.31232,181.51438 137.74787,210.44326 477,210.50576"
+ style="color:#000000;overflow:visible;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#888a85;stroke-width:0.99999994;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal" />
+ <rect
+ inkscape:label="#rect875"
+ style="color:#000000;text-align:start;overflow:visible;vector-effect:none;fill:#888a85;fill-opacity:1;stroke:none;stroke-linecap:round"
+ id="button4-leader"
+ width="1"
+ height="1"
+ x="477"
+ y="210.00577" />
+ <rect
+ y="177"
+ x="105"
+ height="6.999999"
+ width="6.999999"
+ id="rect974"
+ style="color:#000000;overflow:visible;opacity:1;vector-effect:none;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal" />
+ </g>
+ <g
+ id="button2-path"
+ inkscape:label="#g136">
+ <rect
+ inkscape:label="#rect869"
+ y="90.00576"
+ x="477"
+ height="1"
+ width="1"
+ id="button2-leader"
+ style="color:#000000;text-align:start;overflow:visible;vector-effect:none;fill:#888a85;fill-opacity:1;stroke:none;stroke-linecap:round" />
+ <path
+ style="color:#000000;overflow:visible;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#888a85;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal"
+ d="m 195.97852,108.49147 17.9857,-17.98571 H 477"
+ id="path908"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <rect
+ style="color:#000000;overflow:visible;opacity:1;vector-effect:none;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal"
+ id="rect910"
+ width="6.999999"
+ height="6.999999"
+ x="194"
+ y="104" />
+ </g>
+ <g
+ id="button3-path"
+ inkscape:label="#g156">
+ <path
+ sodipodi:nodetypes="cc"
+ style="color:#000000;overflow:visible;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#888a85;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal"
+ d="M 114.17805,250.50576 H 477"
+ id="path966"
+ inkscape:connector-curvature="0" />
+ <rect
+ style="color:#000000;overflow:visible;opacity:1;vector-effect:none;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal"
+ id="rect976"
+ width="6.999999"
+ height="6.999999"
+ x="108"
+ y="247.00577" />
+ <rect
+ y="250.00575"
+ x="477"
+ height="1"
+ width="1"
+ id="button3-leader"
+ style="color:#000000;text-align:start;overflow:visible;vector-effect:none;fill:#888a85;fill-opacity:1;stroke:none;stroke-linecap:round"
+ inkscape:label="#rect875" />
+ </g>
+ <g
+ id="button5-path"
+ inkscape:label="#g146">
+ <path
+ style="color:#000000;overflow:visible;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#888a85;stroke-width:0.99999994;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal"
+ d="M 476.55132,170.50615 H 193.34398"
+ id="path51"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <rect
+ style="color:#000000;overflow:visible;opacity:1;vector-effect:none;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal"
+ id="rect53"
+ width="6.999999"
+ height="6.999999"
+ x="189"
+ y="167" />
+ <rect
+ y="170"
+ x="477"
+ height="1"
+ width="1"
+ id="button5-leader"
+ style="color:#000000;text-align:start;overflow:visible;vector-effect:none;fill:#888a85;fill-opacity:1;stroke:none;stroke-linecap:round"
+ inkscape:label="#rect871" />
+ </g>
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="LEDs"
+ inkscape:label="LEDs"
+ style="display:inline"
+ transform="translate(-68.791597,9.994236)">
+ <g
+ id="led0-path"
+ inkscape:label="#g161">
+ <path
+ inkscape:connector-curvature="0"
+ id="path877"
+ d="M 477,290.50577 H 208.64438 l -18.97696,-18.97696"
+ style="color:#000000;display:inline;overflow:visible;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#888a85;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal"
+ sodipodi:nodetypes="cc" />
+ <rect
+ y="271"
+ x="186"
+ height="6.999999"
+ width="6.999999"
+ id="rect879"
+ style="color:#000000;display:inline;overflow:visible;opacity:1;vector-effect:none;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal" />
+ <rect
+ inkscape:label="#rect881"
+ y="290.00577"
+ x="477"
+ height="1"
+ width="1"
+ id="led0-leader"
+ style="color:#000000;text-align:start;display:inline;overflow:visible;vector-effect:none;fill:#888a85;fill-opacity:1;stroke:none;stroke-linecap:round" />
+ </g>
+ <g
+ id="led1-path"
+ inkscape:label="#g126">
+ <path
+ sodipodi:nodetypes="ccc"
+ style="color:#000000;display:inline;overflow:visible;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#888a85;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal"
+ d="M 476.99745,10.505764 H 247.7728 l -51.03686,51.503873"
+ id="path4525"
+ inkscape:connector-curvature="0" />
+ <rect
+ style="color:#000000;text-align:start;display:inline;overflow:visible;vector-effect:none;fill:#888a85;fill-opacity:1;stroke:none;stroke-linecap:round"
+ id="led1-leader"
+ width="1"
+ height="1"
+ x="477"
+ y="10.005764"
+ inkscape:label="#rect881" />
+ <rect
+ style="color:#000000;display:inline;overflow:visible;opacity:1;vector-effect:none;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal"
+ id="rect4544"
+ width="6.999999"
+ height="6.999999"
+ x="190.67345"
+ y="59.51358" />
+ </g>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/api/document.svg b/rsvg/tests/fixtures/api/document.svg
new file mode 100644
index 00000000..49cfd07e
--- /dev/null
+++ b/rsvg/tests/fixtures/api/document.svg
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="50" height="50">
+ <g opacity="0.5">
+ <rect x="10" y="10" width="30" height="30" fill="blue"/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/api/dpi.svg b/rsvg/tests/fixtures/api/dpi.svg
new file mode 100644
index 00000000..499ee206
--- /dev/null
+++ b/rsvg/tests/fixtures/api/dpi.svg
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="1in" height="4in" viewBox="0 0 100 400">
+ <rect id="one" x="0" y="0" width="100" height="200" fill="rgb(0,255,0)"/>
+ <rect id="two" x="0" y="200" width="100" height="200" fill="rgb(0,0,255)"/>
+</svg>
diff --git a/rsvg/tests/fixtures/api/example.svg b/rsvg/tests/fixtures/api/example.svg
new file mode 100644
index 00000000..850fba3e
--- /dev/null
+++ b/rsvg/tests/fixtures/api/example.svg
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="100" height="400" viewBox="0 0 100 400">
+ <rect id="one" x="0" y="0" width="100" height="200" fill="rgb(0,255,0)"/>
+ <rect id="two" x="0" y="200" width="100" height="200" fill="rgb(0,0,255)"/>
+</svg>
diff --git a/rsvg/tests/fixtures/api/geometry-element.svg b/rsvg/tests/fixtures/api/geometry-element.svg
new file mode 100644
index 00000000..3d707cdc
--- /dev/null
+++ b/rsvg/tests/fixtures/api/geometry-element.svg
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100">
+ <g transform="rotate(45)" stroke-width="10" stroke="#000000">
+ <rect id="foo" x="10" y="20" width="30" height="40" fill="#0000ff"/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/api/geometry.svg b/rsvg/tests/fixtures/api/geometry.svg
new file mode 100644
index 00000000..b50bf2a9
--- /dev/null
+++ b/rsvg/tests/fixtures/api/geometry.svg
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="100" height="400" viewBox="0 0 100 400">
+ <rect id="one" x="0" y="0" width="100" height="200" fill="rgb(0,255,0)"/>
+ <rect id="two" x="10" y="200" width="80" height="100" fill="rgb(0,0,255)"
+ stroke-width="10" stroke="black"/>
+</svg>
diff --git a/rsvg/tests/fixtures/api/layers.svg b/rsvg/tests/fixtures/api/layers.svg
new file mode 100644
index 00000000..73fc5cb9
--- /dev/null
+++ b/rsvg/tests/fixtures/api/layers.svg
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100">
+ <rect id="foo" x="10" y="10" width="30" height="30" fill="#00ff00"/>
+ <rect id="bar" x="20" y="20" width="30" height="30" fill="#0000ff"/>
+</svg>
diff --git a/rsvg/tests/fixtures/api/no-size.svg b/rsvg/tests/fixtures/api/no-size.svg
new file mode 100644
index 00000000..1a45cb32
--- /dev/null
+++ b/rsvg/tests/fixtures/api/no-size.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%"/>
diff --git a/rsvg/tests/fixtures/api/no-viewbox.svg b/rsvg/tests/fixtures/api/no-viewbox.svg
new file mode 100644
index 00000000..1a45cb32
--- /dev/null
+++ b/rsvg/tests/fixtures/api/no-viewbox.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%"/>
diff --git a/rsvg/tests/fixtures/api/size.svg b/rsvg/tests/fixtures/api/size.svg
new file mode 100644
index 00000000..25c1e0bf
--- /dev/null
+++ b/rsvg/tests/fixtures/api/size.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="2in" height="3in"/>
diff --git a/rsvg/tests/fixtures/api/stylesheet-ref.svg b/rsvg/tests/fixtures/api/stylesheet-ref.svg
new file mode 100644
index 00000000..5f54672d
--- /dev/null
+++ b/rsvg/tests/fixtures/api/stylesheet-ref.svg
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100">
+ <rect id="foo" x="10" y="20" width="30" height="40" fill="#00ff00"/>
+</svg>
diff --git a/rsvg/tests/fixtures/api/stylesheet.svg b/rsvg/tests/fixtures/api/stylesheet.svg
new file mode 100644
index 00000000..118ff2fb
--- /dev/null
+++ b/rsvg/tests/fixtures/api/stylesheet.svg
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- This gets styled with stylesheet.css -->
+<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100">
+ <rect id="foo" x="10" y="20" width="30" height="40" fill="black"/>
+</svg>
diff --git a/rsvg/tests/fixtures/cmdline/a-link.svg b/rsvg/tests/fixtures/cmdline/a-link.svg
new file mode 100644
index 00000000..1ae8ace5
--- /dev/null
+++ b/rsvg/tests/fixtures/cmdline/a-link.svg
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="400" height="400" xmlns="http://www.w3.org/2000/svg">
+ <a href="https://example.com">
+ <rect x="100" y="100" width="200" height="200" fill="lime"/>
+ </a>
+</svg>
diff --git a/rsvg/tests/fixtures/cmdline/accept-language-de.png b/rsvg/tests/fixtures/cmdline/accept-language-de.png
new file mode 100644
index 00000000..cc797dc2
--- /dev/null
+++ b/rsvg/tests/fixtures/cmdline/accept-language-de.png
Binary files differ
diff --git a/rsvg/tests/fixtures/cmdline/accept-language-es.png b/rsvg/tests/fixtures/cmdline/accept-language-es.png
new file mode 100644
index 00000000..4cf3a21f
--- /dev/null
+++ b/rsvg/tests/fixtures/cmdline/accept-language-es.png
Binary files differ
diff --git a/rsvg/tests/fixtures/cmdline/accept-language-fallback.png b/rsvg/tests/fixtures/cmdline/accept-language-fallback.png
new file mode 100644
index 00000000..43b20f01
--- /dev/null
+++ b/rsvg/tests/fixtures/cmdline/accept-language-fallback.png
Binary files differ
diff --git a/rsvg/tests/fixtures/cmdline/accept-language.svg b/rsvg/tests/fixtures/cmdline/accept-language.svg
new file mode 100644
index 00000000..c132b65d
--- /dev/null
+++ b/rsvg/tests/fixtures/cmdline/accept-language.svg
@@ -0,0 +1,7 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100">
+ <switch allowReorder="yes">
+ <rect systemLanguage="de" fill="red" width="10" height="10" />
+ <rect systemLanguage="es" fill="lime" width="10" height="10" />
+ <rect fill="yellow" id="rect3" width="10" height="10" />
+ </switch>
+</svg>
diff --git a/rsvg/tests/fixtures/cmdline/bug601-zero-stroke-width-render-only-foo.png b/rsvg/tests/fixtures/cmdline/bug601-zero-stroke-width-render-only-foo.png
new file mode 100644
index 00000000..1ed070ca
--- /dev/null
+++ b/rsvg/tests/fixtures/cmdline/bug601-zero-stroke-width-render-only-foo.png
Binary files differ
diff --git a/rsvg/tests/fixtures/cmdline/bug601-zero-stroke-width.svg b/rsvg/tests/fixtures/cmdline/bug601-zero-stroke-width.svg
new file mode 100644
index 00000000..ee96d474
--- /dev/null
+++ b/rsvg/tests/fixtures/cmdline/bug601-zero-stroke-width.svg
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100">
+ <g id="foo">
+ <rect x="50" y="50" width="10" height="10" style="stroke-width: 0; stroke: black; fill: blue"/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/cmdline/bug677-partial-pixel.svg b/rsvg/tests/fixtures/cmdline/bug677-partial-pixel.svg
new file mode 100644
index 00000000..aeac8c30
--- /dev/null
+++ b/rsvg/tests/fixtures/cmdline/bug677-partial-pixel.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="1.2" height="1.8">
+ <!-- Output should be an image 2x2 pixels in size, with partial coverage for the pixels
+ on the right and bottom.
+ -->
+ <rect x="0" y="0" width="1.2" height="1.8" fill="lime"/>
+</svg>
diff --git a/rsvg/tests/fixtures/cmdline/dimensions-in.svg b/rsvg/tests/fixtures/cmdline/dimensions-in.svg
new file mode 100644
index 00000000..aa4f3219
--- /dev/null
+++ b/rsvg/tests/fixtures/cmdline/dimensions-in.svg
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="1in" height="1in" viewBox="0 0 1 1">
+ <rect x="0" y="0" width="1" height="1" fill="blue"/>
+</svg>
diff --git a/rsvg/tests/fixtures/cmdline/gimp-wilber-ref.png b/rsvg/tests/fixtures/cmdline/gimp-wilber-ref.png
new file mode 100644
index 00000000..606f2a4d
--- /dev/null
+++ b/rsvg/tests/fixtures/cmdline/gimp-wilber-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/cmdline/gimp-wilber.svg b/rsvg/tests/fixtures/cmdline/gimp-wilber.svg
new file mode 100644
index 00000000..97c821a7
--- /dev/null
+++ b/rsvg/tests/fixtures/cmdline/gimp-wilber.svg
@@ -0,0 +1,978 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://web.resource.org/cc/"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ inkscape:export-ydpi="120"
+ inkscape:export-xdpi="120"
+ inkscape:export-filename="/home/jimmac/src/cvs/gnome/gimp/themes/Default/images/stock-wilber-64.png"
+ width="48px"
+ height="48px"
+ id="svg11300"
+ sodipodi:version="0.32"
+ inkscape:version="0.44+devel"
+ sodipodi:docbase="/home/jimmac/src/cvs/gnome/gimp/themes/Default/images"
+ sodipodi:docname="stock-wilber.svg">
+ <defs
+ id="defs3">
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8534"
+ id="linearGradient8951"
+ gradientUnits="userSpaceOnUse"
+ x1="26.162951"
+ y1="30.543303"
+ x2="24.328892"
+ y2="30.985245" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2446"
+ id="linearGradient8949"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.755165,0.395143,-0.395143,0.755165,-25.91245,6.532586)"
+ x1="13.236155"
+ y1="37.752247"
+ x2="7.7521091"
+ y2="42.282146" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6963"
+ id="radialGradient8947"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.572694,0,0,1.532639,-55.36682,-21.35823)"
+ cx="15.415101"
+ cy="35.356506"
+ fx="15.415101"
+ fy="35.356506"
+ r="7.5791559" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6939"
+ id="linearGradient8945"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-46.40695,-1.802856)"
+ x1="19.394735"
+ y1="30.001331"
+ x2="23.109331"
+ y2="33.438831" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6951"
+ id="linearGradient8943"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-49.30496,1.877723)"
+ x1="37.017639"
+ y1="19.239889"
+ x2="27.753893"
+ y2="11.182488" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6468"
+ id="radialGradient8941"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.318488,0,0,1.318488,-22.1264,-6.241691)"
+ cx="69.473244"
+ cy="19.597878"
+ fx="69.473244"
+ fy="19.597878"
+ r="3.5153139" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6452"
+ id="linearGradient8939"
+ gradientUnits="userSpaceOnUse"
+ x1="6.3051529"
+ y1="23.362427"
+ x2="5.9846287"
+ y2="31.57" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8542"
+ id="radialGradient8937"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.916159,9.318684e-2,-0.108765,1.069309,3.253668,-3.029272)"
+ cx="6.0242186"
+ cy="25.271027"
+ fx="6.0242186"
+ fy="25.271027"
+ r="4.8310289" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8524"
+ id="linearGradient8935"
+ gradientUnits="userSpaceOnUse"
+ x1="14.96875"
+ y1="19.110678"
+ x2="39.524544"
+ y2="46.98568" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6482"
+ id="linearGradient8933"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-3.836549,0.345971)"
+ x1="32.350136"
+ y1="28.083355"
+ x2="21.213203"
+ y2="30.293064" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6500"
+ id="radialGradient8931"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.77275,0,0,1.29668,-16.3404,-6.615959)"
+ cx="18.557627"
+ cy="22.300018"
+ fx="18.557627"
+ fy="22.300018"
+ r="19.2292" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6492"
+ id="radialGradient8929"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,0.284247,0,24.29088)"
+ cx="23"
+ cy="33.9375"
+ fx="23"
+ fy="33.9375"
+ r="18.25" />
+ <linearGradient
+ id="linearGradient8542">
+ <stop
+ style="stop-color:#5b676b;stop-opacity:1;"
+ offset="0"
+ id="stop8544" />
+ <stop
+ style="stop-color:#141718;stop-opacity:1;"
+ offset="1"
+ id="stop8546" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient8534">
+ <stop
+ style="stop-color:black;stop-opacity:1;"
+ offset="0"
+ id="stop8536" />
+ <stop
+ style="stop-color:black;stop-opacity:0;"
+ offset="1"
+ id="stop8538" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient8524">
+ <stop
+ style="stop-color:white;stop-opacity:1;"
+ offset="0"
+ id="stop8526" />
+ <stop
+ style="stop-color:white;stop-opacity:0;"
+ offset="1"
+ id="stop8528" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2446">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop2448" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop2450" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient6963">
+ <stop
+ style="stop-color:#696969;stop-opacity:1;"
+ offset="0"
+ id="stop6965" />
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="1"
+ id="stop6967" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient6939">
+ <stop
+ style="stop-color:#bdbdbd;stop-opacity:1;"
+ offset="0"
+ id="stop6941" />
+ <stop
+ id="stop6947"
+ offset="0.33333334"
+ style="stop-color:#e2e2e2;stop-opacity:1;" />
+ <stop
+ style="stop-color:#a3a3a3;stop-opacity:1;"
+ offset="0.66666669"
+ id="stop6949" />
+ <stop
+ style="stop-color:#dddddd;stop-opacity:1;"
+ offset="1"
+ id="stop6943" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient6951">
+ <stop
+ style="stop-color:#6e3d09;stop-opacity:1;"
+ offset="0"
+ id="stop6953" />
+ <stop
+ id="stop6959"
+ offset="0.24242425"
+ style="stop-color:#ea8113;stop-opacity:1;" />
+ <stop
+ style="stop-color:#5c3307;stop-opacity:1;"
+ offset="0.62121212"
+ id="stop6961" />
+ <stop
+ style="stop-color:#e07c12;stop-opacity:1;"
+ offset="1"
+ id="stop6955" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient6500">
+ <stop
+ style="stop-color:#857c63;stop-opacity:1;"
+ offset="0"
+ id="stop6502" />
+ <stop
+ style="stop-color:#221f19;stop-opacity:1;"
+ offset="1"
+ id="stop6504" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6492">
+ <stop
+ style="stop-color:black;stop-opacity:1;"
+ offset="0"
+ id="stop6494" />
+ <stop
+ style="stop-color:black;stop-opacity:0;"
+ offset="1"
+ id="stop6496" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6482">
+ <stop
+ style="stop-color:black;stop-opacity:1;"
+ offset="0"
+ id="stop6484" />
+ <stop
+ style="stop-color:black;stop-opacity:0;"
+ offset="1"
+ id="stop6486" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient6468">
+ <stop
+ style="stop-color:white;stop-opacity:1;"
+ offset="0"
+ id="stop6470" />
+ <stop
+ style="stop-color:#b9b9b0;stop-opacity:1;"
+ offset="1"
+ id="stop6472" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6452">
+ <stop
+ style="stop-color:white;stop-opacity:1;"
+ offset="0"
+ id="stop6454" />
+ <stop
+ style="stop-color:white;stop-opacity:0;"
+ offset="1"
+ id="stop6456" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient11520">
+ <stop
+ id="stop11522"
+ offset="0.0000000"
+ style="stop-color:#ffffff;stop-opacity:1.0000000;" />
+ <stop
+ id="stop11524"
+ offset="1.0000000"
+ style="stop-color:#dcdcdc;stop-opacity:1.0000000;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient11508"
+ inkscape:collect="always">
+ <stop
+ id="stop11510"
+ offset="0"
+ style="stop-color:#000000;stop-opacity:1;" />
+ <stop
+ id="stop11512"
+ offset="1"
+ style="stop-color:#000000;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient11494"
+ inkscape:collect="always">
+ <stop
+ id="stop11496"
+ offset="0"
+ style="stop-color:#ef2929;stop-opacity:1;" />
+ <stop
+ id="stop11498"
+ offset="1"
+ style="stop-color:#ef2929;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient11415">
+ <stop
+ id="stop11417"
+ offset="0.0000000"
+ style="stop-color:#204a87;stop-opacity:0.0000000;" />
+ <stop
+ style="stop-color:#204a87;stop-opacity:1.0000000;"
+ offset="0.50000000"
+ id="stop11423" />
+ <stop
+ id="stop11419"
+ offset="1"
+ style="stop-color:#204a87;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient11399"
+ inkscape:collect="always">
+ <stop
+ id="stop11401"
+ offset="0"
+ style="stop-color:#000000;stop-opacity:1;" />
+ <stop
+ id="stop11403"
+ offset="1"
+ style="stop-color:#000000;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ gradientTransform="translate(-60.28571,-0.285714)"
+ y2="34.462429"
+ x2="43.615788"
+ y1="3.7744560"
+ x1="15.828360"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient11425"
+ xlink:href="#linearGradient11415"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientTransform="translate(-60.57143,0.000000)"
+ y2="39.033859"
+ x2="35.679932"
+ y1="9.3458843"
+ x1="9.6957054"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient11427"
+ xlink:href="#linearGradient11415"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="33.462429"
+ x2="26.758644"
+ y1="19.774456"
+ x1="13.267134"
+ gradientTransform="translate(-60.85714,0.428571)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient11439"
+ xlink:href="#linearGradient11415"
+ inkscape:collect="always" />
+ <radialGradient
+ r="8.5000000"
+ fy="39.142857"
+ fx="12.071428"
+ cy="39.142857"
+ cx="12.071428"
+ gradientTransform="matrix(1.000000,0.000000,0.000000,0.487395,0.000000,20.06483)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient11441"
+ xlink:href="#linearGradient11399"
+ inkscape:collect="always" />
+ <radialGradient
+ gradientTransform="matrix(1.243453,2.106784e-16,-2.106784e-16,1.243453,-6.713754,-3.742847)"
+ gradientUnits="userSpaceOnUse"
+ r="3.8335034"
+ fy="15.048258"
+ fx="27.577173"
+ cy="15.048258"
+ cx="27.577173"
+ id="radialGradient11500"
+ xlink:href="#linearGradient11494"
+ inkscape:collect="always" />
+ <radialGradient
+ r="3.8335034"
+ fy="16.049133"
+ fx="27.577173"
+ cy="16.049133"
+ cx="27.577173"
+ gradientTransform="matrix(1.243453,2.106784e-16,-2.106784e-16,1.243453,-6.713754,-3.742847)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient11504"
+ xlink:href="#linearGradient11494"
+ inkscape:collect="always" />
+ <radialGradient
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.000000,0.000000,0.000000,0.338462,2.166583e-14,29.48178)"
+ r="6.5659914"
+ fy="44.565483"
+ fx="30.203562"
+ cy="44.565483"
+ cx="30.203562"
+ id="radialGradient11514"
+ xlink:href="#linearGradient11508"
+ inkscape:collect="always" />
+ <radialGradient
+ gradientTransform="matrix(1.995058,-1.651527e-32,0.000000,1.995058,-24.32488,-35.70087)"
+ gradientUnits="userSpaceOnUse"
+ r="20.530962"
+ fy="35.878170"
+ fx="24.445690"
+ cy="35.878170"
+ cx="24.445690"
+ id="radialGradient11526"
+ xlink:href="#linearGradient11520"
+ inkscape:collect="always" />
+ <radialGradient
+ r="6.5659914"
+ fy="44.565483"
+ fx="30.203562"
+ cy="44.565483"
+ cx="30.203562"
+ gradientTransform="matrix(1.000000,0.000000,0.000000,0.338462,3.185827e-15,29.48178)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient11532"
+ xlink:href="#linearGradient11508"
+ inkscape:collect="always" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient11508"
+ id="radialGradient1348"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.000000,0.000000,0.000000,0.338462,-1.353344e-14,29.48178)"
+ cx="30.203562"
+ cy="44.565483"
+ fx="30.203562"
+ fy="44.565483"
+ r="6.5659914" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient11520"
+ id="radialGradient1350"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.995058,-1.651527e-32,0.000000,1.995058,-24.32488,-35.70087)"
+ cx="24.445690"
+ cy="35.878170"
+ fx="24.445690"
+ fy="35.878170"
+ r="20.530962" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient11494"
+ id="radialGradient1352"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.243453,2.106784e-16,-2.106784e-16,1.243453,-6.713754,-3.742847)"
+ cx="27.577173"
+ cy="16.049133"
+ fx="27.577173"
+ fy="16.049133"
+ r="3.8335034" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient11494"
+ id="radialGradient1354"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.243453,2.106784e-16,-2.106784e-16,1.243453,-6.713754,-3.742847)"
+ cx="27.577173"
+ cy="15.048258"
+ fx="27.577173"
+ fy="15.048258"
+ r="3.8335034" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient11508"
+ id="radialGradient1356"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.000000,0.000000,0.000000,0.338462,2.220359e-14,29.48178)"
+ cx="30.203562"
+ cy="44.565483"
+ fx="30.203562"
+ fy="44.565483"
+ r="6.5659914" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient11520"
+ id="radialGradient1366"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.049266,-1.696401e-32,0.000000,2.049266,-25.65002,-37.31089)"
+ cx="24.445690"
+ cy="35.878170"
+ fx="24.445690"
+ fy="35.878170"
+ r="20.530962" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6452"
+ id="linearGradient6458"
+ x1="6.3051529"
+ y1="23.362427"
+ x2="5.9846287"
+ y2="31.57"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6468"
+ id="radialGradient6474"
+ cx="69.473244"
+ cy="19.597878"
+ fx="69.473244"
+ fy="19.597878"
+ r="3.5153138"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.318488,1.207574e-15,-1.207574e-15,1.318488,-22.1264,-6.241691)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6482"
+ id="linearGradient6488"
+ x1="32.350136"
+ y1="28.083355"
+ x2="21.213203"
+ y2="30.293064"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-3.836549,0.345971)" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6492"
+ id="radialGradient6498"
+ cx="23"
+ cy="33.9375"
+ fx="23"
+ fy="33.9375"
+ r="18.25"
+ gradientTransform="matrix(1,0,0,0.284247,0,24.29088)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6500"
+ id="radialGradient8522"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.77275,-1.847562e-16,1.351402e-16,1.29668,-16.3404,-6.615959)"
+ cx="18.557627"
+ cy="22.300018"
+ fx="18.557627"
+ fy="22.300018"
+ r="19.2292" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8524"
+ id="linearGradient8530"
+ x1="14.96875"
+ y1="19.110678"
+ x2="39.524544"
+ y2="46.98568"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8534"
+ id="linearGradient8540"
+ x1="26.162951"
+ y1="30.543303"
+ x2="24.328892"
+ y2="30.985245"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8542"
+ id="radialGradient8548"
+ cx="6.0242186"
+ cy="25.271027"
+ fx="6.0242186"
+ fy="25.271027"
+ r="4.8310288"
+ gradientTransform="matrix(0.916159,9.318684e-2,-0.108765,1.069309,3.253668,-3.029272)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8534"
+ id="linearGradient4467"
+ gradientUnits="userSpaceOnUse"
+ x1="26.162951"
+ y1="30.543303"
+ x2="24.328892"
+ y2="30.985245" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6492"
+ id="radialGradient2360"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,0.284247,0,24.29088)"
+ cx="23"
+ cy="33.9375"
+ fx="23"
+ fy="33.9375"
+ r="18.25" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6500"
+ id="radialGradient2362"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.77275,0,0,1.29668,-16.3404,-6.615959)"
+ cx="18.557627"
+ cy="22.300018"
+ fx="18.557627"
+ fy="22.300018"
+ r="19.2292" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6482"
+ id="linearGradient2364"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-3.83655,0.345971)"
+ x1="32.350136"
+ y1="28.083355"
+ x2="21.213203"
+ y2="30.293064" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8524"
+ id="linearGradient2366"
+ gradientUnits="userSpaceOnUse"
+ x1="14.96875"
+ y1="19.110678"
+ x2="39.524544"
+ y2="46.98568" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8542"
+ id="radialGradient2368"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.916159,9.318684e-2,-0.108765,1.069309,3.253668,-3.029272)"
+ cx="6.0242186"
+ cy="25.271027"
+ fx="6.0242186"
+ fy="25.271027"
+ r="4.8310288" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6452"
+ id="linearGradient2370"
+ gradientUnits="userSpaceOnUse"
+ x1="6.3051529"
+ y1="23.362427"
+ x2="5.9846287"
+ y2="31.57" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6468"
+ id="radialGradient2372"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.318488,0,0,1.318488,-22.1264,-6.241691)"
+ cx="69.473244"
+ cy="19.597878"
+ fx="69.473244"
+ fy="19.597878"
+ r="3.5153138" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6951"
+ id="linearGradient2374"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.117687,-0.528197,0.528197,-0.117687,46.2238,49.69112)"
+ x1="37.017639"
+ y1="19.239889"
+ x2="27.753893"
+ y2="11.182488" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6939"
+ id="linearGradient2376"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.117687,-0.528197,0.528197,-0.117687,40.56367,46.8748)"
+ x1="19.394735"
+ y1="30.001331"
+ x2="23.109331"
+ y2="33.438831" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6963"
+ id="radialGradient2378"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-9.389073e-2,-1.406075,1.370264,-9.149987e-2,18.28382,59.78933)"
+ cx="15.415101"
+ cy="35.356506"
+ fx="15.415101"
+ fy="35.356506"
+ r="7.5791561" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2446"
+ id="linearGradient2380"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.11984,-0.445379,0.445379,0.11984,42.0839,34.30798)"
+ x1="13.236155"
+ y1="37.752247"
+ x2="7.7521091"
+ y2="42.282146" />
+ </defs>
+ <sodipodi:namedview
+ stroke="#ef2929"
+ fill="#eeeeec"
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666"
+ borderopacity="0.15294118"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="-31.831093"
+ inkscape:cy="9.6042458"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:grid-bbox="true"
+ inkscape:document-units="px"
+ inkscape:showpageshadow="false"
+ inkscape:window-width="1191"
+ inkscape:window-height="1078"
+ inkscape:window-x="269"
+ inkscape:window-y="51" />
+ <metadata
+ id="metadata4">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:creator>
+ <cc:Agent>
+ <dc:title>Jakub Steiner</dc:title>
+ </cc:Agent>
+ </dc:creator>
+ <dc:source>http://jimmac.musichall.cz</dc:source>
+ <cc:license
+ rdf:resource="http://creativecommons.org/licenses/by-sa/2.0/" />
+ <dc:title />
+ </cc:Work>
+ <cc:License
+ rdf:about="http://creativecommons.org/licenses/by-sa/2.0/">
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/Reproduction" />
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/Distribution" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/Notice" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/Attribution" />
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/ShareAlike" />
+ </cc:License>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <g
+ transform="matrix(1.016627,0,0,1.016627,0.434805,-0.792136)"
+ id="g8883">
+ <path
+ sodipodi:type="arc"
+ style="opacity:1;color:black;fill:url(#radialGradient8929);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.9999997;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path8885"
+ sodipodi:cx="23"
+ sodipodi:cy="33.9375"
+ sodipodi:rx="18.25"
+ sodipodi:ry="5.1875"
+ d="M 41.25 33.9375 A 18.25 5.1875 0 1 1 4.75,33.9375 A 18.25 5.1875 0 1 1 41.25 33.9375 z"
+ transform="matrix(1,0,0,1.53012,0.125,-19.99096)" />
+ <path
+ style="opacity:1;color:black;fill:url(#radialGradient8931);fill-opacity:1;fill-rule:evenodd;stroke:#2e3436;stroke-width:0.98364494;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 10.374369,12.467884 C 10.374369,12.467884 13.248878,18.395518 19.973611,18.228291 C 34.066126,17.874738 36.309226,10.582719 37.832786,8.7660099 C 42.895143,51.417634 6.0135488,33.362123 4.7175144,26.256467 C 11.965359,24.135147 10.197592,20.069282 10.197592,20.069282 L 10.374369,12.467884 z "
+ id="path8887"
+ sodipodi:nodetypes="cscccc" />
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient8933);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.9999997;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 15.73779,30.066049 C 22.47669,31.413886 25.908481,30.164142 27.916965,28.613273 C 27.386635,27.928263 26.480655,27.176962 26.480655,27.176962 C 26.480655,27.176962 28.833972,27.830904 29.662635,28.900535 C 30.488925,29.967103 29.969443,30.624242 29.753196,31.988905 C 29.271785,30.790306 28.373215,30.340813 28.251562,29.864573 C 26.445294,32.3615 21.94512,32.257773 15.73779,30.066049 z "
+ id="path8889"
+ sodipodi:nodetypes="cccsccc" />
+ <path
+ sodipodi:type="inkscape:offset"
+ inkscape:radius="-1.073054"
+ inkscape:original="M 37.5 8.75 C 37.304927 8.7198838 37.083027 8.9384197 36.90625 9.46875 C 36.552697 10.529411 34.061264 17.865197 19.96875 18.21875 C 13.244017 18.385977 10.375 12.46875 10.375 12.46875 L 10.1875 20.0625 C 10.1875 20.0625 11.966595 24.128679 4.71875 26.25 C 6.014785 33.355656 42.502444 51.25055 37.90625 9.53125 C 37.843713 9.0411177 37.695073 8.7801162 37.5 8.75 z "
+ xlink:href="#path4323"
+ style="opacity:0.18539327;color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient8935);stroke-width:0.98364494;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path8891"
+ inkscape:href="#path4323"
+ d="M 36.96875,11.84375 C 36.406772,12.770645 35.562258,13.876916 34.28125,14.9375 C 31.649332,17.116542 27.230687,19.099847 20,19.28125 C 15.775627,19.386299 13.047259,17.347101 11.375,15.53125 L 11.25,20 C 11.386107,20.418802 11.665455,21.390498 11.1875,22.71875 C 10.673186,24.148046 9.0329864,25.610113 6.21875,26.71875 C 6.4690804,27.240783 6.7142344,27.76237 7.46875,28.5 C 8.4967004,29.504945 9.9257833,30.588049 11.625,31.5625 C 15.023433,33.511402 19.426583,35.055712 23.53125,35.125 C 27.635917,35.194288 31.388376,33.89045 33.96875,30.125 C 36.347494,26.653782 37.651223,20.777057 36.96875,11.84375 z " />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1;color:black;fill:url(#radialGradient8937);fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:0.98364455;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path8893"
+ sodipodi:cx="6.0987959"
+ sodipodi:cy="27.228739"
+ sodipodi:rx="4.3310289"
+ sodipodi:ry="6.0987959"
+ d="M 10.429825 27.228739 A 4.3310289 6.0987959 0 1 1 1.767767,27.228739 A 4.3310289 6.0987959 0 1 1 10.429825 27.228739 z"
+ transform="matrix(0.810984,-0.585069,0.585069,0.810984,-14.77791,6.947121)" />
+ <path
+ sodipodi:type="inkscape:offset"
+ inkscape:radius="-1.044355"
+ inkscape:original="M 6.09375 21.125 C 3.703022 21.125 1.78125 23.852215 1.78125 27.21875 C 1.78125 30.585285 3.703022 33.312501 6.09375 33.3125 C 8.484478 33.3125 10.4375 30.585285 10.4375 27.21875 C 10.4375 23.852215 8.484478 21.124999 6.09375 21.125 z "
+ xlink:href="#path5198"
+ style="opacity:0.28089887;color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient8939);stroke-width:0.98364493;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path8895"
+ inkscape:href="#path5198"
+ d="M 6.09375,22.15625 C 5.2955008,22.15625 4.5406196,22.602421 3.90625,23.5 C 3.2718804,24.397579 2.8125,25.734204 2.8125,27.21875 C 2.8125,28.703296 3.2718804,30.039921 3.90625,30.9375 C 4.5406196,31.835079 5.2955011,32.28125 6.09375,32.28125 C 6.8919992,32.28125 7.6710339,31.804861 8.3125,30.90625 C 8.9539661,30.007639 9.40625,28.700064 9.40625,27.21875 C 9.40625,25.737436 8.9539662,24.429861 8.3125,23.53125 C 7.6710338,22.632639 6.8919989,22.15625 6.09375,22.15625 z "
+ transform="matrix(0.800389,-0.599481,0.599481,0.800389,-15.2744,7.32784)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1;color:black;fill:white;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.9999997;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path8897"
+ sodipodi:cx="4.0658641"
+ sodipodi:cy="23.251263"
+ sodipodi:rx="1.767767"
+ sodipodi:ry="2.1213202"
+ d="M 5.833631 23.251263 A 1.767767 2.1213202 0 1 1 2.2980971,23.251263 A 1.767767 2.1213202 0 1 1 5.833631 23.251263 z" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1;color:black;fill:#eeeeec;fill-opacity:1;fill-rule:evenodd;stroke:#888a85;stroke-width:0.98364494;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path8899"
+ sodipodi:cx="69.473244"
+ sodipodi:cy="21.837049"
+ sodipodi:rx="3.1819806"
+ sodipodi:ry="3.1819806"
+ d="M 72.655224 21.837049 A 3.1819806 3.1819806 0 1 1 66.291263,21.837049 A 3.1819806 3.1819806 0 1 1 72.655224 21.837049 z"
+ transform="translate(-55.86145,0)" />
+ <path
+ transform="matrix(1.5,0,0,1.5,-82.16821,-10.91852)"
+ d="M 72.655224 21.837049 A 3.1819806 3.1819806 0 1 1 66.291263,21.837049 A 3.1819806 3.1819806 0 1 1 72.655224 21.837049 z"
+ sodipodi:ry="3.1819806"
+ sodipodi:rx="3.1819806"
+ sodipodi:cy="21.837049"
+ sodipodi:cx="69.473244"
+ id="path8901"
+ style="opacity:1;color:black;fill:url(#radialGradient8941);fill-opacity:1;fill-rule:evenodd;stroke:#888a85;stroke-width:0.65576329;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ sodipodi:type="arc" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1;color:black;fill:#2e3436;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:0.9999997;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path8903"
+ sodipodi:cx="21.743534"
+ sodipodi:cy="21.837049"
+ sodipodi:rx="2.2980971"
+ sodipodi:ry="2.2980971"
+ d="M 24.041631 21.837049 A 2.2980971 2.2980971 0 1 1 19.445437,21.837049 A 2.2980971 2.2980971 0 1 1 24.041631 21.837049 z"
+ transform="translate(1.414216,0.707108)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1;color:black;fill:white;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.9999997;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path8905"
+ sodipodi:cx="21.38998"
+ sodipodi:cy="20.953165"
+ sodipodi:rx="1.767767"
+ sodipodi:ry="1.767767"
+ d="M 23.157747 20.953165 A 1.767767 1.767767 0 1 1 19.622213,20.953165 A 1.767767 1.767767 0 1 1 23.157747 20.953165 z"
+ transform="matrix(0.9,0,0,0.9,3.022883,2.625648)" />
+ <path
+ d="M 24.041631 21.837049 A 2.2980971 2.2980971 0 1 1 19.445437,21.837049 A 2.2980971 2.2980971 0 1 1 24.041631 21.837049 z"
+ sodipodi:ry="2.2980971"
+ sodipodi:rx="2.2980971"
+ sodipodi:cy="21.837049"
+ sodipodi:cx="21.743534"
+ id="path8907"
+ style="opacity:1;color:black;fill:#2e3436;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1.62499952;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ sodipodi:type="arc"
+ transform="matrix(0.615385,0,0,0.615385,1.258896,8.840808)" />
+ <path
+ transform="matrix(0.553846,0,0,0.553846,2.248846,10.02145)"
+ d="M 23.157747 20.953165 A 1.767767 1.767767 0 1 1 19.622213,20.953165 A 1.767767 1.767767 0 1 1 23.157747 20.953165 z"
+ sodipodi:ry="1.767767"
+ sodipodi:rx="1.767767"
+ sodipodi:cy="20.953165"
+ sodipodi:cx="21.38998"
+ id="path8909"
+ style="opacity:1;color:black;fill:white;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.9999997;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ sodipodi:type="arc" />
+ <g
+ id="g8911"
+ transform="matrix(-0.114852,-0.389864,0.389864,-0.114852,24.71507,29.68942)">
+ <path
+ sodipodi:nodetypes="ccssc"
+ inkscape:r_cy="true"
+ inkscape:r_cx="true"
+ id="path8913"
+ d="M -23.364209,23.568336 L -19.654111,27.037511 C -11.307128,20.656664 -2.5600338,6.9381374 -2.5600338,6.9381374 C -0.58371893,4.6957251 -2.6769537,3.1876548 -4.7249404,4.5402186 C -4.7249404,4.5402186 -17.695303,14.655085 -23.364209,23.568336 z "
+ style="opacity:1;color:black;fill:url(#linearGradient8943);fill-opacity:1;fill-rule:nonzero;stroke:#673907;stroke-width:2.42021061;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+ <path
+ sodipodi:nodetypes="ccccccccc"
+ inkscape:r_cy="true"
+ inkscape:r_cx="true"
+ id="path8915"
+ d="M -30.449715,32.813894 L -28.203395,34.747714 L -19.710629,27.380683 L -19.435568,26.674855 L -18.341163,26.65704 C -18.778663,25.09454 -21.282677,22.273585 -23.157677,22.273585 L -23.075658,23.36366 L -23.745649,23.743687 L -30.449715,32.813894 z "
+ style="opacity:1;color:black;fill:url(#linearGradient8945);fill-opacity:1;fill-rule:nonzero;stroke:#888a85;stroke-width:2.42021061;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+ <path
+ inkscape:r_cy="true"
+ inkscape:r_cx="true"
+ id="path8917"
+ d="M -23.801371,28.376767 L -28.166304,33.643238"
+ style="opacity:1;color:black;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:white;stroke-width:2.46045327;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+ <path
+ sodipodi:nodetypes="cssc"
+ inkscape:r_cy="true"
+ inkscape:r_cx="true"
+ id="path8919"
+ d="M -45.341208,42.769835 C -34.89725,42.769835 -26.971169,44.013565 -25.470603,36.415097 C -24.261354,30.291783 -32.681137,27.357729 -36.853473,32.824236 C -40.87275,38.090207 -45.341208,42.769835 -45.341208,42.769835 z "
+ style="opacity:1;color:black;fill:url(#radialGradient8947);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.2;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+ <path
+ transform="matrix(2.069903,0,0,2.069903,-44.75012,-41.50978)"
+ inkscape:r_cy="true"
+ inkscape:r_cx="true"
+ d="M 8.8749989 37.75 A 1.2499999 1.2499999 0 1 1 6.3749992,37.75 A 1.2499999 1.2499999 0 1 1 8.8749989 37.75 z"
+ sodipodi:ry="1.2499999"
+ sodipodi:rx="1.2499999"
+ sodipodi:cy="37.75"
+ sodipodi:cx="7.624999"
+ id="path8921"
+ style="opacity:0.52777782;color:black;fill:white;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ sodipodi:type="arc" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1;color:black;fill:white;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path8923"
+ sodipodi:cx="7.624999"
+ sodipodi:cy="37.75"
+ sodipodi:rx="1.2499999"
+ sodipodi:ry="1.2499999"
+ d="M 8.8749989 37.75 A 1.2499999 1.2499999 0 1 1 6.3749992,37.75 A 1.2499999 1.2499999 0 1 1 8.8749989 37.75 z"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true"
+ transform="matrix(1.396669,0,0,1.396669,-32.05526,-25.87664)" />
+ <path
+ sodipodi:nodetypes="cssc"
+ inkscape:r_cy="true"
+ inkscape:r_cx="true"
+ id="path8925"
+ d="M -38.543723,40.909242 C -38.543723,40.909242 -34.822203,41.003542 -32.427185,39.497247 C -31.579834,38.964324 -30.911411,40.147232 -31.933366,40.584614 C -34.14076,41.529346 -38.543723,40.909242 -38.543723,40.909242 z "
+ style="opacity:0.42777776;color:black;fill:url(#linearGradient8949);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+ </g>
+ <path
+ style="opacity:1;color:black;fill:url(#linearGradient8951);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.9999997;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 23.003067,31.736544 C 24.500439,31.879636 25.852696,31.464331 26.41496,31.262497 C 26.513185,30.707111 26.951512,29.64124 28.461048,29.571029 L 27.930718,28.642952 C 27.930718,28.642952 25.964077,29.990873 23.864854,30.388621 L 23.003067,31.736544 z "
+ id="path8927"
+ sodipodi:nodetypes="cccccc" />
+ </g>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/cmdline/offset-png.png b/rsvg/tests/fixtures/cmdline/offset-png.png
new file mode 100644
index 00000000..a4bc7e2a
--- /dev/null
+++ b/rsvg/tests/fixtures/cmdline/offset-png.png
Binary files differ
diff --git a/rsvg/tests/fixtures/cmdline/text-a-link.svg b/rsvg/tests/fixtures/cmdline/text-a-link.svg
new file mode 100644
index 00000000..d205c768
--- /dev/null
+++ b/rsvg/tests/fixtures/cmdline/text-a-link.svg
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="400" height="400" xmlns="http://www.w3.org/2000/svg">
+ <text x="100" y="100">
+ <a href="https://example.com">
+ This is a link to example.com
+ </a>
+
+ <tspan x="100" dy="2em">
+ <a href="https://another.example.com">
+ This is a link to another.example.com
+ </a>
+ </tspan>
+ </text>
+</svg>
diff --git a/rsvg/tests/fixtures/cmdline/zero-offset-png.png b/rsvg/tests/fixtures/cmdline/zero-offset-png.png
new file mode 100644
index 00000000..adbe9524
--- /dev/null
+++ b/rsvg/tests/fixtures/cmdline/zero-offset-png.png
Binary files differ
diff --git a/rsvg/tests/fixtures/crash/bug335-non-svg-toplevel.svg b/rsvg/tests/fixtures/crash/bug335-non-svg-toplevel.svg
new file mode 100644
index 00000000..f9aefcbe
--- /dev/null
+++ b/rsvg/tests/fixtures/crash/bug335-non-svg-toplevel.svg
@@ -0,0 +1 @@
+<x><x></x>
diff --git a/rsvg/tests/fixtures/crash/bug336-invalid-css.svg b/rsvg/tests/fixtures/crash/bug336-invalid-css.svg
new file mode 100644
index 00000000..7486f96d
--- /dev/null
+++ b/rsvg/tests/fixtures/crash/bug336-invalid-css.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0" ?>
+<svg height="100" width="100" xmlns="http://www.w3.org/2000/svg">
+ <style>
+.c {
+ a: b
+ </style>
+</svg>
diff --git a/rsvg/tests/fixtures/crash/bug349-empty-data-uri.svg b/rsvg/tests/fixtures/crash/bug349-empty-data-uri.svg
new file mode 100644
index 00000000..942df7a1
--- /dev/null
+++ b/rsvg/tests/fixtures/crash/bug349-empty-data-uri.svg
@@ -0,0 +1 @@
+<image xlink:href="data:"
diff --git a/rsvg/tests/fixtures/crash/bug349-too-big-image-in-href-data.svg b/rsvg/tests/fixtures/crash/bug349-too-big-image-in-href-data.svg
new file mode 100644
index 00000000..b17bb165
--- /dev/null
+++ b/rsvg/tests/fixtures/crash/bug349-too-big-image-in-href-data.svg
@@ -0,0 +1 @@
+<image xlink:href="data:image/jpeg;base64,/9j00f/bAIQA0000000000000000000000000000000000000000000000000000000000000000000000000000000000000AE0000000000000000000000000000000000000000000000000000000000000000000000000000000000000/8AAEQgA0+00AwEiAAIRAQ0RAf/aAAwDAQACEQ0R0000"
diff --git a/rsvg/tests/fixtures/crash/bug352-feConvolveMatrix-large-allocation.svg b/rsvg/tests/fixtures/crash/bug352-feConvolveMatrix-large-allocation.svg
new file mode 100644
index 00000000..e696f663
--- /dev/null
+++ b/rsvg/tests/fixtures/crash/bug352-feConvolveMatrix-large-allocation.svg
@@ -0,0 +1 @@
+<feConvolveMatrix order="50000" kernelMatrix=""/>
diff --git a/rsvg/tests/fixtures/crash/bug377-xinclude-invalid-xml.svg b/rsvg/tests/fixtures/crash/bug377-xinclude-invalid-xml.svg
new file mode 100644
index 00000000..4690e404
--- /dev/null
+++ b/rsvg/tests/fixtures/crash/bug377-xinclude-invalid-xml.svg
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg version="1.1"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ width="16"
+ height="16">
+ <style type="text/css">
+ rect,path,ellipse,circle {
+ fill: rgb(146,149,149) !important;
+ }
+ .warning {
+ fill: rgb(245,121,0) !important;
+ }
+ .error {
+ fill: rgb(204,0,0) !important;
+ }
+ .success {
+ fill: rgb(51,209,122) !important;
+ }
+ </style>
+ <g opacity="1" ><xi:include href="data:text/xml,&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;16&quot; height=&quot;16&quot;&gt;
+ &lt;path d=&quot;M7.979 1.055a1.474 1.474 0 0 0-.27.025c-3 .16-5.627 2.222-6.451 5.129A7.13 7.13 0 0 0 4.5 14.037a7.13 7.13 0 0 0 8.4-1.105 7.13 7.13 0 0 0 1.106-8.4c1.507 2.725 1.032 6.162-1.135 8.37-2.228 2.148-5.654 2.577-8.33 1.065-2.618-1.576-3.914-4.73-3.18-7.672-.708 2.948.623 6.072 3.221 7.601 2.654 1.471 6.026 1.005 8.174-1.109 2.094-2.168 2.514-5.528 1.037-8.133 1.453 2.618.992 5.956-1.096 8.075-2.137 2.067-5.464 2.484-8.033 1.025C2.146 12.244.888 9.182 1.6 6.357c-.685 2.832.604 5.863 3.103 7.327 2.547 1.417 5.821.963 7.88-1.07 2.014-2.078 2.42-5.34.997-7.837 1.4 2.51.951 5.75-1.056 7.778-2.048 1.988-5.276 2.391-7.737.986C2.37 12.098 1.15 9.125 1.838 6.418c-.662 2.714.59 5.655 2.988 7.053 2.439 1.363 5.614.923 7.582-1.032 1.935-1.987 2.329-5.152.96-7.54 1.345 2.402.91 5.544-1.018 7.482-1.958 1.908-5.089 2.299-7.442.947C2.59 11.951 1.411 9.071 2.076 6.48c-.639 2.598.574 5.446 2.873 6.778 2.331 1.31 5.408.882 7.286-.992 1.855-1.898 2.235-4.963.92-7.245 1.292 2.295.869 5.338-.979 7.186-1.867 1.829-4.9 2.206-7.145.908-2.219-1.31-3.36-4.1-2.718-6.574-.616 2.48.56 5.238 2.76 6.504 2.223 1.256 5.2.842 6.988-.953 1.775-1.807 2.143-4.774.88-6.947 1.239 2.187.83 5.13-.939 6.888-1.777 1.75-4.71 2.114-6.847.87-2.12-1.246-3.223-3.943-2.604-6.3-.593 2.364.544 5.03 2.645 6.229 2.115 1.203 4.993.801 6.69-.914 1.697-1.717 2.051-4.585.843-6.65 1.184 2.08.788 4.924-.9 6.591-1.688 1.67-4.522 2.021-6.551.83-2.02-1.179-3.085-3.785-2.489-6.025-.57 2.247.53 4.822 2.53 5.955 2.007 1.15 4.786.76 6.394-.875 1.616-1.627 1.958-4.395.803-6.353 1.131 1.971.747 4.717-.861 6.295-1.597 1.59-4.332 1.927-6.254.79-1.92-1.113-2.947-3.628-2.373-5.751-.547 2.13.513 4.614 2.414 5.681 1.9 1.096 4.58.72 6.097-.836 1.537-1.536 1.865-4.206.764-6.056 1.077 1.864.707 4.51-.822 5.998-1.507 1.51-4.143 1.835-5.957.752-1.82-1.047-2.808-3.47-2.258-5.477-.524 2.013.498 4.405 2.299 5.406 1.792 1.042 4.373.68 5.8-.797 1.457-1.446 1.773-4.016.725-5.76 1.024 1.757.666 4.305-.783 5.702-1.417 1.43-3.953 1.742-5.66.713-1.721-.981-2.672-3.314-2.145-5.203-.5 1.896.484 4.197 2.186 5.132 1.684.989 4.166.64 5.504-.757 1.377-1.357 1.68-3.828.685-5.463.97 1.649.626 4.097-.744 5.404-1.326 1.35-3.764 1.65-5.363.674-1.621-.915-2.534-3.155-2.03-4.928-.477 1.78.47 3.988 2.07 4.858 1.578.934 3.96.598 5.208-.72 1.297-1.266 1.587-3.638.646-5.165.917 1.54.585 3.89-.705 5.107-1.236 1.271-3.575 1.557-5.066.635-1.522-.849-2.395-2.999-1.914-4.654-.455 1.662.453 3.779 1.955 4.582 1.469.88 3.752.557 4.908-.68 1.217-1.176 1.494-3.447.607-4.865.875 1.425.577 3.685-.636 4.836-1.15 1.213-3.411 1.51-4.836.636-1.47-.797-2.343-2.904-1.867-4.507.39-1.626 2.197-3.013 3.869-2.97V4a1.474 1.474 0 0 0 .002 0 1.474 1.474 0 0 0 1.472-1.473 1.474 1.474 0 0 0-1.472-1.472 1.474 1.474 0 0 0-.002 0z&quot; style=&quot;marker:none&quot; color=&quot;#000&quot; overflow=&quot;visible&quot; fill=&quot;#474747&quot;/&gt;
+&lt;/svg&gt;
+"/></g>
+</svg>
diff --git a/rsvg/tests/fixtures/crash/bug463-characters-outside-first-element.svg b/rsvg/tests/fixtures/crash/bug463-characters-outside-first-element.svg
new file mode 100644
index 00000000..6367798b
--- /dev/null
+++ b/rsvg/tests/fixtures/crash/bug463-characters-outside-first-element.svg
@@ -0,0 +1,69 @@
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ width="576pt" height="432pt" viewBox="0 0 576 432">
+<title>gl2ps_renderer figure</title>
+<desc>
+Creator: GL2PS 1.4.0, (C) 1999-2017 C. Geuzaine
+For: Octave
+CreationDate: Tue Dec 4 22:12:34 2018
+</desc>
+<defs>
+</defs>
+<polygon fill="#ffffff" points="0,0 576,0 576,432 0,432"/>
+<g>
+<polygon fill="#ffffff" points="0,432 576,432 576,0 0,0" shape-rendering="crispEdges"/>
+<clipPath id="cp00576432">
+ <polygon points="0,432 576,432 576,0 0,0"/>
+</clipPath>
+<g clip-path="url(#cp00576432)">
+<polygon fill="#ffffff" shape-rendering="crispEdges" points="74.88,384.48 521.28,384.48 74.88,32.4"/>
+<polygon fill="#ffffff" shape-rendering="crispEdges" points="521.28,384.48 521.28,32.4 74.88,32.4"/>
+<polyline fill="none" stroke="#262626" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" points="74.88,384.48 74.88,380.015"/>
+<polyline fill="none" stroke="#262626" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" points="74.88,32.4 74.88,36.865"/>
+<polyline fill="none" stroke="#262626" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" points="138.651,384.48 138.651,380.015"/>
+<polyline fill="none" stroke="#262626" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" points="138.651,32.4 138.651,36.865"/>
+<polyline fill="none" stroke="#262626" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" points="202.423,384.48 202.423,380.015"/>
+<polyline fill="none" stroke="#262626" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" points="202.423,32.4 202.423,36.865"/>
+<polyline fill="none" stroke="#262626" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" points="266.194,384.48 266.194,380.015"/>
+<polyline fill="none" stroke="#262626" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" points="266.194,32.4 266.194,36.865"/>
+<polyline fill="none" stroke="#262626" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" points="329.966,384.48 329.966,380.015"/>
+<polyline fill="none" stroke="#262626" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" points="329.966,32.4 329.966,36.865"/>
+<polyline fill="none" stroke="#262626" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" points="393.737,384.48 393.737,380.015"/>
+<polyline fill="none" stroke="#262626" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" points="393.737,32.4 393.737,36.865"/>
+<polyline fill="none" stroke="#262626" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" points="457.509,384.48 457.509,380.015"/>
+<polyline fill="none" stroke="#262626" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" points="457.509,32.4 457.509,36.865"/>
+<polyline fill="none" stroke="#262626" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" points="521.28,384.48 521.28,380.015"/>
+<polyline fill="none" stroke="#262626" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" points="521.28,32.4 521.28,36.865"/>
+<text xml:space="preserve" transform="translate(71.88,400.481) rotate(-0,3,-11)" font-family="FreeSans" font-weight="normal" font-style="normal" font-size="10"><tspan y="-1" fill="rgb(38,38,38)" x="0 ">0</tspan></text>
+<text xml:space="preserve" transform="translate(135.651,400.481) rotate(-0,3,-11)" font-family="FreeSans" font-weight="normal" font-style="normal" font-size="10"><tspan y="-1" fill="rgb(38,38,38)" x="0 ">1</tspan></text>
+<text xml:space="preserve" transform="translate(199.423,400.481) rotate(-0,3,-11)" font-family="FreeSans" font-weight="normal" font-style="normal" font-size="10"><tspan y="-1" fill="rgb(38,38,38)" x="0 ">2</tspan></text>
+<text xml:space="preserve" transform="translate(263.194,400.481) rotate(-0,3,-11)" font-family="FreeSans" font-weight="normal" font-style="normal" font-size="10"><tspan y="-1" fill="rgb(38,38,38)" x="0 ">3</tspan></text>
+<text xml:space="preserve" transform="translate(326.966,400.481) rotate(-0,3,-11)" font-family="FreeSans" font-weight="normal" font-style="normal" font-size="10"><tspan y="-1" fill="rgb(38,38,38)" x="0 ">4</tspan></text>
+<text xml:space="preserve" transform="translate(390.737,400.481) rotate(-0,3,-11)" font-family="FreeSans" font-weight="normal" font-style="normal" font-size="10"><tspan y="-1" fill="rgb(38,38,38)" x="0 ">5</tspan></text>
+<text xml:space="preserve" transform="translate(454.509,400.481) rotate(-0,3,-11)" font-family="FreeSans" font-weight="normal" font-style="normal" font-size="10"><tspan y="-1" fill="rgb(38,38,38)" x="0 ">6</tspan></text>
+<text xml:space="preserve" transform="translate(518.28,400.481) rotate(-0,3,-11)" font-family="FreeSans" font-weight="normal" font-style="normal" font-size="10"><tspan y="-1" fill="rgb(38,38,38)" x="0 ">7</tspan></text>
+<polyline fill="none" stroke="#262626" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" points="74.88,384.48 79.348,384.48"/>
+<polyline fill="none" stroke="#262626" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" points="521.28,384.48 516.812,384.48"/>
+<polyline fill="none" stroke="#262626" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" points="74.88,296.46 79.348,296.46"/>
+<polyline fill="none" stroke="#262626" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" points="521.28,296.46 516.812,296.46"/>
+<polyline fill="none" stroke="#262626" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" points="74.88,208.44 79.348,208.44"/>
+<polyline fill="none" stroke="#262626" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" points="521.28,208.44 516.812,208.44"/>
+<polyline fill="none" stroke="#262626" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" points="74.88,120.42 79.348,120.42"/>
+<polyline fill="none" stroke="#262626" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" points="521.28,120.42 516.812,120.42"/>
+<polyline fill="none" stroke="#262626" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" points="74.88,32.4 79.348,32.4"/>
+<polyline fill="none" stroke="#262626" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" points="521.28,32.4 516.812,32.4"/>
+<text xml:space="preserve" transform="translate(60.8755,389.98) rotate(-0,9,-5.5)" font-family="FreeSans" font-weight="normal" font-style="normal" font-size="10"><tspan y="-1" fill="rgb(38,38,38)" x="0 3 ">-1</tspan></text>
+<text xml:space="preserve" transform="translate(51.8755,301.96) rotate(-0,18,-5.5)" font-family="FreeSans" font-weight="normal" font-style="normal" font-size="10"><tspan y="-1" fill="rgb(38,38,38)" x="0 3 9 12 ">-0.5</tspan></text>
+<text xml:space="preserve" transform="translate(63.8755,213.94) rotate(-0,6,-5.5)" font-family="FreeSans" font-weight="normal" font-style="normal" font-size="10"><tspan y="-1" fill="rgb(38,38,38)" x="0 ">0</tspan></text>
+<text xml:space="preserve" transform="translate(54.8755,125.92) rotate(-0,15,-5.5)" font-family="FreeSans" font-weight="normal" font-style="normal" font-size="10"><tspan y="-1" fill="rgb(38,38,38)" x="0 6 9 ">0.5</tspan></text>
+<text xml:space="preserve" transform="translate(63.8755,37.9) rotate(-0,6,-5.5)" font-family="FreeSans" font-weight="normal" font-style="normal" font-size="10"><tspan y="-1" fill="rgb(38,38,38)" x="0 ">1</tspan></text>
+<polyline fill="none" stroke="#262626" stroke-width="0.5" stroke-linecap="square" stroke-linejoin="miter" stroke-dasharray="16,0" points="74.88,384.48 521.28,384.48"/>
+<polyline fill="none" stroke="#262626" stroke-width="0.5" stroke-linecap="square" stroke-linejoin="miter" stroke-dasharray="16,0" points="74.88,32.4 521.28,32.4"/>
+<polyline fill="none" stroke="#262626" stroke-width="0.5" stroke-linecap="square" stroke-linejoin="miter" stroke-dasharray="16,0" points="74.88,384.48 74.88,32.4"/>
+<polyline fill="none" stroke="#262626" stroke-width="0.5" stroke-linecap="square" stroke-linejoin="miter" stroke-dasharray="16,0" points="521.28,384.48 521.28,32.4"/>
+<polyline fill="none" stroke="#0071bc" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="round" points="74.88,32.4 81.2401,34.5558 87.6003,40.9705 93.9604,51.4868 100.32,65.8474 106.681,83.7003 113.041,104.608 119.401,128.06 125.761,153.479 132.121,180.245 138.481,207.702 144.841,235.177 151.201,261.996 157.562,287.504 163.922,311.076 170.282,332.134 176.642,350.162 183.002,364.719 189.362,375.449 195.722,382.088 202.082,384.474 208.443,382.548 214.803,376.359 221.163,366.056 227.523,351.893 233.883,334.217 240.243,313.46 246.603,290.131 252.963,264.801 259.324,238.091 265.684,210.654 272.044,183.163 278.404,156.292 284.764,130.697 291.124,107.007 297.484,85.8008 303.844,67.5985 310.205,52.8458 316.565,41.9039 322.925,35.0408 329.285,32.4247 335.645,34.1197 342.005,40.0841 348.365,50.172 354.725,64.1362 361.086,81.6348 367.446,102.239 373.806,125.445 380.166,150.683 386.526,177.335 392.886,204.75 399.246,232.255 405.606,259.177 411.966,284.856 418.327,308.663 424.687,330.016 431.047,348.391 437.407,363.338 443.767,374.492 450.127,381.578 456.487,384.424 462.847,382.96 469.208,377.221 475.568,367.349"/>
+<text xml:space="preserve" transform="translate(266.194,219.44) rotate(-0,-0,-11)" font-family="FreeSans" font-weight="normal" font-style="normal" font-size="20"><tspan y="-3" fill="rgb(0,0,0)" x="0 10 17 27 34 39 51 56 66 77 87 ">y(x) = cos(</tspan><tspan y="-3" fill="rgb(0,0,0)" x="94 ">&#960;</tspan><tspan y="-3" fill="rgb(0,0,0)" x="106 111 121 127 138 "> x/2)</tspan></text>
+</g>
+</g>
+</svg>
diff --git a/rsvg/tests/fixtures/crash/bug467-xinclude-without-parent-element.svg b/rsvg/tests/fixtures/crash/bug467-xinclude-without-parent-element.svg
new file mode 100644
index 00000000..ea3c4a1f
--- /dev/null
+++ b/rsvg/tests/fixtures/crash/bug467-xinclude-without-parent-element.svg
@@ -0,0 +1 @@
+<a:include href="1" b="c"><a:fallback>d<Wa>
diff --git a/rsvg/tests/fixtures/crash/bug524-invalid-stylesheet-href.svg b/rsvg/tests/fixtures/crash/bug524-invalid-stylesheet-href.svg
new file mode 100644
index 00000000..1c34803b
--- /dev/null
+++ b/rsvg/tests/fixtures/crash/bug524-invalid-stylesheet-href.svg
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?xml-stylesheet type="text/css" href="file://" ?>
+<svg
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ width="320" height="240">
+ <text x="10" y="100">
+ Hello
+ </text>
+</svg>
diff --git a/rsvg/tests/fixtures/crash/bug620238.svg b/rsvg/tests/fixtures/crash/bug620238.svg
new file mode 100644
index 00000000..ac9c8118
--- /dev/null
+++ b/rsvg/tests/fixtures/crash/bug620238.svg
@@ -0,0 +1 @@
+<style type="text/css"> </style>
diff --git a/rsvg/tests/fixtures/crash/bug759084.svg b/rsvg/tests/fixtures/crash/bug759084.svg
new file mode 100644
index 00000000..9e8f8f18
--- /dev/null
+++ b/rsvg/tests/fixtures/crash/bug759084.svg
@@ -0,0 +1,9 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 10 10">
+ <defs>
+ <filter id="filter">
+ </filter>
+ </defs>
+ <g filter="url(#filter)">
+ <rect fill="red" width="10" height="10" filter="url(#doesnotexist)" />
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/crash/bug785276-empty.svg b/rsvg/tests/fixtures/crash/bug785276-empty.svg
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/rsvg/tests/fixtures/crash/bug785276-empty.svg
diff --git a/rsvg/tests/fixtures/crash/bug785276-short-file.svg b/rsvg/tests/fixtures/crash/bug785276-short-file.svg
new file mode 100644
index 00000000..8b137891
--- /dev/null
+++ b/rsvg/tests/fixtures/crash/bug785276-short-file.svg
@@ -0,0 +1 @@
+
diff --git a/rsvg/tests/fixtures/crash/bug800-font-inherit.svg b/rsvg/tests/fixtures/crash/bug800-font-inherit.svg
new file mode 100644
index 00000000..517af776
--- /dev/null
+++ b/rsvg/tests/fixtures/crash/bug800-font-inherit.svg
@@ -0,0 +1 @@
+<svg><text style="font: inherit"></text><text styyle=""></text></svg>
diff --git a/rsvg/tests/fixtures/crash/bug800-marker.svg b/rsvg/tests/fixtures/crash/bug800-marker.svg
new file mode 100644
index 00000000..ac7020fd
--- /dev/null
+++ b/rsvg/tests/fixtures/crash/bug800-marker.svg
@@ -0,0 +1 @@
+<svg width="10" height="10"><text style="marker: inherit"></text></svg>
diff --git a/rsvg/tests/fixtures/crash/bug942-xinclude-mutual-recursion-2.svg b/rsvg/tests/fixtures/crash/bug942-xinclude-mutual-recursion-2.svg
new file mode 100644
index 00000000..4445f6c4
--- /dev/null
+++ b/rsvg/tests/fixtures/crash/bug942-xinclude-mutual-recursion-2.svg
@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xi="http://www.w3.org/2001/XInclude">
+ <xi:include parse="xml" href="bug942-xinclude-mutual-recursion.svg"/>
+</svg>
diff --git a/rsvg/tests/fixtures/crash/bug942-xinclude-mutual-recursion.svg b/rsvg/tests/fixtures/crash/bug942-xinclude-mutual-recursion.svg
new file mode 100644
index 00000000..4f7fb734
--- /dev/null
+++ b/rsvg/tests/fixtures/crash/bug942-xinclude-mutual-recursion.svg
@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xi="http://www.w3.org/2001/XInclude">
+ <xi:include parse="xml" href="bug942-xinclude-mutual-recursion-2.svg"/>
+</svg>
diff --git a/rsvg/tests/fixtures/crash/bug942-xinclude-recursion.svg b/rsvg/tests/fixtures/crash/bug942-xinclude-recursion.svg
new file mode 100644
index 00000000..039639da
--- /dev/null
+++ b/rsvg/tests/fixtures/crash/bug942-xinclude-recursion.svg
@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xi="http://www.w3.org/2001/XInclude">
+ <xi:include parse="xml" href=""/>
+</svg>
diff --git a/rsvg/tests/fixtures/crash/feConvolveMatrix-empty-kernel.svg b/rsvg/tests/fixtures/crash/feConvolveMatrix-empty-kernel.svg
new file mode 100644
index 00000000..d79ff7ee
--- /dev/null
+++ b/rsvg/tests/fixtures/crash/feConvolveMatrix-empty-kernel.svg
@@ -0,0 +1,7 @@
+<svg version="1.1" baseProfile="full" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <filter id="convolve1" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+ <feConvolveMatrix />
+ </filter>
+</svg>
diff --git a/rsvg/tests/fixtures/crash/marker-cycles.svg b/rsvg/tests/fixtures/crash/marker-cycles.svg
new file mode 100644
index 00000000..ee5718f3
--- /dev/null
+++ b/rsvg/tests/fixtures/crash/marker-cycles.svg
@@ -0,0 +1,3 @@
+<svg>
+ <polygon points="0,0" id="a" marker-start="url(#a)" />
+</svg>
diff --git a/rsvg/tests/fixtures/crash/mask-cycles.svg b/rsvg/tests/fixtures/crash/mask-cycles.svg
new file mode 100644
index 00000000..5f04b4d0
--- /dev/null
+++ b/rsvg/tests/fixtures/crash/mask-cycles.svg
@@ -0,0 +1,6 @@
+<svg>
+ <defs>
+ <mask mask="url(#b)" id="b" />
+ </defs>
+ <rect mask="url(#b)" width="10" height="10" />
+</svg>
diff --git a/rsvg/tests/fixtures/crash/pattern-fallback-cycles.svg b/rsvg/tests/fixtures/crash/pattern-fallback-cycles.svg
new file mode 100644
index 00000000..dcabcfd5
--- /dev/null
+++ b/rsvg/tests/fixtures/crash/pattern-fallback-cycles.svg
@@ -0,0 +1,9 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <defs>
+ <pattern id="p" width="10" height="10" xlink:href="#p"/>
+ <linearGradient id="l" xlink:href="#r"/>
+ <radialGradient id="r" xlink:href="#l"/>
+ </defs>
+ <rect fill="url(#p) pink" width="10" height="10" />
+ <rect fill="url(#l) pink" width="10" height="10" />
+</svg>
diff --git a/rsvg/tests/fixtures/crash/xinclude-text-xml.svg b/rsvg/tests/fixtures/crash/xinclude-text-xml.svg
new file mode 100644
index 00000000..3222b6c1
--- /dev/null
+++ b/rsvg/tests/fixtures/crash/xinclude-text-xml.svg
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg version="1.1"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ width="16"
+ height="16">
+ <style type="text/css">
+ rect,circle,path {
+ fill: rgb(0,255,0) !important;
+ }
+ .warning {
+ fill: rgb(0,255,0) !important;
+ }
+ .error {
+ fill: rgb(0,255,0) !important;
+ }
+ .success {
+ fill: rgb(255,0,0) !important;
+ }
+ </style>
+ <xi:include href="data:text/xml,&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;16&quot; height=&quot;16&quot;&gt;
+ &lt;g color=&quot;#bebebe&quot; font-weight=&quot;400&quot; fill=&quot;#474747&quot;&gt;
+ &lt;path d=&quot;M1.75 4C.798 4 0 4.798 0 5.75v4.5C0 11.202.798 12 1.75 12h.125l-.781 1.563L.375 15h9.25l-.719-1.437L8.125 12h.125c.952 0 1.75-.798 1.75-1.75v-4.5C10 4.798 9.202 4 8.25 4zM2 6h6v4H2z&quot; style=&quot;line-height:normal;-inkscape-font-specification:Sans;text-indent:0;text-align:start;text-decoration-line:none;text-transform:none;marker:none&quot; font-family=&quot;Sans&quot; overflow=&quot;visible&quot;/&gt;
+ &lt;path d=&quot;M7.75 1C6.798 1 6 1.798 6 2.75V3h8v4h-3v3.25c0 .66-.252 1.27-.656 1.75h5.28l-1.5-3h.126C15.202 9 16 8.202 16 7.25v-4.5C16 1.798 15.202 1 14.25 1z&quot; style=&quot;line-height:normal;text-indent:0;text-align:start;text-decoration-line:none;text-transform:none;marker:none&quot; font-family=&quot;Andale Mono&quot; overflow=&quot;visible&quot;/&gt;
+ &lt;/g&gt;
+&lt;/svg&gt;
+"/>
+</svg>
diff --git a/rsvg/tests/fixtures/crash/xml-pi-without-data.svg b/rsvg/tests/fixtures/crash/xml-pi-without-data.svg
new file mode 100644
index 00000000..d97e78c6
--- /dev/null
+++ b/rsvg/tests/fixtures/crash/xml-pi-without-data.svg
@@ -0,0 +1 @@
+<?b?>
diff --git a/rsvg/tests/fixtures/dimensions/bug347-bamboo-16fg-s-pt.svg b/rsvg/tests/fixtures/dimensions/bug347-bamboo-16fg-s-pt.svg
new file mode 100644
index 00000000..de0237cf
--- /dev/null
+++ b/rsvg/tests/fixtures/dimensions/bug347-bamboo-16fg-s-pt.svg
@@ -0,0 +1,128 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!--
+ Designed after data from http://www.wacom-asia.com/download/manuals/BambooUsersManual.pdf
+ Size and positions of controls may not be accurate
+ -->
+<svg
+ xmlns="http://www.w3.org/2000/svg"
+ version="1.1"
+ style="color:#000000;stroke:#7f7f7f;fill:none;stroke-width:.25;font-size:8"
+ id="bamboo-16fg-s-pt"
+ width="248"
+ height="176">
+ <title
+ id="title">Wacom Bamboo Capture (CTH-470)</title>
+ <g>
+ <rect
+ id="ButtonA"
+ class="A Button"
+ rx=".5"
+ ry=".5"
+ x="28"
+ y="31"
+ width="28"
+ height="36" />
+ <circle
+ id="DotA"
+ cx="41.5"
+ cy="48.5"
+ r=".5" />
+ <path
+ id="LeaderA"
+ class="A Leader"
+ d="M 58 49 l 20 0" />
+ <text
+ id="LabelA"
+ class="A Label"
+ x="80"
+ y="49"
+ style="text-anchor:start;">A</text>
+ </g>
+ <g>
+ <rect
+ id="ButtonB"
+ class="B Button"
+ rx=".5"
+ ry=".5"
+ x="28"
+ y="68"
+ width="28"
+ height="18" />
+ <circle
+ id="DotB"
+ cx="41.5"
+ cy="77.5"
+ r=".5" />
+ <path
+ id="LeaderB"
+ class="B Leader"
+ d="M 58 78 l 20 0" />
+ <text
+ id="LabelB"
+ class="B Label"
+ x="80"
+ y="78"
+ style="text-anchor:start;">B</text>
+ </g>
+ <rect
+ rx="1"
+ ry="1"
+ x="28"
+ y="87"
+ width="28"
+ height="2" />
+ <g>
+ <rect
+ id="ButtonC"
+ class="C Button"
+ x="28"
+ y="90"
+ rx=".5"
+ ry=".5"
+ width="28"
+ height="18" />
+ <circle
+ id="DotC"
+ cx="41.5"
+ cy="99.5"
+ r=".5" />
+ <path
+ id="LeaderC"
+ class="C Leader"
+ d="M 58 100 l 20 0" />
+ <text
+ id="LabelC"
+ class="C Label"
+ x="80"
+ y="100"
+ style="text-anchor:start;">C</text>
+ </g>
+ <g>
+ <rect
+ id="ButtonD"
+ class="D Button"
+ x="28"
+ y="109"
+ rx=".5"
+ ry=".5"
+ width="28"
+ height="36" />
+ <circle
+ id="DotD"
+ cx="41.5"
+ cy="126.5"
+ r=".5" />
+ <path
+ id="LeaderD"
+ class="D Leader"
+ d="M 58 127 l 20 0" />
+ <text
+ id="LabelD"
+ class="D Label"
+ x="80"
+ y="127"
+ style="text-anchor:start;">D</text>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/dimensions/bug347-wrapper.svg b/rsvg/tests/fixtures/dimensions/bug347-wrapper.svg
new file mode 100644
index 00000000..46a01284
--- /dev/null
+++ b/rsvg/tests/fixtures/dimensions/bug347-wrapper.svg
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xi="http://www.w3.org/2001/XInclude" width="248" height="176"> <style type="text/css">.Leader {
+ stroke-width: .5 !important;
+ stroke: #535353;
+ fill: none !important;
+}
+
+.Button {
+ stroke-width: .25;
+ stroke: #ededed;
+ fill: #ededed;
+}
+
+.Ring {
+ stroke-width: .5 !important;
+ stroke: #535353 !important;
+ fill: none !important;
+}
+
+.Label {
+ stroke: none !important;
+ stroke-width: .1 !important;
+ font-size: .1 !important;
+ fill: transparent !important;
+}
+
+.TouchStrip, .TouchRing {
+ stroke-width: .1 !important;
+ stroke: #ededed !important;
+ fill: #535353 !important;
+}
+.B { stroke: #729fcf !important; fill: #729fcf !important; } </style><xi:include href="bug347-bamboo-16fg-s-pt.svg" /></svg>
+
diff --git a/rsvg/tests/fixtures/dimensions/bug521-with-viewbox.svg b/rsvg/tests/fixtures/dimensions/bug521-with-viewbox.svg
new file mode 100644
index 00000000..c3f34e6d
--- /dev/null
+++ b/rsvg/tests/fixtures/dimensions/bug521-with-viewbox.svg
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="200" height="100" viewBox="0 0 2000 1000">
+ <rect id="foo" x="500" y="600" width="700" height="800"/>
+</svg>
diff --git a/rsvg/tests/fixtures/dimensions/bug564527.svg b/rsvg/tests/fixtures/dimensions/bug564527.svg
new file mode 100644
index 00000000..2d04794e
--- /dev/null
+++ b/rsvg/tests/fixtures/dimensions/bug564527.svg
@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ version="1.0"
+ width="1683.7795pt"
+ height="1190.5511pt"
+ viewBox="0 0 1027 615"
+ id="svg2">
+ <defs
+ id="defs4">
+ <linearGradient
+ x1="242.5936"
+ y1="461.72623"
+ x2="312.97205"
+ y2="461.72623"
+ id="linearGradient2418"
+ xlink:href="#linearGradient3903-5"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.0493908,0,0,2.0493908,-474.70156,-822.9418)" />
+ <linearGradient
+ x1="-207.14067"
+ y1="237.6931"
+ x2="-74.877228"
+ y2="675.32776"
+ id="linearGradient2415"
+ xlink:href="#linearGradient5803-7"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.4887791,0,0,0.4849705,163.55657,-76.635216)" />
+ <radialGradient
+ cx="181.52547"
+ cy="25.464634"
+ r="25.37454"
+ fx="181.52547"
+ fy="25.464634"
+ id="radialGradient2412"
+ xlink:href="#linearGradient80481-5"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.9737882,1.3404163,-5.1259314,7.5480283,-177.63253,-257.30781)" />
+ <linearGradient
+ id="linearGradient3903-5">
+ <stop
+ id="stop3905-4"
+ style="stop-color:#f3f3f3;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop3907-7"
+ style="stop-color:#8f8f8f;stop-opacity:1"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient5803-7">
+ <stop
+ id="stop5805-4"
+ style="stop-color:#004d00;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop5807-5"
+ style="stop-color:#00bf00;stop-opacity:1"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient80481-5">
+ <stop
+ id="stop80483-6"
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop80485-9"
+ style="stop-color:#ffffff;stop-opacity:0"
+ offset="1" />
+ </linearGradient>
+ <filter
+ color-interpolation-filters="sRGB"
+ id="filter8603">
+ <feGaussianBlur
+ id="feGaussianBlur8605"
+ stdDeviation="1.8364226" />
+ </filter>
+ </defs>
+ <g
+ transform="matrix(0.48794988,0,0,0.48794988,932.13482,396.12943)"
+ id="back">
+ <rect
+ width="143.76929"
+ height="203.27394"
+ rx="8.1304178"
+ ry="8.1304178"
+ x="22.699371"
+ y="21.678707"
+ id="rect5766"
+ style="fill:url(#linearGradient2418);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.46365991;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <rect
+ width="129.6032"
+ height="189.07808"
+ rx="2.6516504"
+ ry="2.6516504"
+ x="29.782429"
+ y="28.776648"
+ id="rect4616"
+ style="fill:url(#linearGradient2415);fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="m 49.903423,215.48573 c 1.2647,-2.15358 -3.745753,-9.7691 -4.390102,-12.65175 c -0.08261,-0.23261 -0.08913,-0.48497 -0.134932,-0.72536 c -0.0845,-0.41232 -0.07015,-0.83238 -0.10124,-1.24829 c -0.01266,-0.73181 0.184773,-1.44482 0.303658,-2.15917 c 0.408055,-0.0328 0.725341,-0.37635 0.725341,-0.79283 c 0,-0.27386 -0.126222,-0.51516 -0.33737,-0.65788 c 0.16393,-0.5444 0.338805,-1.09304 0.506056,-1.63621 c 0.338825,-1.20937 0.903187,-2.3122 1.433835,-3.44119 c 0.762579,-1.45718 1.68546,-2.81812 2.597747,-4.1834 c 0.284517,-0.4345 0.587724,-0.86487 0.894046,-1.28202 c 0.08358,0.015 0.165099,0.0168 0.253018,0.0168 c 0.79666,0 1.450702,-0.63719 1.450702,-1.43381 c 0,-0.2076 -0.05595,-0.41203 -0.134952,-0.59043 c 0.35354,-0.42595 0.717656,-0.86238 1.079599,-1.28202 c 1.580203,-1.74655 3.344503,-3.3037 5.094314,-4.87497 c 1.926632,-1.77276 3.976187,-3.40159 6.03894,-5.01 c 2.455395,-1.90839 5.057015,-3.5983 7.658348,-5.29675 c 2.462466,-1.59439 4.959034,-3.12696 7.472755,-4.63882 c 0.110114,0.0269 0.235864,0.0337 0.354258,0.0337 c 0.796659,0 1.433815,-0.63718 1.433815,-1.43386 c 0,-0.79668 -0.637156,-1.4507 -1.433815,-1.4507 c -0.796681,0 -1.450703,0.65402 -1.450703,1.4507 c 0,0.65951 0.441296,1.21113 1.045845,1.38324 c -0.234327,0.13751 -0.474372,0.26691 -0.708474,0.40483 c -3.060499,1.82552 -6.100463,3.68042 -9.092184,5.61726 c -2.608485,1.70267 -5.22943,3.40096 -7.69204,5.31358 c -2.065991,1.60988 -4.109807,3.25171 -6.038981,5.02683 c -1.484845,1.33231 -2.966677,2.66265 -4.352086,4.09909 c -0.213321,-0.12453 -0.460703,-0.20242 -0.725341,-0.20242 c -0.79668,0 -1.450702,0.65402 -1.450702,1.4507 c 0,0.32157 0.1087,0.62023 0.286771,0.86027 c -0.862527,1.03954 -1.685644,2.10526 -2.429081,3.23876 c -0.91575,1.36835 -1.829061,2.74153 -2.597747,4.20033 c -0.114704,0.24266 -0.221744,0.48316 -0.337391,0.72532 c 0.06605,-1.45735 0.249145,-2.90627 0.438611,-4.35209 c 0.211046,-2.05001 0.714254,-4.03925 1.248263,-6.02209 c 0.500871,-1.81117 1.204919,-3.54061 1.973605,-5.24616 c 0.506117,-0.74661 1.225966,-2.04754 2.074844,-3.87976 c 0.132104,-0.28505 0.228589,-0.59902 0.337391,-0.89401 c 0.02314,-0.0745 0.0572,-0.14649 0.08433,-0.2193 c 1.029982,-1.87278 2.106978,-3.70651 3.188155,-5.54975 c 0.06408,-0.11421 0.137411,-0.22386 0.202418,-0.33737 c 0.405349,-0.56063 0.821048,-1.11317 1.231418,-1.67001 c 1.177457,-1.52007 2.429798,-2.991 3.677344,-4.45331 c 1.606579,-1.86812 3.337372,-3.62209 5.060561,-5.38106 c 1.933109,-1.99902 3.99664,-3.86886 6.055827,-5.7353 c 2.235865,-1.97199 4.459536,-3.9484 6.679969,-5.93774 c 2.351655,-2.11946 4.74354,-4.19884 7.118518,-6.292 c 2.680337,-2.32459 5.272713,-4.74194 7.8439,-7.18603 c 1.363623,-1.29788 2.710175,-2.60656 4.048469,-3.93034 c -0.269967,0.34233 1.293452,-0.85369 4.014717,-3.17131 c 2.6398,-2.24828 5.31823,-4.44693 8.08005,-6.545 c 1.96578,-1.48351 4.4445,-3.33421 5.41482,-3.71109 c 0.40064,-0.16662 0.79633,-0.35293 1.19764,-0.52295 c -0.0426,0.13625 -0.0843,0.27147 -0.0843,0.42175 c 0,0.79662 0.65402,1.4507 1.4507,1.4507 c 0.79668,0 1.43384,-0.65408 1.43384,-1.4507 c 0,-0.35756 -0.1387,-0.67563 -0.35424,-0.92782 c 5.33446,-0.38847 6.43548,-1.16859 0.65786,-0.79279 c -0.48192,0.0313 -0.92633,0.14838 -1.36635,0.32048 c -0.1196,-0.0321 -0.24142,-0.0337 -0.37111,-0.0337 c -0.56339,0 -1.04434,0.32171 -1.28201,0.79285 c -2.90983,1.44007 -5.54975,3.31302 -8.13065,5.26298 c -2.75377,2.09392 -5.41415,4.30153 -8.046325,6.54504 c -1.088165,0.92739 -1.813792,1.58577 -2.226642,1.97358 c 1.375551,-1.36498 2.741941,-2.7326 4.099067,-4.11596 c 2.98185,-2.99946 5.79808,-6.15682 8.53549,-9.37889 c 1.69684,-2.02931 3.3301,-4.11606 4.92563,-6.22451 c 0.26482,0.31786 0.66761,0.52292 1.11333,0.52292 c 0.79666,0 1.43382,-0.65402 1.43382,-1.4507 c 0,-0.58908 -0.35397,-1.09153 -0.8603,-1.31575 c 0.71461,-0.9685 1.4222,-1.94149 2.12545,-2.91823 c 3.02877,-4.155572 5.73182,-8.526062 8.24873,-13.005702 c 2.57082,-4.791046 5.01892,-9.681241 6.64624,-14.878106 c 1.23072,-4.538089 1.94292,-9.195022 2.68208,-13.83222 c 0.88728,-5.566248 -0.49991,-4.75721 -1.38322,0.809673 c -0.73577,4.637075 -1.44754,9.278822 -2.6821,13.815415 c -1.63332,5.197091 -4.08892,10.086159 -6.66308,14.878065 c -0.20143,0.358233 -0.42035,0.705892 -0.62414,1.062712 c -0.0741,-0.361615 -0.39256,-0.640988 -0.77596,-0.640988 c -0.43816,0 -0.79281,0.371534 -0.79283,0.809673 c 0,0.438139 0.35467,0.792868 0.79283,0.792868 c 0.0953,0 0.18522,-0.01984 0.2699,-0.05066 c -2.1961,3.79125 -4.53501,7.504992 -7.11856,11.04894 c -0.48291,0.67058 -0.96263,1.34043 -1.4507,2.00734 c -0.72724,0.0742 -1.29886,0.67027 -1.29886,1.41697 c 0,0.0996 0.0145,0.19289 0.0337,0.28679 c -1.94241,2.60916 -3.93341,5.17992 -6.02207,7.67517 c -2.74055,3.22283 -5.55162,6.37777 -8.535511,9.37894 c -2.805432,2.85892 -5.649782,5.69062 -8.552354,8.45117 c -2.57508,2.44659 -5.17672,4.8588 -7.860767,7.18603 c -2.376043,2.09366 -4.76594,4.1719 -7.118538,6.29194 c -2.222257,1.9904 -4.45929,3.96452 -6.696815,5.93774 c -1.916979,1.73722 -3.835783,3.48605 -5.65099,5.33048 c -0.05349,-0.21068 -0.187068,-0.38364 -0.371104,-0.48917 c 0.709807,-0.73083 1.43359,-1.44377 2.159177,-2.15917 c 2.394939,-2.24905 4.856134,-4.43349 7.25347,-6.67997 c 2.823876,-2.65179 5.5767,-5.3756 8.299357,-8.13065 c 3.119582,-3.12276 5.969055,-6.47817 8.61984,-10.00308 c 2.968481,-4.07239 5.446953,-8.46409 7.843879,-12.88761 c 2.600246,-4.64575 4.642506,-9.54949 6.325716,-14.59128 c 1.64914,-5.428382 2.5601,-11.046848 3.25564,-16.666155 c 0.37451,-4.775142 0.32264,-9.570286 0.18555,-14.355203 c 0.30026,-0.264556 0.48919,-0.648284 0.48921,-1.079578 c 0,-0.467569 -0.22848,-0.883267 -0.57354,-1.147065 c -0.0186,-0.59004 -0.0321,-1.181433 -0.0506,-1.771166 c -0.0364,-0.996311 -0.0648,-1.989487 -0.10122,-2.985757 c -0.2043,-5.589693 -1.57496,-4.796743 -1.36637,0.792827 c 0.0372,0.99584 0.0641,1.989856 0.10122,2.985717 c 0.008,0.258571 0.0254,0.517348 0.0337,0.775961 c -0.54401,0.206804 -0.92776,0.73321 -0.92776,1.349483 c 0,0.646398 0.42599,1.165898 1.01214,1.349503 c 0.0743,2.474352 0.12855,4.947414 0.11806,7.422156 c -0.17266,-0.07308 -0.35749,-0.118045 -0.55667,-0.118045 c -0.79666,0 -1.45069,0.637114 -1.45069,1.433794 c 0,0.796681 0.65401,1.450703 1.45069,1.450703 c 0.1804,0 0.34683,-0.0407 0.50607,-0.10122 c -0.0425,1.596496 -0.10823,3.196886 -0.23617,4.790677 c -0.44711,3.605124 -1.00531,7.210474 -1.77119,10.76215 c 0.0398,-1.693268 0.0616,-3.400267 0.0169,-5.094314 c -0.12602,-4.022421 -0.37135,-8.03478 -0.89405,-12.02726 c -0.43285,-2.725526 -0.84082,-5.458675 -1.61938,-8.113804 c -0.39291,-1.340097 -0.75602,-2.694171 -1.349468,-3.964096 c -0.209038,-0.346081 -0.328702,-0.78256 -0.641029,-1.062753 c -4.546799,-4.078943 -6.073595,-3.154074 -1.484436,0.877181 c 0.315279,0.276913 0.428385,0.68509 0.641029,1.028999 c 0.606559,1.261625 0.964772,2.628815 1.366329,3.964095 c 0.789575,2.648182 1.211625,5.376475 1.653125,8.096897 c 0.53585,3.987439 0.79813,8.008466 0.92778,12.027342 c 0.0618,2.23896 0.0135,4.475706 -0.0506,6.713681 c -0.0375,1.31118 0.008,2.25695 0.10122,2.9014 c -0.0549,0.18619 -0.1121,0.3709 -0.16869,0.55664 c -0.91964,2.75026 -1.95655,5.44662 -3.12071,8.09692 c -0.248488,-0.43577 -0.711056,-0.72532 -1.248284,-0.72532 c -0.796639,0 -1.433794,0.63711 -1.433794,1.43381 c 0,0.79668 0.637155,1.45068 1.433794,1.45068 c 0.09413,0 0.197685,-0.0165 0.286792,-0.0337 c -0.701875,1.47974 -1.440968,2.93553 -2.24353,4.36899 c -2.399918,4.42642 -4.887018,8.83087 -7.860766,12.90442 c -2.654924,3.52735 -5.513496,6.87774 -8.636706,10.00312 c -2.726756,2.75758 -5.470972,5.49364 -8.299316,8.1475 c -2.400882,2.24785 -4.872611,4.42873 -7.270378,6.67995 c -0.413997,0.40811 -0.820617,0.81988 -1.231376,1.23143 c -0.341695,0.0543 -0.60871,0.33133 -0.657896,0.67472 c -1.491669,1.5217 -2.945835,3.07528 -4.200267,4.80755 c -1.611026,2.23203 -3.179056,4.49519 -4.554505,6.88236 c -0.520668,0.7136 -1.014858,1.43228 -1.467589,2.19291 c -0.467343,0.79201 -0.98547,1.56342 -1.383216,2.39535 c -0.253079,0.55998 -0.573358,1.09698 -0.759074,1.68684 c -0.0062,0.0165 -0.01086,0.0341 -0.01689,0.0507 c -0.395778,0.72569 -0.791925,1.45435 -1.163931,2.19291 c -0.47718,1.00131 -0.935178,2.00533 -1.383236,3.01945 c 0.03617,-0.16816 0.06533,-0.33787 0.101219,-0.50606 c 0.294703,-1.40953 0.764403,-2.7802 1.197685,-4.14967 c 0.567333,-1.63521 1.246009,-3.2159 1.923005,-4.80754 c 0.835659,-1.94 1.700256,-3.86776 2.547147,-5.80279 c 1.15725,-2.61113 2.461134,-5.15875 3.744831,-7.70897 c 1.636992,-3.12161 3.084497,-6.32542 4.470193,-9.56444 c 1.658244,-3.94555 3.284825,-7.90579 4.925608,-11.85864 c 1.726837,-4.06497 3.370059,-8.16391 4.925629,-12.29716 c 0.345261,-0.0861 0.607275,-0.4042 0.607275,-0.77596 c 0,-0.17722 -0.05357,-0.34024 -0.151819,-0.47233 c 1.56803,-4.33399 2.9568,-8.73294 4.301467,-13.14065 c 1.552249,-5.12311 2.891998,-10.301959 3.930383,-15.552826 C 80.71169,87.310986 80.94862,81.111005 80.886728,74.936416 C 80.695602,68.649111 79.964318,62.399801 79.199875,56.16166 C 78.727654,52.407647 78.16233,48.66548 77.580487,44.927187 C 77.320542,43.257015 77.015859,42.173215 76.73706,41.604099 c 0.145097,0.04908 0.293842,0.08431 0.455457,0.08431 c 0.796639,0 1.450682,-0.654001 1.450682,-1.450681 c 0,-0.796681 -0.654002,-1.433795 -1.450682,-1.433795 c -0.79668,0 -1.433836,0.637114 -1.433836,1.433795 c 0,0.381863 0.145548,0.737042 0.38797,0.995286 c -0.282467,0.393873 -0.351163,1.931162 0.0506,4.487039 c 0.260088,1.654412 0.513311,3.319562 0.759094,4.976187 c -0.142043,-0.133538 -0.346449,-0.202418 -0.556676,-0.202418 c -0.438139,0 -0.792807,0.354647 -0.792807,0.792868 c 0,0.438139 0.354668,0.792786 0.792807,0.792786 c 0.302798,0 0.574649,-0.172189 0.708495,-0.421682 c 0.257158,1.76348 0.500666,3.528641 0.725341,5.296712 c 0.05568,0.450579 0.113454,0.898719 0.168685,1.349483 c -0.198237,-0.102531 -0.419428,-0.168686 -0.657875,-0.168686 c -0.796659,0 -1.450702,0.654043 -1.450702,1.450723 c 0,0.796619 0.654043,1.433774 1.450702,1.433774 c 0.359259,0 0.675111,-0.136776 0.92776,-0.354216 c 0.593257,5.003587 1.114171,10.025148 1.26517,15.063637 c 0.05952,6.178196 -0.193831,12.373053 -1.26517,18.471118 C 77.22748,99.45301 75.899413,104.6452 74.341712,109.77001 c -1.241419,4.0654 -2.539523,8.10641 -3.964116,12.11164 c -0.240066,0.13657 -0.38797,0.39582 -0.38797,0.69163 c 0,0.0979 0.01814,0.2001 0.0506,0.28675 c -0.100318,0.27707 -0.201885,0.54997 -0.303638,0.82658 c -1.608341,4.28716 -3.30249,8.55536 -5.094314,12.76951 c -1.644247,3.95618 -3.277939,7.91087 -4.942475,11.85861 c -1.390655,3.24222 -2.845927,6.45636 -4.487038,9.58135 c -1.288268,2.55338 -2.598197,5.09524 -3.761698,7.70893 c -0.852342,1.93715 -1.70829,3.87653 -2.547167,5.81968 c -0.67839,1.59272 -1.370305,3.17151 -1.939892,4.8075 c -0.435639,1.37049 -0.90204,2.73856 -1.197644,4.14967 c -0.253141,1.18167 -0.518537,2.36821 -0.725361,3.5593 c -0.105011,0.51849 -0.196414,1.03744 -0.320504,1.55192 c -0.611703,2.53581 -0.671709,3.82316 -0.43857,4.01473 c -0.06882,0.42886 -0.123722,0.86476 -0.168685,1.29885 c -0.223343,1.69242 -0.461564,3.38424 -0.48919,5.09431 c -0.0043,0.78512 0.0014,1.57639 0,2.3616 c -0.183113,0.58475 -0.351962,1.17323 -0.48921,1.77122 c -0.03836,0.23869 -0.08755,0.47044 -0.134952,0.70848 l -7.084785,0 c 4.753766,1.3752 8.481547,0.97538 13.988321,14.74346 z m 1.39582,-11.15047 c 0.43816,0 0.792827,-0.35465 0.792827,-0.79281 c 0,-0.4382 -0.354667,-0.79285 -0.792827,-0.79285 c -0.43816,0 -0.792827,0.35465 -0.792827,0.79285 c 0,0.43816 0.354667,0.79281 0.792827,0.79281 z M 40.250321,200.3037 c 0.79666,0 1.450682,-0.65409 1.450703,-1.45071 c 0,-0.79668 -0.654022,-1.45076 -1.450703,-1.4507 c -0.79668,0 -1.433835,0.65402 -1.433835,1.4507 c 0,0.79662 0.637196,1.45071 1.433835,1.45071 z m 7.79328,-1.7375 c 0.79666,0 1.450682,-0.65402 1.450703,-1.4507 c 0,-0.79668 -0.654023,-1.43379 -1.450703,-1.43379 c -0.79668,0 -1.433836,0.63711 -1.433836,1.43379 c 0,0.79668 0.637197,1.4507 1.433836,1.4507 z M 37.87186,194.51775 c 0.43816,0 0.792827,-0.35464 0.792827,-0.79278 c 0,-0.43822 -0.354667,-0.79287 -0.792827,-0.79287 c -0.43816,0 -0.792827,0.35465 -0.792827,0.79287 c 0,0.43814 0.354667,0.79278 0.792827,0.79278 z m 3.609858,-1.29886 c 0.438181,0 0.792828,-0.35469 0.792828,-0.79285 c 0,-0.43814 -0.354627,-0.79278 -0.792828,-0.79278 c -0.438139,0 -0.792806,0.35464 -0.792806,0.79278 c 0,0.43816 0.354667,0.79279 0.792806,0.79285 z m 13.629843,-1.72059 c 0.796639,0 1.450661,-0.65406 1.450661,-1.4507 c 0,-0.79668 -0.654022,-1.43385 -1.450661,-1.43385 c -0.79668,0 -1.433836,0.63717 -1.433836,1.43385 c 0,0.79664 0.637156,1.4507 1.433836,1.4507 z m 3.390553,-2.46281 c 0.43818,0 0.792848,-0.35471 0.792848,-0.79285 c 0,-0.43814 -0.354668,-0.7928 -0.792848,-0.7928 c -0.438139,0 -0.792807,0.35466 -0.792807,0.7928 c 0,0.43814 0.354668,0.79285 0.792807,0.79285 z m -19.837427,-1.58565 c 0.79666,0 1.450702,-0.63716 1.450702,-1.43384 c 0,-0.7967 -0.654042,-1.4507 -1.450702,-1.4507 c -0.796659,0 -1.450723,0.654 -1.450723,1.4507 c 0,0.79668 0.654064,1.43377 1.450723,1.43384 z m 3.323108,-4.18341 c 0.79666,0 1.433836,-0.65408 1.433836,-1.4507 c 0,-0.79668 -0.637176,-1.43387 -1.433836,-1.43387 c -0.79668,0 -1.450702,0.63719 -1.450702,1.43387 c 0,0.79662 0.654022,1.45064 1.450702,1.4507 z m 18.690362,-0.57354 c 0.43818,0 0.792848,-0.35471 0.792848,-0.79285 c 0,-0.43816 -0.354668,-0.79284 -0.792848,-0.79278 c -0.438139,0 -0.792807,0.35462 -0.792807,0.79278 c 0,0.43814 0.354668,0.79285 0.792807,0.79285 z m 10.458533,-1.2989 c 0.79666,0 1.450702,-0.65402 1.450682,-1.4507 c 0,-0.79668 -0.654022,-1.43386 -1.450682,-1.43382 c -0.79668,0 -1.450702,0.63714 -1.450702,1.43382 c 0,0.79668 0.654022,1.4507 1.450702,1.4507 z m -15.434741,-1.73743 c 0.79666,0 1.433816,-0.6372 1.433836,-1.43388 c 0,-0.79666 -0.637156,-1.4507 -1.433836,-1.4507 c -0.79668,0 -1.450702,0.65404 -1.450702,1.4507 c 0,0.79668 0.654022,1.43381 1.450702,1.43388 z m 5.65097,-0.35426 c 0.06525,0.0143 1.692448,-1.10065 4.352086,-3.0532 c 1.134768,-0.83312 2.237259,-1.71077 3.441194,-2.44597 c 0.49835,-0.29067 3.664782,-2.17234 5.262979,-2.80021 c 0.369915,-0.16602 0.743006,-0.32403 1.113331,-0.48915 c -0.210329,0.25075 -0.33735,0.55822 -0.33735,0.91092 c 0,0.79664 0.637156,1.45064 1.433795,1.4507 c 0.79668,0 1.450702,-0.65406 1.450702,-1.4507 c 0,-0.76711 -0.610616,-1.37148 -1.366329,-1.41697 c 1.261605,-0.55279 2.525096,-1.11026 3.812277,-1.60254 c 1.441398,-0.58045 2.883657,-1.16603 4.33524,-1.72059 c 0.617994,-0.23169 1.238939,-0.4564 1.855539,-0.69159 c 5.6962,-2.17295 7.177479,-3.04146 1.484415,-0.86033 c -0.622031,0.23832 -1.24896,0.47367 -1.872405,0.70849 c -1.457322,0.55869 -2.887756,1.13696 -4.33522,1.72061 c -2.07011,0.79279 -4.10204,1.70687 -6.123293,2.61463 c -2.835639,1.26929 -5.500667,2.86562 -8.164383,4.45331 c -1.202235,0.73413 -2.308168,1.61377 -3.441194,2.44593 c -2.068286,1.51904 -2.952147,2.21553 -2.901384,2.22666 z m -20.090485,-1.51819 c 0.79668,0 1.450702,-0.65402 1.450702,-1.4507 c 0,-0.79668 -0.654022,-1.4338 -1.450702,-1.4338 c -0.79666,0 -1.450682,0.63712 -1.450682,1.4338 c 0,0.79668 0.654022,1.4507 1.450682,1.4507 z m 31.527377,-1.58566 c 0.438159,0 0.792827,-0.35462 0.792827,-0.79278 c 0,-0.43822 -0.354668,-0.79287 -0.792827,-0.79287 c -0.43816,0 -0.792828,0.35465 -0.792828,0.79287 c 0,0.43816 0.354668,0.79278 0.792828,0.79278 z m -26.180046,-2.02422 c 0.796681,0 1.433836,-0.654 1.433836,-1.4507 c 0,-0.79668 -0.637155,-1.4338 -1.433836,-1.4338 c -0.796639,0 -1.450702,0.63712 -1.450702,1.4338 c 0,0.7967 0.654063,1.4507 1.450702,1.4507 z m 7.793301,-0.43857 c 0.79666,0 1.433836,-0.6372 1.433836,-1.43381 c 0,-0.79668 -0.637176,-1.45075 -1.433836,-1.45069 c -0.79666,0 -1.450723,0.65401 -1.450723,1.45069 c 0,0.79661 0.654063,1.43381 1.450723,1.43381 z m -19.567563,-1.14708 c 0.43818,0 0.792848,-0.35463 0.792827,-0.79279 c 0,-0.4382 -0.354647,-0.79287 -0.792827,-0.79287 c -0.43816,0 -0.792807,0.35467 -0.792807,0.79287 c 0,0.43816 0.354647,0.79279 0.792807,0.79279 z m 50.369579,-2.74955 c 0.43818,0 0.792807,-0.35469 0.792807,-0.79285 c 0,-0.43816 -0.354627,-0.79278 -0.792807,-0.79278 c -0.438181,0 -0.792848,0.35462 -0.792848,0.79278 c 0,0.43816 0.354667,0.79285 0.792848,0.79285 z M 67.965401,169.7041 c 0.79666,0 1.433836,-0.65408 1.433836,-1.4507 c 0,-0.79668 -0.637176,-1.43388 -1.433836,-1.43388 c -0.796659,0 -1.450722,0.6372 -1.450722,1.43388 c 0,0.79662 0.654063,1.45064 1.450722,1.4507 z m 25.47153,-1.29892 c 0.43818,0 0.792828,-0.35465 0.792848,-0.79279 c 0,-0.43822 -0.354668,-0.79287 -0.792848,-0.79287 c -0.02168,0 -0.04621,-0.002 -0.06747,0 c 0.261236,-0.26119 0.421724,-0.61379 0.421703,-1.01209 c 0,-0.79668 -0.637155,-1.4507 -1.433794,-1.4507 c -0.796681,0 -1.450723,0.65402 -1.450723,1.4507 c 0,0.79668 0.654042,1.43386 1.450723,1.43386 c 0.142801,0 0.274515,-0.0119 0.404836,-0.0507 c -0.07296,0.12002 -0.118086,0.2711 -0.118086,0.42177 c 0,0.43814 0.354668,0.79279 0.792807,0.79279 z m 4.976249,-3.32307 c 0.79666,0 1.450682,-0.65406 1.450682,-1.4507 c 0,-0.79668 -0.654002,-1.43386 -1.450682,-1.43386 c -0.79668,0 -1.450702,0.63718 -1.450702,1.43386 c 0,0.79664 0.654022,1.45064 1.450702,1.4507 z m -49.205627,0 c 0.796659,0 1.433815,-0.65406 1.433815,-1.4507 c 0,-0.79668 -0.637156,-1.43386 -1.433815,-1.43386 c -0.79668,0 -1.450703,0.63718 -1.450703,1.43386 c 0,0.79664 0.654023,1.45064 1.450703,1.4507 z m 11.386272,-0.15186 c 0.79668,0 1.450702,-0.63716 1.450702,-1.4338 c 0,-0.79668 -0.654022,-1.45074 -1.450702,-1.4507 c -0.79666,0 -1.433816,0.65402 -1.433816,1.4507 c 0,0.79664 0.637156,1.4338 1.433816,1.4338 z m 41.496695,-0.13495 c 0.43816,0 0.79283,-0.35465 0.79283,-0.79279 c 0,-0.4382 -0.35464,-0.79287 -0.79283,-0.79287 c -0.43815,0 -0.79282,0.35467 -0.79282,0.79287 c 0,0.43814 0.35467,0.79279 0.79282,0.79279 z m -31.021296,-1.0121 c 0.438139,0 0.792807,-0.35464 0.792807,-0.79282 c 0,-0.43818 -0.354668,-0.79283 -0.792807,-0.79283 c -0.43818,0 -0.792848,0.35465 -0.792848,0.79283 c 0,0.43818 0.354668,0.79282 0.792848,0.79282 z m -13.208098,-0.94466 c 0.477303,-0.6837 0.945568,-1.36447 1.433836,-2.04107 c 0.880951,-1.21675 1.851501,-2.36065 2.86763,-3.45808 c 0.106569,0.17534 0.285234,0.30247 0.48919,0.35428 c -1.550344,1.57899 -3.092285,3.16417 -4.537638,4.84125 c -0.08599,0.10069 -0.167108,0.20285 -0.253018,0.30362 z m 27.445155,-2.176 c 1.38422,-0.78644 2.984712,-1.68833 4.67259,-2.6315 c 1.18752,-0.64591 2.379855,-1.29669 3.55928,-1.95676 c 0.13032,0.0387 0.262014,0.0506 0.404836,0.0506 c 0.665192,0 1.216334,-0.45019 1.383237,-1.06269 c 1.656276,-0.93754 3.311344,-1.88184 4.959366,-2.83392 c -0.5168,0.29546 -2.69731,1.52454 -4.9425,2.78328 c 0.02447,-0.10526 0.03373,-0.20781 0.03373,-0.32047 c 0,-0.79668 -0.637156,-1.45072 -1.433836,-1.45072 c -0.796659,0 -1.450682,0.65404 -1.450682,1.45072 c 0,0.62935 0.416068,1.16914 0.97838,1.36633 c -0.383851,0.21105 -0.841214,0.46993 -1.130198,0.62416 c -2.353029,1.31481 -4.69579,2.64019 -7.034206,3.98099 z M 103.828,160.4601 c 0.43814,0 0.79281,-0.35469 0.79281,-0.79283 c 0,-0.43818 -0.35467,-0.79281 -0.79281,-0.79281 c -0.43818,0 -0.79285,0.35463 -0.79285,0.79281 c 0,0.43814 0.35465,0.79283 0.79285,0.79283 z m -55.210856,-2.15918 c 0.796659,0 1.450702,-0.65406 1.450702,-1.4507 c 0,-0.15594 -0.03855,-0.2979 -0.08435,-0.43857 c 0.05166,0.0106 0.09704,0.0168 0.151819,0.0168 c 0.43818,0 0.792807,-0.35464 0.792807,-0.79278 c 0,-0.43822 -0.354627,-0.80972 -0.792807,-0.80972 c -0.427318,0 -0.775797,0.35277 -0.792807,0.77598 c -0.212296,-0.12288 -0.462609,-0.18561 -0.725361,-0.18561 c -0.79666,0 -1.433836,0.6372 -1.433836,1.43386 c 0,0.79664 0.637156,1.4507 1.433836,1.4507 z m -4.689457,-0.15182 c 0.43816,0 0.792807,-0.35465 0.792807,-0.79281 c 0,-0.43822 -0.354647,-0.79284 -0.792807,-0.79284 c -0.43818,0 -0.792848,0.35462 -0.792848,0.79284 c 0,0.43816 0.354668,0.79281 0.792848,0.79281 z m 10.036789,-5.48228 c 0.796659,0 1.433836,-0.63718 1.433836,-1.43386 c 0,-0.79668 -0.637177,-1.4507 -1.433836,-1.4507 c -0.79668,0 -1.450703,0.65402 -1.450703,1.4507 c 0,0.79668 0.654023,1.43386 1.450703,1.43386 z m 60.979894,-0.28677 c 0.43818,0 0.79284,-0.35465 0.79284,-0.79281 c 0,-0.4382 -0.35466,-0.79285 -0.79284,-0.79285 c -0.43816,0 -0.79281,0.35465 -0.79281,0.79285 c 0,0.43816 0.35465,0.79281 0.79281,0.79281 z m -14.08526,-0.48917 c 0.7189,-0.41591 1.44084,-0.83134 2.15917,-1.24829 c 3.61652,-2.0972 7.04288,-4.48044 10.37418,-7.00049 c 1.68173,-1.29204 3.31084,-2.64046 4.8919,-4.04845 c 0.20275,0.55194 0.72753,0.94465 1.34948,0.94465 c 0.79666,0 1.43382,-0.63718 1.43382,-1.43382 c 0,-0.57924 -0.33377,-1.08605 -0.82654,-1.31575 c 1.14194,-1.07165 2.25779,-2.15545 3.35684,-3.27249 c 0.80106,-0.81338 1.57676,-1.65756 2.32786,-2.51345 c 0.0384,-0.0347 0.0797,-0.0665 0.11809,-0.10122 c 2.32185,-2.09872 4.64461,-4.17233 6.91612,-6.32569 c 0.0361,-0.0365 0.0651,-0.0816 0.10122,-0.11809 c 0.10015,0.69909 0.70714,1.23144 1.43379,1.23144 c 0.79668,0 1.45072,-0.6372 1.45072,-1.43386 c 0,-0.73823 -0.56667,-1.34843 -1.28199,-1.43381 c 1.30931,-1.37965 2.55665,-2.80941 3.59297,-4.41957 c 1.36213,-2.00246 2.71024,-4.01509 4.01471,-6.05583 c 1.2934,-2.03568 2.58156,-4.07595 3.82919,-6.14018 c 0.72251,-1.20068 1.45199,-2.39031 2.14229,-3.60986 c -0.0192,0.0939 -0.0337,0.18719 -0.0337,0.28679 c 0,0.79662 0.63719,1.45071 1.43383,1.45071 c 0.79668,0 1.4507,-0.65409 1.4507,-1.45071 c 0,-0.79668 -0.65402,-1.43387 -1.4507,-1.43387 c -0.39008,0 -0.7354,0.15309 -0.99522,0.40485 c 0.1928,-0.35147 0.38893,-0.70671 0.57352,-1.06269 c 0.5294,-1.12446 1.10275,-2.236252 1.48443,-3.424345 c 0.17045,-0.448796 0.28643,-0.904253 0.50606,-1.332596 c 0.33493,-0.653325 0.61137,-1.211948 0.82654,-1.686874 c 0.69038,-0.107798 1.21455,-0.696547 1.21455,-1.416928 c 0,-0.597561 -0.35922,-1.113434 -0.87716,-1.332657 c 0.34153,-0.08868 0.59041,-0.389959 0.59041,-0.759054 c 0,-0.438221 -0.35467,-0.792868 -0.79285,-0.792868 c -0.43814,0 -0.79281,0.354647 -0.79281,0.792868 c 0,0.27384 0.14309,0.515156 0.35424,0.657834 c -0.75799,0.0432 -1.36635,0.665089 -1.36635,1.433877 c 0,0.569895 0.32967,1.06429 0.8097,1.298822 c -0.42775,0.710216 -0.902,1.569587 -1.45071,2.665253 c -0.21367,0.426663 -0.34013,0.886444 -0.50605,1.332637 c -0.3744,1.184961 -0.94346,2.286321 -1.46757,3.407461 c -0.95213,1.84912 -2.0338,3.63283 -3.1038,5.41478 c -1.24603,2.06486 -2.53565,4.10491 -3.82917,6.14016 c -1.30429,2.0401 -2.65332,4.05371 -4.01473,6.05584 c -0.86515,1.34555 -1.87977,2.55678 -2.95201,3.72793 c -0.32501,0.16399 -0.58176,0.43105 -0.70847,0.77596 c -0.52991,0.5568 -1.07845,1.10632 -1.61939,1.65312 c -1.29935,1.23258 -2.61951,2.44144 -3.94725,3.64361 c 1.8514,-2.27183 3.56994,-4.65011 5.22927,-7.0679 c 2.98444,-4.23086 5.17309,-8.89614 6.96672,-13.73102 c 0.0875,-0.24525 0.15337,-0.49597 0.23615,-0.74223 c 0.13466,0.65741 0.71987,1.16391 1.41697,1.16391 c 0.79666,0 1.43383,-0.65402 1.43383,-1.4507 c 0,-0.79668 -0.63717,-1.4507 -1.43383,-1.4507 c -0.3765,0 -0.72133,0.15157 -0.9784,0.38801 c 1.38918,-4.6283 2.00543,-9.419573 2.36163,-14.237076 c 0.50225,-4.961944 0.0596,-9.889089 -0.57356,-14.810619 c -1.18293,-9.195391 -3.44814,-7.898045 -2.27724,1.298863 c 0.6272,4.926366 1.04697,9.862201 0.55666,14.827506 c -0.41011,5.549791 -1.16767,11.077016 -3.05321,16.345616 c -1.79697,4.83683 -3.98174,9.51421 -6.96674,13.74793 c -2.50593,3.64902 -5.15624,7.20508 -8.18125,10.44162 c -1.70866,1.5144 -3.43629,3.02539 -5.16178,4.52077 c -1.25023,1.10438 -2.5777,2.11385 -3.87978,3.15447 c -4.55131,3.63728 -3.11762,2.81055 1.43383,-0.82661 c 1.18025,-0.94317 2.38002,-1.86482 3.52555,-2.85076 c -0.007,0.0282 -0.0117,0.0555 -0.0169,0.0843 c -2.28654,2.161 -4.67009,4.23792 -7.16913,6.15705 c -3.27218,2.47468 -6.64343,4.81199 -10.18863,6.88239 z m -7.995701,-0.37113 c 0.43818,0 0.792827,-0.35469 0.792827,-0.79285 c 0,-0.43813 -0.354647,-0.79284 -0.792827,-0.79278 c -0.43816,0 -0.792827,0.35465 -0.792827,0.79278 c 0,0.43816 0.354667,0.79285 0.792827,0.79285 z m 14.439491,-0.59041 c 0.36162,-0.0741 0.64103,-0.40942 0.64103,-0.7928 c 0,-0.43822 -0.35466,-0.79285 -0.79284,-0.79285 c -0.43816,0 -0.79281,0.35463 -0.79281,0.79285 c 0,0.43816 0.35465,0.7928 0.79281,0.7928 c 0.0548,0 0.10017,0.0106 0.15181,0 z m -31.982809,-0.4217 c 0.79666,0 1.450702,-0.65406 1.450702,-1.4507 c 0,-0.79668 -0.654042,-1.43386 -1.450702,-1.43386 c -0.79668,0 -1.433836,0.63718 -1.433836,1.43386 c 0,0.79664 0.637156,1.4507 1.433836,1.4507 z m 4.402706,-0.43857 c 0.43816,0 0.792828,-0.35471 0.792807,-0.79287 c 0,-0.43814 -0.354647,-0.79282 -0.792807,-0.79278 c -0.43818,0 -0.792827,0.35464 -0.792827,0.79278 c 0,0.43816 0.354647,0.79287 0.792827,0.79287 z m 20.933893,-3.60988 c 0.43818,0 0.79285,-0.35471 0.79283,-0.79287 c 0,-0.43814 -0.35465,-0.79278 -0.79283,-0.79278 c -0.43816,0 -0.792828,0.35464 -0.792828,0.79278 c 0,0.43816 0.354668,0.79287 0.792828,0.79287 z m 7.13542,-0.42172 c 0.79666,0 1.45071,-0.65404 1.45069,-1.45072 c 0,-0.79666 -0.65403,-1.45071 -1.45069,-1.45071 c -0.79668,0 -1.43383,0.65405 -1.43383,1.45071 c 0,0.79668 0.63715,1.45072 1.43383,1.45072 z m -50.943117,-0.59041 c 0.79668,0 1.450703,-0.63716 1.450703,-1.43386 c 0,-0.79668 -0.654023,-1.45068 -1.450703,-1.45068 c -0.796659,0 -1.450681,0.654 -1.450681,1.45068 c 0,0.7967 0.654022,1.43386 1.450681,1.43386 z m 68.334617,-1.43386 c 0.43816,0 0.79281,-0.35464 0.79281,-0.79278 c 0,-0.4382 -0.35465,-0.79283 -0.79281,-0.79283 c -0.43818,0 -0.79282,0.35463 -0.79282,0.79283 c 0,0.43814 0.35464,0.79278 0.79282,0.79278 z m -50.875631,-0.28673 c 0.79666,0 1.450702,-0.65404 1.450702,-1.45068 c 0,-0.79668 -0.654042,-1.43386 -1.450702,-1.43386 c -0.79666,0 -1.433836,0.63718 -1.433815,1.43386 c 0,0.79664 0.637155,1.45068 1.433815,1.45068 z m -21.574921,-2.46281 c 0.438181,0 0.792848,-0.35469 0.792848,-0.79283 c 0,-0.43816 -0.354667,-0.79283 -0.792848,-0.79283 c -0.438139,0 -0.792807,0.35467 -0.792807,0.79283 c 0,0.43814 0.354668,0.79283 0.792807,0.79283 z m 58.230322,-0.13495 c 0.79668,0 1.45071,-0.65407 1.45071,-1.45071 c 0,-0.79666 -0.65405,-1.43385 -1.45071,-1.43385 c -0.79664,0 -1.43379,0.63719 -1.43383,1.43385 c 0,0.79664 0.63715,1.45071 1.43383,1.45071 z M 59.160009,139.678 c 0.79666,0 1.433816,-0.63715 1.433816,-1.43385 c 0,-0.49788 -0.24021,-0.93821 -0.624142,-1.19763 c 0.04367,-0.0983 0.05062,-0.20604 0.05062,-0.32052 c 0,-0.43814 -0.354668,-0.79287 -0.792828,-0.79281 c -0.43816,0 -0.792827,0.35467 -0.792827,0.79281 c 0,0.0913 0.02221,0.17139 0.0506,0.25306 c -0.453366,0.24338 -0.77594,0.71478 -0.77594,1.26509 c 0,0.7967 0.654022,1.43381 1.450702,1.43385 z m 31.17312,-1.29888 c 0.79666,0 1.433815,-0.63718 1.433815,-1.43382 c 0,-0.79668 -0.637155,-1.4507 -1.433815,-1.4507 c -0.79668,0 -1.450702,0.65402 -1.450702,1.4507 c 0,0.79664 0.654022,1.43382 1.450702,1.43382 z M 63.748247,137.8562 c 0.334583,-0.0274 0.991639,-1.66013 1.551922,-4.63886 c 0.568583,-3.02308 1.112757,-6.04943 1.450681,-9.10905 c 0.386003,-3.77164 0.626745,-7.55906 0.506077,-11.35252 c -0.14772,-2.83353 -0.325976,-5.66632 -0.809714,-8.46802 c -0.301117,-1.88913 -0.58504,-3.77916 -1.062712,-5.634103 C 65.173065,97.933921 65.01889,97.200198 64.709739,96.511316 c -2.497654,-5.565838 -4.075521,-4.662651 -1.484415,0.860293 c 0.320197,0.68255 0.457814,1.4091 0.674742,2.125465 c 0.493985,1.847646 0.789569,3.749236 1.096444,5.634086 c 0.490358,2.7976 0.672487,5.62084 0.826581,8.45115 c 0.128374,3.78855 -0.0945,7.56791 -0.472323,11.33569 c -0.331468,3.05804 -0.883267,6.08813 -1.450702,9.10901 c -0.493719,2.62843 -0.447054,3.85327 -0.151819,3.82919 z m 30.835769,-0.0506 c 0.43816,0 0.792807,-0.35465 0.792807,-0.79279 c 0,-0.4382 -0.354668,-0.79287 -0.792807,-0.79287 c -0.43818,0 -0.792827,0.35467 -0.792848,0.79287 c 0,0.43814 0.354668,0.79279 0.792848,0.79279 z m -23.666611,-0.57352 c 0.43814,0 0.792807,-0.35465 0.792807,-0.79279 c 0,-0.43822 -0.354626,-0.79287 -0.792807,-0.79287 c -0.43818,0 -0.792848,0.35465 -0.792848,0.79287 c 0,0.43814 0.354668,0.79279 0.792848,0.79279 z m 9.463247,-2.59777 c 0.79668,0 1.433836,-0.65402 1.433836,-1.4507 c 0,-0.79668 -0.637156,-1.43386 -1.433836,-1.4338 c -0.79666,0 -1.450682,0.63712 -1.450682,1.4338 c 0,0.79668 0.654022,1.4507 1.450682,1.4507 z m 40.265308,-1.16391 c 0.79668,0 1.43383,-0.63718 1.43383,-1.43386 c 0,-0.79668 -0.63715,-1.45068 -1.43383,-1.45068 c -0.79666,0 -1.45071,0.654 -1.45071,1.45068 c 0,0.79668 0.65405,1.43386 1.45071,1.43386 z m 16.22758,-3.32313 c 0.43814,0 0.79281,-0.35465 0.79281,-0.79281 c 0,-0.43818 -0.35467,-0.79284 -0.79281,-0.79284 c -0.43818,0 -0.79284,0.35466 -0.79284,0.79284 c 0,0.43816 0.35466,0.79281 0.79284,0.79281 z m -27.49579,-6.78117 c 0.79666,0 1.4507,-0.63717 1.4507,-1.43381 c 0,-0.79668 -0.65404,-1.45075 -1.4507,-1.45071 c -0.79666,0 -1.43382,0.65403 -1.43382,1.45071 c 0,0.79664 0.63716,1.43381 1.43382,1.43381 z m 15.36727,-2.31095 c 0.43816,0 0.8097,-0.35473 0.8097,-0.79287 c 0,-0.43816 -0.37154,-0.79285 -0.8097,-0.79279 c -0.43816,0 -0.79282,0.35463 -0.79282,0.79279 c 0,0.43814 0.35464,0.79287 0.79282,0.79287 z m -70.207022,-0.99529 c 0.79668,0 1.450702,-0.65402 1.450702,-1.4507 c 0,-0.79668 -0.654022,-1.45068 -1.450702,-1.45068 c -0.796639,0 -1.433816,0.654 -1.433816,1.45068 c 0,0.79668 0.637177,1.4507 1.433816,1.4507 z m 36.520472,-0.59037 c 0.796659,0 1.433835,-0.63717 1.433835,-1.43385 c 0,-0.79668 -0.637176,-1.45071 -1.433835,-1.45071 c -0.79668,0 -1.450703,0.65403 -1.450703,1.45071 c 0,0.79668 0.654023,1.43379 1.450703,1.43385 z m 55.63258,-1.7206 c 0.43814,0 0.7928,-0.35469 0.7928,-0.79285 c 0,-0.43816 -0.35466,-0.79285 -0.7928,-0.79281 c -0.43818,0 -0.79283,0.35465 -0.79283,0.79281 c 0,0.43816 0.35465,0.79285 0.79283,0.79285 z m -1.80494,-1.16396 c 0.79666,0 1.45068,-0.63717 1.45068,-1.43379 c 0,-0.7967 -0.65402,-1.45076 -1.45068,-1.4507 c -0.79668,0 -1.4507,0.654 -1.4507,1.4507 c 0,0.79662 0.65402,1.43379 1.4507,1.43379 z m -44.887275,-0.4217 c 0.796655,0 1.450705,-0.65406 1.450685,-1.4507 c 0,-0.79668 -0.65403,-1.45068 -1.450685,-1.45068 c -0.796681,0 -1.433836,0.654 -1.433836,1.45068 c 0,0.79664 0.637155,1.45066 1.433836,1.4507 z m -23.818451,-1.60254 c 0.796681,0 1.450703,-0.63718 1.450703,-1.43377 c 0,-0.79671 -0.654022,-1.45077 -1.450703,-1.45071 c -0.796659,0 -1.433815,0.654 -1.433815,1.45071 c 0,0.79659 0.637135,1.43377 1.433815,1.43377 z m -15.080483,-6.19074 c 0.438139,0 0.792807,-0.37153 0.792807,-0.80967 c 0,-0.43822 -0.354647,-0.79287 -0.792807,-0.79287 c -0.43818,0 -0.792848,0.35465 -0.792848,0.79287 c 0,0.43814 0.354668,0.80963 0.792848,0.80967 z m 8.299336,-0.30362 c 0.796639,0 1.450661,-0.63719 1.450702,-1.43385 c 0,-0.79668 -0.654063,-1.45072 -1.450702,-1.45072 c -0.79668,0 -1.433836,0.65404 -1.433836,1.45072 c 0,0.79666 0.637156,1.43379 1.433836,1.43385 z m 63.645143,-0.42174 c 0.79664,0 1.45066,-0.65402 1.45066,-1.4507 c 0,-0.79668 -0.65402,-1.43386 -1.45066,-1.43382 c -0.79668,0 -1.43384,0.63714 -1.43384,1.43382 c 0,0.79668 0.63716,1.4507 1.43384,1.4507 z m -54.755418,-1.4507 c 0.438159,0 0.792827,-0.35465 0.792827,-0.79279 c 0,-0.43822 -0.354668,-0.79287 -0.792827,-0.79287 c -0.43816,0 -0.809694,0.35465 -0.809694,0.79287 c 0,0.43814 0.371534,0.79279 0.809694,0.79279 z m 19.989266,-6.05579 c 0.796659,0 1.433815,-0.654081 1.433815,-1.4507 c 0,-0.79668 -0.637156,-1.433856 -1.433815,-1.433856 c -0.796681,0 -1.450703,0.637176 -1.450703,1.433856 c 0,0.796619 0.654022,1.4507 1.450703,1.4507 z M 115.2986,99.986243 c 0.79668,0 1.4507,-0.637176 1.4507,-1.433816 c 0,-0.79668 -0.65402,-1.450743 -1.4507,-1.450702 c -0.79664,0 -1.43381,0.654022 -1.43381,1.450702 c 0,0.79664 0.63717,1.433816 1.43381,1.433816 z m 30.02608,-1.585655 c 0.79666,0 1.43383,-0.637176 1.43383,-1.433815 c 0,-0.79668 -0.63717,-1.450702 -1.43383,-1.450702 c -0.79666,0 -1.4507,0.654022 -1.4507,1.450702 c 0,0.796639 0.65404,1.433815 1.4507,1.433815 z M 73.160914,97.253524 c 0.79666,0 1.433836,-0.654002 1.433816,-1.450703 c 0,-0.79668 -0.637156,-1.433794 -1.433816,-1.433794 c -0.79668,0 -1.450702,0.637114 -1.450702,1.433794 c 0,0.796701 0.654022,1.450703 1.450702,1.450703 z m 36.655426,-0.151799 c 0.79666,0 1.45068,-0.637155 1.45068,-1.433856 c 0,-0.79668 -0.65402,-1.450682 -1.45068,-1.450682 c -0.79668,0 -1.4507,0.654002 -1.4507,1.450682 c 0,0.796701 0.65402,1.433815 1.4507,1.433856 z M 80.886728,93.930457 c 0.43814,0 0.792807,-0.354729 0.792807,-0.792868 c 0,-0.43816 -0.354626,-0.792848 -0.792807,-0.792787 c -0.43818,0 -0.809714,0.354627 -0.809714,0.792787 c 0,0.438139 0.371534,0.792868 0.809714,0.792868 z M 60.087769,91.6194 c 0.43818,0 0.809673,-0.354627 0.809714,-0.792786 c 0,-0.438181 -0.371534,-0.792848 -0.809714,-0.792848 c -0.438181,0 -0.792807,0.354667 -0.792807,0.792848 c 0,0.438159 0.354626,0.792786 0.792807,0.792786 z m 52.393801,-0.28673 c 0.43816,0 0.79281,-0.354688 0.79281,-0.792828 c 0,-0.438159 -0.35465,-0.792827 -0.79281,-0.792827 c -0.43818,0 -0.79283,0.354668 -0.79283,0.792827 c 0,0.43814 0.35465,0.792828 0.79283,0.792828 z m 23.16056,-1.298904 c 0.79668,0 1.4507,-0.654002 1.4507,-1.450682 c 0,-0.79668 -0.65402,-1.433856 -1.4507,-1.433815 c -0.79666,0 -1.43384,0.637135 -1.43384,1.433815 c 0,0.79668 0.63718,1.450682 1.43384,1.450682 z M 97.333581,89.460244 c 0.438181,0 0.792828,-0.354647 0.792828,-0.792807 c 0,-0.43818 -0.354647,-0.792848 -0.792828,-0.792848 c -0.43818,0 -0.792806,0.354668 -0.792806,0.792848 c 0,0.43816 0.354626,0.792807 0.792806,0.792807 z m 56.712159,-1.298843 c 0.43816,0 0.79282,-0.354729 0.79282,-0.792868 c 0,-0.438139 -0.35466,-0.792786 -0.79282,-0.792786 c -0.43816,0 -0.79283,0.354647 -0.79283,0.792786 c 0,0.438139 0.35467,0.792786 0.79283,0.792868 z M 99.138521,87.874589 c 0.79668,0 1.433839,-0.654002 1.433839,-1.450682 c 0,-0.7967 -0.637159,-1.450702 -1.433839,-1.450702 c -0.79666,0 -1.450702,0.654002 -1.450702,1.450702 c 0,0.79668 0.654042,1.450682 1.450702,1.450682 z m 23.093089,-0.43859 c 0.79668,0 1.43384,-0.654002 1.43384,-1.450702 c 0,-0.796681 -0.63716,-1.433857 -1.43384,-1.433775 c -0.79666,0 -1.45068,0.637094 -1.4507,1.433775 c 0,0.7967 0.65402,1.450702 1.4507,1.450702 z m 9.88497,-2.024224 c 0.43818,0 0.79283,-0.354647 0.79285,-0.792787 c 0,-0.438221 -0.35467,-0.792868 -0.79285,-0.792868 c -0.43816,0 -0.79281,0.354647 -0.79281,0.792868 c 0,0.43814 0.35465,0.792787 0.79281,0.792787 z m 21.57492,-0.43857 c 0.79668,0 1.43384,-0.637176 1.43384,-1.433815 c 0,-0.79668 -0.63716,-1.450703 -1.43384,-1.450703 c -0.79666,0 -1.45068,0.654023 -1.45068,1.450703 c 0,0.796639 0.65402,1.433815 1.45068,1.433815 z m -76.397784,0 c 0.361615,-0.07406 0.624142,-0.409448 0.624142,-0.792786 c 0,-0.438222 -0.354647,-0.792869 -0.792827,-0.792869 c -0.43816,0 -0.792828,0.354647 -0.792828,0.792869 c 0,0.438139 0.354668,0.792786 0.792828,0.792786 c 0.05476,0 0.11704,0.01055 0.168685,0 z m 66.360974,-2.294129 c 0.43818,0 0.79281,-0.354647 0.79281,-0.792807 c 0,-0.438201 -0.35463,-0.809694 -0.79281,-0.809694 c -0.43816,0 -0.79281,0.371493 -0.79281,0.809694 c 0,0.43816 0.35465,0.792807 0.79281,0.792807 z M 85.862936,81.228374 c 0.79668,0 1.433836,-0.654022 1.433836,-1.450703 c 0,-0.79668 -0.637156,-1.433794 -1.433836,-1.433794 c -0.796639,0 -1.450702,0.637114 -1.450702,1.433794 c 0,0.796681 0.654063,1.450703 1.450702,1.450703 z m 48.851434,-1.147065 c 0.43814,0 0.7928,-0.354647 0.7928,-0.792807 c 0,-0.43818 -0.35466,-0.809673 -0.7928,-0.809673 c -0.43818,0 -0.79285,0.371493 -0.79285,0.809673 c 0,0.43816 0.35467,0.792807 0.79285,0.792807 z m -23.75099,-2.024245 c 0.79668,0 1.45071,-0.654001 1.45071,-1.450661 c 0,-0.02959 -0.0151,-0.05525 -0.0169,-0.08433 c 0.11157,0.0598 0.23574,0.08433 0.3711,0.08433 c 0.43818,0 0.79285,-0.354667 0.79285,-0.792827 c 0,-0.438201 -0.35467,-0.792828 -0.79285,-0.792828 c -0.36514,0 -0.66662,0.254494 -0.75907,0.590409 c -0.26249,-0.271687 -0.63853,-0.438569 -1.04587,-0.438569 c -0.79664,0 -1.43379,0.637094 -1.43383,1.433815 c 0,0.79666 0.63715,1.450661 1.43383,1.450661 z m 15.5191,-1.737432 c 0.43818,0 0.79284,-0.354688 0.79284,-0.792848 c 0,-0.438139 -0.35466,-0.792848 -0.79284,-0.792786 c -0.43816,0 -0.79281,0.354647 -0.79281,0.792786 c 0,0.43816 0.35465,0.792848 0.79281,0.792848 z m 24.54379,-0.286792 c 0.43818,0 0.79283,-0.354626 0.7928,-0.792786 c 0,-0.438201 -0.35462,-0.792869 -0.7928,-0.792869 c -0.43818,0 -0.79285,0.354668 -0.79285,0.792869 c 0,0.43816 0.35467,0.792786 0.79285,0.792786 z m -6.14016,-0.151778 c 0.79666,0 1.45068,-0.637155 1.45068,-1.433877 c 0,-0.796659 -0.65402,-1.450661 -1.45068,-1.450661 c -0.79668,0 -1.4507,0.654002 -1.4507,1.450661 c 0,0.796722 0.65402,1.433816 1.4507,1.433877 z M 84.564073,75.459318 c 0.79666,0 1.433816,-0.654022 1.433816,-1.450702 c 0,-0.79668 -0.637156,-1.433795 -1.433816,-1.433795 c -0.796659,0 -1.450702,0.637115 -1.450702,1.433795 c 0,0.79668 0.654043,1.450702 1.450702,1.450702 z m 12.263452,-1.585655 c 0.79666,0 1.450703,-0.654001 1.450703,-1.450702 c 0,-0.79668 -0.654043,-1.433774 -1.450703,-1.433774 c -0.621949,0 -1.146736,0.392684 -1.349483,0.944626 c -0.143662,0.143641 -0.236171,0.337534 -0.236171,0.556635 c 0,0.273839 0.143088,0.515176 0.354237,0.657916 c 0.251194,0.425125 0.702162,0.725299 1.231417,0.725299 z m 32.320205,-1.298842 c 0.79666,0 1.45068,-0.654063 1.45068,-1.450702 c 0,-0.79668 -0.65402,-1.433856 -1.45068,-1.433856 c -0.79668,0 -1.43384,0.637176 -1.43384,1.433856 c 0,0.796639 0.63716,1.450702 1.43384,1.450702 z M 75.893613,71.124119 c 0.79668,0 1.450702,-0.637176 1.450702,-1.433856 c 0,-0.796681 -0.654022,-1.450703 -1.450702,-1.450703 c -0.796639,0 -1.433836,0.654022 -1.433836,1.450703 c 0,0.79668 0.637197,1.433856 1.433836,1.433856 z m 24.324507,-4.470213 c 0.43814,0 0.79281,-0.354627 0.79281,-0.792787 c 0,-0.4382 -0.35467,-0.792827 -0.79281,-0.792827 c -0.438181,0 -0.792828,0.354627 -0.792828,0.792827 c 0,0.43816 0.354647,0.792787 0.792828,0.792787 z m 48.6321,-0.286731 c 0.43818,0 0.79281,-0.354688 0.79281,-0.792847 c 0,-0.43814 -0.35463,-0.792848 -0.79281,-0.792787 c -0.43818,0 -0.79284,0.354647 -0.79284,0.792787 c 0,0.438159 0.35466,0.792847 0.79284,0.792847 z M 82.894086,66.215336 c 0.43816,0 0.792807,-0.354647 0.792807,-0.792786 c 0,-0.438222 -0.354647,-0.792869 -0.792807,-0.792869 c -0.43816,0 -0.792827,0.354647 -0.792827,0.792869 c 0,0.438139 0.354667,0.792786 0.792827,0.792786 z m 55.851864,-3.323067 c 0.43816,0 0.79281,-0.354667 0.79281,-0.792868 c 0,-0.438139 -0.35465,-0.792786 -0.79281,-0.792786 c -0.43816,0 -0.79283,0.354647 -0.79283,0.792786 c 0,0.43816 0.35467,0.792786 0.79283,0.792868 z m 3.1038,-1.147085 c 0.79668,0 1.4507,-0.654063 1.4507,-1.450702 c 0,-0.79668 -0.65402,-1.433856 -1.4507,-1.433856 c -0.79666,0 -1.43383,0.637176 -1.43383,1.433856 c 0,0.796639 0.63715,1.450702 1.43383,1.450702 z M 89.978871,60.007711 c 0.43818,0 0.792848,-0.354647 0.792848,-0.792807 c 0,-0.438201 -0.354668,-0.792848 -0.792848,-0.792848 c -0.438139,0 -0.809673,0.354647 -0.809673,0.792848 c 0,0.43816 0.371534,0.792807 0.809673,0.792807 z m 6.561904,-0.573522 c 0.796639,0 1.433794,-0.637135 1.433794,-1.433816 c 0,-0.79668 -0.637155,-1.450763 -1.433794,-1.450702 c -0.796681,0 -1.450703,0.654022 -1.450703,1.450702 c 0,0.796619 0.654022,1.433816 1.450703,1.433816 z M 84.125483,57.123214 c 0.79668,0 1.450702,-0.637176 1.450702,-1.433857 c 0,-0.7967 -0.654022,-1.450702 -1.450702,-1.450702 c -0.79666,0 -1.450682,0.654002 -1.450682,1.450702 c 0,0.796681 0.654022,1.433857 1.450682,1.433857 z m 41.631657,-0.421765 c 0.43818,0 0.79282,-0.371534 0.79282,-0.809673 c 0,-0.43816 -0.35464,-0.792807 -0.79282,-0.792807 c -0.43816,0 -0.79281,0.354647 -0.79283,0.792807 c 0,0.438139 0.35467,0.809673 0.79283,0.809673 z m -18.69039,-0.151778 c 0.79668,0 1.45071,-0.654083 1.45071,-1.450702 c 0,-0.79668 -0.65403,-1.433836 -1.45071,-1.433836 c -0.79666,0 -1.43383,0.637156 -1.43383,1.433836 c 0,0.796619 0.63717,1.450641 1.43383,1.450702 z m 24.89803,-1.450702 c 0.43816,0 0.79283,-0.354688 0.79283,-0.792848 c 0,-0.438139 -0.35467,-0.792868 -0.79283,-0.792786 c -0.43818,0 -0.79283,0.354647 -0.79283,0.792786 c 0,0.43816 0.35465,0.792848 0.79283,0.792848 z m -27.85001,-3.306241 c 0.43814,0 0.79281,-0.354709 0.79281,-0.792848 c 0,-0.43816 -0.35467,-0.792848 -0.79281,-0.792786 c -0.43818,0 -0.79285,0.354626 -0.79285,0.792786 c 0,0.438139 0.35467,0.792848 0.79285,0.792848 z m -30.953856,-0.43857 c 0.79666,0 1.433836,-0.654063 1.433816,-1.450702 c 0,-0.79668 -0.637156,-1.433856 -1.433816,-1.433856 c -0.79668,0 -1.450702,0.637176 -1.450702,1.433856 c 0,0.796639 0.654022,1.450702 1.450702,1.450702 z m 54.333696,-3.45808 c 0.43816,0 0.79281,-0.354668 0.79281,-0.792828 c 0,-0.43818 -0.35465,-0.792827 -0.79281,-0.792827 c -0.43818,0 -0.79285,0.354647 -0.79285,0.792827 c 0,0.43816 0.35467,0.792828 0.79285,0.792828 z m 5.12803,-1.012133 c 0.79668,0 1.43383,-0.654002 1.43383,-1.450702 c 0,-0.796681 -0.63715,-1.433857 -1.43383,-1.433795 c -0.79666,0 -1.45069,0.637114 -1.45069,1.433795 c 0,0.7967 0.65403,1.450702 1.45069,1.450702 z M 71.204177,44.707922 c 0.438139,0 0.792806,-0.354647 0.792806,-0.792827 c 0,-0.43818 -0.354647,-0.792827 -0.792806,-0.792827 c -0.438181,0 -0.792828,0.354647 -0.792848,0.792827 c 0,0.438139 0.354667,0.792827 0.792848,0.792827 z m 61.485963,-3.019511 c 0.43814,0 0.79281,-0.354626 0.79281,-0.792766 c 0,-0.438221 -0.35467,-0.792847 -0.79281,-0.792847 c -0.43818,0 -0.79285,0.354688 -0.79285,0.792847 c 0,0.43814 0.35467,0.792766 0.79285,0.792766 z M 92.998362,39.51243 c 0.43818,0 0.792827,-0.354729 0.792806,-0.792869 c 0,-0.438159 -0.354626,-0.792847 -0.792806,-0.792786 c -0.438181,0 -0.792828,0.354627 -0.792828,0.792786 c 0,0.43814 0.354647,0.792869 0.792828,0.792869 z M 72.654838,35.615759 c 0.43818,0 0.792848,-0.354647 0.792848,-0.792807 c 0,-0.438201 -0.354668,-0.792848 -0.792848,-0.792848 c -0.438139,0 -0.792807,0.354647 -0.792807,0.792848 c 0,0.43816 0.354668,0.792807 0.792807,0.792807 z m 4.031623,-2.884518 c 0.438139,0 0.792807,-0.354647 0.792807,-0.792847 c 0,-0.43814 -0.354668,-0.792787 -0.792807,-0.792787 c -0.43818,0 -0.792848,0.354647 -0.792848,0.792787 c 0,0.438159 0.354647,0.792806 0.792848,0.792847 z"
+ id="path5809"
+ style="fill:url(#radialGradient2412);fill-opacity:1;stroke:none" />
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/dimensions/bug608102.svg b/rsvg/tests/fixtures/dimensions/bug608102.svg
new file mode 100644
index 00000000..9f1849b9
--- /dev/null
+++ b/rsvg/tests/fixtures/dimensions/bug608102.svg
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg id="svg2"
+ viewBox="0 0 16 16"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns="http://www.w3.org/2000/svg"
+ version="1.1"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <defs id="defs6">
+ <clipPath id="clipPath3622" clipPathUnits="userSpaceOnUse">
+ <rect id="rect3624" fill-rule="nonzero" height="5.4258" width="11.531" y="6.0898" x="1.7969" fill="#999"/>
+ </clipPath>
+ </defs>
+ <path id="p" stroke-linejoin="round" style="stroke-dasharray:none;" d="m2.3244,5.7854,10.461,0l-5.2303,5.3116-5.2303-5.3116z" clip-path="url(#clipPath3622)" stroke="#DDD" stroke-miterlimit="4" stroke-width="0.60196698000000004" fill="#797979"/>
+</svg>
diff --git a/rsvg/tests/fixtures/dimensions/bug612951.svg b/rsvg/tests/fixtures/dimensions/bug612951.svg
new file mode 100644
index 00000000..9a81417d
--- /dev/null
+++ b/rsvg/tests/fixtures/dimensions/bug612951.svg
@@ -0,0 +1,738 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://web.resource.org/cc/"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ id="svg2327"
+ width="100%"
+ height="100%"
+ sodipodi:version="0.32"
+ inkscape:version="0.42+devel"
+ sodipodi:docbase="/home/jimmac/gfx/ximian/tango-icon-theme/scalable/devices"
+ sodipodi:docname="computer.svg">
+ <defs
+ id="defs3">
+ <linearGradient
+ id="linearGradient2985"
+ inkscape:collect="always">
+ <stop
+ id="stop2987"
+ offset="0"
+ style="stop-color:#d8dfd6;stop-opacity:1;" />
+ <stop
+ id="stop2989"
+ offset="1"
+ style="stop-color:#d8dfd6;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient2752">
+ <stop
+ id="stop2754"
+ offset="0"
+ style="stop-color:#9d9d9d;stop-opacity:1;" />
+ <stop
+ id="stop2756"
+ offset="1.0000000"
+ style="stop-color:#b9b9b9;stop-opacity:1.0000000;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient2711">
+ <stop
+ id="stop2713"
+ offset="0.0000000"
+ style="stop-color:#909090;stop-opacity:1.0000000;" />
+ <stop
+ id="stop2715"
+ offset="1.0000000"
+ style="stop-color:#bebebe;stop-opacity:0.0000000;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient2701">
+ <stop
+ id="stop2703"
+ offset="0.0000000"
+ style="stop-color:#585956;stop-opacity:1.0000000;" />
+ <stop
+ id="stop2705"
+ offset="1.0000000"
+ style="stop-color:#bbbeb8;stop-opacity:1.0000000;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient2691">
+ <stop
+ id="stop2693"
+ offset="0.0000000"
+ style="stop-color:#868686;stop-opacity:1.0000000;" />
+ <stop
+ id="stop2695"
+ offset="1.0000000"
+ style="stop-color:#e9e9e9;stop-opacity:1.0000000;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient2683"
+ inkscape:collect="always">
+ <stop
+ id="stop2685"
+ offset="0"
+ style="stop-color:#000000;stop-opacity:1;" />
+ <stop
+ id="stop2687"
+ offset="1"
+ style="stop-color:#000000;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient2675">
+ <stop
+ id="stop2677"
+ offset="0.0000000"
+ style="stop-color:#5b5b97;stop-opacity:1.0000000;" />
+ <stop
+ id="stop2679"
+ offset="1.0000000"
+ style="stop-color:#1b1b43;stop-opacity:1.0000000;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient2667">
+ <stop
+ id="stop2669"
+ offset="0.0000000"
+ style="stop-color:#ffffff;stop-opacity:1.0000000;" />
+ <stop
+ id="stop2671"
+ offset="1.0000000"
+ style="stop-color:#fcfcff;stop-opacity:0.0000000;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient2635"
+ inkscape:collect="always">
+ <stop
+ id="stop2637"
+ offset="0"
+ style="stop-color:#f9fff5;stop-opacity:1;" />
+ <stop
+ id="stop2639"
+ offset="1"
+ style="stop-color:#f9fff5;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient2623">
+ <stop
+ id="stop2625"
+ offset="0.0000000"
+ style="stop-color:#dfdfde;stop-opacity:1.0000000;" />
+ <stop
+ id="stop2627"
+ offset="1.0000000"
+ style="stop-color:#9d9f9a;stop-opacity:1.0000000;" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2454">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop2456" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop2458" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2415">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop2417" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop2419" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient2379">
+ <stop
+ style="stop-color:#1a4876;stop-opacity:1.0000000;"
+ offset="0.0000000"
+ id="stop2381" />
+ <stop
+ style="stop-color:#3f54a3;stop-opacity:0.0000000;"
+ offset="1.0000000"
+ id="stop2383" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2328">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop2330" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop2332" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2307">
+ <stop
+ style="stop-color:#5a7aa4;stop-opacity:1;"
+ offset="0"
+ id="stop2309" />
+ <stop
+ style="stop-color:#5a7aa4;stop-opacity:0;"
+ offset="1"
+ id="stop2311" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient2253">
+ <stop
+ style="stop-color:#8f8f8f;stop-opacity:1.0000000;"
+ offset="0.0000000"
+ id="stop2255" />
+ <stop
+ style="stop-color:#494949;stop-opacity:1.0000000;"
+ offset="1.0000000"
+ id="stop2257" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient2245">
+ <stop
+ style="stop-color:#dde1d9;stop-opacity:1.0000000;"
+ offset="0.0000000"
+ id="stop2247" />
+ <stop
+ style="stop-color:#cacdc6;stop-opacity:1.0000000;"
+ offset="1.0000000"
+ id="stop2249" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2245"
+ id="linearGradient2251"
+ gradientTransform="matrix(1.129863,0.000000,0.000000,0.885063,-1.625000,-1.304372)"
+ x1="8.6116238"
+ y1="7.2293582"
+ x2="34.784473"
+ y2="33.339787"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2307"
+ id="linearGradient2313"
+ gradientTransform="matrix(1.208393,0.000000,0.000000,0.984410,-0.789284,-0.503380)"
+ x1="16.851954"
+ y1="9.3235140"
+ x2="24.418941"
+ y2="53.734985"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2328"
+ id="linearGradient2334"
+ gradientTransform="matrix(1.289166,0.000000,0.000000,0.922731,-0.789284,-0.503380)"
+ x1="16.119127"
+ y1="10.842293"
+ x2="27.289009"
+ y2="39.031910"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2415"
+ id="linearGradient2421"
+ gradientTransform="matrix(1.108069,0.000000,0.000000,0.902471,1.000000,1.000000)"
+ x1="17.698339"
+ y1="13.004725"
+ x2="34.974548"
+ y2="55.200756"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2379"
+ id="linearGradient2445"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.027870,0.000000,0.000000,0.822296,1.523986,1.001198)"
+ x1="21.356108"
+ y1="30.078255"
+ x2="19.994572"
+ y2="-1.3221773" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2454"
+ id="radialGradient2460"
+ gradientTransform="scale(1.925808,0.519262)"
+ cx="12.575710"
+ cy="67.501709"
+ fx="12.575710"
+ fy="67.501709"
+ r="8.7662794"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2454"
+ id="radialGradient2464"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="scale(1.925808,0.519262)"
+ cx="12.575710"
+ cy="67.501709"
+ fx="12.575710"
+ fy="67.501709"
+ r="8.7662794" />
+ <linearGradient
+ y2="92.570930"
+ x2="10.728384"
+ y1="84.029198"
+ x1="10.728384"
+ gradientTransform="scale(1.983556,0.504145)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2653"
+ xlink:href="#linearGradient2623"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="74.098007"
+ x2="8.6485014"
+ y1="101.28460"
+ x1="13.628710"
+ gradientTransform="scale(2.143634,0.466498)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2655"
+ xlink:href="#linearGradient2635"
+ inkscape:collect="always" />
+ <radialGradient
+ r="8.7662794"
+ fy="67.501709"
+ fx="12.575710"
+ cy="67.501709"
+ cx="12.575710"
+ gradientTransform="scale(1.925808,0.519262)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient2659"
+ xlink:href="#linearGradient2454"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ y2="26.729263"
+ x2="17.199417"
+ y1="1.6537577"
+ x1="11.492236"
+ gradientTransform="matrix(1.238977,0.000000,0.000000,0.895955,0.590553,-1.331524)"
+ id="linearGradient2673"
+ xlink:href="#linearGradient2667"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ y2="8.8666229"
+ x2="16.315819"
+ y1="32.622238"
+ x1="19.150396"
+ gradientTransform="matrix(1.174139,0.000000,0.000000,0.945431,0.721825,-1.331524)"
+ id="linearGradient2681"
+ xlink:href="#linearGradient2675"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ y2="162.45061"
+ x2="3.7069974"
+ y1="171.29134"
+ x1="3.7069976"
+ gradientTransform="matrix(5.705159,0.000000,0.000000,0.175280,1.000000,-0.679373)"
+ id="linearGradient2689"
+ xlink:href="#linearGradient2683"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ y2="64.892525"
+ x2="12.127711"
+ y1="53.535141"
+ x1="12.206709"
+ gradientTransform="scale(1.816345,0.550556)"
+ id="linearGradient2707"
+ xlink:href="#linearGradient2701"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ y2="3.8451097"
+ x2="35.520542"
+ y1="3.9384086"
+ x1="34.300991"
+ id="linearGradient2717"
+ xlink:href="#linearGradient2711"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="3.8451097"
+ x2="35.520542"
+ y1="3.9384086"
+ x1="34.300991"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2721"
+ xlink:href="#linearGradient2711"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="3.8451097"
+ x2="35.520542"
+ y1="3.9384086"
+ x1="34.300991"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2725"
+ xlink:href="#linearGradient2711"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="3.8451097"
+ x2="35.520542"
+ y1="3.9384086"
+ x1="34.300991"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2729"
+ xlink:href="#linearGradient2711"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="3.8451097"
+ x2="35.520542"
+ y1="3.9384086"
+ x1="34.300991"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2733"
+ xlink:href="#linearGradient2711"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="74.098007"
+ x2="8.6485014"
+ y1="101.28460"
+ x1="13.628710"
+ gradientTransform="matrix(2.143634,0.000000,0.000000,0.466498,1.000000,-0.508826)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2741"
+ xlink:href="#linearGradient2635"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ y2="100.20015"
+ x2="8.1134233"
+ y1="88.509071"
+ x1="8.1134243"
+ gradientTransform="scale(2.309851,0.432928)"
+ id="linearGradient2758"
+ xlink:href="#linearGradient2752"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ y2="31.246054"
+ x2="32.536823"
+ y1="5.3817744"
+ x1="10.390738"
+ gradientTransform="scale(1.104397,0.905471)"
+ id="linearGradient2979"
+ xlink:href="#linearGradient2253"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="52.536461"
+ x2="18.176752"
+ y1="48.643234"
+ x1="18.316999"
+ gradientTransform="scale(1.129863,0.885063)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2981"
+ xlink:href="#linearGradient2245"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ y2="44.878883"
+ x2="-23.885700"
+ y1="49.953003"
+ x1="-23.885700"
+ gradientTransform="scale(1.492875,0.669848)"
+ id="linearGradient2991"
+ xlink:href="#linearGradient2985"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="100.20015"
+ x2="8.1134233"
+ y1="88.509071"
+ x1="8.1134243"
+ gradientTransform="scale(2.309851,0.432928)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1409"
+ xlink:href="#linearGradient2752"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="100.20015"
+ x2="8.1134233"
+ y1="88.509071"
+ x1="8.1134243"
+ gradientTransform="scale(2.309851,0.432928)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1411"
+ xlink:href="#linearGradient2752"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="31.246054"
+ x2="32.536823"
+ y1="5.3817744"
+ x1="10.390738"
+ gradientTransform="scale(1.104397,0.905471)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1413"
+ xlink:href="#linearGradient2253"
+ inkscape:collect="always" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="0.12156863"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="75.353821"
+ inkscape:cy="12.176086"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:grid-bbox="true"
+ inkscape:document-units="px"
+ inkscape:window-width="770"
+ inkscape:window-height="576"
+ inkscape:window-x="402"
+ inkscape:window-y="25"
+ inkscape:showpageshadow="false" />
+ <metadata
+ id="metadata4">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title>Computer</dc:title>
+ <dc:date>2005-03-08</dc:date>
+ <dc:creator>
+ <cc:Agent>
+ <dc:title>Jakub Steiner</dc:title>
+ </cc:Agent>
+ </dc:creator>
+ <dc:subject>
+ <rdf:Bag>
+ <rdf:li>workstation</rdf:li>
+ <rdf:li>computer</rdf:li>
+ <rdf:li>node</rdf:li>
+ <rdf:li>client</rdf:li>
+ </rdf:Bag>
+ </dc:subject>
+ <cc:license
+ rdf:resource="http://creativecommons.org/licenses/by-sa/2.0/" />
+ <dc:source>http://jimmac.musichall.cz/</dc:source>
+ </cc:Work>
+ <cc:License
+ rdf:about="http://creativecommons.org/licenses/by-sa/2.0/">
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/Reproduction" />
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/Distribution" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/Notice" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/Attribution" />
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/ShareAlike" />
+ </cc:License>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <path
+ sodipodi:type="arc"
+ style="color:#000000;fill:url(#radialGradient2460);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:0.70063692;visibility:visible;display:inline;overflow:visible"
+ id="path2452"
+ sodipodi:cx="24.218407"
+ sodipodi:cy="35.051105"
+ sodipodi:rx="16.882174"
+ sodipodi:ry="4.5520000"
+ d="M 41.100580 35.051105 A 16.882174 4.5520000 0 1 1 7.3362331,35.051105 A 16.882174 4.5520000 0 1 1 41.100580 35.051105 z"
+ transform="matrix(1.000000,0.000000,0.000000,1.368932,-1.978553,-13.61713)" />
+ <path
+ sodipodi:type="arc"
+ style="color:#000000;fill:#adb0aa;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#4b4d4a;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
+ id="path2407"
+ sodipodi:cx="-35.658386"
+ sodipodi:cy="29.716238"
+ sodipodi:rx="9.3944187"
+ sodipodi:ry="3.9395950"
+ d="M -26.263968 29.716238 A 9.3944187 3.9395950 0 1 1 -45.052805,29.716238 A 9.3944187 3.9395950 0 1 1 -26.263968 29.716238 z"
+ transform="translate(57.53339,3.203427)" />
+ <path
+ transform="matrix(0.940273,0.000000,0.000000,0.940273,55.40361,4.271194)"
+ d="M -26.263968 29.716238 A 9.3944187 3.9395950 0 1 1 -45.052805,29.716238 A 9.3944187 3.9395950 0 1 1 -26.263968 29.716238 z"
+ sodipodi:ry="3.9395950"
+ sodipodi:rx="9.3944187"
+ sodipodi:cy="29.716238"
+ sodipodi:cx="-35.658386"
+ id="path1825"
+ style="color:#000000;fill:none;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#7b7f7a;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
+ sodipodi:type="arc" />
+ <path
+ sodipodi:type="arc"
+ style="color:#000000;fill:none;fill-opacity:1.0000000;fill-rule:evenodd;stroke:url(#linearGradient2991);stroke-width:0.68065339;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
+ id="path2983"
+ sodipodi:cx="-35.658386"
+ sodipodi:cy="29.716238"
+ sodipodi:rx="9.3944187"
+ sodipodi:ry="3.9395950"
+ d="M -26.263968 29.716238 A 9.3944187 3.9395950 0 1 1 -45.052805,29.716238 A 9.3944187 3.9395950 0 1 1 -26.263968 29.716238 z"
+ transform="matrix(0.940273,0.000000,0.000000,0.940273,55.40361,3.521194)" />
+ <path
+ sodipodi:nodetypes="ccccccccccccccccc"
+ style="fill:#d0d0d0;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#979797;stroke-width:0.40000001;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000"
+ d="M 25.687500,28.766243 L 25.625000,29.766243 C 25.625000,29.766243 29.949108,33.365409 34.625000,33.968750 C 36.962946,34.270420 39.378675,34.671162 41.375000,35.156250 C 43.371325,35.641338 44.963356,36.275856 45.500000,36.812500 C 45.810411,37.122911 45.951063,37.386139 46.000000,37.593750 C 46.048937,37.801361 46.038217,37.948565 45.906250,38.156250 C 45.642317,38.571620 44.826393,39.123902 43.437500,39.562500 C 40.659715,40.439695 35.717076,41.000000 28.875000,41.000000 L 28.875000,42.000000 C 35.770998,42.000000 40.738665,41.472329 43.718750,40.531250 C 45.208792,40.060710 46.243692,39.515563 46.750000,38.718750 C 47.003154,38.320344 47.107321,37.830301 47.000000,37.375000 C 46.892679,36.919699 46.615445,36.490445 46.218750,36.093750 C 45.341180,35.216180 43.681912,34.687310 41.625000,34.187500 C 39.568088,33.687690 37.109264,33.273171 34.750000,32.968750 C 30.031473,32.359908 25.687500,28.766243 25.687500,28.766243 z "
+ id="path2411" />
+ <path
+ transform="matrix(1.000000,0.000000,0.000000,1.368932,-1.978553,-19.02126)"
+ d="M 41.100580 35.051105 A 16.882174 4.5520000 0 1 1 7.3362331,35.051105 A 16.882174 4.5520000 0 1 1 41.100580 35.051105 z"
+ sodipodi:ry="4.5520000"
+ sodipodi:rx="16.882174"
+ sodipodi:cy="35.051105"
+ sodipodi:cx="24.218407"
+ id="path2462"
+ style="color:#000000;fill:url(#radialGradient2464);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:0.70063692;visibility:visible;display:inline;overflow:visible"
+ sodipodi:type="arc" />
+ <rect
+ y="30.703611"
+ x="17.472397"
+ height="2.7400389"
+ width="9.0396729"
+ id="rect2699"
+ style="color:#000000;fill:url(#linearGradient2707);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.60872948;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible" />
+ <path
+ style="color:#000000;fill:url(#linearGradient2251);fill-opacity:1.0000000;fill-rule:evenodd;stroke:url(#linearGradient2979);stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
+ d="M 7.0809024,1.6956221 L 36.669097,1.6956221 C 37.580439,1.6956221 38.293244,2.2791039 38.335849,3.0972091 L 39.667893,28.675323 C 39.726102,29.793058 38.766837,30.695628 37.647588,30.695628 L 6.1024120,30.695628 C 4.9831629,30.695628 4.0238980,29.793058 4.0821068,28.675323 L 5.4141506,3.0972091 C 5.4544343,2.3236745 5.9616533,1.6956221 7.0809024,1.6956221 z "
+ id="rect2404"
+ sodipodi:nodetypes="cssssssss" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ id="path2377"
+ d="M 8.4105348,4.3058272 L 7.1683398,26.351144 L 34.818729,26.351144 L 33.483712,4.3992558 L 8.4105348,4.3058272 z "
+ style="fill:url(#linearGradient2681);fill-opacity:1.0000000;fill-rule:evenodd;stroke:#000079;stroke-width:0.50000000;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-opacity:1.0000000" />
+ <path
+ style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:url(#linearGradient2689);stroke-width:0.99618119;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-opacity:0.24840762"
+ d="M 6.1774331,28.735789 L 37.605910,28.735789"
+ id="path2393" />
+ <path
+ sodipodi:nodetypes="cssssssss"
+ id="path2397"
+ d="M 6.9145985,2.7063396 L 36.760101,2.6685383 C 37.043798,2.6681790 37.319403,2.9057881 37.342206,3.3210821 L 38.704098,28.124330 C 38.762137,29.181361 38.164349,29.910201 37.105727,29.910201 L 6.5817583,29.910201 C 5.5231355,29.910201 4.9887439,29.181410 5.0458869,28.124330 L 6.3699773,3.6301633 C 6.4086732,2.9143326 6.5363627,2.7068187 6.9145985,2.7063396 z "
+ style="color:#000000;fill:none;fill-opacity:1.0000000;fill-rule:evenodd;stroke:url(#linearGradient2421);stroke-width:0.99999964;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:0.70063692;visibility:visible;display:inline;overflow:visible" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ style="opacity:0.53142858;fill:url(#linearGradient2673);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.25000000pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
+ d="M 8.7115364,4.7463626 L 7.9090069,22.616693 C 18.953645,20.216063 19.330470,12.124494 33.063039,9.4699426 L 32.901567,4.8124267 L 8.7115364,4.7463626 z "
+ id="path2443" />
+ <path
+ transform="matrix(1.264398,0.000000,0.000000,1.291262,-6.216332,-4.000423)"
+ d="M 41.100580 35.051105 A 16.882174 4.5520000 0 1 1 7.3362331,35.051105 A 16.882174 4.5520000 0 1 1 41.100580 35.051105 z"
+ sodipodi:ry="4.5520000"
+ sodipodi:rx="16.882174"
+ sodipodi:cy="35.051105"
+ sodipodi:cx="24.218407"
+ id="path2657"
+ style="color:#000000;fill:url(#radialGradient2659);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:0.70063692;visibility:visible;display:inline;overflow:visible"
+ sodipodi:type="arc" />
+ <path
+ sodipodi:nodetypes="cssssssss"
+ id="path2409"
+ d="M 6.4621839,36.817452 L 37.464590,36.817452 C 38.583839,36.817452 38.441945,37.088890 38.556817,37.430298 L 41.391463,45.855108 C 41.506335,46.196517 41.418485,46.467954 40.299236,46.467954 L 3.6275382,46.467954 C 2.5082891,46.467954 2.4204387,46.196517 2.5353107,45.855108 L 5.3699564,37.430298 C 5.4848284,37.088889 5.3429348,36.817452 6.4621839,36.817452 z "
+ style="opacity:1.0000000;color:#000000;fill:url(#linearGradient2981);fill-opacity:1.0000000;fill-rule:evenodd;stroke:url(#linearGradient1413);stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible" />
+ <path
+ sodipodi:nodetypes="ccccccccc"
+ id="path2611"
+ d="M 6.3916892,38.829113 L 4.6239223,43.955638 L 10.104000,43.955638 L 10.634330,41.922706 L 25.483572,41.922706 L 26.033251,43.997820 L 32.201086,43.997820 L 30.521708,38.829113 L 6.3916892,38.829113 z "
+ style="fill:#7a7d77;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.25000000pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000" />
+ <path
+ id="path2613"
+ d="M 11.076272,42.276260 L 10.634330,43.955639 L 25.395184,43.955639 L 24.953242,42.187872 L 11.076272,42.276260 z "
+ style="fill:#777874;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.25000000pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000" />
+ <path
+ style="color:#000000;fill:#777a75;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.25000000pt;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
+ d="M 37.592776,38.829114 L 39.272155,43.867250 L 33.792077,43.778861 L 32.289475,38.917502 L 37.592776,38.829114 z "
+ id="path2619" />
+ <path
+ id="path2615"
+ d="M 37.592776,38.298786 L 39.272155,43.336922 L 33.792077,43.248533 L 32.289475,38.387174 L 37.592776,38.298786 z "
+ style="opacity:1.0000000;color:#000000;fill:url(#linearGradient2758);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.25000000pt;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible" />
+ <path
+ style="fill:url(#linearGradient1411);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.25000000pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
+ d="M 6.3916892,38.210397 L 4.6239223,43.336922 L 10.104000,43.336922 L 10.634330,41.303990 L 25.483572,41.303990 L 26.033251,43.379104 L 32.201086,43.379104 L 30.521708,38.210397 L 6.3916892,38.210397 z "
+ id="path2617"
+ sodipodi:nodetypes="ccccccccc" />
+ <path
+ style="opacity:1.0000000;color:#000000;fill:url(#linearGradient1409);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.25000000pt;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
+ d="M 11.076272,41.745932 L 10.634330,43.425311 L 25.395184,43.425311 L 24.953242,41.657544 L 11.076272,41.745932 z "
+ id="path2621" />
+ <path
+ style="color:#000000;fill:none;fill-opacity:1.0000000;fill-rule:evenodd;stroke:url(#linearGradient2741);stroke-width:0.50000000;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
+ d="M 6.1278189,37.578116 L 37.953634,37.578116 L 40.590813,45.670679 L 3.3297429,45.670679 L 6.1278189,37.578116 z "
+ id="path2631"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ transform="matrix(1.331237,0.000000,0.000000,0.658449,-10.41933,2.853866)"
+ d="M 35.620504 3.9384086 A 0.83968931 0.83968931 0 1 1 33.941126,3.9384086 A 0.83968931 0.83968931 0 1 1 35.620504 3.9384086 z"
+ sodipodi:ry="0.83968931"
+ sodipodi:rx="0.83968931"
+ sodipodi:cy="3.9384086"
+ sodipodi:cx="34.780815"
+ id="path2709"
+ style="color:#000000;fill:url(#linearGradient2717);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.50000000;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
+ sodipodi:type="arc" />
+ <path
+ sodipodi:type="arc"
+ style="color:#000000;fill:url(#linearGradient2721);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.50000000;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
+ id="path2719"
+ sodipodi:cx="34.780815"
+ sodipodi:cy="3.9384086"
+ sodipodi:rx="0.83968931"
+ sodipodi:ry="0.83968931"
+ d="M 35.620504 3.9384086 A 0.83968931 0.83968931 0 1 1 33.941126,3.9384086 A 0.83968931 0.83968931 0 1 1 35.620504 3.9384086 z"
+ transform="matrix(1.331237,0.000000,0.000000,0.658449,-10.30573,4.959651)" />
+ <path
+ transform="matrix(1.331237,0.000000,0.000000,0.658449,-10.19213,6.959651)"
+ d="M 35.620504 3.9384086 A 0.83968931 0.83968931 0 1 1 33.941126,3.9384086 A 0.83968931 0.83968931 0 1 1 35.620504 3.9384086 z"
+ sodipodi:ry="0.83968931"
+ sodipodi:rx="0.83968931"
+ sodipodi:cy="3.9384086"
+ sodipodi:cx="34.780815"
+ id="path2723"
+ style="color:#000000;fill:url(#linearGradient2725);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.50000000;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
+ sodipodi:type="arc" />
+ <path
+ sodipodi:type="arc"
+ style="color:#000000;fill:url(#linearGradient2729);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.50000000;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
+ id="path2727"
+ sodipodi:cx="34.780815"
+ sodipodi:cy="3.9384086"
+ sodipodi:rx="0.83968931"
+ sodipodi:ry="0.83968931"
+ d="M 35.620504 3.9384086 A 0.83968931 0.83968931 0 1 1 33.941126,3.9384086 A 0.83968931 0.83968931 0 1 1 35.620504 3.9384086 z"
+ transform="matrix(1.331237,0.000000,0.000000,0.658449,-10.07853,8.959651)" />
+ <path
+ transform="matrix(1.331237,0.000000,0.000000,0.658449,-9.964930,10.95965)"
+ d="M 35.620504 3.9384086 A 0.83968931 0.83968931 0 1 1 33.941126,3.9384086 A 0.83968931 0.83968931 0 1 1 35.620504 3.9384086 z"
+ sodipodi:ry="0.83968931"
+ sodipodi:rx="0.83968931"
+ sodipodi:cy="3.9384086"
+ sodipodi:cx="34.780815"
+ id="path2731"
+ style="color:#000000;fill:url(#linearGradient2733);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.50000000;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
+ sodipodi:type="arc" />
+ <path
+ id="text2735"
+ d="M 20.000000,27.317666 L 20.281716,27.317666 C 20.365481,27.317667 20.429701,27.336330 20.474376,27.373656 C 20.519345,27.410690 20.541829,27.463594 20.541830,27.532370 C 20.541829,27.601440 20.519345,27.654638 20.474376,27.691965 C 20.429701,27.728998 20.365481,27.747515 20.281716,27.747515 L 20.169735,27.747515 L 20.169735,27.975885 L 20.000000,27.975885 L 20.000000,27.317666 M 20.169735,27.440669 L 20.169735,27.624512 L 20.263640,27.624512 C 20.296558,27.624512 20.321982,27.616576 20.339911,27.600705 C 20.357839,27.584540 20.366804,27.561762 20.366804,27.532370 C 20.366804,27.502979 20.357839,27.480348 20.339911,27.464476 C 20.321982,27.448605 20.296558,27.440669 20.263640,27.440669 L 20.169735,27.440669 M 20.961979,27.428765 C 20.910250,27.428766 20.870131,27.447870 20.841621,27.486078 C 20.813112,27.524288 20.798857,27.578074 20.798857,27.647437 C 20.798857,27.716507 20.813112,27.770146 20.841621,27.808355 C 20.870131,27.846564 20.910250,27.865668 20.961979,27.865668 C 21.014001,27.865668 21.054267,27.846564 21.082778,27.808355 C 21.111287,27.770146 21.125541,27.716507 21.125542,27.647437 C 21.125541,27.578074 21.111287,27.524288 21.082778,27.486078 C 21.054267,27.447870 21.014001,27.428766 20.961979,27.428765 M 20.961979,27.305762 C 21.067787,27.305763 21.150671,27.336036 21.210630,27.396582 C 21.270588,27.457128 21.300567,27.540747 21.300568,27.647437 C 21.300567,27.753834 21.270588,27.837305 21.210630,27.897851 C 21.150671,27.958398 21.067787,27.988671 20.961979,27.988671 C 20.856464,27.988671 20.773580,27.958398 20.713328,27.897851 C 20.653370,27.837305 20.623391,27.753834 20.623391,27.647437 C 20.623391,27.540747 20.653370,27.457128 20.713328,27.396582 C 20.773580,27.336036 20.856464,27.305763 20.961979,27.305762 M 21.428420,27.317666 L 21.617994,27.317666 L 21.857387,27.769117 L 21.857387,27.317666 L 22.018305,27.317666 L 22.018305,27.975885 L 21.828730,27.975885 L 21.589338,27.524434 L 21.589338,27.975885 L 21.428420,27.975885 L 21.428420,27.317666 M 22.091489,27.317666 L 22.277095,27.317666 L 22.426991,27.552209 L 22.576887,27.317666 L 22.762935,27.317666 L 22.512079,27.698578 L 22.512079,27.975885 L 22.342344,27.975885 L 22.342344,27.698578 L 22.091489,27.317666"
+ style="font-size:0.90290260;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;writing-mode:lr-tb;text-anchor:start;fill:#4a4a4a;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Bitstream Vera Sans" />
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/dimensions/bug614018.svg b/rsvg/tests/fixtures/dimensions/bug614018.svg
new file mode 100644
index 00000000..c0cc8381
--- /dev/null
+++ b/rsvg/tests/fixtures/dimensions/bug614018.svg
@@ -0,0 +1,360 @@
+<?xml version="1.0" standalone="no"?>
+
+<!--
+ Copyright (C) 2008 Papavasileiou Dimitris
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+-->
+
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+
+ <svg viewBox="0 0 972 546"
+ xmlns="http://www.w3.org/2000/svg" version="1.1"
+ xmlns:xlink="http://www.w3.org/1999/xlink">
+
+ <defs>
+ <pattern id="stripe" patternUnits="userSpaceOnUse"
+ x="-0.0286"
+ y="-0.0286"
+ width="0.0572"
+ height="0.0572"
+ viewBox="0 0 1 1" >
+
+ <rect x="0" y="0.3" width="1" height="0.4" fill="white" />
+ </pattern>
+
+ <g id="side">
+ <path d="M -1.378
+ -0.75
+ L -0.06
+ -0.75
+ L -0.07
+ -0.71
+ L -1.36
+ -0.71
+ z"
+ stroke="rgb(50, 50, 50)" stroke-width="0.003"
+ fill="rgb(110, 139, 61)" />
+ </g>
+
+ <g id="top">
+ <path d="M -1.46
+ -0.668
+ L -1.42
+ -0.648
+ L -1.42
+ 0.648
+ L -1.46
+ 0.668
+ z"
+ stroke="rgb(50, 50, 50)" stroke-width="0.003"
+ fill="rgb(110, 139, 61)" />
+ </g>
+
+ <g id="pocket">
+ <path fill="rgb(30, 30, 30)" stroke="black" stroke-width="0.003"
+ d="M -0.06 0 A 0.065 0.07 0 1 1 0.06 0"/>
+ <path fill="black" d="M -0.06 0 A 0.06 0.08 0 0 1 0.06 0"/>
+ <path fill="black" d="M -0.061 0 A 0.10 0.10 0 0 0 0.061 0"/>
+ </g>
+
+ <g id="diamond" transform="translate(0 -0.0141) rotate(45)">
+ <rect width="0.02" height="0.02" fill="white" stroke="none"/>
+ </g>
+
+ <g id="ball">
+ <circle r="0.0286" stroke-width="0.003"/>
+ </g>
+
+ <g id="table">
+ <!-- The frame. -->
+
+ <rect x="-1.61"
+ y="-0.9"
+ rx="0.09"
+ width="3.22"
+ height="1.8"
+ fill="rgb(40, 30, 17)"
+ stroke="rgb(110, 90, 60)" stroke-width="0.015"/>
+
+ <!-- The cloth. -->
+
+ <rect x="-1.46"
+ y="-0.75"
+ width="2.92"
+ height="1.5"
+ stroke="rgb(84, 139, 84)" stroke-width="0.008"
+ fill="rgb(107, 142, 35)" />
+
+ <!-- The cushions. -->
+
+ <use xlink:href="#side"/>
+ <use transform="scale(-1, 1)" xlink:href="#side"/>
+ <use transform="scale(-1, -1)" xlink:href="#side"/>
+ <use transform="scale(1, -1)" xlink:href="#side"/>
+ <use xlink:href="#top"/>
+ <use transform="scale(-1, 1)" xlink:href="#top"/>
+
+ <!-- The spots. -->
+
+ <circle cx="-0.71" cy="0"
+ r="0.01"
+ stroke="none"
+ fill="rgb(50, 70, 50)"/>
+
+ <circle cx="0.71" cy="0"
+ r="0.01"
+ stroke="none"
+ fill="rgb(50, 70, 50)"/>
+
+ <!-- The pockets. -->
+
+ <use transform="translate(0 -0.75)"
+ xlink:href="#pocket"/>
+
+ <use transform="translate(0 0.75)
+ rotate(180)" xlink:href="#pocket"/>
+
+ <use transform="translate(1.42
+ -0.71)
+ rotate(45)" xlink:href="#pocket"/>
+
+ <use transform="translate(1.42
+ 0.71)
+ rotate(135)" xlink:href="#pocket"/>
+
+ <use transform="translate(-1.42
+ -0.71)
+ rotate(-45)" xlink:href="#pocket"/>
+
+ <use transform="translate(-1.42
+ 0.71)
+ rotate(-135)" xlink:href="#pocket"/>
+
+ <use x="-1.065000" y="0.820000" xlink:href="#diamond"/>
+ <use x="-1.065000" y="-0.820000" xlink:href="#diamond"/>
+ <use x="-0.710000" y="0.820000" xlink:href="#diamond"/>
+ <use x="-0.710000" y="-0.820000" xlink:href="#diamond"/>
+ <use x="-0.355000" y="0.820000" xlink:href="#diamond"/>
+ <use x="-0.355000" y="-0.820000" xlink:href="#diamond"/>
+ <use x="0.355000" y="0.820000" xlink:href="#diamond"/>
+ <use x="0.355000" y="-0.820000" xlink:href="#diamond"/>
+ <use x="0.710000" y="0.820000" xlink:href="#diamond"/>
+ <use x="0.710000" y="-0.820000" xlink:href="#diamond"/>
+ <use x="1.065000" y="0.820000" xlink:href="#diamond"/>
+ <use x="1.065000" y="-0.820000" xlink:href="#diamond"/>
+ <use x="1.530000" y="-0.355000" xlink:href="#diamond"/>
+ <use x="-1.530000" y="-0.355000" xlink:href="#diamond"/>
+ <use x="1.530000" y="0.000000" xlink:href="#diamond"/>
+ <use x="-1.530000" y="0.000000" xlink:href="#diamond"/>
+ <use x="1.530000" y="0.355000" xlink:href="#diamond"/>
+ <use x="-1.530000" y="0.355000" xlink:href="#diamond"/>
+ <circle cx="0.058979" cy="-0.067725" r="0.01" stroke="none"
+ fill="rgb(255, 255, 255)"/> <circle cx="0.058979" cy="-0.067725" r="0.028600" fill="none"
+ stroke="rgb(255, 255, 255)" stroke-width="0.003"/>
+ <path fill="none" stroke="rgb(255, 255, 255)" stroke-width="0.005"
+ d="M 0.059 -0.068
+ L 0.059 -0.068
+ L 0.059 -0.068"/>
+
+ <circle cx="0.831806" cy="-0.142947" r="0.01" stroke="none"
+ fill="rgb(255, 124, 0)"/> <circle cx="0.831806" cy="-0.142947" r="0.028600" fill="none"
+ stroke="rgb(255, 124, 0)" stroke-width="0.003"/>
+ <path fill="none" stroke="rgb(255, 124, 0)" stroke-width="0.005"
+ d="M 0.832 -0.143
+ L 0.832 -0.143
+ L 0.832 -0.143"/>
+
+ <circle cx="-1.183625" cy="-0.190027" r="0.01" stroke="none"
+ fill="rgb(6, 22, 157)"/> <circle cx="-1.183625" cy="-0.190027" r="0.028600" fill="none"
+ stroke="rgb(6, 22, 157)" stroke-width="0.003"/>
+ <path fill="none" stroke="rgb(6, 22, 157)" stroke-width="0.005"
+ d="M -1.184 -0.190
+ L -1.184 -0.190
+ L -1.184 -0.190"/>
+
+ <circle cx="0.108950" cy="0.107066" r="0.01" stroke="none"
+ fill="rgb(255, 0, 0)"/> <circle cx="0.108950" cy="0.107066" r="0.028600" fill="none"
+ stroke="rgb(255, 0, 0)" stroke-width="0.003"/>
+ <path fill="none" stroke="rgb(255, 0, 0)" stroke-width="0.005"
+ d="M 0.109 0.107
+ L 0.109 0.107
+ L 0.109 0.107"/>
+
+ <circle cx="-0.527822" cy="-0.266026" r="0.01" stroke="none"
+ fill="rgb(0, 0, 34)"/> <circle cx="-0.527822" cy="-0.266026" r="0.028600" fill="none"
+ stroke="rgb(0, 0, 34)" stroke-width="0.003"/>
+ <path fill="none" stroke="rgb(0, 0, 34)" stroke-width="0.005"
+ d="M -0.528 -0.266
+ L -0.528 -0.266
+ L -0.528 -0.266"/>
+
+ <circle cx="0.201618" cy="0.140210" r="0.01" stroke="none"
+ fill="rgb(255, 48, 0)"/> <circle cx="0.201618" cy="0.140210" r="0.028600" fill="none"
+ stroke="rgb(255, 48, 0)" stroke-width="0.003"/>
+ <path fill="none" stroke="rgb(255, 48, 0)" stroke-width="0.005"
+ d="M 0.202 0.140
+ L 0.202 0.140
+ L 0.202 0.140"/>
+
+ <circle cx="-1.366404" cy="-0.445032" r="0.01" stroke="none"
+ fill="rgb(0, 61, 9)"/> <circle cx="-1.366404" cy="-0.445032" r="0.028600" fill="none"
+ stroke="rgb(0, 61, 9)" stroke-width="0.003"/>
+ <path fill="none" stroke="rgb(0, 61, 9)" stroke-width="0.005"
+ d="M -1.366 -0.445
+ L -1.366 -0.445
+ L -1.366 -0.445"/>
+
+ <circle cx="-0.472246" cy="0.681671" r="0.01" stroke="none"
+ fill="rgb(54, 0, 0)"/> <circle cx="-0.472246" cy="0.681671" r="0.028600" fill="none"
+ stroke="rgb(54, 0, 0)" stroke-width="0.003"/>
+ <path fill="none" stroke="rgb(54, 0, 0)" stroke-width="0.005"
+ d="M -0.472 0.682
+ L -0.472 0.682
+ L -0.472 0.682"/>
+
+ <circle cx="-1.211370" cy="-0.477456" r="0.01" stroke="none"
+ fill="rgb(0, 0, 0)"/> <circle cx="-1.211370" cy="-0.477456" r="0.028600" fill="none"
+ stroke="rgb(0, 0, 0)" stroke-width="0.003"/>
+ <path fill="none" stroke="rgb(0, 0, 0)" stroke-width="0.005"
+ d="M -1.211 -0.477
+ L -1.211 -0.477
+ L -1.211 -0.478"/>
+
+ <circle cx="-1.420060" cy="-0.675371" r="0.01" stroke="none"
+ fill="rgb(255, 124, 0)"/> <circle cx="-1.420060" cy="-0.675371" r="0.028600" fill="none"
+ stroke="rgb(255, 124, 0)" stroke-width="0.003"/>
+ <path fill="none" stroke="rgb(255, 124, 0)" stroke-width="0.005"
+ d="M -1.420 -0.675
+ L -1.420 -0.675
+ L -1.420 -0.676"/>
+
+ <circle cx="-1.130869" cy="-0.287088" r="0.01" stroke="none"
+ fill="rgb(6, 22, 157)"/> <circle cx="-1.130869" cy="-0.287088" r="0.028600" fill="none"
+ stroke="rgb(6, 22, 157)" stroke-width="0.003"/>
+ <path fill="none" stroke="rgb(6, 22, 157)" stroke-width="0.005"
+ d="M -1.131 -0.287
+ L -1.131 -0.287
+ L -1.131 -0.287"/>
+
+ <circle cx="1.442492" cy="0.400212" r="0.01" stroke="none"
+ fill="rgb(255, 0, 0)"/> <circle cx="1.442492" cy="0.400212" r="0.028600" fill="none"
+ stroke="rgb(255, 0, 0)" stroke-width="0.003"/>
+ <path fill="none" stroke="rgb(255, 0, 0)" stroke-width="0.005"
+ d="M 1.442 0.400
+ L 1.442 0.400
+ L 1.442 0.400"/>
+
+ <circle cx="0.874867" cy="0.588390" r="0.01" stroke="none"
+ fill="rgb(0, 0, 34)"/> <circle cx="0.874867" cy="0.588390" r="0.028600" fill="none"
+ stroke="rgb(0, 0, 34)" stroke-width="0.003"/>
+ <path fill="none" stroke="rgb(0, 0, 34)" stroke-width="0.005"
+ d="M 0.875 0.588
+ L 0.875 0.588
+ L 0.875 0.588"/>
+
+ <circle cx="1.273824" cy="0.159112" r="0.01" stroke="none"
+ fill="rgb(255, 48, 0)"/> <circle cx="1.273824" cy="0.159112" r="0.028600" fill="none"
+ stroke="rgb(255, 48, 0)" stroke-width="0.003"/>
+ <path fill="none" stroke="rgb(255, 48, 0)" stroke-width="0.005"
+ d="M 1.274 0.159
+ L 1.274 0.159
+ L 1.274 0.159"/>
+
+ <circle cx="0.341479" cy="-0.601032" r="0.01" stroke="none"
+ fill="rgb(0, 61, 9)"/> <circle cx="0.341479" cy="-0.601032" r="0.028600" fill="none"
+ stroke="rgb(0, 61, 9)" stroke-width="0.003"/>
+ <path fill="none" stroke="rgb(0, 61, 9)" stroke-width="0.005"
+ d="M 0.341 -0.601
+ L 0.341 -0.601
+ L 0.342 -0.601"/>
+
+ <circle cx="0.214091" cy="-0.519331" r="0.01" stroke="none"
+ fill="rgb(54, 0, 0)"/> <circle cx="0.214091" cy="-0.519331" r="0.028600" fill="none"
+ stroke="rgb(54, 0, 0)" stroke-width="0.003"/>
+ <path fill="none" stroke="rgb(54, 0, 0)" stroke-width="0.005"
+ d="M 0.214 -0.519
+ L 0.214 -0.519
+ L 0.214 -0.519"/>
+
+
+ <g transform="translate(0.058888, -0.067729)">
+ <use fill="rgb(255, 255, 255)" stroke="rgb(10, 10, 10)"
+ xlink:href="#ball"/> </g>
+ <g transform="translate(0.831894, -0.142925)">
+ <use fill="rgb(255, 124, 0)" stroke="rgb(10, 10, 10)"
+ xlink:href="#ball"/> </g>
+ <g transform="translate(-1.183534, -0.190030)">
+ <use fill="rgb(6, 22, 157)" stroke="rgb(10, 10, 10)"
+ xlink:href="#ball"/> </g>
+ <g transform="translate(0.109041, 0.107067)">
+ <use fill="rgb(255, 0, 0)" stroke="rgb(10, 10, 10)"
+ xlink:href="#ball"/> </g>
+ <g transform="translate(-0.527764, -0.266095)">
+ <use fill="rgb(0, 0, 34)" stroke="rgb(10, 10, 10)"
+ xlink:href="#ball"/> </g>
+ <g transform="translate(0.201682, 0.140275)">
+ <use fill="rgb(255, 48, 0)" stroke="rgb(10, 10, 10)"
+ xlink:href="#ball"/> </g>
+ <g transform="translate(-1.366393, -0.445122)">
+ <use fill="rgb(0, 61, 9)" stroke="rgb(10, 10, 10)"
+ xlink:href="#ball"/> </g>
+ <g transform="translate(-0.472162, 0.681705)">
+ <use fill="rgb(54, 0, 0)" stroke="rgb(10, 10, 10)"
+ xlink:href="#ball"/> </g>
+ <g transform="translate(-1.211327, -0.477535)">
+ <use fill="rgb(0, 0, 0)" stroke="rgb(10, 10, 10)"
+ xlink:href="#ball"/>
+ <use transform="rotate(30)"
+ fill="url(#stripe)" xlink:href="#ball"/> </g>
+ <g transform="translate(-1.420173, -0.675545)">
+ <use fill="rgb(255, 124, 0)" stroke="rgb(10, 10, 10)"
+ xlink:href="#ball"/>
+ <use transform="rotate(86)"
+ fill="url(#stripe)" xlink:href="#ball"/> </g>
+ <g transform="translate(-1.130782, -0.287114)">
+ <use fill="rgb(6, 22, 157)" stroke="rgb(10, 10, 10)"
+ xlink:href="#ball"/>
+ <use transform="rotate(137)"
+ fill="url(#stripe)" xlink:href="#ball"/> </g>
+ <g transform="translate(1.442492, 0.400212)"> </g>
+ <g transform="translate(0.874932, 0.588453)">
+ <use fill="rgb(0, 0, 34)" stroke="rgb(10, 10, 10)"
+ xlink:href="#ball"/>
+ <use transform="rotate(140)"
+ fill="url(#stripe)" xlink:href="#ball"/> </g>
+ <g transform="translate(1.273907, 0.159075)">
+ <use fill="rgb(255, 48, 0)" stroke="rgb(10, 10, 10)"
+ xlink:href="#ball"/>
+ <use transform="rotate(1)"
+ fill="url(#stripe)" xlink:href="#ball"/> </g>
+ <g transform="translate(0.341568, -0.601015)">
+ <use fill="rgb(0, 61, 9)" stroke="rgb(10, 10, 10)"
+ xlink:href="#ball"/>
+ <use transform="rotate(104)"
+ fill="url(#stripe)" xlink:href="#ball"/> </g>
+ <g transform="translate(0.214180, -0.519311)">
+ <use fill="rgb(54, 0, 0)" stroke="rgb(10, 10, 10)"
+ xlink:href="#ball"/>
+ <use transform="rotate(133)"
+ fill="url(#stripe)" xlink:href="#ball"/> </g>
+ </g>
+ </defs>
+
+ <g transform="scale (300, 300) translate (1.62, 0.91)">
+ <use xlink:href="#table"/>
+ </g>
+
+</svg>
diff --git a/rsvg/tests/fixtures/dimensions/bug760112-wilber.svg b/rsvg/tests/fixtures/dimensions/bug760112-wilber.svg
new file mode 100644
index 00000000..f2271ebd
--- /dev/null
+++ b/rsvg/tests/fixtures/dimensions/bug760112-wilber.svg
@@ -0,0 +1,12205 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ width="16"
+ height="16"
+ id="svg7384"
+ inkscape:version="0.48.4 r9939"
+ sodipodi:docname="art-libre.svg">
+ <metadata
+ id="metadata90">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview
+ pagecolor="#433342"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="1"
+ inkscape:pageshadow="2"
+ inkscape:window-width="2560"
+ inkscape:window-height="1381"
+ id="namedview88"
+ showgrid="false"
+ inkscape:zoom="4"
+ inkscape:cx="-207.27067"
+ inkscape:cy="-37.067045"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="layer9"
+ showborder="false"
+ inkscape:snap-nodes="true"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ showguides="true"
+ inkscape:guide-bbox="true"
+ inkscape:snap-to-guides="true"
+ inkscape:snap-grids="true"
+ inkscape:snap-global="true"
+ inkscape:object-nodes="false"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:object-paths="false"
+ inkscape:snap-others="false"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-page="false">
+ <inkscape:grid
+ type="xygrid"
+ id="grid4866"
+ empspacing="2"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true"
+ spacingx="1px"
+ spacingy="1px" />
+ </sodipodi:namedview>
+ <title
+ id="title9167">Gnome Symbolic Icon Theme</title>
+ <defs
+ id="defs7386">
+ <inkscape:path-effect
+ is_visible="true"
+ id="path-effect35098"
+ effect="spiro" />
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 8 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="16 : 8 : 1"
+ inkscape:persp3d-origin="8 : 5.3333333 : 1"
+ id="perspective82066" />
+ <inkscape:path-effect
+ is_visible="true"
+ id="path-effect63369"
+ effect="spiro" />
+ <inkscape:path-effect
+ is_visible="true"
+ id="path-effect63366"
+ effect="spiro" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5408">
+ <stop
+ style="stop-color:#bebebe;stop-opacity:1;"
+ offset="0"
+ id="stop5410" />
+ <stop
+ style="stop-color:#bebebe;stop-opacity:0;"
+ offset="1"
+ id="stop5412" />
+ </linearGradient>
+ <inkscape:path-effect
+ effect="spiro"
+ id="path-effect4601"
+ is_visible="true" />
+ <inkscape:path-effect
+ effect="spiro"
+ id="path-effect4597"
+ is_visible="true" />
+ <inkscape:path-effect
+ effect="spiro"
+ id="path-effect4593"
+ is_visible="true" />
+ <inkscape:path-effect
+ effect="spiro"
+ id="path-effect4589"
+ is_visible="true" />
+ <inkscape:path-effect
+ effect="spiro"
+ id="path-effect4585"
+ is_visible="true" />
+ <inkscape:path-effect
+ effect="spiro"
+ id="path-effect4580"
+ is_visible="true" />
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath6279-6-1-4-5">
+ <rect
+ style="color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible"
+ id="rect6281-3-0-3-5"
+ width="3.8250003"
+ height="6.3750005"
+ x="26.85"
+ y="220.75" />
+ </clipPath>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath6265-33-6-5-1-3">
+ <rect
+ style="color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible"
+ id="rect6267-6-9-1-4-8"
+ width="2.8977277"
+ height="5.21591"
+ x="26.96591"
+ y="221.32954" />
+ </clipPath>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath6259-6-8-2-1-6-6">
+ <rect
+ style="color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible"
+ id="rect6261-4-9-2-0-9-0"
+ width="1.8762827"
+ height="4.8734746"
+ x="26.998718"
+ y="221.50153" />
+ </clipPath>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath6279-2-3">
+ <rect
+ style="color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible"
+ id="rect6281-5-3"
+ width="3.8250003"
+ height="6.3750005"
+ x="26.85"
+ y="220.75" />
+ </clipPath>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath6265-3-5-6">
+ <rect
+ style="color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible"
+ id="rect6267-1-8-1"
+ width="2.8977277"
+ height="5.21591"
+ x="26.96591"
+ y="221.32954" />
+ </clipPath>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath6259-8-8-8">
+ <rect
+ style="color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible"
+ id="rect6261-6-0-7"
+ width="1.8762827"
+ height="4.8734746"
+ x="26.998718"
+ y="221.50153" />
+ </clipPath>
+ <clipPath
+ id="clipPath3157-7-0"
+ clipPathUnits="userSpaceOnUse">
+ <rect
+ y="221.32954"
+ x="28.124998"
+ height="5.21591"
+ width="1.7386366"
+ id="rect3159-5-5"
+ style="color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible" />
+ </clipPath>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath6279-6-1">
+ <rect
+ style="color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible"
+ id="rect6281-3-1"
+ width="3.8250003"
+ height="6.3750005"
+ x="26.85"
+ y="220.75" />
+ </clipPath>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath6265-33-6-4-0">
+ <rect
+ style="color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible"
+ id="rect6267-6-9-19-3"
+ width="2.8977277"
+ height="5.21591"
+ x="26.96591"
+ y="221.32954" />
+ </clipPath>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath6259-6-8-2-8-0">
+ <rect
+ style="color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible"
+ id="rect6261-4-9-2-7-0"
+ width="1.8762827"
+ height="4.8734746"
+ x="26.998718"
+ y="221.50153" />
+ </clipPath>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath6265-33-4">
+ <rect
+ style="color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible"
+ id="rect6267-6-5"
+ width="2.8977277"
+ height="5.21591"
+ x="26.96591"
+ y="221.32954" />
+ </clipPath>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath6259-6-8-25-4">
+ <rect
+ style="color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible"
+ id="rect6261-4-9-24-2"
+ width="1.8762827"
+ height="4.8734746"
+ x="26.998718"
+ y="221.50153" />
+ </clipPath>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath6259-6-4">
+ <rect
+ style="color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible"
+ id="rect6261-4-9"
+ width="1.8762827"
+ height="4.8734746"
+ x="26.998718"
+ y="221.50153" />
+ </clipPath>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath6279-7-9">
+ <rect
+ style="color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible"
+ id="rect6281-1-9"
+ width="3.8250003"
+ height="6.3750005"
+ x="26.85"
+ y="220.75" />
+ </clipPath>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath6265-3-4">
+ <rect
+ style="color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible"
+ id="rect6267-1-9"
+ width="2.8977277"
+ height="5.21591"
+ x="26.96591"
+ y="221.32954" />
+ </clipPath>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath6259-8-81">
+ <rect
+ style="color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible"
+ id="rect6261-6-6"
+ width="1.8762827"
+ height="4.8734746"
+ x="26.998718"
+ y="221.50153" />
+ </clipPath>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath6279-3">
+ <rect
+ style="color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible"
+ id="rect6281-9"
+ width="3.8250003"
+ height="6.3750005"
+ x="26.85"
+ y="220.75" />
+ </clipPath>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath6265-334">
+ <rect
+ style="color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible"
+ id="rect6267-61"
+ width="2.8977277"
+ height="5.21591"
+ x="26.96591"
+ y="221.32954" />
+ </clipPath>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath6259-5">
+ <rect
+ style="color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible"
+ id="rect6261-61"
+ width="1.8762827"
+ height="4.8734746"
+ x="26.998718"
+ y="221.50153" />
+ </clipPath>
+ <clipPath
+ id="clipPath6810-7"
+ clipPathUnits="userSpaceOnUse">
+ <rect
+ y="281"
+ x="21"
+ height="11"
+ width="14"
+ id="rect6812-2"
+ style="color:#bebebe;fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" />
+ </clipPath>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath3668">
+ <rect
+ y="221.50153"
+ x="26.998718"
+ height="3.3729413"
+ width="1.8762826"
+ id="rect3670"
+ style="color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible" />
+ </clipPath>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath3697">
+ <path
+ style="color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible"
+ d="m 26.965789,221.32959 0,5.21591 0.579546,0 0,-1.15909 2.318182,0 0,-4.05682 -2.897728,0 z"
+ id="path3699" />
+ </clipPath>
+ <clipPath
+ id="clipPath6810-7-87"
+ clipPathUnits="userSpaceOnUse">
+ <rect
+ y="281"
+ x="21"
+ height="11"
+ width="14"
+ id="rect6812-2-4"
+ style="color:#bebebe;fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" />
+ </clipPath>
+ <inkscape:path-effect
+ effect="spiro"
+ id="path-effect44198-7"
+ is_visible="true" />
+ <inkscape:path-effect
+ effect="spiro"
+ id="path-effect44202-9"
+ is_visible="true" />
+ <inkscape:path-effect
+ effect="spiro"
+ id="path-effect8915-0-8-2-7-4-4-8"
+ is_visible="true" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5408"
+ id="radialGradient5414"
+ cx="-196.78575"
+ cy="-28.512899"
+ fx="-196.78575"
+ fy="-28.512899"
+ r="1.607125"
+ gradientTransform="matrix(2.9445462,0,0,2.8235465,602.73629,270.04529)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5408-4"
+ id="radialGradient5414-2"
+ cx="-196.78575"
+ cy="-28.512899"
+ fx="-196.78575"
+ fy="-28.512899"
+ r="1.607125"
+ gradientTransform="matrix(2.9445462,0,0,2.8235465,602.73629,270.04529)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5408-4">
+ <stop
+ style="stop-color:#bebebe;stop-opacity:1;"
+ offset="0"
+ id="stop5410-7" />
+ <stop
+ style="stop-color:#bebebe;stop-opacity:0;"
+ offset="1"
+ id="stop5412-9" />
+ </linearGradient>
+ <inkscape:path-effect
+ effect="spiro"
+ id="path-effect4601-8"
+ is_visible="true" />
+ <inkscape:path-effect
+ effect="spiro"
+ id="path-effect4597-5"
+ is_visible="true" />
+ <filter
+ id="filter6015"
+ inkscape:menu-tooltip="Transparent plastic with deep colors"
+ inkscape:menu="Bevels"
+ inkscape:label="Deep colors plastic"
+ color-interpolation-filters="sRGB">
+ <feGaussianBlur
+ id="feGaussianBlur6017"
+ in="SourceGraphic"
+ result="result6"
+ stdDeviation="10" />
+ <feComposite
+ id="feComposite6019"
+ in2="SourceGraphic"
+ in="result6"
+ operator="xor" />
+ <feGaussianBlur
+ id="feGaussianBlur6021"
+ result="result2"
+ stdDeviation="10" />
+ <feComposite
+ id="feComposite6023"
+ in2="SourceGraphic"
+ operator="atop"
+ result="result91" />
+ <feComposite
+ id="feComposite6025"
+ in2="result91"
+ result="result4"
+ in="result2"
+ operator="xor" />
+ <feGaussianBlur
+ id="feGaussianBlur6027"
+ in="result4"
+ result="result3"
+ stdDeviation="5" />
+ <feSpecularLighting
+ id="feSpecularLighting6029"
+ lighting-color="#ffffff"
+ in="result3"
+ result="result5"
+ specularExponent="35"
+ specularConstant="3"
+ surfaceScale="12">
+ <feDistantLight
+ id="feDistantLight6031"
+ elevation="45"
+ azimuth="235" />
+ </feSpecularLighting>
+ <feComposite
+ id="feComposite6033"
+ in2="result5"
+ in="SourceGraphic"
+ k3="0.7"
+ k2="0.8"
+ operator="arithmetic"
+ result="result7"
+ k1="0"
+ k4="0" />
+ <feComposite
+ id="feComposite6035"
+ in2="SourceGraphic"
+ in="result7"
+ operator="in" />
+ </filter>
+ <linearGradient
+ x1="22.452934"
+ y1="170.37819"
+ x2="23.615282"
+ y2="164.95464"
+ id="linearGradient3210"
+ xlink:href="#linearGradient5734"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(268.69307,348.30684)" />
+ <linearGradient
+ id="linearGradient5734">
+ <stop
+ id="stop5736"
+ style="stop-color:#8ab3df;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop5738"
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="19.57576"
+ y1="167.06665"
+ x2="21.9317"
+ y2="169.57916"
+ id="linearGradient3212"
+ xlink:href="#linearGradient5704-54"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(267.82967,349.0664)" />
+ <linearGradient
+ id="linearGradient5704-54">
+ <stop
+ id="stop5706-3"
+ style="stop-color:#5a5a5a;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop5708-12"
+ style="stop-color:#000000;stop-opacity:1"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="15"
+ y1="177.44151"
+ x2="13.848969"
+ y2="175.94685"
+ id="linearGradient3204"
+ xlink:href="#linearGradient5734"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,0.973548,268.32967,354.06823)" />
+ <linearGradient
+ id="linearGradient33956">
+ <stop
+ id="stop33958"
+ style="stop-color:#8ab3df;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop33960"
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="14.019764"
+ y1="174.94193"
+ x2="15.847412"
+ y2="178.02231"
+ id="linearGradient3206"
+ xlink:href="#linearGradient5704-54"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,0.973548,268.32967,354.06823)" />
+ <linearGradient
+ id="linearGradient33963">
+ <stop
+ id="stop33965"
+ style="stop-color:#5a5a5a;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop33967"
+ style="stop-color:#000000;stop-opacity:1"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="-13.059585"
+ y1="332.07693"
+ x2="-10.528212"
+ y2="335.03082"
+ id="linearGradient3199"
+ xlink:href="#linearGradient4343"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(308.69307,174.54724)" />
+ <linearGradient
+ id="linearGradient4343">
+ <stop
+ id="stop4345"
+ style="stop-color:#fff9f9;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop4347"
+ style="stop-color:#fff9f9;stop-opacity:0"
+ offset="1" />
+ </linearGradient>
+ <inkscape:path-effect
+ effect="spiro"
+ id="path-effect3947-0"
+ is_visible="true" />
+ <inkscape:path-effect
+ is_visible="true"
+ id="path-effect3951-9"
+ effect="spiro" />
+ <inkscape:path-effect
+ is_visible="true"
+ id="path-effect3957-2"
+ effect="spiro" />
+ <inkscape:path-effect
+ effect="spiro"
+ id="path-effect3959-1"
+ is_visible="true" />
+ <linearGradient
+ id="linearGradient3116">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0.79607844"
+ offset="0"
+ id="stop3118" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0.21568628"
+ offset="1"
+ id="stop3120" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3204-1"
+ id="radialGradient3210"
+ cx="11"
+ cy="22"
+ fx="11"
+ fy="22"
+ r="8"
+ gradientTransform="matrix(1,0,0,0.25,0,16.5)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3204-1">
+ <stop
+ style="stop-color:#000000;stop-opacity:1"
+ offset="0"
+ id="stop3206" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0"
+ offset="1"
+ id="stop3208" />
+ </linearGradient>
+ <filter
+ inkscape:collect="always"
+ id="filter12578">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="0.014999999"
+ id="feGaussianBlur12580" />
+ </filter>
+ <filter
+ inkscape:collect="always"
+ id="filter12586">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="0.02"
+ id="feGaussianBlur12588" />
+ </filter>
+ <linearGradient
+ id="linearGradient3845">
+ <stop
+ style="stop-color:#f0f1ee;stop-opacity:1;"
+ offset="0"
+ id="stop3847" />
+ <stop
+ style="stop-color:#d3d7cf;stop-opacity:1;"
+ offset="1"
+ id="stop3849" />
+ </linearGradient>
+ <radialGradient
+ gradientTransform="matrix(0.348468,0,0,0.348468,15.64542,17.02404)"
+ id="aigrd2"
+ cx="25.0527"
+ cy="39.5928"
+ r="15.7572"
+ fx="25.0527"
+ fy="39.5928"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ offset="0.0000000"
+ style="stop-color:#777777;stop-opacity:1.0000000;"
+ id="stop8602" />
+ <stop
+ offset="1"
+ style="stop-color:#000000"
+ id="stop8604" />
+ </radialGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5148"
+ id="linearGradient5154"
+ x1="83.031731"
+ y1="40.924026"
+ x2="66.311295"
+ y2="22.765684"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.318803,0,0,0.370189,-12.922,-1.498959)" />
+ <linearGradient
+ id="linearGradient5148">
+ <stop
+ style="stop-color:#d0d0d0;stop-opacity:1"
+ offset="0"
+ id="stop5150" />
+ <stop
+ style="stop-color:#ececec;stop-opacity:1"
+ offset="1"
+ id="stop5152" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient5260">
+ <stop
+ id="stop5264"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ id="stop5262"
+ offset="1"
+ style="stop-color:#c9c9c3;stop-opacity:1;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient8940">
+ <stop
+ id="stop8942"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ id="stop8944"
+ offset="1"
+ style="stop-color:#c9c9c3;stop-opacity:1;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient5238">
+ <stop
+ style="stop-color:#888a85;stop-opacity:1;"
+ offset="0"
+ id="stop5240" />
+ <stop
+ style="stop-color:#70726d;stop-opacity:1;"
+ offset="1"
+ id="stop5242" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient8951">
+ <stop
+ style="stop-color:#888a85;stop-opacity:1;"
+ offset="0"
+ id="stop8953" />
+ <stop
+ style="stop-color:#70726d;stop-opacity:1;"
+ offset="1"
+ id="stop8955" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient5274">
+ <stop
+ style="stop-color:#555753;stop-opacity:1;"
+ offset="0"
+ id="stop5276" />
+ <stop
+ style="stop-color:#cacbc9;stop-opacity:1;"
+ offset="1"
+ id="stop5278" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient6500">
+ <stop
+ style="stop-color:#857c63;stop-opacity:1"
+ offset="0"
+ id="stop6502" />
+ <stop
+ style="stop-color:#221f19;stop-opacity:1"
+ offset="1"
+ id="stop6504" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient8524">
+ <stop
+ style="stop-color:white;stop-opacity:1"
+ offset="0"
+ id="stop8526" />
+ <stop
+ style="stop-color:white;stop-opacity:0"
+ offset="1"
+ id="stop8528" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient6468">
+ <stop
+ style="stop-color:white;stop-opacity:1"
+ offset="0"
+ id="stop6470" />
+ <stop
+ style="stop-color:#b9b9b0;stop-opacity:1"
+ offset="1"
+ id="stop6472" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient8542">
+ <stop
+ style="stop-color:#5b676b;stop-opacity:1"
+ offset="0"
+ id="stop8544" />
+ <stop
+ style="stop-color:#141718;stop-opacity:1"
+ offset="1"
+ id="stop8546" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient6452">
+ <stop
+ style="stop-color:white;stop-opacity:1"
+ offset="0"
+ id="stop6454" />
+ <stop
+ style="stop-color:white;stop-opacity:0"
+ offset="1"
+ id="stop6456" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient8984">
+ <stop
+ style="stop-color:white;stop-opacity:1"
+ offset="0"
+ id="stop8986" />
+ <stop
+ style="stop-color:#b9b9b0;stop-opacity:1"
+ offset="1"
+ id="stop8988" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6492"
+ id="radialGradient4778"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,0.434932,-1.6364745,1.8623189)"
+ cx="23"
+ cy="33.9375"
+ fx="23"
+ fy="33.9375"
+ r="18.25" />
+ <linearGradient
+ id="linearGradient6492">
+ <stop
+ style="stop-color:black;stop-opacity:1"
+ offset="0"
+ id="stop6494" />
+ <stop
+ style="stop-color:black;stop-opacity:0"
+ offset="1"
+ id="stop6496" />
+ </linearGradient>
+ <filter
+ color-interpolation-filters="sRGB"
+ inkscape:collect="always"
+ id="filter12578-8">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="0.014999999"
+ id="feGaussianBlur12580-4" />
+ </filter>
+ <filter
+ color-interpolation-filters="sRGB"
+ inkscape:collect="always"
+ id="filter12586-1">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="0.02"
+ id="feGaussianBlur12588-8" />
+ </filter>
+ </defs>
+ <g
+ transform="translate(-261,-489)"
+ id="layer3"
+ style="display:inline" />
+ <g
+ transform="translate(-261,-489)"
+ id="layer2"
+ style="display:inline">
+ <g
+ transform="translate(99.9998,334)"
+ id="g11578"
+ style="display:inline">
+ <g
+ transform="translate(-93.968752,-337)"
+ id="g11582"
+ style="display:inline" />
+ </g>
+ </g>
+ <g
+ transform="translate(-241.0002,-460)"
+ id="layer4"
+ style="display:inline">
+ <g
+ transform="translate(-20.99975,-28)"
+ id="layer3-5"
+ style="display:inline" />
+ <g
+ transform="translate(-20.99975,-28)"
+ id="layer2-1"
+ style="display:inline" />
+ <g
+ transform="translate(-1,1)"
+ id="layer4-4"
+ style="display:inline" />
+ <g
+ transform="translate(-1,244)"
+ id="layer5-9" />
+ <g
+ transform="translate(-20.99975,-28)"
+ id="layer1-8"
+ style="display:inline" />
+ </g>
+ <g
+ id="layer8"
+ transform="translate(-241.0002,-217)" />
+ <g
+ id="layer7"
+ transform="translate(-241.0002,-217)" />
+ <g
+ id="layer5"
+ transform="translate(-241.0002,-217)">
+ <g
+ transform="translate(14,0)"
+ id="g11716" />
+ </g>
+ <g
+ id="layer6"
+ transform="translate(-241.0002,-217)" />
+ <g
+ inkscape:groupmode="layer"
+ id="layer9"
+ inkscape:label="tools"
+ style="display:inline"
+ transform="translate(-241.0002,-217)">
+ <g
+ style="display:inline"
+ id="g3922"
+ transform="translate(21.0002,-0.999999)"
+ inkscape:label="stock-tool-airbrush">
+ <rect
+ style="color:#bebebe;fill:none;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible"
+ id="rect2941"
+ width="16"
+ height="16"
+ x="-194"
+ y="20"
+ inkscape:label="audio-volume-high"
+ transform="matrix(0,-1,1,0,0,0)" />
+ <path
+ style="fill:#bebebe;fill-opacity:1;stroke:none;display:inline"
+ d="m 35.218802,179.49071 c 0,0 -4.254629,1.9177 -6.106401,3.30652 l -2.453226,1.83992 -1.140149,1.82565 C 25.083521,186.61377 25,187.39326 25,187.61777 c 0,0.28359 0.234102,0.51848 0.518472,0.51848 0.225133,0 0.961416,-0.0445 1.087372,-0.4059 l 1.768251,0.16972 0.474377,-0.34414 0.431021,0.51707 1.159563,-0.8993 -0.422147,-0.50839 L 31,186 c 1.934572,-1.30922 4.785442,-5.84932 4.785442,-5.84932 0.326599,-0.37991 -0.09485,-0.90453 -0.56664,-0.65997 z"
+ id="path2948"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="csccssccccccscc" />
+ <path
+ style="fill:none;stroke:#bebebe;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline"
+ d="m 30.41603,188.45062 c 0.217838,0.28037 0.394166,0.59294 0.52147,0.92438 0.08784,0.2287 0.153015,0.46746 0.26944,0.68302 0.05821,0.10778 0.129353,0.2094 0.217898,0.29405 0.08854,0.0847 0.195074,0.152 0.312642,0.18639 0.110527,0.0323 0.229017,0.0349 0.341905,0.0121 0.112889,-0.0228 0.220188,-0.0704 0.315593,-0.13494 0.19081,-0.12899 0.331165,-0.32212 0.431194,-0.52958 0.200059,-0.41493 0.250055,-0.88971 0.450818,-1.3043 0.158369,-0.32704 0.409784,-0.60839 0.717026,-0.80239 0.307242,-0.19401 0.669344,-0.30006 1.032704,-0.30246"
+ id="path4595"
+ inkscape:path-effect="#path-effect4597-5"
+ inkscape:original-d="m 30.41603,188.45062 c 0,0 0.76685,0.66989 0.52147,0.92438 -0.0816,0.0846 0.20662,1.11559 0.79998,1.16346 1.18672,0.0958 0.30741,-1.95668 1.53951,-1.95668 1.2321,0 1.74973,-1.10485 1.74973,-1.10485"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cscsc" />
+ <rect
+ style="opacity:0.5;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new"
+ id="rect3269"
+ width="1"
+ height="1"
+ x="24"
+ y="188" />
+ <rect
+ y="189"
+ x="23"
+ height="1"
+ width="1"
+ id="rect3271"
+ style="opacity:0.4;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new" />
+ <rect
+ style="opacity:0.3;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new"
+ id="rect3273"
+ width="1"
+ height="1"
+ x="24"
+ y="190" />
+ <rect
+ y="191"
+ x="23"
+ height="1"
+ width="1"
+ id="rect3275"
+ style="opacity:0.1;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new" />
+ <rect
+ style="opacity:0.28395063;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new"
+ id="rect3277"
+ width="1"
+ height="1"
+ x="22"
+ y="190" />
+ <rect
+ style="opacity:0.23868312;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new"
+ id="rect4084"
+ width="1"
+ height="1"
+ x="21"
+ y="191" />
+ <rect
+ y="190"
+ x="20"
+ height="1"
+ width="1"
+ id="rect4086"
+ style="opacity:0.05;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new" />
+ <rect
+ style="opacity:0.05;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new"
+ id="rect4088"
+ width="1"
+ height="1"
+ x="21"
+ y="189" />
+ <rect
+ y="192"
+ x="22"
+ height="1"
+ width="1"
+ id="rect4090"
+ style="opacity:0.05;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new" />
+ <rect
+ style="opacity:0.05;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new"
+ id="rect4092"
+ width="1"
+ height="1"
+ x="20"
+ y="192" />
+ <rect
+ y="193"
+ x="21"
+ height="1"
+ width="1"
+ id="rect4094"
+ style="opacity:0.05;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new" />
+ <rect
+ style="opacity:0.05;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new"
+ id="rect4096"
+ width="1"
+ height="1"
+ x="23"
+ y="193" />
+ </g>
+ <text
+ sodipodi:linespacing="125%"
+ id="text6726"
+ y="165.94501"
+ x="41.823399"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;display:inline;font-family:Droid Sans"
+ xml:space="preserve"><tspan
+ y="165.94501"
+ x="41.823399"
+ id="tspan6728"
+ sodipodi:role="line">tools</tspan></text>
+ <g
+ id="g63382"
+ inkscape:label="stock-tool-paintbrush">
+ <g
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ transform="matrix(0.8746234,0,0,0.89178327,86.926967,167.56161)"
+ id="g9272">
+ <path
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ sodipodi:nodetypes="cssac"
+ id="path9274"
+ d="m -28.5,27.5711 c 3.111145,0.0011 2.79359,-3.323359 4.304166,-4.248979 1.750479,-1.072622 3.284496,0.256475 3.590759,1.350292 0.386445,1.380184 -0.337829,2.508685 -1.300323,3.118949 -1.846361,1.170674 -6.300039,0.898712 -6.594602,-0.220262 z"
+ inkscape:connector-curvature="0" />
+ </g>
+ <path
+ inkscape:connector-curvature="0"
+ id="path9264"
+ d="m 76.416523,178.35668 c 0.308363,-0.6658 -0.16372,-0.92113 -0.732422,-0.35668 -3.998739,3.96884 -4.683901,4 -8.423828,9.14967 1.00355,0.0377 1.86506,0.68644 2.3125,1.62279 4.427427,-4.77246 4.92644,-7.33336 6.84375,-10.41578 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ sodipodi:nodetypes="csccc" />
+ <rect
+ rx="1"
+ ry="0"
+ y="177.02174"
+ x="61.000198"
+ height="15.97829"
+ width="16.000002"
+ id="rect63349"
+ style="fill:none;stroke:none" />
+ </g>
+ <g
+ id="g69011"
+ inkscape:label="stock-tool-pencil">
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path69005"
+ transform="translate(241.0002,217)"
+ d="m -146.84375,-39 -1.875,2 c 1.32873,0.02586 2.66512,1.211567 2.71875,2.4375 l 2,-2 c -0.0554,-1.26532 -1.47439,-2.4884 -2.84375,-2.4375 z"
+ style="fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+ <rect
+ ry="0"
+ rx="0"
+ y="177"
+ x="81.000198"
+ height="16"
+ width="15.999998"
+ id="rect63426"
+ style="fill:none;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccc"
+ id="path2273-6-2"
+ d="m 83.63056,189.03603 7.520215,-8.03448 c 1.369356,-0.0509 2.794069,1.16344 2.849425,2.42876 l -7.490043,7.79401 -4.509957,1.77567 z"
+ style="fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+ </g>
+ <g
+ id="g74768"
+ inkscape:label="stock-tool-move"
+ transform="translate(-60,0)">
+ <rect
+ style="fill:none;stroke:none"
+ id="rect74714"
+ width="16"
+ height="15.981771"
+ x="101.0002"
+ y="197.01823" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path74740"
+ d="m 109.0221,197 -3.0219,3.0148 6,1e-5 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ d="M -192.96875 -17.96875 L -192.96875 -9 L -192.96875 -6.03125 L -191 -6.03125 L -191 -9 L -191 -17.96875 L -192.96875 -17.96875 z "
+ transform="translate(301.0002,217)"
+ id="rect74742" />
+ <path
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ d="m 109.0221,213 -3.0219,-2.99657 6,-1e-5 z"
+ id="path74756"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path74760"
+ d="m 101.0002,204.98724 2.99999,3.01846 1e-5,-5.99317 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ d="m -197.96875,-13 0,2 c 3.98964,0.0066 7.97922,0.03219 11.96875,0 l 0,-2 c -3.9883,0.103056 -7.97827,0.01399 -11.96875,0 z"
+ transform="translate(301.0002,217)"
+ id="rect74762"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ d="m 117.0002,204.98724 -2.99999,3.01846 -10e-6,-5.99317 z"
+ id="path74764"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc" />
+ </g>
+ <g
+ id="g74833"
+ inkscape:label="stock-tool-zoom">
+ <rect
+ y="197"
+ x="61.000198"
+ height="16"
+ width="16.000002"
+ id="rect74797"
+ style="fill:none;fill-opacity:1;stroke:none" />
+ <path
+ transform="matrix(1.2871768,0,0,1.2857143,-328.29926,-293.42857)"
+ d="m 311,386.5 c 0,1.933 -1.567,3.5 -3.5,3.5 -1.933,0 -3.5,-1.567 -3.5,-3.5 0,-1.933 1.567,-3.5 3.5,-3.5 1.933,0 3.5,1.567 3.5,3.5 z"
+ sodipodi:ry="3.5"
+ sodipodi:rx="3.5"
+ sodipodi:cy="386.5"
+ sodipodi:cx="307.5"
+ style="color:#000000;fill:none;stroke:#bebebe;stroke-width:1.55467153;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new"
+ sodipodi:type="arc"
+ id="path74836" />
+ <path
+ sodipodi:nodetypes="cc"
+ d="m 71.01159,207.00001 4.00455,4"
+ style="color:#000000;fill:none;stroke:#bebebe;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new"
+ inkscape:connector-curvature="0"
+ id="path74838" />
+ </g>
+ <g
+ id="g74847"
+ inkscape:label="stock-tool-text">
+ <rect
+ y="197"
+ x="81.000198"
+ height="16"
+ width="16.000002"
+ id="rect74840"
+ style="fill:none;stroke:none" />
+ <path
+ sodipodi:nodetypes="ccccccccccccc"
+ inkscape:connector-curvature="0"
+ id="path74842"
+ transform="translate(241.0002,217)"
+ d="m -154,-19 -5,14 3,0 c 1.48614,-4 0.0221,0 1.50824,-4 l 4.98353,0 1.50823,4 3,0 -5,-14 z m 2,3 2.0221,5 -4,0 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ id="g74903"
+ inkscape:label="stock-tool-rect-select">
+ <rect
+ y="217"
+ x="41.000198"
+ height="16"
+ width="16"
+ id="rect74851"
+ style="fill:none;stroke:none" />
+ <rect
+ y="220"
+ x="41.000198"
+ height="1"
+ width="1"
+ id="rect74853"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="220"
+ x="53.000198"
+ height="1"
+ width="1"
+ id="rect74855"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="220"
+ x="55.000198"
+ height="1"
+ width="1"
+ id="rect74857"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="222"
+ x="41.000198"
+ height="1"
+ width="1"
+ id="rect74859"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="220"
+ x="51.000198"
+ height="1"
+ width="1"
+ id="rect74861"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="220"
+ x="43.000198"
+ height="1"
+ width="1"
+ id="rect74863"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="220"
+ x="45.000198"
+ height="1"
+ width="1"
+ id="rect74865"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="220"
+ x="47.000198"
+ height="1"
+ width="1"
+ id="rect74867"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="220"
+ x="49.000198"
+ height="1"
+ width="1"
+ id="rect74869"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="224"
+ x="41.000198"
+ height="1"
+ width="1"
+ id="rect74871"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="226"
+ x="41.000198"
+ height="1"
+ width="1"
+ id="rect74873"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="230"
+ x="43.000198"
+ height="1"
+ width="1"
+ id="rect74875"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="230"
+ x="45.000198"
+ height="1"
+ width="1"
+ id="rect74877"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="230"
+ x="47.000198"
+ height="1"
+ width="1"
+ id="rect74879"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="230"
+ x="49.000198"
+ height="1"
+ width="1"
+ id="rect74881"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="230"
+ x="51.000198"
+ height="1"
+ width="1"
+ id="rect74883"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="230"
+ x="53.000198"
+ height="1"
+ width="1"
+ id="rect74885"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="230"
+ x="55.000198"
+ height="1"
+ width="1"
+ id="rect74887"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="228"
+ x="55.000198"
+ height="1"
+ width="1"
+ id="rect74889"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="226"
+ x="55.000198"
+ height="1"
+ width="1"
+ id="rect74891"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="224"
+ x="55.000198"
+ height="1"
+ width="1"
+ id="rect74893"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="222"
+ x="55.000198"
+ height="1"
+ width="1"
+ id="rect74895"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="223"
+ x="44.000198"
+ height="5"
+ width="8.999999"
+ id="rect74897"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="228"
+ x="41.000198"
+ height="1"
+ width="1"
+ id="rect74899"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="230"
+ x="41.000198"
+ height="1"
+ width="1"
+ id="rect74901"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ id="g82035"
+ inkscape:label="stock-tool-path">
+ <rect
+ transform="translate(241.0002,217)"
+ y="-40"
+ x="-140"
+ height="16"
+ width="16"
+ id="rect74975"
+ style="fill:none;fill-opacity:1;stroke:none" />
+ <path
+ sodipodi:nodetypes="cccccc"
+ inkscape:connector-curvature="0"
+ id="path82005"
+ d="m 109.0002,193 0,-2 5,0 0,2 0,0 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ d="M -131 -39 L -131 -37 C -131 -37 -133 -35 -133 -31 C -132 -29.353553 -132 -28.535961 -132 -28 L -132 -27 L -127 -27 L -127 -28 C -127 -28.513864 -127 -29.419845 -126 -31 C -126 -35 -128 -37 -128 -37 L -128 -39 L -129 -39 L -129 -34.03125 C -128.38161 -33.825913 -127.9375 -33.249817 -127.9375 -32.5625 C -127.9375 -31.703869 -128.64137 -31 -129.5 -31 C -130.35863 -31 -131.0625 -31.703869 -131.0625 -32.5625 C -131.0625 -33.243091 -130.60897 -33.820626 -130 -34.03125 L -130 -39 L -131 -39 z "
+ transform="translate(241.0002,217)"
+ id="path10153" />
+ <path
+ transform="matrix(0.55535907,0,0,0.56082815,180.61831,201.86931)"
+ d="m -134,-31 c 0,1.656854 -1.34315,3 -3,3 -1.65685,0 -3,-1.343146 -3,-3 0,-1.656854 1.34315,-3 3,-3 1.65685,0 3,1.343146 3,3 z"
+ sodipodi:ry="3"
+ sodipodi:rx="3"
+ sodipodi:cy="-31"
+ sodipodi:cx="-137"
+ id="path82013"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ sodipodi:type="arc" />
+ <rect
+ y="180"
+ x="104.0002"
+ height="10.729204"
+ width="1.0000017"
+ id="rect82017"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="177"
+ x="103.0002"
+ height="2.9999983"
+ width="2.9999981"
+ id="rect82019"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="scale(1,-1)"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect82023"
+ width="2.9999981"
+ height="2.9999983"
+ x="103.0002"
+ y="-193" />
+ </g>
+ <g
+ id="g82173"
+ inkscape:label="stock-tool-heal">
+ <rect
+ y="197"
+ x="101.0002"
+ height="16.000008"
+ width="16"
+ id="rect82048"
+ style="fill:none;stroke:none" />
+ <path
+ style="fill:#bebebe;fill-opacity:1;stroke:none;display:inline"
+ d="m 109.43643,198.48087 c -0.21568,0.17901 -0.40751,0.40847 -0.54367,0.67589 l -4.6579,9.12364 c -0.5447,1.06951 -0.10799,2.38891 0.96718,2.96068 l 0.94561,0.49718 c 1.07517,0.57178 2.37229,0.17678 2.91699,-0.89274 l 4.65791,-9.12363 c 0.54469,-1.06953 0.10799,-2.38892 -0.96719,-2.9607 l -0.9456,-0.49717 c -0.80638,-0.42884 -1.72635,-0.32026 -2.37333,0.21685 z m -1.47066,4.46536 c 0.32968,-0.2454 0.81079,-0.18248 1.06248,0.13898 0.25169,0.32143 0.18715,0.79053 -0.14254,1.03594 -0.32969,0.24539 -0.8108,0.18247 -1.06249,-0.13899 -0.25169,-0.32144 -0.18715,-0.79053 0.14255,-1.03593 z m -0.99341,1.97924 c 0.32968,-0.24542 0.81079,-0.18249 1.06249,0.13897 0.25168,0.32144 0.18715,0.79053 -0.14253,1.03593 -0.32969,0.24539 -0.8108,0.18247 -1.06249,-0.13898 -0.2517,-0.32144 -0.18716,-0.79053 0.14253,-1.03592 z m 3.02336,-1.01067 c 0.32967,-0.24539 0.81079,-0.18247 1.06249,0.13898 0.25168,0.32144 0.18715,0.79053 -0.14254,1.03593 -0.32969,0.24541 -0.8108,0.18249 -1.06248,-0.13897 -0.2517,-0.32145 -0.18716,-0.79053 0.14253,-1.03594 z m -0.9934,1.97923 c 0.32969,-0.24539 0.81079,-0.18247 1.06249,0.13898 0.25169,0.32143 0.18716,0.79053 -0.14253,1.03592 -0.32969,0.24541 -0.81081,0.18249 -1.0625,-0.13897 -0.25169,-0.32144 -0.18716,-0.79053 0.14254,-1.03593 z"
+ id="path82132"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path82165"
+ transform="translate(241.0002,217)"
+ d="M -136.40625 -17 C -137.24628 -17.03508 -138.01499 -16.5644 -138.375 -15.71875 L -138.8125 -14.71875 C -139.29254 -13.5912 -138.81211 -12.24823 -137.71875 -11.71875 L -136.84375 -11.3125 L -134.40625 -16.21875 L -135.5625 -16.78125 C -135.83585 -16.91356 -136.12624 -16.9886 -136.40625 -17 z M -127.125 -12.71875 L -129.59375 -7.8125 L -128.375 -7.21875 C -127.28165 -6.6893 -126.04254 -7.15372 -125.5625 -8.28125 L -125.125 -9.28125 C -124.64495 -10.40878 -125.12538 -11.7518 -126.21875 -12.28125 L -127.125 -12.71875 z "
+ style="fill:#bebebe;fill-opacity:1;stroke:none;display:inline;opacity:0.5" />
+ </g>
+ <g
+ id="g3919"
+ inkscape:label="stock-tool-blend">
+ <g
+ inkscape:label="blend"
+ id="g84908">
+ <rect
+ style="fill:none;fill-opacity:1;stroke:none"
+ id="rect82178"
+ width="16"
+ height="16"
+ x="-120"
+ y="-40"
+ transform="translate(241.0002,217)" />
+ <path
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ d="m 122.0002,178 0,14 14,0 0,-14 -14,0 z m 1,1 12,0 0,12 -12,0 0,-12 z"
+ id="rect82180"
+ inkscape:connector-curvature="0" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect82185"
+ width="3.0000017"
+ height="10"
+ x="124.0002"
+ y="180" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect82187"
+ width="1"
+ height="1"
+ x="128.0002"
+ y="181" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect82189"
+ width="1"
+ height="1"
+ x="127.0002"
+ y="180" />
+ <rect
+ y="183"
+ x="128.0002"
+ height="1"
+ width="1"
+ id="rect82191"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="182"
+ x="127.0002"
+ height="1"
+ width="1"
+ id="rect82193"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect82195"
+ width="1"
+ height="1"
+ x="128.0002"
+ y="185" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect82197"
+ width="1"
+ height="1"
+ x="127.0002"
+ y="184" />
+ <rect
+ y="187"
+ x="128.0002"
+ height="1"
+ width="1"
+ id="rect82199"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="186"
+ x="127.0002"
+ height="1"
+ width="1"
+ id="rect82201"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect82203"
+ width="1"
+ height="1"
+ x="128.0002"
+ y="189" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect82205"
+ width="1"
+ height="1"
+ x="127.0002"
+ y="188" />
+ <rect
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect82207"
+ width="1"
+ height="1"
+ x="130.0002"
+ y="180" />
+ <rect
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect82209"
+ width="1"
+ height="1"
+ x="130.0002"
+ y="182" />
+ <rect
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect82211"
+ width="1"
+ height="1"
+ x="130.0002"
+ y="184" />
+ <rect
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect82213"
+ width="1"
+ height="1"
+ x="130.0002"
+ y="186" />
+ <rect
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect82215"
+ width="1"
+ height="1"
+ x="130.0002"
+ y="188" />
+ <rect
+ y="181"
+ x="131.0002"
+ height="1"
+ width="1"
+ id="rect84896"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="183"
+ x="131.0002"
+ height="1"
+ width="1"
+ id="rect84898"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="185"
+ x="131.0002"
+ height="1"
+ width="1"
+ id="rect84900"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="187"
+ x="131.0002"
+ height="1"
+ width="1"
+ id="rect84902"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="189"
+ x="131.0002"
+ height="1"
+ width="1"
+ id="rect84904"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect84906"
+ width="1"
+ height="10"
+ x="129.0002"
+ y="180"
+ rx="2"
+ ry="0" />
+ </g>
+ </g>
+ <g
+ id="g10573"
+ inkscape:label="stock-tool-scale">
+ <rect
+ transform="translate(241.0002,217)"
+ y="-20"
+ x="-120"
+ height="16"
+ width="16"
+ id="rect3946"
+ style="fill:none;fill-opacity:1;stroke:none" />
+ <rect
+ rx="0.46966994"
+ ry="0.5138641"
+ y="211"
+ x="121.0002"
+ height="2"
+ width="4.0000014"
+ id="rect4716"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4718"
+ d="m 127.83353,197 c -0.46166,0 -0.83333,0.38229 -0.83333,0.85714 l 0,3.42857 0,0.85715 c 0,0.47485 0.37167,0.85714 0.83333,0.85714 l 5.83334,0 2.5,0 c 0.46166,0 0.83333,-0.38229 0.83333,-0.85714 l 0,-3.42857 0,-0.85715 c 0,-0.47485 -0.37167,-0.85714 -0.83333,-0.85714 l -5.83334,0 -2.5,0 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ sodipodi:nodetypes="cccccccccc"
+ inkscape:connector-curvature="0"
+ id="path10525"
+ d="m 127.0002,205 2,2 -3,3 1,1 1,-1 2,-2 2,2 0,-5 -3,0 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ id="g18627"
+ inkscape:label="stock-tool-rotate">
+ <rect
+ ry="0"
+ rx="0.46966994"
+ transform="translate(241.0002,217)"
+ y="-20"
+ x="-100"
+ height="16"
+ width="16"
+ id="rect10072"
+ style="fill:none;fill-opacity:1;stroke:none" />
+ <path
+ id="path18623"
+ d="m 144.0002,197 0,5 c 0.98484,-0.005 2.11512,0.018 3,0 l 2,0 -1.8125,-1.8125 0,-0.0313 c 0.3708,-0.72884 1.25531,-1.28125 2.375,-1.28125 1.49292,0 2.5625,1.00464 2.5625,2.0625 -0.0891,0.54181 0.38841,1.10428 0.9375,1.10428 0.54909,0 1.02661,-0.56247 0.9375,-1.10428 0,-2.25584 -2.06442,-3.9375 -4.4375,-3.9375 -1.53989,0 -2.94977,0.69891 -3.75,1.8125 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccscscscc" />
+ <path
+ id="rect10846"
+ d="m 144.78145,208 a 0.95009499,0.95009499 0 0 0 -0.78125,1.09375 c 0,2.25584 2.06442,3.9375 4.4375,3.9375 1.53988,0 2.94977,-0.69891 3.75,-1.8125 l 1.8125,1.8125 0,-5 -1.75,0 -0.0937,0 a 0.95009499,0.95009499 0 0 0 -0.46875,0 l -0.6875,0 -2,0 1.8125,1.8125 c -0.004,0.009 0.004,0.0226 0,0.0313 -0.3708,0.72884 -1.25531,1.28125 -2.375,1.28125 -1.49292,0 -2.5625,-1.00464 -2.5625,-2.0625 A 0.95009499,0.95009499 0 0 0 144.78145,208 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ ry="0.5138641"
+ rx="0.46966994"
+ y="204"
+ x="147.0002"
+ height="2"
+ width="4"
+ id="rect18625"
+ style="fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.89999998000000003;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ </g>
+ <g
+ id="g18711"
+ inkscape:label="stock-tool-bucket-fill">
+ <rect
+ ry="0"
+ rx="0.46966994"
+ y="177"
+ x="141.0002"
+ height="16"
+ width="16"
+ id="rect18652"
+ style="fill:none;stroke:none;display:inline" />
+ <path
+ style="fill:#bebebe;fill-opacity:1;stroke:none;display:inline"
+ d="M -92 -36.84375 L -94.46875 -35.03125 C -94.459785 -35.043466 -94.498589 -35.048865 -94.75 -35 C -98.75 -34.22254 -99 -33.342719 -99 -32 L -99 -27 C -99 -26.446 -98.554 -26 -98 -26 C -97.446 -26 -97 -26.446 -97 -27 L -97 -33.1875 L -95.71875 -31.3125 L -94.65625 -29.75 L -91.875 -25.59375 C -91.49136 -25.02555 -90.8014 -24.82394 -90.34375 -25.15625 L -85.375 -28.75 C -84.91738 -29.08233 -84.86634 -29.80678 -85.25 -30.375 L -88 -34.4375 L -88 -33 C -88 -31.895431 -88.895431 -31 -90 -31 C -91.104569 -31 -92 -31.895431 -92 -33 L -92 -36.84375 z "
+ transform="translate(241.0002,217)"
+ id="rect18654" />
+ <rect
+ ry="1"
+ rx="1"
+ y="177"
+ x="150.00273"
+ height="8"
+ width="1.9974687"
+ id="rect18680"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ id="g33321"
+ inkscape:label="stock-tool-ink">
+ <rect
+ ry="0"
+ rx="0.99781346"
+ transform="translate(241.0002,217)"
+ y="-40"
+ x="-80"
+ height="16"
+ width="16"
+ id="rect18736"
+ style="fill:none;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect18742"
+ d="m 170.0002,184 c -0.554,0 -1,0.25455 -1,0.5625 l 0,0.875 c 0,0.30795 0.446,0.5625 1,0.5625 l -2,0 c -0.55161,0 -1.1024,0.53053 -0.96875,1.15625 l 0.96875,4.6875 c 0.13364,0.62572 0.44842,1.15625 1,1.15625 l 6,0 c 0.5516,0 0.86637,-0.53053 1,-1.15625 l 1,-4.6875 c 0.13364,-0.62572 -0.4484,-1.15625 -1,-1.15625 l -2,0 c 0.554,0 1,-0.25455 1,-0.5625 l 0,-0.875 c 0,-0.30795 -0.446,-0.5625 -1,-0.5625 l -4,0 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ d="m 168.0002,177 c 0,0 -1.29469,0.17681 -2.66667,1 -3.33333,2 -4.33333,5.47931 -4.33333,7 -0.34375,4.09375 1.46875,5 1.46875,5 0.0937,2 0.53125,3 0.53125,3 1,-1 1,-1 1,-1 0,0 -1,-2.5 1,-3 -0.5,-5 -0.10417,-9 3,-12 z"
+ id="path23470"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cscccccc" />
+ </g>
+ <g
+ id="g33612"
+ inkscape:label="stock-tool-crop">
+ <rect
+ ry="0"
+ rx="0.99781346"
+ transform="translate(241.0002,217)"
+ y="-20"
+ x="-80"
+ height="16"
+ width="16"
+ id="rect33602"
+ style="fill:none;stroke:none" />
+ <rect
+ ry="0"
+ rx="0.9978134"
+ y="200"
+ x="162.0002"
+ height="1.9999714"
+ width="12.000002"
+ id="rect33604"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect33606"
+ width="11.999992"
+ height="2.0001054"
+ x="164.0002"
+ y="208"
+ rx="0.99781346"
+ ry="0" />
+ <rect
+ ry="0"
+ rx="0.99781346"
+ y="198"
+ x="164.0002"
+ height="12"
+ width="2"
+ id="rect33608"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect33610"
+ width="2"
+ height="12"
+ x="172.0002"
+ y="200"
+ rx="0.99781346"
+ ry="0" />
+ </g>
+ <g
+ id="g34059"
+ inkscape:label="stock-tool-color-picker">
+ <rect
+ ry="0"
+ rx="0.9978134"
+ transform="translate(241.0002,217)"
+ y="-40"
+ x="-60"
+ height="16"
+ width="16"
+ id="rect33857"
+ style="fill:none;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 191.61215,182.40474 -4.22019,5.66336 -1.69404,1.49261 L 185.0002,189 l 0.99632,-2.0533 4.22021,-5.66336 1.39542,1.1214 z"
+ id="path3620"
+ style="fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+ <path
+ sodipodi:nodetypes="cssc"
+ inkscape:connector-curvature="0"
+ d="m 185.0002,189.57452 c 0,0 -1.47718,0.66848 -1.46543,2.07969 0.0147,1.75803 2.66009,1.84345 2.74332,0.28446 0.0475,-0.89097 -1.27789,-2.36415 -1.27789,-2.36415 z"
+ id="path4352"
+ style="fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 187.64655,181.43041 4.6492,3.52738 0.70445,-0.92575 -1.39473,-1.05818 c 2.80371,-0.79322 4.71994,-4.17485 2.86027,-5.58582 -1.85967,-1.41094 -4.70574,1.26519 -4.71994,4.17488 l -1.39477,-1.05822 -0.70448,0.92571 z"
+ id="path3583"
+ style="fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+ </g>
+ <g
+ id="g34124"
+ inkscape:label="stock-tool-fuzzy-select">
+ <rect
+ rx="0"
+ transform="translate(241.0002,217)"
+ y="-20"
+ x="-60"
+ height="16"
+ width="16"
+ id="rect34084"
+ style="fill:none;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:transform-center-x="-0.34743"
+ transform="matrix(1.8190885,0,0,1.9123982,523.40286,116.57968)"
+ d="m -184,45 -1.19098,0.587785 -0.19099,1.314328 -0.92705,-0.951056 -1.30901,0.224514 L -187,45 l -0.61803,-1.175571 1.30901,0.224514 0.92705,-0.951056 0.19099,1.314328 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="false"
+ sodipodi:arg2="0.62831853"
+ sodipodi:arg1="0"
+ sodipodi:r2="1"
+ sodipodi:r1="2"
+ sodipodi:cy="45"
+ sodipodi:cx="-186"
+ sodipodi:sides="5"
+ id="path106146"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ sodipodi:type="star" />
+ <rect
+ ry="0.51101255"
+ rx="0.9956156"
+ transform="matrix(-0.66790251,0.74424877,0.77062002,0.6372949,0,0)"
+ y="276.32022"
+ x="37.12455"
+ height="11.284684"
+ width="1.7099706"
+ id="rect106159"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ id="g34168"
+ inkscape:label="stock-tool-eraser">
+ <rect
+ ry="0"
+ rx="0.9956156"
+ transform="translate(241.0002,217)"
+ y="0"
+ x="-180"
+ height="16"
+ width="16"
+ id="rect34148"
+ style="fill:none;stroke:none" />
+ <path
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ d="m 72.15645,218 c -0.07885,0.0161 -0.1595,0.0696 -0.21875,0.125 l -4.28125,4 4.03125,4.34375 4.15625,-3.875 c 0.23699,-0.22144 0.17839,-0.68283 -0.125,-1.03125 L 72.9377,218.34375 C 72.71016,218.08243 72.39301,217.95166 72.15645,218 z"
+ id="path4066" />
+ <path
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ d="m 66.5002,223.21875 -2.34375,2.1875 c -0.23699,0.22144 -0.20964,0.68283 0.09375,1.03125 l 2.8125,3.21875 c 0.30339,0.34842 0.73176,0.44019 0.96875,0.21875 l 2.46875,-2.3125 -4,-4.34375 z"
+ id="rect34152" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect34161"
+ d="m 69.7002,231 c -0.3878,0 -0.7,0.223 -0.7,0.5 0,0.277 0.3122,0.5 0.7,0.5 l 1.4,0 4.2,0 0.7,0 0,-0.5 0,-0.5 -0.7,0 -4.2,0 -1.4,0 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ sodipodi:nodetypes="csccccc"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ d="m 64.3002,231 c 0.3878,0 0.7,0.223 0.7,0.5 0,0.277 -0.3122,0.5 -0.7,0.5 -2.1,0 -2,0 -2.3,0 l 0,-0.5 0,-0.5 c 0,0 0.2,0 2.3,0 z"
+ id="path34166"
+ inkscape:connector-curvature="0" />
+ </g>
+ <g
+ id="g38589"
+ inkscape:label="stock-tool-cage">
+ <rect
+ rx="0"
+ transform="translate(241.0002,217)"
+ y="0"
+ x="-160"
+ height="16"
+ width="16"
+ id="rect34193"
+ style="fill:none;fill-opacity:1;stroke:none" />
+ <path
+ sodipodi:type="arc"
+ style="color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:0.99999976;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new"
+ id="path3908"
+ sodipodi:cx="-176.01562"
+ sodipodi:cy="-39.984375"
+ sodipodi:rx="2.015625"
+ sodipodi:ry="2.015625"
+ d="m -174,-39.984375 c 0,1.113199 -0.90243,2.015625 -2.01562,2.015625 -1.1132,0 -2.01563,-0.902426 -2.01563,-2.015625 0,-1.113199 0.90243,-2.015625 2.01563,-2.015625 1.11319,0 2.01562,0.902426 2.01562,2.015625 z"
+ transform="matrix(0.99612528,0,0,0.99612528,258.326,260.83727)" />
+ <path
+ transform="matrix(0.98062141,0,0,0.98062141,255.56582,270.1861)"
+ d="m -174,-39.984375 c 0,1.113199 -0.90243,2.015625 -2.01562,2.015625 -1.1132,0 -2.01563,-0.902426 -2.01563,-2.015625 0,-1.113199 0.90243,-2.015625 2.01563,-2.015625 1.11319,0 2.01562,0.902426 2.01562,2.015625 z"
+ sodipodi:ry="2.015625"
+ sodipodi:rx="2.015625"
+ sodipodi:cy="-39.984375"
+ sodipodi:cx="-176.01562"
+ id="path3910"
+ style="color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999976;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new"
+ sodipodi:type="arc" />
+ <path
+ sodipodi:type="arc"
+ style="color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999976;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new"
+ id="path3912"
+ sodipodi:cx="-176.01562"
+ sodipodi:cy="-39.984375"
+ sodipodi:rx="2.015625"
+ sodipodi:ry="2.015625"
+ d="m -174,-39.984375 c 0,1.113199 -0.90243,2.015625 -2.01562,2.015625 -1.1132,0 -2.01563,-0.902426 -2.01563,-2.015625 0,-1.113199 0.90243,-2.015625 2.01563,-2.015625 1.11319,0 2.01562,0.902426 2.01562,2.015625 z"
+ transform="matrix(0.96899291,0,0,0.96899291,265.62057,267.7602)" />
+ <path
+ transform="matrix(0.96124033,0,0,0.96124033,263.27163,257.37209)"
+ d="m -174,-39.984375 c 0,1.113199 -0.90243,2.015625 -2.01562,2.015625 -1.1132,0 -2.01563,-0.902426 -2.01563,-2.015625 0,-1.113199 0.90243,-2.015625 2.01563,-2.015625 1.11319,0 2.01562,0.902426 2.01562,2.015625 z"
+ sodipodi:ry="2.015625"
+ sodipodi:rx="2.015625"
+ sodipodi:cy="-39.984375"
+ sodipodi:cx="-176.01562"
+ id="path3914"
+ style="color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999976;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new"
+ sodipodi:type="arc" />
+ <path
+ sodipodi:nodetypes="cccccc"
+ inkscape:connector-curvature="0"
+ id="rect3916"
+ d="m 83.0002,221 11,-2 1,10 -6,-3 -6,5 z"
+ style="color:#000000;fill:none;stroke:#bebebe;stroke-width:1.5;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new" />
+ <path
+ transform="matrix(1.0116267,0,0,1.0116267,267.10136,266.50395)"
+ d="m -174,-39.984375 c 0,1.113199 -0.90243,2.015625 -2.01562,2.015625 -1.1132,0 -2.01563,-0.902426 -2.01563,-2.015625 0,-1.113199 0.90243,-2.015625 2.01563,-2.015625 1.11319,0 2.01562,0.902426 2.01562,2.015625 z"
+ sodipodi:ry="2.015625"
+ sodipodi:rx="2.015625"
+ sodipodi:cy="-39.984375"
+ sodipodi:cx="-176.01562"
+ id="path38587"
+ style="color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:0.99999976;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new"
+ sodipodi:type="arc" />
+ </g>
+ <g
+ id="g12624"
+ inkscape:label="stock-tool-iscissors">
+ <rect
+ transform="translate(241.0002,217)"
+ y="0"
+ x="-140"
+ height="16"
+ width="16"
+ id="rect11780"
+ style="fill:none;fill-opacity:1;stroke:none" />
+ <path
+ id="rect4875"
+ d="m 104.93945,220 c -0.90867,0.38331 -1.20523,1.21717 -0.68062,1.88108 l 3.78781,5.03784 -1.49639,1.63837 1.21173,1.44271 1.37957,-1.71892 1.3528,1.71892 1.20063,-1.38155 -1.45852,-1.69953 3.78781,-5.03784 c 0.52462,-0.66391 0.22804,-1.49777 -0.68063,-1.88108 l -4.20209,5.53514 L 104.93945,220 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccccccccc" />
+ <path
+ id="path12605"
+ transform="translate(241.0002,217)"
+ d="M -128 10 C -129.65685 10 -131 11.343146 -131 13 C -131 14.656854 -129.65685 16 -128 16 C -126.34315 16 -125 14.656854 -125 13 C -125 11.343146 -126.34315 10 -128 10 z M -128 12 C -127.44772 12 -127 12.447715 -127 13 C -127 13.552285 -127.44772 14 -128 14 C -128.55228 14 -129 13.552285 -129 13 C -129 12.447715 -128.55228 12 -128 12 z "
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ d="m 105.0002,227 c -1.65685,0 -3,1.34315 -3,3 0,1.65685 1.34315,3 3,3 1.65685,0 3,-1.34315 3,-3 0,-1.65685 -1.34315,-3 -3,-3 z m 0,2 c 0.55228,0 1,0.44771 1,1 0,0.55228 -0.44772,1 -1,1 -0.55228,0 -1,-0.44772 -1,-1 0,-0.55229 0.44772,-1 1,-1 z"
+ id="path12608" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="5"
+ x="-133"
+ height="1"
+ width="1"
+ id="rect12610"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="220"
+ x="108.0002"
+ height="1"
+ width="1"
+ id="rect12612"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="1"
+ x="-133"
+ height="1"
+ width="1"
+ id="rect12614"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="1"
+ x="-131"
+ height="1"
+ width="1"
+ id="rect12616"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="1"
+ x="-129"
+ height="1"
+ width="1"
+ id="rect12618"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="1"
+ x="-127"
+ height="1"
+ width="1"
+ id="rect12620"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="1"
+ x="-125"
+ height="1"
+ width="1"
+ id="rect12622"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ id="g12661"
+ inkscape:label="stock-tool-blur">
+ <rect
+ transform="translate(241.0002,217)"
+ y="0"
+ x="-120"
+ height="16"
+ width="16"
+ id="rect12656"
+ style="fill:none;fill-opacity:1;stroke:none" />
+ <path
+ sodipodi:nodetypes="ssscs"
+ inkscape:connector-curvature="0"
+ id="path12658"
+ d="m -106.91666,11 c 0,3 -1.54577,5 -4.58334,5 -3.03757,0 -4.58333,-2 -4.58333,-5 0,-4 3.66667,-5 4.58333,-10 0.91667,5 4.58334,6 4.58334,10 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ transform="matrix(1.0909091,0,0,1,250.63656,217)" />
+ </g>
+ <g
+ id="g12691"
+ inkscape:label="stock-tool-dodge">
+ <rect
+ y="237.125"
+ x="41.000198"
+ height="16"
+ width="16"
+ id="rect12684"
+ style="fill:none;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path12686"
+ d="m 53.0002,239 -2.5,4.375 c -0.477872,-0.15176 -0.971878,-0.25 -1.5,-0.25 -2.761424,0 -5,2.23858 -5,5 0,2.76142 2.238576,5 5,5 2.761424,0 5,-2.23858 5,-5 0,-1.39627 -0.577139,-2.65538 -1.5,-3.5625 l 2.5,-4.4375 -2,-1.125 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ id="g4796"
+ inkscape:label="stock-tool-smudge">
+ <g
+ style="fill:#bebebe;fill-opacity:1"
+ transform="matrix(0.13687821,0,0,-0.13687821,68.843525,244.68735)"
+ id="g12900">
+ <path
+ sodipodi:nodetypes="csccccccccccccccccsccc"
+ inkscape:connector-curvature="0"
+ id="path12902"
+ d="m 591.02643,194.97151 c -15.23997,-1e-5 -27.83544,-5.51449 -38.09985,-14.61154 -5.04435,-4.47065 -5.53963,-12.57301 0,-14.61153 l 0,0 0,0 c -2.55481,-2.36345 -3.22875,-5.93593 -1.47905,-9.4527 l 1.47905,-2.16889 c 1.94332,-2.00411 5.00063,-2.76163 5.00063,-2.76163 l 0,0 c -2.5548,-2.84775 -2.24637,-7.12882 0.71438,-9.58881 l 1.19062,-1.14153 c 2.96074,-2.46 7.44639,-2.16284 10.0012,0.68492 0,0 -0.50323,-0.5819 0,0 l -25.47925,-28.30984 c -8.39074,-7.503 5.62719,-19.245454 14.0493,-10.27373 l 34.05171,36.07221 6.19122,6.39254 c 8.24578,8.63789 24.74698,-11.25858 7.61992,-15.98136 0,0 -7.07916,-0.51711 -14.52551,-0.22831 -5.88688,0.22831 -10.4278,-16.39785 9.28683,-14.38322 29.71831,-0.40817 35.71853,29.22306 35.71857,43.60629 -4e-5,29.45136 -22.85992,36.75712 -45.71977,36.75713 z"
+ style="fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ </g>
+ <rect
+ transform="translate(241.0002,217)"
+ y="0"
+ x="-100"
+ height="16"
+ width="16"
+ id="rect13146"
+ style="fill:none;stroke:none" />
+ </g>
+ <g
+ id="g4874"
+ inkscape:label="stock-tool-shear">
+ <rect
+ transform="translate(241.0002,217)"
+ y="0"
+ x="-80"
+ height="16"
+ width="16"
+ id="rect4820"
+ style="fill:none;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path4834"
+ d="m 161.0002,228.0125 0,2 5,-0.0125 0,-2 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path4836"
+ d="m 169.0002,228.98721 -2.99999,3.01846 -1e-5,-5.99317 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="rect4845"
+ d="m 161.0002,217 0,7 7,0 0,-7 z"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path4855"
+ d="m 161.0002,217 8.5625,10 7.3125,0 -8.53125,-10 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ id="g4945"
+ inkscape:label="stock-tool-align">
+ <rect
+ transform="translate(241.0002,217)"
+ y="0"
+ x="-60"
+ height="16"
+ width="16"
+ id="rect4900"
+ style="opacity:0.29999999999999999;fill:none;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="1"
+ x="-59"
+ height="14"
+ width="2"
+ id="rect4939"
+ style="fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <rect
+ y="219.97542"
+ x="184.97562"
+ height="4.0245819"
+ width="6.0245833"
+ id="rect4941"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="226"
+ x="185.0002"
+ height="4"
+ width="10"
+ id="rect4943"
+ style="fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ </g>
+ <g
+ id="g5490"
+ inkscape:label="stock-tool-measure">
+ <rect
+ transform="translate(241.0002,217)"
+ y="20"
+ x="-180"
+ height="16"
+ width="16"
+ id="rect5381"
+ style="fill:none;fill-opacity:1;stroke:none" />
+ <rect
+ ry="0.49999997"
+ rx="0.62307692"
+ y="247"
+ x="62.000198"
+ height="1.0000052"
+ width="13.951626"
+ id="rect3094"
+ style="color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999928;marker:none;visibility:visible;display:block;overflow:visible" />
+ <path
+ sodipodi:nodetypes="cccccccccc"
+ id="path1348"
+ d="M 73.239011,243.54894 70.526194,242 l -0.77509,0.77447 1.55018,1.93618 0.775091,4.64683 L 73.0002,251 l 0,2 1,-1 0.0139,-3.80423 z"
+ style="color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999994;marker:none;visibility:visible;display:block;overflow:visible"
+ inkscape:connector-curvature="0" />
+ <path
+ sodipodi:nodetypes="cccccccccc"
+ id="path3226"
+ d="M 64.763968,243.54894 67.437156,242 l 0.763766,0.77447 -1.527534,1.93618 -0.763768,4.64683 L 65.0002,251 l 0,2 -1,-1 0,-3.80423 z"
+ style="color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999994;marker:none;visibility:visible;display:block;overflow:visible"
+ inkscape:connector-curvature="0" />
+ <rect
+ rx="0.75"
+ ry="0.60000044"
+ y="237.00368"
+ x="68.000198"
+ height="1.9963226"
+ width="2"
+ id="rect3078"
+ style="color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:block;overflow:visible" />
+ <rect
+ ry="1.1060915"
+ rx="1.055584"
+ y="246"
+ x="68.000198"
+ height="3.0000055"
+ width="1.9999979"
+ id="rect1344"
+ style="color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.73919463;marker:none;visibility:visible;display:block;overflow:visible" />
+ <path
+ id="path5483"
+ transform="translate(241.0002,217)"
+ d="M -172 21 C -173.65685 21 -175 22.343146 -175 24 C -175 25.656854 -173.65685 27 -172 27 C -170.34315 27 -169 25.656854 -169 24 C -169 22.343146 -170.34315 21 -172 21 z M -172 22.46875 C -171.15482 22.46875 -170.46875 23.154822 -170.46875 24 C -170.46875 24.845178 -171.15482 25.53125 -172 25.53125 C -172.84518 25.53125 -173.53125 24.845178 -173.53125 24 C -173.53125 23.154822 -172.84518 22.46875 -172 22.46875 z "
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ id="g5553"
+ inkscape:label="stock-tool-clone">
+ <rect
+ ry="0"
+ rx="0.75"
+ y="237"
+ x="81.000198"
+ height="15.975763"
+ width="16.000002"
+ id="rect5537"
+ style="fill:none;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect5543"
+ d="m 83.0002,248 0,3 6,0 -2,-3 -4,0 z m 6,3 6,0 0,-3 -4,0 -2,3 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ sodipodi:nodetypes="ccccccc"
+ inkscape:connector-curvature="0"
+ id="rect5545"
+ d="m 84.000198,247.22414 c 0,0 4.000002,0 4.000002,-3.87931 1,-0.77586 2,0 2,0 0,3.87931 3.999998,3.87931 3.999998,3.87931 l 0,0.77586 -10,0 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ transform="matrix(0.57142911,0,0,1,175.57171,218)"
+ d="m -148,24 c 0,1.104569 -1.567,2 -3.5,2 -1.933,0 -3.5,-0.895431 -3.5,-2 0,-1.104569 1.567,-2 3.5,-2 1.933,0 3.5,0.895431 3.5,2 z"
+ sodipodi:ry="2"
+ sodipodi:rx="3.5"
+ sodipodi:cy="24"
+ sodipodi:cx="-151.5"
+ id="path5547"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ sodipodi:type="arc" />
+ </g>
+ <g
+ id="g5671"
+ inkscape:label="stock-tool-perspective-clone">
+ <rect
+ style="fill:none;stroke:none"
+ id="rect5580"
+ width="16.000002"
+ height="15.975763"
+ x="101.0002"
+ y="237"
+ rx="0.75"
+ ry="0" />
+ <path
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ d="m 101.0002,246 0,2 5,0 -1.66667,-2 -3.33333,0 z m 5,2 5,0 0,-2 -3.33333,0 -1.66667,2 z"
+ id="path5582"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ d="m 102.66687,245.06898 c 0,0 2.66666,0 2.66666,-4.65518 0.66667,-0.93105 1.33334,0 1.33334,0 0,4.65518 2.66666,4.65518 2.66666,4.65518 l 0,0.93102 -6.66666,0 z"
+ id="path5584"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccc" />
+ <path
+ sodipodi:type="arc"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="path5586"
+ sodipodi:cx="-151.5"
+ sodipodi:cy="24"
+ sodipodi:rx="3.5"
+ sodipodi:ry="2"
+ d="m -148,24 c 0,1.104569 -1.567,2 -3.5,2 -1.933,0 -3.5,-0.895431 -3.5,-2 0,-1.104569 1.567,-2 3.5,-2 1.933,0 3.5,0.895431 3.5,2 z"
+ transform="matrix(0.57142782,0,0,1,192.57151,217)" />
+ <path
+ sodipodi:nodetypes="ccccccccccc"
+ inkscape:connector-curvature="0"
+ id="path5659"
+ d="m 111.0002,243 -1,2 2,0 0,4 -2,0 -1,0 -1,0 -2,3 11,0 -3,-9 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ id="g4550"
+ inkscape:label="stock-tool-flip">
+ <rect
+ rx="0"
+ transform="translate(241.0002,217)"
+ y="20"
+ x="-120"
+ height="16"
+ width="16"
+ id="rect3742"
+ style="fill:none;fill-opacity:1;stroke:none" />
+ <path
+ sodipodi:nodetypes="ccccccccccccc"
+ inkscape:connector-curvature="0"
+ id="rect4533"
+ transform="translate(241.0002,217)"
+ d="m -116,25 0,2 3,0 c 0,-2 0,6 0,-4 l -7,0 0,5 0,5 7,0 0,-4 -3,0 0,2 -3,-3 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ d="m 136.0002,245 -3,-3 0,2 -3,0 0,-4 7,0 0,5 0,5 -7,0 0,-4 3,0 0,2 3,-3"
+ id="path4546"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccccccccc" />
+ </g>
+ <g
+ id="g10530"
+ inkscape:label="stock-tool-perspective">
+ <rect
+ y="237"
+ x="141.0002"
+ height="16"
+ width="16"
+ id="rect4574"
+ style="fill:none;stroke:none" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect10503"
+ width="9.9436893"
+ height="1"
+ x="147.0565"
+ y="242" />
+ <rect
+ y="251"
+ x="146.99919"
+ height="0.97576511"
+ width="9.9436893"
+ id="rect10505"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="242"
+ x="147.0002"
+ height="10"
+ width="1"
+ id="rect10507"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="242.10486"
+ x="156.0002"
+ height="9.8951454"
+ width="1"
+ id="rect10509"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="238"
+ x="142.0002"
+ height="1"
+ width="9.9436893"
+ id="rect10511"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect10513"
+ width="9.9436893"
+ height="0.97576511"
+ x="141.99919"
+ y="247" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect10515"
+ width="1"
+ height="10"
+ x="142.0002"
+ y="238" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect10517"
+ width="1"
+ height="10"
+ x="151.0002"
+ y="238" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path10519"
+ d="m 142.0002,239 5,4 1,-1 -5,-4 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ d="m 151.0002,239 5,4 1,-1 -5,-4 z"
+ id="path10521"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ d="m 142.0002,248 5,4 1,-1 -5,-4 z"
+ id="path10523"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path10526"
+ d="m 151.0002,248 5,4 1,-1 -5,-4 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ id="g16724"
+ inkscape:label="stock-tool-foreground-select">
+ <rect
+ transform="translate(241.0002,217)"
+ y="20"
+ x="-80"
+ height="16"
+ width="16"
+ id="rect16643"
+ style="fill:none;fill-opacity:1;stroke:none" />
+ <path
+ sodipodi:type="arc"
+ style="color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="path20580-1"
+ sodipodi:cx="49.5"
+ sodipodi:cy="342.5"
+ sodipodi:rx="2.5"
+ sodipodi:ry="2.5"
+ d="m 52,342.5 c 0,1.38071 -1.119288,2.5 -2.5,2.5 -1.380712,0 -2.5,-1.11929 -2.5,-2.5 0,-1.38071 1.119288,-2.5 2.5,-2.5 1.380712,0 2.5,1.11929 2.5,2.5 z"
+ transform="translate(118.0002,-98)" />
+ <path
+ sodipodi:nodetypes="csccccccccc"
+ inkscape:connector-curvature="0"
+ id="path78052"
+ d="m 165.0002,247 c -1,0 -2,0 -2,1 0,0.92264 0,3 0,3 l 2,0 7,0 0,-2 0,-1 c 0,-1 -1,-1 -2,-1 l 0,1 -5,0 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ id="rect16664"
+ transform="translate(241.0002,217)"
+ d="M -76 20 L -76 22 L -66 22 L -66 29 L -64 29 L -64 20 L -76 20 z "
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="240"
+ x="161.0002"
+ height="1"
+ width="1"
+ id="rect16666"
+ style="opacity:1;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="240"
+ x="163.0002"
+ height="1"
+ width="1"
+ id="rect16668"
+ style="opacity:1;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="240"
+ x="165.0002"
+ height="1"
+ width="1"
+ id="rect16670"
+ style="opacity:1;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="240"
+ x="167.0002"
+ height="1"
+ width="1"
+ id="rect16672"
+ style="opacity:1;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="240"
+ x="169.0002"
+ height="1"
+ width="1"
+ id="rect16674"
+ style="opacity:1;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="240"
+ x="171.0002"
+ height="1"
+ width="1"
+ id="rect16676"
+ style="opacity:1;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="240"
+ x="173.0002"
+ height="1"
+ width="1"
+ id="rect16678"
+ style="opacity:1;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="25"
+ x="-68"
+ height="1"
+ width="1"
+ id="rect16682"
+ style="opacity:1;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="27"
+ x="-68"
+ height="1"
+ width="1"
+ id="rect16684"
+ style="opacity:1;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="29"
+ x="-68"
+ height="1"
+ width="1"
+ id="rect16686"
+ style="opacity:1;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="31"
+ x="-68"
+ height="1"
+ width="1"
+ id="rect16688"
+ style="opacity:1;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="33"
+ x="-68"
+ height="1"
+ width="1"
+ id="rect16690"
+ style="opacity:1;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="252"
+ x="171.0002"
+ height="1"
+ width="1"
+ id="rect16692"
+ style="opacity:1;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="252"
+ x="169.0002"
+ height="1"
+ width="1"
+ id="rect16694"
+ style="opacity:1;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="35"
+ x="-68"
+ height="1"
+ width="1"
+ id="rect16696"
+ style="opacity:1;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="25"
+ x="-80"
+ height="1"
+ width="1"
+ id="rect16700"
+ style="opacity:1;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="27"
+ x="-80"
+ height="1"
+ width="1"
+ id="rect16702"
+ style="opacity:1;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="29"
+ x="-80"
+ height="1"
+ width="1"
+ id="rect16704"
+ style="opacity:1;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="31"
+ x="-80"
+ height="1"
+ width="1"
+ id="rect16706"
+ style="opacity:1;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="33"
+ x="-80"
+ height="1"
+ width="1"
+ id="rect16708"
+ style="opacity:1;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="35"
+ x="-80"
+ height="1"
+ width="1"
+ id="rect16710"
+ style="opacity:1;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="35"
+ x="-78"
+ height="1"
+ width="1"
+ id="rect16712"
+ style="opacity:1;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="35"
+ x="-76"
+ height="1"
+ width="1"
+ id="rect16714"
+ style="opacity:1;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="35"
+ x="-74"
+ height="1"
+ width="1"
+ id="rect16716"
+ style="opacity:1;fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ id="g29859"
+ inkscape:label="stock-tool-by-color-select">
+ <rect
+ ry="0"
+ rx="1.9277459"
+ y="237"
+ x="181.0002"
+ height="16"
+ width="16"
+ id="rect22454"
+ style="fill:none;stroke:none" />
+ <rect
+ ry="0.5"
+ rx="0"
+ transform="translate(241.0002,217)"
+ y="20"
+ x="-56"
+ height="1"
+ width="1"
+ id="rect29813"
+ style="fill:#bebebe;stroke:none;fill-opacity:1" />
+ <rect
+ rx="0.088388354"
+ ry="0"
+ y="237"
+ x="187.0002"
+ height="1"
+ width="1"
+ id="rect29815"
+ style="fill:#bebebe;stroke:none;fill-opacity:1" />
+ <rect
+ style="fill:#bebebe;stroke:none;fill-opacity:1"
+ id="rect29817"
+ width="1"
+ height="1"
+ x="189.0002"
+ y="237"
+ ry="0"
+ rx="0.088388354" />
+ <rect
+ rx="0.088388354"
+ ry="0"
+ y="237"
+ x="191.0002"
+ height="1"
+ width="1"
+ id="rect29819"
+ style="fill:#bebebe;stroke:none;fill-opacity:1" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect29821"
+ width="1.0000017"
+ height="1"
+ x="193.0002"
+ y="237"
+ ry="0"
+ rx="0.088388354" />
+ <rect
+ rx="0.088388354"
+ ry="0"
+ y="239"
+ x="193.0002"
+ height="1"
+ width="1.0000017"
+ id="rect29823"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="scale(1,-1)"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect29825"
+ width="1.0000017"
+ height="1"
+ x="193.0002"
+ y="-242"
+ ry="0"
+ rx="0.088388354" />
+ <rect
+ rx="0.088388346"
+ ry="0"
+ y="-244"
+ x="193.0002"
+ height="1"
+ width="1.0000017"
+ id="rect29827"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ transform="scale(1,-1)" />
+ <rect
+ transform="scale(1,-1)"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect29829"
+ width="1.0000017"
+ height="1"
+ x="193.0002"
+ y="-246"
+ ry="0"
+ rx="0.088388346" />
+ <rect
+ rx="0.088388346"
+ ry="0"
+ y="-242"
+ x="183.0002"
+ height="1"
+ width="1.0000017"
+ id="rect29831"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ transform="scale(1,-1)" />
+ <rect
+ transform="scale(1,-1)"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect29833"
+ width="1.0000017"
+ height="1"
+ x="183.0002"
+ y="-240"
+ ry="0"
+ rx="0.088388346" />
+ <rect
+ rx="0.088388346"
+ ry="0"
+ y="-238"
+ x="183.0002"
+ height="1"
+ width="1.0000017"
+ id="rect29835"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ transform="scale(1,-1)" />
+ <path
+ transform="matrix(1.6666672,0,0,1.6666672,276.00023,202.33332)"
+ d="m -51,23.5 c 0,0.828427 -0.671573,1.5 -1.5,1.5 -0.828427,0 -1.5,-0.671573 -1.5,-1.5 0,-0.828427 0.671573,-1.5 1.5,-1.5 0.828427,0 1.5,0.671573 1.5,1.5 z"
+ sodipodi:ry="1.5"
+ sodipodi:rx="1.5"
+ sodipodi:cy="23.5"
+ sodipodi:cx="-52.5"
+ id="path29837"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ sodipodi:type="arc" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path29839"
+ d="m 192.5002,248 c -1.37479,0 -2.5,1.13646 -2.5,2.525 0,1.38854 1.12521,2.525 2.5,2.525 1.37479,0 2.5,-1.13646 2.5,-2.525 0,-1.38854 -1.12521,-2.525 -2.5,-2.525 z m 0,1.01 c 0.83436,0 1.5,0.6723 1.5,1.515 0,0.8427 -0.66564,1.515 -1.5,1.515 -0.83436,0 -1.5,-0.6723 -1.5,-1.515 0,-0.8427 0.66564,-1.515 1.5,-1.515 z"
+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans" />
+ <path
+ transform="matrix(1.25,0,0,1.25,255.5002,210.5)"
+ d="m -54,32 c 0,1.104569 -0.895431,2 -2,2 -1.104569,0 -2,-0.895431 -2,-2 0,-1.104569 0.895431,-2 2,-2 1.104569,0 2,0.895431 2,2 z"
+ sodipodi:ry="2"
+ sodipodi:rx="2"
+ sodipodi:cy="32"
+ sodipodi:cx="-56"
+ id="path29841"
+ style="fill:#bebebe;fill-opacity:1;stroke:none;opacity:0.3"
+ sodipodi:type="arc" />
+ <rect
+ rx="0.088388346"
+ ry="0"
+ y="-244"
+ x="183.0002"
+ height="1"
+ width="1.0000017"
+ id="rect29843"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ transform="scale(1,-1)" />
+ <rect
+ transform="scale(1,-1)"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect29845"
+ width="1.0000017"
+ height="1"
+ x="183.0002"
+ y="-246"
+ ry="0"
+ rx="0.088388346" />
+ <rect
+ rx="0.088388346"
+ ry="0"
+ y="-246"
+ x="185.0002"
+ height="1"
+ width="1.0000017"
+ id="rect29847"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ transform="scale(1,-1)" />
+ <rect
+ transform="scale(1,-1)"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect29849"
+ width="1.0000017"
+ height="1"
+ x="187.0002"
+ y="-246"
+ ry="0"
+ rx="0.088388346" />
+ <rect
+ rx="0.088388346"
+ ry="0"
+ y="-246"
+ x="189.0002"
+ height="1"
+ width="1.0000017"
+ id="rect29851"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ transform="scale(1,-1)" />
+ <rect
+ transform="scale(1,-1)"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect29853"
+ width="1.0000017"
+ height="1"
+ x="191.0002"
+ y="-246"
+ ry="0"
+ rx="0.088388346" />
+ </g>
+ <g
+ id="g4682"
+ inkscape:label="stock-tool-free-select">
+ <rect
+ rx="0"
+ transform="translate(241.0002,217)"
+ y="40"
+ x="-200"
+ height="16"
+ width="16"
+ style="fill:none;stroke:none"
+ id="rect4684" />
+ <path
+ id="path4672"
+ transform="translate(241.0002,217)"
+ d="M -190.875 40.5 C -191.36524 40.496 -191.8913 40.52963 -192.40625 40.59375 C -196.52587 41.10715 -199.6932 43.7071 -199.5 46.40625 C -199.3068 49.1054 -195.83837 50.85713 -191.71875 50.34375 C -187.59913 49.83035 -184.40055 47.23041 -184.59375 44.53125 C -184.7628 42.1695 -187.44334 40.53212 -190.875 40.5 z M -191.0625 42 C -189.68309 42.0113 -188.46628 42.31205 -187.5625 42.8125 C -186.65871 43.31295 -186.06795 44.01311 -186 44.84375 C -185.84468 46.74236 -188.40686 48.57637 -191.71875 48.9375 C -195.03064 49.29863 -197.84468 48.05486 -198 46.15625 C -198.15532 44.25764 -195.59314 42.42363 -192.28125 42.0625 C -191.86726 42.0174 -191.45662 41.9968 -191.0625 42 z "
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4660"
+ d="m 45.0002,264 c -1.10457,0 -2,0.89543 -2,2 0,1.10457 0.89543,2 2,2 1.10457,0 2,-0.89543 2,-2 0,-1.10457 -0.89543,-2 -2,-2 z m 0,1 c 0.55228,0 1,0.44772 1,1 0,0.55228 -0.44772,1 -1,1 -0.55228,0 -1,-0.44772 -1,-1 0,-0.55228 0.44772,-1 1,-1 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path4664"
+ d="m 45.0002,267 c 0,0 4.40625,3 0,6 l 2.03125,0 c 3.65625,-2.54511 -0.01563,-6 -0.01563,-6 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ id="g4870"
+ inkscape:label="stock-tool-ellipse-select">
+ <rect
+ transform="translate(241.0002,217)"
+ y="40"
+ x="-180"
+ height="16"
+ width="16"
+ id="rect4708"
+ style="fill:none;fill-opacity:1;stroke:none" />
+ <path
+ transform="matrix(0.83333356,0,0,0.75,212.33357,229)"
+ d="m -166,48 c 0,2.209139 -2.68629,4 -6,4 -3.31371,0 -6,-1.790861 -6,-4 0,-2.209139 2.68629,-4 6,-4 3.31371,0 6,1.790861 6,4 z"
+ sodipodi:ry="4"
+ sodipodi:rx="6"
+ sodipodi:cy="48"
+ sodipodi:cx="-172"
+ id="path4710"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ sodipodi:type="arc" />
+ <path
+ transform="translate(241.0002,217)"
+ sodipodi:nodetypes="cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
+ inkscape:connector-curvature="0"
+ id="path4760"
+ d="m -172,42 c -0.33893,0 -0.67129,0.03136 -1,0.0625 l 0,1 c 0.33033,-0.03666 0.6554,-0.0625 1,-0.0625 z m 1,0.0625 0,1 c 0.34825,0.0357 0.67022,0.116808 1,0.1875 l 0,-1.03125 c -0.3282,-0.06354 -0.65694,-0.124015 -1,-0.15625 z m -3,0.125 c -0.34262,0.06635 -0.67761,0.15236 -1,0.25 l 0,1.0625 c 0.32247,-0.109721 0.6537,-0.204691 1,-0.28125 z m 5,0.28125 0,1.03125 c 0.35597,0.1208 0.67996,0.277599 1,0.4375 l 0,-1.125 c -0.31848,-0.136641 -0.6556,-0.239896 -1,-0.34375 z m -7,0.34375 c -0.35696,0.155266 -0.68046,0.338085 -1,0.53125 l 0,1.1875 c 0.30947,-0.227085 0.63617,-0.442712 1,-0.625 z m 9,0.5 0,1.21875 c 0.37827,0.275423 0.71787,0.575609 1,0.90625 l 0,-1.40625 c -0.30538,-0.257891 -0.63855,-0.50472 -1,-0.71875 z m 1,7.25 c -0.28218,0.334433 -0.62081,0.66046 -1,0.9375 l 0,1.1875 c 0.35999,-0.216071 0.6951,-0.459896 1,-0.71875 z m -11,0.9375 0,1.15625 c 0.3196,0.193115 0.6429,0.376009 1,0.53125 l 0,-1.0625 c -0.36558,-0.183046 -0.68997,-0.396016 -1,-0.625 z m 9,0.59375 c -0.31199,0.156312 -0.65518,0.287157 -1,0.40625 l 0,1.0625 c 0.34848,-0.106694 0.67723,-0.234604 1,-0.375 z m -7,0.4375 0,1.03125 c 0.3255,0.09898 0.65476,0.183495 1,0.25 l 0,-1 c -0.35191,-0.07437 -0.67387,-0.169683 -1,-0.28125 z m 5,0.25 c -0.32714,0.07088 -0.65646,0.118704 -1,0.15625 l 0,1 c 0.34283,-0.03893 0.66861,-0.09062 1,-0.15625 z m -3,0.15625 0,1 c 0.32906,0.03092 0.65976,0.0625 1,0.0625 l 0,-1 c -0.34065,0 -0.67236,-0.02891 -1,-0.0625 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ id="g4917"
+ inkscape:label="stock-tool-brightness-contrast"
+ transform="translate(-40,20)">
+ <rect
+ transform="translate(241.0002,217)"
+ y="40"
+ x="-160"
+ height="16"
+ width="16"
+ id="rect4894"
+ style="fill:none;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4903"
+ d="m 89.0002,258 c -3.865988,0 -7,3.13401 -7,7 0,3.86599 3.134012,7 7,7 3.865988,0 7,-3.13401 7,-7 0,-3.86599 -3.134012,-7 -7,-7 z m 0,1.4 c 3.092797,0 5.6,2.50721 5.6,5.6 0,3.09279 -2.507203,5.6 -5.6,5.6 l 0,-11.2 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ id="g5049"
+ inkscape:label="stock-tool-color-balance">
+ <rect
+ transform="translate(241.0002,217)"
+ y="60"
+ x="-180"
+ height="16"
+ width="16"
+ id="rect4940"
+ style="fill:none;fill-opacity:1;stroke:none" />
+ <rect
+ y="280"
+ x="72.000198"
+ height="1"
+ width="3.9999969"
+ id="rect4942"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="285"
+ x="62.000198"
+ height="1"
+ width="4.0000014"
+ id="rect4944"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect4946"
+ width="2.0000017"
+ height="1"
+ x="62.000198"
+ y="290" />
+ <rect
+ y="284"
+ x="67.000198"
+ height="3"
+ width="6"
+ id="rect5016"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect5018"
+ width="6"
+ height="3"
+ x="65.000198"
+ y="279" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect5018-3"
+ d="m 65.0002,289 0,3 6,0 0,-3 -6,0 z m 1,1 4,0 0,1 -4,0 0,-1 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none;display:inline" />
+ <rect
+ y="285"
+ x="74.000198"
+ height="1"
+ width="1.9999983"
+ id="rect5038"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="290"
+ x="72.000198"
+ height="1"
+ width="3.9999983"
+ id="rect5043"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="280"
+ x="62.000198"
+ height="1"
+ width="2.0000017"
+ id="rect5047"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ id="g5075"
+ inkscape:label="stock-color-colorize">
+ <rect
+ transform="translate(241.0002,217)"
+ y="60"
+ x="-160"
+ height="16"
+ width="16"
+ id="rect5061"
+ style="fill:none;fill-opacity:1;stroke:none" />
+ <rect
+ rx="1"
+ ry="1"
+ y="277"
+ x="83.000198"
+ height="4"
+ width="10.99999"
+ id="rect5063"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ ry="0"
+ rx="1"
+ y="279"
+ x="92.000198"
+ height="1"
+ width="4"
+ id="rect5065"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ ry="1"
+ rx="1"
+ y="279"
+ x="95.000198"
+ height="5"
+ width="0.99999839"
+ id="rect5067"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ ry="1"
+ rx="1"
+ y="283"
+ x="86.000198"
+ height="1"
+ width="10"
+ id="rect5069"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ ry="0"
+ rx="1"
+ y="283"
+ x="86.000198"
+ height="4"
+ width="1.0000017"
+ id="rect5071"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ ry="0"
+ rx="1"
+ y="287"
+ x="85.000198"
+ height="6"
+ width="3.0000017"
+ id="rect5073"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ id="g5125"
+ inkscape:label="stock-tool-curves">
+ <rect
+ ry="0"
+ rx="1"
+ transform="translate(241.0002,217)"
+ y="60"
+ x="-140"
+ height="16"
+ width="16"
+ id="rect5103"
+ style="fill:none;fill-opacity:1;stroke:none" />
+ <path
+ id="rect5105"
+ transform="translate(241.0002,217)"
+ d="M -139 61 L -139 75 L -125 75 L -125 61 L -139 61 z M -138 62 L -126 62 L -126 74 L -138 74 L -138 62 z "
+ style="fill:#bebebe;stroke:none;stroke-opacity:1;fill-opacity:1" />
+ <path
+ id="path5110"
+ transform="translate(241.0002,217)"
+ d="M -125.625 63.25 C -126.68731 66.8739 -127.68972 68.75117 -128.4375 69.46875 C -128.81139 69.82754 -129.08358 69.89401 -129.34375 69.875 C -129.60392 69.856 -129.90714 69.69321 -130.25 69.40625 C -130.93571 68.83233 -131.65041 67.78787 -132.40625 66.90625 C -132.78417 66.46544 -133.18304 66.06093 -133.625 65.78125 C -134.06696 65.50157 -134.61699 65.3515 -135.15625 65.53125 C -136.01269 65.81673 -136.59249 66.55259 -137.03125 67.40625 C -137.47001 68.25991 -137.78709 69.24908 -138 70.21875 C -138.42582 72.15808 -138.5 73.96875 -138.5 73.96875 L -137.5 74.03125 C -137.5 74.03125 -137.4346 72.27456 -137.03125 70.4375 C -136.82957 69.51897 -136.53155 68.57394 -136.15625 67.84375 C -135.78095 67.11356 -135.32895 66.63049 -134.84375 66.46875 C -134.63301 66.39855 -134.44499 66.44225 -134.15625 66.625 C -133.86751 66.80772 -133.53799 67.15368 -133.1875 67.5625 C -132.48652 68.38013 -131.73896 69.4644 -130.875 70.1875 C -130.44302 70.54905 -129.96963 70.83384 -129.40625 70.875 C -128.84287 70.9162 -128.26538 70.68206 -127.75 70.1875 C -126.8235 69.298421 -125.94996 67.542089 -125 64.53125 L -125 63.4375 L -125.625 63.25 z "
+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans" />
+ </g>
+ <g
+ id="g5181"
+ inkscape:label="stock-tool-desaturate">
+ <rect
+ style="fill:none;stroke:none"
+ id="rect5151"
+ width="16"
+ height="16"
+ x="121.0002"
+ y="277"
+ rx="1"
+ ry="0" />
+ <path
+ sodipodi:nodetypes="cccccccccc"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ d="m 122.0002,278 0,14 14,0 0,-14 z m 1,1 12,0 0,12 -12,0 z"
+ id="path5153"
+ inkscape:connector-curvature="0" />
+ <path
+ sodipodi:nodetypes="cccccccc"
+ inkscape:connector-curvature="0"
+ id="rect5166"
+ transform="translate(241.0002,217)"
+ d="m -118,62 12,10 0,0 z m 0,2 6,5 6,5 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ transform="translate(241.0002,217)"
+ inkscape:connector-curvature="0"
+ id="path5169"
+ d="m -118,74 0,-9 11,9 z"
+ style="fill:#bebebe;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1;opacity:0.29999999999999999" />
+ <path
+ style="opacity:1;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 135.0002,279 0,9 -11,-9 z"
+ id="path5171"
+ inkscape:connector-curvature="0" />
+ </g>
+ <g
+ id="g5233"
+ inkscape:label="stock-tool-hue-saturation">
+ <rect
+ rx="0"
+ transform="translate(241.0002,217)"
+ y="60"
+ x="-100"
+ height="16"
+ width="16"
+ id="rect5188"
+ style="fill:none;fill-opacity:1;stroke:none" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path5194"
+ d="m 144.0002,277 3,4 3,-4 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ sodipodi:nodetypes="cccc"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ d="m 144.0002,293 3,-4 3,4 z"
+ id="path5196"
+ inkscape:connector-curvature="0" />
+ <path
+ sodipodi:nodetypes="cccccccccc"
+ inkscape:connector-curvature="0"
+ id="rect5198"
+ d="m 142.0002,282 0,6 14,0 0,-6 z m 1,1 12,0 0,4 -12,0 c 0,-1.2 0,-0.2 0,-4 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="283"
+ x="147.0002"
+ height="4.0000048"
+ width="2.9999983"
+ id="rect5201"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="284"
+ x="146.0002"
+ height="1"
+ width="1"
+ id="rect5203"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="286"
+ x="146.0002"
+ height="1"
+ width="1"
+ id="rect5205"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="283"
+ x="153.0002"
+ height="4.0000162"
+ width="1.9999499"
+ id="rect5211"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="285"
+ x="152.0002"
+ height="1"
+ width="1"
+ id="rect5213"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect5217"
+ width="1"
+ height="1"
+ x="152.0002"
+ y="283" />
+ <rect
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect5219"
+ width="1"
+ height="1"
+ x="145.0002"
+ y="285" />
+ <rect
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect5221"
+ width="1"
+ height="1"
+ x="145.0002"
+ y="283" />
+ <rect
+ transform="scale(1,-1)"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect5223"
+ width="1.0000017"
+ height="1"
+ x="151.0002"
+ y="-287" />
+ <rect
+ y="-285"
+ x="151.0002"
+ height="1"
+ width="1.0000017"
+ id="rect5225"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ transform="scale(1,-1)" />
+ <rect
+ transform="scale(1,-1)"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect5227"
+ width="1.0000017"
+ height="1"
+ x="150.0002"
+ y="-284" />
+ <rect
+ y="-286"
+ x="150.0002"
+ height="1"
+ width="1.0000017"
+ id="rect5229"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ transform="scale(1,-1)" />
+ </g>
+ <g
+ id="g5220"
+ inkscape:label="stock-tool-levels">
+ <rect
+ transform="translate(241.0002,217)"
+ y="60"
+ x="-80"
+ height="16"
+ width="16"
+ id="rect4433"
+ style="fill:none;fill-opacity:1;stroke:none" />
+ <path
+ id="rect5204"
+ transform="translate(241.0002,217)"
+ d="M -79 61 L -79 75 L -65 75 L -65 61 L -79 61 z M -78 62 L -66 62 L -66 74 L -78 74 L -78 62 z "
+ style="fill:#bebebe;stroke:none;fill-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccccccccccccccccccccc"
+ inkscape:connector-curvature="0"
+ id="path5209"
+ d="m 164.0002,282 1,-1 0,5 1,-2 1,2 0,-4 1,0 0,1 1,1 0,1 1,1 1,-1 0,-2 1,1 0,0 0,-4 1,1 0,2 1,1 0,4 -10,0 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect5216"
+ width="10.000002"
+ height="1"
+ x="164.0002"
+ y="289" />
+ </g>
+ <g
+ id="g5386"
+ inkscape:label="stock-tool-posterize">
+ <rect
+ transform="translate(241.0002,217)"
+ y="60"
+ x="-60"
+ height="16"
+ width="16"
+ id="rect5245"
+ style="opacity:0.29999999999999999;fill:none;fill-opacity:1;stroke:none" />
+ <rect
+ transform="scale(-1,1)"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect5249"
+ width="2.0000033"
+ height="2"
+ x="-186.0002"
+ y="283" />
+ <rect
+ y="280"
+ x="184.0002"
+ height="3"
+ width="3.0000017"
+ id="rect5265"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect5267"
+ d="m 182.0002,278 0,14 14,0 0,-14 -14,0 z m 1,1 12,0 0,12 -12,0 0,-12 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="matrix(0,-1,-1,0,0,0)"
+ style="opacity:1;fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect5286"
+ width="3"
+ height="3.0000017"
+ x="-283"
+ y="-194.0002" />
+ <rect
+ transform="matrix(0,1,-1,0,0,0)"
+ y="-189.0002"
+ x="280"
+ height="2.0000017"
+ width="2"
+ id="rect5353"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect5355"
+ width="2.0000017"
+ height="3"
+ x="192.0002"
+ y="285" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect5373"
+ width="2"
+ height="1.9999983"
+ x="283"
+ y="-191.0002"
+ transform="matrix(0,1,-1,0,0,0)" />
+ <rect
+ transform="matrix(0,-1,-1,0,0,0)"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect5375"
+ width="2"
+ height="2.0000017"
+ x="-290"
+ y="-194.0002" />
+ <rect
+ y="-190.00113"
+ x="-288"
+ height="2.9999833"
+ width="3"
+ id="rect5377"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none"
+ transform="matrix(3.3046512e-6,-1,-1,0,0,0)" />
+ <rect
+ transform="matrix(0,-1,-1,0,0,0)"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect5379"
+ width="2"
+ height="3"
+ x="-285"
+ y="-189.0002" />
+ <rect
+ transform="matrix(0,1,-1,0,0,0)"
+ y="-192.0002"
+ x="288"
+ height="1.9999983"
+ width="2"
+ id="rect5382"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ style="opacity:1;fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect5384"
+ width="3.0000017"
+ height="3"
+ x="184.0002"
+ y="287" />
+ </g>
+ <g
+ id="g5464"
+ inkscape:label="stock-tool-treshold"
+ transform="translate(-160,20)">
+ <rect
+ y="277"
+ x="201.0002"
+ height="16"
+ width="16"
+ id="rect5420"
+ style="fill:none;stroke:none" />
+ <rect
+ y="287"
+ x="202.0002"
+ height="1"
+ width="14"
+ id="rect5422"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path5424"
+ d="m 204.0002,289 -2,3 4,0 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path5424-6"
+ d="m 214.0002,289 -2,3 4,0 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none;display:inline" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect5444"
+ d="m 202.0002,277 0,8 14,0 0,-8 -14,0 z m 1,1 12,0 0,6 -12,0 0,-6 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ sodipodi:nodetypes="ccccccccccccccccccccccc"
+ inkscape:connector-curvature="0"
+ id="path5449"
+ d="m 203.0002,284 0.625,-0.53125 0.375,-0.46875 1,0 0,0 1,-1 1,0 1,1 1,0 0.46875,1 0.90625,0 0.625,-1 1,-1 0,-1 0,0 0,0 0,0 1,1 1,1 0,0 1,0.40625 0,0.59375 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer10"
+ inkscape:label="preferences">
+ <text
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;display:inline;font-family:Droid Sans"
+ x="-5.176805"
+ y="-51.054993"
+ id="text17376"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan17378"
+ x="-5.176805"
+ y="-51.054993">preferences</tspan></text>
+ <g
+ id="g67595"
+ inkscape:label="preferences-display">
+ <rect
+ rx="0"
+ y="-40"
+ x="-5"
+ height="16"
+ width="16"
+ id="rect28186-4"
+ style="fill:none;stroke:none" />
+ <path
+ sodipodi:nodetypes="sssscscccccscsscsssscssss"
+ inkscape:connector-curvature="0"
+ id="rect28283-2"
+ d="M -3.8125,-38 C -4.46695,-38 -5,-37.47791 -5,-36.8125 l 0,7.625 C -5,-28.52209 -4.46695,-28 -3.8125,-28 l 7.5625,0 5.9375,0 c 0.633474,0 1.279835,-0.365187 1.3125,-1 l 0,0 -0.0625,-4 0.0625,-4 0,0 c -0.03266,-0.634813 -0.679026,-1 -1.3125,-1 L 3.75,-38 z m 1,1 5.8125,0 5.65625,0 C 9.3107,-37 10,-36.66541 10,-36 l 0,6 c 0,0.66541 -0.6893,1 -1.34375,1 L 3,-29 -2.8125,-29 C -3.46695,-29 -4,-29.52209 -4,-30.1875 l 0,-5.625 C -4,-36.47791 -3.46695,-37 -2.8125,-37 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ ry="1.1962026"
+ rx="1.1962026"
+ y="-27"
+ x="-2"
+ height="2"
+ width="10"
+ id="rect28290-7"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ ry="0"
+ rx="1.1962026"
+ y="-36"
+ x="-2"
+ height="6"
+ width="2"
+ id="rect67589"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect67591"
+ width="2"
+ height="6"
+ x="2"
+ y="-36"
+ rx="1.1962026"
+ ry="0" />
+ <rect
+ ry="0"
+ rx="1.1962026"
+ y="-36"
+ x="6"
+ height="6"
+ width="2"
+ id="rect67593"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ id="g28616"
+ inkscape:label="preferences-folders">
+ <path
+ sodipodi:nodetypes="ccccccccccsccccccccccc"
+ id="rect3845"
+ d="M 15.53125,-40 C 15.24212,-40 15,-39.75788 15,-39.46875 l 0,14.93755 C 15,-24.2327 15.23264,-24 15.53125,-24 l 14.9375,0 C 30.76735,-24 31,-24.2326 31,-24.5312 l 0,-9.9376 C 31,-34.7579 30.75788,-35 30.46875,-35 L 18,-35 l 0,8.5 c 0,0.277 -0.223,0.5 -0.5,0.5 -0.277,0 -0.5,-0.223 -0.5,-0.5 l 0,-9 c 0,-0.277 0.223,-0.5 0.5,-0.5 l 2.96875,0 8.53125,0 0,-1.4062 C 29,-37.7334 28.73334,-38 28.40625,-38 L 21,-38 21,-39.46875 C 21,-39.7579 20.75788,-40 20.46875,-40 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none;display:inline"
+ inkscape:connector-curvature="0" />
+ <rect
+ y="-40"
+ x="15"
+ height="16"
+ width="16"
+ id="rect14152"
+ style="color:#bebebe;fill:none;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ </g>
+ <g
+ id="g14381"
+ inkscape:label="folders-brushes">
+ <g
+ transform="translate(20,0)"
+ id="g7144"
+ inkscape:label="preferences-folders">
+ <g
+ style="display:inline"
+ transform="translate(-192.9998,-1036)"
+ inkscape:label="folder"
+ id="g7146">
+ <path
+ sodipodi:nodetypes="sssssssscsssssccsccssscssssccssssccssssccssssccccscccccccccc"
+ inkscape:connector-curvature="0"
+ id="path7149"
+ transform="translate(172.9998,1036)"
+ d="M 35.53125,-40 C 35.24212,-40 35,-39.75788 35,-39.46875 l 0,14.9375 C 35,-24.23275 35.23264,-24 35.53125,-24 l 14.9375,0 C 50.76735,-24 51,-24.23265 51,-24.53125 l 0,-9.9375 C 51,-34.75785 50.75788,-35 50.46875,-35 L 38,-35 l 0,8.5 c 0,0.277 -0.223,0.5 -0.5,0.5 -0.277,0 -0.5,-0.223 -0.5,-0.5 l 0,-9 c 0,-0.277 0.223,-0.5 0.5,-0.5 l 2.96875,0 8.53125,0 0,-1.40625 C 49,-37.73345 48.733264,-38.007036 48.40625,-38 L 41,-38 41,-39.46875 C 41,-39.7579 40.75788,-40 40.46875,-40 z M 41,-34 l 0,0.5625 C 41,-33.192664 41.216234,-33 41.46875,-33 l 0.0625,0 C 41.783766,-33 42,-33.192664 42,-33.4375 L 42,-34 l 1,0 0,0.5625 C 43,-33.192664 43.216234,-33 43.46875,-33 l 0.0625,0 C 43.783766,-33 44,-33.192664 44,-33.4375 L 44,-34 l 1,0 0,0.5625 C 45,-33.192664 45.216234,-33 45.46875,-33 l 0.0625,0 C 45.783766,-33 46,-33.192664 46,-33.4375 L 46,-34 l 1,0 0,0.5625 C 47,-33.192664 47.216234,-33 47.46875,-33 l 0.0625,0 C 47.783766,-33 48,-33.192664 48,-33.4375 L 48,-34 c 0.554,0 1.021427,0.446415 1,1 l 0,3 -9,0 0,-3 c 0,-0.554 0.446,-1 1,-1 z m -1,5 9,0 -1,2 -2,0 0,2 -3,0 0,-2 -2,0 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none;display:inline" />
+ <rect
+ style="color:#bebebe;fill:none;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect7151"
+ width="16"
+ height="16"
+ x="207.9998"
+ y="996" />
+ </g>
+ </g>
+ </g>
+ <g
+ id="g28479"
+ inkscape:label="folders-fonts">
+ <rect
+ style="color:#bebebe;fill:none;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect14414"
+ width="16"
+ height="16"
+ x="55"
+ y="-40" />
+ <path
+ sodipodi:nodetypes="sssssssscsssssccsscsssccccccccssccccccccsssccs"
+ inkscape:connector-curvature="0"
+ id="path14416"
+ d="M 55.53125,-40 C 55.24212,-40 55,-39.75785 55,-39.46875 l 0,14.9375 C 55,-24.23275 55.23264,-24 55.53125,-24 l 14.9375,0 C 70.76735,-24 71,-24.23265 71,-24.53125 l 0,-9.9375 C 71,-34.75775 70.75788,-35 70.46875,-35 L 58,-35 l 0,8.5 c 0,0.277 -0.223,0.5 -0.5,0.5 -0.277,0 -0.5,-0.223 -0.5,-0.5 l 0,-9 c 0,-0.277 0.223,-0.5 0.5,-0.5 l 2.96875,0 8.53125,0 0,-1.40625 C 69,-37.73335 68.73334,-38 68.40625,-38 L 61,-38 61,-39.46875 C 61,-39.75785 60.75788,-40 60.46875,-40 z M 62,-34 l 3.90625,0.03125 0.0625,0 c 0.551829,0.04493 1.099741,0.271151 1.46875,0.625 C 67.806506,-32.989919 68,-32.518643 68,-32 l 0,5 0,2 -0.75,0 -5.25,0 c -3,0 -3,-6 0,-6 l 2,0 2,0 -0.03125,-0.25 c -3.77e-4,-0.02141 8.77e-4,-0.04249 0,-0.0625 -0.01157,-0.26362 -0.132627,-0.4174 -0.21875,-0.5 C 65.6574,-31.90126 65.534995,-31.9818 65.3125,-32 L 62,-32 z m 1,5 c -0.554,0 -1,0.446 -1,1 0,0.554 0.446,1 1,1 l 3,0 0,-2 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none;display:inline" />
+ </g>
+ <g
+ id="g28585"
+ inkscape:label="folders-gradients">
+ <rect
+ style="color:#bebebe;fill:none;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect28489"
+ width="16"
+ height="16"
+ x="75"
+ y="-40" />
+ <path
+ sodipodi:nodetypes="sssssssscsssssccsscsssccccc"
+ inkscape:connector-curvature="0"
+ id="path28491"
+ d="M 75.53125,-40 C 75.24212,-40 75,-39.75788 75,-39.46875 l 0,14.9375 C 75,-24.23275 75.23264,-24 75.53125,-24 l 14.9375,0 C 90.76735,-24 91,-24.23265 91,-24.53125 l 0,-9.9375 C 91,-34.75785 90.75788,-35 90.46875,-35 L 78,-35 l 0,8.5 c 0,0.277 -0.223,0.5 -0.5,0.5 -0.277,0 -0.5,-0.223 -0.5,-0.5 l 0,-9 c 0,-0.277 0.223,-0.5 0.5,-0.5 l 2.96875,0 8.53125,0 0,-1.40625 C 89,-37.73345 88.73334,-38 88.40625,-38 L 81,-38 81,-39.46875 C 81,-39.7579 80.75788,-40 80.46875,-40 z M 79,-33 l 11,0 0,6 -11,0 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none;display:inline" />
+ <rect
+ y="-32"
+ x="82"
+ height="4.0000048"
+ width="2.9999983"
+ id="rect5201-2"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="-31"
+ x="81"
+ height="1"
+ width="1"
+ id="rect5203-1"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="-29"
+ x="81"
+ height="1"
+ width="1"
+ id="rect5205-2"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="-32"
+ x="88"
+ height="4"
+ width="1"
+ id="rect5211-0"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="-30"
+ x="87"
+ height="1"
+ width="1"
+ id="rect5213-2"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect5217-9"
+ width="1"
+ height="1"
+ x="87"
+ y="-32" />
+ <rect
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect5219-6"
+ width="1"
+ height="1"
+ x="80"
+ y="-30" />
+ <rect
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect5221-0"
+ width="1"
+ height="1"
+ x="80"
+ y="-32" />
+ <rect
+ transform="scale(1,-1)"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect5223-8"
+ width="1.0000017"
+ height="1"
+ x="86"
+ y="28" />
+ <rect
+ y="30"
+ x="86"
+ height="1"
+ width="1.0000017"
+ id="rect5225-7"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ transform="scale(1,-1)" />
+ <rect
+ transform="scale(1,-1)"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect5227-6"
+ width="1.0000017"
+ height="1"
+ x="85"
+ y="31" />
+ <rect
+ y="29"
+ x="85"
+ height="1"
+ width="1.0000017"
+ id="rect5229-4"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ transform="scale(1,-1)" />
+ </g>
+ <g
+ id="g28743"
+ inkscape:label="window-management">
+ <rect
+ y="-20"
+ x="-5"
+ height="16"
+ width="16"
+ id="rect28728"
+ style="opacity:0.3;fill:none;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect28730"
+ d="m -5,-20 0,11 4,0 0,-6 7,0 0,-5 -11,0 z m 1,1 9,0 0,1 -9,0 0,-1 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect28732"
+ d="m 0,-14 0,10 11,0 0,-10 -11,0 z m 1,1 9,0 0,1 -9,0 0,-1 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ id="g28886"
+ inkscape:label="preferences-toolbox">
+ <path
+ sodipodi:nodetypes="sccccccssccccss"
+ inkscape:connector-curvature="0"
+ id="path3908-63"
+ d="m 26.619111,-19.881678 c 0.389664,-0.101474 0.790724,-0.110768 1.17065,-0.08086 l -1.359697,2.305898 c -0.279422,0.473856 -0.122751,1.070712 0.353774,1.34773 l 0.874307,0.508248 c 0.476518,0.276998 1.07741,0.120517 1.356831,-0.353339 l 1.359698,-2.305898 c 0.21223,0.314297 0.400344,0.666111 0.501942,1.053167 0.486289,1.852561 -0.631432,3.748078 -2.496498,4.233768 -0.389665,0.101475 -0.790726,0.110769 -1.170647,0.08088 l -0.802126,1.114608 -3.409723,-0.02252 c 0,0 1.518597,-2.57735 1.62694,-2.594723 -0.212228,-0.314298 -0.400341,-0.666111 -0.501941,-1.053168 -0.48629,-1.852561 0.631426,-3.748097 2.49649,-4.233787 z"
+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans" />
+ <rect
+ y="-20"
+ x="15"
+ height="16"
+ width="16"
+ id="rect5386"
+ style="fill:none;stroke:none" />
+ <path
+ sodipodi:nodetypes="cccccccccccccccccccccccccc"
+ inkscape:connector-curvature="0"
+ id="rect28823"
+ d="m 15,-12 0,8 16,0 0,-8 z m 4,1 2,0 0,2 4,0 0,-2 2,0 0,2 3,0 0,1 -3,0 0,1.96875 -2,0 L 25,-8 l -4,0 0,1.96875 -2,0 L 19,-8 16,-8 16,-8.984375 19,-9 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ id="g29022"
+ inkscape:label="folders-patterns">
+ <rect
+ y="-40.03125"
+ x="95.0625"
+ height="16"
+ width="16"
+ id="rect28947"
+ style="color:#bebebe;fill:none;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ style="fill:#bebebe;fill-opacity:1;stroke:none;display:inline"
+ d="m 95.59375,-40.03125 c -0.28913,0 -0.53125,0.24212 -0.53125,0.53125 l 0,14.9375 c 0,0.2985 0.23264,0.53125 0.53125,0.53125 l 14.9375,0 c 0.2986,0 0.53125,-0.23265 0.53125,-0.53125 l 0,-9.9375 c 0,-0.2891 -0.24212,-0.53125 -0.53125,-0.53125 l -12.46875,0 0,8.5 c 0,0.277 -0.223,0.5 -0.5,0.5 -0.277,0 -0.5,-0.223 -0.5,-0.5 l 0,-9 c 0,-0.277 0.223,-0.5 0.5,-0.5 l 2.96875,0 8.53125,0 0,-1.40625 c 0,-0.3272 -0.26666,-0.59375 -0.59375,-0.59375 l -7.40625,0 0,-1.46875 c 0,-0.28915 -0.24212,-0.53125 -0.53125,-0.53125 z m 3.46875,7 11,0 0,6 -11,0 z"
+ id="path28949"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="sssssssscsssssccsscsssccccc" />
+ <rect
+ y="-29"
+ x="106"
+ height="1"
+ width="1"
+ id="rect28998"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="-31"
+ x="104"
+ height="1"
+ width="1"
+ id="rect29000"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="-30"
+ x="107"
+ height="1"
+ width="1"
+ id="rect29002"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="-30"
+ x="105"
+ height="1"
+ width="1"
+ id="rect29004"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="-32"
+ x="106"
+ height="1"
+ width="1"
+ id="rect29006"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="-31"
+ x="108"
+ height="1"
+ width="1"
+ id="rect29008"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="-32"
+ x="103"
+ height="1"
+ width="1"
+ id="rect29010"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="-32"
+ x="100"
+ height="1"
+ width="1"
+ id="rect29012"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="-29"
+ x="100"
+ height="1"
+ width="1"
+ id="rect29014"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="-31"
+ x="102"
+ height="1"
+ width="1"
+ id="rect29016"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="-30"
+ x="101"
+ height="1"
+ width="1"
+ id="rect29018"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="-32"
+ x="109"
+ height="1"
+ width="1"
+ id="rect29020"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ id="g29090"
+ inkscape:label="folders-scripts">
+ <g
+ transform="translate(100,0)"
+ id="g29076"
+ inkscape:label="preferences-folders">
+ <path
+ sodipodi:nodetypes="sssssssscsssssccsscssscccccccccccc"
+ inkscape:connector-curvature="0"
+ id="path29078"
+ transform="translate(-100,0)"
+ d="M 115.53125,-40 C 115.24212,-40 115,-39.75788 115,-39.46875 l 0,14.9375 c 0,0.2985 0.23264,0.53125 0.53125,0.53125 l 14.9375,0 C 130.76735,-24 131,-24.23265 131,-24.53125 l 0,-9.9375 C 131,-34.75785 130.75788,-35 130.46875,-35 L 118,-35 l 0,8.5 c 0,0.277 -0.223,0.5 -0.5,0.5 -0.277,0 -0.5,-0.223 -0.5,-0.5 l 0,-9 c 0,-0.277 0.223,-0.5 0.5,-0.5 l 2.96875,0 8.53125,0 0,-1.40625 C 129,-37.73345 128.73334,-38 128.40625,-38 L 121,-38 l 0,-1.46875 C 121,-39.7579 120.75788,-40 120.46875,-40 z m 4.46875,6 6,4 -6.04419,4.088388 L 120,-27.558058 123.55806,-30 120,-32.486136 z m 5,7 5,0 0,1 -5,0 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none;display:inline" />
+ <rect
+ y="-40"
+ x="15"
+ height="16"
+ width="16"
+ id="rect29080"
+ style="color:#bebebe;fill:none;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ </g>
+ </g>
+ <g
+ id="g29129"
+ inkscape:label="folders-plug-ins">
+ <g
+ transform="translate(120,0)"
+ id="g29114"
+ inkscape:label="preferences-folders">
+ <path
+ sodipodi:nodetypes="sssssssscsssssccsscssssscccssccccsscccss"
+ inkscape:connector-curvature="0"
+ id="path29116"
+ transform="translate(-120,0)"
+ d="M 135.53125,-40 C 135.24212,-40 135,-39.75788 135,-39.46875 l 0,14.9375 c 0,0.2985 0.23264,0.53125 0.53125,0.53125 l 14.9375,0 C 150.76735,-24 151,-24.23265 151,-24.53125 l 0,-9.9375 C 151,-34.75785 150.75788,-35 150.46875,-35 L 138,-35 l 0,8.5 c 0,0.277 -0.223,0.5 -0.5,0.5 -0.277,0 -0.5,-0.223 -0.5,-0.5 l 0,-9 c 0,-0.277 0.223,-0.5 0.5,-0.5 l 2.96875,0 8.53125,0 0,-1.40625 C 149,-37.73345 148.73334,-38 148.40625,-38 L 141,-38 l 0,-1.46875 C 141,-39.7579 140.75788,-40 140.46875,-40 z M 145,-34 c 0.5,0 1,0.166667 1,0.5 l 0,1.5 2,0 0,2 -1.5,-0.0625 c -0.66609,-0.02775 -0.66609,1.972246 0,2 L 148,-28 l 0,2 -6,0 0,-2 -1.4375,0 c -0.66667,0 -0.66667,-2 0,-2 l 1.4375,0 0,-2 2,0 0,-1.5 c 0,-0.333333 0.5,-0.5 1,-0.5 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none;display:inline" />
+ <rect
+ y="-40"
+ x="15"
+ height="16"
+ width="16"
+ id="rect29118"
+ style="color:#bebebe;fill:none;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ </g>
+ </g>
+ <g
+ id="g14507"
+ inkscape:label="preferences-color-management">
+ <g
+ id="g14498">
+ <g
+ style="display:inline"
+ id="g8583"
+ inkscape:label="tfqwd"
+ transform="translate(-65.95487,-296.93072)">
+ <rect
+ width="16"
+ height="16"
+ x="101"
+ y="277"
+ id="rect8585"
+ style="color:#bebebe;fill:none;stroke:none;stroke-width:1.78100002;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new" />
+ </g>
+ <path
+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2.15384626;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Sans;-inkscape-font-specification:Sans"
+ d="m 43.059524,-18.992857 c -2.202823,0 -3.992858,1.790033 -3.992858,3.992857 0,2.202825 1.790035,3.992858 3.992858,3.992858 2.202822,0 3.992857,-1.790033 3.992857,-3.992858 0,-2.202824 -1.790035,-3.992857 -3.992857,-3.992857 z m 0,1.052381 C 44.685876,-17.940476 46,-16.626352 46,-15 c 0,1.626353 -1.314124,2.940477 -2.940476,2.940477 -1.626353,0 -2.940477,-1.314124 -2.940477,-2.940477 0,-1.626352 1.314124,-2.940476 2.940477,-2.940476 z"
+ id="path8587"
+ inkscape:connector-curvature="0" />
+ <path
+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.15384626;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Sans;-inkscape-font-specification:Sans"
+ d="m 39.045327,-11.923578 c -2.202823,0 -3.992858,1.790033 -3.992858,3.9928574 0,2.2028242 1.790035,3.9928576 3.992858,3.9928576 2.202822,0 3.992857,-1.7900334 3.992857,-3.9928576 0,-2.2028244 -1.790035,-3.9928574 -3.992857,-3.9928574 z m 0,1.052381 c 1.626352,0 2.940476,1.3141241 2.940476,2.9404764 0,1.6263522 -1.314124,2.9404765 -2.940476,2.9404765 -1.626353,0 -2.940477,-1.3141243 -2.940477,-2.9404765 0,-1.6263523 1.314124,-2.9404764 2.940477,-2.9404764 z"
+ id="path8591"
+ inkscape:connector-curvature="0" />
+ <path
+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.15384626;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Sans;-inkscape-font-specification:Sans"
+ d="m 47.044477,-11.923578 c -2.202823,0 -3.992858,1.790033 -3.992858,3.9928574 0,2.2028242 1.790035,3.9928576 3.992858,3.9928576 2.202822,0 3.992857,-1.7900334 3.992857,-3.9928576 0,-2.2028244 -1.790035,-3.9928574 -3.992857,-3.9928574 z m 0,1.052381 c 1.626352,0 2.940476,1.3141241 2.940476,2.9404764 0,1.6263522 -1.314124,2.9404765 -2.940476,2.9404765 -1.626353,0 -2.940477,-1.3141243 -2.940477,-2.9404765 0,-1.6263523 1.314124,-2.9404764 2.940477,-2.9404764 z"
+ id="path8593"
+ inkscape:connector-curvature="0" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none"
+ id="path14494"
+ sodipodi:cx="39.156036"
+ sodipodi:cy="-7.5554948"
+ sodipodi:rx="2.2980971"
+ sodipodi:ry="2.4748738"
+ d="m 41.454134,-7.5554948 c 0,1.3668351 -1.028894,2.4748738 -2.298098,2.4748738 -1.269204,0 -2.298097,-1.1080387 -2.298097,-2.4748738 0,-1.366835 1.028893,-2.4748742 2.298097,-2.4748742 1.269204,0 2.298098,1.1080392 2.298098,2.4748742 z"
+ transform="matrix(0.87028524,0,0,0.80812198,4.9230797,-1.8942386)" />
+ <path
+ sodipodi:type="arc"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="path14496"
+ sodipodi:cx="46.770836"
+ sodipodi:cy="-7.5"
+ sodipodi:rx="2.7708344"
+ sodipodi:ry="2.5"
+ d="m 49.54167,-7.5 c 0,1.3807119 -1.240545,2.5 -2.770834,2.5 -1.53029,0 -2.770835,-1.1192881 -2.770835,-2.5 0,-1.3807119 1.240545,-2.5 2.770835,-2.5 1.530289,0 2.770834,1.1192881 2.770834,2.5 z"
+ transform="matrix(0.72180426,0,0,0.8,13.240611,-2)" />
+ </g>
+ </g>
+ <g
+ id="g22274"
+ inkscape:label="controllers">
+ <rect
+ y="-20"
+ x="55"
+ height="16"
+ width="16"
+ id="rect12372"
+ style="fill:none;stroke:none" />
+ <path
+ transform="matrix(0.8,0,0,0.79375062,-24.2,-388.44404)"
+ d="m 114,478 c 0,2.76142 -2.23858,5 -5,5 -2.76142,0 -5,-2.23858 -5,-5 0,-2.76142 2.23858,-5 5,-5 2.76142,0 5,2.23858 5,5 z"
+ sodipodi:ry="5"
+ sodipodi:rx="5"
+ sodipodi:cy="478"
+ sodipodi:cx="109"
+ id="path12374"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ sodipodi:type="arc" />
+ <path
+ id="path12620"
+ d="m 62.8125,-19.9375 c -1.10783,0.003 -2.22028,0.21514 -3.21875,0.6875 -3.9939,1.88945 -5.70194,6.66235 -3.8125,10.65625 0.0909,0.19209 0.2087,0.38113 0.3125,0.5625 -1.18546,-3.34405 0.34876,-7.10631 3.625,-8.65625 1.47061,-0.69572 3.0585,-0.83482 4.53125,-0.5 l 1.09375,-2.46875 c -0.55026,-0.12019 -1.1231,-0.21721 -1.71875,-0.25 -0.21357,-0.0199 -0.41159,-0.0272 -0.625,-0.0312 -0.0639,-0.001 -0.12368,-1.9e-4 -0.1875,0 z m 4.65625,0.96875 -1.1875,2.59375 c 0.95696,0.56922 1.79787,1.37485 2.40625,2.375 L 71,-15 c -0.40354,-1.6574 -1.70003,-3.08691 -3.53125,-3.96875 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ inkscape:connector-curvature="0" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path12636"
+ d="m 65,-12 0,-4 -2,3 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ id="g22311"
+ inkscape:label="preferences-default-comment">
+ <g
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ inkscape:export-filename="/home/jimmac/Desktop/g12181.png"
+ transform="translate(33.999802,-357)"
+ id="g11248"
+ inkscape:label="user-available"
+ style="display:inline">
+ <rect
+ inkscape:label="a"
+ y="337"
+ x="41.000198"
+ height="16"
+ width="16"
+ id="rect11252"
+ style="color:#bebebe;fill:none;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" />
+ </g>
+ <rect
+ ry="2"
+ y="-19"
+ x="76"
+ height="10"
+ width="14"
+ id="rect22306"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path22309"
+ d="m 82,-9 c 0,0 1,4 6,4 -2.53033,-1 -2,-4 -2,-4 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ id="g22402"
+ inkscape:label="preferences-default-grid">
+ <g
+ inkscape:label="stock-grid"
+ id="g6316-5"
+ style="display:inline"
+ transform="translate(-26.000198,-399)">
+ <rect
+ style="fill:none;stroke:none"
+ id="rect6296-1"
+ width="16"
+ height="16"
+ x="-120"
+ y="162"
+ transform="translate(241.0002,217)" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect6300-3"
+ width="1"
+ height="16"
+ x="-120"
+ y="162"
+ transform="translate(241.0002,217)" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect6302-1"
+ width="16"
+ height="1"
+ x="-120"
+ y="177"
+ transform="translate(241.0002,217)" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect6304-4"
+ width="1"
+ height="16"
+ x="-105"
+ y="162"
+ transform="translate(241.0002,217)" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect6306-6"
+ width="16"
+ height="1"
+ x="-120"
+ y="162"
+ transform="translate(241.0002,217)" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect6308-8"
+ width="1"
+ height="16"
+ x="126.0002"
+ y="379" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect6310-5"
+ width="1"
+ height="16"
+ x="131.0002"
+ y="379" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect6312-8"
+ width="16"
+ height="1"
+ x="121.0002"
+ y="384" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect6314-8"
+ width="16"
+ height="1"
+ x="-120"
+ y="172"
+ transform="translate(241.0002,217)" />
+ </g>
+ </g>
+ <g
+ id="g22488"
+ inkscape:label="preferences-environment">
+ <rect
+ y="-20"
+ x="115"
+ height="16"
+ width="16"
+ id="rect22433"
+ style="fill:none;stroke:none" />
+ <path
+ sodipodi:nodetypes="sssssssss"
+ inkscape:connector-curvature="0"
+ id="rect22435"
+ d="m 121,-16 c -1.108,0 -2,0.892 -2,2 l 0,5 c 0,1.108 0.892,2 2,2 l 5,0 c 1.108,0 2,-0.892 2,-2 l 0,-5 c 0,-1.108 -0.892,-2 -2,-2 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="scale(-1,-1)"
+ ry="0"
+ rx="2"
+ y="17"
+ x="-121"
+ height="2"
+ width="1"
+ id="rect22439"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="scale(-1,-1)"
+ ry="0"
+ rx="2"
+ y="17"
+ x="-123"
+ height="2"
+ width="1"
+ id="rect22441"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="scale(-1,-1)"
+ ry="0"
+ rx="2"
+ y="17"
+ x="-125"
+ height="2"
+ width="1"
+ id="rect22443"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="scale(-1,-1)"
+ ry="0"
+ rx="2"
+ y="17"
+ x="-127"
+ height="2"
+ width="1"
+ id="rect22445"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect22461"
+ width="1"
+ height="2"
+ x="-121"
+ y="4"
+ rx="2"
+ ry="0"
+ transform="scale(-1,-1)" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect22463"
+ width="1"
+ height="2"
+ x="-123"
+ y="4"
+ rx="2"
+ ry="0"
+ transform="scale(-1,-1)" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect22465"
+ width="1"
+ height="2"
+ x="-125"
+ y="4"
+ rx="2"
+ ry="0"
+ transform="scale(-1,-1)" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect22467"
+ width="1"
+ height="2"
+ x="-127"
+ y="4"
+ rx="2"
+ ry="0"
+ transform="scale(-1,-1)" />
+ <rect
+ ry="0"
+ rx="2"
+ y="-15"
+ x="116"
+ height="1"
+ width="2"
+ id="rect22469"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ ry="0"
+ rx="2"
+ y="-13"
+ x="116"
+ height="1"
+ width="2"
+ id="rect22471"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ ry="0"
+ rx="2"
+ y="-11"
+ x="116"
+ height="1"
+ width="2"
+ id="rect22473"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ ry="0"
+ rx="2"
+ y="-9"
+ x="116"
+ height="1"
+ width="2"
+ id="rect22475"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect22477"
+ width="2"
+ height="1"
+ x="129"
+ y="-15"
+ rx="2"
+ ry="0" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect22479"
+ width="2"
+ height="1"
+ x="129"
+ y="-13"
+ rx="2"
+ ry="0" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect22481"
+ width="2"
+ height="1"
+ x="129"
+ y="-11"
+ rx="2"
+ ry="0" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect22483"
+ width="2"
+ height="1"
+ x="129"
+ y="-9"
+ rx="2"
+ ry="0" />
+ </g>
+ <g
+ id="g22730"
+ inkscape:label="preferences-folders-themes">
+ <g
+ transform="translate(120,20)"
+ id="g22529"
+ inkscape:label="preferences-folders">
+ <path
+ inkscape:connector-curvature="0"
+ id="path22531"
+ transform="translate(-120,-20)"
+ d="M 135.53125,-20 C 135.24212,-20 135,-19.75788 135,-19.46875 l 0,14.9375 C 135,-4.23275 135.23264,-4 135.53125,-4 l 14.9375,0 C 150.76735,-4 151,-4.23265 151,-4.53125 l 0,-9.9375 C 151,-14.75785 150.75788,-15 150.46875,-15 L 138,-15 l 0,8.5 c 0,0.277 -0.223,0.5 -0.5,0.5 -0.277,0 -0.5,-0.223 -0.5,-0.5 l 0,-9 c 0,-0.277 0.223,-0.5 0.5,-0.5 l 2.96875,0 8.53125,0 0,-1.40625 C 149,-17.73345 148.73334,-18 148.40625,-18 L 141,-18 l 0,-1.46875 C 141,-19.7579 140.75788,-20 140.46875,-20 l -4.9375,0 z m 4.46875,7 9,0 0,7 -9,0 0,-7 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none;display:inline" />
+ <rect
+ y="-40"
+ x="15"
+ height="16"
+ width="16"
+ id="rect22533"
+ style="color:#bebebe;fill:none;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ </g>
+ <rect
+ y="-12"
+ x="141"
+ height="5"
+ width="1"
+ id="rect22714"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="-12"
+ x="143"
+ height="5"
+ width="1"
+ id="rect22716"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="-12"
+ x="145"
+ height="5"
+ width="1"
+ id="rect22718"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="-12"
+ x="147"
+ height="5"
+ width="1"
+ id="rect22720"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect22722"
+ width="1"
+ height="5"
+ x="142"
+ y="-12" />
+ <rect
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect22724"
+ width="1"
+ height="5"
+ x="144"
+ y="-12" />
+ <rect
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect22726"
+ width="1"
+ height="5"
+ x="146"
+ y="-12" />
+ </g>
+ <g
+ id="g22783"
+ inkscape:label="preferences-help-system">
+ <rect
+ y="0"
+ x="-5"
+ height="16"
+ width="16"
+ id="rect22761"
+ style="opacity:0.3;fill:none;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path22763"
+ d="M -0.03125,0.59375 C -2.0210789,1.406758 -3.5669784,3.0094542 -4.375,5 l 2.90625,0.78125 c 0.48983518,-0.9531908 1.28860519,-1.7349381 2.25,-2.21875 l -0.8125,-2.96875 z m 6.0625,0 -0.8125,2.96875 c 0.9613948,0.4838119 1.7601648,1.2655592 2.25,2.21875 L 10.375,5 C 9.5669784,3.0094542 8.0210789,1.406758 6.03125,0.59375 z m -7.5,9.625 L -4.375,11 c 0.8080216,1.990546 2.3539211,3.593242 4.34375,4.40625 l 0.8125,-2.96875 c -0.96139481,-0.483812 -1.76016482,-1.265559 -2.25,-2.21875 z m 8.90625,0 c -0.4838119,0.961395 -1.2655592,1.760165 -2.21875,2.25 L 6,15.375 c 1.9905458,-0.808022 3.593242,-2.353921 4.40625,-4.34375 L 7.4375,10.21875 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none"
+ d="m 3,0 c -4.418278,0 -8,3.5817219 -8,8 0,4.418278 3.581722,8 8,8 4.418278,0 8,-3.581722 8,-8 C 11,3.5817219 7.418278,0 3,0 z M 3,3 C 5.761424,3 8,5.2385763 8,8 8,10.761424 5.761424,13 3,13 0.238576,13 -2,10.761424 -2,8 -2,5.2385763 0.238576,3 3,3 z"
+ id="path22768" />
+ </g>
+ <g
+ id="g27161"
+ inkscape:label="preferences-image-windows">
+ <rect
+ y="0"
+ x="15.000013"
+ height="16"
+ width="16"
+ id="rect5372"
+ style="fill:none;stroke:none" />
+ <path
+ sodipodi:nodetypes="ccccccccccccccc"
+ inkscape:connector-curvature="0"
+ id="rect5882-9"
+ d="m 16,1 0,14 14,0 0,-14 z m 1,1 12,0 0,1 -12,0 z m 0,2.09375 12,0 L 29,13 17,13 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path9161"
+ d="m 18,8 c 6,5 7.04463,-1.65963 10,0 l 0,4 -10,0 z"
+ style="opacity:0.3;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new" />
+ <path
+ transform="translate(1,0)"
+ d="M 22,6.5 C 22,7.3284271 21.328427,8 20.5,8 19.671573,8 19,7.3284271 19,6.5 19,5.6715729 19.671573,5 20.5,5 21.328427,5 22,5.6715729 22,6.5 z"
+ sodipodi:ry="1.5"
+ sodipodi:rx="1.5"
+ sodipodi:cy="6.5"
+ sodipodi:cx="20.5"
+ id="path27159"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none"
+ sodipodi:type="arc" />
+ </g>
+ <g
+ id="g13938"
+ inkscape:label="preferences-input-devices">
+ <g
+ inkscape:label="preferences-desktop-peripherals"
+ id="g13905"
+ transform="translate(-186.0002,-543)"
+ style="display:inline">
+ <g
+ id="g13899">
+ <rect
+ width="16.000002"
+ height="16.000017"
+ x="241.0002"
+ y="543"
+ id="rect13775"
+ style="opacity:0;color:#bebebe;fill:#000000;stroke:none;stroke-width:1.78100002;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new"
+ ry="0" />
+ <path
+ sodipodi:nodetypes="ccccccccccc"
+ inkscape:connector-curvature="0"
+ id="path13779"
+ d="m 252.52662,544 c 0,0 -1.32308,2.78343 -2.45085,5 l -0.47633,1 0,1 -0.59924,1 1,0 0.76701,-1 0.79899,-0.42188 0.12292,-0.57812 2.85795,-6 z"
+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Sans;-inkscape-font-specification:Sans" />
+ <path
+ sodipodi:nodetypes="cccccccccccccccccccc"
+ inkscape:transform-center-y="-0.44568146"
+ inkscape:transform-center-x="-0.24505149"
+ inkscape:connector-curvature="0"
+ id="rect7357-4"
+ d="m 242.22671,551.02655 c -0.66548,-9.9e-4 -1.20392,0.55433 -1.20715,1.2506 0.013,0.53918 0.0125,1.16093 0.007,1.71296 l 1.98956,0 -4e-5,-2.95789 -0.79042,-0.005 z m 1.78413,0.006 0,2.95789 1.98956,-2.5e-4 c 0.0102,-0.55419 0.0417,-1.15277 0.0464,-1.68577 9.9e-4,-0.69624 -0.52983,-1.25951 -1.19536,-1.26294 l -0.84056,-0.009 z m -2.98435,3.9436 c -0.009,0.6024 -0.0261,0.82689 -0.0263,1.3814 -0.006,1.45673 1.10867,2.63526 2.50111,2.64244 1.39242,0.007 2.51892,-1.15985 2.52578,-2.61662 -0.0253,-0.60595 -0.0329,-0.83265 -0.0267,-1.40722 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ sodipodi:nodetypes="ccccccccccccccc"
+ inkscape:connector-curvature="0"
+ id="path13869"
+ transform="translate(241.0002,217)"
+ d="m 3,329 -1,4 1.40625,0 c 0.1360873,6.7e-4 -0.015815,0 1.0625,0 L 5,331 l 3,0 1,-2 z m 11,0 -1.75,3.5625 L 13,337 l -7,0 0,2 10,0 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ </g>
+ </g>
+ <g
+ id="g14869"
+ inkscape:label="preferences-tool-options">
+ <path
+ sodipodi:nodetypes="ccccccsccccccc"
+ inkscape:connector-curvature="0"
+ id="path14776"
+ d="M 47.375,3.96875 47,5 l 0,6 c 0.69331,0.67628 2.26338,0.74529 3,0 L 50,5 49.625,3.96875 C 49.349925,4.2879305 48.954417,4.5 48.5,4.5 48.045583,4.5 47.650075,4.2879305 47.375,3.96875 z M 47,12 l 0,2 c 0.69333,0.67626 2.26339,0.74529 3,0 l 0,-2 -0.125,0.15625 C 49.12083,12.83745 47.67173,12.65522 47,12 z"
+ style="fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;display:inline" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path14862"
+ d="m 289.5627,218 c 0,0 0,0 0.84375,2 -0.35159,0.56097 -1.38368,0.53637 -1.75,0 0.90625,-2 0.90625,-2 0.90625,-2 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none;display:inline"
+ transform="translate(-241.0002,-217)" />
+ <rect
+ y="0"
+ x="35"
+ height="16"
+ width="16"
+ id="rect6622"
+ style="fill:none;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path35543-6-4-8"
+ d="M 43,1 C 42.77935,1 42.55919,1.01135 42.34375,1.03125 L 41.9375,3.125 C 41.60304,3.1983 41.27445,3.30089 40.96875,3.4375 L 39.4375,1.96875 C 39.04887,2.19886 38.71055,2.48283 38.375,2.78125 L 39.28125,4.6875 C 39.05883,4.93649 38.857,5.21 38.6875,5.5 L 36.59375,5.21875 C 36.41603,5.62752 36.28503,6.05512 36.1875,6.5 l 1.84375,1 C 38.01415,7.66809 38,7.8274 38,8 c 0,0.1726 0.01425,0.33191 0.03125,0.5 l -1.84375,1 c 0.0975,0.44488 0.22853,0.87248 0.40625,1.28125 L 38.6875,10.5 c 0.1695,0.29 0.37133,0.56351 0.59375,0.8125 L 38.375,13.21875 c 0.33555,0.29842 0.67387,0.58239 1.0625,0.8125 l 1.53125,-1.46875 c 0.3057,0.13661 0.63429,0.23916 0.96875,0.3125 l 0.40625,2.09375 C 42.55919,14.98875 42.77935,15 43,15 c 0.22065,0 0.44081,-0.01135 0.65625,-0.03125 L 44.0625,12.875 c 0.33446,-0.0733 0.66305,-0.17589 0.96875,-0.3125 L 46,13.5 46,8 c 0,1.65685 -1.34315,3 -3,3 -1.65685,0 -3,-1.34315 -3,-3 0,-1.65685 1.34315,-3 3,-3 1.65685,0 3,1.34315 3,3 L 46,2.5 45.03125,3.4375 C 44.72555,3.30089 44.39696,3.19834 44.0625,3.125 L 43.65625,1.03125 C 43.44081,1.01125 43.22065,1 43,1 z"
+ style="color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ </g>
+ <g
+ id="g14943"
+ inkscape:label="preferences-theme">
+ <g
+ inkscape:label="preferences-theme"
+ id="g13767"
+ transform="translate(-146.0002,-543)">
+ <path
+ style="color:#000000;fill:#bfbfbf;fill-opacity:0.29803922;stroke:none;stroke-width:0.30681819;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m -8.96875,336.03125 -1,0.96875 1.96875,0 0,4 -2,0 0,-3.96875 -0.03125,0.0313 -0.96875,1 0,2.9375 -2,0 0,-0.96875 -1.25,1.21875 c -0.67324,0.66066 -2.12527,0.25063 -3.25,-0.90625 -0.186021,-0.19134 -0.327162,-0.39208 -0.46875,-0.59375 0.196996,1.28601 0.873033,2.25 1.6875,2.25 l 3.53125,0 2.5625,-0.0313 5.625,0.0313 c 0.29085,9.5e-4 0.53125,-0.40877 0.53125,-0.90625 l 0,-4.1875 c 0,-0.49747 -0.2404,-0.875 -0.53125,-0.875 l -4.40625,0 z M -7,337 l 2,0 0,4 -2,0 0,-4 z"
+ transform="translate(241.0002,217)"
+ id="path13662"
+ inkscape:connector-curvature="0" />
+ <rect
+ style="fill:none;stroke:none"
+ id="rect13610"
+ width="16"
+ height="16"
+ x="-20"
+ y="326"
+ transform="translate(241.0002,217)" />
+ <path
+ inkscape:connector-curvature="0"
+ style="color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:0.30681819;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 222.90645,544.03125 c -0.49747,0 -0.875,0.2404 -0.875,0.53125 l 0,11.71875 c 0,0.9695 1.31047,1.75 2.96875,1.75 1.65823,0 3,-0.7805 3,-1.75 l 0,-3.53125 -0.0312,-2.5625 0.0312,-5.625 c 9.5e-4,-0.29085 -0.40877,-0.53125 -0.90625,-0.53125 l -4.1875,0 z m 0.0937,0.96875 4,0 0,2 -4,0 0,-2 z m 0,3 4,0 0,2 -4,0 0,-2 z m 0,3 4,0 0,2 -4,0 0,-2 z m 2,4 c 0.55229,0 1,0.44771 1,1 0,0.55229 -0.44771,1 -1,1 -0.55229,0 -1,-0.44771 -1,-1 0,-0.55229 0.44771,-1 1,-1 z"
+ id="path13641" />
+ <path
+ style="color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:0.30681819;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m -9.96875,329 c -0.073333,0.0131 -0.137007,0.0442 -0.1875,0.0937 l -2.875,2.8125 0,1.28125 0,0.0313 1.15625,-1.09375 2.71875,2.78125 -1.40625,1.375 -2.46875,-2.5625 0.03125,1.4375 1.75,1.8125 -1.375,1.34375 -0.375,-0.375 0,1.34375 c 0,0.9695 -1.34177,1.75 -3,1.75 -0.265175,0 -0.506549,-0.025 -0.75,-0.0625 0.95467,0.64707 1.97062,0.80074 2.5,0.28125 l 2.46875,-2.40625 1.75,-1.78125 3.9375,-3.8125 c 0.20262,-0.19753 0.08739,-0.62168 -0.25,-0.96875 l -2.84375,-2.9375 C -9.4405725,329.0835 -9.7487525,328.96066 -9.96875,329 z m 0.1875,1.0625 2.6875,2.8125 -1.375,1.34375 -2.71875,-2.78125 1.40625,-1.375 z"
+ transform="translate(241.0002,217)"
+ id="path13710"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <g
+ id="g15049"
+ inkscape:label="preferences-session">
+ <g
+ inkscape:label="preferences-session"
+ id="g15022">
+ <path
+ transform="translate(-241.0002,-217)"
+ style="fill:#bebebe;fill-opacity:1;stroke:none;display:inline"
+ d="m 348.04989,227.06248 4,-4 -8,0 z"
+ id="path15003"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc" />
+ <path
+ transform="translate(-241.0002,-217)"
+ inkscape:connector-curvature="0"
+ id="path15005"
+ d="m 336.04989,223.56248 c 0,0.17107 0.0183,0.33226 0.0313,0.5 l 2.03125,0 c -0.0187,-0.16677 -0.0625,-0.32822 -0.0625,-0.5 0,-2.48528 2.01472,-4.5 4.5,-4.5 2.48528,0 4.5,2.01472 4.5,4.5 0,0.17178 -0.0438,0.33323 -0.0625,0.5 l 2.03125,0 c 0.013,-0.16774 0.0313,-0.32893 0.0313,-0.5 0,-3.58985 -2.91014,-6.5 -6.5,-6.5 -3.58986,0 -6.5,2.91015 -6.5,6.5 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none;display:inline" />
+ <path
+ transform="translate(-241.0002,-217)"
+ style="fill:#bebebe;fill-opacity:1;stroke:none;display:inline"
+ d="m 339.06265,226.5 c 0,-0.17107 0.0183,-0.33226 0.0313,-0.5 l 2.03125,0 c -0.0187,0.16677 -0.0625,0.32822 -0.0625,0.5 0,2.48528 2.01472,4.5 4.5,4.5 2.48528,0 4.5,-2.01472 4.5,-4.5 0,-0.17178 -0.0438,-0.33323 -0.0625,-0.5 l 2.03125,0 c 0.013,0.16774 0.0313,0.32893 0.0313,0.5 0,3.58985 -2.91014,6.5 -6.5,6.5 -3.58986,0 -6.5,-2.91015 -6.5,-6.5 z"
+ id="path15014"
+ inkscape:connector-curvature="0" />
+ <path
+ transform="translate(-241.0002,-217)"
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path15016"
+ d="m 340.04989,223.06248 -4,4 8,0 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none;display:inline" />
+ <g
+ inkscape:label="emblem-important"
+ id="g14401"
+ transform="translate(-251.14101,-963.11562)">
+ <rect
+ style="color:#bebebe;fill:none;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect14403"
+ width="16"
+ height="16"
+ x="346.1907"
+ y="963.1781" />
+ </g>
+ </g>
+ </g>
+ <g
+ id="g15159"
+ inkscape:label="preferences-new-image">
+ <rect
+ y="0"
+ x="115"
+ height="16"
+ width="16"
+ id="rect6346-8"
+ style="fill:none;stroke:none" />
+ <path
+ sodipodi:nodetypes="cccccccccccc"
+ inkscape:connector-curvature="0"
+ id="rect5882-6"
+ d="m 115,2 0,14 14,0 0,-8.34375 C 128.64135,7.4295251 128.28079,7.1959179 128,7.0625 l 0,4.9375 -12,0 0,-9 6.75,0 c -0.40406,-0.3742462 -0.68299,-0.7195239 -0.59375,-1 0.009,-0.028863 0,0 0,0 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ sodipodi:nodetypes="cccsccccccccccccccccccccccccccc"
+ inkscape:connector-curvature="0"
+ id="rect10683-6"
+ d="m 117,4 0,7 1,0 c 0,-0.75515 0.67157,-1.375 1.5,-1.375 0.82843,0 1.5,0.61985 1.5,1.375 l 1,0 0,-1.5 c 1.4e-4,-0.98573 -0.7274,-1.47402 -2,-2.0625 0,0 0.0295,3.7e-4 0.25,0 0.40803,0.0835 1.38212,0.3501 1.75,0.59375 C 121.90181,7.67571 121.85899,7.13772 121.5625,6.6875 121.26599,6.23732 120,5.34375 120,5.34375 l 0.0625,-0.03125 c 0.0557,-0.0402 0.9453,0.7655 1.25,0.6875 -0.13515,-0.32497 -0.25949,-0.63468 -0.40625,-0.8125 l 0.1875,-0.03125 c 0.35629,0.59147 0.46684,0.72309 0.84375,1.15625 C 122.06222,6.3696 121.9064,6.2702 123,5.71875 L 123,6 c 0,0 -1.0625,0.30993 -0.75,0.90625 0.22248,0.30573 0.39823,1.01025 0.75,1.09375 0,0 0.48673,-0.4867637 1,-1 0.375,-1.8125 0,0 0.375,-2 l -0.78125,-1 z m 10,3.09375 c -0.79822,0.3856455 -2.01719,1.3328183 -2.78125,1.5625 C 124.14774,8.7666914 124.05432,8.8660032 124,9 l 0,2 3,0 z"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ sodipodi:nodetypes="sssssscssss"
+ inkscape:connector-curvature="0"
+ id="path12190"
+ d="M 130.00175,7 C 129.59856,7.30064 128.01178,5.8764 127.51481,5.87427 127.01763,5.87227 125.40108,7.30398 125,7 c -0.40093,-0.30387 0.74435,-2.04513 0.59271,-2.53484 -0.15168,-0.48991 -1.73746,-1.32666 -1.582,-1.81529 0.15541,-0.48846 1.95505,-0.31906 2.35832,-0.6196 0.40342,-0.30066 0.63836,-1.98624 1.13554,-1.98425 0.49697,0.002 0.76103,1.68027 1.16188,1.98425 0.40101,0.30409 2.15927,0.1595 2.31108,0.64934 0.15174,0.48967 -1.44059,1.3123 -1.59612,1.80072 -0.15559,0.48859 1.02369,2.2189 0.62034,2.51967 z"
+ inkscape:transform-center-y="-0.35729319"
+ inkscape:transform-center-x="-0.0046869239"
+ style="color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ </g>
+ <g
+ id="g15268"
+ inkscape:label="preferences-interface">
+ <rect
+ y="0"
+ x="135"
+ height="16"
+ width="16"
+ id="rect28728-9"
+ style="opacity:0.3;fill:none;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect28732-9"
+ d="m 143,4 0,1 7,0 0,1 -7,0 0,7 -5,0 0,3 13,0 0,-12 -8,0 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect15227"
+ d="m 135,0 0,12 7,0 0,-12 -7,0 z m 1,1 5,0 0,1 -5,0 0,-1 z m 0.5625,2 0.875,0 C 137.74912,3 138,3.250875 138,3.5625 l 0,0.875 C 138,4.749125 137.74912,5 137.4375,5 l -0.875,0 C 136.25088,5 136,4.749125 136,4.4375 l 0,-0.875 C 136,3.250875 136.25088,3 136.5625,3 z m 3,0 0.875,0 C 140.74912,3 141,3.250875 141,3.5625 l 0,0.875 C 141,4.749125 140.74912,5 140.4375,5 l -0.875,0 C 139.25088,5 139,4.749125 139,4.4375 l 0,-0.875 C 139,3.250875 139.25088,3 139.5625,3 z m -3,3 0.875,0 C 137.74912,6 138,6.250875 138,6.5625 l 0,0.875 C 138,7.749125 137.74912,8 137.4375,8 l -0.875,0 C 136.25088,8 136,7.749125 136,7.4375 l 0,-0.875 C 136,6.250875 136.25088,6 136.5625,6 z m 3,0 0.875,0 C 140.74912,6 141,6.250875 141,6.5625 l 0,0.875 C 141,7.749125 140.74912,8 140.4375,8 l -0.875,0 C 139.25088,8 139,7.749125 139,7.4375 l 0,-0.875 C 139,6.250875 139.25088,6 139.5625,6 z m -3,3 0.875,0 C 137.74912,9 138,9.250875 138,9.5625 l 0,0.875 C 138,10.749125 137.74912,11 137.4375,11 l -0.875,0 C 136.25088,11 136,10.749125 136,10.4375 l 0,-0.875 C 136,9.250875 136.25088,9 136.5625,9 z m 3,0 0.875,0 C 140.74912,9 141,9.250875 141,9.5625 l 0,0.875 C 141,10.749125 140.74912,11 140.4375,11 l -0.875,0 C 139.25088,11 139,10.749125 139,10.4375 l 0,-0.875 C 139,9.250875 139.25088,9 139.5625,9 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ id="g15354"
+ inkscape:label="preferences-image-title">
+ <g
+ transform="translate(-20,20)"
+ id="g15292"
+ inkscape:label="preferences-image-windows">
+ <rect
+ y="0"
+ x="15.000013"
+ height="16"
+ width="16"
+ id="rect15294"
+ style="fill:none;stroke:none" />
+ <path
+ sodipodi:nodetypes="ccccccccccccccc"
+ inkscape:connector-curvature="0"
+ id="path15296"
+ d="m 16,1 0,14 14,0 0,-14 z m 1,1 12,0 0,2 -12,0 z m 0,3 12,0 0,9 -12,0 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path12109-0"
+ d="m 1.9877885,27 2,0 c 0.007,1.994817 0.0265,4.005236 -0.006,6 l -2,0 c 0.10306,-1.994151 0.0197,-4.004763 0.006,-6 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ d="m 2.9647085,26 4.02308,4.00001 -8,0 z"
+ id="path12111-7"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc" />
+ </g>
+ <g
+ id="g15650"
+ inkscape:label="preferences-folders-tools">
+ <g
+ transform="translate(0,60)"
+ id="g15572"
+ inkscape:label="preferences-folders">
+ <path
+ sodipodi:nodetypes="sssssssscsssssccsscssscccsccccsccc"
+ inkscape:connector-curvature="0"
+ id="path15574"
+ transform="translate(0,-60)"
+ d="M 15.53125,20 C 15.24212,20 15,20.24212 15,20.53125 l 0,14.9375 C 15,35.76725 15.23264,36 15.53125,36 l 14.9375,0 C 30.76735,36 31,35.76735 31,35.46875 l 0,-9.9375 C 31,25.24215 30.75788,25 30.46875,25 L 18,25 18,33.5 C 18,33.777 17.777,34 17.5,34 17.223,34 17,33.777 17,33.5 l 0,-9 C 17,24.223 17.223,24 17.5,24 L 20.46875,24 29,24 29,22.59375 C 29,22.26655 28.73334,22 28.40625,22 L 21,22 21,20.53125 C 21,20.2421 20.75788,20 20.46875,20 z M 22,28 c 1.40625,0 1,-1 1,-1 0,0 5.609862,-0.855056 6,4 0,0 -1.254644,-1 -2,-1 -2,0 -2,1 -2,1 l 0,4 -2,0 0,-4 c 0,0 0,-1 -1,-1 -1.548232,0 -2,1 -2,1 l 0,-4 c 0,0 0.47504,1 2,1 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none;display:inline" />
+ <rect
+ y="-40"
+ x="15"
+ height="16"
+ width="16"
+ id="rect15576"
+ style="color:#bebebe;fill:none;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ </g>
+ </g>
+ <g
+ id="g15856"
+ inkscape:label="preferences-folders-interp">
+ <g
+ transform="translate(20,0)"
+ id="g15674"
+ inkscape:label="preferences-folders-tools">
+ <g
+ transform="translate(0,60)"
+ id="g15676"
+ inkscape:label="preferences-folders">
+ <path
+ sodipodi:nodetypes="sssssssscsssssccsscsssccccccccccccccccc"
+ inkscape:connector-curvature="0"
+ id="path15678"
+ transform="translate(-20,-60)"
+ d="M 35.53125,20 C 35.24212,20 35,20.24212 35,20.53125 l 0,14.9375 C 35,35.76725 35.23264,36 35.53125,36 l 14.9375,0 C 50.76735,36 51,35.76735 51,35.46875 l 0,-9.9375 C 51,25.24215 50.75788,25 50.46875,25 L 38,25 38,33.5 C 38,33.777 37.777,34 37.5,34 37.223,34 37,33.777 37,33.5 l 0,-9 C 37,24.223 37.223,24 37.5,24 L 40.46875,24 49,24 49,22.59375 C 49,22.26655 48.73334,22 48.40625,22 L 41,22 41,20.53125 C 41,20.2421 40.75788,20 40.46875,20 z m 6.53125,6 1.5,1.21875 c 0.627744,-0.184403 1.247257,-0.184403 1.875,0 L 46.9375,26 49,28.09375 47.78125,29.5625 c 0.182958,0.632699 0.182958,1.304801 0,1.9375 L 49,32.96875 l -2.0625,2.09375 -1.5,-1.21875 c -0.627744,0.184403 -1.247257,0.184402 -1.875,0 l -1.5,1.21875 L 40,32.96875 41.21875,31.5 c -0.182958,-0.632699 -0.182958,-1.304801 0,-1.9375 L 40,28.09375 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none;display:inline" />
+ <rect
+ y="-40"
+ x="15"
+ height="16"
+ width="16"
+ id="rect15680"
+ style="color:#bebebe;fill:none;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ </g>
+ </g>
+ <path
+ transform="matrix(1,0,0,1.1851852,0,-5.9259264)"
+ d="M 46,30.734375 C 46,31.43336 45.328427,32 44.5,32 43.671573,32 43,31.43336 43,30.734375 c 0,-0.698985 0.671573,-1.265625 1.5,-1.265625 0.828427,0 1.5,0.56664 1.5,1.265625 z"
+ sodipodi:ry="1.265625"
+ sodipodi:rx="1.5"
+ sodipodi:cy="30.734375"
+ sodipodi:cx="44.5"
+ id="path15832"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ sodipodi:type="arc" />
+ </g>
+ <g
+ id="g7512"
+ inkscape:label="preferences-folders-dynamics">
+ <g
+ transform="translate(40,60)"
+ id="g7458"
+ inkscape:label="preferences-folders">
+ <path
+ inkscape:connector-curvature="0"
+ id="path7460"
+ transform="translate(-40,-60)"
+ d="M 55.53125,20 C 55.24212,20 55,20.24212 55,20.53125 l 0,14.9375 C 55,35.76725 55.23264,36 55.53125,36 l 14.9375,0 C 70.76735,36 71,35.76735 71,35.46875 l 0,-9.9375 C 71,25.24215 70.75788,25 70.46875,25 L 58,25 58,33.5 C 58,33.777 57.777,34 57.5,34 57.223,34 57,33.777 57,33.5 l 0,-9 C 57,24.223 57.223,24 57.5,24 L 60.46875,24 69,24 69,22.59375 C 69,22.26655 68.73334,22 68.40625,22 L 61,22 61,20.53125 C 61,20.2421 60.75788,20 60.46875,20 l -4.9375,0 z m 5.34375,6 c 0.263699,-0.02075 0.53242,0.07118 0.75,0.25 0.43496,0.35745 0.49474,0.98525 0.125,1.40625 -0.36957,0.42038 -1.00248,0.45135 -1.4375,0.09375 -0.43508,-0.35758 -0.49471,-0.9854 -0.125,-1.40625 0.184755,-0.210195 0.423801,-0.323 0.6875,-0.34375 z m 3.09375,0.0625 c 0.26338,-0.02428 0.529965,0.07409 0.75,0.25 0.43987,0.35166 0.52023,0.98063 0.15625,1.40625 -0.36368,0.42564 -1.02873,0.47671 -1.46875,0.125 -0.43993,-0.35177 -0.48889,-0.98078 -0.125,-1.40625 0.181865,-0.212865 0.42412,-0.350721 0.6875,-0.375 z M 60.875,29 c 0.265462,-0.02424 0.52826,0.04312 0.75,0.21875 0.44334,0.35119 0.49184,0.98122 0.125,1.40625 -0.3666,0.42499 -1.02532,0.50748 -1.46875,0.15625 C 59.8378,30.43002 59.7895,29.79993 60.15625,29.375 60.33953,29.162485 60.609538,29.024235 60.875,29 z m 4.34375,0 c 1.430295,-0.11628 2.40625,1.375 2.40625,1.375 L 67.78125,30.25 69,29 l 0,6 -6.1875,0 1.40625,-1.3125 c 0,0 -2.80099,-1.86925 -0.5625,-3.90625 C 64.215873,29.272 64.741985,29.03876 65.21875,29 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none;display:inline" />
+ <rect
+ y="-40"
+ x="15"
+ height="16"
+ width="16"
+ id="rect7462"
+ style="color:#bebebe;fill:none;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ </g>
+ </g>
+ <g
+ id="g7572"
+ inkscape:label="preferences-folders-environ">
+ <g
+ transform="translate(20,0)"
+ id="g7536"
+ inkscape:label="preferences-folders-dynamics">
+ <g
+ transform="translate(40,60)"
+ id="g7539"
+ inkscape:label="preferences-folders">
+ <path
+ inkscape:connector-curvature="0"
+ id="path7541"
+ transform="translate(-60,-60)"
+ d="M 75.53125,20 C 75.24212,20 75,20.24212 75,20.53125 l 0,14.9375 C 75,35.76725 75.23264,36 75.53125,36 l 14.9375,0 C 90.76735,36 91,35.76735 91,35.46875 l 0,-9.9375 C 91,25.24215 90.75788,25 90.46875,25 L 78,25 78,33.5 C 78,33.777 77.777,34 77.5,34 77.223,34 77,33.777 77,33.5 l 0,-9 C 77,24.223 77.223,24 77.5,24 L 80.46875,24 89,24 89,22.59375 C 89,22.26655 88.73334,22 88.40625,22 L 81,22 81,20.53125 C 81,20.2421 80.75788,20 80.46875,20 l -4.9375,0 z M 83,26 l 1,0 0,2 -1,0 0,-2 z m 2,0 1,0 0,2 -1,0 0,-2 z m -5,3 2,0 0,1 -2,0 0,-1 z m 4,0 1,0 c 0.554,0 1,0.446 1,1 l 0,1 c 0,0.554 -0.446,1 -1,1 l -1,0 c -0.554,0 -1,-0.446 -1,-1 l 0,-1 c 0,-0.554 0.446,-1 1,-1 z m 3,0 2,0 0,1 -2,0 0,-1 z m -7,2 2,0 0,1 -2,0 0,-1 z m 7,0 2,0 0,1 -2,0 0,-1 z m -4,2 1,0 0,2 -1,0 0,-2 z m 2,0 1,0 0,2 -1,0 0,-2 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none;display:inline" />
+ <rect
+ y="-40"
+ x="15"
+ height="16"
+ width="16"
+ id="rect7543"
+ style="color:#bebebe;fill:none;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ </g>
+ </g>
+ </g>
+ <g
+ id="g7626"
+ inkscape:label="preferences-folders-modules">
+ <path
+ sodipodi:nodetypes="sssssssscsssssccsscssscccccccccccccccccc"
+ inkscape:connector-curvature="0"
+ id="path7616"
+ d="M 95.53125,20 C 95.24212,20 95,20.24212 95,20.53125 l 0,14.9375 C 95,35.76725 95.23264,36 95.53125,36 l 14.9375,0 C 110.76735,36 111,35.76735 111,35.46875 l 0,-9.9375 C 111,25.24215 110.75788,25 110.46875,25 L 98,25 98,33.5 C 98,33.777 97.777,34 97.5,34 97.223,34 97,33.777 97,33.5 l 0,-9 C 97,24.223 97.223,24 97.5,24 l 2.96875,0 8.53125,0 0,-1.40625 C 109,22.26655 108.73334,22 108.40625,22 L 101,22 101,20.53125 C 101,20.2421 100.75788,20 100.46875,20 z M 103,27 l 6,0 0,2 -2,0 0,2 -2,0 0,-2 -2,0 z m -1,3 2,0 0,2 2,0 0,2 -6,0 0,-2 2,0 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none;display:inline" />
+ <rect
+ style="color:#bebebe;fill:none;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect7601"
+ width="16"
+ height="16"
+ x="95"
+ y="20" />
+ </g>
+ <g
+ id="g7668"
+ inkscape:label="preferences-folders-palettes">
+ <g
+ transform="translate(100,60)"
+ id="g7649"
+ inkscape:label="preferences-folders">
+ <path
+ inkscape:connector-curvature="0"
+ id="path7651"
+ transform="translate(-100,-60)"
+ d="M 115.53125,20 C 115.24212,20 115,20.24212 115,20.53125 l 0,14.9375 C 115,35.76725 115.23264,36 115.53125,36 l 14.9375,0 C 130.76735,36 131,35.76735 131,35.46875 l 0,-9.9375 C 131,25.24215 130.75788,25 130.46875,25 L 118,25 l 0,8.5 c 0,0.277 -0.223,0.5 -0.5,0.5 -0.277,0 -0.5,-0.223 -0.5,-0.5 l 0,-9 c 0,-0.277 0.223,-0.5 0.5,-0.5 l 2.96875,0 8.53125,0 0,-1.40625 C 129,22.26655 128.73334,22 128.40625,22 L 121,22 121,20.53125 C 121,20.2421 120.75788,20 120.46875,20 l -4.9375,0 z M 121,26 c 1.10457,0 2,0.895431 2,2 0,1.104569 -0.89543,2 -2,2 -1.10457,0 -2,-0.895431 -2,-2 0,-1.104569 0.89543,-2 2,-2 z m 7,0 c 1.10457,0 2,0.895431 2,2 0,1.104569 -0.89543,2 -2,2 -1.10457,0 -2,-0.895431 -2,-2 0,-1.104569 0.89543,-2 2,-2 z m -3.53125,4 c 1.10457,0 2,0.895431 2,2 0,1.104569 -0.89543,2 -2,2 -1.10457,0 -2,-0.895431 -2,-2 0,-1.104569 0.89543,-2 2,-2 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none;display:inline" />
+ <rect
+ y="-40"
+ x="15"
+ height="16"
+ width="16"
+ id="rect7653"
+ style="color:#bebebe;fill:none;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ </g>
+ <path
+ d="m 122,28 c 0,0.552285 -0.44772,1 -1,1 -0.55228,0 -1,-0.447715 -1,-1 0,-0.552285 0.44772,-1 1,-1 0.55228,0 1,0.447715 1,1 z"
+ sodipodi:ry="1"
+ sodipodi:rx="1"
+ sodipodi:cy="28"
+ sodipodi:cx="121"
+ id="path7664"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ sodipodi:type="arc" />
+ <path
+ d="m 129,28 c 0,0.552285 -0.44772,1 -1,1 -0.55228,0 -1,-0.447715 -1,-1 0,-0.552285 0.44772,-1 1,-1 0.55228,0 1,0.447715 1,1 z"
+ sodipodi:ry="1"
+ sodipodi:rx="1"
+ sodipodi:cy="28"
+ sodipodi:cx="128"
+ id="path7666"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none"
+ sodipodi:type="arc" />
+ </g>
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer1"
+ inkscape:label="stock">
+ <text
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;display:inline;font-family:Droid Sans"
+ x="-199.1768"
+ y="128.94501"
+ id="text10172"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan10174"
+ x="-199.1768"
+ y="128.94501">stock</tspan></text>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g15860"
+ inkscape:label="stock-rotate-180">
+ <rect
+ y="359"
+ x="41.000198"
+ height="16"
+ width="16"
+ id="rect10176"
+ style="fill:none;stroke:none" />
+ <path
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ d="m 43.0002,371 4,4 0,-8 z"
+ id="path15820"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path15848"
+ transform="translate(241.0002,217)"
+ d="m -193.5,142 c -0.17107,0 -0.33226,0.0183 -0.5,0.0312 l 0,2.03125 c 0.16677,-0.0187 0.32822,-0.0625 0.5,-0.0625 2.48528,0 4.5,2.01472 4.5,4.5 0,2.48528 -2.01472,4.5 -4.5,4.5 -0.17178,0 -0.33323,-0.0438 -0.5,-0.0625 l 0,2.03125 c 0.16774,0.013 0.32893,0.0312 0.5,0.0312 3.58985,0 6.5,-2.91014 6.5,-6.5 0,-3.58986 -2.91015,-6.5 -6.5,-6.5 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g15895"
+ inkscape:label="stock-rotate-270">
+ <rect
+ transform="matrix(0,-1,-1,0,0,0)"
+ style="fill:none;stroke:none"
+ id="rect15886"
+ width="16"
+ height="16"
+ x="-375"
+ y="-77.000198" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path15888"
+ d="m 65.0002,372 -4,-4 8,0 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ d="m 77.0002,367.5 c 0,0.17107 -0.0183,0.33226 -0.0313,0.5 l -2.03125,0 c 0.0187,-0.16677 0.0625,-0.32822 0.0625,-0.5 0,-2.48528 -2.01472,-4.5 -4.5,-4.5 -2.48528,0 -4.5,2.01472 -4.5,4.5 0,0.17178 0.0438,0.33323 0.0625,0.5 l -2.03125,0 c -0.013,-0.16774 -0.0313,-0.32893 -0.0313,-0.5 0,-3.58985 2.91014,-6.5 6.5,-6.5 3.58986,0 6.5,2.91015 6.5,6.5 z"
+ id="path15890"
+ inkscape:connector-curvature="0" />
+ </g>
+ <g
+ style="display:inline"
+ inkscape:label="stock-rotate-90"
+ id="g15900"
+ transform="matrix(-1,0,0,1,-82.9998,-217)">
+ <rect
+ y="-77.000198"
+ x="-375"
+ height="16"
+ width="16"
+ id="rect15902"
+ style="fill:none;stroke:none"
+ transform="matrix(0,-1,-1,0,0,0)" />
+ <path
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ d="m 65.0002,372 -4,-4 8,0 z"
+ id="path15904"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path15906"
+ d="m 77.0002,367.5 c 0,0.17107 -0.0183,0.33226 -0.0313,0.5 l -2.03125,0 c 0.0187,-0.16677 0.0625,-0.32822 0.0625,-0.5 0,-2.48528 -2.01472,-4.5 -4.5,-4.5 -2.48528,0 -4.5,2.01472 -4.5,4.5 0,0.17178 0.0438,0.33323 0.0625,0.5 l -2.03125,0 c -0.013,-0.16774 -0.0313,-0.32893 -0.0313,-0.5 0,-3.58985 2.91014,-6.5 6.5,-6.5 3.58986,0 6.5,2.91015 6.5,6.5 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ id="g11858"
+ inkscape:label="stock-FIXME">
+ <rect
+ y="142"
+ x="-140"
+ height="16"
+ width="16"
+ id="rect15927"
+ style="fill:none;stroke:none;display:inline" />
+ <rect
+ y="143"
+ x="-138"
+ height="5"
+ width="7.0000014"
+ id="rect15929"
+ style="fill:#bebebe;fill-opacity:1;stroke:none;display:inline" />
+ <rect
+ y="149"
+ x="-130"
+ height="5"
+ width="0.99999839"
+ id="rect15931"
+ style="fill:#bebebe;fill-opacity:1;stroke:none;display:inline" />
+ <rect
+ y="151"
+ x="-132"
+ height="1"
+ width="4.9999986"
+ id="rect15933"
+ style="fill:#bebebe;fill-opacity:1;stroke:none;display:inline" />
+ <rect
+ y="143"
+ x="-140"
+ height="1"
+ width="1"
+ id="rect15935"
+ style="fill:#bebebe;fill-opacity:1;stroke:none;display:inline" />
+ <rect
+ y="145"
+ x="-140"
+ height="1"
+ width="1"
+ id="rect15937"
+ style="fill:#bebebe;fill-opacity:1;stroke:none;display:inline" />
+ <rect
+ y="147"
+ x="-140"
+ height="1"
+ width="1"
+ id="rect15939"
+ style="fill:#bebebe;fill-opacity:1;stroke:none;display:inline" />
+ <rect
+ y="149"
+ x="-140"
+ height="1"
+ width="1"
+ id="rect15941"
+ style="fill:#bebebe;fill-opacity:1;stroke:none;display:inline" />
+ <rect
+ y="151"
+ x="-140"
+ height="1"
+ width="1"
+ id="rect15943"
+ style="fill:#bebebe;fill-opacity:1;stroke:none;display:inline" />
+ <rect
+ y="153"
+ x="-140"
+ height="1"
+ width="1"
+ id="rect15945"
+ style="fill:#bebebe;fill-opacity:1;stroke:none;display:inline" />
+ <rect
+ y="155"
+ x="-140"
+ height="1"
+ width="1"
+ id="rect15947"
+ style="fill:#bebebe;fill-opacity:1;stroke:none;display:inline" />
+ <rect
+ y="157"
+ x="-140"
+ height="1"
+ width="1"
+ id="rect15949"
+ style="fill:#bebebe;fill-opacity:1;stroke:none;display:inline" />
+ <rect
+ y="157"
+ x="-138"
+ height="1"
+ width="1"
+ id="rect15951"
+ style="fill:#bebebe;fill-opacity:1;stroke:none;display:inline" />
+ <rect
+ y="157"
+ x="-136"
+ height="1"
+ width="1"
+ id="rect15953"
+ style="fill:#bebebe;fill-opacity:1;stroke:none;display:inline" />
+ <rect
+ y="157"
+ x="-134"
+ height="1"
+ width="1"
+ id="rect15955"
+ style="fill:#bebebe;fill-opacity:1;stroke:none;display:inline" />
+ <rect
+ y="157"
+ x="-132"
+ height="1"
+ width="1"
+ id="rect15957"
+ style="fill:#bebebe;fill-opacity:1;stroke:none;display:inline" />
+ <rect
+ y="157"
+ x="-130"
+ height="1"
+ width="1"
+ id="rect15959"
+ style="fill:#bebebe;fill-opacity:1;stroke:none;display:inline" />
+ <rect
+ y="157"
+ x="-128"
+ height="1"
+ width="1"
+ id="rect15961"
+ style="fill:#bebebe;fill-opacity:1;stroke:none;display:inline" />
+ <rect
+ y="157"
+ x="-126"
+ height="1"
+ width="1"
+ id="rect15963"
+ style="fill:#bebebe;fill-opacity:1;stroke:none;display:inline" />
+ <rect
+ y="155"
+ x="-126"
+ height="1"
+ width="1"
+ id="rect15965"
+ style="fill:#bebebe;fill-opacity:1;stroke:none;display:inline" />
+ <rect
+ y="153"
+ x="-126"
+ height="1"
+ width="1"
+ id="rect15967"
+ style="fill:#bebebe;fill-opacity:1;stroke:none;display:inline" />
+ <rect
+ y="151"
+ x="-126"
+ height="1"
+ width="1"
+ id="rect15969"
+ style="fill:#bebebe;fill-opacity:1;stroke:none;display:inline" />
+ <rect
+ y="149"
+ x="-126"
+ height="1"
+ width="1"
+ id="rect15971"
+ style="fill:#bebebe;fill-opacity:1;stroke:none;display:inline" />
+ <rect
+ y="147"
+ x="-126"
+ height="1"
+ width="1"
+ id="rect15973"
+ style="fill:#bebebe;fill-opacity:1;stroke:none;display:inline" />
+ <rect
+ y="145"
+ x="-126"
+ height="1"
+ width="1"
+ id="rect15975"
+ style="fill:#bebebe;fill-opacity:1;stroke:none;display:inline" />
+ <rect
+ y="143"
+ x="-126"
+ height="1"
+ width="1"
+ id="rect15977"
+ style="fill:#bebebe;fill-opacity:1;stroke:none;display:inline" />
+ <rect
+ y="143"
+ x="-128"
+ height="1"
+ width="1"
+ id="rect15979"
+ style="fill:#bebebe;fill-opacity:1;stroke:none;display:inline" />
+ <rect
+ y="143"
+ x="-130"
+ height="1"
+ width="1"
+ id="rect15981"
+ style="fill:#bebebe;fill-opacity:1;stroke:none;display:inline" />
+ <rect
+ y="155"
+ x="-132"
+ height="1"
+ width="5"
+ id="rect15983"
+ style="fill:#bebebe;fill-opacity:1;stroke:none;display:inline" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g16014"
+ inkscape:label="stock-shape-circle">
+ <rect
+ transform="translate(241.0002,217)"
+ y="142"
+ x="-120"
+ height="16"
+ width="16"
+ id="rect15985"
+ style="fill:none;stroke:none" />
+ <path
+ transform="matrix(1.3333329,0,0,1.3333327,277.66682,166.33343)"
+ d="m -107,150.5 c 0,2.48528 -2.01472,4.5 -4.5,4.5 -2.48528,0 -4.5,-2.01472 -4.5,-4.5 0,-2.48528 2.01472,-4.5 4.5,-4.5 2.48528,0 4.5,2.01472 4.5,4.5 z"
+ sodipodi:ry="4.5"
+ sodipodi:rx="4.5"
+ sodipodi:cy="150.5"
+ sodipodi:cx="-111.5"
+ id="path16012"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ sodipodi:type="arc" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g16028"
+ inkscape:label="stock-shape-diamond">
+ <rect
+ style="fill:none;stroke:none"
+ id="rect16020"
+ width="16"
+ height="16"
+ x="141.0002"
+ y="359" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ transform="translate(241.0002,217)"
+ inkscape:connector-curvature="0"
+ id="path16026"
+ d="m -99,150 7,-7 7,7 -7,7 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g16036"
+ inkscape:label="stock-shape-square">
+ <rect
+ transform="translate(241.0002,217)"
+ y="142"
+ x="-80"
+ height="16"
+ width="16"
+ id="rect16032"
+ style="fill:none;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="144"
+ x="-78"
+ height="12"
+ width="12"
+ id="rect16034"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g16174"
+ inkscape:label="stock-anchor">
+ <rect
+ transform="translate(241.0002,217)"
+ y="142"
+ x="-60"
+ height="16"
+ width="16"
+ id="rect16059"
+ style="fill:none;stroke:none" />
+ <g
+ id="g16133"
+ transform="matrix(-0.05495446,0,0,0.05788099,195.91579,358.1862)"
+ style="fill:#bebebe;fill-opacity:1">
+ <path
+ sodipodi:nodetypes="ccccccccccccccccccccccccccccccccccccccccccc"
+ inkscape:connector-curvature="0"
+ id="path16135"
+ transform="matrix(-18.196885,0,0,17.27683,-820.39583,-2439.2499)"
+ d="M -52.43815,147 -53,147 l 0,2 -3,0 0,1 3,0 0,5 0,1 c -1.164726,0.27623 -2.467861,-0.46036 -3.46875,-1.3125 l 0.71875,-0.5 c 0.24954,-0.15638 0.27497,-0.58768 0.03125,-0.71875 l -0.875,-0.46875 -0.46875,-0.25 -1.34375,-0.6875 c -0.04412,-0.0268 -0.0732,-0.0555 -0.125,-0.0625 -0.22288,-0.0122 -0.47075,0.20092 -0.46875,0.4375 l 0,1.625 0,1.625 c 0.005,0.29142 0.38819,0.4813 0.625,0.3125 l 1.0625,-0.75 c 1.173875,1.1755 3.1634,2.75 5.3125,2.75 l 0.0625,0 c 2.138502,0 4.10519,-1.57624 5.28125,-2.75 l 1,0.65625 c 0.23681,0.16496 0.58875,0.004 0.59375,-0.28125 l 0,-1.59375 0,-1.59375 c 0.002,-0.23119 -0.21462,-0.4495 -0.4375,-0.4375 -0.0518,0.007 -0.11213,0.0363 -0.15625,0.0625 l -1.1875,0.625 -0.125,0.0625 -1.34375,0.65625 c -0.24372,0.12809 -0.24954,0.56593 0,0.71875 l 0.8125,0.5625 c -0.998337,0.84536 -2.342466,1.58702 -3.5,1.3125 l 0,-1 0,-5 3,0 0,-1 -3,0 0,-2 -0.75,0 z"
+ style="fill:#bebebe;fill-opacity:1" />
+ </g>
+ <path
+ inkscape:connector-curvature="0"
+ id="path16167"
+ transform="translate(241.0002,217)"
+ d="m -52,142 c -1.65688,0 -3,1.34311 -3,3 0,1.65686 1.34312,3 3,3 1.65686,0 3,-1.34314 3,-3 0,-1.65689 -1.34314,-3 -3,-3 z m 0,1.5 c 0.81356,0 1.5,0.6856 1.5,1.5 0,0.8144 -0.68644,1.5 -1.5,1.5 -0.81356,0 -1.5,-0.6856 -1.5,-1.5 0,-0.8144 0.68644,-1.5 1.5,-1.5 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g4964"
+ inkscape:label="stock-close">
+ <rect
+ transform="translate(241.0002,217)"
+ y="162"
+ x="-200"
+ height="16"
+ width="16"
+ id="rect4155"
+ style="fill:none;stroke:none" />
+ <path
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ d="m 53.0002,383 -1.333332,0 -6.666668,6.66668 0,1.33332 1.333332,0 6.666668,-6.66668 z"
+ id="path4934"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4936"
+ d="m 45.0002,383 1.333332,0 6.666668,6.66668 0,1.33332 -1.333332,0 -6.666668,-6.66668 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4961"
+ transform="translate(241.0002,217)"
+ d="m -198,163 c -0.55349,0 -1,0.44651 -1,1 l 0,12 c 0,0.55349 0.44651,1 1,1 l 12,0 c 0.55349,0 1,-0.44651 1,-1 l 0,-12 c 0,-0.55349 -0.44651,-1 -1,-1 l -12,0 z m 1,1 10,0 c 0.55349,0 1,0.44651 1,1 l 0,10 c 0,0.55349 -0.44651,1 -1,1 l -10,0 c -0.55349,0 -1,-0.44651 -1,-1 l 0,-10 c 0,-0.55349 0.44651,-1 1,-1 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g5003"
+ inkscape:label="stock-duplicate">
+ <rect
+ transform="translate(241.0002,217)"
+ y="162"
+ x="-180"
+ height="16"
+ width="16"
+ id="rect4989"
+ style="fill:none;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4993"
+ d="m 62.0002,381 0,8 10,0 0,-8 -10,0 z m 1,1 8,0 0,6 -8,0 0,-6 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4998"
+ transform="translate(241.0002,217)"
+ d="m -168,168 0,1 2,0 0,6 -8,0 0,-2 -1,0 0,3 10,0 0,-8 -3,0 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g11667"
+ inkscape:label="stock-flip-vertical">
+ <g
+ inkscape:label="stock-flip-vertical"
+ id="g6273">
+ <rect
+ transform="matrix(0,1,-1,0,0,0)"
+ y="-117.0002"
+ x="379"
+ height="16"
+ width="16"
+ id="rect6216"
+ style="fill:none;stroke:none" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path6220"
+ d="m 110.0002,381 -2,0 c -0.007,3.98964 -0.0265,8.01048 0.006,12.00001 l 2,0 c -0.10306,-3.9883 -0.0197,-8.00953 -0.006,-12.00001 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6222"
+ d="M 109.02328,394.00001 105.0002,390 l 8,0 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ d="m 109.02328,380 -4.02308,4.00001 8,0 z"
+ id="path6271"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc" />
+ </g>
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g11674"
+ inkscape:label="stock-flip-horizontal">
+ <rect
+ transform="scale(-1,-1)"
+ y="-395"
+ x="-97.000198"
+ height="16"
+ width="16"
+ id="rect6281"
+ style="fill:none;stroke:none" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path6283"
+ d="m 95.0002,388 0,-2 c -3.98964,-0.007 -8.01048,-0.0265 -12.00001,0.006 l 0,2 c 3.9883,-0.10306 8.00953,-0.0197 12.00001,-0.006 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6285"
+ d="M 82.00019,387.02308 86.0002,383 l 0,8 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ d="M 96.0002,387.02308 92.00019,383 l 0,8 z"
+ id="path6287"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g6316"
+ inkscape:label="stock-grid">
+ <rect
+ transform="translate(241.0002,217)"
+ y="162"
+ x="-120"
+ height="16"
+ width="16"
+ id="rect6296"
+ style="fill:none;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="162"
+ x="-120"
+ height="16"
+ width="1"
+ id="rect6300"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="177"
+ x="-120"
+ height="1"
+ width="16"
+ id="rect6302"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="162"
+ x="-105"
+ height="16"
+ width="1"
+ id="rect6304"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="162"
+ x="-120"
+ height="1"
+ width="16"
+ id="rect6306"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="379"
+ x="126.0002"
+ height="16"
+ width="1"
+ id="rect6308"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="379"
+ x="131.0002"
+ height="16"
+ width="1"
+ id="rect6310"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="384"
+ x="121.0002"
+ height="1"
+ width="16"
+ id="rect6312"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="172"
+ x="-120"
+ height="1"
+ width="16"
+ id="rect6314"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g10693"
+ inkscape:label="stock-image">
+ <rect
+ transform="translate(241.0002,217)"
+ y="162"
+ x="-100"
+ height="16"
+ width="16"
+ id="rect6346"
+ style="fill:none;stroke:none" />
+ <path
+ sodipodi:nodetypes="cccccccccc"
+ inkscape:connector-curvature="0"
+ id="rect5882"
+ d="m 142.0002,379.9 0,14.1 14,0 0,-14.1 z m 1,1.1 12,0 0,9 -12,0 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect10683"
+ transform="translate(241.0002,217)"
+ d="m -97,165 0,7 1,0 c 0,-0.75515 0.671573,-1.375 1.5,-1.375 0.828427,0 1.5,0.61985 1.5,1.375 l 1,0 0,-1.5 c 1.4e-4,-0.98573 -0.7274,-1.47402 -2,-2.0625 0,0 0.02947,3.7e-4 0.25,0 0.40803,0.0835 1.38212,0.3501 1.75,0.59375 -0.09819,-0.35554 -0.14101,-0.89353 -0.4375,-1.34375 C -92.73401,167.23732 -94,166.34375 -94,166.34375 l 0.0625,-0.0312 c 0.05568,-0.0402 0.9453,0.7655 1.25,0.6875 -0.13515,-0.32497 -0.25949,-0.63468 -0.40625,-0.8125 l 0.1875,-0.0312 c 0.35629,0.59147 0.46684,0.72309 0.84375,1.15625 0.12472,0.0571 -0.03108,-0.0423 1.0625,-0.59375 L -91,167 c 0,0 -1.0625,0.30993 -0.75,0.90625 0.22248,0.30573 0.39823,1.01025 0.75,1.09375 0,0 0.85009,-1.22532 1.5,-1.625 0,0 -0.21923,-0.50879 -0.21875,-0.78125 3.7e-4,-0.20918 0.15625,-0.59375 0.15625,-0.59375 0.02319,0.39561 -0.0029,0.83091 0.28125,1.21875 L -88.34375,166 -88,166 c 0,0 -2.25088,2.3886 -2,2.78125 0.39455,-0.048 2,-0.34375 2,-0.34375 l 0,0.0625 c -1.04689,0.34884 -1.67111,0.68872 -2,1.5 l 0,2 3,0 0,-7 -10,0 z"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g10764"
+ inkscape:label="stock-transparency">
+ <rect
+ transform="translate(241.0002,217)"
+ y="162"
+ x="-80"
+ height="16"
+ width="16"
+ id="rect10717"
+ style="opacity:0.3;fill:none;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="162"
+ x="-80"
+ height="4"
+ width="4"
+ id="rect10732"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="166"
+ x="-76"
+ height="4"
+ width="4"
+ id="rect10734"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="162"
+ x="-72"
+ height="4"
+ width="4"
+ id="rect10736"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="166"
+ x="-68"
+ height="4"
+ width="4"
+ id="rect10738"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="170"
+ x="-72"
+ height="4"
+ width="4"
+ id="rect10740"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="170"
+ x="-80"
+ height="4"
+ width="4"
+ id="rect10742"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="174"
+ x="-76"
+ height="4"
+ width="4"
+ id="rect10744"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="174"
+ x="-68"
+ height="4"
+ width="4"
+ id="rect10746"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="166"
+ x="-80"
+ height="4"
+ width="4"
+ id="rect10748"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect10750"
+ width="4"
+ height="4"
+ x="165.0002"
+ y="379" />
+ <rect
+ y="379"
+ x="173.0002"
+ height="4"
+ width="4"
+ id="rect10752"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect10754"
+ width="4"
+ height="4"
+ x="169.0002"
+ y="383" />
+ <rect
+ y="387"
+ x="173.0002"
+ height="4"
+ width="4"
+ id="rect10756"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect10758"
+ width="4"
+ height="4"
+ x="165.0002"
+ y="387" />
+ <rect
+ y="391"
+ x="169.0002"
+ height="4"
+ width="4"
+ id="rect10760"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect10762"
+ width="4"
+ height="4"
+ x="161.0002"
+ y="391" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g17384"
+ inkscape:label="stock-zoom-follow-window">
+ <path
+ sodipodi:nodetypes="ccccccccccccccccccccccccccsssscccccccccccccccccccccccccccssssscccc"
+ inkscape:connector-curvature="0"
+ id="rect3783-5"
+ transform="translate(241.0002,217)"
+ d="m -60,162 0,3 2,0 0,2 -2,0 0,2 2,0 0,2 -2,0 0,2 2,0 0,2 -2,0 0,3 3,0 0,-2 2,0 0,2 2,0 0,-2 2,0 0,2 5.375,0 c -0.35059,-0.0304 -0.688782,-0.18823 -0.9375,-0.4375 l -2.96875,-2.96875 c -0.0571,-0.0581 -0.109415,-0.12085 -0.15625,-0.1875 C -50.383763,174.7757 -51.16144,175 -52,175 c -2.74815,0 -5,-2.25186 -5,-5 0,-2.74814 2.25185,-5 5,-5 2.74816,0 5,2.25186 5,5 0,0.82853 -0.232499,1.59105 -0.59375,2.28125 0.06791,0.0567 0.130743,0.11958 0.1875,0.1875 l 2.96875,2.96875 c 0.230694,0.22486 0.386549,0.52544 0.4375,0.84375 L -44,171 l -2,0 0,-2 2,0 0,-2 -2,0 0,-2 2,0 0,-3 -2,0 -1,0 0,2 -2,0 0,-2 -2,0 0,2 -2,0 0,-2 -2,0 0,2 -2,0 0,-2 z m 8,5.0625 c -1.618241,0 -2.9375,1.31926 -2.9375,2.9375 0,1.61824 1.319259,2.9375 2.9375,2.9375 1.618241,0 2.9375,-1.31926 2.9375,-2.9375 0,-1.61824 -1.319259,-2.9375 -2.9375,-2.9375 z m 8,9.53125 c -0.04483,0.70343 -0.643904,1.33037 -1.34375,1.40625 L -44,178 z"
+ style="fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="rect3898"
+ d="m 181.0002,379 0,16 16,0 0,-16 z"
+ style="fill:none;stroke:none" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g29447"
+ inkscape:label="stock-info">
+ <rect
+ transform="translate(241.0002,217)"
+ y="182"
+ x="-200"
+ height="16"
+ width="16"
+ id="rect21704"
+ style="fill:none;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path5327"
+ d="M 44.79074,409.04693 z"
+ style="fill:none;stroke:#000000;stroke-width:0.99851286px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path5329"
+ d="M 44.8219,409.10943 z"
+ style="fill:none;stroke:#000000;stroke-width:0.99851286px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="ssccccccccssssccccccccss"
+ inkscape:connector-curvature="0"
+ id="path4561"
+ d="m 49,399 c -2.749575,0 -5,2.25042 -5,5 0,1.58622 0.844588,2.90336 2,3.8125 l 0,2.1875 2e-4,0 1,0 4,0 1,0 -2e-4,0 0,-2.1875 c 1.155412,-0.90914 2,-2.22628 2,-3.8125 0,-2.74958 -2.250425,-5 -5,-5 z m 0,2 c 1.668685,0 3,1.33132 3,3 0,1.11585 -0.595067,2.03788 -1.5,2.5625 l -0.5,0.3125 0,0.5625 2e-4,0.5625 -2,0 -2e-4,-0.5625 0,-0.5625 -0.5,-0.3125 C 46.595067,406.03788 46,405.11585 46,404 c 0,-1.66868 1.331315,-3 3,-3 z"
+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2.00000024;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4488-4"
+ d="m 47.0002,414 0,1 4,0 0,-1 -4,0 z"
+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4488-4-7"
+ d="m 46.0002,411 0,2 6,0 0,-2 -6,0 z"
+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="187"
+ x="-193"
+ height="1"
+ width="2"
+ id="rect29445"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g29992"
+ inkscape:label="stock-cap-square">
+ <rect
+ transform="translate(241.0002,217)"
+ y="182"
+ x="-180"
+ height="16"
+ width="16"
+ id="rect29475"
+ style="opacity:0.3;fill:none;stroke:none" />
+ <path
+ sodipodi:nodetypes="ccccccccc"
+ inkscape:connector-curvature="0"
+ id="rect29477"
+ d="m 64.0002,402 0,13 2,0 0,-11 6,0 0,11 2,0 0,-13 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="406"
+ x="68.000198"
+ height="9"
+ width="2.0000017"
+ id="rect29482"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g30046"
+ inkscape:label="stock-cap-round">
+ <g
+ inkscape:label="stock-cap-round"
+ id="g30041">
+ <rect
+ y="399"
+ x="81.000198"
+ height="16"
+ width="16"
+ id="rect30018"
+ style="opacity:0.3;fill:none;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ d="m -152,185 c -2.77,0 -5,1 -5,5 l 0,8 2,0 0,-8 c 0,-3 2,-3 3,-3 1,0 3,0 3,3 l 0,8 2,0 0,-8 c 0,-4 -2.23,-5 -5,-5 z"
+ transform="translate(241.0002,217)"
+ id="rect30026" />
+ <path
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none"
+ d="m 89.000198,406 c 0.554,0 1,0.446 1,1 l 2e-6,8 -2,0 -2e-6,-8 c 0,-0.554 0.446,-1 1,-1 z"
+ id="rect30037"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ssccss" />
+ </g>
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g30079"
+ inkscape:label="stock-cap-butt">
+ <rect
+ transform="translate(241.0002,217)"
+ y="182"
+ x="-140"
+ height="16"
+ width="16"
+ id="rect30071"
+ style="fill:none;stroke:none" />
+ <rect
+ y="405"
+ x="104.0002"
+ height="10"
+ width="2.0000017"
+ id="rect30073"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect30075"
+ width="2"
+ height="10"
+ x="112.0002"
+ y="405" />
+ <rect
+ y="405"
+ x="108.0002"
+ height="10"
+ width="2"
+ id="rect30077"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g30155"
+ inkscape:label="stock-reset">
+ <rect
+ transform="translate(241.0002,217)"
+ y="182"
+ x="-120"
+ height="16"
+ width="16"
+ id="rect30123"
+ style="opacity:0.3;fill:none;stroke:none" />
+ <path
+ transform="matrix(1.25,0,0,1.25,271.2502,167.5)"
+ d="m -115,196 c 0,1.10457 -0.89543,2 -2,2 -1.10457,0 -2,-0.89543 -2,-2 0,-1.10457 0.89543,-2 2,-2 1.10457,0 2,0.89543 2,2 z"
+ sodipodi:ry="2"
+ sodipodi:rx="2"
+ sodipodi:cy="196"
+ sodipodi:cx="-117"
+ id="path30125"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ sodipodi:type="arc" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path30137"
+ d="M 125.02328,409.00001 121.0002,405 l 8,0 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ sodipodi:nodetypes="cccscccccscccccccc"
+ inkscape:connector-curvature="0"
+ id="path30149"
+ d="m 124.90645,401 c -0.49158,0.0463 -0.90838,0.50624 -0.90625,1 l 0,4 c -0.007,0.52831 0.47163,1.01424 1,1.01424 0.52837,0 1.00747,-0.48593 1,-1.01424 l 0,-3 8,0 0,9 -4,0 c -0.52831,-0.007 -1.01424,0.47163 -1.01424,1 0,0.52837 0.48593,1.00747 1.01424,1 l 5,0 c 0.52358,-5e-5 0.99995,-0.47642 1,-1 l 0,-11 c -5e-5,-0.52358 -0.47642,-0.99995 -1,-1 l -10,0 c -0.0312,-10e-4 -0.0625,-10e-4 -0.0937,0 z"
+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g34494"
+ inkscape:label="stock-edit">
+ <rect
+ transform="translate(241.0002,217)"
+ y="182"
+ x="-100"
+ height="16"
+ width="16"
+ id="rect30195"
+ style="fill:none;stroke:none" />
+ <path
+ sodipodi:nodetypes="ccccccccccc"
+ inkscape:connector-curvature="0"
+ id="path2273-6-2-3"
+ transform="translate(241.0002,217)"
+ d="m -86,183 -1,1 2,2 1,-1 c 0,-1 -1,-2 -2,-2 z m -2.397748,2.39775 L -95,192 l 0,2 2,0 6.602252,-6.60225 z"
+ style="fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+ <rect
+ y="401"
+ x="141.0002"
+ height="2"
+ width="8.0000019"
+ id="rect30216"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="405"
+ x="141.0002"
+ height="2"
+ width="4.0000014"
+ id="rect30218"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="409"
+ x="141.0002"
+ height="2"
+ width="3"
+ id="rect30220"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="413"
+ x="141.0002"
+ height="2"
+ width="12.000002"
+ id="rect30222"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g34549"
+ inkscape:label="stock-error">
+ <rect
+ y="399"
+ x="161.0002"
+ height="16"
+ width="16"
+ id="rect34534"
+ style="fill:none;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ class="error"
+ id="path10839-3"
+ d="m 169.03145,400 c -3.85327,0 -6.96875,3.11547 -6.96875,6.96875 0,3.85327 3.11548,6.96875 6.96875,6.96875 3.85327,0 6.96875,-3.11548 6.96875,-6.96875 0,-3.85328 -3.11548,-6.96875 -6.96875,-6.96875 z m -4,5.96875 8,0 0,2 -8,0 0,-2 z"
+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.78124988;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Andale Mono;-inkscape-font-specification:Andale Mono" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g11443"
+ inkscape:label="stock-delete-tool-preset">
+ <rect
+ style="fill:none;stroke:none"
+ id="rect10648"
+ width="16"
+ height="16"
+ x="61.000198"
+ y="419" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path10650"
+ d="m 72.0002,424 -0.999999,0 -5.000001,5.00001 0,0.99999 0.999999,0 5.000001,-5.00001 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ d="m 66.0002,424 0.999999,0 5.000001,5.00001 0,0.99999 -0.999999,0 -5.000001,-5.00001 z"
+ id="path10652"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path11440"
+ transform="translate(241.0002,217)"
+ d="m -172,203 c -3.86599,0 -7,3.13401 -7,7 0,3.86599 3.13401,7 7,7 3.86599,0 7,-3.13401 7,-7 0,-3.86599 -3.13401,-7 -7,-7 z m 0,2 c 2.76143,0 5,2.23857 5,5 0,2.76142 -2.23857,5 -5,5 -2.76143,0 -5,-2.23858 -5,-5 0,-2.76143 2.23857,-5 5,-5 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g11577"
+ inkscape:label="stock-tool-options">
+ <g
+ transform="translate(-360.9998,17.000031)"
+ inkscape:label="emblem-system"
+ id="g4757"
+ style="display:inline">
+ <rect
+ y="401.99997"
+ x="442"
+ height="16"
+ width="16"
+ id="rect35549-4"
+ style="color:#bebebe;fill:none;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ sodipodi:nodetypes="sccccccccccsccccccccccsccccccccccsccccccccccssssss"
+ inkscape:connector-curvature="0"
+ id="path35543-6-4"
+ d="m 450.0002,403 c -0.22065,0 -0.44081,0.0113 -0.65625,0.0312 l -0.40625,2.09375 c -0.33446,0.0733 -0.66305,0.17589 -0.96875,0.3125 l -1.53125,-1.46875 c -0.38863,0.23011 -0.72695,0.51408 -1.0625,0.8125 l 0.90625,1.90625 c -0.22242,0.24899 -0.42425,0.5225 -0.59375,0.8125 l -2.09375,-0.28125 c -0.17772,0.40877 -0.30872,0.83637 -0.40625,1.28125 l 1.84375,1 c -0.0171,0.16809 -0.0312,0.3274 -0.0312,0.5 0,0.1726 0.0142,0.33191 0.0312,0.5 l -1.84375,1 c 0.0975,0.44488 0.22853,0.87248 0.40625,1.28125 l 2.09375,-0.28125 c 0.1695,0.29 0.37133,0.56351 0.59375,0.8125 l -0.90625,1.90625 c 0.33555,0.29842 0.67387,0.58239 1.0625,0.8125 l 1.53125,-1.46875 c 0.3057,0.13661 0.63429,0.23916 0.96875,0.3125 l 0.40625,2.09375 c 0.21544,0.02 0.4356,0.0312 0.65625,0.0312 0.22065,0 0.44081,-0.0113 0.65625,-0.0312 l 0.40625,-2.09375 c 0.33446,-0.0733 0.66305,-0.17589 0.96875,-0.3125 l 1.53125,1.46875 c 0.38863,-0.23011 0.72695,-0.51408 1.0625,-0.8125 l -0.90625,-1.90625 c 0.22242,-0.24899 0.42425,-0.5225 0.59375,-0.8125 l 2.09375,0.28125 c 0.17772,-0.40877 0.30872,-0.83637 0.40625,-1.28125 l -1.84375,-1 c 0.0171,-0.16809 0.0312,-0.3274 0.0312,-0.5 0,-0.1726 -0.0142,-0.33191 -0.0312,-0.5 l 1.84375,-1 c -0.0975,-0.44488 -0.22853,-0.87248 -0.40625,-1.28125 l -2.09375,0.28125 c -0.1695,-0.29 -0.37133,-0.56351 -0.59375,-0.8125 l 0.90625,-1.90625 c -0.33555,-0.29842 -0.67387,-0.58239 -1.0625,-0.8125 l -1.53125,1.46875 c -0.3057,-0.13661 -0.63429,-0.23916 -0.96875,-0.3125 l -0.40625,-2.09375 C 450.44101,403.0112 450.22085,403 450.0002,403 z m 0,4 c 1.65685,0 3,1.34315 3,3 0,1.65685 -1.34315,3 -3,3 -1.65685,0 -3,-1.34315 -3,-3 0,-1.65685 1.34315,-3 3,-3 z"
+ style="color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ </g>
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g11680"
+ inkscape:label="stock-save-tool-preset">
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path11635"
+ d="m 49.0002,429 -4.02308,-4 8,0 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <g
+ inkscape:label="stock-save-tool-preset"
+ id="g10619">
+ <g
+ style="display:inline"
+ id="g4561"
+ transform="translate(-118.9998,-119)"
+ inkscape:label="document-save">
+ <path
+ style="color:#bebebe;fill:none;stroke:#bebebe;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 163.5,549 1,-1.5 m 7,0 1,1.5"
+ id="rect4390-9"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc" />
+ <rect
+ transform="matrix(0,1,1,0,0,0)"
+ style="color:#bebebe;fill:none;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new"
+ id="rect10837-5-8-4-4-4-1"
+ y="160"
+ x="538"
+ height="16"
+ width="16" />
+ <g
+ id="g4555">
+ <path
+ style="color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 163,549 0,4 10,0 0,-4 z m 3.34375,1.4375 c 0.0208,-10e-4 0.0417,-10e-4 0.0625,0 0.29096,-0.0556 0.59898,0.20383 0.59375,0.5 l 0,0.0625 2,0 0,-0.0625 c -0.004,-0.26416 0.23582,-0.50712 0.5,-0.50712 0.26418,0 0.50373,0.24296 0.5,0.50712 L 170,551 c 0,0.54535 -0.45465,1 -1,1 l -2,0 c -0.54535,0 -1,-0.45465 -1,-1 l 0,-0.0625 c -0.0108,-0.21706 0.13723,-0.43234 0.34375,-0.5 z"
+ id="rect11668-7-5"
+ sodipodi:nodetypes="ccccccsccccsccccccc"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ </g>
+ <rect
+ y="420"
+ x="48.000198"
+ height="7"
+ width="2"
+ id="rect11650"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g11658"
+ inkscape:label="stock-tool-restore-preset">
+ <g
+ inkscape:label="stock-tool-restore-preset"
+ id="g10558">
+ <g
+ transform="translate(-200.02624,-268.03125)"
+ style="display:inline"
+ id="g13343"
+ inkscape:label="document-revert">
+ <g
+ transform="matrix(0.9983463,0,0,1,201.29767,21.03125)"
+ inkscape:label="document-properties"
+ id="g13307"
+ style="display:inline">
+ <rect
+ y="646"
+ x="180"
+ height="16"
+ width="16"
+ id="rect13309"
+ style="fill:none;stroke:none" />
+ <path
+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans"
+ d="m 125,562.96875 -1.96875,0.0312 0,-11 4.5625,0 3.40625,3.40625 0,1.5625 2,0 0,-2 c -0.002,-0.26843 -0.11756,-0.53419 -0.3125,-0.71875 l -3.96875,-3.9375 C 128.53419,550.11756 128.26843,550.00201 128,550 l -5.96875,0 c -0.52358,5e-5 -0.99995,0.47642 -1,1 l 0,12 0,0.25 0,0.71875 c 5e-5,0.52358 0.47642,0.99995 1,1 l 4.96875,0 z"
+ transform="translate(61.0002,97)"
+ id="path13311"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccccccccccccccc" />
+ </g>
+ <g
+ transform="matrix(0.88654273,0,0,0.90512794,38.384067,45.821206)"
+ id="g13339" />
+ </g>
+ </g>
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path11654"
+ d="m 186.0002,409 4,-4 0,8 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <g
+ id="g35733-6-3"
+ inkscape:label="edit-undo"
+ transform="matrix(1,0,0,-1,81.0006,730.9779)"
+ style="display:inline">
+ <g
+ style="opacity:0.25"
+ id="g35737-5-4-1" />
+ <path
+ sodipodi:nodetypes="csssc"
+ inkscape:connector-curvature="0"
+ id="path11656"
+ d="m 112.39765,316.91754 0.4349,0 c 1.20095,0 2.17451,1.13618 2.17451,2.53772 0,1.40154 -0.97356,2.53772 -2.17451,2.53772 l -5.65373,0"
+ style="color:#000000;fill:none;stroke:#bebebe;stroke-width:1.87928438;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ </g>
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g11697"
+ inkscape:label="stock-undo-history">
+ <path
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ d="m 101.0002,429 4.00001,-4.02308 0,8 z"
+ id="path11633"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc" />
+ <rect
+ style="color:#bebebe;fill:none;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible"
+ id="rect35735-0-1"
+ width="16"
+ height="16"
+ x="19.99975"
+ y="296"
+ transform="matrix(1,0,0,-1,81.0006,730.9779)" />
+ <path
+ sodipodi:nodetypes="csssc"
+ inkscape:connector-curvature="0"
+ id="path35770-4-9"
+ d="m 28.9998,297 0.5,0 c 1.380711,0 2.5,1.11929 2.5,2.5 0,1.38071 -1.1193,2.50555 -2.5,2.5 l -5.5002,-0.0221"
+ style="color:#000000;fill:none;stroke:#bebebe;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ transform="matrix(1,0,0,-1,81.0006,730.9779)" />
+ <path
+ style="opacity:0.3;color:#000000;fill:none;stroke:#bebebe;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 31.9998,303 0.5,0 c 1.380711,0 2.5,1.11929 2.5,2.5 0,1.38071 -1.1193,2.50555 -2.5,2.5 l -5.5002,-0.0221"
+ id="path11692"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="csssc"
+ transform="matrix(1,0,0,-1,81.0006,730.9779)" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path11690"
+ d="m 104.0002,423 4.00001,-4.02308 0,8 z"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g11741"
+ inkscape:label="stock-text-layer">
+ <rect
+ transform="translate(241.0002,217)"
+ y="202"
+ x="-120"
+ height="16"
+ width="16"
+ id="rect11723"
+ style="opacity:0.3;fill:none;stroke:none" />
+ <path
+ sodipodi:nodetypes="ccccccccccccc"
+ inkscape:connector-curvature="0"
+ id="path11725"
+ transform="translate(241.0002,217)"
+ d="m -119,210 -1,7 14.9375,-0.0625 L -104,210 l -2.40625,0 1.03125,3 -4.625,0 -1,-3 -1,0 -1,3 -4.375,0 0.9375,-3 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ d="m 128.30923,420 -3.30903,9 1.98543,0 1.01457,-3 3,0 1.27987,3 1.98543,0 -3.30903,-9 z m 1.25347,1.46875 1.125,3.53125 -2.25,0 z"
+ id="path11731"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccccccccc" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g11811"
+ inkscape:label="stock-texture">
+ <rect
+ transform="translate(241.0002,217)"
+ y="202"
+ x="-100"
+ height="16"
+ width="16"
+ id="rect11765"
+ style="opacity:0.3;fill:none;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect11767"
+ transform="translate(241.0002,217)"
+ d="m -97.9375,202.9375 -1.125,1.125 0,1 2.125,-2.125 -1,0 z m 3,0 -4.125,4.125 0,1 5.125,-5.125 -1,0 z m 3,0 -7.125,7.125 0,1 8.125,-8.125 -1,0 z m 3,0 -10.125,10.125 0,1 11.125,-11.125 -1,0 z m 3,0 -13.125,13.125 0,1 14.125,-14.125 -1,0 z m 1,2 -12.125,12.125 1,0 11.125,-11.125 0,-1 z m 0,3 -9.125,9.125 1,0 8.125,-8.125 0,-1 z m 0,3 -6.125,6.125 1,0 5.125,-5.125 0,-1 z m 0,3 -3.125,3.125 1,0 2.125,-2.125 0,-1 z m 0,3 -0.125,0.125 0.125,0 0,-0.125 z"
+ style="fill:none;stroke:#bebebe;stroke-opacity:1" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g11872"
+ inkscape:label="stock-paths">
+ <rect
+ transform="translate(241.0002,217)"
+ y="202"
+ x="-80"
+ height="16"
+ width="16"
+ id="rect11834"
+ style="fill:none;stroke:none" />
+ <rect
+ y="423"
+ x="161.0002"
+ height="4"
+ width="4"
+ id="rect11849"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect11851"
+ width="4.0000014"
+ height="4"
+ x="173.0002"
+ y="423" />
+ <rect
+ y="424"
+ x="163.0002"
+ height="2"
+ width="12"
+ id="rect11853"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ transform="matrix(1.3333333,0,0,1.3333312,264.33353,149.66712)"
+ d="m -70,206.5 c 0,0.82843 -0.671573,1.5 -1.5,1.5 -0.828427,0 -1.5,-0.67157 -1.5,-1.5 0,-0.82843 0.671573,-1.5 1.5,-1.5 0.828427,0 1.5,0.67157 1.5,1.5 z"
+ sodipodi:ry="1.5"
+ sodipodi:rx="1.5"
+ sodipodi:cy="206.5"
+ sodipodi:cx="-71.5"
+ id="path11855"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ sodipodi:type="arc" />
+ <path
+ sodipodi:nodetypes="csccscc"
+ inkscape:connector-curvature="0"
+ id="path11857"
+ transform="translate(241.0002,217)"
+ d="m -65,216 c 0,-3.31371 -3.13401,-6 -7,-6 -3.86599,0 -7,2.68629 -7,6 l 2.015625,0 c 0.287851,-2.25391 2.407621,-4 4.984375,-4 2.576754,0 4.696524,1.74609 4.984375,4 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g11934"
+ inkscape:label="stock-eye">
+ <rect
+ transform="translate(241.0002,217)"
+ y="202"
+ x="-60"
+ height="16"
+ width="16"
+ id="rect11899"
+ style="fill:none;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path11920"
+ transform="translate(241.0002,217)"
+ d="m -52,207 c -1.656854,0 -3,1.34315 -3,3 0,1.65685 1.343146,3 3,3 1.656854,0 3,-1.34315 3,-3 0,-1.65685 -1.343146,-3 -3,-3 z m 0,1.53125 c 0.787268,0 1.4375,0.65408 1.4375,1.46875 0,0.81467 -0.650232,1.5 -1.4375,1.5 -0.787268,0 -1.4375,-0.68533 -1.4375,-1.5 0,-0.81467 0.650232,-1.46875 1.4375,-1.46875 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ sodipodi:nodetypes="scscsscscs"
+ inkscape:connector-curvature="0"
+ id="path11928"
+ transform="translate(241.0002,217)"
+ d="m -52,204 c -4.41828,0 -8,6 -8,6 0,0 3.58172,6 8,6 4.41828,0 8,-6 8,-6 0,0 -3.58172,-6 -8,-6 z m 0,2 c 3.865993,0 6,4 6,4 0,0 -2.134007,4 -6,4 -3.865993,0 -6,-4 -6,-4 0,0 2.134007,-4 6,-4 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g11968"
+ inkscape:label="stock-layers">
+ <rect
+ y="439"
+ x="41.000198"
+ height="16"
+ width="16"
+ id="rect11958"
+ style="fill:none;stroke:none" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path11960"
+ d="m 42.0002,454 3,-3 11,0 -3,3 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ d="m 42.0002,449 3,-3 11,0 -3,3 z"
+ id="path11962"
+ inkscape:connector-curvature="0" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path11964"
+ d="m 42.0002,444 3,-3 11,0 -3,3 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g12011"
+ inkscape:label="stock-layer">
+ <rect
+ transform="translate(241.0002,217)"
+ y="222"
+ x="-180"
+ height="16"
+ width="16"
+ id="rect11993"
+ style="fill:none;stroke:none" />
+ <path
+ sodipodi:nodetypes="ccccccc"
+ inkscape:connector-curvature="0"
+ id="path11995"
+ transform="translate(241.0002,217)"
+ d="m -169,230 0,2 -8.34375,0 -2.65625,4 12,0 4,-6 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ d="m 61.0002,440 0,8 10,0 0,-8 z m 1,1 8,0 0,5 -8,0 z"
+ id="path12001"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccccccc" />
+ <path
+ sodipodi:nodetypes="cccccccccccccccccccccccccccccc"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none"
+ d="m 63.0002,442 0,3 3,0 0,-1 c 7.6e-5,-0.52852 -0.351183,-0.54508 -1.033512,-0.8606 0,0 0.0158,2e-4 0.134034,0 0.218773,0.0448 0.741051,0.18771 0.938297,0.31835 -0.05265,-0.19063 -0.0756,-0.47909 -0.234575,-0.72048 -0.158979,-0.24137 -0.837764,-0.72048 -0.837764,-0.72048 L 65.0002,442 c 0.02985,-0.0215 0,0 0.670212,0.36862 0.335108,0.1675 0.313859,0.15688 0.335108,0.1675 0.06687,0.0307 -0.01668,-0.0227 0.569679,-0.31835 l 0,0.15085 c 0,0 -0.569679,0.16618 -0.402127,0.4859 0.119284,0.16392 0.213519,0.54167 0.402127,0.58644 0,0 0.455792,-0.65698 0.804254,-0.87127 0,0 -0.117551,-0.2728 -0.117284,-0.41888 1.99e-4,-0.11222 0,0 0,0 0.01245,0.21211 0.08218,0.12715 0.234578,0.3351 L 68.371212,442 l 0,0 c 0,0 -1.394352,1.11315 -1.259838,1.32367 0.211546,-0.0258 1.072338,-0.1843 1.072338,-0.1843 l 0,0.0335 C 67.622403,443.35992 67.176541,443.565 67.0002,444 l 0,1 2,0 0,-3 z"
+ id="path12003"
+ inkscape:connector-curvature="0" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g5243"
+ inkscape:label="stock-menu-left">
+ <rect
+ transform="translate(241.0002,217)"
+ y="222"
+ x="-160"
+ height="16"
+ width="16"
+ id="rect4440"
+ style="fill:none;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect5232"
+ transform="translate(241.0002,217)"
+ d="m -156,224 c -1.108,0 -2,0.892 -2,2 l 0,8 c 0,1.108 0.892,2 2,2 l 8,0 c 1.108,0 2,-0.892 2,-2 l 0,-8 c 0,-1.108 -0.892,-2 -2,-2 l -8,0 z m 0.4375,1 7.125,0 c 0.78971,0 1.4375,0.64779 1.4375,1.4375 l 0,7.125 c 0,0.78971 -0.64779,1.4375 -1.4375,1.4375 l -7.125,0 c -0.78971,0 -1.4375,-0.64779 -1.4375,-1.4375 l 0,-7.125 c 0,-0.78971 0.64779,-1.4375 1.4375,-1.4375 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ sodipodi:nodetypes="cccc"
+ transform="translate(241.0002,217)"
+ inkscape:connector-curvature="0"
+ id="path5241"
+ d="m -149,233 0,-6 -6.55806,3 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g5275"
+ inkscape:label="stock-menu-right">
+ <g
+ transform="matrix(-1,0,0,1,198.0004,0)"
+ id="g5267"
+ inkscape:label="stock-menu-left">
+ <rect
+ transform="translate(241.0002,217)"
+ y="222"
+ x="-160"
+ height="16"
+ width="16"
+ id="rect5269"
+ style="fill:none;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path5271"
+ transform="translate(241.0002,217)"
+ d="m -156,224 c -1.108,0 -2,0.892 -2,2 l 0,8 c 0,1.108 0.892,2 2,2 l 8,0 c 1.108,0 2,-0.892 2,-2 l 0,-8 c 0,-1.108 -0.892,-2 -2,-2 l -8,0 z m 0.4375,1 7.125,0 c 0.78971,0 1.4375,0.64779 1.4375,1.4375 l 0,7.125 c 0,0.78971 -0.64779,1.4375 -1.4375,1.4375 l -7.125,0 c -0.78971,0 -1.4375,-0.64779 -1.4375,-1.4375 l 0,-7.125 c 0,-0.78971 0.64779,-1.4375 1.4375,-1.4375 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ sodipodi:nodetypes="cccc"
+ transform="translate(241.0002,217)"
+ inkscape:connector-curvature="0"
+ id="path5273"
+ d="m -149,233 0,-6 -6.55806,3 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g5287"
+ inkscape:label="stock-merge-down">
+ <rect
+ transform="translate(241.0002,217)"
+ y="222"
+ x="-120"
+ height="16"
+ width="16"
+ id="rect4477"
+ style="fill:none;stroke:none" />
+ <path
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ d="m 121.0002,445 3,-3 6,0 -3,3 z"
+ id="path5256"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path5262"
+ d="m 121.0002,449 3,-3 6,0 -3,3 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ d="m 121.0002,453 3,-3 6,0 -3,3 z"
+ id="path5264"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path5272"
+ d="m 135.0002,442 -2,0 c -0.007,3.59068 -0.0325,5.40942 0,9 l 2,0 c -0.10306,-3.58947 -0.0137,-5.40857 0,-9 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path5274"
+ d="m 134.0002,453 -3,-4 6,0 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g11938"
+ inkscape:label="stock-move-to-screen">
+ <rect
+ transform="translate(241.0002,217)"
+ y="222"
+ x="-100"
+ height="16"
+ width="16"
+ id="rect11856"
+ style="fill:none;stroke:none" />
+ <path
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ d="m 149.0002,447 0,-2 c -3.98964,-0.007 -3.01047,-0.0325 -7,0 l 0,2 c 3.9883,-0.10306 3.00952,-0.0137 7,0 z"
+ id="path11885"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path11889"
+ d="m 151.0002,446 -4,-3 0,6 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ sodipodi:nodetypes="cccccc"
+ inkscape:connector-curvature="0"
+ id="rect11909"
+ d="m 148.0002,442 5,4 -5,4 6,0 0,-8 z"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ ry="0"
+ rx="0.46875"
+ transform="translate(241.0002,217)"
+ y="225"
+ x="-97"
+ height="2"
+ width="2"
+ id="rect11917"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect11919"
+ width="1.9999983"
+ height="2"
+ x="144.0002"
+ y="448"
+ rx="0.5"
+ ry="0" />
+ <path
+ inkscape:connector-curvature="0"
+ transform="translate(241.0002,217)"
+ id="rect11926"
+ d="M -97.8125,223 C -98.475196,223 -99,223.5248 -99,224.1875 l 0,9.625 c 0,0.6627 0.524804,1.1875 1.1875,1.1875 l 11.625,0 c 0.662696,0 1.1875,-0.5248 1.1875,-1.1875 l 0,-9.625 C -85,223.5248 -85.524804,223 -86.1875,223 l -11.625,0 z m 1,1 9.625,0 c 0.662696,0 1.1875,0.5248 1.1875,1.1875 l 0,7.625 c 0,0.6627 -0.524804,1.1875 -1.1875,1.1875 l -9.625,0 C -97.475196,234 -98,233.4752 -98,232.8125 l 0,-7.625 C -98,224.5248 -97.475196,224 -96.8125,224 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ ry="0.5"
+ rx="1"
+ y="453"
+ x="145.0002"
+ height="1"
+ width="8"
+ id="rect11931"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g12030"
+ inkscape:label="stock-gravity-east">
+ <rect
+ ry="0"
+ rx="0.5"
+ y="439"
+ x="161.0002"
+ height="16"
+ width="16"
+ id="rect12012"
+ style="fill:none;stroke:none" />
+ <path
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ d="m 171.00021,448 0,-2 c -2.65976,-0.007 -5.34032,-0.0265 -8.00001,0.006 l 0,2 c 2.65887,-0.10306 5.33969,-0.0197 8.00001,-0.006 z"
+ id="path12018"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path12022"
+ d="M 172.00021,447.02308 168.0002,443 l 0,8 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="224"
+ x="-68"
+ height="12"
+ width="2"
+ id="rect12028"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g12065"
+ inkscape:label="stock-gravity-west">
+ <g
+ transform="matrix(-1,0,0,1,358.0004,0)"
+ id="g12055"
+ inkscape:label="stock-align-right">
+ <rect
+ ry="0"
+ rx="0.5"
+ y="439"
+ x="161.0002"
+ height="16"
+ width="16"
+ id="rect12057"
+ style="fill:none;stroke:none" />
+ <path
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ d="m 171.00021,448 0,-2 c -2.65976,-0.007 -5.34032,-0.0265 -8.00001,0.006 l 0,2 c 2.65887,-0.10306 5.33969,-0.0197 8.00001,-0.006 z"
+ id="path12059"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path12061"
+ d="M 172.00021,447.02308 168.0002,443 l 0,8 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="224"
+ x="-68"
+ height="12"
+ width="2"
+ id="rect12063"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g12097"
+ inkscape:label="stock-hcenter">
+ <rect
+ transform="scale(-1,1)"
+ ry="0"
+ rx="0.5"
+ y="459"
+ x="-57.000202"
+ height="16"
+ width="16"
+ id="rect12076"
+ style="fill:none;stroke:none" />
+ <path
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ d="m 52.00019,468 0,-2 c 1.662351,-0.007 3.337703,-0.0265 5.00001,0.006 l 0,2 C 55.338404,467.90294 53.662891,467.9863 52.00019,468 z"
+ id="path12078"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path12080"
+ d="M 51.00019,467.02308 55.0002,463 l 0,8 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="scale(-1,1)"
+ y="461"
+ x="-50.000198"
+ height="12"
+ width="2"
+ id="rect12082"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path12093"
+ d="m 46.0002,468 0,-2 c -1.662347,-0.007 -3.337695,-0.0265 -5,0.006 l 0,2 c 1.661791,-0.10306 3.337303,-0.0197 5,-0.006 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ d="M 47.0002,467.02308 43.00019,463 l 0,8 z"
+ id="path12095"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g12119"
+ inkscape:label="stock-align-middle">
+ <g
+ transform="matrix(0,1,-1,0,536.0002,417.9998)"
+ id="g12105"
+ inkscape:label="stock-align-center">
+ <rect
+ transform="scale(-1,1)"
+ ry="0"
+ rx="0.5"
+ y="459"
+ x="-57.000202"
+ height="16"
+ width="16"
+ id="rect12107"
+ style="fill:none;stroke:none" />
+ <path
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ d="m 52.00019,468 0,-2 c 1.662351,-0.007 3.337703,-0.0265 5.00001,0.006 l 0,2 C 55.338404,467.90294 53.662891,467.9863 52.00019,468 z"
+ id="path12109"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path12111"
+ d="M 51.00019,467.02308 55.0002,463 l 0,8 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="scale(-1,1)"
+ y="461"
+ x="-50.000198"
+ height="12"
+ width="2"
+ id="rect12113"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path12115"
+ d="m 46.0002,468 0,-2 c -1.662347,-0.007 -3.337695,-0.0265 -5,0.006 l 0,2 c 1.661791,-0.10306 3.337303,-0.0197 5,-0.006 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ d="M 47.0002,467.02308 43.00019,463 l 0,8 z"
+ id="path12117"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc" />
+ </g>
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g12138"
+ inkscape:label="stock-gravity-north">
+ <g
+ transform="matrix(0,-1,1,0,-357.9998,636.0002)"
+ id="g12128"
+ inkscape:label="stock-align-right">
+ <rect
+ ry="0"
+ rx="0.5"
+ y="439"
+ x="161.0002"
+ height="16"
+ width="16"
+ id="rect12130"
+ style="fill:none;stroke:none" />
+ <path
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ d="m 171.00021,448 0,-2 c -2.65976,-0.007 -5.34032,-0.0265 -8.00001,0.006 l 0,2 c 2.65887,-0.10306 5.33969,-0.0197 8.00001,-0.006 z"
+ id="path12132"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path12134"
+ d="M 172.00021,447.02308 168.0002,443 l 0,8 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="224"
+ x="-68"
+ height="12"
+ width="2"
+ id="rect12136"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g12157"
+ inkscape:label="stock-gravity-south">
+ <g
+ transform="matrix(1,0,0,-1,20,934)"
+ id="g12145"
+ inkscape:label="stock-align-top">
+ <g
+ transform="matrix(0,-1,1,0,-357.9998,636.0002)"
+ id="g12147"
+ inkscape:label="stock-align-right">
+ <rect
+ ry="0"
+ rx="0.5"
+ y="439"
+ x="161.0002"
+ height="16"
+ width="16"
+ id="rect12149"
+ style="fill:none;stroke:none" />
+ <path
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ d="m 171.00021,448 0,-2 c -2.65976,-0.007 -5.34032,-0.0265 -8.00001,0.006 l 0,2 c 2.65887,-0.10306 5.33969,-0.0197 8.00001,-0.006 z"
+ id="path12151"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path12153"
+ d="M 172.00021,447.02308 168.0002,443 l 0,8 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="224"
+ x="-68"
+ height="12"
+ width="2"
+ id="rect12155"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ </g>
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g12299"
+ inkscape:label="stock-selection">
+ <g
+ inkscape:label="stock-tool-rect-select"
+ id="g74903-0"
+ style="display:inline"
+ transform="translate(80.000002,242)">
+ <rect
+ style="fill:none;stroke:none"
+ id="rect74851-6"
+ width="16"
+ height="16"
+ x="41.000198"
+ y="217" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect74853-6"
+ width="1"
+ height="1"
+ x="41.000198"
+ y="220" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect74855-2"
+ width="1"
+ height="1"
+ x="53.000198"
+ y="220" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect74857-9"
+ width="1"
+ height="1"
+ x="55.000198"
+ y="220" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect74859-1"
+ width="1"
+ height="1"
+ x="41.000198"
+ y="222" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect74861-2"
+ width="1"
+ height="1"
+ x="51.000198"
+ y="220" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect74863-4"
+ width="1"
+ height="1"
+ x="43.000198"
+ y="220" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect74865-2"
+ width="1"
+ height="1"
+ x="45.000198"
+ y="220" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect74867-2"
+ width="1"
+ height="1"
+ x="47.000198"
+ y="220" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect74869-6"
+ width="1"
+ height="1"
+ x="49.000198"
+ y="220" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect74871-2"
+ width="1"
+ height="1"
+ x="41.000198"
+ y="224" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect74873-4"
+ width="1"
+ height="1"
+ x="41.000198"
+ y="226" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect74875-7"
+ width="1"
+ height="1"
+ x="43.000198"
+ y="230" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect74877-8"
+ width="1"
+ height="1"
+ x="45.000198"
+ y="230" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect74879-6"
+ width="1"
+ height="1"
+ x="47.000198"
+ y="230" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect74881-6"
+ width="1"
+ height="1"
+ x="49.000198"
+ y="230" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect74883-2"
+ width="1"
+ height="1"
+ x="51.000198"
+ y="230" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect74885-0"
+ width="1"
+ height="1"
+ x="53.000198"
+ y="230" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect74887-6"
+ width="1"
+ height="1"
+ x="55.000198"
+ y="230" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect74889-3"
+ width="1"
+ height="1"
+ x="55.000198"
+ y="228" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect74891-3"
+ width="1"
+ height="1"
+ x="55.000198"
+ y="226" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect74893-5"
+ width="1"
+ height="1"
+ x="55.000198"
+ y="224" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect74895-7"
+ width="1"
+ height="1"
+ x="55.000198"
+ y="222" />
+ <rect
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect74897-7"
+ width="11"
+ height="7"
+ x="43.000198"
+ y="222" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect74899-8"
+ width="1"
+ height="1"
+ x="41.000198"
+ y="228" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect74901-4"
+ width="1"
+ height="1"
+ x="41.000198"
+ y="230" />
+ </g>
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g12381"
+ inkscape:label="stock-selection-all">
+ <rect
+ transform="translate(241.0002,217)"
+ y="242"
+ x="-100"
+ height="16"
+ width="16"
+ id="rect12347"
+ style="opacity:0.3;fill:none;stroke:none" />
+ <rect
+ y="461"
+ x="141.0002"
+ height="3"
+ width="1"
+ id="rect12349"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ ry="0"
+ y="472"
+ x="145.0002"
+ height="1"
+ width="5.0000014"
+ id="rect12351"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="472"
+ x="150.0002"
+ height="1"
+ width="4.0000014"
+ id="rect12353"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ ry="0"
+ y="461"
+ x="153.0002"
+ height="1"
+ width="3.9999983"
+ id="rect12355"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ ry="0"
+ y="466"
+ x="156.0002"
+ height="4"
+ width="1"
+ id="rect12357"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="463"
+ x="156.0002"
+ height="3"
+ width="1"
+ id="rect12359"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect12361"
+ width="3.9999998"
+ height="1"
+ x="143.0002"
+ y="461"
+ ry="0" />
+ <rect
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect12363"
+ width="6"
+ height="1"
+ x="147.0002"
+ y="461"
+ ry="0" />
+ <rect
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect12365"
+ width="1"
+ height="3"
+ x="156.0002"
+ y="470"
+ ry="0" />
+ <rect
+ ry="0"
+ y="472"
+ x="141.0002"
+ height="1"
+ width="4.0000014"
+ id="rect12367"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect12369"
+ width="1"
+ height="4"
+ x="141.0002"
+ y="464" />
+ <rect
+ y="468"
+ x="141.0002"
+ height="3"
+ width="1"
+ id="rect12371"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="255"
+ x="-87"
+ height="1"
+ width="2"
+ id="rect12373"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="245"
+ x="-85"
+ height="1"
+ width="1"
+ id="rect12375"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="254"
+ x="-100"
+ height="1"
+ width="1"
+ id="rect12377"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="244"
+ x="-99"
+ height="1"
+ width="1"
+ id="rect12379"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g12488"
+ inkscape:label="stock-selection-border">
+ <rect
+ y="459"
+ x="161.0002"
+ height="16"
+ width="16"
+ id="rect12419"
+ style="opacity:0.3;fill:none;stroke:none" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect12425"
+ width="1"
+ height="3"
+ x="162.0002"
+ y="461" />
+ <rect
+ ry="0"
+ y="461"
+ x="166.0002"
+ height="1"
+ width="4.0000014"
+ id="rect12437"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ ry="0"
+ y="461"
+ x="170.0002"
+ height="1"
+ width="4.9999981"
+ id="rect12439"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="464"
+ x="162.0002"
+ height="3"
+ width="1"
+ id="rect12445"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect12447"
+ width="1.0000017"
+ height="3"
+ x="162.0002"
+ y="467" />
+ <rect
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect12453"
+ width="1"
+ height="3"
+ x="162.0002"
+ y="470" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect12455"
+ width="3.0000017"
+ height="1"
+ x="163.0002"
+ y="461" />
+ <rect
+ y="465"
+ x="166.0002"
+ height="3"
+ width="1"
+ id="rect12474"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect12476"
+ width="3.9999933"
+ height="1"
+ x="169.0002"
+ y="465"
+ ry="0" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect12478"
+ width="2"
+ height="1"
+ x="173.0002"
+ y="465"
+ ry="0" />
+ <rect
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect12480"
+ width="1"
+ height="3"
+ x="166.0002"
+ y="468" />
+ <rect
+ y="471"
+ x="166.0002"
+ height="2"
+ width="1"
+ id="rect12482"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="465"
+ x="167.0002"
+ height="1"
+ width="2.0000017"
+ id="rect12486"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g30096"
+ inkscape:label="stock-selection-grow">
+ <rect
+ transform="translate(241.0002,217)"
+ y="242"
+ x="-60"
+ height="16"
+ width="16"
+ id="rect12523"
+ style="opacity:0.3;fill:none;stroke:none" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect12529"
+ width="1"
+ height="2"
+ x="184.0002"
+ y="463" />
+ <rect
+ transform="matrix(1.9562507,0,0,1,-184.60032,0)"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none;filter:url(#filter12578-8)"
+ id="rect12533"
+ width="1.9999998"
+ height="1"
+ x="190.0002"
+ y="470" />
+ <rect
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect12537"
+ width="1"
+ height="4"
+ x="193.0002"
+ y="465"
+ ry="0" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect12539"
+ width="1"
+ height="1"
+ x="193.0002"
+ y="464" />
+ <rect
+ ry="0"
+ y="463"
+ x="187.0002"
+ height="1"
+ width="4.0000014"
+ id="rect12543"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ ry="0"
+ y="469"
+ x="193.0002"
+ height="1"
+ width="1"
+ id="rect12545"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="465"
+ x="184.0002"
+ height="3"
+ width="1"
+ id="rect12549"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none;filter:url(#filter12586-1)" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect12551"
+ width="1"
+ height="2"
+ x="184.0002"
+ y="468" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect12553"
+ width="2.9295714"
+ height="1"
+ x="191.07063"
+ y="470" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect12555"
+ width="3"
+ height="1"
+ x="191.0002"
+ y="463" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect12557"
+ width="3.0000017"
+ height="1"
+ x="184.0002"
+ y="470" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect12559"
+ width="2"
+ height="1"
+ x="185.0002"
+ y="463" />
+ <rect
+ y="474"
+ x="181.0002"
+ height="1"
+ width="1"
+ id="rect12919-5"
+ style="color:#000000;fill:#bdbdbd;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ transform="translate(241.0002,217)"
+ inkscape:connector-curvature="0"
+ id="path30067"
+ d="m -60,257 2.53033,-2.53033 0.93934,1.06066 L -59,258 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="471"
+ x="181.0002"
+ height="4"
+ width="1"
+ id="rect30074"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="257"
+ x="-59"
+ height="1"
+ width="3"
+ id="rect30076"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ d="m 197.0002,460 -2.53033,2.48614 -1,-1 L 196.0002,459 z"
+ id="path30078"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <rect
+ transform="scale(-1,-1)"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect30080"
+ width="1"
+ height="4"
+ x="-197.0002"
+ y="-463" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect30082"
+ width="3"
+ height="1"
+ x="-196.0002"
+ y="-460"
+ transform="scale(-1,-1)" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path30084"
+ d="m 181.0002,460 2.53033,2.48614 1,-1 L 182.0002,459 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="-463"
+ x="181.0002"
+ height="4"
+ width="1"
+ id="rect30086"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ transform="scale(1,-1)" />
+ <rect
+ transform="scale(1,-1)"
+ y="-460"
+ x="182.0002"
+ height="1"
+ width="3"
+ id="rect30088"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ d="m 197.0002,474 -2.53033,-2.48614 -1,1 L 196.0002,475 z"
+ id="path30090"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <rect
+ transform="scale(-1,1)"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect30092"
+ width="1"
+ height="4"
+ x="-197.0002"
+ y="471" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect30094"
+ width="3"
+ height="1"
+ x="-196.0002"
+ y="474"
+ transform="scale(-1,1)" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g30249"
+ inkscape:label="stock-selection-intersect">
+ <rect
+ transform="translate(241.0002,217)"
+ y="262"
+ x="-200"
+ height="16"
+ width="16"
+ id="rect30145"
+ style="fill:none;stroke:none" />
+ <rect
+ y="483"
+ x="44.000198"
+ height="1"
+ width="1"
+ id="rect30180"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="483"
+ x="48.000198"
+ height="1"
+ width="1"
+ id="rect30182"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="483"
+ x="50.000198"
+ height="1"
+ width="1"
+ id="rect30184"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="483"
+ x="52.000198"
+ height="1"
+ width="1"
+ id="rect30186"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="485"
+ x="44.000198"
+ height="1"
+ width="1"
+ id="rect30190"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="487"
+ x="44.000198"
+ height="1"
+ width="1"
+ id="rect30192"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="489"
+ x="44.000198"
+ height="1"
+ width="1"
+ id="rect30194"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="491"
+ x="44.000198"
+ height="1"
+ width="1"
+ id="rect30196"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="483"
+ x="54.000198"
+ height="1"
+ width="1"
+ id="rect30198"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="483"
+ x="56.000198"
+ height="1"
+ width="1"
+ id="rect30200"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="485"
+ x="56.000198"
+ height="1"
+ width="1"
+ id="rect30202"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="487"
+ x="56.000198"
+ height="1"
+ width="1"
+ id="rect30204"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="489"
+ x="56.000198"
+ height="1"
+ width="1"
+ id="rect30206"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="491"
+ x="56.000198"
+ height="1"
+ width="1"
+ id="rect30208"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="493"
+ x="52.000198"
+ height="1"
+ width="1"
+ id="rect30210"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="493"
+ x="50.000198"
+ height="1"
+ width="1"
+ id="rect30212"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="493"
+ x="48.000198"
+ height="1"
+ width="1"
+ id="rect30214"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="493"
+ x="44.000198"
+ height="1"
+ width="1"
+ id="rect30217"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="486"
+ x="47.000198"
+ height="5"
+ width="6.0000014"
+ id="rect30219"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect30221"
+ width="1"
+ height="1"
+ x="54.000198"
+ y="493" />
+ <rect
+ y="493"
+ x="56.000198"
+ height="1"
+ width="1"
+ id="rect30223"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect30229"
+ width="1"
+ height="1"
+ x="46.000198"
+ y="483" />
+ <rect
+ y="493"
+ x="46.000198"
+ height="1"
+ width="1"
+ id="rect30231"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path30243"
+ d="m 41.0002,479 0,12 2,0 0,-6 0,-3 3,0 7,0 0,-3 z"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none"
+ sodipodi:nodetypes="ccccccccc" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g30361"
+ inkscape:label="selection-none">
+ <rect
+ transform="translate(241.0002,217)"
+ y="262"
+ x="-180"
+ height="16"
+ width="16"
+ id="rect30295"
+ style="opacity:0.3;fill:none;stroke:none" />
+ <path
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ d="m 73.0002,484 -1.166665,0 -5.833335,5.83334 0,1.16666 1.166666,0 5.833334,-5.83335 z"
+ id="path30301"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path30303"
+ d="m 66.0002,484 1.166666,0 5.833334,5.83334 0,1.16666 -1.166665,0 -5.833335,-5.83335 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="264"
+ x="-178"
+ height="1"
+ width="1"
+ id="rect30311"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="264"
+ x="-176"
+ height="1"
+ width="1"
+ id="rect30313"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="264"
+ x="-174"
+ height="1"
+ width="1"
+ id="rect30315"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="264"
+ x="-172"
+ height="1"
+ width="1"
+ id="rect30317"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="264"
+ x="-170"
+ height="1"
+ width="1"
+ id="rect30319"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="264"
+ x="-168"
+ height="1"
+ width="1"
+ id="rect30321"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="264"
+ x="-166"
+ height="1"
+ width="1"
+ id="rect30323"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="266"
+ x="-178"
+ height="1"
+ width="1"
+ id="rect30325"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="268"
+ x="-178"
+ height="1"
+ width="1"
+ id="rect30327"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="270"
+ x="-178"
+ height="1"
+ width="1"
+ id="rect30329"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="272"
+ x="-178"
+ height="1"
+ width="1"
+ id="rect30331"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="274"
+ x="-178"
+ height="1"
+ width="1"
+ id="rect30333"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="266"
+ x="-166"
+ height="1"
+ width="1"
+ id="rect30337"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="268"
+ x="-166"
+ height="1"
+ width="1"
+ id="rect30339"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="270"
+ x="-166"
+ height="1"
+ width="1"
+ id="rect30341"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="272"
+ x="-166"
+ height="1"
+ width="1"
+ id="rect30343"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="274"
+ x="-166"
+ height="1"
+ width="1"
+ id="rect30345"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="276"
+ x="-166"
+ height="1"
+ width="1"
+ id="rect30347"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="276"
+ x="-178"
+ height="1"
+ width="1"
+ id="rect30349"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="276"
+ x="-176"
+ height="1"
+ width="1"
+ id="rect30351"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="276"
+ x="-174"
+ height="1"
+ width="1"
+ id="rect30353"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="276"
+ x="-172"
+ height="1"
+ width="1"
+ id="rect30355"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="276"
+ x="-170"
+ height="1"
+ width="1"
+ id="rect30357"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="276"
+ x="-168"
+ height="1"
+ width="1"
+ id="rect30359"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g5857"
+ inkscape:label="stock-selection-shrink">
+ <path
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ d="m 91.000205,485 2.53033,-2.53033 0.93934,1.06066 L 92.000205,486 z"
+ id="path5754"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect5756"
+ width="1"
+ height="4"
+ x="91.000198"
+ y="482" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect5758"
+ width="3"
+ height="1"
+ x="92.000198"
+ y="485" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path5760"
+ d="m 87.000202,489 -2.53033,2.48614 -0.999996,-1 L 86.000202,488 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="-492"
+ x="-87.000198"
+ height="4"
+ width="1"
+ id="rect5762"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ transform="scale(-1,-1)" />
+ <rect
+ transform="scale(-1,-1)"
+ y="-489"
+ x="-86.000198"
+ height="1"
+ width="3"
+ id="rect5764"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ d="m 91.000204,489 2.53033,2.48614 1,-1 L 92.000204,488 z"
+ id="path5766"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <rect
+ transform="scale(1,-1)"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect5768"
+ width="1"
+ height="4"
+ x="91.000198"
+ y="-492" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect5770"
+ width="3"
+ height="1"
+ x="92.000198"
+ y="-489"
+ transform="scale(1,-1)" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path5772"
+ d="m 87.000204,485 -2.53033,-2.48614 -1,1 2.53033,2.48614 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="482"
+ x="-87.000198"
+ height="4"
+ width="1"
+ id="rect5774"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ transform="scale(-1,1)" />
+ <rect
+ transform="scale(-1,1)"
+ y="485"
+ x="-86.000198"
+ height="1"
+ width="3"
+ id="rect5776"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ style="opacity:0.3;fill:none;stroke:none"
+ id="rect5806"
+ width="16"
+ height="16"
+ x="81.000198"
+ y="479" />
+ <rect
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect5808"
+ width="1"
+ height="4"
+ x="81.000198"
+ y="480" />
+ <rect
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect5810"
+ width="5.0000014"
+ height="1"
+ x="85.000198"
+ y="493"
+ ry="0" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect5812"
+ width="4.0000014"
+ height="1"
+ x="90.000198"
+ y="493" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect5814"
+ width="3.9999983"
+ height="1"
+ x="93.000198"
+ y="480"
+ ry="0" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect5816"
+ width="1"
+ height="4"
+ x="96.000198"
+ y="486"
+ ry="0" />
+ <rect
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect5818"
+ width="1"
+ height="3"
+ x="96.000198"
+ y="483" />
+ <rect
+ ry="0"
+ y="480"
+ x="83.000198"
+ height="1"
+ width="3.9999998"
+ id="rect5820"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ ry="0"
+ y="480"
+ x="87.000198"
+ height="1"
+ width="6"
+ id="rect5822"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ ry="0"
+ y="490"
+ x="96.000198"
+ height="3"
+ width="1"
+ id="rect5824"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect5826"
+ width="4.0000014"
+ height="1"
+ x="81.000198"
+ y="493"
+ ry="0" />
+ <rect
+ y="484"
+ x="81.000198"
+ height="4"
+ width="1"
+ id="rect5828"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect5830"
+ width="1"
+ height="3"
+ x="81.000198"
+ y="488" />
+ <rect
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect5832"
+ width="3"
+ height="1"
+ x="94.000198"
+ y="493" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect5834"
+ width="1"
+ height="2"
+ x="96.000198"
+ y="481" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect5836"
+ width="1"
+ height="2"
+ x="81.000198"
+ y="491" />
+ <rect
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect5838"
+ width="1"
+ height="1"
+ x="82.000198"
+ y="480" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g6038"
+ inkscape:label="stock-selection-stroke">
+ <rect
+ transform="translate(241.0002,217)"
+ y="262"
+ x="-140"
+ height="16"
+ width="16"
+ id="rect5907"
+ style="fill:none;stroke:none" />
+ <g
+ id="g5911"
+ transform="matrix(0.8746234,0,0,0.89178327,132.92919,469.5548)"
+ style="fill:#bebebe;fill-opacity:1;stroke:none">
+ <path
+ inkscape:connector-curvature="0"
+ d="m -28.5,27.5711 c 3.111145,0.0011 2.79359,-3.323359 4.304166,-4.248979 1.750479,-1.072622 3.284496,0.256475 3.590759,1.350292 0.386445,1.380184 -0.337829,2.508685 -1.300323,3.118949 -1.846361,1.170674 -6.300039,0.898712 -6.594602,-0.220262 z"
+ id="path5913"
+ sodipodi:nodetypes="cssac"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <path
+ inkscape:connector-curvature="0"
+ id="path5915"
+ d="m 117.0002,484.40625 c -1.01392,1.06131 -2.08877,2.33758 -3.75,4.625 1.00355,0.0377 1.86506,0.68865 2.3125,1.625 0.53204,-0.5735 1.00964,-1.14188 1.4375,-1.65625 l 0,-4.59375 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect5932"
+ width="1"
+ height="1"
+ x="101.0002"
+ y="481" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect5934"
+ width="1"
+ height="1"
+ x="113.0002"
+ y="481" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect5936"
+ width="1"
+ height="1"
+ x="115.0002"
+ y="481" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect5938"
+ width="1"
+ height="1"
+ x="101.0002"
+ y="483" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect5940"
+ width="1"
+ height="1"
+ x="111.0002"
+ y="481" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect5942"
+ width="1"
+ height="1"
+ x="103.0002"
+ y="481" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect5944"
+ width="1"
+ height="1"
+ x="105.0002"
+ y="481" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect5946"
+ width="1"
+ height="1"
+ x="107.0002"
+ y="481" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect5948"
+ width="1"
+ height="1"
+ x="109.0002"
+ y="481" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect5950"
+ width="1"
+ height="1"
+ x="101.0002"
+ y="485" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect5952"
+ width="1"
+ height="1"
+ x="101.0002"
+ y="487" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect5954"
+ width="1"
+ height="1"
+ x="103.0002"
+ y="491" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect5956"
+ width="1"
+ height="1"
+ x="105.0002"
+ y="491" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect5958"
+ width="1"
+ height="1"
+ x="107.0002"
+ y="491" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect5960"
+ width="1"
+ height="1"
+ x="109.0002"
+ y="491" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect5974"
+ width="1"
+ height="1"
+ x="115.0002"
+ y="483" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect5976"
+ transform="translate(241.0002,217)"
+ d="m -138,266 0,7 8,0 3,-4 0,-3 -11,0 z"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect5978"
+ width="1"
+ height="1"
+ x="101.0002"
+ y="489" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect5980"
+ width="1"
+ height="1"
+ x="101.0002"
+ y="491" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g6134"
+ inkscape:label="stock-selection-subtract">
+ <g
+ transform="translate(80,0)"
+ id="g6082"
+ inkscape:label="stock-selection-intersect">
+ <rect
+ transform="translate(241.0002,217)"
+ y="262"
+ x="-200"
+ height="16"
+ width="16"
+ id="rect6084"
+ style="fill:none;stroke:none" />
+ <rect
+ y="483"
+ x="44.000198"
+ height="1"
+ width="1"
+ id="rect6086"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="483"
+ x="48.000198"
+ height="1"
+ width="1"
+ id="rect6088"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="483"
+ x="50.000198"
+ height="1"
+ width="1"
+ id="rect6090"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="483"
+ x="52.000198"
+ height="1"
+ width="1"
+ id="rect6092"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="485"
+ x="44.000198"
+ height="1"
+ width="1"
+ id="rect6094"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="487"
+ x="44.000198"
+ height="1"
+ width="1"
+ id="rect6096"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="489"
+ x="44.000198"
+ height="1"
+ width="1"
+ id="rect6098"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="491"
+ x="44.000198"
+ height="1"
+ width="1"
+ id="rect6100"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="483"
+ x="54.000198"
+ height="1"
+ width="1"
+ id="rect6102"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="483"
+ x="56.000198"
+ height="1"
+ width="1"
+ id="rect6104"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="485"
+ x="56.000198"
+ height="1"
+ width="1"
+ id="rect6106"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="487"
+ x="56.000198"
+ height="1"
+ width="1"
+ id="rect6108"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="489"
+ x="56.000198"
+ height="1"
+ width="1"
+ id="rect6110"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="491"
+ x="56.000198"
+ height="1"
+ width="1"
+ id="rect6112"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="493"
+ x="52.000198"
+ height="1"
+ width="1"
+ id="rect6114"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="493"
+ x="50.000198"
+ height="1"
+ width="1"
+ id="rect6116"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="493"
+ x="48.000198"
+ height="1"
+ width="1"
+ id="rect6118"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="493"
+ x="44.000198"
+ height="1"
+ width="1"
+ id="rect6120"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="486"
+ x="47.000198"
+ height="5"
+ width="6.0000014"
+ id="rect6122"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect6124"
+ width="1"
+ height="1"
+ x="54.000198"
+ y="493" />
+ <rect
+ y="493"
+ x="56.000198"
+ height="1"
+ width="1"
+ id="rect6126"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect6128"
+ width="1"
+ height="1"
+ x="46.000198"
+ y="483" />
+ <rect
+ y="493"
+ x="46.000198"
+ height="1"
+ width="1"
+ id="rect6130"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ sodipodi:nodetypes="ccccccccc"
+ inkscape:connector-curvature="0"
+ id="path6132"
+ d="m 41.0002,479 0,12 2,0 0,-6 0,-3 3,0 7,0 0,-3 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g6274"
+ inkscape:label="stock-gradient-linear">
+ <g
+ inkscape:label="stock-tool-blend"
+ id="g3919-0"
+ style="display:inline"
+ transform="translate(20,302)">
+ <g
+ id="g84908-3"
+ inkscape:label="blend">
+ <rect
+ transform="translate(241.0002,217)"
+ y="-40"
+ x="-120"
+ height="16"
+ width="16"
+ id="rect82178-4"
+ style="fill:none;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect82180-1"
+ d="m 122.0002,178 0,14 14,0 0,-14 -14,0 z m 1,1 12,0 0,12 -12,0 0,-12 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="180"
+ x="124.0002"
+ height="10"
+ width="3.0000017"
+ id="rect82185-8"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="181"
+ x="128.0002"
+ height="1"
+ width="1"
+ id="rect82187-1"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="180"
+ x="127.0002"
+ height="1"
+ width="1"
+ id="rect82189-5"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect82191-6"
+ width="1"
+ height="1"
+ x="128.0002"
+ y="183" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect82193-2"
+ width="1"
+ height="1"
+ x="127.0002"
+ y="182" />
+ <rect
+ y="185"
+ x="128.0002"
+ height="1"
+ width="1"
+ id="rect82195-3"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="184"
+ x="127.0002"
+ height="1"
+ width="1"
+ id="rect82197-2"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect82199-8"
+ width="1"
+ height="1"
+ x="128.0002"
+ y="187" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect82201-1"
+ width="1"
+ height="1"
+ x="127.0002"
+ y="186" />
+ <rect
+ y="189"
+ x="128.0002"
+ height="1"
+ width="1"
+ id="rect82203-0"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="188"
+ x="127.0002"
+ height="1"
+ width="1"
+ id="rect82205-1"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="180"
+ x="130.0002"
+ height="1"
+ width="1"
+ id="rect82207-1"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="182"
+ x="130.0002"
+ height="1"
+ width="1"
+ id="rect82209-6"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="184"
+ x="130.0002"
+ height="1"
+ width="1"
+ id="rect82211-7"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="186"
+ x="130.0002"
+ height="1"
+ width="1"
+ id="rect82213-0"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="188"
+ x="130.0002"
+ height="1"
+ width="1"
+ id="rect82215-3"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect84896-0"
+ width="1"
+ height="1"
+ x="131.0002"
+ y="181" />
+ <rect
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect84898-1"
+ width="1"
+ height="1"
+ x="131.0002"
+ y="183" />
+ <rect
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect84900-7"
+ width="1"
+ height="1"
+ x="131.0002"
+ y="185" />
+ <rect
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect84902-3"
+ width="1"
+ height="1"
+ x="131.0002"
+ y="187" />
+ <rect
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect84904-9"
+ width="1"
+ height="1"
+ x="131.0002"
+ y="189" />
+ <rect
+ ry="0"
+ rx="2"
+ y="180"
+ x="129.0002"
+ height="10"
+ width="1"
+ id="rect84906-2"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ </g>
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g6524"
+ inkscape:label="stock-gradient-bilinear">
+ <rect
+ style="fill:none;stroke:none"
+ id="rect6309"
+ width="16"
+ height="16"
+ x="161.0002"
+ y="479" />
+ <path
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ d="m 162.0002,480 0,14 14,0 0,-14 -14,0 z m 1,1 12,0 0,12 -12,0 0,-12 z"
+ id="path6311"
+ inkscape:connector-curvature="0" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect6313"
+ width="2"
+ height="10"
+ x="164.0002"
+ y="482" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect6317"
+ width="1"
+ height="1"
+ x="166.0002"
+ y="482" />
+ <rect
+ y="484"
+ x="166.0002"
+ height="1"
+ width="1"
+ id="rect6321"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect6325"
+ width="1"
+ height="1"
+ x="166.0002"
+ y="486" />
+ <rect
+ y="488"
+ x="166.0002"
+ height="1"
+ width="1"
+ id="rect6329"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect6333"
+ width="1"
+ height="1"
+ x="166.0002"
+ y="490" />
+ <rect
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect6335"
+ width="1"
+ height="1"
+ x="168.0002"
+ y="483" />
+ <rect
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect6337"
+ width="1"
+ height="1"
+ x="168.0002"
+ y="485" />
+ <rect
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect6339"
+ width="1"
+ height="1"
+ x="168.0002"
+ y="487" />
+ <rect
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect6341"
+ width="1"
+ height="1"
+ x="168.0002"
+ y="489" />
+ <rect
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect6343"
+ width="1"
+ height="1"
+ x="168.0002"
+ y="491" />
+ <rect
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect6355"
+ width="1"
+ height="10"
+ x="167.0002"
+ y="482"
+ rx="2"
+ ry="0" />
+ <rect
+ transform="scale(-1,1)"
+ y="482"
+ x="-174.0002"
+ height="10"
+ width="2"
+ id="rect6500"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="scale(-1,1)"
+ y="482"
+ x="-172.0002"
+ height="1"
+ width="1"
+ id="rect6502"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="scale(-1,1)"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect6504"
+ width="1"
+ height="1"
+ x="-172.0002"
+ y="484" />
+ <rect
+ transform="scale(-1,1)"
+ y="486"
+ x="-172.0002"
+ height="1"
+ width="1"
+ id="rect6506"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="scale(-1,1)"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect6508"
+ width="1"
+ height="1"
+ x="-172.0002"
+ y="488" />
+ <rect
+ transform="scale(-1,1)"
+ y="490"
+ x="-172.0002"
+ height="1"
+ width="1"
+ id="rect6510"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="scale(-1,1)"
+ y="482"
+ x="-170.0002"
+ height="1"
+ width="1"
+ id="rect6512"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="scale(-1,1)"
+ y="484"
+ x="-170.0002"
+ height="1"
+ width="1"
+ id="rect6514"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="scale(-1,1)"
+ y="486"
+ x="-170.0002"
+ height="1"
+ width="1"
+ id="rect6516"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="scale(-1,1)"
+ y="487.74048"
+ x="-170.0002"
+ height="1"
+ width="1"
+ id="rect6518"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="scale(-1,1)"
+ y="490"
+ x="-170.0002"
+ height="1"
+ width="1"
+ id="rect6520"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="scale(-1,1)"
+ ry="0"
+ rx="2"
+ y="482"
+ x="-171.0002"
+ height="10"
+ width="1"
+ id="rect6522"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g6635"
+ inkscape:label="stock-gradient-conical-asymmetric">
+ <rect
+ transform="translate(241.0002,217)"
+ y="262"
+ x="-60"
+ height="16"
+ width="16"
+ id="rect6571"
+ style="opacity:0.3;fill:none;stroke:none" />
+ <path
+ sodipodi:nodetypes="cccccccccc"
+ inkscape:connector-curvature="0"
+ id="rect6573"
+ transform="translate(241.0002,217)"
+ d="m -59,263 0,14 14,0 0,-14 z m 1,1 12,0 0,12 -12,0 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ transform="translate(241.0002,217)"
+ inkscape:connector-curvature="0"
+ id="path6578"
+ d="m -58,264 6,6 6,-6 z"
+ style="fill:none;stroke:none" />
+ <path
+ sodipodi:nodetypes="cccc"
+ transform="translate(241.0002,217)"
+ inkscape:connector-curvature="0"
+ id="path6582"
+ d="m -57,265 0,10 5,-5 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ sodipodi:nodetypes="cccc"
+ transform="translate(241.0002,217)"
+ inkscape:connector-curvature="0"
+ id="path6584"
+ d="m -52,270 5,-5 0,10 z"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ sodipodi:nodetypes="cccccccccccccc"
+ inkscape:connector-curvature="0"
+ id="path6592"
+ d="m 189.0002,488 0,0 0,0 0,1 -1,0 0,1 0,2 1,0 1,0 3,0 z m -4,4 0,0 c 2.21622,0 2.21622,0 0,0 z"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="274"
+ x="-54"
+ height="1"
+ width="1"
+ id="rect6617"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="274"
+ x="-56"
+ height="1"
+ width="1"
+ id="rect6619"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="490"
+ x="186.0002"
+ height="1"
+ width="1"
+ id="rect6621"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="272"
+ x="-54"
+ height="1"
+ width="1"
+ id="rect6623"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect6625"
+ width="1"
+ height="1"
+ x="188.0002"
+ y="490" />
+ <rect
+ y="488"
+ x="188.0002"
+ height="1"
+ width="1"
+ id="rect6627"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="274"
+ x="-55"
+ height="1"
+ width="1"
+ id="rect6631"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="273"
+ x="-54"
+ height="1"
+ width="1"
+ id="rect6633"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g6737"
+ inkscape:label="stock-gradient-conical-symmetric">
+ <rect
+ style="opacity:0.3;fill:none;stroke:none"
+ id="rect6674"
+ width="16"
+ height="16"
+ x="41.000198"
+ y="499" />
+ <path
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ d="m 42.0002,500 0,14 14,0 0,-14 z m 1,1 12,0 0,12 -12,0 z"
+ id="path6676"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccccccc" />
+ <path
+ style="fill:none;stroke:none"
+ d="m 43.0002,501 6,6 6,-6 z"
+ id="path6678"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ d="m 44.0002,502 0,2 5,3 -3,-5 z"
+ id="path6680"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none"
+ d="m 49.0002,507 -3,-5 8,0 z"
+ id="path6682"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6702"
+ d="m 49.0002,507 -5,-3 0,8 z"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6733"
+ d="m 49.0002,507 5,-5 0,8 z"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none"
+ d="m 49.0002,507 3,5 -8,0 z"
+ id="path6735"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g6898"
+ inkscape:label="stock-gradient-radial">
+ <rect
+ transform="translate(241.0002,217)"
+ y="282"
+ x="-180"
+ height="16"
+ width="16"
+ id="rect6884"
+ style="opacity:0.3;fill:none;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect6886"
+ transform="translate(241.0002,217)"
+ d="m -179,283 0,14 14,0 0,-14 -14,0 z m 1,1 12,0 0,12 -12,0 0,-12 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ transform="matrix(1.0611131,0,0,1,251.26721,217)"
+ d="m -167.99999,290 c 0,2.20914 -1.68772,4 -3.76963,4 -2.08191,0 -3.76963,-1.79086 -3.76963,-4 0,-2.20914 1.68772,-4 3.76963,-4 2.08191,0 3.76963,1.79086 3.76963,4 z"
+ sodipodi:ry="4"
+ sodipodi:rx="3.7696295"
+ sodipodi:cy="290"
+ sodipodi:cx="-171.76962"
+ id="path6891"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ sodipodi:type="arc" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path6893"
+ d="m 69.0002,501 c -3.31371,0 -6,2.68629 -6,6 0,3.31371 2.68629,6 6,6 3.31371,0 6,-2.68629 6,-6 0,-3.31371 -2.68629,-6 -6,-6 z m 0,2 c 2.20914,0 4,1.79086 4,4 0,2.20914 -1.79086,4 -4,4 -2.20914,0 -4,-1.79086 -4,-4 0,-2.20914 1.79086,-4 4,-4 z"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g7045"
+ inkscape:label="stock-gravity-north-east">
+ <rect
+ transform="translate(241.0002,217)"
+ y="282"
+ x="-160"
+ height="16"
+ width="16"
+ id="rect7010"
+ style="opacity:0.3;fill:none;stroke:none" />
+ <rect
+ y="501"
+ x="85.000198"
+ height="2"
+ width="10"
+ id="rect7012"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="503"
+ x="93.000198"
+ height="8"
+ width="2"
+ id="rect7014"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path7024"
+ d="m 89.584559,505.02472 1.415641,1.41278 c -1.873879,1.88758 -3.098211,3.70288 -5,5.5625 l -1.415641,-1.41278 c 1.951154,-1.8092 3.130468,-3.6698 5,-5.5625 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ d="m 91.0002,505 0,5 -5,-5 z"
+ id="path7026"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g7083"
+ inkscape:label="stock-gravity-north-west">
+ <g
+ transform="matrix(-1,0,0,1,198.0004,0)"
+ id="g7071"
+ inkscape:label="stock-gravity-north-east">
+ <rect
+ transform="translate(241.0002,217)"
+ y="282"
+ x="-160"
+ height="16"
+ width="16"
+ id="rect7073"
+ style="opacity:0.3;fill:none;stroke:none" />
+ <rect
+ y="501"
+ x="85.000198"
+ height="2"
+ width="10"
+ id="rect7075"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="503"
+ x="93.000198"
+ height="8"
+ width="2"
+ id="rect7077"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path7079"
+ d="m 89.584559,505.02472 1.415641,1.41278 c -1.873879,1.88758 -3.098211,3.70288 -5,5.5625 l -1.415641,-1.41278 c 1.951154,-1.8092 3.130468,-3.6698 5,-5.5625 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ d="m 91.0002,505 0,5 -5,-5 z"
+ id="path7081"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc" />
+ </g>
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g7124"
+ inkscape:label="stock-gravity-south-east">
+ <g
+ transform="matrix(-1,0,0,-1,238.0004,1014)"
+ id="g7110"
+ inkscape:label="stock-gravity-north-west">
+ <g
+ transform="matrix(-1,0,0,1,198.0004,0)"
+ id="g7112"
+ inkscape:label="stock-gravity-north-east">
+ <rect
+ transform="translate(241.0002,217)"
+ y="282"
+ x="-160"
+ height="16"
+ width="16"
+ id="rect7114"
+ style="opacity:0.3;fill:none;stroke:none" />
+ <rect
+ y="501"
+ x="85.000198"
+ height="2"
+ width="10"
+ id="rect7116"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="503"
+ x="93.000198"
+ height="8"
+ width="2"
+ id="rect7118"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path7120"
+ d="m 89.584559,505.02472 1.415641,1.41278 c -1.873879,1.88758 -3.098211,3.70288 -5,5.5625 l -1.415641,-1.41278 c 1.951154,-1.8092 3.130468,-3.6698 5,-5.5625 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ d="m 91.0002,505 0,5 -5,-5 z"
+ id="path7122"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc" />
+ </g>
+ </g>
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g7149"
+ inkscape:label="stock-gravity-south-west">
+ <g
+ transform="matrix(-1,0,0,1,278.0004,0)"
+ id="g7133"
+ inkscape:label="stock-gravity-south-east">
+ <g
+ transform="matrix(-1,0,0,-1,238.0004,1014)"
+ id="g7135"
+ inkscape:label="stock-gravity-north-west">
+ <g
+ transform="matrix(-1,0,0,1,198.0004,0)"
+ id="g7137"
+ inkscape:label="stock-gravity-north-east">
+ <rect
+ transform="translate(241.0002,217)"
+ y="282"
+ x="-160"
+ height="16"
+ width="16"
+ id="rect7139"
+ style="opacity:0.3;fill:none;stroke:none" />
+ <rect
+ y="501"
+ x="85.000198"
+ height="2"
+ width="10"
+ id="rect7141"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="503"
+ x="93.000198"
+ height="8"
+ width="2"
+ id="rect7143"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path7145"
+ d="m 89.584559,505.02472 1.415641,1.41278 c -1.873879,1.88758 -3.098211,3.70288 -5,5.5625 l -1.415641,-1.41278 c 1.951154,-1.8092 3.130468,-3.6698 5,-5.5625 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ d="m 91.0002,505 0,5 -5,-5 z"
+ id="path7147"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc" />
+ </g>
+ </g>
+ </g>
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g7226"
+ inkscape:label="stock-invert">
+ <rect
+ transform="translate(241.0002,217)"
+ y="282"
+ x="-80"
+ height="16"
+ width="16"
+ id="rect7178"
+ style="fill:none;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect7201"
+ transform="translate(241.0002,217)"
+ d="m -80,282 0,16 16,0 0,-16 -16,0 z m 1,1 14,0 0,14 -14,0 0,-14 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path7206"
+ transform="translate(241.0002,217)"
+ d="m -79,283 0,14 3.46875,-3.46875 C -76.436072,292.62643 -77,291.38071 -77,290 c 0,-2.76142 2.238576,-5 5,-5 1.380712,0 2.626428,0.56393 3.53125,1.46875 L -65,283 l -14,0 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path7221"
+ d="m 174.0002,507 c 0,2.76142 -2.23858,5 -5,5 -1.38071,0 -2.62643,-0.56393 -3.53125,-1.46875 l 7.0625,-7.0625 c 0.90482,0.90482 1.46875,2.15054 1.46875,3.53125 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g7156"
+ inkscape:label="stock-curve-free">
+ <rect
+ transform="translate(241.0002,217)"
+ y="282"
+ x="-60"
+ height="16"
+ width="16"
+ id="rect6380"
+ style="fill:none;stroke:none" />
+ <path
+ transform="matrix(0.9797799,0,0,0.73483496,239.31357,295.22369)"
+ d="m -55,295 c 0,1.10457 -0.671573,2 -1.5,2 -0.828427,0 -1.5,-0.89543 -1.5,-2 0,-1.10457 0.671573,-2 1.5,-2 0.828427,0 1.5,0.89543 1.5,2 z"
+ sodipodi:ry="2"
+ sodipodi:rx="1.5"
+ sodipodi:cy="295"
+ sodipodi:cx="-56.5"
+ id="path7150"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ sodipodi:type="arc" />
+ <path
+ sodipodi:type="arc"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="path7152"
+ sodipodi:cx="-56.5"
+ sodipodi:cy="295"
+ sodipodi:rx="1.5"
+ sodipodi:ry="2"
+ d="m -55,295 c 0,1.10457 -0.671573,2 -1.5,2 -0.828427,0 -1.5,-0.89543 -1.5,-2 0,-1.10457 0.671573,-2 1.5,-2 0.828427,0 1.5,0.89543 1.5,2 z"
+ transform="matrix(0.9797799,0,0,0.73483496,249.34564,285.26353)" />
+ <path
+ sodipodi:nodetypes="ccccccc"
+ transform="translate(241.0002,217)"
+ inkscape:connector-curvature="0"
+ id="path7154"
+ d="M -57,293.53941 -55.486136,287 l 2.044194,5 1.911612,-4 3.06066,6 1.46967,-7.48746 0,0"
+ style="fill:none;stroke:#bebebe;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g7199"
+ inkscape:label="stock-curve-smooth">
+ <rect
+ style="fill:none;stroke:none"
+ id="rect7185"
+ width="16"
+ height="16"
+ x="41.000198"
+ y="519" />
+ <path
+ sodipodi:type="arc"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="path7187"
+ sodipodi:cx="-56.5"
+ sodipodi:cy="295"
+ sodipodi:rx="1.5"
+ sodipodi:ry="2"
+ d="m -55,295 c 0,1.10457 -0.671573,2 -1.5,2 -0.828427,0 -1.5,-0.89543 -1.5,-2 0,-1.10457 0.671573,-2 1.5,-2 0.828427,0 1.5,0.89543 1.5,2 z"
+ transform="matrix(0.9797799,0,0,0.73483496,99.31357,315.22369)" />
+ <path
+ transform="matrix(0.9797799,0,0,0.73483496,109.34564,305.26353)"
+ d="m -55,295 c 0,1.10457 -0.671573,2 -1.5,2 -0.828427,0 -1.5,-0.89543 -1.5,-2 0,-1.10457 0.671573,-2 1.5,-2 0.828427,0 1.5,0.89543 1.5,2 z"
+ sodipodi:ry="2"
+ sodipodi:rx="1.5"
+ sodipodi:cy="295"
+ sodipodi:cx="-56.5"
+ id="path7189"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ sodipodi:type="arc" />
+ <path
+ sodipodi:nodetypes="cscc"
+ transform="translate(241.0002,217)"
+ inkscape:connector-curvature="0"
+ id="path7197"
+ d="m -197,314 c 0,0 0,-10 5,-4 5,6 5,-3 5,-3 l 0,-1"
+ style="fill:none;stroke:#bebebe;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g7238"
+ inkscape:label="stock-default-colors">
+ <rect
+ transform="translate(241.0002,217)"
+ y="302"
+ x="-180"
+ height="16"
+ width="16"
+ id="rect7224"
+ style="fill:none;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect7226"
+ transform="translate(241.0002,217)"
+ d="m -179,304 0,8 9,0 0,-8 -9,0 z m 1,1 7,0 0,6 -7,0 0,-6 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ sodipodi:nodetypes="ccccccc"
+ inkscape:connector-curvature="0"
+ id="rect7231"
+ transform="translate(241.0002,217)"
+ d="m -170,308 0,4 -4,0 0,4 9,0 0,-8 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="305"
+ x="-178"
+ height="6"
+ width="7"
+ id="rect7236"
+ style="opacity:0.02999998;fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g8480"
+ inkscape:label="stock-gegl">
+ <rect
+ transform="translate(241.0002,217)"
+ y="302"
+ x="-160"
+ height="16"
+ width="16"
+ id="rect8470"
+ style="opacity:0.02999998;fill:none;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path3189"
+ d="M 59.6875,57.875 C 49.147041,58.021389 40.40625,67.096604 40.40625,79 c 0,6.050682 2.118302,11.000062 5.8125,14.46875 3.694198,3.468688 8.998381,5.46875 15.5,5.46875 12.612219,0 21.65223,-12.12837 19.3125,-24.96875 l -19.28125,0 c -2.889253,0 -4.363689,2.09409 -4.5,4.1875 -0.06815,1.046705 0.25025,2.05311 0.875,2.75 0.62475,0.69689 1.583964,1.163811 3.15625,1.09375 1.370078,-0.06105 1.690594,-0.494339 2.28125,-1.1875 0.590656,-0.693161 1.446743,-1.783802 3.0625,-1.9375 0.665199,-0.06328 1.467338,0.07061 2.21875,0.53125 0.751412,0.460644 1.402871,1.327073 1.5,2.5 0.200279,2.418562 -0.82569,4.51044 -2.46875,5.875 -1.64306,1.36456 -3.86446,2.076308 -6.25,2.0625 C 53.831368,89.79837 49.526112,84.072128 49.375,78.40625 49.29944,75.573311 50.227745,72.718596 52.1875,70.5625 54.147255,68.406404 57.151881,67 61.03125,67 l 17.0625,0 C 75.000588,62.43761 69.526549,57.738352 59.6875,57.875 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ transform="matrix(0.34150705,0,0,0.34018438,68.201181,500.31183)" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g22234"
+ inkscape:label="stock-landscape">
+ <rect
+ transform="translate(241.0002,217)"
+ y="302"
+ x="-140"
+ height="16"
+ width="16"
+ id="rect8503"
+ style="fill:none;stroke:none" />
+ <g
+ inkscape:label=" image-x-generic"
+ id="g7781"
+ style="display:inline"
+ transform="translate(-501,219)">
+ <path
+ inkscape:connector-curvature="0"
+ id="path11075"
+ d="m 602.0002,301.99999 0,12 13,10e-6 3,-3 0,0 0,-9.00001 z m 1,1.00001 14,0 0,7 -3,0 0,3 -11,0 z"
+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Sans;-inkscape-font-specification:Sans"
+ sodipodi:nodetypes="cccccccccccccc" />
+ </g>
+ <path
+ id="path22208"
+ transform="translate(241.0002,217)"
+ d="m -129,307 -4.4375,6.125 L -136,311 l -2,3 9,0 0,-3 3,0 z"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccccc" />
+ <path
+ transform="matrix(0.765625,0,0,0.99999997,204.79706,217.5)"
+ d="m -127,307.5 c 0,0.82843 -0.89543,1.5 -2,1.5 -1.10457,0 -2,-0.67157 -2,-1.5 0,-0.82843 0.89543,-1.5 2,-1.5 1.10457,0 2,0.67157 2,1.5 z"
+ sodipodi:ry="1.5"
+ sodipodi:rx="2"
+ sodipodi:cy="307.5"
+ sodipodi:cx="-129"
+ id="path22229"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none"
+ sodipodi:type="arc" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g27842"
+ inkscape:label="stock-portrait">
+ <rect
+ style="fill:none;stroke:none"
+ id="rect22281"
+ width="16"
+ height="16"
+ x="121.0002"
+ y="519" />
+ <g
+ transform="matrix(0,-1,1,0,-178.99979,1137.0002)"
+ style="display:inline"
+ id="g22283"
+ inkscape:label=" image-x-generic">
+ <path
+ sodipodi:nodetypes="cccccccccccccc"
+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Sans;-inkscape-font-specification:Sans"
+ d="m 602.0002,301.99998 0,12 12,2e-5 3,-3 0,0 0,-9.00001 z m 1,1.00001 13,10e-6 0,7 -3,0 0,3 -10,-10e-6 z"
+ id="path22285"
+ inkscape:connector-curvature="0" />
+ </g>
+ <path
+ sodipodi:type="arc"
+ style="opacity:0.3;color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="path20580-9"
+ sodipodi:cx="49.5"
+ sodipodi:cy="342.5"
+ sodipodi:rx="2.5"
+ sodipodi:ry="2.5"
+ d="m 52,342.5 c 0,1.38071 -1.119288,2.5 -2.5,2.5 -1.380712,0 -2.5,-1.11929 -2.5,-2.5 0,-1.38071 1.119288,-2.5 2.5,-2.5 1.380712,0 2.5,1.11929 2.5,2.5 z"
+ transform="matrix(0.8,0,0,0.8,89.4002,253)" />
+ <path
+ sodipodi:nodetypes="ccccccc"
+ inkscape:connector-curvature="0"
+ id="path27835"
+ d="m 127.0002,529 c -1.19566,0.86451 -2,2 -2,4 l 8,0 c 0,-2 -0.80434,-3.13549 -2,-4 l 0,1 -4,0 z"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g28007"
+ inkscape:label="stock-question">
+ <rect
+ inkscape:label="a"
+ y="519"
+ x="141.0002"
+ height="16"
+ width="16"
+ id="rect19590"
+ style="color:#bebebe;fill:none;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path27972"
+ d="m 148.8125,522 c 1.64243,-0.092 3.0955,1.17008 3.1875,2.8125 -1e-4,1.40136 -0.37771,1.92177 -1.59375,2.84375 -0.19093,0.14364 -0.3256,0.2506 -0.375,0.3125 C 149.98185,528.03085 150,528.002 150,528 c 0.007,0.52831 -0.47163,1 -1,1 -0.52837,0 -1.007,-0.47169 -1,-1 0,-0.50239 0.22424,-0.94342 0.46875,-1.25 0.24451,-0.30663 0.4913,-0.51638 0.71875,-0.6875 0.20405,-0.16056 0.46083,-0.38454 0.6875,-0.65625 0.0935,-0.1121 0.129,-0.30766 0.125,-0.4375 l 0,-0.0312 c -0.0316,-0.56324 -0.49926,-0.9691 -1.0625,-0.9375 -0.56324,0.0316 -0.9691,0.43676 -0.9375,1 l -2,0 c -0.092,-1.64243 1.17007,-2.9079 2.8125,-3 z"
+ style="color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path19592"
+ d="m 149,530 c 0.55228,0 1,0.44772 1,1 0,0.55228 -0.44772,1 -1,1 -0.55228,0 -1,-0.44772 -1,-1 0,-0.55228 0.44772,-1 1,-1 z"
+ style="color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path27976"
+ transform="translate(241.0002,217)"
+ d="m -92,302 c -4.418278,0 -8,3.58172 -8,8 0,4.41828 3.581722,8 8,8 4.418278,0 8,-3.58172 8,-8 0,-4.41828 -3.581722,-8 -8,-8 z m 0,2 c 3.313708,0 6,2.68629 6,6 0,3.31371 -2.686292,6 -6,6 -3.313708,0 -6,-2.68629 -6,-6 0,-3.31371 2.686292,-6 6,-6 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g28094"
+ inkscape:label="stock-reshow-filter">
+ <rect
+ transform="translate(241.0002,217)"
+ y="302"
+ x="-80"
+ height="16"
+ width="16"
+ id="rect28045"
+ style="fill:none;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path35543-6-4-0"
+ transform="translate(241.0002,217)"
+ d="m -72,303 c -0.22065,0 -0.44081,0.0113 -0.65625,0.0312 l -0.40625,2.09375 c -0.33446,0.0733 -0.66305,0.17589 -0.96875,0.3125 l -1.53125,-1.46875 c -0.38863,0.23011 -0.72695,0.51408 -1.0625,0.8125 l 0.90625,1.90625 c -0.22242,0.24899 -0.42425,0.5225 -0.59375,0.8125 l -2.09375,-0.28125 c -0.17772,0.40877 -0.30872,0.83637 -0.40625,1.28125 l 1.84375,1 C -76.98585,309.66809 -77,309.8274 -77,310 l 2,0 c 0,-1.65685 1.34315,-3 3,-3 1.65685,0 3,1.34315 3,3 l 2,0 c 0,-0.1726 -0.01425,-0.33191 -0.03125,-0.5 l 1.84375,-1 c -0.0975,-0.44488 -0.22853,-0.87248 -0.40625,-1.28125 L -67.6875,307.5 c -0.1695,-0.29 -0.37133,-0.56351 -0.59375,-0.8125 l 0.90625,-1.90625 c -0.33555,-0.29842 -0.67387,-0.58239 -1.0625,-0.8125 l -1.53125,1.46875 c -0.3057,-0.13661 -0.63429,-0.23916 -0.96875,-0.3125 l -0.40625,-2.09375 C -71.55919,303.01125 -71.77935,303 -72,303 z"
+ style="color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect28071"
+ transform="translate(241.0002,217)"
+ d="m -79,311 0,7 14,0 0,-7 -14,0 z m 3,1 1,0 0,5 -1,0 0,-4 -1,1 0,-1 1,-1 z m 3.5,0 c 0.831,0 1.5,0.669 1.5,1.5 l 0,2 c 0,0.831 -0.669,1.5 -1.5,1.5 -0.831,0 -1.5,-0.669 -1.5,-1.5 l 0,-2 c 0,-0.831 0.669,-1.5 1.5,-1.5 z m 4.5,0 2,2 -4,0 2,-2 z m -4.5,1 c -0.277,0 -0.5,0.223 -0.5,0.5 l 0,2 c 0,0.277 0.223,0.5 0.5,0.5 0.277,0 0.5,-0.223 0.5,-0.5 l 0,-2 c 0,-0.277 -0.223,-0.5 -0.5,-0.5 z m 2.5,2 4,0 -2,2 -2,-2 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g28157"
+ inkscape:label="stock-sample-point">
+ <rect
+ transform="translate(241.0002,217)"
+ y="302"
+ x="-60"
+ height="16"
+ width="16"
+ id="rect28118"
+ style="fill:none;stroke:none" />
+ <rect
+ rx="1"
+ ry="0"
+ y="519"
+ x="188.0002"
+ height="4"
+ width="2"
+ id="rect28130"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="scale(1,-1)"
+ rx="0"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect28132"
+ width="2"
+ height="4"
+ x="188.0002"
+ y="-535"
+ ry="1" />
+ <rect
+ transform="matrix(0,1,-1,0,0,0)"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect28134"
+ width="2"
+ height="4"
+ x="526"
+ y="-185.0002"
+ ry="1"
+ rx="0" />
+ <rect
+ rx="1"
+ ry="0"
+ y="193.0002"
+ x="526"
+ height="4"
+ width="2"
+ id="rect28136"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ transform="matrix(0,1,1,0,0,0)" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path28141"
+ transform="translate(241.0002,217)"
+ d="m -52,305 c -2.761424,0 -5,2.23858 -5,5 0,2.76142 2.238576,5 5,5 0.345178,0 0.674512,-0.0272 1,-0.0937 l 0,-2.09375 c -0.316472,0.11352 -0.644467,0.1875 -1,0.1875 -1.656854,0 -3,-1.34315 -3,-3 0,-1.65685 1.343146,-3 3,-3 1.656854,0 3,1.34315 3,3 0,0.35553 -0.07398,0.68353 -0.1875,1 l 2.09375,0 c 0.0666,-0.32549 0.09375,-0.65482 0.09375,-1 0,-2.76142 -2.238576,-5 -5,-5 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ sodipodi:nodetypes="cccccccc"
+ inkscape:connector-curvature="0"
+ id="path28149"
+ d="m 192.0002,531 0,-1 3,0 0,5 -2,0 0,-4 0,0 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ ry="1"
+ rx="0"
+ y="534"
+ x="192.0002"
+ height="1"
+ width="4"
+ id="rect28151"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g28317"
+ inkscape:label="stock-color-pick-from-screen">
+ <rect
+ rx="0"
+ transform="translate(241.0002,217)"
+ y="322"
+ x="-200"
+ height="16"
+ width="16"
+ id="rect28186"
+ style="fill:none;stroke:none" />
+ <path
+ sodipodi:nodetypes="ccccccc"
+ inkscape:connector-curvature="0"
+ d="m 53.61215,544.3727 -3.48695,4.2523 -1.69404,1.49261 -0.69772,-0.56071 0.99632,-2.0533 3.48697,-4.2523 z"
+ id="path3620-6"
+ style="fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 50.56209,542.91501 3.960928,3.11703 0.600162,-0.81806 -1.188253,-0.93507 c 2.388647,-0.70095 4.021196,-3.68918 2.436833,-4.93601 -1.584362,-1.2468 -4.009097,1.11801 -4.021195,3.6892 l -1.188287,-0.93511 -0.600188,0.81802 z"
+ id="path3583-6"
+ style="fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+ <path
+ sodipodi:nodetypes="ssssssccssssssccs"
+ inkscape:connector-curvature="0"
+ id="rect28283"
+ transform="translate(241.0002,217)"
+ d="m -198.8125,326 c -0.65445,0 -1.1875,0.52209 -1.1875,1.1875 l 0,7.625 c 0,0.66541 0.53305,1.1875 1.1875,1.1875 l 13.5,0 c 0.65445,0 1.1875,-0.52209 1.1875,-1.1875 L -184,327 l -1,1 0,6 c 0,0.66541 -0.6893,1 -1.34375,1 l -11.46875,0 c -0.65445,0 -1.1875,-0.52209 -1.1875,-1.1875 l 0,-5.625 c 0,-0.66541 0.53305,-1.1875 1.1875,-1.1875 l 5.8125,0 0.75,-1 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ sodipodi:nodetypes="cccccccccc"
+ inkscape:connector-curvature="0"
+ id="rect28288"
+ transform="translate(241.0002,217)"
+ d="m -197,329 0,4 10,0 0,-3 -3,3 -1,0 -3,0 0,-1 1,-3 z"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ rx="1.1962026"
+ transform="translate(241.0002,217)"
+ y="336"
+ x="-197"
+ height="2"
+ width="10"
+ id="rect28290"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g35164"
+ inkscape:label="stock-input-device">
+ <rect
+ transform="translate(241.0002,217)"
+ y="322"
+ x="-160"
+ height="16"
+ width="16"
+ id="rect35122"
+ style="fill:none;stroke:none" />
+ <path
+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Sans;-inkscape-font-specification:Sans"
+ d="m 88.8627,539.0369 -0.96644,0.0274 0.0437,0.49793 c 0.0454,0.46362 -0.19538,0.96548 -0.57274,1.21369 -0.34056,0.24792 -0.87291,0.19748 -1.53735,0.21784 -0.33622,0.003 -0.6781,0.0836 -0.99476,0.28008 -0.31666,0.19651 -0.62686,0.54463 -0.69332,0.99585 -0.15271,0.88869 0.43776,1.62666 1.11534,1.77386 0.77872,0.17531 1.58633,0.0753 2.5321,0 0.24674,-0.0196 0.57931,0.0204 0.78375,0.12448 0.32193,0.25967 0.27437,0.40124 0.2713,0.87137 L 83.0002,545 l -0.625,0.0625 -1.45883,8.93956 1.2962,0 13.384,0 1.26605,0 L 95.4377,545 l -1.8125,2 0.375,5 -10.55172,0.0104 0.55172,-5.0104 3.9699,0.0311 c 0.01,-0.0105 0.0199,-0.021 0.0301,-0.0311 l 1,-1 0.80865,-0.92946 0,-0.0311 0,-0.4668 c -0.003,-0.60893 -0.39138,-1.09201 -0.81389,-1.30706 -0.42251,-0.21504 -0.8972,-0.24959 -1.2962,-0.21784 -0.96067,0.0765 -1.67795,0.12442 -2.23066,0 l -0.0301,0 c -0.19243,-0.0418 -0.40266,-0.20884 -0.33158,-0.6224 0.0182,-0.12377 0.075,-0.19567 0.211,-0.28009 0.13602,-0.0845 0.33999,-0.15423 0.51246,-0.1556 l 0.0301,0 c 0.54401,-0.0166 1.32832,0.11715 2.01966,-0.40456 0.78977,-0.596 1.1129,-1.38936 1.0249,-2.11619 z"
+ id="path8540"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccccccccccccccccccccccccscccccccssc" />
+ <path
+ style="fill:#bebebe;fill-opacity:1;stroke:none;display:inline"
+ d="m 96.556174,539.15625 c -0.09668,-0.004 -0.194137,0.0318 -0.293891,0.125 -4.193268,3.68075 -7.96447,7.875 -7.96447,9.875 0.154432,0.88996 -0.209222,0.55704 -0.235113,1.4375 0.04458,0.32567 0.294729,0.55542 0.558395,0.5 0.208743,-0.044 0.880537,-0.21668 0.940453,-0.65625 1.335088,0.038 1.814221,-1.68833 2.850751,-3.0625 l 4.467156,-7.4375 c 0.182279,-0.37494 -0.0332,-0.76875 -0.323281,-0.78125 z"
+ id="path35143"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccccc" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g35213"
+ inkscape:label="stock-device-status">
+ <rect
+ rx="0"
+ transform="translate(241.0002,217)"
+ y="322"
+ x="-180"
+ height="16"
+ width="16"
+ id="rect34968"
+ style="fill:none;stroke:none" />
+ <path
+ sodipodi:nodetypes="cccccccccccccc"
+ inkscape:connector-curvature="0"
+ id="path35057"
+ d="m 70.78145,539 c -0.1028,-0.004 -0.20643,0.0318 -0.3125,0.125 -4.45877,3.68075 -8.46875,7.875 -8.46875,9.875 0.16421,0.88996 -0.22247,0.55704 -0.25,1.4375 0.0474,0.32567 0.31339,0.55542 0.59375,0.5 0.22196,-0.044 0.93629,-0.21668 1,-0.65625 1.41962,0.038 1.92909,-1.68833 3.03125,-3.0625 l 4.75,-7.4375 C 71.31902,539.40631 71.0899,539.0125 70.78145,539 z m -5.78125,6 1,0 -2,3 -1,0 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none;display:inline" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path35102"
+ d="m 62.0002,550 -1,2 1,0 1,-2 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path35201"
+ transform="translate(241.0002,217)"
+ d="m -169,328 c -2.76142,0 -5,2.23858 -5,5 0,2.76142 2.23858,5 5,5 2.76142,0 5,-2.23858 5,-5 0,-2.76142 -2.23858,-5 -5,-5 z m -1,2 2,0 0,1 -2,0 0,-1 z m 0,2 2,0 0,4 -2,0 0,-4 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g12949"
+ inkscape:label="stock-char-picker">
+ <rect
+ transform="translate(241.0002,217)"
+ y="322"
+ x="-140"
+ height="16"
+ width="16"
+ id="rect12154"
+ style="fill:none;stroke:none" />
+ <g
+ id="g4934"
+ transform="matrix(0.99459226,0,0,0.99777268,-20.317163,140.89093)">
+ <path
+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+ d="m 225.70228,383 c -1.53288,0 -2.71875,1.31948 -2.71875,2.84375 l 0,8.34375 c 0,1.52427 1.18587,2.84375 2.71875,2.84375 l 8.57897,0 c 1.53288,0 2.75,-1.31948 2.75,-2.84375 l 0,-8.34375 c 0,-1.52427 -1.21712,-2.84375 -2.75,-2.84375 z m 0.78125,1.03125 c 3.52668,0.25598 5.31717,0.13378 7.04772,0 0.75419,-0.0583 1.53125,0.61584 1.53125,1.4375 l 0,7.55357 c 0,0.66541 -0.53119,1.09567 -1.1875,1.1875 -2.83642,0.39685 -4.75306,0.44007 -7.67272,0 -0.65529,-0.0988 -1.1875,-0.52209 -1.1875,-1.1875 l 0,-7.52232 c 0,-0.82166 0.71429,-1.52351 1.46875,-1.46875 z"
+ transform="matrix(0.99886409,0,0,1,-99.747824,17)"
+ id="rect11749-5-9-2-7"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ssssssssssssssssss" />
+ </g>
+ <path
+ style="color:#000000;fill:none;stroke:#bebebe;stroke-width:1.01323974;stroke-opacity:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 108.65568,545.55215 2.90729,-0.0455 c 0.57263,0.0455 0.96908,0.36416 0.96908,0.95593 l -0.0442,3.18647 -2.99537,0 c -1.38531,0.0425 -1.28291,-2.15191 0.0442,-2.04845 l 2.90727,0"
+ id="path11643"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccc" />
+ <path
+ style="color:#000000;fill:none;stroke:#bebebe;stroke-width:1.04574132;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 109.52307,543.63338 2.95426,-1.11051"
+ id="path11645"
+ inkscape:connector-curvature="0" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g13016"
+ inkscape:label="stock-color-picker-black">
+ <g
+ transform="translate(-60,362)"
+ id="g12975"
+ inkscape:label="stock-tool-color-picker">
+ <rect
+ ry="0"
+ rx="0.9978134"
+ transform="translate(241.0002,217)"
+ y="-40"
+ x="-60"
+ height="16"
+ width="16"
+ id="rect12977"
+ style="fill:none;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 191.61215,182.40474 -4.22019,5.66336 -1.69404,1.49261 L 185.0002,189 l 0.99632,-2.0533 4.22021,-5.66336 1.39542,1.1214 z"
+ id="path12979"
+ style="fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+ <path
+ sodipodi:nodetypes="cssc"
+ inkscape:connector-curvature="0"
+ d="m 185.0002,189.57452 c 0,0 -1.47718,0.66848 -1.46543,2.07969 0.0147,1.75803 2.66009,1.84345 2.74332,0.28446 0.0475,-0.89097 -1.27789,-2.36415 -1.27789,-2.36415 z"
+ id="path12981"
+ style="fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 187.64655,181.43041 4.6492,3.52738 0.70445,-0.92575 -1.39473,-1.05818 c 2.80371,-0.79322 4.71994,-4.17485 2.86027,-5.58582 -1.85967,-1.41094 -4.70574,1.26519 -4.71994,4.17488 l -1.39477,-1.05822 -0.70448,0.92571 z"
+ id="path12983"
+ style="fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+ </g>
+ <path
+ inkscape:connector-curvature="0"
+ id="rect12985"
+ transform="translate(241.0002,217)"
+ d="m -110,332 0,6 6,0 0,-6 -6,0 z m 1,1 4,0 0,4 -4,0 0,-4 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g13024"
+ inkscape:label="stock-color-picker-white">
+ <g
+ inkscape:label="stock-tool-color-picker"
+ id="g12990"
+ transform="translate(-40,362)">
+ <rect
+ style="fill:none;stroke:none"
+ id="rect12992"
+ width="16"
+ height="16"
+ x="-60"
+ y="-40"
+ transform="translate(241.0002,217)"
+ rx="0.9978134"
+ ry="0" />
+ <path
+ style="fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none"
+ id="path12994"
+ d="m 191.61215,182.40474 -4.22019,5.66336 -1.69404,1.49261 L 185.0002,189 l 0.99632,-2.0533 4.22021,-5.66336 1.39542,1.1214 z"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none"
+ id="path12996"
+ d="m 185.0002,189.57452 c 0,0 -1.47718,0.66848 -1.46543,2.07969 0.0147,1.75803 2.66009,1.84345 2.74332,0.28446 0.0475,-0.89097 -1.27789,-2.36415 -1.27789,-2.36415 z"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cssc" />
+ <path
+ style="fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none"
+ id="path12998"
+ d="m 187.64655,181.43041 4.6492,3.52738 0.70445,-0.92575 -1.39473,-1.05818 c 2.80371,-0.79322 4.71994,-4.17485 2.86027,-5.58582 -1.85967,-1.41094 -4.70574,1.26519 -4.71994,4.17488 l -1.39477,-1.05822 -0.70448,0.92571 z"
+ inkscape:connector-curvature="0" />
+ </g>
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ d="m 151.0002,549 0,6 6,0 0,-6 z"
+ id="path13000" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g13032"
+ inkscape:label="stock-color-picker-gray">
+ <g
+ inkscape:label="stock-tool-color-picker"
+ id="g13002"
+ transform="translate(-20,362)">
+ <rect
+ style="fill:none;stroke:none"
+ id="rect13004"
+ width="16"
+ height="16"
+ x="-60"
+ y="-40"
+ transform="translate(241.0002,217)"
+ rx="0.9978134"
+ ry="0" />
+ <path
+ style="fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none"
+ id="path13006"
+ d="m 191.61215,182.40474 -4.22019,5.66336 -1.69404,1.49261 L 185.0002,189 l 0.99632,-2.0533 4.22021,-5.66336 1.39542,1.1214 z"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none"
+ id="path13008"
+ d="m 185.0002,189.57452 c 0,0 -1.47718,0.66848 -1.46543,2.07969 0.0147,1.75803 2.66009,1.84345 2.74332,0.28446 0.0475,-0.89097 -1.27789,-2.36415 -1.27789,-2.36415 z"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cssc" />
+ <path
+ style="fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none"
+ id="path13010"
+ d="m 187.64655,181.43041 4.6492,3.52738 0.70445,-0.92575 -1.39473,-1.05818 c 2.80371,-0.79322 4.71994,-4.17485 2.86027,-5.58582 -1.85967,-1.41094 -4.70574,1.26519 -4.71994,4.17488 l -1.39477,-1.05822 -0.70448,0.92571 z"
+ inkscape:connector-curvature="0" />
+ </g>
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ d="m 171.0002,549 0,6 6,0 0,-6 -6,0 z m 1,1 4,0 0,4 -4,0 0,-4 z"
+ id="path13012" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="333"
+ x="-69"
+ height="4"
+ width="4"
+ id="rect13014"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g13111"
+ inkscape:label="stock-colormap">
+ <rect
+ transform="translate(241.0002,217)"
+ y="322"
+ x="-60"
+ height="16"
+ width="16"
+ id="rect13093"
+ style="fill:none;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect13095"
+ transform="translate(241.0002,217)"
+ d="m -60,322 0,7 7,0 0,-7 -7,0 z m 1,1 5,0 0,5 -5,0 0,-5 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="548"
+ x="181.0002"
+ height="7"
+ width="7"
+ id="rect13097"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect13099"
+ d="m 190.0002,548 0,7 7,0 0,-7 -7,0 z m 1,1 5,0 0,5 -5,0 0,-5 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="539"
+ x="190.0002"
+ height="7"
+ width="7"
+ id="rect13101"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="549"
+ x="191.0002"
+ height="5"
+ width="5"
+ id="rect13109"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g13265"
+ inkscape:label="stock-dynamics">
+ <rect
+ transform="translate(241.0002,217)"
+ y="342"
+ x="-200"
+ height="16"
+ width="16"
+ id="rect13138"
+ style="opacity:0.3;fill:none;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path3997"
+ d="m 42.529331,562.64322 c 0.631195,0.5364 1.57798,0.45896 2.114209,-0.17163 0.536485,-0.63148 0.4587,-1.57858 -0.172417,-2.11475 -0.63139,-0.53647 -1.578096,-0.45903 -2.114239,0.17155 -0.536436,0.63128 -0.458843,1.57848 0.172447,2.11483 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path3989"
+ d="m 46.544655,562.65647 c 0.638448,0.52756 1.583925,0.4374 2.111611,-0.20105 0.528123,-0.63843 0.437772,-1.58431 -0.200461,-2.1118 -0.638524,-0.52772 -1.584003,-0.43748 -2.111758,0.20111 -0.527993,0.63821 -0.437709,1.5841 0.200608,2.11174 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ sodipodi:nodetypes="ccccczcc"
+ inkscape:connector-curvature="0"
+ id="path4045"
+ d="M 53.21112,565.89758 55.0002,564 l 0,9 -9,0 2.05997,-1.98155 c 0,0 -4.045684,-2.80599 -0.797719,-5.86149 3.247965,-3.05551 5.754883,0.9076 5.754883,0.9076 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path3771"
+ d="m 42.525287,566.65692 c 0.643417,0.52684 1.596391,0.43683 2.128303,-0.20067 0.532275,-0.63753 0.441149,-1.58188 -0.202112,-2.10866 -0.643472,-0.52691 -1.596503,-0.43681 -2.128368,0.20074 -0.532143,0.63739 -0.441249,1.58174 0.202177,2.10859 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g13299"
+ inkscape:label="stock-floating-selection">
+ <rect
+ transform="translate(241.0002,217)"
+ y="342"
+ x="-180"
+ height="16"
+ width="16"
+ id="rect13291"
+ style="opacity:0.3;fill:none;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path13293"
+ d="m 62.0002,573 3,-5 11,0 -3,5 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none"
+ d="m 62.0002,566 3,-5 11,0 -3,5 z"
+ id="path13295"
+ inkscape:connector-curvature="0" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g13357"
+ inkscape:label="stock-join-bevel">
+ <rect
+ transform="translate(241.0002,217)"
+ y="342"
+ x="-160"
+ height="16"
+ width="16"
+ id="rect13323"
+ style="opacity:0.3;fill:none;stroke:none" />
+ <path
+ sodipodi:nodetypes="ccccccccccccccccccc"
+ inkscape:connector-curvature="0"
+ id="rect13325"
+ d="m 86.0002,561 -3,3 0,2 0,3 0,5 3,0 0,-10 2,0 1,0 6,0 0,-3 z m 3,6 0,7 3,0 0,-4 3,0 0,-3 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="565"
+ x="93.000198"
+ height="1"
+ width="1"
+ id="rect13341"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="565"
+ x="91.000198"
+ height="1"
+ width="1"
+ id="rect13343"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="565"
+ x="89.000198"
+ height="1"
+ width="1"
+ id="rect13345"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="565"
+ x="87.000198"
+ height="1"
+ width="1"
+ id="rect13347"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="567"
+ x="87.000198"
+ height="1"
+ width="1"
+ id="rect13349"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="569"
+ x="87.000198"
+ height="1"
+ width="1"
+ id="rect13351"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="571"
+ x="87.000198"
+ height="1"
+ width="1"
+ id="rect13353"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="573"
+ x="87.000198"
+ height="1"
+ width="1"
+ id="rect13355"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g13410"
+ inkscape:label="stock-join-miter">
+ <g
+ transform="translate(20,0)"
+ id="g13388"
+ inkscape:label="stock-join-bevel">
+ <rect
+ transform="translate(241.0002,217)"
+ y="342"
+ x="-160"
+ height="16"
+ width="16"
+ id="rect13390"
+ style="opacity:0.3;fill:none;stroke:none" />
+ <path
+ sodipodi:nodetypes="ccccccccccccccccccc"
+ inkscape:connector-curvature="0"
+ id="path13392"
+ d="m 86.0002,561 -3,0 0,5 0,3 0,5 3,0 0,-10 2,0 1,0 6,0 0,-3 z m 3,6 0,7 3,0 0,-4 3,0 0,-3 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="565"
+ x="93.000198"
+ height="1"
+ width="1"
+ id="rect13394"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="565"
+ x="91.000198"
+ height="1"
+ width="1"
+ id="rect13396"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="565"
+ x="89.000198"
+ height="1"
+ width="1"
+ id="rect13398"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="565"
+ x="87.000198"
+ height="1"
+ width="1"
+ id="rect13400"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="567"
+ x="87.000198"
+ height="1"
+ width="1"
+ id="rect13402"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="569"
+ x="87.000198"
+ height="1"
+ width="1"
+ id="rect13404"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="571"
+ x="87.000198"
+ height="1"
+ width="1"
+ id="rect13406"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="573"
+ x="87.000198"
+ height="1"
+ width="1"
+ id="rect13408"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g13484"
+ inkscape:label="stock-join-round">
+ <rect
+ y="559"
+ x="121.0002"
+ height="16"
+ width="16"
+ id="rect13427"
+ style="opacity:0.3;fill:none;stroke:none" />
+ <rect
+ y="565"
+ x="133.0002"
+ height="1"
+ width="1"
+ id="rect13431"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="565"
+ x="131.0002"
+ height="1"
+ width="1"
+ id="rect13433"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="565"
+ x="129.0002"
+ height="1"
+ width="1"
+ id="rect13435"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="565"
+ x="127.0002"
+ height="1"
+ width="1"
+ id="rect13437"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="567"
+ x="127.0002"
+ height="1"
+ width="1"
+ id="rect13439"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="569"
+ x="127.0002"
+ height="1"
+ width="1"
+ id="rect13441"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="571"
+ x="127.0002"
+ height="1"
+ width="1"
+ id="rect13443"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="573"
+ x="127.0002"
+ height="1"
+ width="1"
+ id="rect13445"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ sodipodi:nodetypes="ccssccssccc"
+ inkscape:connector-curvature="0"
+ id="rect13447"
+ d="m 123.0002,574 0,-4 0,-5 c 0,-2.216 1.784,-4 4,-4 l 8,0 c 0,4.3748 0,-0.85566 0,3 l -7,0 c -1.10701,-0.0468 -2,0.892 -2,2 l 0,5 0,3 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ sodipodi:nodetypes="cccccccc"
+ inkscape:connector-curvature="0"
+ id="rect13481"
+ d="m -112,350 6,0 0,1.75 0,1.25 -3,0 0,4 -3,0 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ transform="translate(241.0002,217)" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g13807"
+ inkscape:label="stock-layer-mask">
+ <g
+ transform="translate(80,120)"
+ id="g13516"
+ inkscape:label="stock-layer">
+ <rect
+ transform="translate(241.0002,217)"
+ y="222"
+ x="-180"
+ height="16"
+ width="16"
+ id="rect13518"
+ style="fill:none;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path13520"
+ transform="translate(161.0002,97)"
+ d="m -89,350 -4,2 -1,0 -2.5,-1.25 -0.84375,1.25 -2.65625,4 12,0 4,-6 -5,0 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <path
+ sodipodi:nodetypes="cscscccccccccccccccc"
+ inkscape:connector-curvature="0"
+ id="path3826"
+ transform="translate(241.0002,217)"
+ d="m -98,342 0,4.84375 c 0,1.71931 2,3.15625 4.46875,4.1875 2.53125,-1.03125 4.5,-2.19533 4.5,-4.125 l 0,-4.90625 z m 1,2 3,0 0,1 0,1 -2,-1 z m 4,0 3,0 -1,1 -2,1 z m -3,3 5,0 c -2.474874,4.48943 -5,0 -5,0 z"
+ style="color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.00000024;marker:none;visibility:visible;display:inline;overflow:visible" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g13879"
+ inkscape:label="stock-letter-spacing">
+ <rect
+ transform="translate(241.0002,217)"
+ y="342"
+ x="-80"
+ height="16"
+ width="16"
+ id="rect13832"
+ style="fill:none;stroke:none" />
+ <path
+ sodipodi:nodetypes="ccccccccccccccccccsccccccccscccccccccccccccccccccccccccccccccc"
+ inkscape:connector-curvature="0"
+ id="rect13834"
+ transform="translate(241.0002,217)"
+ d="m -79,343 0,14 14,0 0,-14 z m 8,2 1,0 0,2 1.71875,0 c 0.0118,-10e-4 0.01965,8.8e-4 0.03125,0 1.63636,-0.12511 1.71219,4.0687 0.03125,4 l -2.28125,0 -0.46875,0 0,-0.4375 C -70.9992,347.60737 -71,350.11459 -71,345 z m -5,1 1.8125,0 0.03125,0 c 0.31461,0.0321 0.63337,0.18475 0.84375,0.4375 0.21038,0.25275 0.3125,0.59829 0.3125,0.96875 l -0.03125,3.15625 0,0.4375 -0.4375,0 -2.3125,0 c -1.6559,0.0653 -1.57925,-3.02317 0.03125,-2.90625 l 0.03125,0 1.84375,0 0,-0.6875 c 0,-0.0153 5e-4,-0.017 0,-0.0313 -0.0066,-0.1883 -0.0759,-0.316 -0.125,-0.375 -0.05279,-0.0634 -0.12315,-0.112 -0.25,-0.125 l -1.75,0 z m 5.9375,1.90625 c 0.004,0.14697 -0.006,1.71194 0,2.1875 l 1.84375,0 0.03125,0 c 0.43459,0.0178 0.36781,-2.2257 0,-2.1875 l -0.03125,0 -0.03125,0 z m -5.75,1.0625 c -0.40144,-0.0403 -0.46799,1.17475 0,1.15625 l 0.03125,0 1.84375,0 0.03125,-1.15625 -1.84375,0 -0.03125,0 z M -76,352 l 1,0 0,2 6,0 0,-2 1,0 0,2 0,1 -1,0 -6,0 -1,0 0,-1 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g13914"
+ inkscape:label="stock-line-spacing">
+ <g
+ transform="matrix(0,-1,1,0,-377.9998,736.0002)"
+ id="g13902"
+ inkscape:label="stock-letter-spacing">
+ <rect
+ transform="translate(241.0002,217)"
+ y="342"
+ x="-80"
+ height="16"
+ width="16"
+ id="rect13904"
+ style="fill:none;stroke:none" />
+ <path
+ sodipodi:nodetypes="ccccccccccccccccccccccc"
+ inkscape:connector-curvature="0"
+ id="path13906"
+ transform="matrix(0,1,-1,0,519.0002,619)"
+ d="m -58,345 8,0 0,3 -8,0 z m 9,1 2,0 1,0 0,1 0,6 0,1 -1,0 -2,0 0,-1 2,0 0,-6 -2,0 z m -9,6 8,0 0,3 -8,0 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g6435"
+ inkscape:label="stock-channel">
+ <rect
+ transform="translate(241.0002,217)"
+ y="362"
+ x="-200"
+ height="16"
+ width="16"
+ id="rect5640"
+ style="fill:none;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path6420"
+ d="m 42.15645,583 c -0.63314,0 -1.15625,0.446 -1.15625,1 l 0,10 c 0,0.554 0.52311,1 1.15625,1 l 13.6875,0 c 0.63314,0 1.15625,-0.446 1.15625,-1 l 0,-10 c 0,-0.554 -0.52311,-1 -1.15625,-1 l -13.6875,0 z m 1.84375,2 8,0 c 0.554,0 1,0.446 1,1 l 0,6 c 0,0.554 -0.446,1 -1,1 l -8,0 c -0.554,0 -1,-0.446 -1,-1 l 0,-6 c 0,-0.554 0.446,-1 1,-1 z m 11,0 c 0.55228,0 1,0.44772 1,1 0,0.55228 -0.44772,1 -1,1 -0.55228,0 -1,-0.44772 -1,-1 0,-0.55228 0.44772,-1 1,-1 z m 0,3 c 0.55228,0 1,0.44772 1,1 0,0.55228 -0.44772,1 -1,1 -0.55228,0 -1,-0.44772 -1,-1 0,-0.55228 0.44772,-1 1,-1 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ transform="matrix(0.75,0,0,1.0000003,192.5002,217.9999)"
+ d="m -190,365.5 c 0,0.82843 -0.89543,1.5 -2,1.5 -1.10457,0 -2,-0.67157 -2,-1.5 0,-0.82843 0.89543,-1.5 2,-1.5 1.10457,0 2,0.67157 2,1.5 z"
+ sodipodi:ry="1.5"
+ sodipodi:rx="2"
+ sodipodi:cy="365.5"
+ sodipodi:cx="-192"
+ id="path6429"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ sodipodi:type="arc" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path6431"
+ d="m 45.0002,580 3,3 0,0"
+ style="fill:none;stroke:#bebebe;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" />
+ <path
+ style="fill:none;stroke:#bebebe;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
+ d="m 52.0002,580 -3,3 0,0"
+ id="path6433"
+ inkscape:connector-curvature="0" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g7010"
+ inkscape:label="stock-channel-alpha">
+ <g
+ transform="translate(20,0)"
+ id="g6461"
+ inkscape:label="stock-channel">
+ <rect
+ transform="translate(241.0002,217)"
+ y="362"
+ x="-200"
+ height="16"
+ width="16"
+ id="rect6463"
+ style="fill:none;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path6465"
+ d="m 42.15645,583 c -0.63314,0 -1.15625,0.446 -1.15625,1 l 0,10 c 0,0.554 0.52311,1 1.15625,1 l 13.6875,0 c 0.63314,0 1.15625,-0.446 1.15625,-1 l 0,-10 c 0,-0.554 -0.52311,-1 -1.15625,-1 l -13.6875,0 z m 1.84375,2 8,0 c 0.554,0 1,0.446 1,1 l 0,6 c 0,0.554 -0.446,1 -1,1 l -8,0 c -0.554,0 -1,-0.446 -1,-1 l 0,-6 c 0,-0.554 0.446,-1 1,-1 z m 11,0 c 0.55228,0 1,0.44772 1,1 0,0.55228 -0.44772,1 -1,1 -0.55228,0 -1,-0.44772 -1,-1 0,-0.55228 0.44772,-1 1,-1 z m 0,3 c 0.55228,0 1,0.44772 1,1 0,0.55228 -0.44772,1 -1,1 -0.55228,0 -1,-0.44772 -1,-1 0,-0.55228 0.44772,-1 1,-1 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ transform="matrix(0.75,0,0,1.0000003,192.5002,217.9999)"
+ d="m -190,365.5 c 0,0.82843 -0.89543,1.5 -2,1.5 -1.10457,0 -2,-0.67157 -2,-1.5 0,-0.82843 0.89543,-1.5 2,-1.5 1.10457,0 2,0.67157 2,1.5 z"
+ sodipodi:ry="1.5"
+ sodipodi:rx="2"
+ sodipodi:cy="365.5"
+ sodipodi:cx="-192"
+ id="path6467"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ sodipodi:type="arc" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path6469"
+ d="m 45.0002,580 3,3 0,0"
+ style="fill:none;stroke:#bebebe;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" />
+ <path
+ style="fill:none;stroke:#bebebe;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
+ d="m 52.0002,580 -3,3 0,0"
+ id="path6471"
+ inkscape:connector-curvature="0" />
+ </g>
+ <path
+ sodipodi:nodetypes="ccccc"
+ transform="translate(241.0002,217)"
+ inkscape:connector-curvature="0"
+ id="path6478"
+ d="m -171,369 1.5625,0 -1.5625,3 -1.34375,-0.59375 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ sodipodi:nodetypes="ssssssssss"
+ inkscape:connector-curvature="0"
+ id="path6480"
+ transform="translate(241.0002,217)"
+ d="m -174,369 c -1.65685,0 -3,1.34315 -3,3 0,1.65685 1.34315,3 3,3 1.65685,0 3,-1.34315 3,-3 0,-1.65685 -1.34315,-3 -3,-3 z m 0.0313,1.5 c 0.91472,0 1.65625,0.71355 1.65625,1.59375 0,0.8802 -0.74153,1.59375 -1.65625,1.59375 -0.91472,0 -1.65625,-0.71355 -1.65625,-1.59375 0,-0.8802 0.74153,-1.59375 1.65625,-1.59375 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ sodipodi:nodetypes="cccc"
+ transform="translate(241.0002,217)"
+ inkscape:connector-curvature="0"
+ id="path6993"
+ d="m -171.34375,372.46875 c 0,0 1.34375,2.53125 2.34375,0.53125 0.4106,1.63204 -1.42962,3.35557 -3,1 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g7292"
+ inkscape:label="stock-channel-gray">
+ <g
+ transform="translate(100,0)"
+ id="g7278"
+ inkscape:label="stock-channel">
+ <rect
+ transform="translate(241.0002,217)"
+ y="362"
+ x="-200"
+ height="16"
+ width="16"
+ id="rect7280"
+ style="fill:none;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path7282"
+ d="m 42.15645,583 c -0.63314,0 -1.15625,0.446 -1.15625,1 l 0,10 c 0,0.554 0.52311,1 1.15625,1 l 13.6875,0 c 0.63314,0 1.15625,-0.446 1.15625,-1 l 0,-10 c 0,-0.554 -0.52311,-1 -1.15625,-1 l -13.6875,0 z m 1.84375,2 8,0 c 0.554,0 1,0.446 1,1 l 0,6 c 0,0.554 -0.446,1 -1,1 l -8,0 c -0.554,0 -1,-0.446 -1,-1 l 0,-6 c 0,-0.554 0.446,-1 1,-1 z m 11,0 c 0.55228,0 1,0.44772 1,1 0,0.55228 -0.44772,1 -1,1 -0.55228,0 -1,-0.44772 -1,-1 0,-0.55228 0.44772,-1 1,-1 z m 0,3 c 0.55228,0 1,0.44772 1,1 0,0.55228 -0.44772,1 -1,1 -0.55228,0 -1,-0.44772 -1,-1 0,-0.55228 0.44772,-1 1,-1 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ transform="matrix(0.75,0,0,1.0000003,192.5002,217.9999)"
+ d="m -190,365.5 c 0,0.82843 -0.89543,1.5 -2,1.5 -1.10457,0 -2,-0.67157 -2,-1.5 0,-0.82843 0.89543,-1.5 2,-1.5 1.10457,0 2,0.67157 2,1.5 z"
+ sodipodi:ry="1.5"
+ sodipodi:rx="2"
+ sodipodi:cy="365.5"
+ sodipodi:cx="-192"
+ id="path7284"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ sodipodi:type="arc" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path7286"
+ d="m 45.0002,580 3,3 0,0"
+ style="fill:none;stroke:#bebebe;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" />
+ <path
+ style="fill:none;stroke:#bebebe;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
+ d="m 52.0002,580 -3,3 0,0"
+ id="path7288"
+ inkscape:connector-curvature="0" />
+ </g>
+ <rect
+ ry="0"
+ transform="translate(241.0002,217)"
+ y="370"
+ x="-96"
+ height="4"
+ width="6"
+ id="rect7290"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g7432"
+ inkscape:label="stock-channel-indexed">
+ <g
+ transform="translate(20,0)"
+ id="g7320"
+ inkscape:label="stock-channel-gray">
+ <g
+ transform="translate(100,0)"
+ id="g7322"
+ inkscape:label="stock-channel">
+ <rect
+ transform="translate(241.0002,217)"
+ y="362"
+ x="-200"
+ height="16"
+ width="16"
+ id="rect7324"
+ style="fill:none;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path7326"
+ d="m 42.15645,583 c -0.63314,0 -1.15625,0.446 -1.15625,1 l 0,10 c 0,0.554 0.52311,1 1.15625,1 l 13.6875,0 c 0.63314,0 1.15625,-0.446 1.15625,-1 l 0,-10 c 0,-0.554 -0.52311,-1 -1.15625,-1 l -13.6875,0 z m 1.84375,2 8,0 c 0.554,0 1,0.446 1,1 l 0,6 c 0,0.554 -0.446,1 -1,1 l -8,0 c -0.554,0 -1,-0.446 -1,-1 l 0,-6 c 0,-0.554 0.446,-1 1,-1 z m 11,0 c 0.55228,0 1,0.44772 1,1 0,0.55228 -0.44772,1 -1,1 -0.55228,0 -1,-0.44772 -1,-1 0,-0.55228 0.44772,-1 1,-1 z m 0,3 c 0.55228,0 1,0.44772 1,1 0,0.55228 -0.44772,1 -1,1 -0.55228,0 -1,-0.44772 -1,-1 0,-0.55228 0.44772,-1 1,-1 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ transform="matrix(0.75,0,0,1.0000003,192.5002,217.9999)"
+ d="m -190,365.5 c 0,0.82843 -0.89543,1.5 -2,1.5 -1.10457,0 -2,-0.67157 -2,-1.5 0,-0.82843 0.89543,-1.5 2,-1.5 1.10457,0 2,0.67157 2,1.5 z"
+ sodipodi:ry="1.5"
+ sodipodi:rx="2"
+ sodipodi:cy="365.5"
+ sodipodi:cx="-192"
+ id="path7328"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ sodipodi:type="arc" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path7330"
+ d="m 45.0002,580 3,3 0,0"
+ style="fill:none;stroke:#bebebe;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" />
+ <path
+ style="fill:none;stroke:#bebebe;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
+ d="m 52.0002,580 -3,3 0,0"
+ id="path7332"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <rect
+ y="587"
+ x="165.0002"
+ height="1"
+ width="0.99999839"
+ id="rect7344"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect7346"
+ width="1.0000017"
+ height="1"
+ x="166.0002"
+ y="587" />
+ <rect
+ y="587"
+ x="167.0002"
+ height="1"
+ width="1.0000017"
+ id="rect7348"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect7350"
+ width="1.0000017"
+ height="1"
+ x="168.0002"
+ y="587" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect7368"
+ width="1.0000017"
+ height="1"
+ x="169.0002"
+ y="587" />
+ <rect
+ y="587"
+ x="170.0002"
+ height="1"
+ width="1.0000017"
+ id="rect7370"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect7372"
+ width="0.99999839"
+ height="1"
+ x="165.0002"
+ y="589" />
+ <rect
+ y="589"
+ x="166.0002"
+ height="1"
+ width="1.0000017"
+ id="rect7374"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect7376"
+ width="1.0000017"
+ height="1"
+ x="167.0002"
+ y="589" />
+ <rect
+ y="589"
+ x="168.0002"
+ height="1"
+ width="1.0000017"
+ id="rect7378"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="589"
+ x="169.0002"
+ height="1"
+ width="1.0000017"
+ id="rect7380"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect7382"
+ width="1.0000017"
+ height="1"
+ x="170.0002"
+ y="589" />
+ <rect
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect7408"
+ width="1.0000017"
+ height="1"
+ x="165.0002"
+ y="590" />
+ <rect
+ y="590"
+ x="166.0002"
+ height="1"
+ width="0.99999839"
+ id="rect7410"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="590"
+ x="167.0002"
+ height="1"
+ width="1.0000017"
+ id="rect7412"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect7414"
+ width="0.99999839"
+ height="1"
+ x="168.0002"
+ y="590" />
+ <rect
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect7416"
+ width="1.0000017"
+ height="1"
+ x="169.0002"
+ y="590" />
+ <rect
+ y="590"
+ x="170.0002"
+ height="1"
+ width="0.99999839"
+ id="rect7418"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="588"
+ x="165.0002"
+ height="1"
+ width="1.0000017"
+ id="rect7420"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect7422"
+ width="0.99999839"
+ height="1"
+ x="166.0002"
+ y="588" />
+ <rect
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect7424"
+ width="1.0000017"
+ height="1"
+ x="167.0002"
+ y="588" />
+ <rect
+ y="588"
+ x="168.0002"
+ height="1"
+ width="0.99999839"
+ id="rect7426"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="588"
+ x="169.0002"
+ height="1"
+ width="1.0000017"
+ id="rect7428"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect7430"
+ width="0.99999839"
+ height="1"
+ x="170.0002"
+ y="588" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g7538"
+ inkscape:label="stock-channel-red">
+ <g
+ transform="translate(40,0)"
+ id="g7484"
+ inkscape:label="stock-channel">
+ <rect
+ transform="translate(241.0002,217)"
+ y="362"
+ x="-200"
+ height="16"
+ width="16"
+ id="rect7486"
+ style="fill:none;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path7488"
+ d="m 42.15645,583 c -0.63314,0 -1.15625,0.446 -1.15625,1 l 0,10 c 0,0.554 0.52311,1 1.15625,1 l 13.6875,0 c 0.63314,0 1.15625,-0.446 1.15625,-1 l 0,-10 c 0,-0.554 -0.52311,-1 -1.15625,-1 l -13.6875,0 z m 1.84375,2 8,0 c 0.554,0 1,0.446 1,1 l 0,6 c 0,0.554 -0.446,1 -1,1 l -8,0 c -0.554,0 -1,-0.446 -1,-1 l 0,-6 c 0,-0.554 0.446,-1 1,-1 z m 11,0 c 0.55228,0 1,0.44772 1,1 0,0.55228 -0.44772,1 -1,1 -0.55228,0 -1,-0.44772 -1,-1 0,-0.55228 0.44772,-1 1,-1 z m 0,3 c 0.55228,0 1,0.44772 1,1 0,0.55228 -0.44772,1 -1,1 -0.55228,0 -1,-0.44772 -1,-1 0,-0.55228 0.44772,-1 1,-1 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ transform="matrix(0.75,0,0,1.0000003,192.5002,217.9999)"
+ d="m -190,365.5 c 0,0.82843 -0.89543,1.5 -2,1.5 -1.10457,0 -2,-0.67157 -2,-1.5 0,-0.82843 0.89543,-1.5 2,-1.5 1.10457,0 2,0.67157 2,1.5 z"
+ sodipodi:ry="1.5"
+ sodipodi:rx="2"
+ sodipodi:cy="365.5"
+ sodipodi:cx="-192"
+ id="path7490"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ sodipodi:type="arc" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path7492"
+ d="m 45.0002,580 3,3 0,0"
+ style="fill:none;stroke:#bebebe;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" />
+ <path
+ style="fill:none;stroke:#bebebe;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
+ d="m 52.0002,580 -3,3 0,0"
+ id="path7494"
+ inkscape:connector-curvature="0" />
+ </g>
+ <rect
+ y="586"
+ x="84.000198"
+ height="6"
+ width="2"
+ id="rect7496"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="586"
+ x="87.000198"
+ height="6"
+ width="2"
+ id="rect7498"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="586"
+ x="90.000198"
+ height="6"
+ width="2"
+ id="rect7500"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g7549"
+ inkscape:label="stock-channel-green">
+ <g
+ inkscape:label="stock-channel"
+ id="g7502"
+ transform="translate(60,0)">
+ <rect
+ style="fill:none;stroke:none"
+ id="rect7504"
+ width="16"
+ height="16"
+ x="-200"
+ y="362"
+ transform="translate(241.0002,217)" />
+ <path
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ d="m 42.15645,583 c -0.63314,0 -1.15625,0.446 -1.15625,1 l 0,10 c 0,0.554 0.52311,1 1.15625,1 l 13.6875,0 c 0.63314,0 1.15625,-0.446 1.15625,-1 l 0,-10 c 0,-0.554 -0.52311,-1 -1.15625,-1 l -13.6875,0 z m 1.84375,2 8,0 c 0.554,0 1,0.446 1,1 l 0,6 c 0,0.554 -0.446,1 -1,1 l -8,0 c -0.554,0 -1,-0.446 -1,-1 l 0,-6 c 0,-0.554 0.446,-1 1,-1 z m 11,0 c 0.55228,0 1,0.44772 1,1 0,0.55228 -0.44772,1 -1,1 -0.55228,0 -1,-0.44772 -1,-1 0,-0.55228 0.44772,-1 1,-1 z m 0,3 c 0.55228,0 1,0.44772 1,1 0,0.55228 -0.44772,1 -1,1 -0.55228,0 -1,-0.44772 -1,-1 0,-0.55228 0.44772,-1 1,-1 z"
+ id="path7506"
+ inkscape:connector-curvature="0" />
+ <path
+ sodipodi:type="arc"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="path7508"
+ sodipodi:cx="-192"
+ sodipodi:cy="365.5"
+ sodipodi:rx="2"
+ sodipodi:ry="1.5"
+ d="m -190,365.5 c 0,0.82843 -0.89543,1.5 -2,1.5 -1.10457,0 -2,-0.67157 -2,-1.5 0,-0.82843 0.89543,-1.5 2,-1.5 1.10457,0 2,0.67157 2,1.5 z"
+ transform="matrix(0.75,0,0,1.0000003,192.5002,217.9999)" />
+ <path
+ style="fill:none;stroke:#bebebe;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
+ d="m 45.0002,580 3,3 0,0"
+ id="path7510"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path7512"
+ d="m 52.0002,580 -3,3 0,0"
+ style="fill:none;stroke:#bebebe;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" />
+ </g>
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect7514"
+ width="2"
+ height="6.0000043"
+ x="107.0002"
+ y="586.00043" />
+ <rect
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect7516"
+ width="2"
+ height="6.0000043"
+ x="104.0002"
+ y="586.00043" />
+ <rect
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect7518"
+ width="2"
+ height="6.0000043"
+ x="110.0002"
+ y="586.00043" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g7560"
+ inkscape:label="stock-channel-blue">
+ <g
+ transform="translate(80,0)"
+ id="g7520"
+ inkscape:label="stock-channel">
+ <rect
+ transform="translate(241.0002,217)"
+ y="362"
+ x="-200"
+ height="16"
+ width="16"
+ id="rect7522"
+ style="fill:none;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path7524"
+ d="m 42.15645,583 c -0.63314,0 -1.15625,0.446 -1.15625,1 l 0,10 c 0,0.554 0.52311,1 1.15625,1 l 13.6875,0 c 0.63314,0 1.15625,-0.446 1.15625,-1 l 0,-10 c 0,-0.554 -0.52311,-1 -1.15625,-1 l -13.6875,0 z m 1.84375,2 8,0 c 0.554,0 1,0.446 1,1 l 0,6 c 0,0.554 -0.446,1 -1,1 l -8,0 c -0.554,0 -1,-0.446 -1,-1 l 0,-6 c 0,-0.554 0.446,-1 1,-1 z m 11,0 c 0.55228,0 1,0.44772 1,1 0,0.55228 -0.44772,1 -1,1 -0.55228,0 -1,-0.44772 -1,-1 0,-0.55228 0.44772,-1 1,-1 z m 0,3 c 0.55228,0 1,0.44772 1,1 0,0.55228 -0.44772,1 -1,1 -0.55228,0 -1,-0.44772 -1,-1 0,-0.55228 0.44772,-1 1,-1 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ transform="matrix(0.75,0,0,1.0000003,192.5002,217.9999)"
+ d="m -190,365.5 c 0,0.82843 -0.89543,1.5 -2,1.5 -1.10457,0 -2,-0.67157 -2,-1.5 0,-0.82843 0.89543,-1.5 2,-1.5 1.10457,0 2,0.67157 2,1.5 z"
+ sodipodi:ry="1.5"
+ sodipodi:rx="2"
+ sodipodi:cy="365.5"
+ sodipodi:cx="-192"
+ id="path7526"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ sodipodi:type="arc" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path7528"
+ d="m 45.0002,580 3,3 0,0"
+ style="fill:none;stroke:#bebebe;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" />
+ <path
+ style="fill:none;stroke:#bebebe;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
+ d="m 52.0002,580 -3,3 0,0"
+ id="path7530"
+ inkscape:connector-curvature="0" />
+ </g>
+ <rect
+ y="586"
+ x="130.0002"
+ height="6.0000043"
+ width="2"
+ id="rect7532"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="586.00043"
+ x="124.0002"
+ height="6.0000043"
+ width="2"
+ id="rect7534"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="586"
+ x="127.0002"
+ height="6.0000043"
+ width="2"
+ id="rect7536"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g7608"
+ inkscape:label="stock-channels">
+ <g
+ transform="translate(140,0)"
+ id="g7590"
+ inkscape:label="stock-channel">
+ <rect
+ transform="translate(241.0002,217)"
+ y="362"
+ x="-200"
+ height="16"
+ width="16"
+ id="rect7592"
+ style="fill:none;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path7594"
+ d="m 42.15645,583 c -0.63314,0 -1.15625,0.446 -1.15625,1 l 0,10 c 0,0.554 0.52311,1 1.15625,1 l 13.6875,0 c 0.63314,0 1.15625,-0.446 1.15625,-1 l 0,-10 c 0,-0.554 -0.52311,-1 -1.15625,-1 l -13.6875,0 z m 1.84375,2 8,0 c 0.554,0 1,0.446 1,1 l 0,6 c 0,0.554 -0.446,1 -1,1 l -8,0 c -0.554,0 -1,-0.446 -1,-1 l 0,-6 c 0,-0.554 0.446,-1 1,-1 z m 11,0 c 0.55228,0 1,0.44772 1,1 0,0.55228 -0.44772,1 -1,1 -0.55228,0 -1,-0.44772 -1,-1 0,-0.55228 0.44772,-1 1,-1 z m 0,3 c 0.55228,0 1,0.44772 1,1 0,0.55228 -0.44772,1 -1,1 -0.55228,0 -1,-0.44772 -1,-1 0,-0.55228 0.44772,-1 1,-1 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ transform="matrix(0.75,0,0,1.0000003,192.5002,217.9999)"
+ d="m -190,365.5 c 0,0.82843 -0.89543,1.5 -2,1.5 -1.10457,0 -2,-0.67157 -2,-1.5 0,-0.82843 0.89543,-1.5 2,-1.5 1.10457,0 2,0.67157 2,1.5 z"
+ sodipodi:ry="1.5"
+ sodipodi:rx="2"
+ sodipodi:cy="365.5"
+ sodipodi:cx="-192"
+ id="path7596"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ sodipodi:type="arc" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path7598"
+ d="m 45.0002,580 3,3 0,0"
+ style="fill:none;stroke:#bebebe;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" />
+ <path
+ style="fill:none;stroke:#bebebe;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
+ d="m 52.0002,580 -3,3 0,0"
+ id="path7600"
+ inkscape:connector-curvature="0" />
+ </g>
+ <rect
+ transform="translate(241.0002,217)"
+ y="369"
+ x="-57"
+ height="6"
+ width="2"
+ id="rect7602"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="369"
+ x="-54"
+ height="6"
+ width="2"
+ id="rect7604"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="369"
+ x="-51"
+ height="6"
+ width="2"
+ id="rect7606"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g18114"
+ inkscape:label="stock-controller">
+ <g
+ transform="matrix(0.99961017,0,0,1,41.0002,599)"
+ inkscape:label="applications-engineering"
+ id="g3793"
+ style="display:inline">
+ <path
+ inkscape:connector-curvature="0"
+ id="path3908-6"
+ d="M 14.994756,0.59983185 C 14.711497,0.3597376 14.370713,0.18058703 14.02785,0.03853042 L 14.006105,2.270507 C 14.001605,2.7291761 13.554035,3 13,3 L 12,3 C 11.446025,2.9928881 10.996544,2.6906456 11.001004,2.2319765 L 11.022748,0 C 10.677203,0.13321562 10.333029,0.30360349 10.045161,0.53637778 8.6673482,1.6505005 8.6494855,3.4852564 10.005254,4.6344268 10.288513,4.8745211 10.629298,5.0536727 10.972148,5.1957409 11,5.2070547 11.00429,7 11.00429,7 c 1.490069,0.75 2.351848,1.75 3,2.75 L 14,5.2517311 c 0.345534,-0.1332193 0.666967,-0.3210668 0.954835,-0.5538409 1.377812,-1.1141229 1.39569,-2.9488892 0.03992,-4.09805835 z"
+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans"
+ sodipodi:nodetypes="sccscccssccccss" />
+ <rect
+ style="fill:none;stroke:none"
+ id="rect2999-6"
+ width="16.006239"
+ height="16"
+ x="0"
+ y="0" />
+ </g>
+ <path
+ inkscape:connector-curvature="0"
+ id="path35543-6-4-9"
+ transform="translate(241.0002,217)"
+ d="m -192,389 c -0.22065,0 -0.44081,0.0113 -0.65625,0.0312 l -0.40625,2.09375 c -0.33446,0.0733 -0.66305,0.17589 -0.96875,0.3125 l -1.53125,-1.46875 c -0.38863,0.23011 -0.72695,0.51408 -1.0625,0.8125 l 0.90625,1.90625 c -0.22242,0.24899 -0.42425,0.5225 -0.59375,0.8125 l -2.09375,-0.28125 c -0.17772,0.40877 -0.30872,0.83637 -0.40625,1.28125 l 1.84375,1 c -0.0171,0.16809 -0.0312,0.3274 -0.0312,0.5 0,0.1726 0.0143,0.33191 0.0312,0.5 l -1.84375,1 c 0.0374,0.17068 0.10823,0.3345 0.15625,0.5 l 4.4375,0 C -194.69824,397.46826 -195,396.77238 -195,396 c 0,-1.65685 1.34315,-3 3,-3 1.65685,0 3,1.34315 3,3 0,0.77238 -0.30176,1.46826 -0.78125,2 l 4.4375,0 c 0.048,-0.1655 0.11883,-0.32932 0.15625,-0.5 l -1.84375,-1 c 0.0171,-0.16809 0.0312,-0.3274 0.0312,-0.5 0,-0.1726 -0.0143,-0.33191 -0.0312,-0.5 l 1.84375,-1 c -0.0975,-0.44488 -0.22853,-0.87248 -0.40625,-1.28125 L -187.6875,393.5 c -0.1695,-0.29 -0.37133,-0.56351 -0.59375,-0.8125 l 0.90625,-1.90625 c -0.33555,-0.29842 -0.67387,-0.58239 -1.0625,-0.8125 l -1.53125,1.46875 c -0.3057,-0.13661 -0.63429,-0.23916 -0.96875,-0.3125 l -0.40625,-2.09375 C -191.55919,389.01125 -191.77935,389 -192,389 z"
+ style="color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ transform="matrix(0.75,0,0,0.99999994,193.0002,216.49999)"
+ d="m -190,396.5 c 0,0.82843 -0.89543,1.5 -2,1.5 -1.10457,0 -2,-0.67157 -2,-1.5 0,-0.82843 0.89543,-1.5 2,-1.5 1.10457,0 2,0.67157 2,1.5 z"
+ sodipodi:ry="1.5"
+ sodipodi:rx="2"
+ sodipodi:cy="396.5"
+ sodipodi:cx="-192"
+ id="path18112"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ sodipodi:type="arc" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g18335"
+ inkscape:label="stock-controller-keyboard">
+ <rect
+ y="599"
+ x="61.000198"
+ height="16"
+ width="16.000002"
+ id="rect18121"
+ style="fill:none;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect18257"
+ transform="translate(241.0002,217)"
+ d="m -178.34375,389 c -0.91813,0 -1.65625,0.73812 -1.65625,1.65625 l 0,5.6875 c 0,0.91813 0.73812,1.65625 1.65625,1.65625 l 12.6875,0 c 0.91813,0 1.65625,-0.73812 1.65625,-1.65625 l 0,-5.6875 C -164,389.73812 -164.73812,389 -165.65625,389 l -12.6875,0 z m 1,1 10.6875,0 c 0.91813,0 1.65625,0.73812 1.65625,1.65625 l 0,3.6875 c 0,0.91813 -0.73812,1.65625 -1.65625,1.65625 l -10.6875,0 C -178.26188,397 -179,396.26188 -179,395.34375 l 0,-3.6875 c 0,-0.91813 0.73812,-1.65625 1.65625,-1.65625 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ ry="0"
+ y="612"
+ x="63.000198"
+ height="1"
+ width="8"
+ id="rect18269"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="608"
+ x="63.000198"
+ height="1"
+ width="1"
+ id="rect18271"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="610"
+ x="63.000198"
+ height="1"
+ width="1"
+ id="rect18273"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="609"
+ x="64.000198"
+ height="1"
+ width="1"
+ id="rect18275"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect18279"
+ width="1"
+ height="1"
+ x="65.000198"
+ y="608" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect18281"
+ width="1"
+ height="1"
+ x="65.000198"
+ y="610" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect18283"
+ width="1"
+ height="1"
+ x="66.000198"
+ y="609" />
+ <rect
+ y="608"
+ x="67.000198"
+ height="1"
+ width="1"
+ id="rect18285"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="610"
+ x="67.000198"
+ height="1"
+ width="1"
+ id="rect18287"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="609"
+ x="68.000198"
+ height="1"
+ width="1"
+ id="rect18289"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect18291"
+ width="1"
+ height="1"
+ x="69.000198"
+ y="608" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect18293"
+ width="1"
+ height="1"
+ x="69.000198"
+ y="610" />
+ <rect
+ y="610"
+ x="74.000198"
+ height="1"
+ width="1"
+ id="rect18297"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="610"
+ x="72.000198"
+ height="1"
+ width="1"
+ id="rect18299"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="609"
+ x="73.000198"
+ height="1"
+ width="1"
+ id="rect18301"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="391"
+ x="-169"
+ height="1"
+ width="1"
+ id="rect18303"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="391"
+ x="-167"
+ height="1"
+ width="1"
+ id="rect18305"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect18309"
+ width="1"
+ height="1"
+ x="73.000198"
+ y="611" />
+ <rect
+ y="612"
+ x="72.000198"
+ height="1"
+ width="1"
+ id="rect18311"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect18313"
+ width="1"
+ height="1"
+ x="74.000198"
+ y="612" />
+ <path
+ id="path18333"
+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.02063322;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans"
+ d="m 66.71895,603 2.822415,0 0.458835,0 0,0 c 0.642743,0 2,-0.34792 2,2 l 0,1 1,0 0,-2 c 0,0 0,-2 -2,-2 -0.27051,0.008 -0.621248,-5e-4 -0.71875,0 l -1.28125,0 -2.535961,0 c -0.244995,0 -1.707107,0.23295 -0.938801,-1 l 1.071653,-2 -1.331726,7e-4 L 64.258052,601 c -0.572765,1.39643 0.243263,2 1.283471,2 0.27051,-0.008 1.079925,5e-4 1.177427,0"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccccccccccccccc" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g18396"
+ inkscape:label="stock-controller-midi">
+ <rect
+ y="599"
+ x="81.000198"
+ height="16"
+ width="16"
+ id="rect18379"
+ style="fill:none;stroke:none" />
+ <path
+ id="rect18381"
+ d="m 83.0002,601 0,12 12,0 0,-12 -4,0 0,8 -2,0 0,-8 -2,0 0,8 -2,0 0,-8 -2,0 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ inkscape:connector-curvature="0" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g6703"
+ inkscape:label="stock-controller-wheel">
+ <path
+ inkscape:connector-curvature="0"
+ id="rect5916"
+ d="m -140,382 16,0 0,16 -16,0 z"
+ style="fill:none;stroke:none"
+ transform="translate(241.0002,217)" />
+ <path
+ sodipodi:nodetypes="csccccccccccsc"
+ inkscape:connector-curvature="0"
+ id="path6687"
+ d="m 105.0002,603.21875 c -2.38792,1.5571 -4,4.45275 -4,7.78125 l 0,2 7,0 0,-3 -3,0 z m 8,0 0,6.78125 -3,0 0,3 7,0 0,-2 c 0,-3.3285 -1.61208,-6.22415 -4,-7.78125 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ rx="2"
+ ry="2"
+ y="601"
+ x="107.0002"
+ height="8"
+ width="4"
+ id="rect6693"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g8247"
+ inkscape:label="stock-cursor">
+ <rect
+ transform="translate(241.0002,217)"
+ y="382"
+ x="-120"
+ height="16"
+ width="16"
+ id="rect8243"
+ style="fill:none;stroke:none" />
+ <path
+ sodipodi:nodetypes="ccccccccccc"
+ inkscape:connector-curvature="0"
+ id="path8245"
+ d="m 125.0002,601.92307 0,9.07693 0.82307,0 1.64616,-3.15385 3.06154,5.15385 2.46923,0 -3.88462,-6 3.88462,0 0,-0.84616 -8,-5.07692 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g8332"
+ inkscape:label="stock-display-filter">
+ <rect
+ transform="translate(241.0002,217)"
+ y="382"
+ x="-100"
+ height="16"
+ width="16"
+ id="rect8270"
+ style="fill:none;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path8303"
+ transform="translate(241.0002,217)"
+ d="m -96.5,389 c -1.933,0 -3.5,1.567 -3.5,3.5 0,1.933 1.567,3.5 3.5,3.5 1.765268,0 3.228659,-1.301 3.46875,-3 0.01078,3.4e-4 0.02039,0 0.03125,0 l 2,0 c 0.01086,0 0.02047,3.4e-4 0.03125,0 0.240091,1.699 1.703482,3 3.46875,3 1.933,0 3.5,-1.567 3.5,-3.5 0,-1.933 -1.567,-3.5 -3.5,-3.5 -1.424592,0 -2.641241,0.84103 -3.1875,2.0625 C -90.789453,391.02764 -90.885941,391 -91,391 l -2,0 c -0.114059,0 -0.210547,0.0276 -0.3125,0.0625 C -93.858759,389.84103 -95.075408,389 -96.5,389 z m 0.0625,1.40625 c 1.17613,0 2.125,0.93497 2.125,2.09375 0,1.15878 -0.94887,2.09375 -2.125,2.09375 -1.17613,0 -2.125,-0.93497 -2.125,-2.09375 0,-1.15878 0.94887,-2.09375 2.125,-2.09375 z m 9,0 c 1.17613,0 2.125,0.93497 2.125,2.09375 0,1.15878 -0.94887,2.09375 -2.125,2.09375 -1.17613,0 -2.125,-0.93497 -2.125,-2.09375 0,-1.15878 0.94887,-2.09375 2.125,-2.09375 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ sodipodi:nodetypes="cscccscccscc"
+ inkscape:connector-curvature="0"
+ id="path8315"
+ d="m 147.5,600 c -0.86837,0 -1.5145,0.30761 -1.9375,0.61363 -0.423,0.30602 -0.65625,0.64773 -0.65625,0.64773 -0.0109,0.0109 -0.0213,0.0222 -0.0313,0.0341 l -3.84375,7.15905 c -0.1507,0.25054 -0.0669,0.63163 0.17161,0.78032 0.2385,0.14868 0.58202,0.034 0.70339,-0.23483 l 3.8125,-7.12496 c 0.594,-1.25004 1.7813,-0.7841 1.7813,-0.7841 0.28493,0.0434 0.57471,-0.2316 0.57471,-0.54545 0,-0.31385 -0.28978,-0.58888 -0.57471,-0.54545 z"
+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.00960875;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans" />
+ <path
+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.00960875;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans"
+ d="m 150.52437,600 c 0.85928,0 1.49864,0.30761 1.91722,0.61363 0.41857,0.30602 0.64938,0.64773 0.64938,0.64773 0.0108,0.0109 0.0211,0.0222 0.031,0.0341 l 3.80352,7.15905 c 0.14913,0.25054 0.0662,0.63163 -0.16981,0.78032 -0.236,0.14868 -0.57593,0.034 -0.69603,-0.23483 l -3.7726,-7.12496 c -0.58778,-1.25004 -1.76265,-0.7841 -1.76265,-0.7841 -0.28195,0.0434 -0.5687,-0.2316 -0.5687,-0.54545 0,-0.31385 0.28675,-0.58888 0.5687,-0.54545 z"
+ id="path8321"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cscccscccscc" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g8425"
+ inkscape:label="stock-histogram">
+ <rect
+ y="599"
+ x="161.0002"
+ height="16"
+ width="16"
+ id="rect5420-4"
+ style="fill:none;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect5422-9"
+ d="m 162.0002,611 0,2 0,1 14,0 0,-1 0,-2 -1,0 0,2 -6,0 0,-2 -1,0 0,2 -5,0 0,-2 -1,0 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect5444-3"
+ d="m 162.0002,601 0,8 14,0 0,-8 -14,0 z m 1,1 12,0 0,6 -12,0 0,-6 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ sodipodi:nodetypes="ccccccccccccccccccccccc"
+ inkscape:connector-curvature="0"
+ id="path5449-8"
+ d="m 163.0002,608 0.625,-0.53125 0.375,-0.46875 1,0 0,0 1,-4 1,0 1,2 c 0,0 0,0 1,0 l 1,1 1,1 0,0 1,-1 0,-1 0,0 0,0 0,0 1,1 1,1 0,0 1,0.40625 0,0.59375 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g8469"
+ inkscape:label="stock-linked">
+ <rect
+ transform="translate(241.0002,217)"
+ y="382"
+ x="-60"
+ height="16"
+ width="16"
+ id="rect8450"
+ style="fill:none;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect8452"
+ transform="translate(241.0002,217)"
+ d="m -54,382 c -1.108,0 -2,0.892 -2,2 l 0,6 c 0,1.108 0.892,2 2,2 l 4,0 c 1.108,0 2,-0.892 2,-2 l 0,-6 c 0,-1.108 -0.892,-2 -2,-2 l -4,0 z m 2,2 c 1.108,0 2,0.446 2,1 l 0,4 c 0,0.554 -0.892,1 -2,1 -1.108,0 -2,-0.446 -2,-1 l 0,-4 c 0,-0.554 0.892,-1 2,-1 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect8454"
+ transform="translate(241.0002,217)"
+ d="m -53,393 c -1.662,0 -3,0.892 -3,2 l 0,3 2,0 0,-2 c 0,-0.554 0.892,-1 2,-1 1.108,0 2,0.446 2,1 l 0,2 2,0 0,-3 c 0,-1.108 -1.338,-2 -3,-2 l -2,0 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ ry="0"
+ rx="3"
+ transform="translate(241.0002,217)"
+ y="389"
+ x="-53"
+ height="7"
+ width="2"
+ id="rect8465"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ ry="0"
+ rx="3"
+ transform="translate(241.0002,217)"
+ y="382"
+ x="-53"
+ height="3"
+ width="2"
+ id="rect8467"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g6797"
+ inkscape:label="stock-hchain">
+ <rect
+ style="fill:none;stroke:none"
+ id="rect6769"
+ width="16"
+ height="16"
+ x="-635"
+ y="-77.000198"
+ transform="matrix(0,-1,-1,0,0,0)" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect6775"
+ width="2"
+ height="6.0000029"
+ x="-628"
+ y="-67.000198"
+ transform="matrix(0,-1,-1,0,0,0)"
+ rx="1"
+ ry="0" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect6777"
+ width="2"
+ height="5.9999986"
+ x="-628"
+ y="-77.000198"
+ transform="matrix(0,-1,-1,0,0,0)"
+ rx="0.9375"
+ ry="0" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect6791"
+ transform="translate(241.0002,217)"
+ d="m -176,405 c -1.108,0 -2,0.892 -2,2 l 0,6 c 0,1.108 0.892,2 2,2 l 8,0 c 1.108,0 2,-0.892 2,-2 l 0,-6 c 0,-1.108 -0.892,-2 -2,-2 l -8,0 z m 1,2 6,0 c 0.554,0 1,0.446 1,1 l 0,4 c 0,0.554 -0.446,1 -1,1 l -6,0 c -0.554,0 -1,-0.446 -1,-1 l 0,-4 c 0,-0.554 0.446,-1 1,-1 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g6843"
+ inkscape:label="stock-hchain-broken">
+ <rect
+ transform="matrix(0,-1,-1,0,0,0)"
+ y="-97.000198"
+ x="-635"
+ height="16"
+ width="16"
+ id="rect6824"
+ style="fill:none;stroke:none" />
+ <rect
+ ry="0"
+ rx="1"
+ transform="matrix(0,-1,-1,0,0,0)"
+ y="-86.000198"
+ x="-628"
+ height="5.0000043"
+ width="2"
+ id="rect6826"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ ry="0"
+ rx="0.9375"
+ transform="matrix(0,-1,-1,0,0,0)"
+ y="-97.000198"
+ x="-628"
+ height="4.9999986"
+ width="2"
+ id="rect6828"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path6841"
+ d="m 85.0002,622 c -1.108,0 -2,0.892 -2,2 l 0,6 c 0,1.108 0.892,2 2,2 l 3,0 0,-2 -2,0 c -0.554,0 -1,-0.446 -1,-1 l 0,-4 c 0,-0.554 0.446,-1 1,-1 l 2,0 0,-2 -3,0 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path6830"
+ d="m 90.0002,622 0,2 2,0 c 0.554,0 1,0.446 1,1 l 0,4 c 0,0.554 -0.446,1 -1,1 l -2,0 0,2 3,0 c 1.108,0 2,-0.892 2,-2 l 0,-6 c 0,-1.108 -0.892,-2 -2,-2 l -3,0 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g7046"
+ inkscape:label="stock-paste-into">
+ <rect
+ style="fill:none;stroke:none"
+ id="rect6895"
+ width="16"
+ height="16"
+ x="101.0002"
+ y="619"
+ rx="0" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ d="m 105.0002,624 0,6 6,0 2,-2 0,-4 -8,0 z"
+ id="path6897"
+ sodipodi:nodetypes="ccccccc" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect6903"
+ width="3.9999981"
+ height="2"
+ x="107.0002"
+ y="621"
+ rx="0.99999648"
+ ry="1" />
+ <path
+ sodipodi:nodetypes="ssssssssccssssssssccs"
+ inkscape:connector-curvature="0"
+ id="rect6907"
+ d="m 103.53145,622 c -0.2938,0 -0.53125,0.23745 -0.53125,0.53125 l 0,8.9375 c 0,0.2938 0.23745,0.53125 0.53125,0.53125 l 10.9375,0 c 0.2938,0 0.53125,-0.23745 0.53125,-0.53125 l 0,-8.9375 c 0,-0.2938 -0.23825,-0.50955 -0.53125,-0.53125 l -2.46875,0 0,1 1.46875,0 c 0.2938,0 0.53125,0.23745 0.53125,0.53125 l 0,6.9375 c 0,0.2938 -0.23745,0.53125 -0.53125,0.53125 l -8.9375,0 c -0.2938,0 -0.53125,-0.23745 -0.53125,-0.53125 l 0,-6.9375 c 0,-0.2938 0.23745,-0.53125 0.53125,-0.53125 l 1.46875,0 0,-1 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ ry="0"
+ rx="0.53033006"
+ transform="translate(241.0002,217)"
+ y="402"
+ x="-140"
+ height="1"
+ width="1"
+ id="rect6913"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ ry="0"
+ rx="0.53033006"
+ transform="translate(241.0002,217)"
+ y="402"
+ x="-138"
+ height="1"
+ width="1"
+ id="rect6915"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect6917"
+ width="1"
+ height="1"
+ x="105.0002"
+ y="619"
+ rx="0.53033006"
+ ry="0" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect6919"
+ width="1"
+ height="1"
+ x="107.0002"
+ y="619"
+ rx="0.53033006"
+ ry="0" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect6921"
+ width="1"
+ height="1"
+ x="109.0002"
+ y="619"
+ rx="0.53033006"
+ ry="0" />
+ <rect
+ ry="0"
+ rx="0.53033006"
+ y="619"
+ x="111.0002"
+ height="1"
+ width="1"
+ id="rect6923"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ ry="0"
+ rx="0.53033006"
+ y="619"
+ x="113.0002"
+ height="1"
+ width="1"
+ id="rect6925"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ ry="0"
+ rx="0.53033006"
+ y="619"
+ x="115.0002"
+ height="1"
+ width="1"
+ id="rect6927"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect6929"
+ width="1"
+ height="1"
+ x="116.0002"
+ y="621"
+ rx="0.53033006"
+ ry="0" />
+ <rect
+ transform="matrix(0,1,-1,0,0,0)"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect6931"
+ width="1"
+ height="1"
+ x="633"
+ y="-102.0002"
+ rx="0.53033006"
+ ry="0" />
+ <rect
+ transform="matrix(0,1,-1,0,0,0)"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect6933"
+ width="1"
+ height="1"
+ x="631"
+ y="-102.0002"
+ rx="0.53033006"
+ ry="0" />
+ <rect
+ transform="matrix(0,1,-1,0,0,0)"
+ ry="0"
+ rx="0.53033006"
+ y="-102.0002"
+ x="629"
+ height="1"
+ width="1"
+ id="rect6935"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="matrix(0,1,-1,0,0,0)"
+ ry="0"
+ rx="0.53033006"
+ y="-102.0002"
+ x="627"
+ height="1"
+ width="1"
+ id="rect6937"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="matrix(0,1,-1,0,0,0)"
+ ry="0"
+ rx="0.53033006"
+ y="-102.0002"
+ x="625"
+ height="1"
+ width="1"
+ id="rect6939"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="matrix(0,1,-1,0,0,0)"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect6941"
+ width="1"
+ height="1"
+ x="623"
+ y="-102.0002"
+ rx="0.53033006"
+ ry="0" />
+ <rect
+ transform="matrix(0,1,-1,0,0,0)"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect6943"
+ width="1"
+ height="1"
+ x="621"
+ y="-102.0002"
+ rx="0.53033006"
+ ry="0" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect6945"
+ width="1"
+ height="1"
+ x="103.0002"
+ y="633"
+ rx="0.53033006"
+ ry="0" />
+ <rect
+ ry="0"
+ rx="0.53033006"
+ y="633"
+ x="105.0002"
+ height="1"
+ width="1"
+ id="rect6947"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ ry="0"
+ rx="0.53033006"
+ y="633"
+ x="107.0002"
+ height="1"
+ width="1"
+ id="rect6949"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ ry="0"
+ rx="0.53033006"
+ y="633"
+ x="109.0002"
+ height="1"
+ width="1"
+ id="rect6951"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect6953"
+ width="1"
+ height="1"
+ x="111.0002"
+ y="633"
+ rx="0.53033006"
+ ry="0" />
+ <rect
+ ry="0"
+ rx="0.53033006"
+ y="633"
+ x="113.0002"
+ height="1"
+ width="1"
+ id="rect6955"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect6957"
+ width="1"
+ height="1"
+ x="115.0002"
+ y="633"
+ rx="0.53033006"
+ ry="0" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect6961"
+ width="1"
+ height="1"
+ x="631"
+ y="-117.0002"
+ rx="0.53033006"
+ ry="0"
+ transform="matrix(0,1,-1,0,0,0)" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect6963"
+ width="1"
+ height="1"
+ x="629"
+ y="-117.0002"
+ rx="0.53033006"
+ ry="0"
+ transform="matrix(0,1,-1,0,0,0)" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect6965"
+ width="1"
+ height="1"
+ x="627"
+ y="-117.0002"
+ rx="0.53033006"
+ ry="0"
+ transform="matrix(0,1,-1,0,0,0)" />
+ <rect
+ ry="0"
+ rx="0.53033006"
+ y="-117.0002"
+ x="625"
+ height="1"
+ width="1"
+ id="rect6967"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ transform="matrix(0,1,-1,0,0,0)" />
+ <rect
+ ry="0"
+ rx="0.53033006"
+ y="-117.0002"
+ x="623"
+ height="1"
+ width="1"
+ id="rect6969"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ transform="matrix(0,1,-1,0,0,0)" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g7038"
+ inkscape:label="stock-paste-as-new">
+ <rect
+ rx="0"
+ y="619"
+ x="41.000198"
+ height="16"
+ width="16"
+ id="rect14038"
+ style="fill:none;stroke:none" />
+ <path
+ sodipodi:nodetypes="scsssssscss"
+ inkscape:connector-curvature="0"
+ id="path8980"
+ d="M 55.929864,624.94195 C 55.584927,625.20397 54.44597,624.00182 54.017121,624 c -0.436275,-0.002 -1.512009,1.18709 -1.866989,0.92631 -0.348942,-0.25636 0.439606,-1.65112 0.30877,-2.07106 -0.133105,-0.42722 -1.488068,-1.12712 -1.356554,-1.55485 0.129279,-0.42045 1.585869,-0.065 1.933854,-0.32272 0.35401,-0.26218 0.544657,-1.87422 0.980918,-1.87778 0.428837,-0.004 0.588191,1.60147 0.934098,1.86214 0.351892,0.26516 1.901829,-0.0466 2.039937,0.37898 0.135756,0.4183 -1.299495,1.07009 -1.433698,1.48891 -0.136528,0.42607 0.723312,1.84546 0.372407,2.11202 z"
+ inkscape:transform-center-y="-0.30404934"
+ inkscape:transform-center-x="-0.0040125858"
+ style="color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <rect
+ ry="0.53033006"
+ rx="0.53033006"
+ y="621"
+ x="45.000198"
+ height="3"
+ width="5"
+ id="rect6874"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ sodipodi:nodetypes="cccccc"
+ id="path6973"
+ d="m 44.0002,625 0,8 5,0 2,-2 0,-6 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path6977"
+ transform="translate(241.0002,217)"
+ d="m -199.46875,405 c -0.2938,0 -0.53125,0.23745 -0.53125,0.53125 l 0,11.9375 c 0,0.2938 0.23745,0.53125 0.53125,0.53125 l 11.9375,0 c 0.2938,0 0.53125,-0.23745 0.53125,-0.53125 l 0,-8.46875 -1,0 0,7.46875 c 0,0.2938 -0.23745,0.53125 -0.53125,0.53125 l -9.9375,0 C -198.76255,417 -199,416.76255 -199,416.46875 l 0,-9.9375 c 0,-0.2938 0.23745,-0.53125 0.53125,-0.53125 l 1.46875,0 0,-1 -2.46875,0 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g7167"
+ inkscape:label="stock-plugin">
+ <rect
+ ry="0"
+ rx="0.99999648"
+ transform="translate(241.0002,217)"
+ y="402"
+ x="-120"
+ height="16"
+ width="16"
+ id="rect7099"
+ style="fill:none;stroke:none" />
+ <rect
+ ry="0.59374648"
+ rx="0.59374648"
+ y="625"
+ x="127.0002"
+ height="1"
+ width="3"
+ id="rect7144"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect7146"
+ width="3"
+ height="1"
+ x="127.0002"
+ y="628"
+ rx="0.59374648"
+ ry="0.59374648" />
+ <path
+ sodipodi:nodetypes="ssccsssssscccssss"
+ inkscape:connector-curvature="0"
+ id="rect7148"
+ transform="translate(241.0002,217)"
+ d="m -117.40625,402 c -0.32894,0 -0.59375,0.26481 -0.59375,0.59375 l 0,1.40625 1,0 0,-0.40625 c 0,-0.32894 0.26481,-0.59375 0.59375,-0.59375 l 10.8125,0 c 0.32894,0 0.59375,0.26481 0.59375,0.59375 l 0,4.8125 c 0,0.32894 -0.26481,0.59375 -0.59375,0.59375 l -1.40625,0 0,1.0625 c 0,0 0,0 2.40625,0 0.32894,0 0.59375,-0.26481 0.59375,-0.59375 l 0,-6.875 C -104,402.26481 -104.26481,402 -104.59375,402 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ d="m 134.40645,635 c 0.32894,0 0.59375,-0.26481 0.59375,-0.59375 l 0,-1.40625 -1,0 0,0.40625 c 0,0.32894 -0.26481,0.59375 -0.59375,0.59375 l -10.8125,0 c -0.32894,0 -0.59375,-0.26481 -0.59375,-0.59375 l 0,-4.8125 c 0,-0.32894 0.26481,-0.59375 0.59375,-0.59375 l 1.40625,0 0,-1 c 0,0 -1,0 -2.40625,0 -0.32894,0 -0.59375,0.26481 -0.59375,0.59375 l 0,6.8125 c 0,0.32894 0.26481,0.59375 0.59375,0.59375 z"
+ id="path7156"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ssccsssssscccssss" />
+ <path
+ sodipodi:nodetypes="ssssccccs"
+ inkscape:connector-curvature="0"
+ id="rect7158"
+ transform="translate(241.0002,217)"
+ d="m -116,407 c -1.108,0 -2,0.892 -2,2 l 0,2 c 0,1.108 0.892,2 2,2 l 3,0 0,-2 0,-2 0,-2 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ d="m 133.0002,624 c 1.108,0 2,0.892 2,2 l 0,2 c 0,1.108 -0.892,2 -2,2 l -2,0 0,-2 0,-2 0,-2 2,0 z"
+ id="path7165" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g17196"
+ inkscape:label="stock-print-resolution">
+ <rect
+ ry="0"
+ rx="0.59374648"
+ transform="translate(241.0002,217)"
+ y="402"
+ x="-100"
+ height="16"
+ width="16"
+ id="rect7195"
+ style="fill:none;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ d="m 143.0002,623 c -0.5,0 -1,0.5 -1,1 l 0,4 c 0,0.5 0.5,1 1,1 l 1,0 0,-3 10,0 0,3 1,0 c 0.5,0 1,-0.5 1,-1 l 0,-4 c 0,-0.5 -0.5,-1 -1,-1 z"
+ id="path3520"
+ sodipodi:nodetypes="ccccccccccccc" />
+ <path
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc"
+ id="path4804"
+ d="m 145.0002,620 0,2 8,0 0,-2 -8,0 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ sodipodi:nodetypes="ccccccccccccccccccccccc"
+ inkscape:connector-curvature="0"
+ id="rect17148"
+ transform="translate(241.0002,217)"
+ d="m -96,410 0,7 8,0 0,-7 z m 2,2 0,-1 3,0 2,0 0,1 0,1 -1,0 0,-1 -1,0 0,3 -4,0 0,-3 z m 4,3 1,0 0,1 -1,0 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect17153"
+ transform="translate(241.0002,217)"
+ d="m -95,411 0,2 1,0 0,1 1,0 0,1 2,0 0,-1 -1,0 0,-1 -1,0 0,-1 1,0 0,1 1,0 0,-2 -4,0 z m 1,3 -1,0 0,1 1,0 0,-1 z"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="412"
+ x="-93"
+ height="1"
+ width="1"
+ id="rect17173"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect17175"
+ width="1"
+ height="1"
+ x="149.0002"
+ y="630" />
+ <rect
+ y="631"
+ x="147.0002"
+ height="1"
+ width="1"
+ id="rect17177"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect17179"
+ width="1"
+ height="1"
+ x="146.0002"
+ y="630" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="415"
+ x="-90"
+ height="1"
+ width="1"
+ id="rect17181"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="411"
+ x="-91"
+ height="1"
+ width="2"
+ id="rect17186"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="412"
+ x="-90"
+ height="1"
+ width="1"
+ id="rect17191"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g17331"
+ inkscape:label="quick-mask-off">
+ <rect
+ y="619"
+ x="161.0002"
+ height="16"
+ width="16"
+ id="rect17229"
+ style="opacity:0.3;fill:none;stroke:none" />
+ <rect
+ y="629"
+ x="164.0002"
+ height="1"
+ width="0.99999839"
+ id="rect17233"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect17235"
+ width="0.99999839"
+ height="1"
+ x="172.0002"
+ y="631" />
+ <rect
+ y="631"
+ x="170.0002"
+ height="1"
+ width="0.99999839"
+ id="rect17237"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect17239"
+ width="0.99999839"
+ height="1"
+ x="168.0002"
+ y="631" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect17243"
+ width="0.99999839"
+ height="1"
+ x="166.0002"
+ y="631" />
+ <rect
+ y="631"
+ x="164.0002"
+ height="1"
+ width="0.99999839"
+ id="rect17245"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect17247"
+ width="0.99999839"
+ height="1"
+ x="164.0002"
+ y="627" />
+ <rect
+ y="631"
+ x="174.0002"
+ height="1"
+ width="0.99999839"
+ id="rect17249"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect17251"
+ width="0.99999839"
+ height="1"
+ x="174.0002"
+ y="627" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect17253"
+ width="0.99999839"
+ height="1"
+ x="174.0002"
+ y="629" />
+ <rect
+ y="625"
+ x="174.0002"
+ height="1"
+ width="0.99999839"
+ id="rect17255"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="625"
+ x="164.0002"
+ height="1"
+ width="0.99999839"
+ id="rect17257"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect17259"
+ width="0.99999839"
+ height="1"
+ x="164.0002"
+ y="623" />
+ <rect
+ y="623"
+ x="174.0002"
+ height="1"
+ width="0.99999839"
+ id="rect17261"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect17263"
+ width="0.99999839"
+ height="1"
+ x="172.0002"
+ y="623" />
+ <rect
+ y="623"
+ x="170.0002"
+ height="1"
+ width="0.99999839"
+ id="rect17265"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="623"
+ x="168.0002"
+ height="1"
+ width="0.99999839"
+ id="rect17267"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect17269"
+ width="0.99999839"
+ height="1"
+ x="166.0002"
+ y="623" />
+ <rect
+ y="622"
+ x="163.0002"
+ height="11"
+ width="13.000002"
+ id="rect17271"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g17353"
+ inkscape:label="quick-mask-on">
+ <rect
+ style="opacity:0.3;fill:none;stroke:none"
+ id="rect17273"
+ width="16"
+ height="16"
+ x="181.0002"
+ y="619" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect17311"
+ transform="translate(241.0002,217)"
+ d="m -58,405 0,11 13,0 0,-11 -13,0 z m 1,1 1,0 0,1 -1,0 0,-1 z m 2,0 1,0 0,1 -1,0 0,-1 z m 2,0 1,0 0,1 -1,0 0,-1 z m 2,0 1,0 0,1 -1,0 0,-1 z m 2,0 1,0 0,1 -1,0 0,-1 z m 2,0 1,0 0,1 -1,0 0,-1 z m -10,2 1,0 0,1 -1,0 0,-1 z m 10,0 1,0 0,1 -1,0 0,-1 z m -10,2 1,0 0,1 -1,0 0,-1 z m 10,0 1,0 0,1 -1,0 0,-1 z m -10,2 1,0 0,1 -1,0 0,-1 z m 10,0 1,0 0,1 -1,0 0,-1 z m -10,2 1,0 0,1 -1,0 0,-1 z m 2,0 1,0 0,1 -1,0 0,-1 z m 2,0 1,0 0,1 -1,0 0,-1 z m 2,0 1,0 0,1 -1,0 0,-1 z m 2,0 1,0 0,1 -1,0 0,-1 z m 2,0 1,0 0,1 -1,0 0,-1 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g6949"
+ inkscape:label="stock-swap-colors">
+ <rect
+ ry="0.53033006"
+ rx="0"
+ transform="translate(241.0002,217)"
+ y="422"
+ x="-200"
+ height="16"
+ width="16"
+ id="rect6158"
+ style="fill:none;stroke:none" />
+ <path
+ sodipodi:nodetypes="cscccc"
+ inkscape:connector-curvature="0"
+ id="path6936"
+ d="m 45.0002,644 3.5002,-0.0221 c 1.380686,-0.009 2.5,1.11929 2.5,2.5 l -2e-4,0.5221 0,4 0,0"
+ style="color:#000000;fill:none;stroke:#bebebe;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ d="m 41.0002,644 4.00001,-4.02308 0,8 z"
+ id="path6938"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6947"
+ d="M 50.97712,655.00002 55.0002,651 l -8,0 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g7039"
+ inkscape:label="stock-template">
+ <rect
+ style="fill:none;stroke:none"
+ id="rect22281-6"
+ width="16"
+ height="16"
+ x="61.000198"
+ y="639" />
+ <g
+ transform="matrix(0,-1,1,0,-238.99979,1257.0002)"
+ style="display:inline"
+ id="g22283-4"
+ inkscape:label=" image-x-generic">
+ <path
+ sodipodi:nodetypes="cccccccccccccc"
+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Sans;-inkscape-font-specification:Sans"
+ d="m 602.0002,301.99998 0,12 12,2e-5 3,-3 0,0 0,-9.00001 z m 1,1.00001 13,10e-6 0,7 -3,0 0,3 -10,-10e-6 z"
+ id="path22285-9"
+ inkscape:connector-curvature="0" />
+ </g>
+ <rect
+ transform="translate(241.0002,217)"
+ y="426"
+ x="-176"
+ height="4"
+ width="4"
+ id="rect7033"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="432"
+ x="-176"
+ height="1"
+ width="8"
+ id="rect7035"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ transform="translate(241.0002,217)"
+ y="434"
+ x="-176"
+ height="1"
+ width="8"
+ id="rect7037"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g7113"
+ inkscape:label="stock-text-dir-ltr">
+ <rect
+ transform="translate(241.0002,217)"
+ y="422"
+ x="-160"
+ height="16"
+ width="16"
+ id="rect7066"
+ style="opacity:0.3;fill:none;stroke:none" />
+ <path
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ d="m 92.0002,651.97692 0,-2 c -2.32729,-0.007 -4.67278,-0.0265 -7,0.006 l 0,2 c 2.326506,-0.10306 4.67222,-0.0197 7,-0.006 z"
+ id="path7078"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path7080"
+ d="m 93.0002,651 -4.00001,-4.02308 0,8 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ transform="translate(241.0002,217)"
+ id="path7106"
+ d="m -150.9375,422.90625 c 0,5.11459 7.5e-4,2.60737 0.0312,5.5625 l 0,0.4375 0.46875,0 2.28125,0 c 1.68089,0.0687 1.60511,-4.12511 -0.0312,-4 -0.0117,8.8e-4 -0.0195,-10e-4 -0.0312,0 l -1.71875,0 0,-2 -1,0 z m 0.9375,2.90625 1.8125,0 0.0312,0 0.0312,0 c 0.36781,-0.0382 0.43459,2.2053 0,2.1875 l -0.0312,0 -1.84375,0 c -0.006,-0.47556 0.004,-2.04053 0,-2.1875 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ transform="translate(241.0002,217)"
+ id="path7104"
+ d="m -155.9375,423.90625 0,0.875 1.75,0 c 0.12685,0.013 0.1972,0.0616 0.25,0.125 0.0491,0.059 0.118,0.1867 0.125,0.375 5e-4,0.0143 0,0.0159 0,0.0312 l 0,0.6875 -1.84375,0 -0.0312,0 c -1.61055,-0.11692 -1.68715,2.97155 -0.0312,2.90625 l 2.3125,0 0.4375,0 0,-0.4375 0.0312,-3.15625 c 0,-0.37046 -0.10212,-0.716 -0.3125,-0.96875 -0.21038,-0.25275 -0.52914,-0.4054 -0.84375,-0.4375 l -0.0312,0 -1.8125,0 z m 0.1875,2.96875 0.0312,0 0.0312,0 1.84375,0 -0.0312,1.15625 -1.84375,0 -0.0312,0 c -0.46799,0.0185 -0.40144,-1.19655 0,-1.15625 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g7176"
+ inkscape:label="stock-text-dir-rtl">
+ <rect
+ transform="translate(241.0002,217)"
+ y="422"
+ x="-140"
+ height="16"
+ width="16"
+ id="rect7140"
+ style="opacity:0.3;fill:none;stroke:none" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path7148"
+ d="m 106.0002,651.994 0,-2 c 2.32729,-0.007 4.67278,-0.0265 7,0.006 l 0,2 c -2.32651,-0.10306 -4.67222,-0.0197 -7,-0.006 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ d="m 105.0002,651.01708 4.00001,-4.02308 0,8 z"
+ id="path7151"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc" />
+ <path
+ sodipodi:nodetypes="ccscccsscccccccc"
+ inkscape:connector-curvature="0"
+ id="path7162"
+ d="m 104.0002,641 0,3 c 0,0 0,1 1,1 1,0 3,0 3,0 l 1,-1.53711 1,1.53711 3,0 c 1,0 2,-2 0,-2 l -1,0 1,1 -3,0 -1,-1.53711 -1,1.53711 -3,0 0,-3 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ y="641"
+ x="112.0002"
+ height="1"
+ width="1"
+ id="rect7164"
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none" />
+ <rect
+ style="opacity:0.3;fill:#bebebe;fill-opacity:1;stroke:none"
+ id="rect7174"
+ width="1"
+ height="1"
+ x="110.14473"
+ y="641.04883" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g25076"
+ inkscape:label="stock-user-manual">
+ <rect
+ y="639"
+ x="121.00021"
+ height="16"
+ width="16"
+ id="rect5524"
+ style="fill:none;stroke:none" />
+ <path
+ sodipodi:nodetypes="ssscccccccs"
+ inkscape:connector-curvature="0"
+ id="path6822"
+ transform="translate(241.0002,217)"
+ d="m -116.4375,423 c -0.85692,0 -1.5625,0.70558 -1.5625,1.5625 l 0,9.84375 c 0,1.60823 1.48682,2.52825 2.34375,2.53125 l 9.65625,0.0313 0,-9.96875 -9.4375,-0.0313 c -1.95346,0.0312 -2.23576,-2.9375 0,-2.96875 l 9.4375,0 c 0,0 0.125,-1.0312 -1,-1 z"
+ style="color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:0.99999976;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path6826"
+ d="m 124.0002,644 10,0 c -1.35205,-0.53135 -1.25744,-2.43258 0,-3 l -10,0 z"
+ style="opacity:0.3;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999976;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new" />
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g39819"
+ inkscape:label="stock-wilber">
+ <g
+ inkscape:label="gimp"
+ id="g7897"
+ style="display:inline"
+ transform="translate(-122.00001,443.99848)">
+ <g
+ id="g5512"
+ inkscape:label="applications-gimp">
+ <rect
+ y="195.00299"
+ x="263.00021"
+ height="15.998485"
+ width="15.998006"
+ id="rect5139"
+ style="fill:none;stroke:none" />
+ <path
+ sodipodi:nodetypes="csccccccccccccccssssssssss"
+ inkscape:connector-curvature="0"
+ id="path7016"
+ d="m 278.7795,195.00152 c 0,0 -0.11302,4.06234 -5.84302,4.03087 -4.86485,-0.0267 -4.96814,-3.03096 -4.96814,-3.03096 0.52967,4.99998 -0.99987,6.99933 -0.99987,6.99933 0,0 -0.10876,0.71567 -2.40596,0.5937 1.21604,1.73419 5.82245,5.16101 9.53788,4.2496 -0.54351,-0.40203 -0.78896,-0.78972 -1.10142,-1.1327 -0.0827,0.0113 -0.008,0.007 -0.0937,0.008 -2.15004,0.0106 -3.96826,-1.78109 -3.96826,-1.78109 0,0 4.05095,1.92192 5.65555,-0.53119 l -0.84368,-0.90636 c 0.9112,0.0218 2.09732,0.9775 2.01952,2.27054 -0.5437,-0.61824 -0.48847,-0.55195 -0.48847,-0.55195 0,0 -0.21842,0.22117 -0.53118,0.53119 0.71709,0.36804 0.94408,0.58432 1.60026,1.02178 2.80388,-0.68342 2.91436,-6.74913 2.43049,-11.77076 z m -4.09324,4.49958 c 0.95981,0 1.74979,0.78716 1.74979,1.74983 0,0.96267 -0.78998,1.74983 -1.74979,1.74983 -0.95981,0 -1.74978,-0.78716 -1.74978,-1.74983 0,-0.96267 0.78997,-1.74983 1.74978,-1.74983 z m -4.15573,0.49995 c 0.82596,0 1.46856,0.67143 1.46856,1.49985 0,0.82844 -0.6426,1.49986 -1.46856,1.49986 -0.82597,0 -1.49982,-0.67142 -1.49982,-1.49986 0,-0.82842 0.67385,-1.49985 1.49982,-1.49985 z"
+ style="fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.67424625;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path5327-8"
+ d="M 269.05437,205.0321 z"
+ style="fill:none;stroke:#000000;stroke-width:0.99851286px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path5329-6"
+ d="M 269.08553,205.0946 z"
+ style="fill:none;stroke:#000000;stroke-width:0.99851286px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path5373"
+ d="m 270.85598,200.84636 c -0.32702,0 -0.59215,0.25801 -0.59215,0.57631 0,0.31828 0.26513,0.57629 0.59215,0.57629 0.32703,0 0.59215,-0.25801 0.59215,-0.57629 0,-0.3183 -0.26512,-0.57631 -0.59215,-0.57631 z"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+ <path
+ transform="matrix(1.0269759,0,0,1.4861317,240.36743,224.27989)"
+ d="m 34.471457,-15.5 c 0,0.276142 -0.329397,0.5 -0.735728,0.5 -0.406331,0 -0.735728,-0.223858 -0.735728,-0.5 0,-0.276142 0.329397,-0.5 0.735728,-0.5 0.406331,0 0.735728,0.223858 0.735728,0.5 z"
+ sodipodi:ry="0.5"
+ sodipodi:rx="0.73572785"
+ sodipodi:cy="-15.5"
+ sodipodi:cx="33.735729"
+ id="path5375"
+ style="fill:#bebebe;fill-opacity:1;stroke:none"
+ sodipodi:type="arc" />
+ <path
+ sodipodi:type="arc"
+ style="fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.55635607;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new"
+ id="path7023"
+ sodipodi:cx="6.0987959"
+ sodipodi:cy="27.228739"
+ sodipodi:rx="4.3310289"
+ sodipodi:ry="6.0987959"
+ d="m 10.429825,27.228739 c 0,3.368272 -1.9390679,6.098796 -4.3310291,6.098796 -2.3919612,0 -4.3310289,-2.730524 -4.3310289,-6.098796 0,-3.368272 1.9390677,-6.098796 4.3310289,-6.098796 2.3919612,0 4.3310291,2.730524 4.3310291,6.098796 z"
+ transform="matrix(0.40472113,-0.11972332,0.15769825,0.31663504,258.23773,195.12592)" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.27392486;marker:none;visibility:visible;display:inline;overflow:visible"
+ d="m 276.51358,209.00019 0.4849,-0.60519 c -0.9509,-1.22325 -2.95949,-2.43657 -2.95949,-2.43657 -0.33044,-0.2825 -0.53936,0.0546 -0.33671,0.3568 0,0 1.50633,1.89884 2.8113,2.68496 z"
+ id="path6937"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true"
+ sodipodi:nodetypes="ccssc" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.2;marker:none;visibility:visible;display:inline;overflow:visible"
+ d="m 278.99823,211 c -0.0537,-1.66895 -0.77474,-3.11447 -2.13998,-2.99213 -1.10021,0.0986 -1.23652,1.77662 0.14023,1.99223 2.10063,0.32898 1.99975,0.9999 1.99975,0.9999 z"
+ id="path7040"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true"
+ sodipodi:nodetypes="cssc" />
+ </g>
+ </g>
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g63147"
+ inkscape:label="stock-web">
+ <g
+ inkscape:label="emblem-web"
+ id="g11078"
+ style="display:inline"
+ transform="translate(-339.99998,238)">
+ <rect
+ width="16"
+ height="16"
+ x="501.00018"
+ y="401"
+ id="rect9174"
+ style="color:#bebebe;fill:none;stroke:none;stroke-width:1.78100002;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new" />
+ <path
+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.47313595;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Sans;-inkscape-font-specification:Sans"
+ d="m 509.0002,401 c -4.40471,0 -8,3.59527 -8,8 0,4.40472 3.59529,8 8,8 4.40472,0 8,-3.59528 8,-8 0,-4.40473 -3.59528,-8 -8,-8 z m 0,2.1875 c 3.22175,0 5.8125,2.59075 5.8125,5.8125 0,3.22176 -2.59075,5.8125 -5.8125,5.8125 -3.22175,0 -5.8125,-2.59074 -5.8125,-5.8125 0,-3.22175 2.59075,-5.8125 5.8125,-5.8125 z"
+ id="path9278"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="m 509.14998,403.96071 0.48646,0.19901 -0.22111,0.57489 c -0.28103,0.12998 -0.54457,0.24026 -0.84024,0.33167 l -0.199,0.30956 -0.15477,0.0885 L 508.0002,405 l 0.17689,-0.17688 0,-0.17689 -0.44222,-0.28745 0.13266,-0.13267 0.70756,-0.199 0.57489,-0.0663 z"
+ id="path11004"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="m 265.03125,187.90625 -0.0937,0.21875 c 0,0 -0.1463,0.0525 -0.1875,0.0625 -0.26454,0.24021 -0.69407,0.62255 -1.0625,1.1875 -0.0921,0.14124 -0.16475,0.27221 -0.25,0.4375 -0.0363,0.0752 -0.0924,0.14159 -0.125,0.21875 -0.0462,0.10074 -0.0832,0.20329 -0.125,0.3125 -0.0174,0.0502 -0.0154,0.10531 -0.0313,0.15625 -0.12516,0.4024 -0.19776,0.81161 -0.21875,1.25 0.0563,0.0907 0.125,0.21875 0.125,0.21875 l 0.375,0.25 0.4375,0.125 0.125,0.1875 0.28125,0.1875 0.15625,-0.0313 0.125,0.0625 0,0.0313 -0.15625,0.4375 -0.125,0.1875 0.0313,0.0625 -0.0625,0.3125 0.3125,0.65625 0.34375,0.3125 0.15625,0.1875 -0.0313,0.46875 0.0937,0.28125 -0.0937,0.4375 c 0.22103,0.15942 0.47306,0.28346 0.71875,0.40625 l -0.0313,-0.125 0.15625,-0.15625 0.0625,-0.15625 0.25,-0.0625 0.21875,-0.5 -0.0937,-0.125 0.125,-0.1875 0.28125,-0.0625 0.1875,-0.34375 -0.0625,-0.4375 0.25,-0.3125 0.0313,-0.3125 c -0.31304,-0.1581 -0.59558,-0.3373 -0.90625,-0.5 l -0.1875,-0.3125 -0.25,-0.0625 -0.1875,-0.40625 -0.375,0.0313 -0.3125,-0.25 -0.34375,0.3125 0,0.0313 c -0.10403,-0.0309 -0.25135,-0.005 -0.34375,-0.0625 l -0.0625,-0.25 0,-0.21875 -0.21875,0.0313 c 0.0202,-0.15156 0.0422,-0.31723 0.0625,-0.46875 l -0.125,0.0313 -0.15625,0.15625 -0.125,0.0313 -0.1875,-0.0937 0,-0.21875 0.0313,-0.28125 0.28125,-0.1875 0.21875,-0.0313 0.0625,-0.125 0.28125,0.0625 0.1875,0.28125 0.0313,-0.4375 0.375,-0.28125 0.15625,-0.34375 0.28125,-0.0937 0.125,-0.25 0.34375,-0.0625 0.1875,-0.25 -0.5,0 0.28125,-0.125 0.25,0 0.3125,-0.125 0.0625,-0.125 -0.125,-0.125 -0.125,-0.0313 0.0313,-0.125 -0.0937,-0.1875 -0.21875,0.0625 0.0313,-0.1875 -0.28125,-0.125 -0.1875,0.34375 0,0.15625 -0.21875,0.0937 -0.125,0.28125 -0.0313,-0.28125 -0.40625,-0.15625 -0.0313,-0.1875 0.46875,-0.25 0.21875,-0.21875 0.0313,-0.25 -0.125,-0.0625 -0.15625,0 z"
+ transform="translate(241.0002,217)"
+ id="path11002"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="m 269.75,187.25 -0.28125,0.0625 -0.28125,0.1875 0,0.125 -0.375,0.28125 0.0625,0.34375 0.25,-0.15625 0.15625,0.15625 0.15625,0.0937 0.0937,-0.28125 -0.0625,-0.15625 0.0625,-0.0937 0.25,-0.21875 0.0937,0 -0.0937,0.21875 0,0.21875 c 0.0954,-0.026 0.18365,-0.0504 0.28125,-0.0625 l -0.28125,0.1875 0,0.125 -0.3125,0.25 -0.3125,-0.0625 0,-0.1875 -0.15625,0.0937 0.0625,0.15625 -0.21875,0 -0.15625,0.21875 -0.15625,0.1875 -0.2812,0.0625 0.1875,0.15625 0.0313,0.15625 -0.21875,0 -0.25,0.15625 0,0.40625 0.125,0 0.125,0.125 0.25,-0.125 0.0937,-0.25 0.1875,-0.125 0.0625,-0.0937 0.3125,-0.0625 0.15625,0.1875 0.15625,0.0937 -0.0937,0.21875 0.1875,-0.0625 0.0625,-0.21875 -0.1875,-0.21875 0.0625,0 0.21875,0.15625 0.0625,0.25 0.15625,0.21875 0.0625,-0.3125 0.0937,-0.0625 c 0.10263,0.10657 0.19475,0.25508 0.28125,0.375 l 0.3125,0 0.21875,0.75 c -0.096,0.088 -0.18315,0.1644 -0.28125,0.25 l -0.25,0 -0.375,-0.0937 -0.15625,0 -0.15625,0.1875 -0.375,-0.40625 -0.25,-0.0625 -0.40625,0.0625 -0.5,0.1875 c -0.19803,0.2245 -0.25007,0.32933 -0.4375,0.5625 l 0.0313,0.34375 0.0937,0.0937 -0.1875,0.28125 0.1875,0.5 c 0.17652,0.19969 0.35499,0.39391 0.53125,0.59375 l 0.28125,-0.2187 0.125,0.125 0.25,-0.1875 0.0937,0.125 0.28125,0 0.1875,0.15625 -0.125,0.34375 0.21875,0.21875 -0.0313,0.375 0.15625,0.28125 -0.0937,0.25 c -0.0102,0.1729 -0.0313,0.35833 -0.0313,0.53125 0.0851,0.23428 0.13835,0.45153 0.21875,0.6875 l 0.0937,0.40625 0,0.15625 0.125,0 0.25,-0.125 0.25,0 c 0.004,-0.003 -0.004,-0.0287 0,-0.0313 l 0.4375,-0.4375 -0.0625,-0.15625 0.25,-0.25 -0.1875,-0.1875 0.25,-0.21875 0.21875,-0.125 0.0937,-0.125 -0.0625,-0.25 0,-0.65625 0.21875,-0.40625 0.1875,-0.28125 0.28125,-0.59375 0,-0.15625 c -0.11737,0.014 -0.26027,0.0223 -0.375,0.0313 l 0.25,-0.25 0.34375,-0.25 0.1875,-0.21875 0,-0.21875 c -0.0415,-0.0784 -0.0832,-0.14045 -0.125,-0.21875 l -0.15625,0.1875 -0.125,-0.15625 -0.1875,-0.125 0,-0.3125 0.21875,0.21875 0.21875,0 c 0.10875,0.0987 0.2172,0.20003 0.3125,0.3125 L 273,191.25 c -0.35553,-1.32619 -0.82728,-2.13567 -1.40625,-2.84375 -0.0104,-0.0104 -0.0208,-0.021 -0.0313,-0.0313 -0.2705,-0.26589 -0.58192,-0.48708 -0.90625,-0.6875 l -0.15625,0.15625 -0.28125,-0.28125 0.21875,0 c -0.21959,-0.12123 -0.4496,-0.22433 -0.6875,-0.3125 z"
+ transform="translate(241.0002,217)"
+ id="path8991"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <g
+ transform="translate(-241.0002,-217)"
+ style="display:inline"
+ id="g67484"
+ inkscape:label="stock-video">
+ <g
+ transform="translate(-380.96875,257)"
+ inkscape:label="emblem-videos"
+ id="g6077"
+ style="display:inline">
+ <g
+ inkscape:label="emblem-videos"
+ id="g6578">
+ <rect
+ style="color:#bebebe;fill:none;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect24874-7-8"
+ width="16"
+ height="16"
+ x="562"
+ y="381.99997" />
+ <path
+ sodipodi:nodetypes="cssccccccccccccccssccsccscccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
+ inkscape:connector-curvature="0"
+ id="rect5523"
+ transform="translate(719.96895,404)"
+ d="m -156,-22 c 0,0 0,0 0,2 l 0,12 c 0,2 -1,2 -1,2 l 1,0 c 0,0 1,0 1,-1 l 1,0 c 0,1 -1,1 -1,1 l 1,0 c 0,0 1,0 1,-1 l 6,0 c 0,1 -0.67515,1 -1,1 l 1,0 c 0,0 1,0 1,-1 l 1,0 c 0,1 -1,1 -1,1 l 1,0 c 0,0 1,0 1,-2 l 0,-12 c 0,-2 0,-2 0,-2 l -3,0 c 0,0 0,0 0,2 l 0,2 -6,0 0,-2 c 0,-2 0,-2 0,-2 z m 1,1 1,0 0,1 -1,0 z m 9,0 1,0 0,1 -1,0 z m -9,2 1,0 0,1 -1,0 z m 9,0 1,0 0,1 -1,0 z m -9,2 1,0 0,1 -1,0 z m 2,0 6,0 0,4 -6,0 z m 7,0 1,0 0,1 -1,0 z m -9,2 1,0 0,1 -1,0 z m 9,0 1,0 0,1 -1,0 z m -9,2 1,0 0,1 -1,0 z m 9,0 1,0 0,1 -1,0 z m -7,1 6,0 0,4 -6,0 z m -2,1 1,0 0,1 -1,0 z m 9,0 1,0 0,1 -1,0 z m -9,2 1,0 0,1 -1,0 z m 9,0 1,0 0,1 -1,0 z"
+ style="color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.50793636;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new" />
+ </g>
+ </g>
+ </g>
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#eeeeec;fill-opacity:1;stroke:none;font-family:Cantarell;-inkscape-font-specification:Cantarell"
+ x="-199"
+ y="-128"
+ id="text4574"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan4576"
+ x="-199"
+ y="-128">Art Libre</tspan></text>
+ <g
+ style="display:inline"
+ transform="translate(-186.9998,-1027)"
+ inkscape:label="folder"
+ id="g6356" />
+ <g
+ id="g9272-7"
+ transform="matrix(0.8746234,0,0,0.89178327,64.928987,-50.445197)"
+ style="fill:#bebebe;fill-opacity:1;stroke:none" />
+</svg>
diff --git a/rsvg/tests/fixtures/dimensions/bug823-position-sub.svg b/rsvg/tests/fixtures/dimensions/bug823-position-sub.svg
new file mode 100644
index 00000000..66b47ae3
--- /dev/null
+++ b/rsvg/tests/fixtures/dimensions/bug823-position-sub.svg
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg width="700" height="500" viewBox="0 0 185.20832 132.29167"
+ version="1.1" xmlns="http://www.w3.org/2000/svg">
+ <g style="opacity:0.86042145; fill:#ff0000;">
+ <rect x="117.58522" y="36.993668" width="52.916664" height="13.229166"
+ id="pad_width" />
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/dimensions/empty.svg b/rsvg/tests/fixtures/dimensions/empty.svg
new file mode 100644
index 00000000..01a940a2
--- /dev/null
+++ b/rsvg/tests/fixtures/dimensions/empty.svg
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg>
+</svg>
diff --git a/rsvg/tests/fixtures/dimensions/sub-rect-no-unit.svg b/rsvg/tests/fixtures/dimensions/sub-rect-no-unit.svg
new file mode 100644
index 00000000..fb8312ac
--- /dev/null
+++ b/rsvg/tests/fixtures/dimensions/sub-rect-no-unit.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://web.resource.org/cc/"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ width="123pt"
+ height="123pt"
+ id="svg1">
+ <rect id="rect-no-unit" width="44" height="45" x="46" y="47"/>
+</svg>
diff --git a/rsvg/tests/fixtures/errors/bug323-nested-use.svg b/rsvg/tests/fixtures/errors/bug323-nested-use.svg
new file mode 100644
index 00000000..075b48eb
--- /dev/null
+++ b/rsvg/tests/fixtures/errors/bug323-nested-use.svg
@@ -0,0 +1,196 @@
+<?xml version="1.0" ?>
+<svg height="600" width="600" xmlns="http://www.w3.org/2000/svg" xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <defs >
+ <g id="l0">
+ <rect width="600" height="600" fill="black"/>
+ </g>
+ <g id="l1">
+ <use xlink:href="#l0" transform="translate(0,0) scale(0.3333333333333333)"/>
+ <use xlink:href="#l0" transform="translate(200,0) scale(0.3333333333333333)"/>
+ <use xlink:href="#l0" transform="translate(0,200) scale(0.3333333333333333)"/>
+ <use xlink:href="#l0" transform="translate(200,200) scale(0.3333333333333333)"/>
+ <use xlink:href="#l0" transform="translate(400,200) scale(0.3333333333333333)"/>
+ <use xlink:href="#l0" transform="translate(0,400) scale(0.3333333333333333)"/>
+ <use xlink:href="#l0" transform="translate(200,400) scale(0.3333333333333333)"/>
+ <use xlink:href="#l0" transform="translate(400,400) scale(0.3333333333333333)"/>
+ <use xlink:href="#l0" transform="translate(500,0) rotate(45) scale(0.233)"/>
+ </g>
+ <g id="l2">
+ <use xlink:href="#l1" transform="translate(0,0) scale(0.3333333333333333)"/>
+ <use xlink:href="#l1" transform="translate(200,0) scale(0.3333333333333333)"/>
+ <use xlink:href="#l1" transform="translate(0,200) scale(0.3333333333333333)"/>
+ <use xlink:href="#l1" transform="translate(200,200) scale(0.3333333333333333)"/>
+ <use xlink:href="#l1" transform="translate(400,200) scale(0.3333333333333333)"/>
+ <use xlink:href="#l1" transform="translate(0,400) scale(0.3333333333333333)"/>
+ <use xlink:href="#l1" transform="translate(200,400) scale(0.3333333333333333)"/>
+ <use xlink:href="#l1" transform="translate(400,400) scale(0.3333333333333333)"/>
+ <use xlink:href="#l1" transform="translate(500,0) rotate(45) scale(0.233)"/>
+ </g>
+ <g id="l3">
+ <use xlink:href="#l2" transform="translate(0,0) scale(0.3333333333333333)"/>
+ <use xlink:href="#l2" transform="translate(200,0) scale(0.3333333333333333)"/>
+ <use xlink:href="#l2" transform="translate(0,200) scale(0.3333333333333333)"/>
+ <use xlink:href="#l2" transform="translate(200,200) scale(0.3333333333333333)"/>
+ <use xlink:href="#l2" transform="translate(400,200) scale(0.3333333333333333)"/>
+ <use xlink:href="#l2" transform="translate(0,400) scale(0.3333333333333333)"/>
+ <use xlink:href="#l2" transform="translate(200,400) scale(0.3333333333333333)"/>
+ <use xlink:href="#l2" transform="translate(400,400) scale(0.3333333333333333)"/>
+ <use xlink:href="#l2" transform="translate(500,0) rotate(45) scale(0.233)"/>
+ </g>
+ <g id="l4">
+ <use xlink:href="#l3" transform="translate(0,0) scale(0.3333333333333333)"/>
+ <use xlink:href="#l3" transform="translate(200,0) scale(0.3333333333333333)"/>
+ <use xlink:href="#l3" transform="translate(0,200) scale(0.3333333333333333)"/>
+ <use xlink:href="#l3" transform="translate(200,200) scale(0.3333333333333333)"/>
+ <use xlink:href="#l3" transform="translate(400,200) scale(0.3333333333333333)"/>
+ <use xlink:href="#l3" transform="translate(0,400) scale(0.3333333333333333)"/>
+ <use xlink:href="#l3" transform="translate(200,400) scale(0.3333333333333333)"/>
+ <use xlink:href="#l3" transform="translate(400,400) scale(0.3333333333333333)"/>
+ <use xlink:href="#l3" transform="translate(500,0) rotate(45) scale(0.233)"/>
+ </g>
+ <g id="l5">
+ <use xlink:href="#l4" transform="translate(0,0) scale(0.3333333333333333)"/>
+ <use xlink:href="#l4" transform="translate(200,0) scale(0.3333333333333333)"/>
+ <use xlink:href="#l4" transform="translate(0,200) scale(0.3333333333333333)"/>
+ <use xlink:href="#l4" transform="translate(200,200) scale(0.3333333333333333)"/>
+ <use xlink:href="#l4" transform="translate(400,200) scale(0.3333333333333333)"/>
+ <use xlink:href="#l4" transform="translate(0,400) scale(0.3333333333333333)"/>
+ <use xlink:href="#l4" transform="translate(200,400) scale(0.3333333333333333)"/>
+ <use xlink:href="#l4" transform="translate(400,400) scale(0.3333333333333333)"/>
+ <use xlink:href="#l4" transform="translate(500,0) rotate(45) scale(0.233)"/>
+ </g>
+ <g id="l6">
+ <use xlink:href="#l5" transform="translate(0,0) scale(0.3333333333333333)"/>
+ <use xlink:href="#l5" transform="translate(200,0) scale(0.3333333333333333)"/>
+ <use xlink:href="#l5" transform="translate(0,200) scale(0.3333333333333333)"/>
+ <use xlink:href="#l5" transform="translate(200,200) scale(0.3333333333333333)"/>
+ <use xlink:href="#l5" transform="translate(400,200) scale(0.3333333333333333)"/>
+ <use xlink:href="#l5" transform="translate(0,400) scale(0.3333333333333333)"/>
+ <use xlink:href="#l5" transform="translate(200,400) scale(0.3333333333333333)"/>
+ <use xlink:href="#l5" transform="translate(400,400) scale(0.3333333333333333)"/>
+ <use xlink:href="#l5" transform="translate(500,0) rotate(45) scale(0.233)"/>
+ </g>
+ <g id="l7">
+ <use xlink:href="#l6" transform="translate(0,0) scale(0.3333333333333333)"/>
+ <use xlink:href="#l6" transform="translate(200,0) scale(0.3333333333333333)"/>
+ <use xlink:href="#l6" transform="translate(0,200) scale(0.3333333333333333)"/>
+ <use xlink:href="#l6" transform="translate(200,200) scale(0.3333333333333333)"/>
+ <use xlink:href="#l6" transform="translate(400,200) scale(0.3333333333333333)"/>
+ <use xlink:href="#l6" transform="translate(0,400) scale(0.3333333333333333)"/>
+ <use xlink:href="#l6" transform="translate(200,400) scale(0.3333333333333333)"/>
+ <use xlink:href="#l6" transform="translate(400,400) scale(0.3333333333333333)"/>
+ <use xlink:href="#l6" transform="translate(500,0) rotate(45) scale(0.233)"/>
+ </g>
+ <g id="l8">
+ <use xlink:href="#l7" transform="translate(0,0) scale(0.3333333333333333)"/>
+ <use xlink:href="#l7" transform="translate(200,0) scale(0.3333333333333333)"/>
+ <use xlink:href="#l7" transform="translate(0,200) scale(0.3333333333333333)"/>
+ <use xlink:href="#l7" transform="translate(200,200) scale(0.3333333333333333)"/>
+ <use xlink:href="#l7" transform="translate(400,200) scale(0.3333333333333333)"/>
+ <use xlink:href="#l7" transform="translate(0,400) scale(0.3333333333333333)"/>
+ <use xlink:href="#l7" transform="translate(200,400) scale(0.3333333333333333)"/>
+ <use xlink:href="#l7" transform="translate(400,400) scale(0.3333333333333333)"/>
+ <use xlink:href="#l7" transform="translate(500,0) rotate(45) scale(0.233)"/>
+ </g>
+ <g id="l9">
+ <use xlink:href="#l8" transform="translate(0,0) scale(0.3333333333333333)"/>
+ <use xlink:href="#l8" transform="translate(200,0) scale(0.3333333333333333)"/>
+ <use xlink:href="#l8" transform="translate(0,200) scale(0.3333333333333333)"/>
+ <use xlink:href="#l8" transform="translate(200,200) scale(0.3333333333333333)"/>
+ <use xlink:href="#l8" transform="translate(400,200) scale(0.3333333333333333)"/>
+ <use xlink:href="#l8" transform="translate(0,400) scale(0.3333333333333333)"/>
+ <use xlink:href="#l8" transform="translate(200,400) scale(0.3333333333333333)"/>
+ <use xlink:href="#l8" transform="translate(400,400) scale(0.3333333333333333)"/>
+ <use xlink:href="#l8" transform="translate(500,0) rotate(45) scale(0.233)"/>
+ </g>
+ <g id="l10">
+ <use xlink:href="#l9" transform="translate(0,0) scale(0.3333333333333333)"/>
+ <use xlink:href="#l9" transform="translate(200,0) scale(0.3333333333333333)"/>
+ <use xlink:href="#l9" transform="translate(0,200) scale(0.3333333333333333)"/>
+ <use xlink:href="#l9" transform="translate(200,200) scale(0.3333333333333333)"/>
+ <use xlink:href="#l9" transform="translate(400,200) scale(0.3333333333333333)"/>
+ <use xlink:href="#l9" transform="translate(0,400) scale(0.3333333333333333)"/>
+ <use xlink:href="#l9" transform="translate(200,400) scale(0.3333333333333333)"/>
+ <use xlink:href="#l9" transform="translate(400,400) scale(0.3333333333333333)"/>
+ <use xlink:href="#l9" transform="translate(500,0) rotate(45) scale(0.233)"/>
+ </g>
+ <g id="l11">
+ <use xlink:href="#l10" transform="translate(0,0) scale(0.3333333333333333)"/>
+ <use xlink:href="#l10" transform="translate(200,0) scale(0.3333333333333333)"/>
+ <use xlink:href="#l10" transform="translate(0,200) scale(0.3333333333333333)"/>
+ <use xlink:href="#l10" transform="translate(200,200) scale(0.3333333333333333)"/>
+ <use xlink:href="#l10" transform="translate(400,200) scale(0.3333333333333333)"/>
+ <use xlink:href="#l10" transform="translate(0,400) scale(0.3333333333333333)"/>
+ <use xlink:href="#l10" transform="translate(200,400) scale(0.3333333333333333)"/>
+ <use xlink:href="#l10" transform="translate(400,400) scale(0.3333333333333333)"/>
+ <use xlink:href="#l10" transform="translate(500,0) rotate(45) scale(0.233)"/>
+ </g>
+ <g id="l12">
+ <use xlink:href="#l11" transform="translate(0,0) scale(0.3333333333333333)"/>
+ <use xlink:href="#l11" transform="translate(200,0) scale(0.3333333333333333)"/>
+ <use xlink:href="#l11" transform="translate(0,200) scale(0.3333333333333333)"/>
+ <use xlink:href="#l11" transform="translate(200,200) scale(0.3333333333333333)"/>
+ <use xlink:href="#l11" transform="translate(400,200) scale(0.3333333333333333)"/>
+ <use xlink:href="#l11" transform="translate(0,400) scale(0.3333333333333333)"/>
+ <use xlink:href="#l11" transform="translate(200,400) scale(0.3333333333333333)"/>
+ <use xlink:href="#l11" transform="translate(400,400) scale(0.3333333333333333)"/>
+ <use xlink:href="#l11" transform="translate(500,0) rotate(45) scale(0.233)"/>
+ </g>
+ <g id="l13">
+ <use xlink:href="#l12" transform="translate(0,0) scale(0.3333333333333333)"/>
+ <use xlink:href="#l12" transform="translate(200,0) scale(0.3333333333333333)"/>
+ <use xlink:href="#l12" transform="translate(0,200) scale(0.3333333333333333)"/>
+ <use xlink:href="#l12" transform="translate(200,200) scale(0.3333333333333333)"/>
+ <use xlink:href="#l12" transform="translate(400,200) scale(0.3333333333333333)"/>
+ <use xlink:href="#l12" transform="translate(0,400) scale(0.3333333333333333)"/>
+ <use xlink:href="#l12" transform="translate(200,400) scale(0.3333333333333333)"/>
+ <use xlink:href="#l12" transform="translate(400,400) scale(0.3333333333333333)"/>
+ <use xlink:href="#l12" transform="translate(500,0) rotate(45) scale(0.233)"/>
+ </g>
+ <g id="l14">
+ <use xlink:href="#l13" transform="translate(0,0) scale(0.3333333333333333)"/>
+ <use xlink:href="#l13" transform="translate(200,0) scale(0.3333333333333333)"/>
+ <use xlink:href="#l13" transform="translate(0,200) scale(0.3333333333333333)"/>
+ <use xlink:href="#l13" transform="translate(200,200) scale(0.3333333333333333)"/>
+ <use xlink:href="#l13" transform="translate(400,200) scale(0.3333333333333333)"/>
+ <use xlink:href="#l13" transform="translate(0,400) scale(0.3333333333333333)"/>
+ <use xlink:href="#l13" transform="translate(200,400) scale(0.3333333333333333)"/>
+ <use xlink:href="#l13" transform="translate(400,400) scale(0.3333333333333333)"/>
+ <use xlink:href="#l13" transform="translate(500,0) rotate(45) scale(0.233)"/>
+ </g>
+ <g id="l15">
+ <use xlink:href="#l14" transform="translate(0,0) scale(0.3333333333333333)"/>
+ <use xlink:href="#l14" transform="translate(200,0) scale(0.3333333333333333)"/>
+ <use xlink:href="#l14" transform="translate(0,200) scale(0.3333333333333333)"/>
+ <use xlink:href="#l14" transform="translate(200,200) scale(0.3333333333333333)"/>
+ <use xlink:href="#l14" transform="translate(400,200) scale(0.3333333333333333)"/>
+ <use xlink:href="#l14" transform="translate(0,400) scale(0.3333333333333333)"/>
+ <use xlink:href="#l14" transform="translate(200,400) scale(0.3333333333333333)"/>
+ <use xlink:href="#l14" transform="translate(400,400) scale(0.3333333333333333)"/>
+ <use xlink:href="#l14" transform="translate(500,0) rotate(45) scale(0.233)"/>
+ </g>
+ <g id="l16">
+ <use xlink:href="#l15" transform="translate(0,0) scale(0.3333333333333333)"/>
+ <use xlink:href="#l15" transform="translate(200,0) scale(0.3333333333333333)"/>
+ <use xlink:href="#l15" transform="translate(0,200) scale(0.3333333333333333)"/>
+ <use xlink:href="#l15" transform="translate(200,200) scale(0.3333333333333333)"/>
+ <use xlink:href="#l15" transform="translate(400,200) scale(0.3333333333333333)"/>
+ <use xlink:href="#l15" transform="translate(0,400) scale(0.3333333333333333)"/>
+ <use xlink:href="#l15" transform="translate(200,400) scale(0.3333333333333333)"/>
+ <use xlink:href="#l15" transform="translate(400,400) scale(0.3333333333333333)"/>
+ <use xlink:href="#l15" transform="translate(500,0) rotate(45) scale(0.233)"/>
+ </g>
+ <g id="l17">
+ <use xlink:href="#l16" transform="translate(0,0) scale(0.3333333333333333)"/>
+ <use xlink:href="#l16" transform="translate(200,0) scale(0.3333333333333333)"/>
+ <use xlink:href="#l16" transform="translate(0,200) scale(0.3333333333333333)"/>
+ <use xlink:href="#l16" transform="translate(200,200) scale(0.3333333333333333)"/>
+ <use xlink:href="#l16" transform="translate(400,200) scale(0.3333333333333333)"/>
+ <use xlink:href="#l16" transform="translate(0,400) scale(0.3333333333333333)"/>
+ <use xlink:href="#l16" transform="translate(200,400) scale(0.3333333333333333)"/>
+ <use xlink:href="#l16" transform="translate(400,400) scale(0.3333333333333333)"/>
+ <use xlink:href="#l16" transform="translate(500,0) rotate(45) scale(0.233)"/>
+ </g>
+ </defs>
+ <use xlink:href="#l17" transform="scale(1)"/>
+</svg>
diff --git a/rsvg/tests/fixtures/errors/bug515-pattern-billion-laughs.svg b/rsvg/tests/fixtures/errors/bug515-pattern-billion-laughs.svg
new file mode 100644
index 00000000..1cb6cbe8
--- /dev/null
+++ b/rsvg/tests/fixtures/errors/bug515-pattern-billion-laughs.svg
@@ -0,0 +1,130 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg width="40cm" height="20cm" viewBox="0 0 800 400" version="1.1"
+ xmlns="http://www.w3.org/2000/svg">
+ <defs>
+ <pattern id="z" x="0" y="0" width="20" height="20" patternUnits="userSpaceOnUse" patternTransform="scale(10,10)">
+ <rect x="0" y="0" width="20" height="20" fill="url(#i)" stroke="yellow"/>
+ </pattern>
+
+ <pattern id="i" x="0" y="0" width="20" height="20" patternUnits="userSpaceOnUse" patternTransform="scale(0.5,0.5)">
+ <rect x="0" y="0" width="20" height="20" fill="url(#h)" stroke="green" />
+ <rect x="1" y="1" width="20" height="20" fill="url(#h)" stroke="brown" />
+ <rect x="2" y="2" width="20" height="20" fill="url(#h)" stroke="pink" />
+ <rect x="3" y="3" width="20" height="20" fill="url(#h)" stroke="grey" />
+ <rect x="4" y="3" width="20" height="20" fill="url(#h)" stroke="cyan" />
+ <rect x="5" y="3" width="20" height="20" fill="url(#h)" stroke="green" />
+ <rect x="6" y="3" width="20" height="20" fill="url(#h)" stroke="brown" />
+ <rect x="7" y="3" width="20" height="20" fill="url(#h)" stroke="pink" />
+ <rect x="8" y="3" width="20" height="20" fill="url(#h)" stroke="grey" />
+ <rect x="9" y="3" width="20" height="20" fill="url(#h)" stroke="cyan" />
+ </pattern>
+
+ <pattern id="h" x="0" y="0" width="20" height="20" patternUnits="userSpaceOnUse" patternTransform="scale(0.5,0.5)">
+ <rect x="0" y="0" width="20" height="20" fill="url(#g)" stroke="green" />
+ <rect x="1" y="1" width="20" height="20" fill="url(#g)" stroke="brown" />
+ <rect x="2" y="2" width="20" height="20" fill="url(#g)" stroke="pink" />
+ <rect x="3" y="3" width="20" height="20" fill="url(#g)" stroke="grey" />
+ <rect x="4" y="3" width="20" height="20" fill="url(#g)" stroke="cyan" />
+ <rect x="5" y="3" width="20" height="20" fill="url(#g)" stroke="green" />
+ <rect x="6" y="3" width="20" height="20" fill="url(#g)" stroke="brown" />
+ <rect x="7" y="3" width="20" height="20" fill="url(#g)" stroke="pink" />
+ <rect x="8" y="3" width="20" height="20" fill="url(#g)" stroke="grey" />
+ <rect x="9" y="3" width="20" height="20" fill="url(#g)" stroke="cyan" />
+ </pattern>
+
+ <pattern id="g" x="0" y="0" width="20" height="20" patternUnits="userSpaceOnUse" patternTransform="scale(0.5,0.5)">
+ <rect x="0" y="0" width="20" height="20" fill="url(#f)" stroke="green" />
+ <rect x="1" y="1" width="20" height="20" fill="url(#f)" stroke="brown" />
+ <rect x="2" y="2" width="20" height="20" fill="url(#f)" stroke="pink" />
+ <rect x="3" y="3" width="20" height="20" fill="url(#f)" stroke="grey" />
+ <rect x="4" y="3" width="20" height="20" fill="url(#f)" stroke="cyan" />
+ <rect x="5" y="3" width="20" height="20" fill="url(#f)" stroke="green" />
+ <rect x="6" y="3" width="20" height="20" fill="url(#f)" stroke="brown" />
+ <rect x="7" y="3" width="20" height="20" fill="url(#f)" stroke="pink" />
+ <rect x="8" y="3" width="20" height="20" fill="url(#f)" stroke="grey" />
+ <rect x="9" y="3" width="20" height="20" fill="url(#f)" stroke="cyan" />
+ </pattern>
+
+ <pattern id="f" x="0" y="0" width="20" height="20" patternUnits="userSpaceOnUse" patternTransform="scale(0.5,0.5)">
+ <rect x="0" y="0" width="20" height="20" fill="url(#e)" stroke="green" />
+ <rect x="1" y="1" width="20" height="20" fill="url(#e)" stroke="brown" />
+ <rect x="2" y="2" width="20" height="20" fill="url(#e)" stroke="pink" />
+ <rect x="3" y="3" width="20" height="20" fill="url(#e)" stroke="grey" />
+ <rect x="4" y="3" width="20" height="20" fill="url(#e)" stroke="cyan" />
+ <rect x="5" y="3" width="20" height="20" fill="url(#e)" stroke="green" />
+ <rect x="6" y="3" width="20" height="20" fill="url(#e)" stroke="brown" />
+ <rect x="7" y="3" width="20" height="20" fill="url(#e)" stroke="pink" />
+ <rect x="8" y="3" width="20" height="20" fill="url(#e)" stroke="grey" />
+ <rect x="9" y="3" width="20" height="20" fill="url(#e)" stroke="cyan" />
+ </pattern>
+
+ <pattern id="e" x="0" y="0" width="20" height="20" patternUnits="userSpaceOnUse" patternTransform="scale(0.5,0.5)">
+ <rect x="0" y="0" width="20" height="20" fill="url(#d)" stroke="green" />
+ <rect x="1" y="1" width="20" height="20" fill="url(#d)" stroke="brown" />
+ <rect x="2" y="2" width="20" height="20" fill="url(#d)" stroke="pink" />
+ <rect x="3" y="3" width="20" height="20" fill="url(#d)" stroke="grey" />
+ <rect x="4" y="3" width="20" height="20" fill="url(#d)" stroke="cyan" />
+ <rect x="5" y="3" width="20" height="20" fill="url(#d)" stroke="green" />
+ <rect x="6" y="3" width="20" height="20" fill="url(#d)" stroke="brown" />
+ <rect x="7" y="3" width="20" height="20" fill="url(#d)" stroke="pink" />
+ <rect x="8" y="3" width="20" height="20" fill="url(#d)" stroke="grey" />
+ <rect x="9" y="3" width="20" height="20" fill="url(#d)" stroke="cyan" />
+ </pattern>
+
+ <pattern id="d" x="0" y="0" width="20" height="20" patternUnits="userSpaceOnUse" patternTransform="scale(0.5,0.5)">
+ <rect x="0" y="0" width="20" height="20" fill="url(#c)" stroke="green" />
+ <rect x="1" y="1" width="20" height="20" fill="url(#c)" stroke="brown" />
+ <rect x="2" y="2" width="20" height="20" fill="url(#c)" stroke="pink" />
+ <rect x="3" y="3" width="20" height="20" fill="url(#c)" stroke="grey" />
+ <rect x="4" y="3" width="20" height="20" fill="url(#c)" stroke="cyan" />
+ <rect x="5" y="3" width="20" height="20" fill="url(#c)" stroke="green" />
+ <rect x="6" y="3" width="20" height="20" fill="url(#c)" stroke="brown" />
+ <rect x="7" y="3" width="20" height="20" fill="url(#c)" stroke="pink" />
+ <rect x="8" y="3" width="20" height="20" fill="url(#c)" stroke="grey" />
+ <rect x="9" y="3" width="20" height="20" fill="url(#c)" stroke="cyan" />
+ </pattern>
+ <pattern id="c" x="0" y="0" width="20" height="20" patternUnits="userSpaceOnUse" patternTransform="scale(0.5,0.5)">
+ <rect x="0" y="0" width="20" height="20" fill="url(#b)" stroke="green" />
+ <rect x="1" y="1" width="20" height="20" fill="url(#b)" stroke="brown" />
+ <rect x="2" y="2" width="20" height="20" fill="url(#b)" stroke="pink" />
+ <rect x="3" y="3" width="20" height="20" fill="url(#b)" stroke="grey" />
+ <rect x="4" y="3" width="20" height="20" fill="url(#b)" stroke="cyan" />
+ <rect x="5" y="3" width="20" height="20" fill="url(#b)" stroke="green" />
+ <rect x="6" y="3" width="20" height="20" fill="url(#b)" stroke="brown" />
+ <rect x="7" y="3" width="20" height="20" fill="url(#b)" stroke="pink" />
+ <rect x="8" y="3" width="20" height="20" fill="url(#b)" stroke="grey" />
+ <rect x="9" y="3" width="20" height="20" fill="url(#b)" stroke="cyan" />
+ </pattern>
+ <pattern id="b" x="0" y="0" width="20" height="20" patternUnits="userSpaceOnUse" patternTransform="scale(0.5,0.5)">
+ <rect x="0" y="0" width="20" height="20" fill="url(#a)" stroke="green" />
+ <rect x="1" y="1" width="20" height="20" fill="url(#a)" stroke="brown" />
+ <rect x="2" y="2" width="20" height="20" fill="url(#a)" stroke="pink" />
+ <rect x="3" y="3" width="20" height="20" fill="url(#a)" stroke="grey" />
+ <rect x="4" y="3" width="20" height="20" fill="url(#a)" stroke="cyan" />
+ <rect x="5" y="3" width="20" height="20" fill="url(#a)" stroke="green" />
+ <rect x="6" y="3" width="20" height="20" fill="url(#a)" stroke="brown" />
+ <rect x="7" y="3" width="20" height="20" fill="url(#a)" stroke="pink" />
+ <rect x="8" y="3" width="20" height="20" fill="url(#a)" stroke="grey" />
+ <rect x="9" y="3" width="20" height="20" fill="url(#a)" stroke="cyan" />
+
+ </pattern>
+ <pattern id="a" x="0" y="0" width="20" height="20" patternUnits="userSpaceOnUse" patternTransform="scale(0.5,0.5)">
+ <rect x="0" y="0" width="20" height="20" fill="none" stroke="green" />
+ <rect x="1" y="1" width="20" height="20" fill="none" stroke="brown" />
+ <rect x="2" y="2" width="20" height="20" fill="none" stroke="pink" />
+ <rect x="3" y="3" width="20" height="20" fill="none" stroke="grey" />
+ <rect x="4" y="3" width="20" height="20" fill="none" stroke="cyan" />
+ <rect x="5" y="3" width="20" height="20" fill="none" stroke="green" />
+ <rect x="6" y="3" width="20" height="20" fill="none" stroke="brown" />
+ <rect x="7" y="3" width="20" height="20" fill="none" stroke="pink" />
+ <rect x="8" y="3" width="20" height="20" fill="none" stroke="grey" />
+ <rect x="9" y="3" width="20" height="20" fill="none" stroke="cyan" />
+ </pattern>
+ </defs>
+
+ <ellipse fill="url(#z)" stroke="black" stroke-width="5"
+ cx="400" cy="200" rx="350" ry="150" />
+
+</svg> \ No newline at end of file
diff --git a/rsvg/tests/fixtures/errors/bug515-too-many-elements.svgz b/rsvg/tests/fixtures/errors/bug515-too-many-elements.svgz
new file mode 100644
index 00000000..a7f7cf67
--- /dev/null
+++ b/rsvg/tests/fixtures/errors/bug515-too-many-elements.svgz
Binary files differ
diff --git a/rsvg/tests/fixtures/geometries/README.md b/rsvg/tests/fixtures/geometries/README.md
new file mode 100644
index 00000000..16d1a648
--- /dev/null
+++ b/rsvg/tests/fixtures/geometries/README.md
@@ -0,0 +1,7 @@
+The files in this directory come from the [Horizon EDA][horizon]
+project, an electronics design tool. Please see the comments in [the
+relevant tests][tests] for an explanation of how these files are
+used.
+
+[horizon]: https://github.com/horizon-eda/horizon/
+[tests]: ../../tests/src/geometries.rs
diff --git a/rsvg/tests/fixtures/geometries/dual.svg b/rsvg/tests/fixtures/geometries/dual.svg
new file mode 100644
index 00000000..eddab1d9
--- /dev/null
+++ b/rsvg/tests/fixtures/geometries/dual.svg
@@ -0,0 +1,794 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ width="700"
+ height="600"
+ viewBox="0 0 185.20832 158.75001"
+ version="1.1"
+ id="svg8"
+ inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20, custom)"
+ sodipodi:docname="dual.svg"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <defs
+ id="defs2">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker1481"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path1479"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker1475"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow2Lend"
+ inkscape:collect="always">
+ <path
+ inkscape:connector-curvature="0"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ id="path1473" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker1469"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow2Lend">
+ <path
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ id="path1467"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker1374"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ inkscape:connector-curvature="0"
+ id="path1372"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker1362"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow2Lend">
+ <path
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ id="path1360"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker1226"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow2Lend">
+ <path
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ id="path1224"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker1206"
+ style="overflow:visible"
+ inkscape:isstock="true"
+ inkscape:collect="always">
+ <path
+ id="path1204"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker6297"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path6295"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker5953"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow2Lend">
+ <path
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ id="path5951"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker5743"
+ style="overflow:visible"
+ inkscape:isstock="true"
+ inkscape:collect="always">
+ <path
+ id="path5741"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker5082"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow2Lend"
+ inkscape:collect="always">
+ <path
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ id="path5080"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Mend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2Mend"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4663"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="scale(-0.6)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Send"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2Send"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4669"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-0.3,0,0,-0.3,0.69,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2Lend"
+ style="overflow:visible"
+ inkscape:isstock="true"
+ inkscape:collect="always">
+ <path
+ id="path4657"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker5743-3"
+ style="overflow:visible"
+ inkscape:isstock="true"
+ inkscape:collect="always">
+ <path
+ inkscape:connector-curvature="0"
+ id="path5741-6"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker5953-7"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow2Lend"
+ inkscape:collect="always">
+ <path
+ inkscape:connector-curvature="0"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ id="path5951-5" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker4306"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow2Lend">
+ <path
+ inkscape:connector-curvature="0"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ id="path4304" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker4310"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow2Lend">
+ <path
+ inkscape:connector-curvature="0"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ id="path4308" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker1374-3"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ inkscape:connector-curvature="0"
+ id="path1372-6"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker1220"
+ style="overflow:visible"
+ inkscape:isstock="true"
+ inkscape:collect="always">
+ <path
+ inkscape:connector-curvature="0"
+ id="path1218"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="33"
+ inkscape:cy="349.5"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ units="px"
+ showguides="true"
+ inkscape:guide-bbox="true"
+ inkscape:window-width="1370"
+ inkscape:window-height="1039"
+ inkscape:window-x="0"
+ inkscape:window-y="39"
+ inkscape:window-maximized="0"
+ inkscape:snap-page="true"
+ inkscape:object-paths="true"
+ inkscape:pagecheckerboard="0" />
+ <metadata
+ id="metadata5">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-138.24997)"
+ style="display:inline">
+ <circle
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="path4501"
+ cx="-232.62486"
+ cy="38.875626"
+ r="1.3223464"
+ transform="rotate(-90)" />
+ <circle
+ r="1.3223464"
+ cy="38.875626"
+ cx="-226.50665"
+ id="circle4507"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="rotate(-90)" />
+ <circle
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="circle4509"
+ cx="-220.38846"
+ cy="38.875626"
+ r="1.3223464"
+ transform="rotate(-90)" />
+ <circle
+ r="1.3223464"
+ cy="96.591064"
+ cx="-232.62486"
+ id="circle4519"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="rotate(-90)" />
+ <circle
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="circle4521"
+ cx="-226.50665"
+ cy="96.591064"
+ r="1.3223464"
+ transform="rotate(-90)" />
+ <circle
+ r="1.3223464"
+ cy="96.591064"
+ cx="-220.38846"
+ id="circle4523"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="rotate(-90)" />
+ <path
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="m 67.733337,222.04622 v 8.92086"
+ id="path4555"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path4557"
+ d="m 72.193767,226.50665 h -8.92086"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <g
+ id="g5689">
+ <path
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="m 38.875618,260.08007 v 5.61357"
+ id="path4579"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path4581"
+ d="M 41.682402,262.88685 H 36.068834"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ </g>
+ <path
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="M 38.875618,265.69364 V 287.6586"
+ id="path4628"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="M 67.733338,230.96708 V 287.6586"
+ id="path4630"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-end:url(#Arrow2Lend);color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="m 24.529366,282.73914 h 13.6107"
+ id="path4634"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path5078"
+ d="M 116.52409,282.7205 H 68.590763"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-end:url(#marker5082);color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ sodipodi:nodetypes="cc" />
+ <g
+ id="g5695"
+ transform="translate(57.715436)">
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path5691"
+ d="m 38.875618,260.08007 v 5.61357"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <path
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="M 41.682402,262.88685 H 36.068834"
+ id="path5693"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ </g>
+ <g
+ transform="translate(57.715436,-18.190093)"
+ id="g5701">
+ <path
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="m 38.875618,260.08007 v 5.61357"
+ id="path5697"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path5699"
+ d="M 41.682402,262.88685 H 36.068834"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ </g>
+ <g
+ id="g6217">
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path5705"
+ d="m 99.39784,244.69676 h 18.18738"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <path
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="M 99.397838,262.88685 H 117.58522"
+ id="path5725"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ </g>
+ <path
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-end:url(#marker5743);color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="m 112.06151,248.4086 v 13.6107"
+ id="path5739"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path5949"
+ d="m 112.06151,259.06745 v -13.6107"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-end:url(#marker5953);color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <path
+ id="rect6235"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:5;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="m 29.482903,185.23166 h 18.785421 v 9.78958 H 29.482903 Z m 13.96789,9.78958 4.704622,-4.89479 -4.704622,-4.89479"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccccc" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#rect6235"
+ id="use6257"
+ transform="translate(0,18.19011)"
+ width="100%"
+ height="100%" />
+ <use
+ height="100%"
+ width="100%"
+ transform="matrix(-1,0,0,1,135.46666,18.19011)"
+ id="use6259"
+ xlink:href="#rect6235"
+ y="0"
+ x="0" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#rect6235"
+ id="use6261"
+ transform="matrix(-1,0,0,1,135.46666,2.8571444e-7)"
+ width="100%"
+ height="100%" />
+ <use
+ height="100%"
+ width="100%"
+ transform="translate(1.3e-5,72.760414)"
+ id="use6263"
+ xlink:href="#rect6235"
+ y="0"
+ x="0" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#rect6235"
+ id="use6265"
+ transform="matrix(-1,0,0,1,135.46667,72.760414)"
+ width="100%"
+ height="100%" />
+ <use
+ height="100%"
+ width="100%"
+ transform="translate(7e-6,54.570314)"
+ id="use6273"
+ xlink:href="#rect6235"
+ y="0"
+ x="0" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#rect6235"
+ id="use6275"
+ transform="matrix(-1,0,0,1,135.46667,54.570314)"
+ width="100%"
+ height="100%" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path4111"
+ d="M 97.337008,203.42145 H 115.52438"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <path
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="M 97.337008,213.21103 H 115.52438"
+ id="path4113"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-end:url(#marker5953-7);color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="m 112.05865,223.10803 v -9.27815"
+ id="path4117"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path4125"
+ d="m 112.05865,193.5232 v 9.27815"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-end:url(#marker5953-7);color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <path
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="m 87.19549,174.44138 v 18.18738"
+ id="path4127"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path4129"
+ d="m 105.9809,160.82875 0,32.96931"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4131"
+ d="M 72.965068,179.38771 H 86.575759"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-end:url(#marker5743-3);color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <path
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-end:url(#marker1206);color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="m 116.52409,179.36907 h -9.92308"
+ id="path4133"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path1208"
+ d="m 48.265482,188.03076 0,-42.48586"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <path
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="m 87.19549,174.44138 0,-28.89648"
+ id="path1210"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="m 29.48006,189.98821 0,-29.15946"
+ id="path1212"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-end:url(#marker1220);color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="M 116.52409,150.43133 H 88.107547"
+ id="path1216"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-end:url(#marker1469);color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="M 33.844504,150.44997 H 47.455195"
+ id="path1465"
+ inkscape:connector-curvature="0" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path1471"
+ d="m 116.52409,164.90036 -9.92308,-6e-5"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-end:url(#marker1475);color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <path
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-end:url(#marker1481);color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="m 18.738467,164.91897 h 9.92308"
+ id="path1477"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer2"
+ inkscape:label="widgets"
+ style="opacity:0"
+ transform="translate(0,26.458332)">
+ <rect
+ inkscape:label="#rect5487"
+ y="82.46891"
+ x="117.60729"
+ height="13.229166"
+ width="52.916664"
+ id="pitch"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <rect
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="pad4"
+ width="6.3499999"
+ height="6.3499999"
+ x="51.39793"
+ y="95.003548"
+ inkscape:label="#rect5487" />
+ <rect
+ inkscape:label="#rect5487"
+ y="22.243139"
+ x="51.39793"
+ height="6.3499999"
+ width="6.3499999"
+ id="pad1"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <rect
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="pad2"
+ width="6.3499999"
+ height="6.3499999"
+ x="51.39793"
+ y="40.43325"
+ inkscape:label="#rect5487" />
+ <rect
+ inkscape:label="#rect5487"
+ y="76.813454"
+ x="51.39793"
+ height="6.3499999"
+ width="6.3499999"
+ id="pad3"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <rect
+ inkscape:label="#rect5487"
+ y="95.003548"
+ x="77.243408"
+ height="6.3499999"
+ width="6.3499999"
+ id="pad5"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <rect
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="pad6"
+ width="6.3499999"
+ height="6.3499999"
+ x="77.243408"
+ y="76.813454"
+ inkscape:label="#rect5487" />
+ <rect
+ inkscape:label="#rect5487"
+ y="40.433247"
+ x="77.243408"
+ height="6.3499999"
+ width="6.3499999"
+ id="pad7"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <rect
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="pad8"
+ width="6.3499999"
+ height="6.3499999"
+ x="77.243408"
+ y="22.243139"
+ inkscape:label="#rect5487" />
+ <rect
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="pad_width"
+ width="52.916664"
+ height="13.229166"
+ x="117.58533"
+ y="36.993778"
+ inkscape:label="#rect5487" />
+ <rect
+ inkscape:label="#rect5487"
+ y="8.055769"
+ x="117.58533"
+ height="13.229166"
+ width="52.916664"
+ id="pad_height"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <rect
+ inkscape:label="#rect5487"
+ y="111.40692"
+ x="117.60729"
+ height="13.229166"
+ width="52.916664"
+ id="spacing"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <rect
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="spacing_inner"
+ width="52.916664"
+ height="13.229166"
+ x="117.60444"
+ y="7.6530724"
+ inkscape:label="#rect5487"
+ transform="scale(1,-1)" />
+ <rect
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="spacing_outer"
+ width="52.916664"
+ height="13.229166"
+ x="117.60444"
+ y="-6.8159323"
+ inkscape:label="#rect5487"
+ transform="scale(1,-1)" />
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/geometries/dual.svg.subs b/rsvg/tests/fixtures/geometries/dual.svg.subs
new file mode 100644
index 00000000..042ce9b5
--- /dev/null
+++ b/rsvg/tests/fixtures/geometries/dual.svg.subs
@@ -0,0 +1,86 @@
+{
+ "#pad1": {
+ "height": 23.99999999999997,
+ "width": 24.0,
+ "x": 194.2617187499999,
+ "y": 184.07031249999991
+ },
+ "#pad2": {
+ "height": 23.99999999999997,
+ "width": 24.0,
+ "x": 194.2617187499999,
+ "y": 252.82031249999986
+ },
+ "#pad3": {
+ "height": 24.0,
+ "width": 24.0,
+ "x": 194.2617187499999,
+ "y": 390.3203124999998
+ },
+ "#pad4": {
+ "height": 24.0,
+ "width": 24.0,
+ "x": 194.2617187499999,
+ "y": 459.0703124999998
+ },
+ "#pad5": {
+ "height": 24.0,
+ "width": 24.0,
+ "x": 291.9453124999998,
+ "y": 459.0703124999998
+ },
+ "#pad6": {
+ "height": 24.0,
+ "width": 24.0,
+ "x": 291.9453124999998,
+ "y": 390.3203124999998
+ },
+ "#pad7": {
+ "height": 23.99999999999997,
+ "width": 24.0,
+ "x": 291.9453124999998,
+ "y": 252.82031249999986
+ },
+ "#pad8": {
+ "height": 23.99999999999997,
+ "width": 24.0,
+ "x": 291.9453124999998,
+ "y": 184.07031249999991
+ },
+ "#pad_height": {
+ "height": 49.99999999999997,
+ "width": 199.99999999999977,
+ "x": 444.4179687499998,
+ "y": 130.44531249999994
+ },
+ "#pad_width": {
+ "height": 50.00000000000003,
+ "width": 199.99999999999977,
+ "x": 444.4179687499998,
+ "y": 239.82031249999986
+ },
+ "#pitch": {
+ "height": 50.0,
+ "width": 199.99999999999983,
+ "x": 444.4999999999997,
+ "y": 411.6953124999998
+ },
+ "#spacing": {
+ "height": 50.0,
+ "width": 199.99999999999983,
+ "x": 444.4999999999997,
+ "y": 521.0664062499997
+ },
+ "#spacing_inner": {
+ "height": 49.99999999999995,
+ "width": 199.99999999999977,
+ "x": 444.4882812499998,
+ "y": 21.07421875000002
+ },
+ "#spacing_outer": {
+ "height": 49.99999999999996,
+ "width": 199.99999999999977,
+ "x": 444.4882812499998,
+ "y": 75.76171874999997
+ }
+} \ No newline at end of file
diff --git a/rsvg/tests/fixtures/geometries/grid.svg b/rsvg/tests/fixtures/geometries/grid.svg
new file mode 100644
index 00000000..f0d10316
--- /dev/null
+++ b/rsvg/tests/fixtures/geometries/grid.svg
@@ -0,0 +1,947 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="950"
+ height="500"
+ viewBox="0 0 251.35414 132.29167"
+ version="1.1"
+ id="svg8"
+ inkscape:version="0.92.2 5c3e80d, 2017-08-06"
+ sodipodi:docname="grid.svg">
+ <defs
+ id="defs2">
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker2798"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow2Lend">
+ <path
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ id="path2796"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker2749"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ inkscape:connector-curvature="0"
+ id="path2747"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker2745"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path2743"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker1294"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow2Lend">
+ <path
+ inkscape:connector-curvature="0"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ id="path1292" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker11644"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow2Lend">
+ <path
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ id="path11642"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker11014"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow2Lend">
+ <path
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ id="path11012"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker6297"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path6295"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Mend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2Mend"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4663"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="scale(-0.6)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Send"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2Send"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4669"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-0.3,0,0,-0.3,0.69,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker1294-3"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow2Lend"
+ inkscape:collect="always">
+ <path
+ inkscape:connector-curvature="0"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ id="path1292-5" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker7950-6"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow2Lend"
+ inkscape:collect="always">
+ <path
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ id="path7948-2"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker2549"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path2547"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker5743-3"
+ style="overflow:visible"
+ inkscape:isstock="true"
+ inkscape:collect="always">
+ <path
+ inkscape:connector-curvature="0"
+ id="path5741-6"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="281.27372"
+ inkscape:cy="318.8227"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer2"
+ showgrid="false"
+ units="px"
+ showguides="true"
+ inkscape:guide-bbox="true"
+ inkscape:window-width="1916"
+ inkscape:window-height="801"
+ inkscape:window-x="0"
+ inkscape:window-y="37"
+ inkscape:window-maximized="0"
+ inkscape:measure-start="0,0"
+ inkscape:measure-end="0,0"
+ inkscape:snap-bbox="false"
+ inkscape:snap-page="true"
+ inkscape:lockguides="true">
+ <sodipodi:guide
+ position="32.740516,16.089625"
+ orientation="0,1"
+ id="guide4632"
+ inkscape:locked="true" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata5">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-164.70831)"
+ style="display:inline">
+ <path
+ sodipodi:nodetypes="cccccccc"
+ inkscape:connector-curvature="0"
+ d="M 73.605919,192.48864 V 175.9765 h 15.022493 v 16.51214 z m 15.022493,-9.09546 -7.51126,-7.24286 -7.511233,7.24286"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:5;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="path961" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#path961"
+ id="use965"
+ transform="translate(20.410204,3.6847258e-6)"
+ width="100%"
+ height="100%" />
+ <g
+ id="g1066"
+ transform="translate(4.3219003,-2.625374)">
+ <use
+ height="100%"
+ width="100%"
+ transform="translate(56.949891,2.6253783)"
+ id="use975"
+ xlink:href="#path961"
+ y="0"
+ x="0" />
+ </g>
+ <g
+ style="display:inline"
+ id="g7610-3"
+ transform="matrix(0,1,1,0,-98.216103,139.46175)">
+ <circle
+ r="0.88140595"
+ transform="rotate(-90)"
+ cy="44.770824"
+ cx="-224.25233"
+ id="circle7604-6"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.35271439;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <circle
+ r="0.88140595"
+ transform="rotate(-90)"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.35271439;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="circle7606-7"
+ cx="-220.17426"
+ cy="44.770824" />
+ <circle
+ r="0.88140595"
+ transform="rotate(-90)"
+ cy="44.770824"
+ cx="-216.09619"
+ id="circle7608-5"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.35271439;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ </g>
+ <use
+ height="100%"
+ width="100%"
+ transform="translate(20.410204,21.903077)"
+ id="use1112"
+ xlink:href="#path961"
+ y="0"
+ x="0" />
+ <g
+ id="g1116"
+ transform="translate(4.3219003,19.277697)">
+ <use
+ x="0"
+ y="0"
+ xlink:href="#path961"
+ id="use1114"
+ transform="translate(56.949891,2.6253783)"
+ width="100%"
+ height="100%" />
+ </g>
+ <g
+ transform="matrix(0,1,1,0,-98.216103,161.36482)"
+ id="g1126"
+ style="display:inline">
+ <circle
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.35271439;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="circle1120"
+ cx="-224.25233"
+ cy="44.770824"
+ transform="rotate(-90)"
+ r="0.88140595" />
+ <circle
+ cy="44.770824"
+ cx="-220.17426"
+ id="circle1122"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.35271439;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="rotate(-90)"
+ r="0.88140595" />
+ <circle
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.35271439;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="circle1124"
+ cx="-216.09619"
+ cy="44.770824"
+ transform="rotate(-90)"
+ r="0.88140595" />
+ </g>
+ <g
+ transform="matrix(0,1,1,0,-98.216103,161.36482)"
+ id="g1144"
+ style="display:inline">
+ <circle
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.35271439;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="circle1138"
+ cx="-224.25233"
+ cy="44.770824"
+ transform="rotate(-90)"
+ r="0.88140595" />
+ <circle
+ cy="44.770824"
+ cx="-220.17426"
+ id="circle1140"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.35271439;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="rotate(-90)"
+ r="0.88140595" />
+ <circle
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.35271439;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="circle1142"
+ cx="-216.09619"
+ cy="44.770824"
+ transform="rotate(-90)"
+ r="0.88140595" />
+ </g>
+ <g
+ id="g1262"
+ transform="translate(4.3219003,-2.625374)">
+ <path
+ sodipodi:nodetypes="cccccccc"
+ inkscape:connector-curvature="0"
+ d="m 69.284018,217.01708 v -16.51214 h 15.022493 v 16.51214 z m 15.022493,-9.09546 -7.51126,-7.24286 -7.511233,7.24286"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:5;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="path1110" />
+ <path
+ sodipodi:nodetypes="cccccccc"
+ inkscape:connector-curvature="0"
+ d="m 69.284018,260.82322 v -16.51214 h 15.022493 v 16.51214 z m 15.022493,-9.09546 -7.51126,-7.24286 -7.511233,7.24286"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:5;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="path1190" />
+ </g>
+ <use
+ height="100%"
+ width="100%"
+ transform="translate(20.410204,65.709217)"
+ id="use1192"
+ xlink:href="#path961"
+ y="0"
+ x="0" />
+ <g
+ id="g1196"
+ transform="translate(4.3219003,63.083837)">
+ <use
+ x="0"
+ y="0"
+ xlink:href="#path961"
+ id="use1194"
+ transform="translate(56.949891,2.6253783)"
+ width="100%"
+ height="100%" />
+ </g>
+ <use
+ height="100%"
+ width="100%"
+ transform="translate(81.653167,0.03307728)"
+ id="use979"
+ xlink:href="#path961"
+ y="0"
+ x="0" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#path961"
+ id="use1118"
+ transform="translate(81.653167,21.936151)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#path961"
+ id="use1198"
+ transform="translate(81.653167,65.742291)"
+ width="100%"
+ height="100%" />
+ <g
+ transform="matrix(0,1,1,0,-98.216103,205.17096)"
+ id="g1206"
+ style="display:inline">
+ <circle
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.35271439;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="circle1200"
+ cx="-224.25233"
+ cy="44.770824"
+ transform="rotate(-90)"
+ r="0.88140595" />
+ <circle
+ cy="44.770824"
+ cx="-220.17426"
+ id="circle1202"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.35271439;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="rotate(-90)"
+ r="0.88140595" />
+ <circle
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.35271439;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="circle1204"
+ cx="-216.09619"
+ cy="44.770824"
+ transform="rotate(-90)"
+ r="0.88140595" />
+ </g>
+ <path
+ sodipodi:nodetypes="cccccccc"
+ inkscape:connector-curvature="0"
+ d="m 73.605919,280.10092 v -16.51214 h 15.022493 v 16.51214 z m 15.022493,-9.09546 -7.51126,-7.24286 -7.511233,7.24286"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:5;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="path1226" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#path961"
+ id="use1228"
+ transform="translate(20.410204,87.612289)"
+ width="100%"
+ height="100%" />
+ <g
+ transform="translate(4.3219003,84.986909)"
+ id="g1232">
+ <use
+ height="100%"
+ width="100%"
+ transform="translate(56.949891,2.6253783)"
+ id="use1230"
+ xlink:href="#path961"
+ y="0"
+ x="0" />
+ </g>
+ <use
+ height="100%"
+ width="100%"
+ transform="translate(81.653167,87.645362)"
+ id="use1234"
+ xlink:href="#path961"
+ y="0"
+ x="0" />
+ <g
+ style="display:inline"
+ id="g1242"
+ transform="matrix(0,1,1,0,-98.216103,227.07403)">
+ <circle
+ r="0.88140595"
+ transform="rotate(-90)"
+ cy="44.770824"
+ cx="-224.25233"
+ id="circle1236"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.35271439;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <circle
+ r="0.88140595"
+ transform="rotate(-90)"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.35271439;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="circle1238"
+ cx="-220.17426"
+ cy="44.770824" />
+ <circle
+ r="0.88140595"
+ transform="rotate(-90)"
+ cy="44.770824"
+ cx="-216.09619"
+ id="circle1240"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.35271439;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ </g>
+ <g
+ style="display:inline"
+ id="g1250"
+ transform="matrix(0,1,1,0,-98.216103,227.07403)">
+ <circle
+ r="0.88140595"
+ transform="rotate(-90)"
+ cy="44.770824"
+ cx="-224.25233"
+ id="circle1244"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.35271439;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <circle
+ r="0.88140595"
+ transform="rotate(-90)"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.35271439;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="circle1246"
+ cx="-220.17426"
+ cy="44.770824" />
+ <circle
+ r="0.88140595"
+ transform="rotate(-90)"
+ cy="44.770824"
+ cx="-216.09619"
+ id="circle1248"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.35271439;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ </g>
+ <g
+ style="display:inline"
+ id="g1258"
+ transform="matrix(-1,0,0,1,124.3518,7.864443)">
+ <circle
+ r="0.88140595"
+ transform="rotate(-90)"
+ cy="43.234634"
+ cx="-224.25233"
+ id="circle1252"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.35271439;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <circle
+ r="0.88140595"
+ transform="rotate(-90)"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.35271439;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="circle1254"
+ cx="-220.17426"
+ cy="43.234634" />
+ <circle
+ r="0.88140595"
+ transform="rotate(-90)"
+ cy="43.234634"
+ cx="-216.09619"
+ id="circle1256"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.35271439;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ </g>
+ <g
+ transform="matrix(-1,0,0,1,206.00497,7.864443)"
+ id="g1270"
+ style="display:inline">
+ <circle
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.35271439;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="circle1264"
+ cx="-224.25233"
+ cy="43.234634"
+ transform="rotate(-90)"
+ r="0.88140595" />
+ <circle
+ cy="43.234634"
+ cx="-220.17426"
+ id="circle1266"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.35271439;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="rotate(-90)"
+ r="0.88140595" />
+ <circle
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.35271439;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="circle1268"
+ cx="-216.09619"
+ cy="43.234634"
+ transform="rotate(-90)"
+ r="0.88140595" />
+ </g>
+ <g
+ transform="matrix(-1,0,0,1,144.762,7.864443)"
+ id="g1282"
+ style="display:inline">
+ <circle
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.35271439;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="circle1276"
+ cx="-224.25233"
+ cy="43.234634"
+ transform="rotate(-90)"
+ r="0.88140595" />
+ <circle
+ cy="43.234634"
+ cx="-220.17426"
+ id="circle1278"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.35271439;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="rotate(-90)"
+ r="0.88140595" />
+ <circle
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.35271439;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="circle1280"
+ cx="-216.09619"
+ cy="43.234634"
+ transform="rotate(-90)"
+ r="0.88140595" />
+ </g>
+ <g
+ style="display:inline"
+ id="g1290"
+ transform="matrix(-1,0,0,1,185.62359,7.864443)">
+ <circle
+ r="0.88140595"
+ transform="rotate(-90)"
+ cy="43.234634"
+ cx="-224.25233"
+ id="circle1284"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.35271439;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <circle
+ r="0.88140595"
+ transform="rotate(-90)"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.35271439;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="circle1286"
+ cx="-220.17426"
+ cy="43.234634" />
+ <circle
+ r="0.88140595"
+ transform="rotate(-90)"
+ cy="43.234634"
+ cx="-216.09619"
+ id="circle1288"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.35271439;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ </g>
+ <path
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:5;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="m 170.28158,241.71797 h 13.67386"
+ id="path4757-9"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4759-1"
+ d="m 170.28158,258.23012 h 13.67386"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:5;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ sodipodi:nodetypes="cc" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4761-2"
+ d="m 179.26214,246.99098 v 10.36955"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-end:url(#marker7950-6);color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-end:url(#marker1294-3);color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="M 179.26214,254.08064 V 242.45431"
+ id="path4763-7"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4131"
+ d="m 139.3352,287.81597 h 14.80338"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-end:url(#marker5743-3);color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-end:url(#marker2549);color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="M 186.46602,287.79733 H 171.1938"
+ id="path4133"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path2668"
+ d="m 170.28158,280.134 v 13.7334"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:5;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ sodipodi:nodetypes="cc" />
+ <path
+ sodipodi:nodetypes="cc"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:5;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="m 155.25909,280.134 v 13.7334"
+ id="path2670"
+ inkscape:connector-curvature="0" />
+ <g
+ style="display:inline"
+ id="g5689-9"
+ transform="translate(123.89472,-78.621213)">
+ <path
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="m 38.875618,260.08007 v 5.61357"
+ id="path4579-3"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path4581-6"
+ d="M 41.682402,262.88685 H 36.068834"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ </g>
+ <g
+ transform="translate(123.89472,-56.718139)"
+ id="g2721"
+ style="display:inline">
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path2717"
+ d="m 38.875618,260.08007 v 5.61357"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <path
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="M 41.682402,262.88685 H 36.068834"
+ id="path2719"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ </g>
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path2731"
+ d="m 162.60866,184.25735 h 21.34678"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:5;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <path
+ sodipodi:nodetypes="cc"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-end:url(#marker2749);color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="m 179.26214,195.11253 v 10.36955"
+ id="path2735"
+ inkscape:connector-curvature="0" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path2737"
+ d="M 179.26214,196.79925 V 185.17292"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-end:url(#marker2745);color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <path
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:5;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="m 162.60866,206.16426 h 21.34678"
+ id="path2741"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <g
+ style="display:inline"
+ id="g5689-9-0"
+ transform="translate(42.241547,8.9579904)">
+ <path
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="m 38.875618,260.08007 v 5.61357"
+ id="path4579-3-6"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path4581-6-2"
+ d="M 41.682402,262.88685 H 36.068834"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ </g>
+ <g
+ transform="translate(62.651751,8.9579994)"
+ id="g2776"
+ style="display:inline">
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path2772"
+ d="m 38.875618,260.08007 v 5.61357"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <path
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="M 41.682402,262.88685 H 36.068834"
+ id="path2774"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ </g>
+ <path
+ sodipodi:nodetypes="cc"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-end:url(#marker2798);color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="M 117.07602,287.81597 H 102.27264"
+ id="path2786"
+ inkscape:connector-curvature="0" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path2788"
+ d="m 64.888132,287.79733 h 15.27222"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-end:url(#marker2549);color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <path
+ sodipodi:nodetypes="cc"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:5;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="m 81.113913,273.69314 v 20.14119"
+ id="path2792"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path2800"
+ d="m 101.52555,273.69314 v 20.14119"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:5;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ sodipodi:nodetypes="cc" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer2"
+ inkscape:label="widgets"
+ style="opacity:0">
+ <rect
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="pitch_h"
+ width="52.916664"
+ height="13.229166"
+ x="-63.628414"
+ y="116.48405"
+ inkscape:label="#rect5487"
+ transform="scale(-1,1)" />
+ <rect
+ transform="scale(-1)"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="padx1"
+ width="6.3499999"
+ height="6.3499999"
+ x="-84.29216"
+ y="-8.928462"
+ inkscape:label="#rect5487" />
+ <rect
+ inkscape:label="#rect5487"
+ y="-8.928462"
+ x="-104.70236"
+ height="6.3499999"
+ width="6.3499999"
+ id="padx2"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="scale(-1)" />
+ <rect
+ transform="scale(-1)"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="padx3"
+ width="6.3499999"
+ height="6.3499999"
+ x="-145.56395"
+ y="-8.928462"
+ inkscape:label="#rect5487" />
+ <rect
+ inkscape:label="#rect5487"
+ y="-8.928462"
+ x="-165.94533"
+ height="6.3499999"
+ width="6.3499999"
+ id="padx4"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="scale(-1)" />
+ <rect
+ inkscape:label="#rect5487"
+ y="-22.699257"
+ x="-71.062996"
+ height="6.3499999"
+ width="6.3499999"
+ id="pady1"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="scale(-1)" />
+ <rect
+ transform="scale(-1)"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="pady2"
+ width="6.3499999"
+ height="6.3499999"
+ x="-71.062996"
+ y="-44.602322"
+ inkscape:label="#rect5487" />
+ <rect
+ inkscape:label="#rect5487"
+ y="-88.408463"
+ x="-71.062996"
+ height="6.3499999"
+ width="6.3499999"
+ id="pady3"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="scale(-1)" />
+ <rect
+ transform="scale(-1)"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="pady4"
+ width="6.3499999"
+ height="6.3499999"
+ x="-71.062996"
+ y="-110.31154"
+ inkscape:label="#rect5487" />
+ <rect
+ inkscape:label="#rect5487"
+ y="116.48404"
+ x="187.72574"
+ height="13.229166"
+ width="52.916664"
+ id="pad_width"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <rect
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="pad_height"
+ width="52.916664"
+ height="13.229166"
+ x="187.72574"
+ y="78.651154"
+ inkscape:label="#rect5487" />
+ <rect
+ inkscape:label="#rect5487"
+ y="23.894276"
+ x="187.72574"
+ height="13.229166"
+ width="52.916664"
+ id="pitch_v"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/geometries/grid.svg.subs b/rsvg/tests/fixtures/geometries/grid.svg.subs
new file mode 100644
index 00000000..2bce9946
--- /dev/null
+++ b/rsvg/tests/fixtures/geometries/grid.svg.subs
@@ -0,0 +1,74 @@
+{
+ "#pad_height": {
+ "height": 50.00000000000006,
+ "width": 200.0,
+ "x": 709.5156249999993,
+ "y": 297.265625
+ },
+ "#pad_width": {
+ "height": 50.0,
+ "width": 200.0,
+ "x": 709.5156249999993,
+ "y": 440.25390625
+ },
+ "#padx1": {
+ "height": 24.0,
+ "width": 24.0,
+ "x": 294.5859374999997,
+ "y": 9.74609375
+ },
+ "#padx2": {
+ "height": 24.0,
+ "width": 24.0,
+ "x": 371.7265624999997,
+ "y": 9.74609375
+ },
+ "#padx3": {
+ "height": 24.0,
+ "width": 24.0,
+ "x": 526.1640624999993,
+ "y": 9.74609375
+ },
+ "#padx4": {
+ "height": 24.0,
+ "width": 24.0,
+ "x": 603.1953124999993,
+ "y": 9.74609375
+ },
+ "#pady1": {
+ "height": 23.999999999999993,
+ "width": 23.99999999999997,
+ "x": 244.58593749999974,
+ "y": 61.79296875000001
+ },
+ "#pady2": {
+ "height": 24.0,
+ "width": 23.99999999999997,
+ "x": 244.58593749999974,
+ "y": 144.57421875
+ },
+ "#pady3": {
+ "height": 24.000000000000057,
+ "width": 23.99999999999997,
+ "x": 244.58593749999974,
+ "y": 310.140625
+ },
+ "#pady4": {
+ "height": 24.0,
+ "width": 23.99999999999997,
+ "x": 244.58593749999974,
+ "y": 392.92578125
+ },
+ "#pitch_h": {
+ "height": 50.0,
+ "width": 199.9999999999999,
+ "x": 40.48437499999996,
+ "y": 440.25390625
+ },
+ "#pitch_v": {
+ "height": 50.0,
+ "width": 200.0,
+ "x": 709.5156249999993,
+ "y": 90.30859375
+ }
+} \ No newline at end of file
diff --git a/rsvg/tests/fixtures/geometries/quad.svg b/rsvg/tests/fixtures/geometries/quad.svg
new file mode 100644
index 00000000..fa293c96
--- /dev/null
+++ b/rsvg/tests/fixtures/geometries/quad.svg
@@ -0,0 +1,797 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="950"
+ height="500"
+ viewBox="0 0 251.35414 132.29167"
+ version="1.1"
+ id="svg8"
+ inkscape:version="0.92.2 5c3e80d, 2017-08-06"
+ sodipodi:docname="quad.svg">
+ <defs
+ id="defs2">
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker11644"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow2Lend">
+ <path
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ id="path11642"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker11014"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow2Lend">
+ <path
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ id="path11012"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker10186"
+ style="overflow:visible"
+ inkscape:isstock="true"
+ inkscape:collect="always">
+ <path
+ id="path10184"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker8014"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path8012"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker7950"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow2Lend"
+ inkscape:collect="always">
+ <path
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ id="path7948"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker6297"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path6295"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker5082"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow2Lend"
+ inkscape:collect="always">
+ <path
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ id="path5080"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Mend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2Mend"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4663"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="scale(-0.6)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Send"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2Send"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4669"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-0.3,0,0,-0.3,0.69,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2Lend"
+ style="overflow:visible"
+ inkscape:isstock="true"
+ inkscape:collect="always">
+ <path
+ id="path4657"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.70710678"
+ inkscape:cx="274.2769"
+ inkscape:cy="170.25561"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ units="px"
+ showguides="true"
+ inkscape:guide-bbox="true"
+ inkscape:window-width="1916"
+ inkscape:window-height="920"
+ inkscape:window-x="0"
+ inkscape:window-y="37"
+ inkscape:window-maximized="0"
+ inkscape:measure-start="0,0"
+ inkscape:measure-end="0,0"
+ inkscape:snap-bbox="false"
+ inkscape:snap-page="true">
+ <sodipodi:guide
+ position="32.740516,16.089625"
+ orientation="0,1"
+ id="guide4632"
+ inkscape:locked="false" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata5">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-164.70831)"
+ style="display:inline">
+ <g
+ id="g9390"
+ transform="translate(72.270941,-2.2203197)">
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path4555"
+ d="m 59.722283,220.82127 v 8.92086"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <path
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="m 64.182713,225.2817 h -8.92086"
+ id="path4557"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ </g>
+ <g
+ id="g5689"
+ transform="translate(138.71561,-26.607863)">
+ <path
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="m 38.875618,260.08007 v 5.61357"
+ id="path4579"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path4581"
+ d="M 41.682402,262.88685 H 36.068834"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ </g>
+ <path
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-end:url(#Arrow2Lend);color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="m 117.38144,286.04183 h 13.6107"
+ id="path4634"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path5078"
+ d="M 194.81798,286.04183 H 178.36301"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-end:url(#marker5082);color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ sodipodi:nodetypes="cc" />
+ <g
+ id="g7570"
+ transform="translate(41.61014,2.8871109)">
+ <circle
+ r="0.88140595"
+ transform="rotate(-90)"
+ cy="44.770824"
+ cx="-224.25233"
+ id="path4501"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.35271439;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <circle
+ r="0.88140595"
+ transform="rotate(-90)"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.35271439;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="circle4507"
+ cx="-220.17426"
+ cy="44.770824" />
+ <circle
+ r="0.88140595"
+ transform="rotate(-90)"
+ cy="44.770824"
+ cx="-216.09619"
+ id="circle4509"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.35271439;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ </g>
+ <path
+ id="rect6235"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:5;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="M 78.820422,192.71358 H 93.92882 v 7.82515 H 78.820422 Z m 11.233848,7.82515 3.78375,-3.91258 -3.78375,-3.91257"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccccc" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#rect6235"
+ id="use6257"
+ transform="translate(6.2500008e-7,13.217607)"
+ width="100%"
+ height="100%" />
+ <use
+ height="100%"
+ width="100%"
+ transform="translate(6.2500008e-7,52.87046)"
+ id="use6263"
+ xlink:href="#rect6235"
+ y="0"
+ x="0" />
+ <use
+ height="100%"
+ width="100%"
+ transform="translate(6.2500008e-7,39.652842)"
+ id="use6273"
+ xlink:href="#rect6235"
+ y="0"
+ x="0" />
+ <circle
+ r="0.88140595"
+ transform="matrix(0,-1,-1,0,0,0)"
+ cy="-177.59123"
+ cx="-227.13945"
+ id="circle7588"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.35271439;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <circle
+ r="0.88140595"
+ transform="matrix(0,-1,-1,0,0,0)"
+ cy="-177.59123"
+ cx="-218.98331"
+ id="circle7592"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.35271439;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <use
+ height="100%"
+ width="100%"
+ transform="matrix(-1,0,0,1,263.9722,13.217607)"
+ id="use7596"
+ xlink:href="#rect6235"
+ y="0"
+ x="0" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#rect6235"
+ id="use7598"
+ transform="matrix(-1,0,0,1,263.9722,52.87046)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#rect6235"
+ id="use7600"
+ transform="matrix(-1,0,0,1,263.9722,39.652842)"
+ width="100%"
+ height="100%" />
+ <use
+ height="100%"
+ width="100%"
+ transform="matrix(-1,0,0,1,263.9722,0)"
+ id="use7602"
+ xlink:href="#rect6235"
+ y="0"
+ x="0" />
+ <g
+ id="g7610"
+ transform="matrix(0,1,1,0,-88.181043,132.68026)">
+ <circle
+ r="0.88140595"
+ transform="rotate(-90)"
+ cy="44.770824"
+ cx="-224.25233"
+ id="circle7604"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.35271439;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <circle
+ r="0.88140595"
+ transform="rotate(-90)"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.35271439;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="circle7606"
+ cx="-220.17426"
+ cy="44.770824" />
+ <circle
+ r="0.88140595"
+ transform="rotate(-90)"
+ cy="44.770824"
+ cx="-216.09619"
+ id="circle7608"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.35271439;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ </g>
+ <use
+ x="0"
+ y="0"
+ xlink:href="#rect6235"
+ id="use7612"
+ transform="matrix(0,1,1,0,-77.850553,91.070113)"
+ width="100%"
+ height="100%" />
+ <use
+ height="100%"
+ width="100%"
+ transform="matrix(0,1,1,0,-38.197704,91.070113)"
+ id="use7614"
+ xlink:href="#rect6235"
+ y="0"
+ x="0" />
+ <use
+ height="100%"
+ width="100%"
+ transform="matrix(0,1,1,0,-51.415323,91.070113)"
+ id="use7616"
+ xlink:href="#rect6235"
+ y="0"
+ x="0" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#rect6235"
+ id="use7618"
+ transform="matrix(0,1,1,0,-91.068163,91.070113)"
+ width="100%"
+ height="100%" />
+ <circle
+ r="0.88140595"
+ transform="scale(-1)"
+ cy="-268.79123"
+ cx="-136.07129"
+ id="circle7650"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.35271439;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <circle
+ r="0.88140595"
+ transform="scale(-1)"
+ cy="-268.79123"
+ cx="-127.91515"
+ id="circle7654"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.35271439;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <use
+ height="100%"
+ width="100%"
+ transform="rotate(-90,138.66082,216.51137)"
+ id="use7658"
+ xlink:href="#rect6235"
+ y="0"
+ x="0" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#rect6235"
+ id="use7660"
+ transform="rotate(-90,158.48724,196.68494)"
+ width="100%"
+ height="100%" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#rect6235"
+ id="use7662"
+ transform="rotate(-90,151.87844,203.29375)"
+ width="100%"
+ height="100%" />
+ <use
+ height="100%"
+ width="100%"
+ transform="rotate(-90,132.05202,223.12017)"
+ id="use7664"
+ xlink:href="#rect6235"
+ y="0"
+ x="0" />
+ <g
+ transform="translate(138.71561,-13.390245)"
+ id="g7720">
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path7716"
+ d="m 38.875618,260.08007 v 5.61357"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <path
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="M 41.682402,262.88685 H 36.068834"
+ id="path7718"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ </g>
+ <path
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:5;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="m 180.39801,236.27899 h 13.67386"
+ id="path7910"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path7912"
+ d="m 180.39801,249.4966 h 13.67386"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:5;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ sodipodi:nodetypes="cc" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path4743"
+ d="M 78.820422,245.58404 H 65.146562"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:5;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <path
+ sodipodi:nodetypes="cc"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:5;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="M 78.820422,253.40919 H 65.146562"
+ id="path4745"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path7944"
+ d="m 189.37857,225.28939 v 10.36955"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-end:url(#marker7950);color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-end:url(#marker8014);color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="M 189.37857,261.83735 V 250.21102"
+ id="path7946"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:5;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="m 177.59123,252.3034 v 38.99037"
+ id="path9530"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path9664"
+ d="m 131.99322,225.26909 v 66.02468"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:5;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ sodipodi:nodetypes="cc" />
+ <g
+ transform="translate(119.55283,-85.435773)"
+ id="g9994">
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path9990"
+ d="m 38.875618,260.08007 v 5.61357"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <path
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="M 41.682402,262.88685 H 36.068834"
+ id="path9992"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ </g>
+ <path
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:5;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="M 136.45366,223.06138 H 212.3398"
+ id="path10004"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path10150"
+ d="M 159.34012,177.45108 H 212.3398"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:5;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <path
+ sodipodi:nodetypes="cc"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-end:url(#marker10186);color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="m 204.61414,208.83579 v 13.23377"
+ id="path10182"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path11640"
+ d="M 204.61414,194.14252 V 178.19596"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-end:url(#marker11644);color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ sodipodi:nodetypes="cc" />
+ <path
+ sodipodi:nodetypes="cc"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-end:url(#marker7950);color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="m 69.839862,234.59444 v 10.36955"
+ id="path4747"
+ inkscape:connector-curvature="0" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path4749"
+ d="M 69.839862,265.74994 V 254.12361"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-end:url(#marker8014);color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <path
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:5;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="M 101.64542,169.89053 H 87.971557"
+ id="path4757"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4759"
+ d="M 101.64542,184.99893 H 87.971557"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:5;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ sodipodi:nodetypes="cc" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4761"
+ d="m 92.66486,173.77448 v 10.36955"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-end:url(#marker7950);color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-end:url(#marker8014);color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="M 92.66486,182.2532 V 170.62687"
+ id="path4763"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer2"
+ inkscape:label="widgets"
+ style="opacity:0">
+ <rect
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="spacing_h"
+ width="52.916664"
+ height="13.229166"
+ x="195.76183"
+ y="114.72826"
+ inkscape:label="#rect5487" />
+ <rect
+ inkscape:label="#rect5487"
+ y="71.564903"
+ x="195.76181"
+ height="13.229166"
+ width="52.916664"
+ id="pitch"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <rect
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="pad4"
+ width="6.3499999"
+ height="6.3499999"
+ x="95.146843"
+ y="81.613304"
+ inkscape:label="#rect5487" />
+ <rect
+ inkscape:label="#rect5487"
+ y="28.742846"
+ x="95.146843"
+ height="6.3499999"
+ width="6.3499999"
+ id="pad1"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <rect
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="pad2"
+ width="6.3499999"
+ height="6.3499999"
+ x="95.146843"
+ y="41.960453"
+ inkscape:label="#rect5487" />
+ <rect
+ inkscape:label="#rect5487"
+ y="68.395683"
+ x="95.146843"
+ height="6.3499999"
+ width="6.3499999"
+ id="pad3"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <rect
+ inkscape:label="#rect5487"
+ y="88.862137"
+ x="102.383"
+ height="6.3499999"
+ width="6.3499999"
+ id="pad5"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <rect
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="pad6"
+ width="6.3499999"
+ height="6.3499999"
+ x="115.6006"
+ y="88.862137"
+ inkscape:label="#rect5487" />
+ <rect
+ inkscape:label="#rect5487"
+ y="88.862137"
+ x="142.03584"
+ height="6.3499999"
+ width="6.3499999"
+ id="pad7"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <rect
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="pad8"
+ width="6.3499999"
+ height="6.3499999"
+ x="155.25346"
+ y="88.862137"
+ inkscape:label="#rect5487" />
+ <rect
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="spacing_v"
+ width="52.916664"
+ height="13.229166"
+ x="195.76181"
+ y="30.256245"
+ inkscape:label="#rect5487" />
+ <rect
+ inkscape:label="#rect5487"
+ y="-34.965504"
+ x="-168.93109"
+ height="6.3499999"
+ width="6.3499999"
+ id="pad12"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="scale(-1)" />
+ <rect
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="pad9"
+ width="6.3499999"
+ height="6.3499999"
+ x="-168.93109"
+ y="-87.835968"
+ inkscape:label="#rect5487"
+ transform="scale(-1)" />
+ <rect
+ inkscape:label="#rect5487"
+ y="-74.618355"
+ x="-168.93109"
+ height="6.3499999"
+ width="6.3499999"
+ id="pad10"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="scale(-1)" />
+ <rect
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="pad11"
+ width="6.3499999"
+ height="6.3499999"
+ x="-168.93109"
+ y="-48.183125"
+ inkscape:label="#rect5487"
+ transform="scale(-1)" />
+ <rect
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="pad13"
+ width="6.3499999"
+ height="6.3499999"
+ x="-161.69495"
+ y="-27.716673"
+ inkscape:label="#rect5487"
+ transform="scale(-1)" />
+ <rect
+ inkscape:label="#rect5487"
+ y="-27.716673"
+ x="-148.47734"
+ height="6.3499999"
+ width="6.3499999"
+ id="pad14"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="scale(-1)" />
+ <rect
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="pad15"
+ width="6.3499999"
+ height="6.3499999"
+ x="-122.0421"
+ y="-27.716673"
+ inkscape:label="#rect5487"
+ transform="scale(-1)" />
+ <rect
+ inkscape:label="#rect5487"
+ y="-27.716673"
+ x="-108.82447"
+ height="6.3499999"
+ width="6.3499999"
+ id="pad16"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="scale(-1)" />
+ <rect
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="pad_width"
+ width="52.916664"
+ height="13.229166"
+ x="-58.425095"
+ y="78.580727"
+ inkscape:label="#rect5487"
+ transform="scale(-1,1)" />
+ <rect
+ transform="scale(-1,1)"
+ inkscape:label="#rect5487"
+ y="6.1281838"
+ x="-83.825096"
+ height="13.229166"
+ width="52.916664"
+ id="pad_height"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/geometries/quad.svg.subs b/rsvg/tests/fixtures/geometries/quad.svg.subs
new file mode 100644
index 00000000..b80d5c2e
--- /dev/null
+++ b/rsvg/tests/fixtures/geometries/quad.svg.subs
@@ -0,0 +1,128 @@
+{
+ "#pad1": {
+ "height": 24.00000000000003,
+ "width": 24.0,
+ "x": 359.6093749999997,
+ "y": 108.6328125
+ },
+ "#pad10": {
+ "height": 24.0,
+ "width": 24.0,
+ "x": 614.4804687499993,
+ "y": 258.0234375
+ },
+ "#pad11": {
+ "height": 23.99999999999997,
+ "width": 24.0,
+ "x": 614.4804687499993,
+ "y": 158.10937500000003
+ },
+ "#pad12": {
+ "height": 24.0,
+ "width": 24.0,
+ "x": 614.4804687499993,
+ "y": 108.15234375
+ },
+ "#pad13": {
+ "height": 24.0,
+ "width": 24.0,
+ "x": 587.1289062499993,
+ "y": 80.7578125
+ },
+ "#pad14": {
+ "height": 24.0,
+ "width": 24.0,
+ "x": 537.1757812499993,
+ "y": 80.7578125
+ },
+ "#pad15": {
+ "height": 24.0,
+ "width": 23.999999999999943,
+ "x": 437.2617187499997,
+ "y": 80.7578125
+ },
+ "#pad16": {
+ "height": 24.0,
+ "width": 24.0,
+ "x": 387.3046874999997,
+ "y": 80.7578125
+ },
+ "#pad2": {
+ "height": 24.0,
+ "width": 24.0,
+ "x": 359.6093749999997,
+ "y": 158.58984375
+ },
+ "#pad3": {
+ "height": 24.0,
+ "width": 24.0,
+ "x": 359.6093749999997,
+ "y": 258.50390625
+ },
+ "#pad4": {
+ "height": 23.999999999999943,
+ "width": 24.0,
+ "x": 359.6093749999997,
+ "y": 308.46093750000006
+ },
+ "#pad5": {
+ "height": 24.0,
+ "width": 24.0,
+ "x": 386.9609374999997,
+ "y": 335.85546875
+ },
+ "#pad6": {
+ "height": 24.0,
+ "width": 23.999999999999943,
+ "x": 436.9140624999997,
+ "y": 335.85546875
+ },
+ "#pad7": {
+ "height": 24.0,
+ "width": 24.0,
+ "x": 536.8281249999993,
+ "y": 335.85546875
+ },
+ "#pad8": {
+ "height": 24.0,
+ "width": 24.0,
+ "x": 586.7851562499993,
+ "y": 335.85546875
+ },
+ "#pad9": {
+ "height": 23.999999999999943,
+ "width": 24.0,
+ "x": 614.4804687499993,
+ "y": 307.97656250000006
+ },
+ "#pad_height": {
+ "height": 50.0,
+ "width": 199.99999999999977,
+ "x": 116.82031249999993,
+ "y": 23.160156250000004
+ },
+ "#pad_width": {
+ "height": 50.0,
+ "width": 199.9999999999999,
+ "x": 20.820312499999982,
+ "y": 296.99609375
+ },
+ "#pitch": {
+ "height": 50.0,
+ "width": 200.0,
+ "x": 739.8867187499993,
+ "y": 270.48046875
+ },
+ "#spacing_h": {
+ "height": 50.00000000000006,
+ "width": 200.0,
+ "x": 739.8867187499993,
+ "y": 433.6171875
+ },
+ "#spacing_v": {
+ "height": 50.000000000000014,
+ "width": 200.0,
+ "x": 739.8867187499993,
+ "y": 114.35546875000001
+ }
+} \ No newline at end of file
diff --git a/rsvg/tests/fixtures/geometries/single.svg b/rsvg/tests/fixtures/geometries/single.svg
new file mode 100644
index 00000000..3861567a
--- /dev/null
+++ b/rsvg/tests/fixtures/geometries/single.svg
@@ -0,0 +1,352 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ width="700"
+ height="500"
+ viewBox="0 0 185.20832 132.29167"
+ version="1.1"
+ id="svg8"
+ inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20, custom)"
+ sodipodi:docname="single.svg"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <defs
+ id="defs2">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker6297"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path6295"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#000000;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible;"
+ id="marker5953"
+ refX="0.0"
+ refY="0.0"
+ orient="auto"
+ inkscape:stockid="Arrow2Lend">
+ <path
+ transform="scale(1.1) rotate(180) translate(1,0)"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#000000;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ id="path5951" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker5743"
+ style="overflow:visible;"
+ inkscape:isstock="true"
+ inkscape:collect="always">
+ <path
+ id="path5741"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#000000;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Mend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Mend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4663"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#000000;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(0.6) rotate(180) translate(0,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Send"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Send"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4669"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#000000;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(0.3) rotate(180) translate(-2.3,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2"
+ inkscape:cx="409.5"
+ inkscape:cy="373.75"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ units="px"
+ showguides="true"
+ inkscape:guide-bbox="true"
+ inkscape:window-width="1370"
+ inkscape:window-height="1039"
+ inkscape:window-x="0"
+ inkscape:window-y="39"
+ inkscape:window-maximized="0"
+ inkscape:snap-bbox="true"
+ inkscape:object-paths="true"
+ inkscape:pagecheckerboard="0">
+ <sodipodi:guide
+ position="32.740516,16.089625"
+ orientation="0,1"
+ id="guide4632"
+ inkscape:locked="false" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata5">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-164.70831)"
+ style="display:inline">
+ <circle
+ r="1.3223464"
+ cy="96.591064"
+ cx="-232.62486"
+ id="circle4519"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="rotate(-90)" />
+ <circle
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="circle4521"
+ cx="-226.50665"
+ cy="96.591064"
+ r="1.3223464"
+ transform="rotate(-90)" />
+ <circle
+ r="1.3223464"
+ cy="96.591064"
+ cx="-220.38846"
+ id="circle4523"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="rotate(-90)" />
+ <g
+ id="g5695"
+ transform="translate(57.715436)">
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path5691"
+ d="m 38.875618,260.08007 v 5.61357"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <path
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="M 41.682402,262.88685 H 36.068834"
+ id="path5693"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ </g>
+ <g
+ transform="translate(57.715436,-18.190093)"
+ id="g5701">
+ <path
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="m 38.875618,260.08007 v 5.61357"
+ id="path5697"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path5699"
+ d="M 41.682402,262.88685 H 36.068834"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ </g>
+ <g
+ id="g4137">
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path5705"
+ d="m 99.39784,244.69676 h 18.18738"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <path
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="M 99.397838,262.88685 H 117.58522"
+ id="path5725"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ </g>
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path4111"
+ d="M 97.339865,203.42177 H 115.52724"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <path
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="M 97.339863,213.21135 H 115.52724"
+ id="path4113"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-end:url(#marker5743);color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="m 112.06151,248.4086 v 13.6107"
+ id="path5739"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path5949"
+ d="m 112.06151,259.06745 v -13.6107"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-end:url(#marker5953);color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <path
+ sodipodi:nodetypes="cccccccc"
+ inkscape:connector-curvature="0"
+ d="m 87.198346,203.42177 h 18.785424 v 9.78958 H 87.198346 Z m 13.967894,9.78958 4.70462,-4.89479 -4.70462,-4.89479"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:5;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="use6259" />
+ <path
+ sodipodi:nodetypes="cccccccc"
+ inkscape:connector-curvature="0"
+ d="m 87.198346,185.23166 h 18.785424 v 9.78958 H 87.198346 Z m 13.967894,9.78958 4.70462,-4.89479 -4.70462,-4.89479"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:5;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="use6261" />
+ <path
+ sodipodi:nodetypes="cccccccc"
+ inkscape:connector-curvature="0"
+ d="m 87.198336,257.99207 h 18.785424 v 9.78958 H 87.198336 Z m 13.967894,9.78958 4.70462,-4.89479 -4.70462,-4.89479"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:5;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="use6265" />
+ <path
+ sodipodi:nodetypes="cccccccc"
+ inkscape:connector-curvature="0"
+ d="m 87.198336,239.80197 h 18.785424 v 9.78958 H 87.198336 Z m 13.967894,9.78958 4.70462,-4.89479 -4.70462,-4.89479"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:5;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="use6275" />
+ <path
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-end:url(#marker5953);color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="M 112.06151,223.10835 V 213.8302"
+ id="path4117"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path4125"
+ d="m 112.06151,193.52352 v 9.27815"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-end:url(#marker5953);color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <path
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="m 87.198346,174.4417 v 18.18738"
+ id="path4127"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path4129"
+ d="m 105.98377,174.4417 v 18.18738"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4131"
+ d="M 72.967924,179.38803 H 86.578615"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-end:url(#marker5743);color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <path
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-end:url(#marker5953);color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="m 116.52689,179.36939 -9.92302,0"
+ id="path4133"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer2"
+ inkscape:label="widgets"
+ style="opacity:0">
+ <rect
+ inkscape:label="#rect5487"
+ y="82.46891"
+ x="117.58522"
+ height="13.229166"
+ width="52.916664"
+ id="pitch"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <rect
+ inkscape:label="#rect5487"
+ y="95.003548"
+ x="77.243408"
+ height="6.3499999"
+ width="6.3499999"
+ id="pad4"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <rect
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="pad3"
+ width="6.3499999"
+ height="6.3499999"
+ x="77.243408"
+ y="76.813454"
+ inkscape:label="#rect5487" />
+ <rect
+ inkscape:label="#rect5487"
+ y="40.433247"
+ x="77.243408"
+ height="6.3499999"
+ width="6.3499999"
+ id="pad2"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <rect
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="pad1"
+ width="6.3499999"
+ height="6.3499999"
+ x="77.243408"
+ y="22.243139"
+ inkscape:label="#rect5487" />
+ <rect
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="pad_width"
+ width="52.916664"
+ height="13.229166"
+ x="117.58522"
+ y="36.993668"
+ inkscape:label="#rect5487" />
+ <rect
+ inkscape:label="#rect5487"
+ y="8.0558186"
+ x="117.58522"
+ height="13.229166"
+ width="52.916664"
+ id="pad_height"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/geometries/single.svg.subs b/rsvg/tests/fixtures/geometries/single.svg.subs
new file mode 100644
index 00000000..cafc9b8a
--- /dev/null
+++ b/rsvg/tests/fixtures/geometries/single.svg.subs
@@ -0,0 +1,44 @@
+{
+ "#pad1": {
+ "height": 24.0,
+ "width": 24.0,
+ "x": 291.9453125,
+ "y": 84.0703125
+ },
+ "#pad2": {
+ "height": 24.0,
+ "width": 24.0,
+ "x": 291.9453125,
+ "y": 152.8203125
+ },
+ "#pad3": {
+ "height": 24.000000000000057,
+ "width": 24.0,
+ "x": 291.9453125,
+ "y": 290.3203125
+ },
+ "#pad4": {
+ "height": 23.999999999999943,
+ "width": 24.0,
+ "x": 291.9453125,
+ "y": 359.07031250000006
+ },
+ "#pad_height": {
+ "height": 50.0,
+ "width": 199.99999999999994,
+ "x": 444.41796875000006,
+ "y": 30.4453125
+ },
+ "#pad_width": {
+ "height": 50.00000000000003,
+ "width": 199.99999999999994,
+ "x": 444.41796875000006,
+ "y": 139.8203125
+ },
+ "#pitch": {
+ "height": 50.0,
+ "width": 199.99999999999994,
+ "x": 444.41796875000006,
+ "y": 311.6953125
+ }
+} \ No newline at end of file
diff --git a/rsvg/tests/fixtures/loading/gnome-cool.svg b/rsvg/tests/fixtures/loading/gnome-cool.svg
new file mode 100644
index 00000000..f9c623fd
--- /dev/null
+++ b/rsvg/tests/fixtures/loading/gnome-cool.svg
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ id="svg17"
+ version="1.1"
+ viewBox="0 0 397.13365 475.28384"
+ height="633.71179"
+ width="529.51154">
+ <metadata
+ id="metadata23">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs21" />
+ <g
+ transform="translate(-47.577309,-23.027344)"
+ id="surface3">
+ <path
+ id="path2"
+ transform="translate(-97.0403,-31.4725)"
+ d="m 462.00124,192.99984 c -3,6 -2,15 -7,21 -3,3 -12,4 -16,3 -3,0 -7,-2 -9,-2 -3,0 -6,2 -10,3 0,0 -20,4 -20,4 0,-5 -2,-5 -4,-9 -2,-4 -2,-9 -6,-10 0,0 -16,-1 -16,-1 -4,0 -9,-3 -12,0 -6,5 1,13 -2,22 -1,3 -4,6 -6,9 0,0 -5,9 -5,9 0,0 -16,17 -16,17 0,0 -2,-6 -2,-6 -7,4 -2,10 -10,15 -3,2 -11,4 -15,6 -4,1 -6,2 -9,4 -9,5 -13,6 -17,16 -8,-8 -6,-15 -8,-25 -2,-9 -4,-8 -4,-18 -6,1 -4,3 -7,7 -8,10 -5,9 -10,18 0,0 -7,11 -7,11 -3,3 -7,9 -5,13 2,5 16,7 21,8 0,0 0,-2 0,-2 0,0 18,4 18,4 3,1 5,2 8,3 0,0 14,-1 14,-1 11,0 12,-1 22,-5 4,-2 12,-4 15,-8 3,-4 4,-14 6,-19 5,-9 12,-17 18,-25 4,-6 8,-15 14,-19 0,0 6,-4 6,-4 3,-1 5,-3 8,-4 6,-3 8,-1 14,-1 0,0 11,0 11,0 3,0 5,2 8,3 0,0 6,0 6,0 0,0 11,4 11,4 13,5 14,9 28,3 2,-1 6,-3 7,-4 2,-1 7,-8 7,-10 1,-3 -3,-16 -5,-19 -3,-4 -9,-8 -14,-11 z m -212,55 c -9,0 -18,1 -26,-5 -9,-6 -5,-12 -14,-13 -1,0 -3,0 -4,0 -1,1 -2,2 -2,4 0,0 8,16 8,16 2,2 5,5 8,5 4,1 6,-1 10,-2 7,-1 16,2 20,-5 z m 0,0"
+ style="fill:#94c291;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1" />
+ <path
+ id="path4"
+ transform="translate(-97.0403,-31.4725)"
+ d="m 199.00124,451.99984 c 1,9 10,13 13,21 1,3 0,8 0,11 2,0 3,-1 5,-1 3,0 8,3 10,4 9,4 17,12 25,18 3,3 12,12 16,9 4,-2 2,-6 0,-9 -5,-10 -5,-11 -13,-20 0,0 -14,-19 -14,-19 0,0 -7,-10 -7,-10 -3,-4 -8,-9 -8,-14 1,-10 12,-16 19,-21 8,-7 25,-23 29,-33 1,-3 1,-5 1,-9 11,0 11,2 21,7 0,0 12,3 12,3 2,1 8,7 10,8 6,6 8,13 13,18 9,7 20,14 30,20 0,0 8,5 8,5 7,5 16,18 20,26 2,5 1,5 2,10 2,12 3,10 -1,22 0,2 -4,11 -2,13 2,2 5,-2 9,-2 2,0 12,3 14,3 1,1 4,3 5,2 2,-1 1,-4 1,-5 1,-7 9,-10 15,-12 0,0 17,-5 17,-5 0,0 28,-2 28,-2 0,-2 -1,-3 -2,-5 0,0 -24,-17 -24,-17 0,0 -10,-12 -10,-12 0,0 -10,-6 -10,-6 0,0 -17,-14 -17,-14 -2,-2 -4,-2 -6,-3 0,0 -8,-5 -8,-5 0,0 -14,-6 -14,-6 -9,-6 -16,-15 -24,-22 0,0 -9,-8 -9,-8 -2,-2 -5,-7 -7,-9 -5,-9 -2,-17 2,-26 2,-3 5,-8 5,-12 0,-3 -3,-7 -4,-11 -1,-4 1,-5 -1,-10 0,0 -12,-24 -12,-24 -6,3 -5,5 -11,8 -9,4 -8,1 -12,2 -3,0 -4,2 -9,3 -4,1 -23,-1 -28,-1 0,0 -26,-7 -26,-7 -3,-1 -8,-3 -11,-2 -3,2 -2,7 -2,10 0,0 -5,18 -5,18 -1,5 1,11 0,13 0,0 -13,26 -13,26 -5,10 -8,21 -11,32 0,0 -2,12 -2,12 0,0 -3,11 -3,11 -1,2 -3,9 -4,11 -1,2 -12,12 0,16 z m 0,0"
+ style="fill:#a19468;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1" />
+ <path
+ id="path6"
+ transform="translate(-97.0403,-31.4725)"
+ d="m 291.00124,99.999844 c -6,5.999996 -11,16.999996 -13,18.999996 -3,3 -10,2 -10,7 1,4 9,5 12,6 0,0 20,2 20,2 0,0 21,8 21,8 2,-3 4,-5 7,-7 2,-1 9,-3 11,-2 0,0 22,11 22,11 0,0 11,8 11,8 1,0 3,1 4,0 2,-1 1,-6 0,-8 0,0 0,-7 0,-7 -1,-5 -4,-12 -6,-16 -4,-10 -15,-26.999996 -22,-34.999996 -5,-4 -18,-13 -24,-16 -7,-3 -14,-8 -22,-8 -10,1 -18,7 -24,15 -2,3 -6,6 -5,11 2,5 13,10 18,12 z m 0,0"
+ style="fill:#ff3d3d;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1" />
+ <path
+ id="path8"
+ transform="translate(-97.0403,-31.4725)"
+ d="m 216.00124,483.99984 c -4,4 -8,3 -13,3 0,0 -25,1 -25,1 -2,1 -3,1 -4,3 -2,1 -6,2 -7,4 -1,3 1,5 3,7 4,2 12,7 16,8 4,2 12,4 16,4 3,-1 7,-3 18,-3 0,0 11,0 11,0 0,0 8,-2 8,-2 7,0 9,3 16,0 0,0 0,-2 0,-2 0,0 -9,-6 -9,-6 -10,-8 -17,-15 -30,-17 z m 253,32 c 3,4 8,4 13,4 0,0 17,-1 17,-1 0,0 19,2 19,2 5,0 11,1 14,-3 4,-5 2,-8 0,-13 -1,-3 -2,-7 -6,-3 -16,-7 -17,-3 -30,-6 0,0 -22,-6 -22,-6 -4,0 -10,1 -14,2 0,0 -10,0 -10,0 0,0 -9,3 -9,3 -6,2 -18,5 -22,10 -2,4 -1,11 2,13 2,1 5,2 7,2 11,3 18,-2 28,-4 0,0 13,0 13,0 z m -5,-20 c 0,0 0,1 0,1 0,0 -1,-1 -1,-1 0,0 1,0 1,0 z m 0,0"
+ style="fill:#0c3d5c;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1" />
+ <path
+ id="path10"
+ transform="translate(-97.0403,-31.4725)"
+ d="m 402.00124,138.99984 c -2,-2 -4,-5 -7,-6 -7,-3 -16,4 -18,11 -1,3 0,7 1,10 -5,-1 -21,-10 -25,-13 -6,-4 -10,-7 -17,-8 -2,0 -4,0 -6,1 -3,1 -8,6 -7,10 1,6 9,10 14,11 0,0 1,2 1,2 -5,5 -6,2 -13,4 0,0 -5,-10 -5,-10 0,0 -2,0 -2,0 -5,5 -9,-2 -14,-4 -4,-3 -16,-5 -21,-4 -4,-4 -7,4 -8,7 -4,11 0,14 0,19 -1,3 -4,7 -2,11 0,2 2,3 3,4 2,1 4,3 6,4 4,0 10,-5 14,-4 3,1 7,10 13,13 5,2 7,-1 15,0 -6,8 -10,9 -19,13 -2,1 -7,4 -9,4 0,0 -7,0 -7,0 -2,0 -4,1 -6,1 -6,-1 -11,-6 -12,-12 -1,-4 1,-7 0,-10 -1,-6 -7,-5 -12,-5 0,0 -6,0 -6,0 -8,1 -12,8 -17,8 -7,2 -6,-7 -14,-8 -10,-1 -10,7 -16,7 -4,0 -9,-3 -12,-3 -5,-1 -7,3 -10,3 -2,0 -13,-6 -16,-7 -2,-1 -11,-5 -12,-2 -2,4 4,10 6,12 14,13 26,16 33,22 2,2 5,6 8,7 3,1 7,0 12,3 4,3 3,8 10,13 8,6 19,3 22,3 4,1 9,4 17,3 7,-2 12,-7 17,-10 8,-4 17,-6 25,-9 0,0 16,-6 16,-6 15,-5 26,-8 26,-27 0,0 31,4 31,4 4,1 10,1 13,2 8,5 2,18 15,17 4,0 8,0 11,-1 3,-2 8,-5 11,-5 4,0 9,5 15,4 2,0 3,-1 5,-2 2,-1 5,-2 7,-3 4,-5 3,-13 5,-17 0,0 2,-8 2,-8 1,-4 4,-5 4,-10 2,-10 -5,-14 -12,-18 -2,-1 -5,-3 -7,-4 -4,-1 -6,0 -10,-4 0,0 -12,-16 -12,-16 -3,-6 0,-6 -7,-11 -1,-1 -3,-3 -4,-3 -3,-1 -5,0 -7,1 -8,3 -6,9 -6,16 z m -154,-2 c -2,1 -2,1 -3,3 -8,10 9,18 11,25 2,4 -3,16 1,18 6,3 9,-11 10,-14 2,-4 2,-19 -1,-23 -2,-3 -5,-3 -8,-5 -4,-2 -5,-5 -10,-4 z m 117,45 c 0,0 -9,1 -9,1 2,-8 -1,-8 3,-17 7,4 6,8 6,16 z m 0,0"
+ style="fill:#f5e3c5;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1" />
+ <path
+ id="path12"
+ transform="translate(-97.0403,-31.4725)"
+ d="m 270.00124,129.99984 c -5,6 -8,5 -9,8 -1,3 4,5 6,9 1,2 0,6 0,9 0,9 2,9 2,13 -1,5 -7,11 -6,14 1,3 7,2 8,9 1,4 1,17 3,20 3,3 10,5 14,3 0,0 7,-3 7,-3 4,-1 6,-1 10,-3 0,0 6,-5 6,-5 5,-2 6,-2 9,-7 -5,-1 -11,1 -16,-3 -4,-3 -6,-8 -9,-9 -4,-2 -10,2 -13,1 -3,0 -4,-4 -12,-6 2,-3 10,-13 3,-15 -2,-11 1,-14 3,-25 9,1 19,2 28,6 5,2 5,5 13,7 0,0 1,-3 1,-3 4,7 13,15 19,5 0,0 -8,-2 -8,-2 0,0 -11,-10 -11,-10 0,0 -24,-8 -24,-8 0,0 -13,-2 -13,-2 0,0 -11,-3 -11,-3 z m 89,38 c 0,0 -2,12 -2,12 0,0 9,0 9,0 0,0 -2,-3 -2,-3 1,-5 0,-7 -5,-9 z m -15,46 c -10,2 -6,6 -21,12 -4,2 -17,5 -22,6 -3,0 -4,0 -8,1 -4,1 -8,4 -12,6 -3,2 -11,7 -12,10 -2,3 1,11 2,14 0,0 5,17 5,17 0,0 3,11 3,11 5,-2 6,-6 9,-10 2,-2 6,-4 9,-6 10,-5 20,-4 24,-6 6,-4 5,-11 8,-14 2,-2 8,-1 13,-5 2,-2 4,-5 5,-7 9,-10 10,-16 11,-29 1,-4 2,-11 0,-14 -2,-2 -5,-3 -7,-1 -3,3 -6,12 -7,15 z m 0,0"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1" />
+ <path
+ id="path14"
+ transform="translate(-97.0403,-31.4725)"
+ d="m 290.00124,98.999844 c 0,0 -7,8.999996 -7,8.999996 -2,3 -4,8 -5,10 -3,2 -5,2 -8,3 -5,2 -5,7 -3,12 -8,0 -7,2 -11,4 -3,1 -7,-2 -11,0 -4,1 -4,4 -4,8 1,8 6,11 11,17 1,2 2,3 3,5 3,8 -5,9 1,19 -19,5 -10,4 -24,10 0,-2 -1,-4 -2,-6 -3,-4 -12,-4 -17,-1 -2,1 -4,4 -7,4 -5,0 -18,-8 -22,2 -8,-5 -15,-12 -24,-12 -8,0 -12,3 -6,10 8,9 19,16 29,22 7,5 12,7 17,14 7,9 9,30 23,29 0,0 9,-3 9,-3 0,0 9,-1 9,-1 7,-1 12,-3 20,-1 -9,22 -17,27 -26,48 0,0 3,1 3,1 0,0 -6,30 -6,30 0,0 -1,12 -1,12 0,0 -7,12 -7,12 0,0 -11,25 -11,25 0,0 -9,31 -9,31 0,0 -2,12 -2,12 0,0 -5,12 -5,12 0,0 -5,9 -5,9 0,0 5,9 5,9 0,0 12,17 12,17 0,0 3,15 3,15 -9,-1 -11,-1 -20,0 -6,0 -21,1 -25,7 -3,5 1,10 5,12 8,6 17,10 27,10 0,0 42,-3 42,-3 6,1 11,4 15,-2 3,2 7,7 11,7 4,1 7,-4 5,-9 0,0 -5,-8 -5,-8 0,0 -8,-13 -8,-13 0,0 -24,-32 -24,-32 -4,-5 -8,-10 -6,-17 4,-12 14,-15 23,-21 9,-6 25,-25 26,-37 11,2 28,9 36,16 0,0 8,11 8,11 0,0 15,14 15,14 0,0 28,18 28,18 5,4 9,9 14,14 4,5 7,9 9,16 2,6 4,14 3,20 -1,6 -4,14 -4,20 0,0 -2,3 -2,3 11,0 15,-2 27,2 8,3 6,7 12,8 0,0 34,-3 34,-3 0,0 31,2 31,2 0,0 17,0 17,0 5,1 18,3 22,2 10,-2 9,-19 1,-23 -6,-4 -20,-4 -27,-5 0,0 -24,-3 -24,-3 0,0 4,-1 4,-1 -2,-4 -5,-6 -9,-8 0,0 -20,-15 -20,-15 -13,-12 -20,-21 -36,-31 -6,-4 -13,-9 -19,-12 -4,-1 -8,-2 -11,-4 0,0 -11,-10 -11,-10 -10,-8 -18,-14 -25,-24 -2,-2 -6,-7 -6,-10 -1,-4 3,-16 4,-20 2,-3 3,-5 4,-8 0,-4 -1,-10 -2,-14 -2,-10 -6,-27 -13,-34 0,0 5,-16 5,-16 3,-7 9,-13 13,-19 8,-12 11,-23 25,-31 13,-7 26,-10 40,-5 11,4 26,13 38,12 11,-1 24,-11 24,-23 0,-5 -3,-12 -6,-16 -5,-7 -11,-8 -16,-14 9,-3 11,-12 6,-20 -7,-11 -22,-10 -31,-21 -9,-10 -9,-22 -16,-26 -6,-4 -16,-1 -18,6 -1,3 0,7 0,10 -7,-9 -19,-10 -24,1 0,0 -6,-19 -6,-19 -10,-21.999996 -22,-36.999996 -43,-48.999996 -8,-5 -15,-10 -25,-10 -11,0 -20,6 -27,14 -7,9 -6,17 5,22 3,1 5,1 8,2 z m 85,51.999996 c 0,0 -36,-19 -36,-19 -8,-3 -17,3 -19,11 -16,-9 -34,-13 -52,-15 3,-8 8,-6 15,-5 0,0 -3,-3 -3,-3 2,-6 6,-16 12,-19 2,-0.999996 9,-0.999996 12,-0.999996 7,-1 11,-2 18,-5 -5,-1 -8,1 -13,1 0,0 -10,2 -10,2 -7,0 -19,-3 -22,-9 -4,-5 0,-9 3,-13 7,-7 16,-14 26,-12 9,1 23,9 30,14 23,18 39,42.999996 39,72.999996 z m 71,49 c 0,0 14,-9 14,-9 0,0 1,1 1,1 -2,10 -2,18 -11,24 -2,1 -4,2 -6,2 0,0 -13,-3 -13,-3 0,0 10,-10 10,-10 -6,2 -7,5 -12,7 -3,2 -10,5 -14,6 -4,1 -9,3 -13,1 -9,-3 -2,-18 -6,-28 -4,-9 -14,-13 -17,-16 -2,-3 -4,-7 0,-9 5,-2 12,1 16,4 5,5 12,22 21,30 0,0 -6,-10 -6,-10 6,-2 12,-1 18,1 -4,-4 -8,-5 -14,-5 -2,0 -4,1 -6,0 -2,-2 -4,-5 -5,-8 8,1 13,3 14,-7 7,3 10,1 10,-7 0,-6 -3,-20 -6,-25 0,10 6,22 2,32 -10,-5 -18,-23 -19,-33 -1,-7 0,-14 8,-15 13,-2 11,14 22,27 12,13 35,12 33,29 -1,6 -5,7 -9,10 -4,3 -9,7 -12,11 z m -113,-44 c 0,0 -8,2 -8,2 0,0 14,2 14,2 0,0 11,4 11,4 0,0 -15,1 -15,1 12,6 12,-3 23,3 -3,11 0,13 -10,13 -8,0 -20,-2 -27,0 -3,1 -8,4 -8,8 1,2 3,5 4,7 -9,0 -18,-4 -18,-14 -7,0 -2,-7 0,-10 -2,1 -3,2 -4,4 -2,3 -2,10 -12,10 -3,-1 -9,-3 -10,-6 -1,-3 1,-6 2,-9 1,-4 -2,-5 -2,-9 -1,-4 2,-17 5,-19 4,-2 10,0 13,1 12,3 16,4 27,12 0,0 0,-5 0,-5 0,0 4,6 4,6 0,0 -3,-10 -3,-10 0,0 -3,6 -3,6 -14,-9 -14,-9 -31,-13 -5,-1 -9,-3 -13,1 0,0 5,0 5,0 -5,9 -6,12 -6,22 -4,-5 0,-8 -2,-13 -1,-4 -7,-8 -10,-10 3,-5 5,-4 10,-5 0,0 -1,-4 -1,-4 14,0 38,6 50,13 6,4 7,8 15,12 z m 57,-22 c 3,0 5,1 8,3 0,0 15,28 15,28 2,4 4,12 -3,12 -8,0 -9,-4 -14,-9 -6,-6 -19,-14 -18,-24 1,-6 6,-10 12,-10 z m -4,28 c -4,1 -9,1 -11,5 -3,7 9,13 13,16 7,6 7,12 7,20 0,0 -9,-3 -9,-3 0,0 -15,-1 -15,-1 0,0 -14,-3 -14,-3 0,0 -6,0 -6,0 -4,-1 -5,-3 -11,-4 -8,-1 -18,6 -24,0 -2,-2 -1,-5 2,-7 4,-2 10,-2 14,-2 0,0 15,1 15,1 0,0 31,-2 31,-2 -6,-12 -14,-14 -25,-19 0,0 -11,-5 -11,-5 -6,-3 -14,-6 -18,-12 -4,-9 7,-14 16,-11 0,0 20,11 20,11 0,0 14,8 14,8 0,0 6,3 6,3 0,0 6,5 6,5 z m -129,21 c -2,-7 3,-11 0,-18 -4,-11 -15,-10 -13,-26 7,0 17,2 22,9 3,3 1,8 0,11 0,3 2,5 2,7 0,0 -7,14 -7,14 -1,2 -2,2 -4,3 z m 120,-33 c 0,0 1,3 1,3 -2,-1 -2,-1 -1,-3 z m -94,1 c 0,0 10,3 10,3 0,0 15,8 15,8 -1,-9 -6,-9 -13,-10 -6,-1 -6,-1 -12,-1 z m 16,3 c 0,0 0,1 0,1 0,0 -1,-1 -1,-1 0,0 1,0 1,0 z m 2,1 c 0,0 0,1 0,1 0,0 -1,-1 -1,-1 0,0 1,0 1,0 z m 33,2 c 0,0 0,1 0,1 0,0 -1,-1 -1,-1 0,0 1,0 1,0 z m -43,4 c 2,5 5,5 10,5 -2,-4 -6,-4 -10,-5 z m -18,4 c 3,8 -3,9 -2,14 1,2 3,4 5,5 10,6 11,2 21,0 2,8 9,13 17,14 3,0 6,-1 9,-1 0,0 -19,13 -19,13 0,0 -12,-6 -12,-6 0,0 -5,-9 -5,-9 0,0 -6,2 -6,2 0,0 2,4 2,4 0,0 4,-3 4,-3 4,8 7,10 15,12 -7,4 -26,8 -29,-2 -2,-5 4,-17 -5,-22 -2,0 -3,-1 -5,-1 2,-8 3,-14 10,-20 z m 87,3 c 1,1 2,1 3,3 1,2 2,7 -1,9 -1,1 -3,1 -5,1 0,0 3,-13 3,-13 z m -23,3 c 3,3 7,4 11,5 -3,-4 -6,-5 -11,-5 z m 30,1 c 0,0 8,7 8,7 0,0 -9,1 -9,1 0,0 1,-8 1,-8 z m -182,26 c 0,2 -1,3 -1,5 1,7 6,9 12,7 6,-3 10,-7 10,-14 0,0 3,0 3,0 0,2 0,4 1,6 4,15 18,-1 21,-3 1,-1 2,-1 4,-2 0,4 -1,7 0,11 4,12 22,19 35,1 2,2 5,5 8,6 3,1 8,1 11,1 19,-2 23,-10 38,-18 4,-3 18,-6 20,1 2,6 -5,15 -10,18 -11,8 -35,12 -48,17 -10,3 -21,15 -29,16 -8,0 -25,-13 -33,-17 -10,-6 -21,-6 -24,-7 0,0 -12,-9 -12,-9 -13,-8 -31,-17 -38,-31 13,-3 21,7 32,12 z m 74,-10 c 3,0 6,0 9,1 3,2 3,7 3,11 -2,9 -8,17 -17,18 -12,1 -22,-11 -16,-20 5,-7 13,-8 21,-10 z m -42,2 c 3,0 8,-1 10,2 5,4 -3,12 -9,14 -7,2 -9,-12 -1,-16 z m -27,4 c 8,-2 19,3 10,11 -1,1 -3,1 -4,2 -11,5 -11,-9 -6,-13 z m 273,0 c 3,2 7,5 9,7 8,8 11,20 4,29 -2,2 -4,4 -6,5 -8,6 -16,4 -25,1 0,0 -10,-3 -10,-3 -10,-4 -16,-8 -28,-8 -15,0 -31,7 -41,19 0,0 -12,20 -12,20 0,0 -12,17 -12,17 -2,5 -5,16 -7,18 -6,6 -14,9 -22,11 -22,6 -53,-3 -74,-10 3,-7 3,-10 8,-17 6,-8 16,-21 16,-31 0,0 3,-1 3,-1 0,0 12,45 12,45 0,0 2,0 2,0 6,-13 11,-15 24,-21 10,-5 20,-2 23,-15 1,-2 1,-4 1,-6 0,0 6,2 6,2 2,1 9,-7 11,-8 8,-7 16,-20 16,-30 0,0 -1,-10 -1,-10 0,0 1,-8 1,-8 0,0 15,2 15,2 5,0 11,0 15,2 5,3 3,10 7,16 6,6 20,-1 27,-3 2,9 7,11 15,13 0,0 -8,-3 -8,-3 3,-3 5,-2 9,-4 5,-2 13,-8 16,-12 6,-8 4,-11 6,-17 z m -104,5 c 0,0 -1,10 -1,10 0,6 1,10 -1,16 -4,14 -13,20 -22,30 0,0 -2,0 -2,0 -3,-3 -3,-3 -7,-4 0,5 -1,10 -4,14 -3,4 -9,4 -14,6 0,0 -18,8 -18,8 -6,4 -7,8 -11,13 0,0 -7,-28 -7,-28 -1,-3 -3,-11 -3,-14 2,-4 10,-9 14,-11 0,0 50,-17 50,-17 4,-2 10,-6 12,-10 4,-5 4,-10 7,-12 1,-1 5,-1 7,-1 z m 83,22 c -7,2 -12,4 -15,-4 0,0 1,-1 1,-1 0,0 14,5 14,5 z m -191,28 c -8,3 -14,2 -20,4 -5,1 -10,4 -15,0 -4,-3 -9,-17 -11,-23 3,0 8,0 10,2 3,2 3,8 11,12 8,5 17,3 25,5 z m -9,-3 c -11,0 -21,-2 -24,-14 8,1 19,8 24,14 z m 101,127 c -3,5 3,12 7,16 9,12 27,24 34,33 -6,-1 -11,-2 -14,4 12,-5 27,1 37,7 11,7 22,15 31,23 13,12 21,22 37,31 0,0 -25,4 -25,4 -18,6 -46,17 -63,19 4,-7 3,-7 5,-14 4,-19 0,-31 -13,-46 -3,-4 -7,-8 -11,-12 0,0 -30,-19 -30,-19 -12,-10 -18,-21 -25,-27 -6,-5 -18,-10 -25,-12 -12,-4 -25,-5 -37,-6 -7,0 -5,0 -13,-1 4,4 6,3 12,3 0,0 14,1 14,1 0,0 11,2 11,2 0,14 -16,31 -27,38 -9,6 -22,12 -23,25 0,6 7,12 10,17 10,12 19,24 27,37 3,6 9,12 7,19 -11,-3 -26,-20 -40,-27 -4,-2 -12,-7 -16,-5 0,0 -1,-6 -1,-6 0,0 3,2 3,2 -1,-9 -8,-16 -13,-23 -2,-2 -7,-7 -7,-10 -1,-3 3,-6 4,-9 3,-3 5,-9 6,-13 0,0 2,-14 2,-14 0,0 7,-27 7,-27 4,-12 11,-23 17,-34 0,0 1,6 1,6 4,-5 2,-11 2,-17 0,-10 4,-25 6,-35 0,0 17,5 17,5 12,3 30,6 42,6 8,0 19,-2 26,-6 5,-2 8,-6 12,-4 2,1 5,7 6,10 3,7 9,28 8,35 -2,5 -8,14 -8,24 z m -129,110 c 0,0 0,1 0,1 0,0 -1,-1 -1,-1 0,0 1,0 1,0 z m 3,2 c 23,10 18,10 37,22 -2,5 -4,3 -12,3 -17,0 -39,5 -55,0 -5,-2 -17,-7 -19,-12 -1,-3 2,-5 4,-6 5,-3 11,-4 17,-4 0,0 28,1 28,1 0,0 0,-4 0,-4 z m 243,6 c 0,0 38,6 38,6 9,1 20,1 28,4 9,4 9,18 1,20 -2,0 -7,-1 -9,-1 0,0 -21,-2 -21,-2 0,0 -37,-2 -37,-2 0,0 -10,1 -10,1 0,0 -17,2 -17,2 -3,0 -8,1 -11,0 -3,-3 -6,-12 0,-17 2,-1 9,-3 12,-4 9,-3 17,-6 26,-7 z m -44,14 c 0,0 0,8 0,8 0,0 -15,-3 -15,-3 0,0 15,-5 15,-5 z m 0,0"
+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/loading/gnome-cool.svgz b/rsvg/tests/fixtures/loading/gnome-cool.svgz
new file mode 100644
index 00000000..7c67afdb
--- /dev/null
+++ b/rsvg/tests/fixtures/loading/gnome-cool.svgz
Binary files differ
diff --git a/rsvg/tests/fixtures/loading/include-fallback.svg b/rsvg/tests/fixtures/loading/include-fallback.svg
new file mode 100644
index 00000000..a471d83d
--- /dev/null
+++ b/rsvg/tests/fixtures/loading/include-fallback.svg
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ width="320" height="240">
+ <text x="10" y="100">
+ <xi:include href="nonexistent.txt" parse="text" encoding="UTF-8">
+ <xi:fallback>Hello fallback!</xi:fallback>
+ </xi:include>
+ </text>
+</svg>
diff --git a/rsvg/tests/fixtures/loading/include-text.svg b/rsvg/tests/fixtures/loading/include-text.svg
new file mode 100644
index 00000000..181a25cb
--- /dev/null
+++ b/rsvg/tests/fixtures/loading/include-text.svg
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ width="320" height="240">
+ <text x="10" y="100"><xi:include href="text.txt" parse="text" encoding="UTF-8"/></text>
+</svg>
diff --git a/rsvg/tests/fixtures/loading/text.txt b/rsvg/tests/fixtures/loading/text.txt
new file mode 100644
index 00000000..802992c4
--- /dev/null
+++ b/rsvg/tests/fixtures/loading/text.txt
@@ -0,0 +1 @@
+Hello world
diff --git a/rsvg/tests/fixtures/primitive_geometries/rect.svg b/rsvg/tests/fixtures/primitive_geometries/rect.svg
new file mode 100644
index 00000000..e0cafe2b
--- /dev/null
+++ b/rsvg/tests/fixtures/primitive_geometries/rect.svg
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100">
+ <rect id="a" x="10" y="20" width="30" height="40"/>
+</svg>
diff --git a/rsvg/tests/fixtures/primitive_geometries/rect.svg.geom b/rsvg/tests/fixtures/primitive_geometries/rect.svg.geom
new file mode 100644
index 00000000..09c7255c
--- /dev/null
+++ b/rsvg/tests/fixtures/primitive_geometries/rect.svg.geom
@@ -0,0 +1,16 @@
+{
+ "#a": {
+ "ink_rect": {
+ "x": 10.0,
+ "y": 20.0,
+ "width": 30.0,
+ "height": 40.0
+ },
+ "logical_rect": {
+ "x": 10.0,
+ "y": 20.0,
+ "width": 30.0,
+ "height": 40.0
+ }
+ }
+}
diff --git a/rsvg/tests/fixtures/primitive_geometries/rect_isolate.svg b/rsvg/tests/fixtures/primitive_geometries/rect_isolate.svg
new file mode 100644
index 00000000..2a43006b
--- /dev/null
+++ b/rsvg/tests/fixtures/primitive_geometries/rect_isolate.svg
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100">
+ <rect id="a" x="10" y="20" width="30" height="40" style="isolation: isolate;"/>
+</svg>
diff --git a/rsvg/tests/fixtures/primitive_geometries/rect_isolate.svg.geom b/rsvg/tests/fixtures/primitive_geometries/rect_isolate.svg.geom
new file mode 100644
index 00000000..09c7255c
--- /dev/null
+++ b/rsvg/tests/fixtures/primitive_geometries/rect_isolate.svg.geom
@@ -0,0 +1,16 @@
+{
+ "#a": {
+ "ink_rect": {
+ "x": 10.0,
+ "y": 20.0,
+ "width": 30.0,
+ "height": 40.0
+ },
+ "logical_rect": {
+ "x": 10.0,
+ "y": 20.0,
+ "width": 30.0,
+ "height": 40.0
+ }
+ }
+}
diff --git a/rsvg/tests/fixtures/primitive_geometries/rect_stroke.svg b/rsvg/tests/fixtures/primitive_geometries/rect_stroke.svg
new file mode 100644
index 00000000..b3b48933
--- /dev/null
+++ b/rsvg/tests/fixtures/primitive_geometries/rect_stroke.svg
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100">
+ <rect id="a" x="10" y="20" width="30" height="40" stroke-width="10" stroke="black"/>
+</svg>
diff --git a/rsvg/tests/fixtures/primitive_geometries/rect_stroke.svg.geom b/rsvg/tests/fixtures/primitive_geometries/rect_stroke.svg.geom
new file mode 100644
index 00000000..1956bd8d
--- /dev/null
+++ b/rsvg/tests/fixtures/primitive_geometries/rect_stroke.svg.geom
@@ -0,0 +1,16 @@
+{
+ "#a": {
+ "ink_rect": {
+ "x": 5.0,
+ "y": 15.0,
+ "width": 40.0,
+ "height": 50.0
+ },
+ "logical_rect": {
+ "x": 10.0,
+ "y": 20.0,
+ "width": 30.0,
+ "height": 40.0
+ }
+ }
+}
diff --git a/rsvg/tests/fixtures/primitive_geometries/rect_stroke_unfilled.svg b/rsvg/tests/fixtures/primitive_geometries/rect_stroke_unfilled.svg
new file mode 100644
index 00000000..6857fc74
--- /dev/null
+++ b/rsvg/tests/fixtures/primitive_geometries/rect_stroke_unfilled.svg
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100">
+ <rect id="a" x="10" y="20" width="30" height="40" stroke-width="10" stroke="black" fill="none"/>
+</svg>
diff --git a/rsvg/tests/fixtures/primitive_geometries/rect_stroke_unfilled.svg.geom b/rsvg/tests/fixtures/primitive_geometries/rect_stroke_unfilled.svg.geom
new file mode 100644
index 00000000..1956bd8d
--- /dev/null
+++ b/rsvg/tests/fixtures/primitive_geometries/rect_stroke_unfilled.svg.geom
@@ -0,0 +1,16 @@
+{
+ "#a": {
+ "ink_rect": {
+ "x": 5.0,
+ "y": 15.0,
+ "width": 40.0,
+ "height": 50.0
+ },
+ "logical_rect": {
+ "x": 10.0,
+ "y": 20.0,
+ "width": 30.0,
+ "height": 40.0
+ }
+ }
+}
diff --git a/rsvg/tests/fixtures/reftests/a-pseudo-class-ref.png b/rsvg/tests/fixtures/reftests/a-pseudo-class-ref.png
new file mode 100644
index 00000000..df06baed
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/a-pseudo-class-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/a-pseudo-class.svg b/rsvg/tests/fixtures/reftests/a-pseudo-class.svg
new file mode 100644
index 00000000..699160d8
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/a-pseudo-class.svg
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ version="1.1"
+ viewBox="0 0 500 600"
+ font-family="sans-serif"
+ font-size="18">
+ <defs>
+ <style>
+ a { fill: red; font-family: Helvetica; font-size:10; }
+ a:link { fill: black; }
+
+ text { fill: inherit; font-family: Helvetica; font-size:10; }
+ </style>
+ </defs>
+
+ <text x="250" y="25" class="head" text-anchor="middle">SVG CSS Tests</text>
+ <g transform="translate(0,50)"><a xlink:href="#foo">
+ <text x="50">a:link</text>
+ <text x="250" class="test">xlink:href</text>
+ </a></g>
+ <g transform="translate(0,150)"><a>
+ <text x="50">a:link</text>
+ <text x="250" class="test">no href, not link</text>
+ </a></g>
+
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/ac-adapter-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/ac-adapter-symbolic-ref.png
new file mode 100644
index 00000000..2033d27c
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/ac-adapter-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/ac-adapter-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/ac-adapter-symbolic.svg
new file mode 100644
index 00000000..cf58656f
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/ac-adapter-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='ac-adapter-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer10' inkscape:cx='19.541358' inkscape:cy='7.91925' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='true' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1375' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='22.627417'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='200px' originy='230px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-41.0002,-447)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-41.0002,-447)'>
+
+ <path inkscape:connector-curvature='0' d='m 49.7795,452.00772 c -0.17789,0.0489 -0.3419,0.14728 -0.46875,0.28125 l -3.03125,3 c -0.2353,0.23073 -0.34458,0.58283 -0.28125,0.90625 l 0,0.8125 0.8125,0 0.1875,0 1.4707,0 -1.1875,1.27358 c -0.21461,0.21931 -0.32135,0.53954 -0.28125,0.84375 -10e-4,0.0312 -10e-4,0.0625 0,0.0937 l 0,0.78125 0.84375,0 0.15625,0 c 0.26386,0.004 0.52791,-0.099 0.71875,-0.28125 l 3,-2.99234 c 0.18369,-0.18976 0.28735,-0.45466 0.28125,-0.71869 0.003,-0.0416 0.003,-0.0834 0,-0.125 l 0,-0.875 -0.84375,0 -0.15625,0 -1.56445,0 1.3125,-1.28125 c 0.21461,-0.21931 0.32135,-0.53954 0.28125,-0.84375 0.001,-0.0312 0.001,-0.0625 0,-0.0937 l 0,-0.78129 -0.84375,0 -0.0937,0 c -0.0208,-6.5e-4 -0.0417,-6.5e-4 -0.0625,0 -0.0829,-0.0103 -0.16709,-0.0103 -0.25,0 z' id='path5600' sodipodi:nodetypes='ccccccccccccccccccccccccccccccc' style='font-size:xx-small;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/>
+ <path inkscape:connector-curvature='0' d='m 46.46875,447 c -0.49202,0 -0.796149,0.22777 -1.03125,0.46875 C 45.202399,447.70973 45,448.02759 45,448.5 l 0,0.5 -1,0 -1,0 0,1 0,12 0,1 1,0 10,0 1,0 0,-1 0,-12 0,-1 -1,0 -1,0 0,-0.375 0,-0.0312 0,-0.0312 c -0.02385,-0.43046 -0.170408,-0.72033 -0.40625,-1 -0.22357,-0.26511 -0.624895,-0.52941 -1.15625,-0.53125 l 0,-0.0312 -0.0625,0 -4.90625,0 z M 47,449 l 4,0 0,1 0,1 1,0 1,0 0,10 -8,0 0,-10 1,0 1,0 0,-1 0,-1 z' id='path5602' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.5;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2.00264454;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-41.0002,-447)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-41.0002,-447)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-41.0002,-447)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-41.0002,-447)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-41.0002,-447)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-41.0002,-447)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-41.0002,-447)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/accessories-calculator-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/accessories-calculator-symbolic-ref.png
new file mode 100644
index 00000000..31a305b5
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/accessories-calculator-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/accessories-calculator-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/accessories-calculator-symbolic.svg
new file mode 100644
index 00000000..047129e1
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/accessories-calculator-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:svg='http://www.w3.org/2000/svg' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' sodipodi:docname='accessories-calculator-symbolic.svg' version='1.1' inkscape:version='0.47 r22583' height='16' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:cy='-346.17776' pagecolor='#555753' borderopacity='1' showborder='false' inkscape:bbox-paths='false' guidetolerance='10' inkscape:window-width='1310' showguides='true' inkscape:object-nodes='true' inkscape:snap-bbox='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:snap-nodes='true' bordercolor='#666666' objecttolerance='10' id='namedview88' showgrid='true' inkscape:window-maximized='0' inkscape:window-x='54' inkscape:snap-global='true' inkscape:window-y='24' gridtolerance='10' inkscape:window-height='690' inkscape:snap-to-guides='true' inkscape:current-layer='layer11' inkscape:zoom='8' inkscape:cx='29.912665' inkscape:snap-grids='true' inkscape:pageopacity='1'>
+ <inkscape:grid spacingx='1px' spacingy='1px' id='grid4866' empspacing='2' enabled='true' type='xygrid' snapvisiblegridlinesonly='true' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:label='status' transform='translate(-62,-381)' inkscape:groupmode='layer' id='layer9' style='display:inline'/>
+ <g inkscape:label='devices' transform='translate(-62,-381)' inkscape:groupmode='layer' id='layer10'/>
+ <g inkscape:label='apps' transform='translate(-62,-381)' inkscape:groupmode='layer' id='layer11'>
+ <g inkscape:label='accessories-calculator' transform='translate(14,-17)' id='g11525'>
+
+ <path d='m 50.03125,398 c -0.542165,0 -1,0.32904 -1,0.9375 l 0,14.125 c 0,0.58636 0.376673,0.9375 1,0.9375 l 13.03125,0 C 63.582568,414 64,413.64886 64,413.0625 l 0,-14.125 C 64,398.39533 63.604665,398 63.0625,398 l -13.03125,0 z M 51,400.03125 l 11.03125,0 0,2.96875 L 51,403 51,400.03125 z M 51.1875,404 l 1.625,0 C 52.9233,404 53,404.0767 53,404.1875 l 0,1.625 C 53,405.9233 52.9233,406 52.8125,406 l -1.625,0 C 51.0767,406 51,405.9233 51,405.8125 l 0,-1.625 C 51,404.0767 51.0767,404 51.1875,404 z m 3,0 1.625,0 C 55.9233,404 56,404.0767 56,404.1875 l 0,1.625 C 56,405.9233 55.9233,406 55.8125,406 l -1.625,0 C 54.0767,406 54,405.9233 54,405.8125 l 0,-1.625 C 54,404.0767 54.0767,404 54.1875,404 z m 3,0 1.625,0 C 58.9233,404 59,404.0767 59,404.1875 l 0,1.625 C 59,405.9233 58.9233,406 58.8125,406 l -1.625,0 C 57.0767,406 57,405.9233 57,405.8125 l 0,-1.625 C 57,404.0767 57.0767,404 57.1875,404 z m 3,0 1.625,0 C 61.9233,404 62,404.0767 62,404.1875 l 0,1.625 C 62,405.9233 61.9233,406 61.8125,406 l -1.625,0 C 60.0767,406 60,405.9233 60,405.8125 l 0,-1.625 C 60,404.0767 60.0767,404 60.1875,404 z m -9,3 1.625,0 C 52.9233,407 53,407.0767 53,407.1875 l 0,1.625 C 53,408.9233 52.9233,409 52.8125,409 l -1.625,0 C 51.0767,409 51,408.9233 51,408.8125 l 0,-1.625 C 51,407.0767 51.0767,407 51.1875,407 z m 3,0 1.625,0 C 55.9233,407 56,407.0767 56,407.1875 l 0,1.625 C 56,408.9233 55.9233,409 55.8125,409 l -1.625,0 C 54.0767,409 54,408.9233 54,408.8125 l 0,-1.625 C 54,407.0767 54.0767,407 54.1875,407 z m 3,0 1.625,0 C 58.9233,407 59,407.0767 59,407.1875 l 0,1.625 C 59,408.9233 58.9233,409 58.8125,409 l -1.625,0 C 57.0767,409 57,408.9233 57,408.8125 l 0,-1.625 C 57,407.0767 57.0767,407 57.1875,407 z m 3,0 1.625,0 C 61.9233,407 62,407.0767 62,407.1875 l 0,1.625 C 62,408.9233 61.9233,409 61.8125,409 l -1.625,0 C 60.0767,409 60,408.9233 60,408.8125 l 0,-1.625 C 60,407.0767 60.0767,407 60.1875,407 z m -9,3 1.625,0 C 52.9233,410 53,410.0767 53,410.1875 l 0,1.625 C 53,411.9233 52.9233,412 52.8125,412 l -1.625,0 C 51.0767,412 51,411.9233 51,411.8125 l 0,-1.625 C 51,410.0767 51.0767,410 51.1875,410 z m 3,0 1.625,0 C 55.9233,410 56,410.0767 56,410.1875 l 0,1.625 C 56,411.9233 55.9233,412 55.8125,412 l -1.625,0 C 54.0767,412 54,411.9233 54,411.8125 l 0,-1.625 C 54,410.0767 54.0767,410 54.1875,410 z m 3,0 1.625,0 C 58.9233,410 59,410.0767 59,410.1875 l 0,1.625 C 59,411.9233 58.9233,412 58.8125,412 l -1.625,0 C 57.0767,412 57,411.9233 57,411.8125 l 0,-1.625 C 57,410.0767 57.0767,410 57.1875,410 z m 3,0 1.625,0 C 61.9233,410 62,410.0767 62,410.1875 l 0,1.625 C 62,411.9233 61.9233,412 61.8125,412 l -1.625,0 C 60.0767,412 60,411.9233 60,411.8125 l 0,-1.625 C 60,410.0767 60.0767,410 60.1875,410 z' id='rect5122-3-5' style='fill:#bebebe;fill-opacity:1;stroke:none;display:inline'/>
+ </g>
+ </g>
+ <g inkscape:label='actions' transform='translate(-62,-381)' inkscape:groupmode='layer' id='layer12'/>
+ <g inkscape:label='places' transform='translate(-62,-381)' inkscape:groupmode='layer' id='layer13'/>
+ <g inkscape:label='mimetypes' transform='translate(-62,-381)' inkscape:groupmode='layer' id='layer14'/>
+ <g inkscape:label='emblems' transform='translate(-62,-381)' inkscape:groupmode='layer' id='layer15'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/accessories-character-map-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/accessories-character-map-symbolic-ref.png
new file mode 100644
index 00000000..8361683a
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/accessories-character-map-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/accessories-character-map-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/accessories-character-map-symbolic.svg
new file mode 100644
index 00000000..c4e8524d
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/accessories-character-map-symbolic.svg
@@ -0,0 +1,33 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' sodipodi:docname='accessories-character-map-symbolic.svg' inkscape:version='0.48.1 r9760' version='1.1' xmlns:svg='http://www.w3.org/2000/svg' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns='http://www.w3.org/2000/svg' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:cc='http://creativecommons.org/ns#' id='svg7384' width='15.999999' height='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:guide-bbox='true' guidetolerance='10' inkscape:snap-to-guides='true' inkscape:object-paths='false' borderopacity='1' inkscape:pageshadow='2' inkscape:window-maximized='0' inkscape:zoom='16' pagecolor='#555753' gridtolerance='10' inkscape:current-layer='layer11' inkscape:window-height='1036' inkscape:snap-others='false' bordercolor='#666666' inkscape:window-x='1957' inkscape:window-y='239' inkscape:window-width='1598' inkscape:bbox-paths='false' inkscape:snap-global='true' inkscape:pageopacity='1' showgrid='true' id='namedview88' showborder='false' inkscape:cx='76.501193' inkscape:cy='7.83128' objecttolerance='10' inkscape:snap-bbox-midpoints='false' inkscape:object-nodes='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-nodes='true' inkscape:snap-grids='true'>
+ <inkscape:grid type='xygrid' enabled='true' visible='true' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' id='grid4866' empspacing='2'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:label='status' id='layer9' style='display:inline' transform='translate(-223.0002,-509)' inkscape:groupmode='layer'/>
+ <g inkscape:label='devices' id='layer10' transform='translate(-223.0002,-509)' inkscape:groupmode='layer'/>
+ <g inkscape:label='apps' id='layer11' transform='translate(-223.0002,-509)' inkscape:groupmode='layer'>
+
+ <path sodipodi:nodetypes='ssssssssssssssssss' d='m 226.70248,510 c -1.53288,0 -2.71875,1.31948 -2.71875,2.84375 l 0,8.34375 c 0,1.52427 1.18587,2.84375 2.71875,2.84375 l 8.57897,0 c 1.53288,0 2.75,-1.31948 2.75,-2.84375 l 0,-8.34375 c 0,-1.52427 -1.21712,-2.84375 -2.75,-2.84375 z m 0.78125,1.03125 c 3.52668,0.25598 5.31717,0.13378 7.04772,0 0.75419,-0.0583 1.53125,0.61584 1.53125,1.4375 l 0,7.375 c 0,0.66541 -0.53119,1.09567 -1.1875,1.1875 -2.83642,0.39685 -4.75306,0.44007 -7.67272,0 -0.65529,-0.0988 -1.1875,-0.52209 -1.1875,-1.1875 l 0,-7.34375 c 0,-0.82166 0.71429,-1.52351 1.46875,-1.46875 z' id='rect11749-5-9-2-7' inkscape:connector-curvature='0' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/>
+ <path d='m 233.53125,514.96875 -2.90625,0.0625 0.0312,1 2.84375,-0.0625 c 0.2071,0.0159 0.33933,0.0958 0.40625,0.15625 0.0669,0.0604 0.125,0.10938 0.125,0.28125 l 0,0.59375 -2.46875,0 -0.0312,0 c -0.45298,-0.0248 -0.89083,0.15721 -1.15625,0.4375 -0.27171,0.28694 -0.39313,0.66382 -0.40625,1.03125 -0.0131,0.36743 0.0835,0.75908 0.34375,1.0625 0.25437,0.29652 0.69445,0.4734 1.15625,0.46875 0.0108,-1.1e-4 0.0204,3.2e-4 0.0312,0 l 2.96875,0 0.5,0 0,-0.5 0.0625,-3.09375 c 0,-0.40265 -0.16191,-0.78234 -0.4375,-1.03125 -0.27559,-0.24891 -0.63259,-0.37798 -1,-0.40625 l -0.0312,0 -0.0312,0 z m -2.0625,3.03125 0.0312,0 0.0312,0 2.46875,0 -0.0312,1 -2.5,0 c -0.22008,0.007 -0.30527,-0.0437 -0.375,-0.125 -0.0697,-0.0813 -0.13026,-0.22753 -0.125,-0.375 0.005,-0.14747 0.0777,-0.29202 0.15625,-0.375 0.0786,-0.083 0.14359,-0.1401 0.34375,-0.125 z' id='path11643' inkscape:connector-curvature='0' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path d='m 234.34375,512.03125 -3,1 0.3125,0.9375 3,-1 -0.3125,-0.9375 z' id='path11645' inkscape:connector-curvature='0' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+ <g inkscape:label='places' id='layer13' transform='translate(-223.0002,-509)' inkscape:groupmode='layer'/>
+ <g inkscape:label='mimetypes' id='layer14' transform='translate(-223.0002,-509)' inkscape:groupmode='layer'/>
+ <g inkscape:label='emblems' id='layer15' style='display:inline' transform='translate(-223.0002,-509)' inkscape:groupmode='layer'/>
+ <g inkscape:label='emotes' id='g71291' transform='translate(-223.0002,-509)' style='display:inline' inkscape:groupmode='layer'/>
+ <g inkscape:label='categories' id='g4953' style='display:inline' transform='translate(-223.0002,-509)' inkscape:groupmode='layer'/>
+ <g inkscape:label='actions' id='layer12' transform='translate(-223.0002,-509)' style='display:inline' inkscape:groupmode='layer'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/accessories-dictionary-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/accessories-dictionary-symbolic-ref.png
new file mode 100644
index 00000000..a870e70e
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/accessories-dictionary-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/accessories-dictionary-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/accessories-dictionary-symbolic.svg
new file mode 100644
index 00000000..369dcab5
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/accessories-dictionary-symbolic.svg
@@ -0,0 +1,34 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='accessories-dictionary-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.3.1 r9886' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer11' inkscape:cx='11.637472' inkscape:cy='-4.86751' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='1600' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='-82.02888px' originy='412.02581px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-323.02908,-629.02581)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-323.02908,-629.02581)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-323.02908,-629.02581)'>
+
+ <path inkscape:connector-curvature='0' d='m 332.59375,630.15625 c -0.56401,0.0886 -1.24007,0.37856 -2,0.78125 -1.54341,-0.84872 -2.74535,-0.88357 -3.75,-0.625 -1.06451,0.27398 -1.92792,0.69645 -3.28125,0.65625 l -0.5,0 0,0.5 0,9.8125 0,0.5 0.5,0 c 1.32176,0 2.46665,-0.61013 3.53125,-0.875 1.0646,-0.26487 1.98255,-0.28705 3.15625,0.75 l 0.3125,0.28125 0.34375,-0.28125 c 1.16691,-1.06335 2.04796,-1.04959 3.09375,-0.78125 1.04579,0.26834 2.17092,0.89735 3.5,0.90625 l 0.53125,0 0,-0.5 0,-9.8125 0,-0.5 -0.5,0 c -1.50737,0 -2.29605,-0.4483 -3.28125,-0.71875 -0.4926,-0.13522 -1.02211,-0.19332 -1.65625,-0.0937 z m 0.125,0.96875 c 0.48192,-0.0797 0.87152,-0.0187 1.28125,0.0937 0.72174,0.19812 1.66877,0.58632 3.03125,0.6875 l 0,8.75 c -0.86575,-0.12953 -1.75721,-0.48724 -2.78125,-0.75 -1.10719,-0.2841 -2.41068,-0.16656 -3.6875,0.8125 -1.28712,-0.95501 -2.60003,-1.05958 -3.71875,-0.78125 -1.03479,0.25745 -1.91592,0.59593 -2.78125,0.71875 l 0,-8.75 c 1.26387,-0.0757 2.23188,-0.41926 3.03125,-0.625 0.91954,-0.23667 1.73509,-0.28477 3.25,0.625 l 0.25,0.125 0.25,-0.125 c 0.81985,-0.46732 1.39308,-0.70154 1.875,-0.78125 z' id='rect2996' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#c3c3c3;fill-opacity:1;stroke:none;stroke-width:0.99999988;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <rect height='9.603281' id='rect3002' style='fill:#c3c3c3;fill-opacity:1;stroke:none' width='1' x='330.06268' y='631.375'/>
+ <path inkscape:connector-curvature='0' d='m 336.03125,631.5 0,11.40625 -10.96875,0.0625 0,-11.4375 -2,0 0,12.4375 0,1.03125 1,-0.0312 12.96875,-0.0625 1,0 0,-1 0,-12.40625 -2,0 z' id='path12413' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#c3c3c3;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 323.9377,643.75 0,-2.1875 4.21949,-1.13061 2.22708,0.59675 2.5031,-0.67071 3.74171,1.00259 0,2.45198 z' id='path13183' style='opacity:0.3;color:#000000;fill:#c3c3c3;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-323.02908,-629.02581)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-323.02908,-629.02581)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-323.02908,-629.02581)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-323.02908,-629.02581)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-323.02908,-629.02581)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-323.02908,-629.02581)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/accessories-text-editor-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/accessories-text-editor-symbolic-ref.png
new file mode 100644
index 00000000..5d93a1db
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/accessories-text-editor-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/accessories-text-editor-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/accessories-text-editor-symbolic.svg
new file mode 100644
index 00000000..b75c9509
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/accessories-text-editor-symbolic.svg
@@ -0,0 +1,39 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg sodipodi:docname='accessories-text-editor-symbolic.svg' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' inkscape:version='0.48.1 r9760' version='1.1' id='svg7384' xmlns:svg='http://www.w3.org/2000/svg' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:cc='http://creativecommons.org/ns#' xmlns='http://www.w3.org/2000/svg' width='16' height='16.008873'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:window-maximized='0' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:object-paths='false' inkscape:zoom='11.313708' showborder='false' showgrid='false' inkscape:snap-global='true' inkscape:current-layer='layer11' inkscape:pageopacity='1' inkscape:pageshadow='2' inkscape:object-nodes='false' bordercolor='#666666' gridtolerance='10' inkscape:snap-bbox-midpoints='false' inkscape:window-height='967' pagecolor='#555753' id='namedview88' showguides='true' inkscape:window-x='2087' inkscape:window-y='282' inkscape:snap-bbox='true' borderopacity='1' inkscape:window-width='1226' inkscape:cx='-20.114158' inkscape:cy='266.82175' inkscape:bbox-paths='false' objecttolerance='10' inkscape:guide-bbox='true' inkscape:snap-to-guides='true' guidetolerance='10' inkscape:snap-grids='true'>
+ <inkscape:grid visible='true' spacingx='1px' spacingy='1px' enabled='true' empspacing='2' snapvisiblegridlinesonly='true' id='grid4866' type='xygrid'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' inkscape:label='status' transform='translate(-163.0002,-508.99113)' id='layer9' style='display:inline'/>
+ <g inkscape:groupmode='layer' inkscape:label='devices' transform='translate(-163.0002,-508.99113)' id='layer10'/>
+ <g inkscape:groupmode='layer' inkscape:label='apps' transform='translate(-163.0002,-508.99113)' id='layer11'>
+ <path d='m 168.40625,515 a 0.50219246,0.50219246 0 1 0 0.0937,1 l 6,0 a 0.50005,0.50005 0 1 0 0,-1 l -6,0 a 0.50005,0.50005 0 0 0 -0.0937,0 z' id='path3601-2' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans' inkscape:connector-curvature='0'/>
+ <path d='m 168.40625,517 a 0.50219246,0.50219246 0 1 0 0.0937,1 l 5,0 a 0.50005,0.50005 0 1 0 0,-1 l -5,0 a 0.50005,0.50005 0 0 0 -0.0937,0 z' id='path3601-2-3' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans' inkscape:connector-curvature='0'/>
+ <path d='m 168.40625,519 a 0.50219246,0.50219246 0 1 0 0.0937,1 l 6,0 a 0.50005,0.50005 0 1 0 0,-1 l -6,0 a 0.50005,0.50005 0 0 0 -0.0937,0 z' id='path3601-2-3-2' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans' inkscape:connector-curvature='0'/>
+ <path d='m 168.40625,521 a 0.50219246,0.50219246 0 1 0 0.0937,1 l 3,0 a 0.50005,0.50005 0 1 0 0,-1 l -3,0 a 0.50005,0.50005 0 0 0 -0.0937,0 z' id='path3601-2-3-3' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans' inkscape:connector-curvature='0'/>
+ <path d='m 167.0002,510 c -1.0907,0 -2,0.9093 -2,2 l 0,11 c 0,1.0907 0.9093,2 2,2 l 9,0 c 1.0907,0 2,-0.9093 2,-2 l 0,-11 c 0,-1.0907 -0.9093,-2 -2,-2 0,4.33333 0,8.66667 0,13 l -9,0 c 0,-4.33333 0,-8.66667 0,-13 z' sodipodi:nodetypes='csssssscccc' id='rect10788' inkscape:connector-curvature='0' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path d='M 168.40625,509 A 0.50005,0.50005 0 0 0 168,509.5 l 0,3 a 0.50005,0.50005 0 1 0 1,0 l 0,-3 a 0.50005,0.50005 0 0 0 -0.59375,-0.5 z' id='path3601-2-3-3-9' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans' inkscape:connector-curvature='0'/>
+ <path d='M 170.40625,509 A 0.50005,0.50005 0 0 0 170,509.5 l 0,3 a 0.50005,0.50005 0 1 0 1,0 l 0,-3 a 0.50005,0.50005 0 0 0 -0.59375,-0.5 z' id='path3601-2-3-3-9-3' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans' inkscape:connector-curvature='0'/>
+ <path d='M 172.40625,509 A 0.50005,0.50005 0 0 0 172,509.5 l 0,3 a 0.50005,0.50005 0 1 0 1,0 l 0,-3 a 0.50005,0.50005 0 0 0 -0.59375,-0.5 z' id='path3601-2-3-3-9-3-3' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans' inkscape:connector-curvature='0'/>
+ <path d='M 174.40625,509 A 0.50005,0.50005 0 0 0 174,509.5 l 0,3 a 0.50005,0.50005 0 1 0 1,0 l 0,-3 a 0.50005,0.50005 0 0 0 -0.59375,-0.5 z' id='path3601-2-3-3-9-3-3-7' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans' inkscape:connector-curvature='0'/>
+
+ </g>
+ <g inkscape:groupmode='layer' inkscape:label='places' transform='translate(-163.0002,-508.99113)' id='layer13'/>
+ <g inkscape:groupmode='layer' inkscape:label='mimetypes' transform='translate(-163.0002,-508.99113)' id='layer14'/>
+ <g inkscape:groupmode='layer' inkscape:label='emblems' transform='translate(-163.0002,-508.99113)' id='layer15' style='display:inline'/>
+ <g inkscape:groupmode='layer' inkscape:label='emotes' transform='translate(-163.0002,-508.99113)' id='g71291' style='display:inline'/>
+ <g inkscape:groupmode='layer' inkscape:label='categories' transform='translate(-163.0002,-508.99113)' id='g4953' style='display:inline'/>
+ <g inkscape:groupmode='layer' inkscape:label='actions' transform='translate(-163.0002,-508.99113)' id='layer12' style='display:inline'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/action-unavailable-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/action-unavailable-symbolic-ref.png
new file mode 100644
index 00000000..f736b96b
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/action-unavailable-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/action-unavailable-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/action-unavailable-symbolic.svg
new file mode 100644
index 00000000..593a40f8
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/action-unavailable-symbolic.svg
@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ id="svg7384"
+ sodipodi:docname="action-unavailable-symbolic.svg"
+ version="1.1"
+ inkscape:version="0.92pre2 r"
+ height="16"
+ width="16"
+ viewBox="0 0 16 16">
+ <metadata
+ id="metadata90">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview
+ inkscape:cy="3.5483891"
+ pagecolor="#555753"
+ borderopacity="1"
+ showborder="false"
+ inkscape:bbox-paths="false"
+ guidetolerance="10"
+ inkscape:object-paths="true"
+ inkscape:window-width="1920"
+ showguides="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-bbox="true"
+ inkscape:pageshadow="2"
+ inkscape:guide-bbox="true"
+ inkscape:snap-nodes="false"
+ bordercolor="#666666"
+ objecttolerance="10"
+ id="namedview88"
+ showgrid="true"
+ inkscape:window-maximized="1"
+ inkscape:window-x="0"
+ inkscape:snap-global="true"
+ inkscape:window-y="27"
+ gridtolerance="10"
+ inkscape:window-height="1016"
+ inkscape:snap-to-guides="true"
+ inkscape:current-layer="layer12"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:zoom="1"
+ inkscape:cx="7.6614848"
+ inkscape:snap-grids="true"
+ inkscape:pageopacity="1">
+ <inkscape:grid
+ spacingx="1px"
+ spacingy="1px"
+ id="grid4866"
+ empspacing="2"
+ enabled="true"
+ type="xygrid"
+ snapvisiblegridlinesonly="true"
+ visible="true" />
+ </sodipodi:namedview>
+ <title
+ id="title9167">Gnome Symbolic Icon Theme</title>
+ <defs
+ id="defs7386" />
+ <g
+ inkscape:label="status"
+ transform="translate(-219.99995,-606)"
+ inkscape:groupmode="layer"
+ id="layer9"
+ style="display:inline" />
+ <g
+ inkscape:label="devices"
+ transform="translate(-219.99995,-606)"
+ inkscape:groupmode="layer"
+ id="layer10" />
+ <g
+ inkscape:label="apps"
+ transform="translate(-219.99995,-606)"
+ inkscape:groupmode="layer"
+ id="layer11" />
+ <g
+ inkscape:label="actions"
+ transform="translate(-219.99995,-606)"
+ inkscape:groupmode="layer"
+ id="layer12">
+ <path
+ inkscape:connector-curvature="0"
+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:normal;font-family:Sans;-inkscape-font-specification:Sans;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;enable-background:accumulate"
+ d="m 227.99995,607 c -3.86295,0 -7,3.13704 -7,7 0,3.86295 3.13705,7 7,7 3.86295,0 7,-3.13705 7,-7 0,-3.86296 -3.13705,-7 -7,-7 z m 0,2 c 1.01943,0 1.95898,0.28763 2.75,0.8125 l -6.9375,6.9375 c -0.52487,-0.79102 -0.8125,-1.73057 -0.8125,-2.75 0,-2.75926 2.24075,-5 5,-5 z m 4.1875,2.25 c 0.52487,0.79102 0.8125,1.73057 0.8125,2.75 0,2.75925 -2.24075,5 -5,5 -1.01943,0 -1.95898,-0.28763 -2.75,-0.8125 z"
+ id="path4992" />
+ </g>
+ <g
+ inkscape:label="places"
+ transform="translate(-219.99995,-606)"
+ inkscape:groupmode="layer"
+ id="layer13" />
+ <g
+ inkscape:label="mimetypes"
+ transform="translate(-219.99995,-606)"
+ inkscape:groupmode="layer"
+ id="layer14" />
+ <g
+ inkscape:label="emblems"
+ transform="translate(-219.99995,-606)"
+ inkscape:groupmode="layer"
+ id="layer15"
+ style="display:inline" />
+ <g
+ inkscape:label="categories"
+ transform="translate(-219.99995,-606)"
+ inkscape:groupmode="layer"
+ id="g4953"
+ style="display:inline" />
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/address-book-new-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/address-book-new-symbolic-ref.png
new file mode 100644
index 00000000..20812fea
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/address-book-new-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/address-book-new-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/address-book-new-symbolic.svg
new file mode 100644
index 00000000..8da95bde
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/address-book-new-symbolic.svg
@@ -0,0 +1,40 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='address-book-new-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.91 r13725' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='246.48513' inkscape:cy='539.34602' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-20' originy='650' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <inkscape:path-effect effect='spiro' id='path-effect35671-1' is_visible='true'/>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-261.0002,-867)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-261.0002,-867)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-261.0002,-867)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-261.0002,-867)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-261.0002,-867)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-261.0002,-867)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-261.0002,-867)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-261.0002,-867)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-261.0002,-867)'>
+ <path inkscape:connector-curvature='0' d='m 264.1877,868 c -1.09069,0 -1.99999,0.90929 -2,2 l 7.8125,0 0,-2 -5.8125,0 z m 8.8125,6 0,7 -10.8125,0 c 0,1.0907 0.90929,2 2,2 l 8.8125,0 c 1.09069,0 2,-0.90929 2,-2 l 0,-7 -2,0 z' id='rect10788-4-8' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:Sans;-inkscape-font-specification:Sans;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;enable-background:new'/>
+ <path inkscape:connector-curvature='0' d='m 261.68945,879 a 0.50005,0.50005 0 1 0 0,1 l 1.81055,0 a 0.50005,0.50005 0 1 0 0,-1 l -1.81055,0 z' id='path3601-2-3-3-9-34-9' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 261.68945,877 a 0.50005,0.50005 0 1 0 0,1 l 1.81055,0 a 0.50005,0.50005 0 1 0 0,-1 l -1.81055,0 z' id='path3601-2-3-3-9-3-0-1' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 261.68945,875 a 0.50005,0.50005 0 1 0 0,1 l 1.81055,0 a 0.50005,0.50005 0 1 0 0,-1 l -1.81055,0 z' id='path3601-2-3-3-9-3-3-4-5' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 261.68945,873 a 0.50005,0.50005 0 1 0 0,1 l 1.81055,0 a 0.50005,0.50005 0 1 0 0,-1 l -1.81055,0 z' id='path3601-2-3-3-9-3-3-7-0-8' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+
+ <path inkscape:connector-curvature='0' d='m 261.68945,871 a 0.50005,0.50005 0 1 0 0,1 l 1.81055,0 a 0.50005,0.50005 0 1 0 0,-1 l -1.81055,0 z' id='path35635-8' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 268.0002,877 c 0.32762,0.0664 0.66579,0.007 1,0 0.33355,-0.007 0.66868,0.0392 1,0 0.62377,-0.0737 1.19577,-0.46158 1.52274,-0.99787 0.32697,-0.53629 0.41177,-1.20749 0.26,-1.81699 -0.15177,-0.60949 -0.53175,-1.15378 -1.03205,-1.53354 -0.5003,-0.37976 -1.11579,-0.59773 -1.74158,-0.6516 -0.90784,-0.0782 -1.84201,0.19208 -2.56548,0.74605 -0.72346,0.55397 -1.22846,1.38688 -1.38113,2.2852 -0.10756,0.63289 -0.0431,1.29417 0.18467,1.89437 0.22777,0.60021 0.61825,1.13777 1.11861,1.53996 0.50037,0.40219 1.10931,0.66796 1.74444,0.76136 0.63514,0.0934 1.29481,0.0142 1.88978,-0.22694 l 0,-1 c -0.45327,0.29856 -0.99976,0.45332 -1.54228,0.43675 -0.54251,-0.0166 -1.07854,-0.20438 -1.51276,-0.53004 -0.43421,-0.32566 -0.7646,-0.78766 -0.93241,-1.30383 -0.1678,-0.51618 -0.17225,-1.08414 -0.0125,-1.60288 0.19034,-0.61825 0.6121,-1.15862 1.15428,-1.51147 0.54219,-0.35284 1.19956,-0.51929 1.84572,-0.48853 0.53715,0.0256 1.08173,0.19329 1.48295,0.55136 0.20061,0.17903 0.36214,0.40374 0.45639,0.65556 0.0943,0.25182 0.11974,0.53077 0.0607,0.79308 -0.0541,0.24043 -0.17919,0.46445 -0.35541,0.63674 -0.17622,0.17229 -0.403,0.29225 -0.64459,0.34096 l 0,-0.9777 c -0.1194,-0.2972 -0.32939,-0.55729 -0.59474,-0.73665 -0.26535,-0.17936 -0.58498,-0.27726 -0.90526,-0.27726 -0.32028,0 -0.63991,0.0979 -0.90526,0.27726 -0.26535,0.17936 -0.47534,0.43945 -0.59474,0.73665 -0.15846,0.39444 -0.15178,0.85562 0.0334,1.23826 0.18515,0.38263 0.55001,0.67735 0.96663,0.76174 z m 1.03589,-0.97703 c -0.10348,0.10419 -0.24042,0.17463 -0.38536,0.19821 -0.14494,0.0236 -0.29714,1.9e-4 -0.42831,-0.0658 -0.13117,-0.066 -0.24063,-0.17433 -0.30804,-0.30479 -0.0674,-0.13046 -0.0924,-0.28241 -0.0704,-0.42759 0.0188,-0.1237 0.0714,-0.2421 0.15056,-0.33896 0.0792,-0.0969 0.18478,-0.17193 0.30228,-0.21491 0.11751,-0.043 0.24661,-0.0538 0.36961,-0.0309 0.123,0.0229 0.23958,0.0794 0.33375,0.16178' id='path35642-5' sodipodi:nodetypes='zcsssccsssccszcsc' inkscape:original-d='m 268.0002,877 c 0.45879,0.28355 0.66667,0 1,0 0.33333,0 1,1.78808 1,0 0,-0.87163 0.9828,-5 -0.99089,-5 -2.47138,0 -3.94661,1.3622 -3.94661,3.03125 0,2.07735 1.91323,4.19119 4.9375,3.96875 l 0,-1 c -2.44932,-0.97013 -2.77718,-3.40273 -4,-3 -1.21207,0.39919 1.21192,-2 3,-2 1.62843,0 2.02184,1.33811 2,2 -0.0402,1.21795 -0.5,0.9777 -1,0.9777 l 0,-0.9777 c -3.96875,0.0223 -3.40531,-0.52743 -3,0 0.53128,0.69137 0.54121,1.71645 1,2 z m 1.03589,-0.97703 c -0.91757,0 -1.25244,-0.3 -1.19209,-0.6 0.0603,-0.3 0.49285,-0.42297 1.1562,-0.42297' inkscape:path-effect='#path-effect35671-1' style='color:#000000;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Cantarell;-inkscape-font-specification:&apos;Cantarell Bold&apos;;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:0px;word-spacing:0px;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;visibility:visible;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none'/>
+ <path inkscape:connector-curvature='0' d='m 273.0002,867.01972 0,1.99673 -2,0 0,1.99673 2,0 0,1.99674 2,0 0,-1.99674 2,0 0,-1.99673 -2,0 0,-1.99673 -2,0 z' id='path13075-5' style='display:inline;fill:#bebebe;fill-opacity:1;stroke:none'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/airplane-mode-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/airplane-mode-symbolic-ref.png
new file mode 100644
index 00000000..32fd53f1
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/airplane-mode-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/airplane-mode-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/airplane-mode-symbolic.svg
new file mode 100644
index 00000000..5d6e81e2
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/airplane-mode-symbolic.svg
@@ -0,0 +1,35 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='airplane-mode-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.92pre2 r' viewBox='0 0 16 16' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer14' inkscape:cx='19.645986' inkscape:cy='-0.072312' inkscape:document-units='px' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1016' inkscape:window-maximized='1' inkscape:window-width='1920' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='80.090326' originy='100' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-160.90987,-317)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-160.90987,-317)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-160.90987,-317)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-160.90987,-317)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-160.90987,-317)'>
+
+ <path inkscape:connector-curvature='0' d='m 167.40645,318 c -0.79399,9.7e-4 -0.78072,0.0333 -0.53125,1.03125 L 168.5002,324 h -4.5 l -1.21875,-1.78125 c -0.13926,-0.20883 -0.1227,-0.21873 -0.34375,-0.21875 h -0.21875 c -0.42773,0 -0.28125,0.4375 -0.28125,0.4375 l 0.28125,2.5625 -0.28125,2.5625 c 0,0 -0.13986,0.43749 0.25,0.4375 h 0.25 c 0.21159,0 0.20422,-0.009 0.34375,-0.21875 L 164.0002,326 h 4.5 l -1.625,4.9375 c -0.26171,1.04691 -0.2647,1.06251 0.53125,1.0625 0.43199,0 0.43388,-0.0117 0.71875,-0.5 l 3.6875,-5.5 h 3.09375 c 0.554,0 1,-0.446 1,-1 0,-0.554 -0.446,-1 -1,-1 h -3.09375 l -3.6875,-5.5 c -0.2665,-0.45685 -0.28331,-0.49822 -0.65625,-0.5 z' id='path6273' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-160.90987,-317)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-160.90987,-317)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-160.90987,-317)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-160.90987,-317)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/alarm-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/alarm-symbolic-ref.png
new file mode 100644
index 00000000..20a88ed4
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/alarm-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/alarm-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/alarm-symbolic.svg
new file mode 100644
index 00000000..ba20b97e
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/alarm-symbolic.svg
@@ -0,0 +1,35 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='alarm-symbolic.svg' height='16.072405' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.2 r9819' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-paths='false' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='14.95667' inkscape:cy='-1.2949847' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#555753' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1381' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='1600' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-201.0002,-397)'>
+
+ <path inkscape:connector-curvature='0' d='M 208.40625,403 A 0.50005,0.50005 0 0 0 208,403.5 l 0,2.5 -1.5,0 a 0.50005,0.50005 0 1 0 0,1 l 2,0 a 0.50005,0.50005 0 0 0 0.5,-0.5 l 0,-3 a 0.50005,0.50005 0 0 0 -0.59375,-0.5 z' id='path59045' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 208.47468,400.06252 c -3.5601,0 -6.44332,2.91421 -6.44332,6.4743 0,3.56009 2.88322,6.4743 6.44332,6.4743 3.56009,0 6.4743,-2.91421 6.4743,-6.4743 0,-3.56009 -2.91421,-6.4743 -6.4743,-6.4743 z m 0,1.98256 c 2.48864,0 4.49174,2.0031 4.49174,4.49174 0,2.48864 -2.0031,4.49174 -4.49174,4.49174 -2.48864,0 -4.46076,-2.0031 -4.46076,-4.49174 0,-2.48864 1.97212,-4.49174 4.46076,-4.49174 z' id='path59049' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 205.28145,398 c -1.80618,0 -3.28125,1.47507 -3.28125,3.28125 0,0.40491 0.0842,0.76711 0.21875,1.125 1.20599,-1.82226 3.18396,-3.10226 5.46875,-3.34375 C 207.08999,398.41251 206.2341,398 205.28145,398 z m 6.4375,0 c -0.95265,0 -1.80854,0.41251 -2.40625,1.0625 2.28729,0.25122 4.27051,1.54101 5.46875,3.375 0.14145,-0.3658 0.21875,-0.74054 0.21875,-1.15625 0,-1.80618 -1.47508,-3.28125 -3.28125,-3.28125 z' id='path59561' style='color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 204.90625,409.90625 a 1.0001,1.0001 0 0 0 -0.46875,0.28125 l -1.125,1.09375 a 1.0001,1.0001 0 1 0 1.375,1.4375 l 1.125,-1.09375 a 1.0001,1.0001 0 0 0 -0.90625,-1.71875 z' id='path59570' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 211.9375,410 a 1.0001,1.0001 0 0 0 -0.59375,1.65625 l 0.90625,1 a 1.0001,1.0001 0 1 0 1.5,-1.3125 l -0.90625,-1 A 1.0001,1.0001 0 0 0 211.9375,410 z' id='path59572' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-201.0002,-397)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-201.0002,-397)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-201.0002,-397)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-201.0002,-397)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-201.0002,-397)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-201.0002,-397)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-201.0002,-397)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-201.0002,-397)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/applets-screenshooter-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/applets-screenshooter-symbolic-ref.png
new file mode 100644
index 00000000..328f3c2f
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/applets-screenshooter-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/applets-screenshooter-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/applets-screenshooter-symbolic.svg
new file mode 100644
index 00000000..aa645344
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/applets-screenshooter-symbolic.svg
@@ -0,0 +1,33 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg sodipodi:docname='applets-screenshooter-symbolic.svg' xmlns:cc='http://creativecommons.org/ns#' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:svg='http://www.w3.org/2000/svg' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns='http://www.w3.org/2000/svg' width='16' xmlns:dc='http://purl.org/dc/elements/1.1/' height='16.000002' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' version='1.1' inkscape:version='0.48.1 r9760'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:snap-others='false' inkscape:cx='335.84678' inkscape:cy='51.323752' inkscape:window-x='2082' inkscape:window-y='102' inkscape:zoom='1' inkscape:window-height='1162' bordercolor='#666666' pagecolor='#555753' guidetolerance='10' inkscape:object-nodes='true' inkscape:guide-bbox='true' inkscape:snap-bbox='true' borderopacity='1' objecttolerance='10' inkscape:pageshadow='2' inkscape:object-paths='true' inkscape:window-maximized='0' gridtolerance='10' showgrid='false' inkscape:snap-nodes='true' inkscape:bbox-paths='false' inkscape:snap-to-guides='true' id='namedview88' showguides='true' inkscape:snap-global='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-grids='true' inkscape:pageopacity='1' showborder='false' inkscape:current-layer='layer11' inkscape:window-width='1598'>
+ <inkscape:grid empspacing='2' visible='true' type='xygrid' enabled='true' spacingx='1px' spacingy='1px' id='grid4866' snapvisiblegridlinesonly='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:label='status' transform='translate(-162.0002,-530)' style='display:inline' inkscape:groupmode='layer' id='layer9'/>
+ <g inkscape:label='devices' transform='translate(-162.0002,-530)' inkscape:groupmode='layer' id='layer10'/>
+ <g inkscape:label='apps' transform='translate(-162.0002,-530)' inkscape:groupmode='layer' id='layer11'>
+ <path sodipodi:nodetypes='ssccsssccssss' d='m 176.0002,530 c 1.19992,0 2,0.7984 2,2 l 0,4 -2,0 0,-3.75 c 0,-0.1238 -0.0566,-0.25 -0.1875,-0.25 l -11.625,0 c -0.1309,0 -0.1875,0.1262 -0.1875,0.25 l 0,11.75 c -1.19992,0 -2,-0.9234 -2,-2.125 l 0,-9.875 c 0,-1.2016 0.80008,-2 2,-2 z' inkscape:connector-curvature='0' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' id='rect5238-9'/>
+ <path sodipodi:nodetypes='scccsssssssccsssssss' d='m 169.2502,536 c -0.47139,0 -0.74314,0.54175 -0.75,1 l 0,1 -2.5,0 c -0.46865,0.0651 -1,0.5417 -1,1 l 0,6 c 0,0.4583 0.52685,1 1,1 l 10,0 c 0.47315,0 1,-0.5417 1,-1 l 0,-6 c 0,-0.4583 -0.52685,-1 -1,-1 l -2.5,0 0,-1 c 0,-0.4583 -0.34111,-1 -0.8125,-1 z m 1.75,3 c 1.65685,0 3,1.34315 3,3 0,1.65685 -1.34315,3 -3,3 -1.65685,0 -3,-1.34315 -3,-3 0,-1.65685 1.34315,-3 3,-3 z' inkscape:connector-curvature='0' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' id='rect5238-8'/>
+ <path sodipodi:cx='-4.722775' sodipodi:cy='10.335032' sodipodi:rx='0.96899819' sodipodi:ry='1.335031' d='m -3.7537768,10.335032 a 0.96899819,1.335031 0 1 1 -1.9379964,0 0.96899819,1.335031 0 1 1 1.9379964,0 z' sodipodi:type='arc' transform='matrix(2.0639875,0,0,1.4980924,180.74795,526.51717)' style='fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none' id='path2998'/>
+
+ </g>
+ <g inkscape:label='places' transform='translate(-162.0002,-530)' inkscape:groupmode='layer' id='layer13'/>
+ <g inkscape:label='mimetypes' transform='translate(-162.0002,-530)' inkscape:groupmode='layer' id='layer14'/>
+ <g inkscape:label='emblems' transform='translate(-162.0002,-530)' style='display:inline' inkscape:groupmode='layer' id='layer15'/>
+ <g inkscape:label='emotes' transform='translate(-162.0002,-530)' style='display:inline' inkscape:groupmode='layer' id='g71291'/>
+ <g inkscape:label='categories' transform='translate(-162.0002,-530)' style='display:inline' inkscape:groupmode='layer' id='g4953'/>
+ <g inkscape:label='actions' transform='translate(-162.0002,-530)' style='display:inline' inkscape:groupmode='layer' id='layer12'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/application-certificate-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/application-certificate-symbolic-ref.png
new file mode 100644
index 00000000..ad172bb4
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/application-certificate-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/application-certificate-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/application-certificate-symbolic.svg
new file mode 100644
index 00000000..0b930665
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/application-certificate-symbolic.svg
@@ -0,0 +1,33 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='application-certificate-symbolic.svg' width='16' inkscape:version='0.48.1 r9760' version='1.1' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' height='16' id='svg7384' xmlns:svg='http://www.w3.org/2000/svg' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:cc='http://creativecommons.org/ns#' xmlns='http://www.w3.org/2000/svg' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:pageopacity='1' inkscape:snap-to-guides='true' borderopacity='1' inkscape:window-maximized='0' inkscape:snap-bbox='true' inkscape:object-nodes='false' inkscape:object-paths='false' inkscape:window-width='1226' pagecolor='#555753' gridtolerance='10' inkscape:pageshadow='2' bordercolor='#666666' inkscape:current-layer='layer14' showguides='true' id='namedview88' showborder='false' inkscape:bbox-paths='false' inkscape:snap-global='true' inkscape:window-x='2804' inkscape:window-y='77' inkscape:snap-nodes='true' inkscape:guide-bbox='true' inkscape:snap-grids='true' objecttolerance='10' inkscape:cx='-446.32058' inkscape:cy='-470.01287' inkscape:snap-others='false' showgrid='false' inkscape:snap-bbox-midpoints='false' guidetolerance='10' inkscape:zoom='1' inkscape:window-height='967'>
+ <inkscape:grid enabled='true' type='xygrid' id='grid4866' snapvisiblegridlinesonly='true' visible='true' empspacing='2' spacingx='1px' spacingy='1px'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:label='status' id='layer9' style='display:inline' inkscape:groupmode='layer' transform='translate(-502.0002,-299.99988)'/>
+ <g inkscape:label='devices' id='layer10' inkscape:groupmode='layer' transform='translate(-502.0002,-299.99988)'/>
+ <g inkscape:label='apps' id='layer11' inkscape:groupmode='layer' transform='translate(-502.0002,-299.99988)'/>
+ <g inkscape:label='places' id='layer13' inkscape:groupmode='layer' transform='translate(-502.0002,-299.99988)'/>
+ <g inkscape:label='mimetypes' id='layer14' inkscape:groupmode='layer' transform='translate(-502.0002,-299.99988)'>
+ <path sodipodi:nodetypes='ccccccccccccccccc' d='m 504.0002,301.99988 c -0.52358,5e-5 -0.99995,0.47642 -1,1 l 0,10 c 5e-5,0.52358 0.47642,0.99995 1,1 l 3.00009,0 0,-2 c 0,0 -1.99293,-0.0211 -2.00009,10e-5 l 0,-7.99998 10.99999,0 6.6e-4,7.99988 -1.00055,0 0,2 2.0006,0 c 0.5193,0 0.9993,-0.43501 0.9993,-0.99988 l 0,-10 c 7.5e-4,-0.46663 -0.43709,-1.00012 -1,-0.9999 z' id='path1234-2' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.99999988;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans' inkscape:connector-curvature='0'/>
+ <path d='m 513.99939,308.06279 a 3,3 0 0 1 -5.99868,0 3,3 0 1 1 5.99868,0 z' id='path4136-5' style='fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none' inkscape:connector-curvature='0'/>
+ <path sodipodi:nodetypes='ccccccc' d='m 510.00036,308.99988 -2.00024,7 1,0 2.00018,-2 1.99982,2 1,0 -1.99987,-7' id='path3655-4-1' style='fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none' inkscape:connector-curvature='0'/>
+
+ </g>
+ <g inkscape:label='emblems' id='layer15' style='display:inline' inkscape:groupmode='layer' transform='translate(-502.0002,-299.99988)'/>
+ <g inkscape:label='emotes' id='g71291' style='display:inline' inkscape:groupmode='layer' transform='translate(-502.0002,-299.99988)'/>
+ <g inkscape:label='categories' id='g4953' style='display:inline' inkscape:groupmode='layer' transform='translate(-502.0002,-299.99988)'/>
+ <g inkscape:label='actions' id='layer12' style='display:inline' inkscape:groupmode='layer' transform='translate(-502.0002,-299.99988)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/application-exit-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/application-exit-symbolic-ref.png
new file mode 100644
index 00000000..1f25522b
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/application-exit-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/application-exit-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/application-exit-symbolic.svg
new file mode 100644
index 00000000..4cb5db36
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/application-exit-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='application-exit-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.5 r10040' width='16.000002' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='20.082557' inkscape:cy='-1.27197' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1375' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='5.6568542'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='1.6357422e-06px' originy='590px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-241.0002,-807)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-241.0002,-807)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-241.0002,-807)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-241.0002,-807)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-241.0002,-807)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-241.0002,-807)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-241.0002,-807)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-241.0002,-807)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-241.0002,-807)'>
+
+ <path inkscape:connector-curvature='0' d='m 257.0002,812 0,1 c 0,0.25689 -0.12983,0.52846 -0.3125,0.71875 L 255.40645,815 l 1.28125,1.28125 c 0.18267,0.19029 0.3125,0.46186 0.3125,0.71875 l 0,1 -1,0 c -0.30945,0 -0.55232,-0.0903 -0.75,-0.28125 L 252.59395,815 255.2502,812.28125 C 255.44788,812.0903 255.69075,812 256.0002,812 l 1,0 z' id='path26772' sodipodi:nodetypes='ccccccccccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/>
+ <path inkscape:connector-curvature='0' d='m 242.0002,808 0,14 10,0 0,-14 -10,0 z m 7,2 1,0 0,10 -6,0 5,-3 0,-7 z m -3,2 2,0 0,1 -2,0 0,-1 z' id='rect26776' style='color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/application-rss-xml-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/application-rss-xml-symbolic-ref.png
new file mode 100644
index 00000000..0d6505f9
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/application-rss-xml-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/application-rss-xml-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/application-rss-xml-symbolic.svg
new file mode 100644
index 00000000..67614489
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/application-rss-xml-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='application-rss+xml-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.3.1 r9886' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-paths='false' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer14' inkscape:cx='27.01134' inkscape:cy='1.367038' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='709' inkscape:window-maximized='1' inkscape:window-width='1366' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='-319.9998px' originy='84.00012px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-561,-301.00012)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-561,-301.00012)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-561,-301.00012)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-561,-301.00012)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-561,-301.00012)'>
+
+ <path sodipodi:cx='323.0625' sodipodi:cy='97.1875' d='m 325.0625,97.1875 a 2,3.236068 0 1 1 -4,0 2,3.236068 0 1 1 4,0 z' id='path4983' sodipodi:rx='2' sodipodi:ry='3.236068' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.69602728;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' transform='matrix(1.0000007,0,0,0.61803426,241.93747,252.93479)' sodipodi:type='arc'/>
+ <path inkscape:connector-curvature='0' d='m 563.0002,303 0,1 c 0,0.55016 0.45347,1 1,1 4.97056,0 9,4.02944 9,9 0,0.55016 0.45347,1 1,1 l 1,0 0,-1 c 0,-6.07513 -4.92487,-11 -11,-11 l -1,0 z m 0,4 0,1 c 0,0.55016 0.45347,1 1,1 2.76143,0 5,2.23857 5,5 0,0.55016 0.45347,1 1,1 l 1,0 0,-1 c 0,-3.866 -3.134,-7 -7,-7 l -1,0 z' id='path5814' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.33333492;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-561,-301.00012)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-561,-301.00012)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-561,-301.00012)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-561,-301.00012)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/application-x-addon-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/application-x-addon-symbolic-ref.png
new file mode 100644
index 00000000..4bd0bc3d
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/application-x-addon-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/application-x-addon-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/application-x-addon-symbolic.svg
new file mode 100644
index 00000000..d2609c52
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/application-x-addon-symbolic.svg
@@ -0,0 +1,35 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='application-x-addon-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.91 r13725' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer14' inkscape:cx='-489.47666' inkscape:cy='-562.50047' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-360' originy='104' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-601.0002,-321)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-601.0002,-321)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-601.0002,-321)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-601.0002,-321)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-601.0002,-321)'>
+ <path inkscape:connector-curvature='0' d='m 607.50022,322 c -0.831,0 -1.5,0.669 -1.5,1.5 l 0,1.5 -3,0 c -0.554,0 -1,0.446 -1,1 l 0,3 1.5,0 c 0.831,0 1.5,0.669 1.5,1.5 0,0.831 -0.669,1.5 -1.5,1.5 l -1.5,0 0,3 c 0,0.554 0.446,1 1,1 l 3,0 0,-1.5 c 0,-0.831 0.669,-1.5 1.5,-1.5 0.831,0 1.5,0.669 1.5,1.5 l 0,1.5 3,0 c 0.554,0 1,-0.446 1,-1 l 0,-3 1.5,0 c 0.831,0 1.5,-0.669 1.5,-1.5 0,-0.831 -0.669,-1.5 -1.5,-1.5 l -1.5,0 0,-3 c 0,-0.554 -0.446,-1 -1,-1 l -3,0 0,-1.5 c 0,-0.831 -0.669,-1.5 -1.5,-1.5 z' id='rect6917' style='color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.19753063;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new'/>
+
+ </g>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-601.0002,-321)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-601.0002,-321)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-601.0002,-321)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-601.0002,-321)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/application-x-appliance-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/application-x-appliance-symbolic-ref.png
new file mode 100644
index 00000000..035caca3
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/application-x-appliance-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/application-x-appliance-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/application-x-appliance-symbolic.svg
new file mode 100644
index 00000000..20144e77
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/application-x-appliance-symbolic.svg
@@ -0,0 +1,44 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='application-x-appliance-symbolic.svg' height='16.03125' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.4 r9939' version='1.1' width='16.03125' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer14' inkscape:cx='-2.88943' inkscape:cy='-0.340373' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1381' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='-340px' originy='84.03125px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-581.0002,-301)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-581.0002,-301)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-581.0002,-301)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-581.0002,-301)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-581.0002,-301)'>
+
+ <path sodipodi:cx='-176.01562' sodipodi:cy='-39.984375' d='m -174,-39.984375 a 2.015625,2.015625 0 1 1 -4.03125,0 2.015625,2.015625 0 1 1 4.03125,0 z' id='path3908-61' sodipodi:rx='2.015625' sodipodi:ry='2.015625' style='color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:0.99999976;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' transform='translate(759.03145,343.03125)' sodipodi:type='arc'/>
+ <path sodipodi:cx='-176.01562' sodipodi:cy='-39.984375' d='m -174,-39.984375 a 2.015625,2.015625 0 1 1 -4.03125,0 2.015625,2.015625 0 1 1 4.03125,0 z' id='path3910-1' sodipodi:rx='2.015625' sodipodi:ry='2.015625' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999976;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' transform='translate(759.03145,354.96875)' sodipodi:type='arc'/>
+ <path sodipodi:cx='-176.01562' sodipodi:cy='-39.984375' d='m -174,-39.984375 a 2.015625,2.015625 0 1 1 -4.03125,0 2.015625,2.015625 0 1 1 4.03125,0 z' id='path3912' sodipodi:rx='2.015625' sodipodi:ry='2.015625' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999976;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' transform='translate(771.03145,354.96875)' sodipodi:type='arc'/>
+ <path sodipodi:cx='-176.01562' sodipodi:cy='-39.984375' d='m -174,-39.984375 a 2.015625,2.015625 0 1 1 -4.03125,0 2.015625,2.015625 0 1 1 4.03125,0 z' id='path3914' sodipodi:rx='2.015625' sodipodi:ry='2.015625' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999976;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' transform='translate(771.03145,343)' sodipodi:type='arc'/>
+ <path inkscape:connector-curvature='0' d='m 582.0625,302.0625 0,1 0,11.96875 0,1 1,0 11.96875,0 1,0 0,-1 0,-11.96875 0,-1 -1,0 -11.96875,0 -1,0 z m 2,2 9.96875,0 0,9.96875 -9.96875,0 0,-9.96875 z' id='rect3916' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 585.96875,306.03125 0,0.5 0,5 0,0.5 0.5,0 5.0625,0 0.5,0 0,-0.5 0,-5 0,-0.5 -0.5,0 -5.0625,0 -0.5,0 z m 1,1 4.0625,0 0,4 -4.0625,0 0,-4 z' id='rect3918' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:0.9999997;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path sodipodi:cx='-167.76562' sodipodi:cy='-31.765625' d='m -166.5,-31.765625 a 1.265625,1.265625 0 1 1 -2.53125,0 1.265625,1.265625 0 1 1 2.53125,0 z' id='path3937' sodipodi:rx='1.265625' sodipodi:ry='1.265625' style='color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:0.99999976;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' transform='matrix(1.1975309,0,0,1.1975309,792.42034,349.55594)' sodipodi:type='arc'/>
+ <path sodipodi:cx='-167.76562' sodipodi:cy='-31.765625' d='m -166.5,-31.765625 a 1.265625,1.265625 0 1 1 -2.53125,0 1.265625,1.265625 0 1 1 2.53125,0 z' id='path3939' sodipodi:rx='1.265625' sodipodi:ry='1.265625' style='color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:0.99999976;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' transform='matrix(1.1975309,0,0,1.1975309,787.42034,349.55594)' sodipodi:type='arc'/>
+ <path sodipodi:cx='-167.76562' sodipodi:cy='-31.765625' d='m -166.5,-31.765625 a 1.265625,1.265625 0 1 1 -2.53125,0 1.265625,1.265625 0 1 1 2.53125,0 z' id='path3941' sodipodi:rx='1.265625' sodipodi:ry='1.265625' style='color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:0.99999976;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' transform='matrix(1.1975309,0,0,1.1975309,787.42034,344.58719)' sodipodi:type='arc'/>
+ <path sodipodi:cx='-167.76562' sodipodi:cy='-31.765625' d='m -166.5,-31.765625 a 1.265625,1.265625 0 1 1 -2.53125,0 1.265625,1.265625 0 1 1 2.53125,0 z' id='path3943' sodipodi:rx='1.265625' sodipodi:ry='1.265625' style='color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:0.99999976;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' transform='matrix(1.1975309,0,0,1.1975309,792.48284,344.58719)' sodipodi:type='arc'/>
+ <path inkscape:connector-curvature='0' d='m 591.875,311.21875 -0.6875,0.6875 3.40625,3.4375 0.71875,-0.71875 -3.4375,-3.40625 z' id='path3945' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:0.99999976;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 586.59375,311.21875 -3.40625,3.40625 0.6875,0.71875 3.4375,-3.4375 -0.71875,-0.6875 z' id='path3949' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:0.99999976;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 594.59375,303.21875 -3.40625,3.40625 0.6875,0.71875 3.4375,-3.4375 -0.71875,-0.6875 z' id='path3953' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:0.99999976;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 583.875,303.21875 -0.6875,0.6875 3.40625,3.4375 0.71875,-0.71875 -3.4375,-3.40625 z' id='path3955' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:0.99999976;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-581.0002,-301)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-581.0002,-301)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-581.0002,-301)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-581.0002,-301)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/application-x-executable-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/application-x-executable-symbolic-ref.png
new file mode 100644
index 00000000..c6d51afc
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/application-x-executable-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/application-x-executable-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/application-x-executable-symbolic.svg
new file mode 100644
index 00000000..bd39d1fa
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/application-x-executable-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='application-x-executable-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.5 r10040' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer14' inkscape:cx='24.60087' inkscape:cy='4.0113795' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1375' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-320px' originy='103.99999px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-561.0002,-320.99999)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-561.0002,-320.99999)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-561.0002,-320.99999)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-561.0002,-320.99999)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-561.0002,-320.99999)'>
+
+ <path inkscape:connector-curvature='0' d='m 569.0002,321.96875 c -0.25562,0 -0.52288,0.0854 -0.71875,0.28125 l -6.03125,6.03125 c -0.39174,0.39174 -0.39174,1.04576 0,1.4375 l 4.34375,4.34375 1,-0.53125 c -0.017,-0.16809 -0.0312,-0.3274 -0.0312,-0.5 0,-0.1726 0.0141,-0.33191 0.0312,-0.5 l -1.84375,-1 c 0.0975,-0.44488 0.22853,-0.87248 0.40625,-1.28125 l 2.09375,0.28125 c 0.1695,-0.29 0.37133,-0.56351 0.59375,-0.8125 l -0.90625,-1.90625 c 0.33555,-0.29842 0.67387,-0.58239 1.0625,-0.8125 l 1.53125,1.46875 c 0.3057,-0.13661 0.63429,-0.2392 0.96875,-0.3125 l 0.40625,-2.09375 c 0.21544,-0.0199 0.4356,-0.0312 0.65625,-0.0312 0.22065,0 0.44081,0.0113 0.65625,0.0312 l 0.40625,2.09375 c 0.33446,0.0733 0.66305,0.17589 0.96875,0.3125 l 0.6875,-0.65625 -5.5625,-5.5625 c -0.19587,-0.19587 -0.46313,-0.28125 -0.71875,-0.28125 z m 3.5625,8.0625 c -1.65685,0 -3,1.34315 -3,3 0,0.79675 0.30578,1.52531 0.8125,2.0625 l 4.25,-4.25 c -0.53719,-0.50672 -1.26575,-0.8125 -2.0625,-0.8125 z m -4.3125,5.5 -0.15625,0.0312 0.1875,0.1875 c 0.0605,0.0605 0.14862,0.0832 0.21875,0.125 -0.0839,-0.11796 -0.17712,-0.21905 -0.25,-0.34375 z' id='rect26937' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-561.0002,-320.99999)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-561.0002,-320.99999)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-561.0002,-320.99999)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-561.0002,-320.99999)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/application-x-firmware-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/application-x-firmware-symbolic-ref.png
new file mode 100644
index 00000000..fa8669e5
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/application-x-firmware-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/application-x-firmware-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/application-x-firmware-symbolic.svg
new file mode 100644
index 00000000..c2e56ed7
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/application-x-firmware-symbolic.svg
@@ -0,0 +1,48 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='application-x-firmware-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.92.1 r' viewBox='0 0 16.000002 16' width='16.000002' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer14' inkscape:cx='6.37535' inkscape:cy='5.858253' inkscape:document-units='px' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:measure-end='0,0' inkscape:measure-start='0,0' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='3440' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-380' originy='104' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-621.0002,-321)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-621.0002,-321)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-621.0002,-321)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-621.0002,-321)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-621.0002,-321)'>
+
+ <path inkscape:connector-curvature='0' d='m 630.0002,321 v 0.5 0.5 h -1 v 1 h -0.45312 -0.5 v 1 h 0.5 0.45312 v 1 h -0.45312 -0.5 v 1 h 0.5 0.45312 v 1 h -0.45312 -0.5 v 1 h 0.5 0.45312 v 1 h 1 v 0.5 0.5 h 1 v -0.5 -0.5 h 1 v 0.5 0.5 h 1 v -0.5 -0.5 h 1 v 0.5 0.5 h 1 v -0.5 -0.5 h 1 v -1 h 0.5 0.5 v -1 h -0.5 -0.5 v -1 h 0.5 0.5 v -1 h -0.5 -0.5 v -1 h 0.5 0.5 v -1 h -0.5 -0.5 v -1 h -1 v -0.5 -0.5 h -1 v 0.5 0.5 h -1 v -0.5 -0.5 h -1 v 0.5 0.5 h -1 v -0.5 -0.5 z' id='rect27165-3' style='color:#000000;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.99999988;marker:none;enable-background:new'/>
+ <path inkscape:connector-curvature='0' d='m 627.5,332.98242 c -0.83253,0 -1.51758,0.68505 -1.51758,1.51758 0,0.83253 0.68505,1.51758 1.51758,1.51758 0.83253,0 1.51758,-0.68505 1.51758,-1.51758 0,-0.83253 -0.68505,-1.51758 -1.51758,-1.51758 z m 0,1 c 0.29209,0 0.51758,0.22549 0.51758,0.51758 0,0.29209 -0.22549,0.51758 -0.51758,0.51758 -0.29209,0 -0.51758,-0.22549 -0.51758,-0.51758 0,-0.29209 0.22549,-0.51758 0.51758,-0.51758 z' id='path17377' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999994;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 621.5,331.13086 v 1 h 1.21094 L 624.36719,335 h 2.07031 v -1 h -1.49219 l -1.65625,-2.86914 z' id='path17379' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 635.48242,329.94531 c -0.83253,0 -1.51758,0.68505 -1.51758,1.51758 0,0.83253 0.68505,1.51953 1.51758,1.51953 0.83253,0 1.51758,-0.687 1.51758,-1.51953 0,-0.83253 -0.68505,-1.51758 -1.51758,-1.51758 z m 0,1 c 0.29209,0 0.51758,0.22549 0.51758,0.51758 0,0.29209 -0.22549,0.51953 -0.51758,0.51953 -0.29209,0 -0.51758,-0.22744 -0.51758,-0.51953 0,-0.29209 0.22549,-0.51758 0.51758,-0.51758 z' id='circle17381' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999994;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 621.5,328.0957 v 1 h 1.21094 l 1.65625,2.86719 h 9.78906 v -1 h -9.21094 l -1.65625,-2.86719 z' id='path17383' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 626.5293,326.96289 c -0.83253,0 -1.51758,0.687 -1.51758,1.51953 0,0.83253 0.68505,1.51758 1.51758,1.51758 0.83253,0 1.51758,-0.68505 1.51758,-1.51758 0,-0.83253 -0.68505,-1.51953 -1.51758,-1.51953 z m 0,1 c 0.29209,0 0.51757,0.22744 0.51758,0.51953 0,0.29209 -0.22549,0.51758 -0.51758,0.51758 -0.29209,0 -0.51758,-0.22549 -0.51758,-0.51758 0,-0.29209 0.22549,-0.51953 0.51758,-0.51953 z' id='circle17385' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999994;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 621.50195,324.97656 -0.002,1 3.5332,0.006 1.0586,1.70899 0.85156,-0.52735 -1.35156,-2.18164 z' id='path17387' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 622.52539,324.03711 c 0.83253,0 1.51953,-0.687 1.51953,-1.51953 0,-0.83253 -0.687,-1.51758 -1.51953,-1.51758 -0.83253,0 -1.51758,0.68505 -1.51758,1.51758 0,0.83253 0.68505,1.51953 1.51758,1.51953 z m 0,-1 c -0.29209,0 -0.51758,-0.22744 -0.51758,-0.51953 0,-0.29209 0.22549,-0.51758 0.51758,-0.51758 0.29209,0 0.51953,0.22549 0.51953,0.51758 0,0.29209 -0.22744,0.51953 -0.51953,0.51953 z' id='circle17389' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999994;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 623.00195,322.01367 -0.002,1 3.31055,0.006 0.85351,0.82813 0.69532,-0.71875 -1.14258,-1.10938 z' id='path17391' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 630.53711,332.98242 c -0.83253,0 -1.51953,0.68505 -1.51953,1.51758 0,0.83253 0.687,1.51758 1.51953,1.51758 0.83253,0 1.51758,-0.68505 1.51758,-1.51758 0,-0.83253 -0.68505,-1.51758 -1.51758,-1.51758 z m 0,1 c 0.29209,0 0.51758,0.22549 0.51758,0.51758 0,0.29209 -0.22549,0.51758 -0.51758,0.51758 -0.29209,0 -0.51953,-0.22549 -0.51953,-0.51758 0,-0.29209 0.22744,-0.51758 0.51953,-0.51758 z' id='circle17393' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999994;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 633.57227,332.98242 c -0.83253,0 -1.51758,0.68505 -1.51758,1.51758 0,0.83253 0.68505,1.51758 1.51758,1.51758 0.83253,0 1.51953,-0.68505 1.51953,-1.51758 0,-0.83253 -0.687,-1.51758 -1.51953,-1.51758 z m 0,1 c 0.29209,0 0.51953,0.22549 0.51953,0.51758 0,0.29209 -0.22744,0.51758 -0.51953,0.51758 -0.29209,0 -0.51758,-0.22549 -0.51758,-0.51758 0,-0.29209 0.22549,-0.51758 0.51758,-0.51758 z' id='circle17395' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999994;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 632.77539,331.31055 -0.86328,0.5039 1.125,1.9375 0.86328,-0.5039 z' id='path17397' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 629.74609,331.28125 -0.86718,0.5 1.15625,2 0.86718,-0.5 z' id='path17399' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 626.91797,331.34375 -0.89844,0.4375 0.96875,2 0.89844,-0.4375 z' id='path17401' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-621.0002,-321)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-621.0002,-321)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-621.0002,-321)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-621.0002,-321)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/applications-engineering-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/applications-engineering-symbolic-ref.png
new file mode 100644
index 00000000..bf19d873
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/applications-engineering-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/applications-engineering-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/applications-engineering-symbolic.svg
new file mode 100644
index 00000000..c8965e20
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/applications-engineering-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns='http://www.w3.org/2000/svg' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' width='16' sodipodi:docname='applications-engineering-symbolic.svg' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' height='16.000193' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.1 r9760' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:snap-nodes='true' inkscape:cx='3.9391167' inkscape:cy='9.6227424' bordercolor='#666666' borderopacity='1' guidetolerance='10' inkscape:window-width='1226' showgrid='false' inkscape:snap-global='true' inkscape:zoom='11.313708' inkscape:object-nodes='false' inkscape:snap-others='false' pagecolor='#555753' gridtolerance='10' inkscape:window-maximized='0' showborder='false' inkscape:snap-to-guides='true' inkscape:guide-bbox='true' inkscape:snap-bbox='true' inkscape:pageopacity='1' showguides='true' inkscape:window-x='2259' inkscape:window-y='356' inkscape:snap-bbox-midpoints='false' inkscape:window-height='967' inkscape:snap-grids='true' inkscape:current-layer='g4953' objecttolerance='10' inkscape:bbox-paths='false' inkscape:object-paths='false' id='namedview88' inkscape:pageshadow='2'>
+ <inkscape:grid type='xygrid' enabled='true' empspacing='2' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' id='grid4866' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:label='status' style='display:inline' inkscape:groupmode='layer' id='layer9' transform='translate(-522.0002,-462)'/>
+ <g inkscape:label='devices' inkscape:groupmode='layer' id='layer10' transform='translate(-522.0002,-462)'/>
+ <g inkscape:label='apps' inkscape:groupmode='layer' id='layer11' transform='translate(-522.0002,-462)'/>
+ <g inkscape:label='places' inkscape:groupmode='layer' id='layer13' transform='translate(-522.0002,-462)'/>
+ <g inkscape:label='mimetypes' inkscape:groupmode='layer' id='layer14' transform='translate(-522.0002,-462)'/>
+ <g inkscape:label='emblems' style='display:inline' inkscape:groupmode='layer' id='layer15' transform='translate(-522.0002,-462)'/>
+ <g inkscape:label='emotes' style='display:inline' inkscape:groupmode='layer' id='g71291' transform='translate(-522.0002,-462)'/>
+ <g inkscape:label='categories' style='display:inline' inkscape:groupmode='layer' id='g4953' transform='translate(-522.0002,-462)'>
+ <path style='fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;display:inline;enable-background:new' inkscape:connector-curvature='0' sodipodi:nodetypes='cccccccccccccccc' id='rect7157' d='m 529.99708,470 c -3.99844,0 -5.99766,3 -5.99766,6 l -1.74932,0 c -0.2499,0 -0.2499,0.15712 -0.2499,0.25 l 0,1.5 c 0,0.25 0.13814,0.25 0.2499,0.25 l 15.49396,0 c 0.19535,0.006 0.2499,-0.12948 0.2499,-0.25 l 0,-1.5 c 0.0212,-0.14605 0,-0.25 -0.2499,-0.25 l -1.74932,0 c 0,-3 -1.99922,-6 -5.99766,-6 z m 0,3 c 2.3501,0 2.99883,1.76177 2.99883,3 l -5.99766,0 c 0,-1.19769 0.70253,-3 2.99883,-3 z'/>
+ <path style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans' inkscape:connector-curvature='0' sodipodi:nodetypes='sccscccssccccss' id='path3908-6' d='m 536.98911,462.59983 c -0.28315,-0.24009 -0.6238,-0.41924 -0.96653,-0.5613 l -0.0217,2.23198 c -0.005,0.45867 -0.4519,0.72949 -1.00572,0.72949 l -0.99961,0 c -0.55376,-0.007 -1.00306,-0.30935 -0.9986,-0.76802 L 533.01865,462 c -0.34541,0.13322 -0.68945,0.3036 -0.9772,0.53638 -1.37728,1.11412 -1.39514,2.94888 -0.0399,4.09805 0.28315,0.24009 0.6238,0.41924 0.96652,0.56131 0.0278,0.0113 0.0278,2.05426 0.0278,2.05426 1.48949,0.75 2.35093,1.75 2.99883,2.75 l 0,-4.74827 c 0.3454,-0.13322 0.66671,-0.32107 0.95447,-0.55384 1.37727,-1.11412 1.39514,-2.94889 0.0399,-4.09806 z'/>
+
+ </g>
+ <g inkscape:label='actions' style='display:inline' inkscape:groupmode='layer' id='layer12' transform='translate(-522.0002,-462)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/applications-games-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/applications-games-symbolic-ref.png
new file mode 100644
index 00000000..c6accfa5
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/applications-games-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/applications-games-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/applications-games-symbolic.svg
new file mode 100644
index 00000000..221a0adc
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/applications-games-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='applications-games-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.2 r9819' version='1.1' width='16.000013' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-paths='false' bordercolor='#666666' borderopacity='1' inkscape:current-layer='g4953' inkscape:cx='7.49293' inkscape:cy='6.96473' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#555753' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1381' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='1600' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-561.00018,-461)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-561.00018,-461)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-561.00018,-461)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-561.00018,-461)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-561.00018,-461)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-561.00018,-461)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-561.00018,-461)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-561.00018,-461)'>
+ <path inkscape:connector-curvature='0' d='m 564.78476,463.01879 c -0.24234,10e-4 -0.52104,0.0664 -0.80589,0.21875 -1.03738,0.54647 -1.99198,2.33598 -2.51067,4.65625 -0.44216,1.97089 -0.60455,4.66601 -0.34095,5.75 0.22958,0.93169 0.62706,1.34375 1.33282,1.34375 1.04588,-0.0179 2.35927,-1.18225 3.19257,-2.75 0.6027,-0.86787 2.00051,-1.26248 3.34756,-1.21875 1.34704,-0.0471 2.74485,0.35088 3.34755,1.21875 0.8333,1.56775 2.14669,2.73208 3.19257,2.75 0.70576,0 1.10324,-0.41206 1.33282,-1.34375 0.2636,-1.08399 0.10121,-3.77911 -0.34095,-5.75 -0.51869,-2.32027 -1.47329,-4.10978 -2.51067,-4.65625 -0.5697,-0.30459 -1.04015,-0.29563 -1.4568,0 -0.52719,0.37626 -1.62582,0.77958 -3.56452,0.78125 -1.93871,0.002 -3.03734,-0.40499 -3.56453,-0.78125 -0.20832,-0.14782 -0.40857,-0.21987 -0.65091,-0.21875 z m 0.24797,3 0.99186,0 0,1 0.99187,0 0,1 -0.99187,0 0,1 -0.99186,0 0,-1 -0.99187,0 0,-1 0.99187,0 0,-1 z m 7.439,0 c 0.2739,0 0.49593,0.22386 0.49593,0.5 0,0.27614 -0.22203,0.5 -0.49593,0.5 -0.2739,0 -0.49593,-0.22386 -0.49593,-0.5 0,-0.27614 0.22203,-0.5 0.49593,-0.5 z m -0.99187,1 c 0.2739,0 0.49594,0.22386 0.49594,0.5 0,0.27614 -0.22204,0.5 -0.49594,0.5 -0.27389,0 -0.49593,-0.22386 -0.49593,-0.5 0,-0.27614 0.22204,-0.5 0.49593,-0.5 z m 1.98374,0 c 0.27389,0 0.49593,0.22386 0.49593,0.5 0,0.27614 -0.22204,0.5 -0.49593,0.5 -0.2739,0 -0.49594,-0.22386 -0.49594,-0.5 0,-0.27614 0.22204,-0.5 0.49594,-0.5 z m -0.99187,1 c 0.2739,0 0.49593,0.22386 0.49593,0.5 0,0.27614 -0.22203,0.5 -0.49593,0.5 -0.2739,0 -0.49593,-0.22386 -0.49593,-0.5 0,-0.27614 0.22203,-0.5 0.49593,-0.5 z' id='path10' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+
+ </g>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-561.00018,-461)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/applications-graphics-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/applications-graphics-symbolic-ref.png
new file mode 100644
index 00000000..83bc62b6
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/applications-graphics-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/applications-graphics-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/applications-graphics-symbolic.svg
new file mode 100644
index 00000000..7a6e5252
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/applications-graphics-symbolic.svg
@@ -0,0 +1,33 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='applications-graphics-symbolic.svg' height='16.000008' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.2 r9819' version='1.1' width='16.000002' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-paths='false' bordercolor='#666666' borderopacity='1' inkscape:current-layer='g4953' inkscape:cx='-12.507085' inkscape:cy='6.9647405' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#555753' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1381' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='1600' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-581.00019,-461)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-581.00019,-461)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-581.00019,-461)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-581.00019,-461)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-581.00019,-461)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-581.00019,-461)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-581.00019,-461)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-581.00019,-461)'>
+ <path inkscape:connector-curvature='0' d='m 588.89213,461.00274 c -2.10985,0.0296 -4.94513,0.80221 -4.89737,3.28068 0.0499,2.58608 2.91741,1.66126 3.15054,2.71829 0.0353,-0.045 0.0883,-0.0821 0.12477,-0.12498 0.19744,-0.2135 0.39517,-0.38769 0.59267,-0.59365 0.31248,-0.35256 0.63627,-0.67899 0.967,-1.03107 1.10674,-1.17814 1.15415,-1.24979 3.79604,-3.24945 -1.03459,-0.62096 -2.25793,-0.96565 -3.29695,-0.99982 -0.1332,-0.005 -0.29604,-0.002 -0.4367,0 z m -1.9028,1.53098 c 0.82692,0 1.49728,0.67146 1.49728,1.49975 0,0.82829 -0.67036,1.49974 -1.49728,1.49974 -0.82693,0 -1.49728,-0.67145 -1.49728,-1.49974 0,-0.82829 0.67035,-1.49975 1.49728,-1.49975 z m 7.26873,0.66156 c -1.41828,2.23337 -2.36679,3.55601 -3.36956,4.58755 -0.63925,0.65758 -1.1631,1.31156 -1.62205,1.78094 -0.83899,0.89023 -1.93776,1.94077 -3.15054,3.09322 0.0633,1.46884 0.81094,2.74635 3.24412,3.2182 3.89808,0.75593 8.02683,-1.82423 7.61118,-7.06129 -0.17842,-2.24796 -1.4052,-4.28134 -2.71315,-5.61862 z m 0.34245,3.80643 c 0.5488,0 0.99819,0.44764 0.99819,0.99983 0,0.55218 -0.44939,0.99983 -0.99819,0.99983 -0.54879,0 -0.99818,-0.44765 -0.99818,-0.99983 0,-0.55219 0.44939,-0.99983 0.99818,-0.99983 z m -0.62386,2.99949 c 0.54879,0 0.99818,0.44764 0.99818,0.99983 0,0.55218 -0.44939,0.99982 -0.99818,0.99982 -0.5488,0 -0.99819,-0.44764 -0.99819,-0.99982 0,-0.55219 0.44939,-0.99983 0.99819,-0.99983 z m -4.99094,1.99965 c 0.54879,0 0.99818,0.44765 0.99818,0.99983 0,0.55219 -0.44939,0.99983 -0.99818,0.99983 -0.5488,0 -0.99819,-0.44764 -0.99819,-0.99983 0,-0.55218 0.44939,-0.99983 0.99819,-0.99983 z m 2.99456,0 c 0.5488,0 0.99819,0.44765 0.99819,0.99983 0,0.55219 -0.44939,0.99983 -0.99819,0.99983 -0.5488,0 -0.99819,-0.44764 -0.99819,-0.99983 0,-0.55218 0.44939,-0.99983 0.99819,-0.99983 z' id='path9234' sodipodi:nodetypes='cccccccccssssscsccsscssssssssssssssssssss' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+ <path inkscape:connector-curvature='0' d='m 581.00019,474.49915 c 1.55209,6e-4 1.39367,-1.78749 2.14726,-2.28535 0.87328,-0.57692 1.63857,0.13795 1.79136,0.72627 0.19279,0.74234 -0.11685,1.63129 -1.12998,1.8846 -1.07336,0.26836 -2.66168,0.27633 -2.80864,-0.32552 z' id='path9274' sodipodi:nodetypes='csssc' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+
+ <path inkscape:connector-curvature='0' d='m 595.03722,461.00274 c -1.79965,1.2988 -4.20634,3.30184 -6.11488,5.3335 -0.17324,0.18442 -0.34065,0.36235 -0.50432,0.54703 -0.10346,0.10788 -0.21177,0.19588 -0.3152,0.30771 -0.0653,0.0767 -0.12585,0.16279 -0.18912,0.23932 -1.87306,2.07016 -3.71972,4.68066 -4.91712,6.6327 2.97729,-2.29737 4.91603,-4.16475 6.1464,-5.47026 0.2404,-0.24587 0.52929,-0.56636 0.85103,-0.92311 1.20361,-1.33456 2.92519,-3.43748 5.04321,-6.66689 z' id='path9264' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-581.00019,-461)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/applications-multimedia-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/applications-multimedia-symbolic-ref.png
new file mode 100644
index 00000000..4f211b52
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/applications-multimedia-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/applications-multimedia-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/applications-multimedia-symbolic.svg
new file mode 100644
index 00000000..b611653a
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/applications-multimedia-symbolic.svg
@@ -0,0 +1,34 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='applications-multimedia-symbolic.svg' height='16.000038' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.4 r9939' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='g4953' inkscape:cx='-328.71599' inkscape:cy='-177.91029' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='702' inkscape:window-maximized='1' inkscape:window-width='1366' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='-359.9998px' originy='244.00001px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ <inkscape:grid color='#000000' empcolor='#000000' empopacity='0' empspacing='4' enabled='true' id='grid5968' opacity='0.1254902' originx='-359.9998px' originy='244.00001px' snapvisiblegridlinesonly='true' spacingx='0.5px' spacingy='0.5px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-601,-460.99997)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-601,-460.99997)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-601,-460.99997)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-601,-460.99997)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-601,-460.99997)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-601,-460.99997)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-601,-460.99997)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-601,-460.99997)'>
+ <path inkscape:connector-curvature='0' d='m 610.0002,469 0,1 0,3.28125 c -0.29454,-0.17076 -0.63503,-0.28125 -1,-0.28125 -1.10457,0 -2,0.89543 -2,2 0,1.10457 0.89543,2 2,2 1.10457,0 2,-0.89543 2,-2 l 0,-5 4,0 0,3.28125 c -0.29454,-0.17076 -0.63503,-0.28125 -1,-0.28125 -1.10457,0 -2,0.89543 -2,2 0,1.10457 0.89543,2 2,2 1.10457,0 2,-0.89543 2,-2 l 0,-5 0,-1 -1,0 -4,0 -1,0 z' id='rect6190-8-8-4' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.50793636;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new'/>
+
+
+ <path inkscape:connector-curvature='0' d='m 602.96895,461 c 0,0 -0.96875,1 -0.96875,2 l 0,12 c 0,1.00959 -1,2 -1,2 l 1,0 c 0,0 0.42287,-0.42699 0.71875,-1 l 1,0 c -0.29588,0.57301 -0.71875,1 -0.71875,1 l 1,0 c 0,0 1,-1.02145 1,-2 l 0,-2 1,0 0,-1 -1,0 0,-5 8,0 0,1 1,0 1,0 1,0 0,-5 c 0,-1 0.96875,-2 0.96875,-2 l -3,0 c 0,0 -0.96875,1 -0.96875,2 l 0,3 -8,0 0,-3 c 0,-1 0.96875,-2 0.96875,-2 z m 0.3125,1 1,0 c -0.15291,0.30578 -0.28125,0.65211 -0.28125,1 l -1,0 c 0,-0.34789 0.12834,-0.69422 0.28125,-1 z m 11,0 1,0 c -0.15291,0.30578 -0.28125,0.65211 -0.28125,1 l -1,0 c 0,-0.34789 0.12834,-0.69422 0.28125,-1 z m -11.28125,2 1,0 0,1 -1,0 z m 11,0 1,0 0,1 -1,0 z m -11,2 1,0 0,1 -1,0 z m 11,0 1,0 0,1 -1,0 z m -11,2 1,0 0,1 -1,0 z m 0,2 1,0 0,1 -1,0 z m 0,2 1,0 0,1 -1,0 z m 0,2 1,0 0,1 -1,0 z' id='rect5523-5' sodipodi:nodetypes='cssccccccsccccccccccsccsccscccccccccccccccccccccccccccccccccccccccccccccccccccc' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.50793636;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-601,-460.99997)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/applications-science-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/applications-science-symbolic-ref.png
new file mode 100644
index 00000000..18c0487a
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/applications-science-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/applications-science-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/applications-science-symbolic.svg
new file mode 100644
index 00000000..3c634c79
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/applications-science-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg inkscape:version='0.48.1 r9760' version='1.1' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns='http://www.w3.org/2000/svg' width='16' height='16' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='applications-science-symbolic.svg' id='svg7384' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:svg='http://www.w3.org/2000/svg' xmlns:cc='http://creativecommons.org/ns#'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:window-x='0' inkscape:window-y='26' inkscape:window-maximized='0' pagecolor='#555753' showborder='false' inkscape:pageshadow='2' bordercolor='#666666' inkscape:snap-bbox='true' inkscape:current-layer='g4953' inkscape:snap-grids='true' inkscape:bbox-paths='false' inkscape:snap-others='false' inkscape:window-height='1020' inkscape:snap-nodes='true' borderopacity='1' showguides='true' inkscape:snap-global='true' inkscape:pageopacity='1' inkscape:object-paths='false' objecttolerance='10' gridtolerance='10' showgrid='false' inkscape:zoom='1' inkscape:snap-to-guides='true' inkscape:object-nodes='false' id='namedview88' inkscape:snap-bbox-midpoints='false' inkscape:guide-bbox='true' inkscape:window-width='1598' inkscape:cx='-112.94399' inkscape:cy='-144.55805' guidetolerance='10'>
+ <inkscape:grid visible='true' spacingx='1px' spacingy='1px' empspacing='2' enabled='true' id='grid4866' snapvisiblegridlinesonly='true' type='xygrid'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:label='status' style='display:inline' inkscape:groupmode='layer' id='layer9' transform='translate(-501.0002,-461.99974)'/>
+ <g inkscape:label='devices' inkscape:groupmode='layer' id='layer10' transform='translate(-501.0002,-461.99974)'/>
+ <g inkscape:label='apps' inkscape:groupmode='layer' id='layer11' transform='translate(-501.0002,-461.99974)'/>
+ <g inkscape:label='places' inkscape:groupmode='layer' id='layer13' transform='translate(-501.0002,-461.99974)'/>
+ <g inkscape:label='mimetypes' inkscape:groupmode='layer' id='layer14' transform='translate(-501.0002,-461.99974)'/>
+ <g inkscape:label='emblems' style='display:inline' inkscape:groupmode='layer' id='layer15' transform='translate(-501.0002,-461.99974)'/>
+ <g inkscape:label='emotes' style='display:inline' inkscape:groupmode='layer' transform='translate(-501.0002,-461.99974)' id='g71291'/>
+ <g inkscape:label='categories' style='display:inline' inkscape:groupmode='layer' id='g4953' transform='translate(-501.0002,-461.99974)'>
+ <path d='m 505.90625,462.09375 a 1.0001,1.0001 0 0 0 -0.375,1.875 l 0.46875,0.25 0,2.75 c -0.12616,0.19922 -0.25575,0.37424 -0.4375,0.6875 -0.27262,0.46989 -0.60717,1.04052 -0.96875,1.6875 -0.72316,1.29395 -1.54045,2.81614 -2.1875,4 -0.57062,1.044 -0.56219,2.44139 0.28125,3.5 0.01,0.0131 0.0215,0.0184 0.0312,0.0312 0.67388,0.8899 1.71652,1.125 2.59375,1.125 l 7.375,0 c 0.87723,0 1.91987,-0.2351 2.59375,-1.125 0.009,-0.0115 0.0221,-0.0197 0.0312,-0.0312 0.83629,-1.04963 0.83721,-2.42762 0.28125,-3.46875 -0.004,-0.009 0.004,-0.0224 0,-0.0312 -1.16773,-2.37787 -2.47179,-4.21786 -3.5625,-6.40625 l 0,-2.6875 0.5,-0.28125 a 1.0001,1.0001 0 0 0 -0.5,-1.875 l -6.03125,0 a 1.0001,1.0001 0 0 0 -0.0937,0 z m 2.09375,2 2.03125,0 0,3.125 a 1.0001,1.0001 0 0 0 0.0937,0.4375 c 1.20164,2.45716 2.57567,4.32021 3.6875,6.59375 a 1.0001,1.0001 0 0 0 0.0312,0.0625 c 0.23971,0.43859 0.25996,0.88106 -0.0937,1.3125 a 1.0001,1.0001 0 0 0 -0.0625,0.0312 c -0.14445,0.19822 -0.45965,0.34375 -1,0.34375 l -7.375,0 c -0.54035,0 -0.85555,-0.14553 -1,-0.34375 A 1.0001,1.0001 0 0 0 504.25,475.625 c -0.35372,-0.43145 -0.33346,-0.87393 -0.0937,-1.3125 0.64576,-1.18148 1.47031,-2.71674 2.1875,-4 0.35859,-0.64163 0.70549,-1.20248 0.96875,-1.65625 0.26326,-0.45377 0.47348,-0.83862 0.5,-0.875 A 1.0001,1.0001 0 0 0 508,467.21875 l 0,-3.125 z' inkscape:connector-curvature='0' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans' id='path29274-9-1'/>
+ <path d='m 507.21891,471.00142 -2.21875,3.99904 8,0 -2.21875,-3.99904 -3.5625,0 z' inkscape:connector-curvature='0' style='opacity:0.25;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' id='rect5725'/>
+
+ </g>
+ <g inkscape:label='actions' style='display:inline' inkscape:groupmode='layer' id='layer12' transform='translate(-501.0002,-461.99974)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/applications-system-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/applications-system-symbolic-ref.png
new file mode 100644
index 00000000..eb4c1ef3
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/applications-system-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/applications-system-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/applications-system-symbolic.svg
new file mode 100644
index 00000000..7825f5ab
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/applications-system-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='applications-system-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.91 r13725' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='false' bordercolor='#666666' borderopacity='1' inkscape:current-layer='g4953' inkscape:cx='-537.73297' inkscape:cy='-23.55721' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-400' originy='243.99999' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-641.0002,-460.99999)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-641.0002,-460.99999)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-641.0002,-460.99999)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-641.0002,-460.99999)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-641.0002,-460.99999)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-641.0002,-460.99999)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-641.0002,-460.99999)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-641.0002,-460.99999)'>
+
+ <path inkscape:connector-curvature='0' d='m 649.0004,462.00002 c -0.22065,0 -0.44081,0.0113 -0.65625,0.0312 l -0.40625,2.09375 c -0.33446,0.0733 -0.66305,0.17589 -0.96875,0.3125 l -1.53125,-1.46875 c -0.38863,0.23011 -0.72695,0.51408 -1.0625,0.8125 l 0.90625,1.90625 c -0.22242,0.24899 -0.42425,0.5225 -0.59375,0.8125 l -2.09375,-0.28125 c -0.17772,0.40877 -0.30872,0.83637 -0.40625,1.28125 l 1.84375,1 c -0.0171,0.16809 -0.0312,0.3274 -0.0312,0.5 0,0.1726 0.0142,0.33191 0.0312,0.5 l -1.84375,1 c 0.0975,0.44488 0.22853,0.87248 0.40625,1.28125 l 2.09375,-0.28125 c 0.1695,0.29 0.37133,0.56351 0.59375,0.8125 l -0.90625,1.90625 c 0.33555,0.29842 0.67387,0.58239 1.0625,0.8125 l 1.53125,-1.46875 c 0.3057,0.13661 0.63429,0.23916 0.96875,0.3125 l 0.40625,2.09375 c 0.21544,0.02 0.4356,0.0312 0.65625,0.0312 0.22065,0 0.44081,-0.0113 0.65625,-0.0312 l 0.40625,-2.09375 c 0.33446,-0.0733 0.66305,-0.17589 0.96875,-0.3125 l 1.53125,1.46875 c 0.38863,-0.23011 0.72695,-0.51408 1.0625,-0.8125 l -0.90625,-1.90625 c 0.22242,-0.24899 0.42425,-0.5225 0.59375,-0.8125 l 2.09375,0.28125 c 0.17772,-0.40877 0.30872,-0.83637 0.40625,-1.28125 l -1.84375,-1 c 0.0171,-0.16809 0.0312,-0.3274 0.0312,-0.5 0,-0.1726 -0.0142,-0.33191 -0.0312,-0.5 l 1.84375,-1 c -0.0975,-0.44488 -0.22853,-0.87248 -0.40625,-1.28125 l -2.09375,0.28125 c -0.1695,-0.29 -0.37133,-0.56351 -0.59375,-0.8125 l 0.90625,-1.90625 c -0.33555,-0.29842 -0.67387,-0.58239 -1.0625,-0.8125 l -1.53125,1.46875 c -0.3057,-0.13661 -0.63429,-0.23916 -0.96875,-0.3125 l -0.40625,-2.09375 c -0.21544,-0.02 -0.4356,-0.0312 -0.65625,-0.0312 z m 0,4 c 1.65685,0 3,1.34315 3,3 0,1.65685 -1.34315,3 -3,3 -1.65685,0 -3,-1.34315 -3,-3 0,-1.65685 1.34315,-3 3,-3 z' id='path10065' sodipodi:nodetypes='sccccccccccsccccccccccsccccccccccsccccccccccssssss' style='color:#000000;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;marker:none;enable-background:accumulate'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-641.0002,-460.99999)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/applications-utilities-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/applications-utilities-symbolic-ref.png
new file mode 100644
index 00000000..8d6c48ff
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/applications-utilities-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/applications-utilities-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/applications-utilities-symbolic.svg
new file mode 100644
index 00000000..b6980938
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/applications-utilities-symbolic.svg
@@ -0,0 +1,33 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg width='16' id='svg7384' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' version='1.1' inkscape:version='0.48.1 r9760' height='16' xmlns:svg='http://www.w3.org/2000/svg' sodipodi:docname='applications-utilities-symbolic.svg' xmlns:cc='http://creativecommons.org/ns#' xmlns='http://www.w3.org/2000/svg' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:object-nodes='true' inkscape:snap-bbox='true' gridtolerance='10' id='namedview88' inkscape:window-width='1364' inkscape:object-paths='true' inkscape:snap-to-guides='true' inkscape:window-x='0' inkscape:window-y='26' pagecolor='#555753' inkscape:snap-nodes='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-grids='true' inkscape:cx='-210.32738' inkscape:cy='-108.46756' inkscape:pageopacity='1' inkscape:guide-bbox='true' inkscape:bbox-paths='false' showborder='false' inkscape:window-height='708' inkscape:pageshadow='2' inkscape:zoom='1' guidetolerance='10' inkscape:snap-global='true' inkscape:current-layer='g4953' borderopacity='1' showgrid='false' showguides='true' inkscape:snap-others='false' bordercolor='#666666' objecttolerance='10' inkscape:window-maximized='0'>
+ <inkscape:grid id='grid4866' empspacing='2' type='xygrid' enabled='true' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g id='layer9' inkscape:groupmode='layer' inkscape:label='status' style='display:inline' transform='translate(-482.00018,-461.99942)'/>
+ <g id='layer10' inkscape:groupmode='layer' inkscape:label='devices' transform='translate(-482.00018,-461.99942)'/>
+ <g id='layer11' inkscape:groupmode='layer' inkscape:label='apps' transform='translate(-482.00018,-461.99942)'/>
+ <g id='layer13' inkscape:groupmode='layer' inkscape:label='places' transform='translate(-482.00018,-461.99942)'/>
+ <g id='layer14' inkscape:groupmode='layer' inkscape:label='mimetypes' transform='translate(-482.00018,-461.99942)'/>
+ <g id='layer15' inkscape:groupmode='layer' inkscape:label='emblems' style='display:inline' transform='translate(-482.00018,-461.99942)'/>
+ <g id='g71291' inkscape:groupmode='layer' inkscape:label='emotes' style='display:inline' transform='translate(-482.00018,-461.99942)'/>
+ <g id='g4953' inkscape:groupmode='layer' inkscape:label='categories' style='display:inline' transform='translate(-482.00018,-461.99942)'>
+ <rect width='6' id='rect5455' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' height='16' ry='2.9860001' rx='2.9337087' y='461.99942' x='482.00018'/>
+ <path id='path256-4-4' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' sodipodi:nodetypes='csccccccssc' d='m 487.40645,461.99942 c 0.87799,0.71298 1.46875,1.79213 1.46875,3 l 0,1 2.125,0 c -0.0742,-1.09265 1.2487,-2 2,-2 0.68073,0 1,0.0117 1,1 l 0,1 1.21875,0 c 1.22869,-0.60001 1.78125,-1.96908 1.78125,-2.6875 0,-0.73589 -2.38538,-1.3125 -3.6875,-1.3125 z' inkscape:connector-curvature='0'/>
+ <path id='path249-7-76' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' sodipodi:nodetypes='cccccccccccc' d='m 489.0002,467 0,4.3125 c 2.76625,2.66159 6.12501,2.40625 6.12501,2.40625 0,0 0.35286,-1.5209 -1.90624,-4.03125 L 490.84396,467 l -0.625,0 -1.15625,0 c -0.0213,0.002 -0.0412,-0.002 -0.0625,0 z m 2.97505,2.53185 1.68345,1.73676 c -1.799,0.16548 -2.15075,-0.85626 -1.68345,-1.73676 z' inkscape:connector-curvature='0'/>
+
+ </g>
+ <g id='layer12' inkscape:groupmode='layer' inkscape:label='actions' style='display:inline' transform='translate(-482.00018,-461.99942)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/appointment-missed-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/appointment-missed-symbolic-ref.png
new file mode 100644
index 00000000..a336c281
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/appointment-missed-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/appointment-missed-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/appointment-missed-symbolic.svg
new file mode 100644
index 00000000..3845d548
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/appointment-missed-symbolic.svg
@@ -0,0 +1,33 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='appointment-missed-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.4 r9939' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='121.25379' inkscape:cy='-237.4382' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='2560' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='20px' originy='180px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-221.0002,-397)'>
+
+ <path inkscape:connector-curvature='0' d='M 227.40625,402 A 0.50005,0.50005 0 0 0 227,402.5 l 0,2.5 -1.5,0 a 0.50005,0.50005 0 1 0 0,1 l 2,0 a 0.50005,0.50005 0 0 0 0.5,-0.5 l 0,-3 a 0.50005,0.50005 0 0 0 -0.59375,-0.5 z' id='path4639-4-4-7' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 231.99995,408 1.375,0 1.125,1.09375 1.09375,-1.09375 1.40625,0 0,1.46875 -1.09375,1.0625 1.09375,1.0625 0,1.40625 -1.4375,0 -1.0625,-1.0625 -1.0625,1.0625 -1.4375,0 0,-1.40625 1.0625,-1.0625 -1.0625,-1.0625 0,-1.46875 z' id='path3761-2-3-5-4-8-9-8-0-1-6' sodipodi:nodetypes='ccccccccccccccccc' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible'/>
+ <path inkscape:connector-curvature='0' d='m 227.5002,399 c -3.57801,0 -6.5,2.92199 -6.5,6.5 0,3.57801 2.92199,6.5 6.5,6.5 1.29116,0 2.48506,-0.37561 3.5,-1.03125 l 0,-2.65625 c -0.82069,1.02721 -2.071,1.6875 -3.5,1.6875 -2.49713,0 -4.5,-2.00287 -4.5,-4.5 0,-2.49712 2.00287,-4.5 4.5,-4.5 2.49712,0 4.5,2.00288 4.5,4.5 0,0.53296 -0.11393,1.02721 -0.28125,1.5 l 2.09375,0 c 0.11483,-0.48186 0.1875,-0.98435 0.1875,-1.5 0,-3.57801 -2.922,-6.5 -6.5,-6.5 z' id='path3869-9' style='font-size:xx-small;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2.54545426;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-221.0002,-397)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-221.0002,-397)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-221.0002,-397)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-221.0002,-397)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-221.0002,-397)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-221.0002,-397)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-221.0002,-397)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-221.0002,-397)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/appointment-new-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/appointment-new-symbolic-ref.png
new file mode 100644
index 00000000..1c04bcb9
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/appointment-new-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/appointment-new-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/appointment-new-symbolic.svg
new file mode 100644
index 00000000..15e9b6ca
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/appointment-new-symbolic.svg
@@ -0,0 +1,33 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='appointment-new-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.5 r10040' width='16.000092' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='3.2813104' inkscape:cy='5.46164' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1375' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-19.999908px' originy='590px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-261.00011,-807)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-261.00011,-807)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-261.00011,-807)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-261.00011,-807)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-261.00011,-807)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-261.00011,-807)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-261.00011,-807)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-261.00011,-807)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-261.00011,-807)'>
+
+ <path inkscape:connector-curvature='0' d='m 273.0002,808 0,1.99673 -2,0 0,1.99673 2,0 0,1.99673 2,0 0,-1.99673 2,0 0,-1.99673 -2,0 0,-1.99673 -2,0 z' id='path26815' style='fill:#bebebe;fill-opacity:1;stroke:none;display:inline'/>
+ <path inkscape:connector-curvature='0' d='M 267.40625,813 A 0.50005,0.50005 0 0 0 267,813.5 l 0,2.5 -1.5,0 a 0.50005,0.50005 0 1 0 0,1 l 2,0 a 0.50005,0.50005 0 0 0 0.5,-0.5 l 0,-3 a 0.50005,0.50005 0 0 0 -0.59375,-0.5 z' id='path26788' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 267.5002,810 c -3.57802,0 -6.5,2.92199 -6.5,6.5 0,3.57801 2.92198,6.5 6.5,6.5 3.57799,0 6.5,-2.92199 6.5,-6.5 0,-0.51565 -0.0727,-1.01814 -0.1875,-1.5 l -2.09375,0 c 0.1673,0.47279 0.28125,0.96704 0.28125,1.5 0,2.49712 -2.00289,4.5 -4.5,4.5 -2.49713,0 -4.5,-2.00288 -4.5,-4.5 0,-2.49713 2.00287,-4.5 4.5,-4.5 0.9323,0 1.7895,0.26937 2.5,0.75 l 0,-2.25 c -0.7679,-0.32274 -1.61416,-0.5 -2.5,-0.5 z' id='path26792' style='font-size:xx-small;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2.54545426;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/appointment-soon-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/appointment-soon-symbolic-ref.png
new file mode 100644
index 00000000..cacfb3b1
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/appointment-soon-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/appointment-soon-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/appointment-soon-symbolic.svg
new file mode 100644
index 00000000..d62af966
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/appointment-soon-symbolic.svg
@@ -0,0 +1,33 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg sodipodi:docname='appointment-soon-symbolic.svg' xmlns='http://www.w3.org/2000/svg' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' height='16' inkscape:version='0.48.1 r9760' version='1.1' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:cc='http://creativecommons.org/ns#' width='16' id='svg7384' xmlns:svg='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:object-paths='true' showgrid='false' inkscape:pageopacity='1' inkscape:snap-global='true' inkscape:object-nodes='true' inkscape:zoom='1' inkscape:window-width='1364' inkscape:snap-others='false' inkscape:snap-bbox-midpoints='false' inkscape:current-layer='layer9' inkscape:snap-bbox='true' showguides='true' inkscape:snap-nodes='true' inkscape:window-height='708' inkscape:window-maximized='0' bordercolor='#666666' objecttolerance='10' guidetolerance='10' inkscape:window-x='0' inkscape:window-y='26' showborder='false' inkscape:snap-to-guides='true' gridtolerance='10' id='namedview88' inkscape:cx='110.6726' inkscape:cy='-173.46698' inkscape:guide-bbox='true' inkscape:snap-grids='true' pagecolor='#555753' borderopacity='1' inkscape:pageshadow='2' inkscape:bbox-paths='false'>
+ <inkscape:grid visible='true' snapvisiblegridlinesonly='true' enabled='true' type='xygrid' spacingx='1px' spacingy='1px' id='grid4866' empspacing='2'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' transform='translate(-161.0002,-397)' id='layer9' style='display:inline' inkscape:label='status'>
+
+ <path d='m 167.5002,397 c -3.578,0 -6.5,2.92199 -6.5,6.5 0,3.57801 2.922,6.5 6.5,6.5 0.1705,0 0.33269,-0.0182 0.5,-0.0312 l 0,-2.03125 c -0.16732,0.0186 -0.32741,0.0625 -0.5,0.0625 -2.49712,0 -4.5,-2.00288 -4.5,-4.5 0,-2.49712 2.00288,-4.5 4.5,-4.5 2.49712,0 4.5,2.00288 4.5,4.5 0,0.1726 -0.0439,0.33268 -0.0625,0.5 l 2.03125,0 c 0.013,-0.16731 0.0312,-0.3295 0.0312,-0.5 0,-3.57801 -2.922,-6.5 -6.5,-6.5 z' inkscape:connector-curvature='0' id='path3869-25' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2.54545712;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path d='M 167.40625,400 A 0.50005,0.50005 0 0 0 167,400.5 l 0,2.5 -1.5,0 a 0.50005,0.50005 0 1 0 0,1 l 2,0 a 0.50005,0.50005 0 0 0 0.5,-0.5 l 0,-3 a 0.50005,0.50005 0 0 0 -0.59375,-0.5 z' inkscape:connector-curvature='0' id='path4639-4' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path d='m 169.8752,405.06918 c -0.49245,0 -0.875,0.37924 -0.875,0.8674 l 0,6.19571 c 0,0.48816 0.38255,0.8674 0.875,0.8674 l 6.25,0 c 0.49245,0 0.875,-0.37924 0.875,-0.8674 l 0,-6.19571 c 0,-0.48816 -0.38255,-0.8674 -0.875,-0.8674 l -6.25,0 z m 2.125,0.99131 2,0 0,3.96526 -2,0 0,-3.96526 z m 0,4.95657 2,0 0,0.99132 -2,0 0,-0.99132 z' inkscape:connector-curvature='0' id='path10898-2-9-4' class='warning' style='color:#bebebe;fill:#f57900;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible'/>
+ </g>
+ <g inkscape:groupmode='layer' transform='translate(-161.0002,-397)' id='layer10' inkscape:label='devices'/>
+ <g inkscape:groupmode='layer' transform='translate(-161.0002,-397)' id='layer11' inkscape:label='apps'/>
+ <g inkscape:groupmode='layer' transform='translate(-161.0002,-397)' id='layer13' inkscape:label='places'/>
+ <g inkscape:groupmode='layer' transform='translate(-161.0002,-397)' id='layer14' inkscape:label='mimetypes'/>
+ <g inkscape:groupmode='layer' transform='translate(-161.0002,-397)' id='layer15' style='display:inline' inkscape:label='emblems'/>
+ <g inkscape:groupmode='layer' transform='translate(-161.0002,-397)' id='g71291' style='display:inline' inkscape:label='emotes'/>
+ <g inkscape:groupmode='layer' transform='translate(-161.0002,-397)' id='g4953' style='display:inline' inkscape:label='categories'/>
+ <g inkscape:groupmode='layer' transform='translate(-161.0002,-397)' id='layer12' style='display:inline' inkscape:label='actions'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/audio-card-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/audio-card-symbolic-ref.png
new file mode 100644
index 00000000..94ef3d70
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/audio-card-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/audio-card-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/audio-card-symbolic.svg
new file mode 100644
index 00000000..9eaae83b
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/audio-card-symbolic.svg
@@ -0,0 +1,36 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg inkscape:version='0.48.1 r9760' version='1.1' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns='http://www.w3.org/2000/svg' width='16.014242' height='16.014242' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='audio-card-symbolic.svg' id='svg7384' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:svg='http://www.w3.org/2000/svg' xmlns:cc='http://creativecommons.org/ns#'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:window-x='0' inkscape:window-y='26' inkscape:window-maximized='0' pagecolor='#555753' showborder='false' inkscape:pageshadow='2' bordercolor='#666666' inkscape:snap-bbox='true' inkscape:current-layer='layer10' inkscape:snap-grids='true' inkscape:bbox-paths='false' inkscape:snap-others='false' inkscape:window-height='1020' inkscape:snap-nodes='true' borderopacity='1' showguides='true' inkscape:snap-global='true' inkscape:pageopacity='1' inkscape:object-paths='false' objecttolerance='10' gridtolerance='10' showgrid='false' inkscape:zoom='1' inkscape:snap-to-guides='true' inkscape:object-nodes='false' id='namedview88' inkscape:snap-bbox-midpoints='false' inkscape:guide-bbox='true' inkscape:window-width='1598' inkscape:cx='87.05621' inkscape:cy='-159.54355' guidetolerance='10'>
+ <inkscape:grid visible='true' spacingx='1px' spacingy='1px' empspacing='2' enabled='true' id='grid4866' snapvisiblegridlinesonly='true' type='xygrid'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:label='status' style='display:inline' inkscape:groupmode='layer' id='layer9' transform='translate(-301,-447)'/>
+ <g inkscape:label='devices' inkscape:groupmode='layer' id='layer10' transform='translate(-301,-447)'>
+ <path d='M 313.90625,448 A 1.0001,1.0001 0 0 0 313,449 l 0,13 a 1.0001,1.0001 0 1 0 2,0 l 0,-12 1,0 a 1.0001,1.0001 0 1 0 0,-2 l -2,0 a 1.0001,1.0001 0 0 0 -0.0937,0 z' inkscape:connector-curvature='0' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans' id='path4781'/>
+ <path d='m 314,453 0,0.5 0,2 0,0.5 0.5,0 2,0 0.5,0 0,-0.5 0,-2 0,-0.5 -0.5,0 -2,0 -0.5,0 z m 1,1 1,0 0,1 -1,0 0,-1 z' inkscape:connector-curvature='0' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Sans;-inkscape-font-specification:Sans' id='rect5551'/>
+ <path d='m 314,457 0,0.5 0,2 0,0.5 0.5,0 2,0 0.5,0 0,-0.5 0,-2 0,-0.5 -0.5,0 -2,0 -0.5,0 z m 1,1 1,0 0,1 -1,0 0,-1 z' inkscape:connector-curvature='0' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Sans;-inkscape-font-specification:Sans' id='rect5551-4'/>
+ <path d='m 301,451 0,1 0,10 0,1 1,0 8,0 1,0 0,-1 0,-1 1,0 0,-2 -1,0 -1,0 -1,0 0,1 0,1 -6,0 0,-8 2,0 1,0 0,-2 -1,0 -3,0 -1,0 z' inkscape:connector-curvature='0' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans' id='path5571'/>
+
+ <path d='m 307,448 5.0002,4 -3.0002,0 0,4.53124 -2,0 z' inkscape:connector-curvature='0' style='fill:#bebebe;fill-opacity:1;stroke:none;display:inline' sodipodi:nodetypes='cccccc' id='rect3818-0'/>
+ <path d='m 9.625,223.6875 a 6.0625,5.9375 0 1 1 -12.125,0 6.0625,5.9375 0 1 1 12.125,0 z' style='fill:#bebebe;fill-opacity:1;stroke:none;display:inline' sodipodi:rx='6.0625' sodipodi:ry='5.9375' id='path3822-1' transform='matrix(0.41157264,0,0,0.4202381,305.03397,362.50283)' sodipodi:cx='3.5625' sodipodi:cy='223.6875' sodipodi:type='arc'/>
+ </g>
+ <g inkscape:label='apps' inkscape:groupmode='layer' id='layer11' transform='translate(-301,-447)'/>
+ <g inkscape:label='places' inkscape:groupmode='layer' id='layer13' transform='translate(-301,-447)'/>
+ <g inkscape:label='mimetypes' inkscape:groupmode='layer' id='layer14' transform='translate(-301,-447)'/>
+ <g inkscape:label='emblems' style='display:inline' inkscape:groupmode='layer' id='layer15' transform='translate(-301,-447)'/>
+ <g inkscape:label='emotes' style='display:inline' inkscape:groupmode='layer' transform='translate(-301,-447)' id='g71291'/>
+ <g inkscape:label='categories' style='display:inline' inkscape:groupmode='layer' id='g4953' transform='translate(-301,-447)'/>
+ <g inkscape:label='actions' style='display:inline' inkscape:groupmode='layer' id='layer12' transform='translate(-301,-447)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/audio-headphones-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/audio-headphones-symbolic-ref.png
new file mode 100644
index 00000000..22f31f59
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/audio-headphones-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/audio-headphones-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/audio-headphones-symbolic.svg
new file mode 100644
index 00000000..68cec823
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/audio-headphones-symbolic.svg
@@ -0,0 +1,33 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='audio-headphones-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.4 r9939' version='1.1' width='16.000002' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer10' inkscape:cx='367.98092' inkscape:cy='-37.12982' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1408' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='0' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='180px' originy='250px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-61.0002,-467)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-61.0002,-467)'>
+
+ <rect height='6.0516844' id='rect8337' rx='1.862784' ry='1.862784' style='fill:#bebebe;fill-opacity:1;stroke:none' transform='matrix(0.95982607,-0.28059566,0.29019891,0.95696635,0,0)' width='3.5680485' x='-77.762108' y='475.23813'/>
+ <path inkscape:connector-curvature='0' d='m 68.968788,468 c -3.305456,0 -6.023914,3.00835 -5.968586,5.71875 0.04825,2.36557 0.808593,4.69547 1,5.28125 1.583096,0 0,0 1.525504,0 -1.16149,-2.29152 -1.049064,-5.1562 -1.049064,-5.1562 0,-2.37255 2.006651,-4.31249 4.492146,-4.3125 2.485496,0 4.499787,1.82687 4.492147,4.28125 -0.02342,1.67413 -0.171684,2.65858 -1.005236,5.1875 l 1.570681,0 c 0.224499,-0.64458 0.973822,-3.19046 0.973822,-5.28125 0,-2.8298 -2.725958,-5.71875 -6.031414,-5.71875 z' id='rect8346' sodipodi:nodetypes='cscccscccssc' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+ <rect height='6.0516844' id='rect8371' rx='1.862784' ry='1.862784' style='fill:#bebebe;fill-opacity:1;stroke:none' transform='matrix(-0.95982607,-0.28059566,-0.29019891,0.95696635,0,0)' width='3.5680485' x='-209.83998' y='436.54532'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-61.0002,-467)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-61.0002,-467)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-61.0002,-467)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-61.0002,-467)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-61.0002,-467)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-61.0002,-467)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-61.0002,-467)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/audio-headset-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/audio-headset-symbolic-ref.png
new file mode 100644
index 00000000..ac0f42fe
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/audio-headset-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/audio-headset-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/audio-headset-symbolic.svg
new file mode 100644
index 00000000..5f5044a0
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/audio-headset-symbolic.svg
@@ -0,0 +1,35 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='audio-headset-symbolic.svg' height='16.000919' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.4 r9939' version='1.1' width='16.000002' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer10' inkscape:cx='11.38092' inkscape:cy='-7.1367' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1408' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='0' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='160px' originy='250px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-81.0002,-466.99908)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-81.0002,-466.99908)'>
+
+ <path inkscape:connector-curvature='0' d='m 88.968788,466.99908 c -3.305456,0 -6.023869,3.00835 -5.968586,5.71875 0.06164,3.02218 0.933593,4.69547 1.125,5.28125 1.583096,0 -0.125,0 1.400504,0 -1.16149,-2.29152 -1.049064,-5.1562 -1.049064,-5.1562 0,-2.37255 2.006651,-4.31249 4.492146,-4.3125 2.485496,0 4.499787,1.92062 4.492147,4.375 -0.02342,1.67413 -0.171684,2.28358 -1.005236,4.8125 l 1.570681,0 c 0.224499,-0.64458 0.973822,-2.06546 0.973822,-4.90625 0,-2.8298 -2.725958,-5.8125 -6.031414,-5.8125 z' id='path10296' sodipodi:nodetypes='cscccscccssc' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+ <rect height='5.1319256' id='rect10298' rx='1.8617905' ry='1.8614891' style='fill:#bebebe;fill-opacity:1;stroke:none' transform='matrix(-0.96317422,-0.26887809,-0.3026725,0.95309462,0,0)' width='3.1448481' x='-234.4108' y='431.70209'/>
+ <rect height='5.1319256' id='rect10300' rx='1.8617905' ry='1.8614891' style='fill:#bebebe;fill-opacity:1;stroke:none' transform='matrix(0.96317422,-0.26887809,0.3026725,0.95309462,0,0)' width='3.1448481' x='-64.604736' y='479.60641'/>
+ <rect height='1.96875' id='rect10302' rx='0.984375' ry='0.984375' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' width='3.90625' x='87.062698' y='480.96875'/>
+ <path inkscape:connector-curvature='0' d='m 93.59375,476.40625 a 0.50005,0.50005 0 0 0 -0.0625,0.96875 L 95,477.90625 l -0.03125,1.75 c -0.0049,0.53205 -0.135886,0.86771 -0.3125,1.0625 C 94.479636,480.91354 94.254364,481 93.9375,481 l -4.15625,0 a 0.50005,0.50005 0 1 0 0,1 l 4.15625,0 c 0.547554,0 1.092669,-0.21022 1.46875,-0.625 0.376081,-0.41478 0.555999,-1.00902 0.5625,-1.71875 L 96,477.5625 l 0,-0.34375 -0.3125,-0.125 -1.78125,-0.65625 a 0.50005,0.50005 0 0 0 -0.3125,-0.0312 z' id='path10304' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-81.0002,-466.99908)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-81.0002,-466.99908)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-81.0002,-466.99908)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-81.0002,-466.99908)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-81.0002,-466.99908)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-81.0002,-466.99908)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-81.0002,-466.99908)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/audio-input-microphone-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/audio-input-microphone-symbolic-ref.png
new file mode 100644
index 00000000..cff1ab3d
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/audio-input-microphone-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/audio-input-microphone-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/audio-input-microphone-symbolic.svg
new file mode 100644
index 00000000..ada74254
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/audio-input-microphone-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='audio-input-microphone-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer10' inkscape:cx='5.31869' inkscape:cy='11.86229' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1374' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='8'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='180.0002px' originy='230px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-61,-447)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-61,-447)'>
+
+ <path inkscape:connector-curvature='0' d='m 64.5002,452 c -0.27614,0 -0.5,0.22386 -0.5,0.5 l 0,2.96875 c 0,1.96838 1.25801,3.62455 3,4.25 l 0,1.28125 -2,0 c -0.56475,0 -1,0.49007 -1,1 l 0,1 0.84375,0 2.15625,0 5,0 0.0937,0 0.90625,0 0,-1 c -6e-5,-0.58435 -0.47642,-0.99995 -1,-1 l -2,0 0,-1.28125 c 1.74199,-0.62545 3,-2.28162 3,-4.25 l 0,-2.96875 c 0,-0.27614 -0.22386,-0.5 -0.5,-0.5 -0.27614,0 -0.5,0.22386 -0.5,0.5 0,0.069 0.006,0.12768 0.0312,0.1875 l 0,2.78125 c 0,1.96415 -1.57895,3.53125 -3.53125,3.53125 -1.9523,0 -3.5,-1.5671 -3.5,-3.53125 l 0,-2.96875 c 0,-0.27614 -0.22386,-0.5 -0.5,-0.5 z M 68.5,447.98712 c 1.385,0 2.5,1.115 2.5,2.5 L 71,455.5 c 0,1.385 -1.115,2.5 -2.5,2.5 -1.385,0 -2.5,-1.115 -2.5,-2.5 l 0,-5.01288 c 0,-1.385 1.115,-2.5 2.5,-2.5 z' id='rect6806' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.00302994;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-61,-447)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-61,-447)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-61,-447)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-61,-447)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-61,-447)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-61,-447)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-61,-447)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/audio-speakers-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/audio-speakers-symbolic-ref.png
new file mode 100644
index 00000000..3547593f
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/audio-speakers-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/audio-speakers-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/audio-speakers-symbolic.svg
new file mode 100644
index 00000000..0cca55ea
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/audio-speakers-symbolic.svg
@@ -0,0 +1,37 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='audio-speakers-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.4 r9939' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer10' inkscape:cx='111.28381' inkscape:cy='-171.9103' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='702' inkscape:window-maximized='1' inkscape:window-width='1366' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='80.000002px' originy='250px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ <inkscape:grid color='#000000' empcolor='#000000' empopacity='0' empspacing='4' enabled='true' id='grid5968' opacity='0.1254902' originx='80.000002px' originy='250px' snapvisiblegridlinesonly='true' spacingx='0.5px' spacingy='0.5px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-161.0002,-467)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-161.0002,-467)'>
+ <path inkscape:connector-curvature='0' d='m 162.0002,472 2.48437,0 2.96876,-3 0.54687,0.0156 0,12 -0.4753,8.3e-4 -3.04033,-3.01643 -2.48437,0 z' id='path5491-6' sodipodi:nodetypes='ccccccccc' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible'/>
+
+ <path inkscape:connector-curvature='0' d='m 172.875,468 a 1.0001,1.0001 0 0 0 -0.59375,0.28125 l -2,2 a 1.016466,1.016466 0 1 0 1.4375,1.4375 l 2,-2 A 1.0001,1.0001 0 0 0 172.875,468 z' id='path8311' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 170.78125,478 a 1.0001,1.0001 0 0 0 -0.5,1.71875 l 2,2 a 1.016466,1.016466 0 1 0 1.4375,-1.4375 l -2,-2 A 1.0001,1.0001 0 0 0 170.78125,478 z' id='path9081' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='M 170.90625,474 A 1.001098,1.001098 0 1 0 171,476 l 4.03125,0.0312 a 1.0001,1.0001 0 1 0 0,-2 L 171,474 a 1.0001,1.0001 0 0 0 -0.0937,0 z' id='path9083' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <rect height='1' id='rect9102' style='color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' width='1.0000017' x='170.0002' y='471'/>
+ <rect height='1' id='rect9104' style='color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' width='1.0000017' x='170.0002' y='478'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-161.0002,-467)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-161.0002,-467)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-161.0002,-467)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-161.0002,-467)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-161.0002,-467)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-161.0002,-467)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-161.0002,-467)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/audio-volume-high-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/audio-volume-high-symbolic-ref.png
new file mode 100644
index 00000000..f065ca25
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/audio-volume-high-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/audio-volume-high-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/audio-volume-high-symbolic.svg
new file mode 100644
index 00000000..b55020f3
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/audio-volume-high-symbolic.svg
@@ -0,0 +1,38 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='audio-volume-high-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.92.2 (5c3e80d, 2017-08-06)' viewBox='0 0 16 16' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer10' inkscape:cx='28.76236' inkscape:cy='10.227083' inkscape:document-rotation='0' inkscape:document-units='px' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:measure-end='0,0' inkscape:measure-start='-190.687,-191.14' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='true' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1016' inkscape:window-maximized='1' inkscape:window-width='1920' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='16'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='200' originy='-20' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-41.0002,-197)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-41.0002,-197)'>
+ <path inkscape:connector-curvature='0' d='m 41.000202,201.99979 h 2.484375 L 46.453331,199 h 0.546871 v 11.99917 L 46.524905,211 43.484577,207.99938 h -2.484375 z' id='path5491' sodipodi:nodetypes='ccccccccc' style='color:#bebebe;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none'/>
+
+ <path inkscape:connector-curvature='0' d='m 56.000192,205.0002 c 0,-2.81422 -1,-5.17173 -2.58557,-7 h -1.41443 v 1.48072 c 1.26466,1.51928 2,3.21936 2,5.51928 0,2.29992 -0.77953,4 -2,5.51928 v 1.48072 h 1.38128 c 1.46575,-1.64044 2.61872,-4.18578 2.61872,-7 z' id='rect11714-3' sodipodi:nodetypes='scccscccs' style='color:#000000;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0;marker:none;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 53.000192,205.0002 c 0,-2.16664 -0.73878,-4.01982 -2,-5 h -1 v 2 c 0.60652,0.78878 1,1.75887 1,3 0,1.24113 -0.39348,2.21938 -1,3 v 2 h 1 c 1.2229,-0.99478 2,-2.8734 2,-5 z' id='rect11703-1' sodipodi:nodetypes='scccscccs' style='color:#000000;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0;marker:none;enable-background:accumulate'/>
+ <path clip-path='none' inkscape:connector-curvature='0' d='m 50.000192,205.0002 c 0,-1.25733 -0.31165,-2.21571 -1,-3 h -1 v 6 h 1 c 0.67206,-0.8369 1,-1.74267 1,-3 z' id='path6297-6' mask='none' sodipodi:nodetypes='zccccz' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:Sans;-inkscape-font-specification:Sans;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2.32782054;marker:none;enable-background:accumulate'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-41.0002,-197)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-41.0002,-197)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-41.0002,-197)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-41.0002,-197)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-41.0002,-197)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-41.0002,-197)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-41.0002,-197)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/audio-volume-low-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/audio-volume-low-symbolic-ref.png
new file mode 100644
index 00000000..0acb2670
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/audio-volume-low-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/audio-volume-low-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/audio-volume-low-symbolic.svg
new file mode 100644
index 00000000..fb76a841
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/audio-volume-low-symbolic.svg
@@ -0,0 +1,38 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='audio-volume-low-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.92.2 (5c3e80d, 2017-08-06)' viewBox='0 0 16 16' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer10' inkscape:cx='-11.23764' inkscape:cy='10.227083' inkscape:document-rotation='0' inkscape:document-units='px' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:measure-end='0,0' inkscape:measure-start='-190.687,-191.14' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='true' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1016' inkscape:window-maximized='1' inkscape:window-width='1920' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='16'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='160' originy='-20' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-81.0002,-197)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-81.0002,-197)'>
+
+ <path inkscape:connector-curvature='0' d='m 81.0002,201.99979 h 2.48437 L 86.45333,199 h 0.54687 v 11.99917 L 86.5249,211 83.48457,207.99938 H 81.0002 Z' id='path5491-3' sodipodi:nodetypes='ccccccccc' style='color:#bebebe;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none'/>
+ <path inkscape:connector-curvature='0' d='m 96.00019,205.0002 c 0,-2.81422 -1,-5.17173 -2.58557,-7 h -1.41443 v 1.48072 c 1.26466,1.51928 2,3.21936 2,5.51928 0,2.29992 -0.77953,4 -2,5.51928 v 1.48072 h 1.38128 c 1.46575,-1.64044 2.61872,-4.18578 2.61872,-7 z' id='rect11714-3-5' sodipodi:nodetypes='scccscccs' style='color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.35;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0;marker:none;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 93.00019,205.0002 c 0,-2.16664 -0.73878,-4.01982 -2,-5 h -1 v 2 c 0.60652,0.78878 1,1.75887 1,3 0,1.24113 -0.39348,2.21938 -1,3 v 2 h 1 c 1.2229,-0.99478 2,-2.8734 2,-5 z' id='rect11703-1-62' sodipodi:nodetypes='scccscccs' style='color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.35;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0;marker:none;enable-background:accumulate'/>
+ <path clip-path='none' inkscape:connector-curvature='0' d='m 90.00019,205.0002 c 0,-1.25733 -0.31165,-2.21571 -1,-3 h -1 v 6 h 1 c 0.67206,-0.8369 1,-1.74267 1,-3 z' id='path6297-6-9' mask='none' sodipodi:nodetypes='zccccz' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:Sans;-inkscape-font-specification:Sans;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2.32782054;marker:none;enable-background:accumulate'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-81.0002,-197)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-81.0002,-197)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-81.0002,-197)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-81.0002,-197)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-81.0002,-197)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-81.0002,-197)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-81.0002,-197)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/audio-volume-medium-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/audio-volume-medium-symbolic-ref.png
new file mode 100644
index 00000000..66d6f452
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/audio-volume-medium-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/audio-volume-medium-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/audio-volume-medium-symbolic.svg
new file mode 100644
index 00000000..53dea7fc
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/audio-volume-medium-symbolic.svg
@@ -0,0 +1,38 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='audio-volume-medium-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.92.2 (5c3e80d, 2017-08-06)' viewBox='0 0 16 16' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer10' inkscape:cx='8.76236' inkscape:cy='10.227083' inkscape:document-rotation='0' inkscape:document-units='px' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:measure-end='0,0' inkscape:measure-start='-190.687,-191.14' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='true' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1016' inkscape:window-maximized='1' inkscape:window-width='1920' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='16'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='180' originy='-20' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-61.0002,-197)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-61.0002,-197)'>
+
+ <path inkscape:connector-curvature='0' d='m 76.00019,205.0002 c 0,-2.81422 -1,-5.17173 -2.58557,-7 h -1.41443 v 1.48072 c 1.26466,1.51928 2,3.21936 2,5.51928 0,2.29992 -0.77953,4 -2,5.51928 v 1.48072 h 1.38128 c 1.46575,-1.64044 2.61872,-4.18578 2.61872,-7 z' id='rect11714-3-3' sodipodi:nodetypes='scccscccs' style='color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.35;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0;marker:none;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 73.00019,205.0002 c 0,-2.16664 -0.73878,-4.01982 -2,-5 h -1 v 2 c 0.60652,0.78878 1,1.75887 1,3 0,1.24113 -0.39348,2.21938 -1,3 v 2 h 1 c 1.2229,-0.99478 2,-2.8734 2,-5 z' id='rect11703-1-6' sodipodi:nodetypes='scccscccs' style='color:#000000;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0;marker:none;enable-background:accumulate'/>
+ <path clip-path='none' inkscape:connector-curvature='0' d='m 70.00019,205.0002 c 0,-1.25733 -0.31165,-2.21571 -1,-3 h -1 v 6 h 1 c 0.67206,-0.8369 1,-1.74267 1,-3 z' id='path6297-6-7' mask='none' sodipodi:nodetypes='zccccz' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:Sans;-inkscape-font-specification:Sans;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2.32782054;marker:none;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 61.0002,201.99979 h 2.48437 L 66.45333,199 h 0.54687 v 11.99917 L 66.5249,211 63.48457,207.99938 H 61.0002 Z' id='path5491-5' sodipodi:nodetypes='ccccccccc' style='color:#bebebe;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-61.0002,-197)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-61.0002,-197)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-61.0002,-197)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-61.0002,-197)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-61.0002,-197)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-61.0002,-197)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-61.0002,-197)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/audio-volume-muted-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/audio-volume-muted-symbolic-ref.png
new file mode 100644
index 00000000..2cdc3409
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/audio-volume-muted-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/audio-volume-muted-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/audio-volume-muted-symbolic.svg
new file mode 100644
index 00000000..1b015883
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/audio-volume-muted-symbolic.svg
@@ -0,0 +1,39 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='audio-volume-muted-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.92.2 (5c3e80d, 2017-08-06)' viewBox='0 0 16 16' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer10' inkscape:cx='-31.23764' inkscape:cy='10.227083' inkscape:document-rotation='0' inkscape:document-units='px' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:measure-end='0,0' inkscape:measure-start='-190.687,-191.14' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='true' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1016' inkscape:window-maximized='1' inkscape:window-width='1920' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='16'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='140' originy='-20' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-101.0002,-197)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-101.0002,-197)'>
+
+ <path inkscape:connector-curvature='0' d='m 111.99995,208 h 1.375 l 1.125,1.09375 L 115.5937,208 h 1.40625 v 1.46875 l -1.09375,1.0625 1.09375,1.0625 V 213 h -1.4375 l -1.0625,-1.0625 -1.0625,1.0625 h -1.4375 v -1.40625 l 1.0625,-1.0625 -1.0625,-1.0625 z' id='path3761-2-3-5-4-8-9-8-0-1-7' sodipodi:nodetypes='ccccccccccccccccc' style='color:#bebebe;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none'/>
+ <path inkscape:connector-curvature='0' d='m 101.0002,201.99979 h 2.48437 L 106.45333,199 h 0.54687 v 11.99917 l -0.4753,8.3e-4 -3.04033,-3.00062 h -2.48437 z' id='path5491-1' sodipodi:nodetypes='ccccccccc' style='color:#bebebe;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none'/>
+ <path inkscape:connector-curvature='0' d='m 112.0002,198 v 1.48047 c 1.26466,1.51928 2,3.21961 2,5.51953 0,0.72331 -0.0849,1.38231 -0.22852,2 h 2.03321 c 0.1248,-0.64471 0.19531,-1.31415 0.19531,-2 0,-2.81422 -1.00037,-5.17173 -2.58594,-7 z' id='rect11714-3-2' style='color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.35;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0;marker:none;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 110.0002,200 v 2 c 0.60652,0.78878 1,1.75887 1,3 0,1.24113 -0.39348,2.21938 -1,3 v 2 h 1 v -3 h 1.75 c 0.15789,-0.62586 0.25,-1.29696 0.25,-2 0,-2.16664 -0.73878,-4.01982 -2,-5 z' id='rect11703-1-7' style='color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.35;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0;marker:none;enable-background:accumulate'/>
+ <path clip-path='none' inkscape:connector-curvature='0' d='m 110.00019,205.0002 c 0,-1.25733 -0.31165,-2.21571 -1,-3 h -1 v 6 h 1 c 0.67206,-0.8369 1,-1.74267 1,-3 z' id='path6297-6-0' mask='none' sodipodi:nodetypes='zccccz' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:Sans;-inkscape-font-specification:Sans;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;display:inline;overflow:visible;visibility:visible;opacity:0.35;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2.32782054;marker:none;enable-background:accumulate'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-101.0002,-197)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-101.0002,-197)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-101.0002,-197)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-101.0002,-197)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-101.0002,-197)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-101.0002,-197)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-101.0002,-197)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/audio-volume-overamplified-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/audio-volume-overamplified-symbolic-ref.png
new file mode 100644
index 00000000..be78a91d
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/audio-volume-overamplified-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/audio-volume-overamplified-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/audio-volume-overamplified-symbolic.svg
new file mode 100644
index 00000000..bfc60d7c
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/audio-volume-overamplified-symbolic.svg
@@ -0,0 +1,37 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='audio-volume-overamplified-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16.015631' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.92.2 5c3e80d, 2017-08-06' viewBox='0 0 16 16.015631' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer10' inkscape:cx='11.58943' inkscape:cy='-64.299778' inkscape:document-rotation='0' inkscape:document-units='px' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:measure-end='0,0' inkscape:measure-start='-190.687,-191.14' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='3440' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='4'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='220' originy='-20' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-21.0002,-196.98437)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-21.0002,-196.98437)'>
+ <path inkscape:connector-curvature='0' d='m 21.000202,201.99979 h 2.484375 L 26.453331,199 h 0.546871 v 11.99917 L 26.524905,211 23.484577,207.99938 h -2.484375 z' id='path64697' sodipodi:nodetypes='ccccccccc' style='color:#bebebe;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none'/>
+
+ <path clip-path='none' inkscape:connector-curvature='0' d='m 36.031452,197 -2,0.73736 v 14.52528 l 2,0.73736 z m -3,1.10605 -2,0.73736 v 12.31318 l 2,0.73736 z m -3.03125,1.11793 -2,0.74133 v 10.06938 l 2,0.74133 z' id='path64709' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ <path clip-path='none' inkscape:connector-curvature='0' d='m 36.03145,197 h -2 v 4.42187 l 2,-0.36328 z m -3,0 h -2 v 4.9668 l 2,-0.36328 z m -3.03125,0 -2,-0.0156 v 5.53516 l 2,-0.36524 z m -2,10.48047 V 213 h 2 v -5.1543 z m 3.03125,0.55273 V 213 h 2 v -4.60352 z m 3,0.54492 V 213 h 2 v -4.05859 z' id='path64787' sodipodi:nodetypes='cccccccccccccccccccccccccccccc' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.35;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-21.0002,-196.98437)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-21.0002,-196.98437)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-21.0002,-196.98437)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-21.0002,-196.98437)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-21.0002,-196.98437)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-21.0002,-196.98437)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-21.0002,-196.98437)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/audio-x-generic-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/audio-x-generic-symbolic-ref.png
new file mode 100644
index 00000000..4651f386
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/audio-x-generic-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/audio-x-generic-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/audio-x-generic-symbolic.svg
new file mode 100644
index 00000000..7feda5c3
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/audio-x-generic-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='audio-x-generic-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16.000004' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer14' inkscape:cx='-110.66594' inkscape:cy='-122.32497' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1170' inkscape:window-maximized='0' inkscape:window-width='1265' inkscape:window-x='490' inkscape:window-y='184' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-220px' originy='84px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-461.0002,-301)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-461.0002,-301)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-461.0002,-301)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-461.0002,-301)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-461.0002,-301)'>
+
+ <path inkscape:connector-curvature='0' d='m 466.0002,302 0,7.34375 C 465.5477,309.13233 465.0305,309 464.5002,309 c -1.92115,0 -3.5,1.57885 -3.5,3.5 0,1.92115 1.57885,3.5 3.5,3.5 1.91032,0 3.48231,-1.56226 3.5,-3.46875 10e-5,-0.0108 0,-0.0204 0,-0.0312 l 0,-7.5 6,0 0,4.34375 C 473.5477,309.13233 473.0305,309 472.5002,309 c -1.92115,0 -3.5,1.57885 -3.5,3.5 0,1.92115 1.57885,3.5 3.5,3.5 1.8995,0 3.46489,-1.54571 3.5,-3.4375 4e-4,-0.0216 0,-0.0408 0,-0.0625 l 0,-10.5 z' id='path8576' sodipodi:nodetypes='ccssscscccssssscc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.94454503;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-461.0002,-301)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-461.0002,-301)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-461.0002,-301)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-461.0002,-301)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/auth-fingerprint-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/auth-fingerprint-symbolic-ref.png
new file mode 100644
index 00000000..57326b47
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/auth-fingerprint-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/auth-fingerprint-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/auth-fingerprint-symbolic.svg
new file mode 100644
index 00000000..d2225ae6
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/auth-fingerprint-symbolic.svg
@@ -0,0 +1,37 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='auth-fingerprint-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.92.2 2405546, 2018-03-11' viewBox='0 0 16.000002 16' width='16.000002' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer10' inkscape:cx='5.717332' inkscape:cy='4.2489433' inkscape:document-rotation='0' inkscape:document-units='px' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:measure-end='0,0' inkscape:measure-start='-190.687,-191.14' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='3440' inkscape:window-x='0' inkscape:window-y='61' inkscape:zoom='11.313708'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-59.999999' originy='350' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-301.0002,-567)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-301.0002,-567)'>
+
+ <path inkscape:connector-curvature='0' d='m 307.65625,567.25391 c -1.88301,0.10591 -3.84191,0.79392 -5.62695,2.30664 a 0.750075,0.750075 0 1 0 0.96875,1.14453 c 3.09284,-2.621 6.60623,-2.32919 9.10156,-0.95313 1.24767,0.68804 2.21006,1.65841 2.6875,2.61133 0.47744,0.95292 0.50751,1.81365 -0.004,2.60156 -0.57071,0.87926 -2.34951,1.49965 -3.83008,-0.13867 -0.88747,-0.98203 -2.08448,-1.33105 -3.13476,-1.13281 -1.05028,0.19824 -1.95639,0.88218 -2.47852,1.83203 -0.52213,0.94985 -0.63416,2.19432 -0.0879,3.39844 0.54628,1.20411 1.70469,2.34224 3.61133,3.27734 a 0.750075,0.750075 0 1 0 0.66211,-1.3457 c -1.69039,-0.82904 -2.54673,-1.75401 -2.9082,-2.55078 -0.36148,-0.79677 -0.27359,-1.49143 0.0371,-2.05664 0.31069,-0.56521 0.86893,-0.97166 1.44336,-1.08008 0.57442,-0.10843 1.16176,0.0218 1.74218,0.66406 2.03316,2.24978 5.04655,1.72808 6.20118,-0.0508 0.82155,-1.26573 0.73775,-2.79279 0.0879,-4.08984 -0.64987,-1.29706 -1.82756,-2.43738 -3.30469,-3.25196 -1.47713,-0.81457 -3.28496,-1.29146 -5.16797,-1.18554 z' id='path8391' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 309.02344,570.57422 c -1.64348,-0.12381 -3.30449,0.37548 -4.60547,1.34375 -1.30098,0.96827 -2.27402,2.41666 -2.52539,4.16015 -0.25137,1.7435 0.23252,3.74452 1.68164,5.77344 a 0.750075,0.750075 0 1 0 1.2207,-0.87109 c -1.27309,-1.78247 -1.60843,-3.36644 -1.41797,-4.6875 0.19047,-1.32106 0.92082,-2.4152 1.9375,-3.17188 2.03337,-1.51335 5.08638,-1.63315 7.03907,0.78711 a 0.750075,0.750075 0 1 0 1.16796,-0.9414 c -1.22835,-1.52249 -2.85456,-2.26877 -4.49804,-2.39258 z' id='path8393' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 308.39453,576.70312 a 0.750075,0.750075 0 0 0 -0.57617,1.19532 c 1.15011,1.60497 3.34128,2.82139 5.54883,2.51953 a 0.750075,0.750075 0 1 0 -0.20313,-1.48633 c -1.48195,0.20264 -3.32087,-0.7841 -4.125,-1.90625 a 0.750075,0.750075 0 0 0 -0.64453,-0.32227 z' id='path8395' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-301.0002,-567)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-301.0002,-567)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-301.0002,-567)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-301.0002,-567)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-301.0002,-567)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-301.0002,-567)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-301.0002,-567)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/auth-smartcard-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/auth-smartcard-symbolic-ref.png
new file mode 100644
index 00000000..ba6e97d3
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/auth-smartcard-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/auth-smartcard-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/auth-smartcard-symbolic.svg
new file mode 100644
index 00000000..7cc412d7
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/auth-smartcard-symbolic.svg
@@ -0,0 +1,35 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='auth-smartcard-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.92.2 2405546, 2018-03-11' viewBox='0 0 16.000002 16' width='16.000002' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer10' inkscape:cx='30.669996' inkscape:cy='6.57492' inkscape:document-rotation='0' inkscape:document-units='px' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:measure-end='0,0' inkscape:measure-start='-190.687,-191.14' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='3440' inkscape:window-x='0' inkscape:window-y='61' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-39.999999' originy='350' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-281.0002,-567)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-281.0002,-567)'>
+
+ <path inkscape:connector-curvature='0' d='m 285.72676,567 c -1.51091,-10e-6 -2.72656,1.11499 -2.72656,2.5 v 11 c 10e-6,1.38499 1.21565,2.5 2.72656,2.5 h 6.54688 c 1.51091,10e-6 2.72656,-1.11499 2.72656,-2.5 v -11 c -1e-5,-1.38499 -1.21565,-2.5 -2.72656,-2.5 z m 0.78125,2.97656 a 0.50005,0.50005 0 0 1 0.50781,0.50782 v 3.53124 h 1 v -4.03124 h 3 v 4.03124 h 0.51172 a 0.50005,0.50005 0 1 1 0,1 h -1.51172 v -4.03124 h -1 v 4.03124 h -3 v -4.53124 a 0.50005,0.50005 0 0 1 0.49219,-0.50782 z' id='path27183-6' style='display:inline;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-281.0002,-567)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-281.0002,-567)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-281.0002,-567)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-281.0002,-567)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-281.0002,-567)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-281.0002,-567)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-281.0002,-567)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/avatar-default-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/avatar-default-symbolic-ref.png
new file mode 100644
index 00000000..3c14e034
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/avatar-default-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/avatar-default-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/avatar-default-symbolic.svg
new file mode 100644
index 00000000..3af03a0e
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/avatar-default-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='avatar-default-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='213.96757' inkscape:cy='-240.09189' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='702' inkscape:window-maximized='1' inkscape:window-width='1366' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='200px' originy='120px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-41.0002,-337)'>
+
+ <path inkscape:connector-curvature='0' d='m 51.55489,345.09373 c -0.70541,0.62353 -1.53918,0.90625 -2.55469,0.90625 -1.01551,0 -1.85318,-0.29053 -2.55859,-0.91406 -1.10938,0.36328 -2.43603,1.28775 -2.4375,2.90234 l -0.0039,3.01172 c -7.2e-4,0.554 0.446,1.00002 1,1.00002 l 8,0 c 0.554,0 1,-0.44602 1,-1.00002 l 0,-3 c 0,-1.38672 -1.10231,-2.5558 -2.44531,-2.90625 z' id='path3940-5' sodipodi:nodetypes='csccsssscc' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+ <path sodipodi:cx='49.5' sodipodi:cy='342.5' d='m 52,342.5 a 2.5,2.5 0 1 1 -5,0 2.5,2.5 0 1 1 5,0 z' id='path3942-6' sodipodi:rx='2.5' sodipodi:ry='2.5' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' transform='matrix(1.2,0,0,1.2,-10.3998,-69.00003)' sodipodi:type='arc'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-41.0002,-337)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-41.0002,-337)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-41.0002,-337)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-41.0002,-337)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-41.0002,-337)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-41.0002,-337)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-41.0002,-337)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-41.0002,-337)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/battery-caution-charging-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/battery-caution-charging-symbolic-ref.png
new file mode 100644
index 00000000..8af2c137
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/battery-caution-charging-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/battery-caution-charging-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/battery-caution-charging-symbolic.svg
new file mode 100644
index 00000000..7b3359dd
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/battery-caution-charging-symbolic.svg
@@ -0,0 +1,39 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='battery-caution-charging-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='-20.433576' inkscape:cy='3.5909509' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1402' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='2560' inkscape:window-y='0' inkscape:zoom='32'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='0px' originy='0px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-241.0002,-217)'>
+ <path class='error' inkscape:connector-curvature='0' d='m 246.0002,227.99975 0,2 3.00025,0 0,-2 -3.00025,0 z' id='path6306' sodipodi:nodetypes='ccccc' style='fill:#ef2929;fill-opacity:1;stroke:none'/>
+ <path inkscape:connector-curvature='0' d='m 246.46875,217 c -0.49033,0 -0.79607,0.22846 -1.03125,0.46875 C 245.20232,217.70904 245,218.02725 245,218.5 l 0,0.5 -1,0 -1,0 0,1 0,12 0,1 1,0 7,0 0,-2 -6,0 0,-10 1,0 1,0 0,-1 0,-1 4,0 0,1 0,1 1,0 1,0 0,3 2,0 0,-4 0,-1 -1,0 -1,0 0,-0.375 0,-0.0312 0,-0.0312 c -0.0239,-0.4306 -0.17023,-0.72105 -0.40625,-1 -0.22374,-0.26444 -0.6267,-0.52931 -1.15625,-0.53125 l 0,-0.0312 -0.0625,0 -4.90625,0 z' id='path6308' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+
+ <path inkscape:connector-curvature='0' d='M 253.84375,224.96875 A 1.0001,1.0001 0 0 0 253.25,225.25 l -3,3 a 1.0001,1.0001 0 0 0 0.71875,1.71875 l 2.5625,0 L 252.25,231.25 a 1.016466,1.016466 0 1 0 1.4375,1.4375 l 3,-3 a 1.0001,1.0001 0 0 0 -0.71875,-1.71875 l -2.5625,0 1.28125,-1.28125 a 1.0001,1.0001 0 0 0 -0.84375,-1.71875 z' id='path6312' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <rect height='1' id='rect6314' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible' width='1' x='255.96919' y='227.96851'/>
+ <rect height='1' id='rect6316' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible' width='1' x='249.96919' y='228.96851'/>
+ <rect height='1' id='rect6318' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible' width='1' x='253.96919' y='224.96851'/>
+ <rect height='1' id='rect6320' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible' width='1' x='251.96919' y='231.96851'/>
+ <path inkscape:connector-curvature='0' d='m 253.125,225.40625 -2,3 1.6875,1.125 2,-3 -1.6875,-1.125 z' id='path6322' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 254.125,228.40625 -2,3 1.6875,1.125 2,-3 -1.6875,-1.125 z' id='path6324' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-241.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-241.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-241.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-241.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-241.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-241.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-241.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-241.0002,-217)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/battery-caution-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/battery-caution-symbolic-ref.png
new file mode 100644
index 00000000..e74906d0
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/battery-caution-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/battery-caution-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/battery-caution-symbolic.svg
new file mode 100644
index 00000000..d2922621
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/battery-caution-symbolic.svg
@@ -0,0 +1,34 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='battery-caution-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.4 r9939' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='171.28381' inkscape:cy='-421.9103' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='702' inkscape:window-maximized='1' inkscape:window-width='1366' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='140px' originy='0px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ <inkscape:grid color='#000000' empcolor='#000000' empopacity='0' empspacing='4' enabled='true' id='grid5968' opacity='0.1254902' originx='140px' originy='0px' snapvisiblegridlinesonly='true' spacingx='0.5px' spacingy='0.5px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-101.0002,-217)'>
+
+ <path class='error' inkscape:connector-curvature='0' d='m 106.0002,227.99975 0,1.99999 2.00025,0 0,-2 -2.00025,1e-5 z' id='rect6060-0' sodipodi:nodetypes='ccccc' style='fill:#cc0000;fill-opacity:1;stroke:none;display:inline'/>
+ <path inkscape:connector-curvature='0' d='m 106.46875,217 c -0.49033,0 -0.79607,0.22846 -1.03125,0.46875 C 105.20232,217.70904 105,218.02725 105,218.5 l 0,0.5 -1,0 -1,0 0,1 0,12 0,1 1,0 4,0 0,-2 -3,0 0,-10 1,0 1,0 0,-1 0,-1 4,0 0,1 0,1 1,0 1,0 0,3 2,0 0,-4 0,-1 -1,0 -1,0 0,-0.375 0,-0.0312 0,-0.0312 c -0.0239,-0.4306 -0.17023,-0.72105 -0.40625,-1 -0.22374,-0.26444 -0.6267,-0.52931 -1.15625,-0.53125 l 0,-0.0312 -0.0625,0 -4.90625,0 z' id='path6062-4' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path class='warning' inkscape:connector-curvature='0' d='m 109.8752,225 c -0.49245,0 -0.875,0.38256 -0.875,0.875 l 0,6.25 c 0,0.49244 0.38255,0.875 0.875,0.875 l 6.25,0 c 0.49245,0 0.875,-0.38256 0.875,-0.875 l 0,-6.25 c 0,-0.49244 -0.38255,-0.875 -0.875,-0.875 l -6.25,0 z m 2.125,1 2,0 0,4 -2,0 0,-4 z m 0,5 2,0 0,1 -2,0 0,-1 z' id='rect6718-3' sodipodi:nodetypes='ccccccccccccccccccc' style='color:#bebebe;fill:#f57900;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-101.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-101.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-101.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-101.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-101.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-101.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-101.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-101.0002,-217)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/battery-empty-charging-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/battery-empty-charging-symbolic-ref.png
new file mode 100644
index 00000000..511f173e
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/battery-empty-charging-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/battery-empty-charging-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/battery-empty-charging-symbolic.svg
new file mode 100644
index 00000000..a368abe2
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/battery-empty-charging-symbolic.svg
@@ -0,0 +1,38 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='battery-empty-charging-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='-40.433576' inkscape:cy='3.5909509' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1402' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='2560' inkscape:window-y='0' inkscape:zoom='32'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-20px' originy='0px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-261.0002,-217)'>
+ <path inkscape:connector-curvature='0' d='m 266.46875,217 c -0.49033,0 -0.79607,0.22846 -1.03125,0.46875 C 265.20232,217.70904 265,218.02725 265,218.5 l 0,0.5 -1,0 -1,0 0,1 0,12 0,1 1,0 7,0 0,-2 -6,0 0,-10 1,0 1,0 0,-1 0,-1 4,0 0,1 0,1 1,0 1,0 0,3 2,0 0,-4 0,-1 -1,0 -1,0 0,-0.375 0,-0.0312 0,-0.0312 c -0.0239,-0.4306 -0.17023,-0.72105 -0.40625,-1 -0.22374,-0.26444 -0.6267,-0.52931 -1.15625,-0.53125 l 0,-0.0312 -0.0625,0 -4.90625,0 z' id='path11308' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+
+ <path inkscape:connector-curvature='0' d='M 273.84375,224.96875 A 1.0001,1.0001 0 0 0 273.25,225.25 l -3,3 a 1.0001,1.0001 0 0 0 0.71875,1.71875 l 2.5625,0 L 272.25,231.25 a 1.016466,1.016466 0 1 0 1.4375,1.4375 l 3,-3 a 1.0001,1.0001 0 0 0 -0.71875,-1.71875 l -2.5625,0 1.28125,-1.28125 a 1.0001,1.0001 0 0 0 -0.84375,-1.71875 z' id='path11312' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <rect height='1' id='rect11314' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible' width='1' x='275.96921' y='227.96851'/>
+ <rect height='1' id='rect11316' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible' width='1' x='269.96921' y='228.96851'/>
+ <rect height='1' id='rect11318' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible' width='1' x='273.96921' y='224.96851'/>
+ <rect height='1' id='rect11320' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible' width='1' x='271.96921' y='231.96851'/>
+ <path inkscape:connector-curvature='0' d='m 273.125,225.40625 -2,3 1.6875,1.125 2,-3 -1.6875,-1.125 z' id='path11322' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 274.125,228.40625 -2,3 1.6875,1.125 2,-3 -1.6875,-1.125 z' id='path11324' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-261.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-261.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-261.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-261.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-261.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-261.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-261.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-261.0002,-217)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/battery-empty-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/battery-empty-symbolic-ref.png
new file mode 100644
index 00000000..0825e2b5
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/battery-empty-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/battery-empty-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/battery-empty-symbolic.svg
new file mode 100644
index 00000000..796cc6e5
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/battery-empty-symbolic.svg
@@ -0,0 +1,33 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='battery-empty-symbolic.svg' height='16.000004' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.4 r9939' version='1.1' width='16.000004' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='131.28381' inkscape:cy='-421.9103' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='702' inkscape:window-maximized='1' inkscape:window-width='1366' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='100px' originy='0px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ <inkscape:grid color='#000000' empcolor='#000000' empopacity='0' empspacing='4' enabled='true' id='grid5968' opacity='0.1254902' originx='100px' originy='0px' snapvisiblegridlinesonly='true' spacingx='0.5px' spacingy='0.5px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-141.0002,-217)'>
+
+ <path inkscape:connector-curvature='0' d='m 146.46875,217 c -0.49202,0 -0.79615,0.22777 -1.03125,0.46875 C 145.2024,217.70973 145,218.02759 145,218.5 l 0,0.5 -1,0 -1,0 0,1 0,12 0,1 1,0 10,0 1,0 0,-1 0,-12 0,-1 -1,0 -1,0 0,-0.375 0,-0.0312 0,-0.0312 c -0.0239,-0.43046 -0.17041,-0.72033 -0.40625,-1 -0.22357,-0.26511 -0.62489,-0.52941 -1.15625,-0.53125 l 0,-0.0312 -0.0625,0 -4.90625,0 z m 0.53125,2 4,0 0,1 0,1 1,0 1,0 0,10 -8,0 0,-10 1,0 1,0 0,-1 0,-1 z' id='path3434' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2.00264454;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-141.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-141.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-141.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-141.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-141.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-141.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-141.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-141.0002,-217)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/battery-full-charged-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/battery-full-charged-symbolic-ref.png
new file mode 100644
index 00000000..64c9eb1d
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/battery-full-charged-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/battery-full-charged-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/battery-full-charged-symbolic.svg
new file mode 100644
index 00000000..da9e9643
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/battery-full-charged-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='battery-full-charged-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16.001423' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.91 r13301 custom' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='4.99669' inkscape:cy='-8.864728' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1374' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='60px' originy='0.0014224199px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-181.0002,-217)'>
+
+ <path inkscape:connector-curvature='0' d='m 189.7795,222.00771 c -0.17789,0.0489 -0.3419,0.14729 -0.46875,0.28125 l -3.03125,3 c -0.2353,0.23074 -0.34458,0.58284 -0.28125,0.90625 l 0,0.8125 0.8125,0 0.1875,0 1.4707,0 -1.1875,1.27359 c -0.21461,0.21931 -0.32135,0.53954 -0.28125,0.84375 -0.001,0.0312 -0.001,0.0625 0,0.0937 l 0,0.78125 0.84375,0 0.15625,0 c 0.26386,0.004 0.52791,-0.099 0.71875,-0.28125 l 3,-2.99234 c 0.18369,-0.18976 0.28735,-0.45466 0.28125,-0.7187 0.003,-0.0416 0.003,-0.0834 0,-0.125 l 0,-0.875 -0.84375,0 -0.15625,0 -1.56445,0 1.3125,-1.28125 c 0.21461,-0.2193 0.32135,-0.53953 0.28125,-0.84375 10e-4,-0.0312 10e-4,-0.0625 0,-0.0937 l 0,-0.7813 -0.84375,0 -0.0937,0 c -0.0208,-6.4e-4 -0.0417,-6.4e-4 -0.0625,0 -0.0829,-0.0103 -0.16709,-0.0103 -0.25,0 z' id='path10747' sodipodi:nodetypes='ccccccccccccccccccccccccccccccc' style='color:#bebebe;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:xx-small;line-height:normal;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-color:currentColor;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 186.46875,217.00586 c -0.49202,0 -0.7981,0.21605 -1.0332,0.45703 -0.2351,0.24098 -0.43555,0.55689 -0.43555,1.0293 l 0,0.50781 -2,0 0,14 12.00195,0.002 0,-1.00195 0,-12.99805 -2,0 0,-0.39843 -0.002,-0.0274 c -0.0239,-0.43046 -0.18017,-0.734 -0.41602,-1.01367 -0.23584,-0.27967 -0.62045,-0.58711 -1.20117,-0.55469 l 0.0566,-0.002 -4.9707,0 z m 0.5332,2.00195 3.99805,0.002 0,1.99414 1.99805,0 0,9.99414 -7.9961,0 0,-9.9961 2,0 0,-1.99414 z' id='path3434-5' style='color:#bebebe;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-color:currentColor;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.5;isolation:auto;color-interpolation:sRGB;color-interpolation-filters:linearRGB;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.00264454;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-181.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-181.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-181.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-181.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-181.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-181.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-181.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-181.0002,-217)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/battery-full-charging-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/battery-full-charging-symbolic-ref.png
new file mode 100644
index 00000000..5ab3f82c
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/battery-full-charging-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/battery-full-charging-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/battery-full-charging-symbolic.svg
new file mode 100644
index 00000000..89ed55cb
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/battery-full-charging-symbolic.svg
@@ -0,0 +1,33 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='battery-full-charging-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='5.425624' inkscape:cy='7.2234489' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1402' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='2560' inkscape:window-y='0' inkscape:zoom='32'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='80px' originy='0px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-161.0002,-217)'>
+ <path inkscape:connector-curvature='0' d='m 166.0002,222 0,2 6,0 0,-2 -6,0 z m 0,3 0,2 4,0 0.25,-0.125 1.75,-1.75 0,-0.125 -6,0 z m 0,3.0625 0,1.9375 3,0 0,-0.8125 0,-1.125 -3,0 z' id='rect6060' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+ <path inkscape:connector-curvature='0' d='m 166.46875,217 c -0.49033,0 -0.79607,0.22846 -1.03125,0.46875 C 165.20232,217.70904 165,218.02725 165,218.5 l 0,0.5 -1,0 -1,0 0,1 0,12 0,1 1,0 7,0 0,-2 -6,0 0,-10 1,0 1,0 0,-1 0,-1 4,0 0,1 0,1 1,0 1,0 0,3 2,0 0,-4 0,-1 -1,0 -1,0 0,-0.375 0,-0.0312 0,-0.0312 c -0.0239,-0.4306 -0.17023,-0.72105 -0.40625,-1 -0.22374,-0.26444 -0.6267,-0.52931 -1.15625,-0.53125 l 0,-0.0312 -0.0625,0 -4.90625,0 z' id='path6062' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+
+ <path inkscape:connector-curvature='0' d='m 173.71895,224.96875 c -0.17789,0.0489 -0.3419,0.14729 -0.46875,0.28125 l -3,2.96875 c -0.2353,0.23073 -0.34458,0.61409 -0.28125,0.9375 l 0,0.8125 1,0 2.125,0 -0.84375,1.25 c -0.15169,0.14917 -0.24515,0.35304 -0.28125,0.5625 l 0,0.375 0,0.8125 1,0 c 0.26386,0.004 0.52791,-0.13024 0.71875,-0.3125 l 3,-3 c 0.1837,-0.18978 0.28737,-0.42344 0.28125,-0.6875 0.003,-0.0416 0.003,-0.0834 0,-0.125 l 0,-0.875 -0.84375,0 -0.0937,0 c -0.0208,-6.5e-4 -0.0417,-6.5e-4 -0.0625,0 l -2.125,0 0.84375,-1.3125 c 0.15164,-0.14917 0.2451,-0.33095 0.2812,-0.53125 l 0,-0.375 0,-0.78125 -1.25,0 z' id='path6217' style='font-size:xx-small;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-161.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-161.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-161.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-161.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-161.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-161.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-161.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-161.0002,-217)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/battery-full-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/battery-full-symbolic-ref.png
new file mode 100644
index 00000000..39ac3ede
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/battery-full-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/battery-full-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/battery-full-symbolic.svg
new file mode 100644
index 00000000..afef8366
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/battery-full-symbolic.svg
@@ -0,0 +1,35 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='battery-full-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.4 r9939' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='231.28381' inkscape:cy='-421.9103' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='702' inkscape:window-maximized='1' inkscape:window-width='1366' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='200px' originy='0px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ <inkscape:grid color='#000000' empcolor='#000000' empopacity='0' empspacing='4' enabled='true' id='grid5968' opacity='0.1254902' originx='200px' originy='0px' snapvisiblegridlinesonly='true' spacingx='0.5px' spacingy='0.5px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-41.0002,-217)'>
+ <rect height='6' id='rect2928' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' transform='matrix(0,1,1,0,0,0)' width='2' x='222' y='46.000198'/>
+ <path inkscape:connector-curvature='0' d='m 46.46875,217 c -0.490327,0 -0.796069,0.22846 -1.03125,0.46875 -0.235181,0.24029 -0.4375,0.52725 -0.4375,1 L 45,219 l -1,0 -1,0 0,1 0,12 0,1 1,0 10,0 1,0 0,-1 0,-12 0,-1 -1,0 -1,0 0,-0.375 0,-0.0312 0,-0.0312 c -0.02393,-0.4306 -0.170232,-0.72105 -0.40625,-1 -0.223737,-0.26444 -0.626697,-0.52931 -1.15625,-0.53125 l 0,-0.0312 -0.0625,0 -4.90625,0 z M 47,219 l 4,0 0,1 0,1 1,0 1,0 0,10 -8,0 0,-10 1,0 1,0 0,-1 0,-1 z' id='path2930' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+
+ <rect height='6' id='rect4227' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' transform='matrix(0,1,1,0,0,0)' width='2' x='225' y='46.000198'/>
+ <rect height='6' id='rect4229' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' transform='matrix(0,1,1,0,0,0)' width='2' x='228' y='46.000198'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-41.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-41.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-41.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-41.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-41.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-41.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-41.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-41.0002,-217)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/battery-good-charging-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/battery-good-charging-symbolic-ref.png
new file mode 100644
index 00000000..9c5df958
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/battery-good-charging-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/battery-good-charging-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/battery-good-charging-symbolic.svg
new file mode 100644
index 00000000..78679393
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/battery-good-charging-symbolic.svg
@@ -0,0 +1,39 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='battery-good-charging-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='19.566424' inkscape:cy='3.5909509' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1402' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='2560' inkscape:window-y='0' inkscape:zoom='32'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='40px' originy='0px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-201.0002,-217)'>
+ <path inkscape:connector-curvature='0' d='m 206.0002,225 0,2 4,0 1,-1 1,-1 z m 0,3 0,2 3,0 0,-2 z' id='path6257' sodipodi:nodetypes='ccccccccccc' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+ <path inkscape:connector-curvature='0' d='m 206.46875,217 c -0.49033,0 -0.79607,0.22846 -1.03125,0.46875 C 205.20232,217.70904 205,218.02725 205,218.5 l 0,0.5 -1,0 -1,0 0,1 0,12 0,1 1,0 7,0 0,-2 -6,0 0,-10 1,0 1,0 0,-1 0,-1 4,0 0,1 0,1 1,0 1,0 0,3 2,0 0,-4 0,-1 -1,0 -1,0 0,-0.375 0,-0.0312 0,-0.0312 c -0.0239,-0.4306 -0.17023,-0.72105 -0.40625,-1 -0.22374,-0.26444 -0.6267,-0.52931 -1.15625,-0.53125 l 0,-0.0312 -0.0625,0 -4.90625,0 z' id='path6259' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+
+ <path inkscape:connector-curvature='0' d='M 213.84375,224.96875 A 1.0001,1.0001 0 0 0 213.25,225.25 l -3,3 a 1.0001,1.0001 0 0 0 0.71875,1.71875 l 2.5625,0 L 212.25,231.25 a 1.016466,1.016466 0 1 0 1.4375,1.4375 l 3,-3 a 1.0001,1.0001 0 0 0 -0.71875,-1.71875 l -2.5625,0 1.28125,-1.28125 a 1.0001,1.0001 0 0 0 -0.84375,-1.71875 z' id='path6264' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <rect height='1' id='rect6266' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible' width='1' x='215.96919' y='227.96851'/>
+ <rect height='1' id='rect6268' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible' width='1' x='209.96919' y='228.96851'/>
+ <rect height='1' id='rect6270' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible' width='1' x='213.96919' y='224.96851'/>
+ <rect height='1' id='rect6272' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible' width='1' x='211.96919' y='231.96851'/>
+ <path inkscape:connector-curvature='0' d='m 213.125,225.40625 -2,3 1.6875,1.125 2,-3 -1.6875,-1.125 z' id='path6274' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 214.125,228.40625 -2,3 1.6875,1.125 2,-3 -1.6875,-1.125 z' id='path6276' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-201.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-201.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-201.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-201.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-201.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-201.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-201.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-201.0002,-217)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/battery-good-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/battery-good-symbolic-ref.png
new file mode 100644
index 00000000..86456a51
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/battery-good-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/battery-good-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/battery-good-symbolic.svg
new file mode 100644
index 00000000..f488c4c3
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/battery-good-symbolic.svg
@@ -0,0 +1,34 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='battery-good-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.4 r9939' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='211.28381' inkscape:cy='-421.9103' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='702' inkscape:window-maximized='1' inkscape:window-width='1366' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='180px' originy='0px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ <inkscape:grid color='#000000' empcolor='#000000' empopacity='0' empspacing='4' enabled='true' id='grid5968' opacity='0.1254902' originx='180px' originy='0px' snapvisiblegridlinesonly='true' spacingx='0.5px' spacingy='0.5px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-61.0002,-217)'>
+ <rect height='6' id='rect3735' style='fill:#bebebe;fill-opacity:1;stroke:none' transform='matrix(0,1,1,0,0,0)' width='2' x='225' y='66.000198'/>
+ <path inkscape:connector-curvature='0' d='m 66.46875,217 c -0.490327,0 -0.796068,0.22845 -1.03125,0.46875 C 65.202318,217.70905 65,218.02726 65,218.5 l 0,0.5 -1,0 -1,0 0,1 0,12 0,1 1,0 10,0 1,0 0,-1 0,-12 0,-1 -1,0 -1,0 0,-0.375 0,-0.0312 c -0.02393,-0.4306 -0.170236,-0.75229 -0.40625,-1.03125 -0.223734,-0.26444 -0.626687,-0.52931 -1.15625,-0.53125 l 0,-0.0312 -0.0625,0 -4.90625,0 z M 67,219 l 4,0 0,1 0,1 1,0 1,0 0,10 -8,0 0,-10 1,0 1,0 0,-1 0,-1 z' id='path3737' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+
+ <rect height='6' id='rect10870' style='fill:#bebebe;fill-opacity:1;stroke:none' transform='matrix(0,1,1,0,0,0)' width='2' x='228' y='66.000198'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-61.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-61.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-61.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-61.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-61.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-61.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-61.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-61.0002,-217)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/battery-low-charging-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/battery-low-charging-symbolic-ref.png
new file mode 100644
index 00000000..60c3f64f
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/battery-low-charging-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/battery-low-charging-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/battery-low-charging-symbolic.svg
new file mode 100644
index 00000000..fef8ddee
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/battery-low-charging-symbolic.svg
@@ -0,0 +1,39 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='battery-low-charging-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='-0.433576' inkscape:cy='3.5909509' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1402' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='2560' inkscape:window-y='0' inkscape:zoom='32'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='20px' originy='0px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-221.0002,-217)'>
+ <path inkscape:connector-curvature='0' d='m 226.0002,228.06225 0,1.9375 3.00025,0 0,-2 z' id='path6282' sodipodi:nodetypes='ccccc' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+ <path inkscape:connector-curvature='0' d='m 226.46875,217 c -0.49033,0 -0.79607,0.22846 -1.03125,0.46875 C 225.20232,217.70904 225,218.02725 225,218.5 l 0,0.5 -1,0 -1,0 0,1 0,12 0,1 1,0 7,0 0,-2 -6,0 0,-10 1,0 1,0 0,-1 0,-1 4,0 0,1 0,1 1,0 1,0 0,3 2,0 0,-4 0,-1 -1,0 -1,0 0,-0.375 0,-0.0312 0,-0.0312 c -0.0239,-0.4306 -0.17023,-0.72105 -0.40625,-1 -0.22374,-0.26444 -0.6267,-0.52931 -1.15625,-0.53125 l 0,-0.0312 -0.0625,0 -4.90625,0 z' id='path6284' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+
+ <path inkscape:connector-curvature='0' d='M 233.84375,224.96875 A 1.0001,1.0001 0 0 0 233.25,225.25 l -3,3 a 1.0001,1.0001 0 0 0 0.71875,1.71875 l 2.5625,0 L 232.25,231.25 a 1.016466,1.016466 0 1 0 1.4375,1.4375 l 3,-3 a 1.0001,1.0001 0 0 0 -0.71875,-1.71875 l -2.5625,0 1.28125,-1.28125 a 1.0001,1.0001 0 0 0 -0.84375,-1.71875 z' id='path6288' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <rect height='1' id='rect6290' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible' width='1' x='235.96919' y='227.96851'/>
+ <rect height='1' id='rect6292' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible' width='1' x='229.96919' y='228.96851'/>
+ <rect height='1' id='rect6294' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible' width='1' x='233.96919' y='224.96851'/>
+ <rect height='1' id='rect6296' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible' width='1' x='231.96919' y='231.96851'/>
+ <path inkscape:connector-curvature='0' d='m 233.125,225.40625 -2,3 1.6875,1.125 2,-3 -1.6875,-1.125 z' id='path6298' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 234.125,228.40625 -2,3 1.6875,1.125 2,-3 -1.6875,-1.125 z' id='path6300' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-221.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-221.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-221.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-221.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-221.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-221.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-221.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-221.0002,-217)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/battery-low-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/battery-low-symbolic-ref.png
new file mode 100644
index 00000000..43de8fb5
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/battery-low-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/battery-low-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/battery-low-symbolic.svg
new file mode 100644
index 00000000..99f15c7f
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/battery-low-symbolic.svg
@@ -0,0 +1,33 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='battery-low-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.4 r9939' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='191.28381' inkscape:cy='-421.9103' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='702' inkscape:window-maximized='1' inkscape:window-width='1366' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='160px' originy='0px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ <inkscape:grid color='#000000' empcolor='#000000' empopacity='0' empspacing='4' enabled='true' id='grid5968' opacity='0.1254902' originx='160px' originy='0px' snapvisiblegridlinesonly='true' spacingx='0.5px' spacingy='0.5px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-81.0002,-217)'>
+ <rect height='6' id='rect3743' style='fill:#bebebe;fill-opacity:1;stroke:none' transform='matrix(0,1,1,0,0,0)' width='2' x='228' y='86.000198'/>
+ <path inkscape:connector-curvature='0' d='m 86.46875,217 c -0.490327,0 -0.796069,0.22846 -1.03125,0.46875 -0.235181,0.24029 -0.4375,0.52725 -0.4375,1 L 85,219 l -1,0 -1,0 0,1 0,12 0,1 1,0 10,0 1,0 0,-1 0,-12 0,-1 -1,0 -1,0 0,-0.375 0,-0.0312 0,-0.0312 c -0.02393,-0.4306 -0.170232,-0.72105 -0.40625,-1 -0.223737,-0.26444 -0.626697,-0.52931 -1.15625,-0.53125 l 0,-0.0312 -0.0625,0 -4.90625,0 z M 87,219 l 4,0 0,1 0,1 1,0 1,0 0,10 -8,0 0,-10 1,0 1,0 0,-1 0,-1 z' id='path3745' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-81.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-81.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-81.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-81.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-81.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-81.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-81.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-81.0002,-217)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/battery-missing-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/battery-missing-symbolic-ref.png
new file mode 100644
index 00000000..3e7ed3c3
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/battery-missing-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/battery-missing-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/battery-missing-symbolic.svg
new file mode 100644
index 00000000..84c05d00
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/battery-missing-symbolic.svg
@@ -0,0 +1,33 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='battery-missing-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='15.999998' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='127.39978' inkscape:cy='28.08611' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='702' inkscape:window-maximized='1' inkscape:window-width='1366' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='120px' originy='0px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-121.0002,-217)'>
+
+ <path inkscape:connector-curvature='0' d='m 126.46895,217 c -0.49202,0 -0.79615,0.22777 -1.03125,0.46875 -0.2351,0.24098 -0.4375,0.55884 -0.4375,1.03125 l 0,0.5 -1,0 -1,0 0,1 0,12 0,1 1,0 10,0 1,0 0,-1 0,-12 0,-1 -1,0 -1,0 0,-0.375 0,-0.0312 0,-0.0312 c -0.0239,-0.43046 -0.17041,-0.72033 -0.40625,-1 -0.22357,-0.26511 -0.62489,-0.52941 -1.15625,-0.53125 l 0,-0.0312 -0.0625,0 -4.90625,0 z m 0.53125,2 4,0 0,1 0,0.53125 c 0.22927,0.13183 0.42611,0.29608 0.625,0.46875 l 0.375,0 1,0 0,2.75 0,0.0312 0,0.0312 0,7.1875 -2.28125,0 c -0.0883,0.15116 -0.18924,0.28299 -0.3125,0.40625 -0.12326,0.12326 -0.25509,0.22419 -0.40625,0.3125 -0.1191,0.0711 -0.24126,0.14268 -0.375,0.1875 -0.031,0.0103 -0.0621,0.0225 -0.0937,0.0312 -0.0403,0.0113 -0.0836,0.0225 -0.125,0.0312 -0.12939,0.0269 -0.26966,0.0312 -0.40625,0.0312 -0.18098,0 -0.36372,-0.016 -0.53125,-0.0625 -0.032,-0.009 -0.0624,-0.0207 -0.0937,-0.0312 -0.13243,-0.044 -0.25597,-0.11796 -0.375,-0.1875 -0.15116,-0.0883 -0.28299,-0.18924 -0.40625,-0.3125 -0.12326,-0.12326 -0.22419,-0.25509 -0.3125,-0.40625 l -2.28125,0 0,-6.9375 0,-3.0625 1,0 0.3125,0 c 0.20941,-0.18355 0.44239,-0.33113 0.6875,-0.46875 l 0,-0.53125 0,-1 z' id='path5256' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.35;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2.00264454;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+
+ <path inkscape:connector-curvature='0' d='m 128.81738,221.00473 c 1.64243,-0.092 3.0955,1.17008 3.1875,2.8125 -1e-4,1.40136 -0.37771,1.92177 -1.59375,2.84375 -0.19093,0.14364 -0.3256,0.2506 -0.375,0.3125 -0.0494,0.0621 -0.0312,0.0332 -0.0312,0.0312 0.007,0.52831 -0.47163,1 -1,1 -0.52837,0 -1.007,-0.47169 -1,-1 0,-0.50239 0.22424,-0.94342 0.46875,-1.25 0.24451,-0.30663 0.4913,-0.51638 0.71875,-0.6875 0.20405,-0.16056 0.46083,-0.38454 0.6875,-0.65625 0.0935,-0.1121 0.129,-0.30766 0.125,-0.4375 l 0,-0.0312 c -0.0316,-0.56324 -0.49926,-0.9691 -1.0625,-0.9375 -0.56324,0.0316 -0.9691,0.43676 -0.9375,1 l -2,0 c -0.092,-1.64243 1.17007,-2.9079 2.8125,-3 z m 0.1875,8 c 0.55228,0 1,0.44772 1,1 0,0.55228 -0.44772,1 -1,1 -0.55228,0 -1,-0.44772 -1,-1 0,-0.55228 0.44772,-1 1,-1 z' id='path19592-2-3' sodipodi:nodetypes='cccccsccccccsccccsssss' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-121.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-121.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-121.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-121.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-121.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-121.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-121.0002,-217)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-121.0002,-217)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/battery-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/battery-symbolic-ref.png
new file mode 100644
index 00000000..39ac3ede
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/battery-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/battery-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/battery-symbolic.svg
new file mode 100644
index 00000000..a6f72d6b
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/battery-symbolic.svg
@@ -0,0 +1,34 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='battery-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.5 r10040' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer10' inkscape:cx='96.209844' inkscape:cy='-89.88481' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1375' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='100px' originy='350px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-141.0002,-567)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-141.0002,-567)'>
+ <rect height='6' id='rect5637' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' transform='matrix(0,1,1,0,0,0)' width='2' x='572' y='146.0002'/>
+ <path inkscape:connector-curvature='0' d='m 146.46875,567 c -0.49033,0 -0.79607,0.22846 -1.03125,0.46875 -0.23518,0.24029 -0.4375,0.52725 -0.4375,1 l 0,0.53125 -1,0 -1,0 0,1 0,12 0,1 1,0 10,0 1,0 0,-1 0,-12 0,-1 -1,0 -1,0 0,-0.375 0,-0.0312 0,-0.0312 c -0.0239,-0.4306 -0.17023,-0.72105 -0.40625,-1 -0.22374,-0.26444 -0.6267,-0.52931 -1.15625,-0.53125 l 0,-0.0312 -0.0625,0 -4.90625,0 z m 0.53125,2 4,0 0,1 0,1 1,0 1,0 0,10 -8,0 0,-10 1,0 1,0 0,-1 0,-1 z' id='path5639' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+
+ <rect height='6' id='rect5643' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' transform='matrix(0,1,1,0,0,0)' width='2' x='575' y='146.0002'/>
+ <rect height='6' id='rect5645' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' transform='matrix(0,1,1,0,0,0)' width='2' x='578' y='146.0002'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-141.0002,-567)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-141.0002,-567)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-141.0002,-567)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-141.0002,-567)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-141.0002,-567)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-141.0002,-567)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-141.0002,-567)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/bluetooth-active-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/bluetooth-active-symbolic-ref.png
new file mode 100644
index 00000000..ac74904d
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/bluetooth-active-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/bluetooth-active-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/bluetooth-active-symbolic.svg
new file mode 100644
index 00000000..3bf206f7
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/bluetooth-active-symbolic.svg
@@ -0,0 +1,36 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='bluetooth-active-symbolic.svg' height='16.03327' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.4 r9939' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='231.28381' inkscape:cy='-321.88668' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='702' inkscape:window-maximized='1' inkscape:window-width='1366' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='200px' originy='100.02362px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ <inkscape:grid color='#000000' empcolor='#000000' empopacity='0' empspacing='4' enabled='true' id='grid5968' opacity='0.1254902' originx='200px' originy='100.02362px' snapvisiblegridlinesonly='true' spacingx='0.5px' spacingy='0.5px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-41.0002,-316.99035)'>
+
+ <path inkscape:connector-curvature='0' d='M 47.875,317 A 1.0001,1.0001 0 0 0 47,318 l 0,3.5625 -1.28125,-1.28125 a 1.016466,1.016466 0 1 0 -1.4375,1.4375 L 47,324.4375 l 0,1.125 -2.71875,2.71875 a 1.016466,1.016466 0 1 0 1.4375,1.4375 L 47,328.4375 47,332 a 1.0001,1.0001 0 0 0 1.71875,0.71875 l 4,-4 a 1.0001,1.0001 0 0 0 0,-1.4375 L 50.4375,325 l 2.28125,-2.28125 a 1.0001,1.0001 0 0 0 0,-1.4375 l -4,-4 A 1.0001,1.0001 0 0 0 47.875,317 z M 49,320.4375 50.5625,322 49,323.5625 l 0,-3.125 z m 0,6 L 50.5625,328 49,329.5625 l 0,-3.125 z' id='path3807' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <rect height='1' id='rect3940' style='fill:#bebebe;fill-opacity:1;stroke:none' width='1' x='44.000198' y='320'/>
+ <rect height='1' id='rect3942' style='fill:#bebebe;fill-opacity:1;stroke:none' width='1' x='44.000198' y='329'/>
+ <rect height='1' id='rect3944' style='fill:#bebebe;fill-opacity:1;stroke:none' width='1' x='47.000198' y='332'/>
+ <rect height='1' id='rect3946' style='fill:#bebebe;fill-opacity:1;stroke:none' width='1' x='47.000198' y='317'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-41.0002,-316.99035)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-41.0002,-316.99035)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-41.0002,-316.99035)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-41.0002,-316.99035)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-41.0002,-316.99035)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-41.0002,-316.99035)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-41.0002,-316.99035)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-41.0002,-316.99035)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/bluetooth-disabled-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/bluetooth-disabled-symbolic-ref.png
new file mode 100644
index 00000000..4501bac7
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/bluetooth-disabled-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/bluetooth-disabled-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/bluetooth-disabled-symbolic.svg
new file mode 100644
index 00000000..fa05f67d
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/bluetooth-disabled-symbolic.svg
@@ -0,0 +1,36 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='bluetooth-disabled-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16.000183' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.91 r13725' width='16.000002' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='-36.969178' inkscape:cy='-8.0901022' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='180' originy='100.00017' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-61.000198,-316.99998)'>
+
+ <path clip-path='none' inkscape:connector-curvature='0' d='m 67.0002,317 0,0.99414 0,0.006 0,3.58594 -1.29297,-1.29297 C 65.46955,320.04558 65.11501,320.006 64.78536,320.006 l -0.75977,0 0,0.70117 c 0,0.36616 -6.1e-4,0.74235 0.26758,1 l 2.70703,2.70703 0,1.17188 -2.70703,2.70703 c -0.23813,0.22889 -0.29297,0.56073 -0.29297,0.88658 l 0,0.81445 0.79297,0 c 0.33837,0 0.67802,-0.0422 0.91406,-0.28711 l 1.29297,-1.29297 0,3.58594 0,0.006 0,0.99414 0.99414,0 c 0.26723,0.002 0.52395,-0.10399 0.71289,-0.29297 l 2.29297,-2.29311 0,-3.41406 1.41406,0 -2,-2 2.29297,-2.29297 c 0.39037,-0.39053 0.39037,-1.02353 0,-1.41406 l -4,-4 C 68.51829,317.10399 68.26157,316.99849 67.99434,317 Z m 2,3.41406 1.58594,1.58594 -1.58594,1.58594 z m 0,6 1.58594,1.58594 -1.58594,1.58594 z' id='path3807-2' sodipodi:nodetypes='ccccccccccccccccccccccccccccccccccccccc' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.5;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 72.0002,328 1.375,0 1.125,1.09375 1.09375,-1.09375 1.40625,0 0,1.46875 -1.09375,1.0625 1.09375,1.0625 0,1.40625 -1.4375,0 -1.0625,-1.0625 -1.0625,1.0625 -1.4375,0 0,-1.40625 1.0625,-1.0625 -1.0625,-1.0625 0,-1.46875 z' id='path3761-2-3-5-4-8-9-8-0-9' sodipodi:nodetypes='ccccccccccccccccc' style='color:#bebebe;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-61.000198,-316.99998)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-61.000198,-316.99998)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-61.000198,-316.99998)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-61.000198,-316.99998)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-61.000198,-316.99998)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-61.000198,-316.99998)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-61.000198,-316.99998)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-61.000198,-316.99998)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/bluetooth-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/bluetooth-symbolic-ref.png
new file mode 100644
index 00000000..ac74904d
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/bluetooth-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/bluetooth-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/bluetooth-symbolic.svg
new file mode 100644
index 00000000..67a6bb58
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/bluetooth-symbolic.svg
@@ -0,0 +1,36 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='bluetooth-symbolic.svg' height='16.03327' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.4 r9939' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer11' inkscape:cx='9.283809' inkscape:cy='10.113321' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='702' inkscape:window-maximized='1' inkscape:window-width='1366' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='-22px' originy='432.02362px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ <inkscape:grid color='#000000' empcolor='#000000' empopacity='0' empspacing='4' enabled='true' id='grid5968' opacity='0.1254902' originx='-22px' originy='432.02362px' snapvisiblegridlinesonly='true' spacingx='0.5px' spacingy='0.5px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-263.0002,-648.99035)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-263.0002,-648.99035)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-263.0002,-648.99035)'>
+
+ <path inkscape:connector-curvature='0' d='M 269.875,649 A 1.0001,1.0001 0 0 0 269,650 l 0,3.5625 -1.28125,-1.28125 a 1.016466,1.016466 0 1 0 -1.4375,1.4375 L 269,656.4375 l 0,1.125 -2.71875,2.71875 a 1.016466,1.016466 0 1 0 1.4375,1.4375 L 269,660.4375 269,664 a 1.0001,1.0001 0 0 0 1.71875,0.71875 l 4,-4 a 1.0001,1.0001 0 0 0 0,-1.4375 L 272.4375,657 l 2.28125,-2.28125 a 1.0001,1.0001 0 0 0 0,-1.4375 l -4,-4 A 1.0001,1.0001 0 0 0 269.875,649 z M 271,652.4375 272.5625,654 271,655.5625 l 0,-3.125 z m 0,6 1.5625,1.5625 -1.5625,1.5625 0,-3.125 z' id='path5241' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <rect height='1' id='rect5243' style='fill:#bebebe;fill-opacity:1;stroke:none' width='1' x='266.00021' y='652'/>
+ <rect height='1' id='rect5245' style='fill:#bebebe;fill-opacity:1;stroke:none' width='1' x='266.00021' y='661'/>
+ <rect height='1' id='rect5247' style='fill:#bebebe;fill-opacity:1;stroke:none' width='1' x='269.00021' y='664'/>
+ <rect height='1' id='rect5249' style='fill:#bebebe;fill-opacity:1;stroke:none' width='1' x='269.00021' y='649'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-263.0002,-648.99035)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-263.0002,-648.99035)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-263.0002,-648.99035)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-263.0002,-648.99035)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-263.0002,-648.99035)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-263.0002,-648.99035)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/bookmark-new-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/bookmark-new-symbolic-ref.png
new file mode 100644
index 00000000..f28da322
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/bookmark-new-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/bookmark-new-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/bookmark-new-symbolic.svg
new file mode 100644
index 00000000..e6f1ac56
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/bookmark-new-symbolic.svg
@@ -0,0 +1,36 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='bookmark-new-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.92pre3 r' viewBox='0 0 16 16' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='10.737783' inkscape:cy='4.8923232' inkscape:document-units='px' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1016' inkscape:window-maximized='1' inkscape:window-width='1920' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='5.6568542'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='100' originy='590' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-141.0002,-807)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-141.0002,-807)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-141.0002,-807)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-141.0002,-807)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-141.0002,-807)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-141.0002,-807)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-141.0002,-807)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-141.0002,-807)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-141.0002,-807)'>
+
+ <path inkscape:connector-curvature='0' d='m 152.0002,811 v 2 h -2 v 2 h 2 v 2 h 2 v -2 h 2 v -2 h -2 v -2 z' id='rect12294-2' sodipodi:nodetypes='ccccccccccccc' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+ <path inkscape:connector-curvature='0' d='m 146.0002,807 c 0,0 -2,0 -2,2 v 13.61719 l 5,-2.5 5,2.5 V 818 h -2 v 1.38281 l -3,-1.5 -3,1.5 V 810 c 0,-1 1,-1 1,-1 h 4 c 1,0 1,1 1,1 h 2 v -1 c 0,0 0,-2 -2,-2 z' id='path6673-7' sodipodi:nodetypes='cccccccccccccccccc' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/call-missed-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/call-missed-symbolic-ref.png
new file mode 100644
index 00000000..94fc4b18
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/call-missed-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/call-missed-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/call-missed-symbolic.svg
new file mode 100644
index 00000000..2a394948
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/call-missed-symbolic.svg
@@ -0,0 +1,36 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='call-missed-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16.000002' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.91 r13725' width='16.000004' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='-7.5237384' inkscape:cy='-8.1816091' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='100' originy='100' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-141.0002,-317)'>
+
+ <path inkscape:connector-curvature='0' d='m 149.99715,317.00012 0,0.78125 a 1.001098,1.001098 0 0 0 1.03125,1.21875 l 0.59375,0 -2.5625,2.5625 -2.375,-2.28125 a 1.0054782,1.0054782 0 0 0 -0.71875,-0.28125 l -0.125,0 -0.84375,0 0,0.75 a 1.0054782,1.0054782 0 0 0 0,0.0937 1.0054782,1.0054782 0 0 0 0.28125,0.875 l 3.09375,2.96875 0.6875,0.6875 0.71875,-0.6875 3.21875,-3.25 0,0.5625 a 1.0001,1.0001 0 0 0 1,1 l 1,0 0,-0.84375 a 1.0001,1.0001 0 0 0 0,-0.1562 l 0,-3 0,-1 -1,0 -2.96875,0 a 1.0001,1.0001 0 0 0 -0.0312,0 l -1.00005,0 z' id='path44196' style='color:#bebebe;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:xx-small;line-height:normal;font-family:Sans;-inkscape-font-specification:Sans;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;display:inline;overflow:visible;visibility:visible;opacity:0.5;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 141.2661,330.71341 c -0.34368,-0.34368 -0.34865,-1.07502 -2e-5,-1.42366 l 0.0404,-0.0403 c 4.26664,-4.24462 11.16673,-4.2381 15.42494,0.0201 l 0.02,0.0201 c 0.35061,0.35061 0.31852,1.07025 -0.0201,1.44378 l -1.93062,1.99693 c -0.35652,0.35653 -0.93056,0.35652 -1.28709,10e-6 l -1.28709,-1.2871 c -0.35652,-0.35653 -0.35653,-0.93055 -1e-5,-1.28709 l 0.30167,-0.30165 c -2.22715,-1.06378 -4.81163,-1.06378 -7.03876,10e-6 l 0.30166,0.30164 c 0.35653,0.35654 0.35652,0.93056 0,1.2871 l -1.28709,1.28708 c -0.35653,0.35653 -0.93663,0.3625 -1.28709,0 z' id='rect5922-5-0' sodipodi:nodetypes='ccccccccscccccscc' style='display:inline;opacity:1;fill:#bebebe;fill-opacity:1;stroke:none;enable-background:new'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-141.0002,-317)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-141.0002,-317)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-141.0002,-317)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-141.0002,-317)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-141.0002,-317)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-141.0002,-317)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-141.0002,-317)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-141.0002,-317)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/call-start-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/call-start-symbolic-ref.png
new file mode 100644
index 00000000..f531ab7e
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/call-start-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/call-start-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/call-start-symbolic.svg
new file mode 100644
index 00000000..1d8e8102
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/call-start-symbolic.svg
@@ -0,0 +1,35 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='call-start-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.91 r13725' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='32.487016' inkscape:cy='9.4796812' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='160' originy='650' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-81.000204,-867)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-81.000204,-867)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-81.000204,-867)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-81.000204,-867)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-81.000204,-867)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-81.000204,-867)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-81.000204,-867)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-81.000204,-867)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-81.000204,-867)'>
+
+ <path inkscape:connector-curvature='0' d='m 94.03162,868.00336 c 0.53403,0 0.96875,0.42699 0.96875,0.96875 l 0,0.0625 c -0.01714,6.61281 -5.38317,11.96875 -12,11.96875 l -0.0312,0 c -0.54483,0 -0.9688,-0.446 -0.9688,-1 l 0,-1 0,-2 c 0,-0.554 0.446,-1 1,-1 l 2,0 c 0.554,0 1,0.446 1,1 l 0,0.46875 c 2.55686,-0.90388 4.56487,-2.91189 5.46875,-5.46875 l -0.46875,0 c -0.55401,0 -1,-0.44599 -1,-1 l 0,-2 c 0,-0.55401 0.44599,-1 1,-1 l 1,0 1,0 0.96875,0 0.0312,0 0.0312,0 z' id='rect5922' style='opacity:1;fill:#bebebe;fill-opacity:1;stroke:none'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/call-stop-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/call-stop-symbolic-ref.png
new file mode 100644
index 00000000..1ad4877b
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/call-stop-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/call-stop-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/call-stop-symbolic.svg
new file mode 100644
index 00000000..5e415b95
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/call-stop-symbolic.svg
@@ -0,0 +1,36 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='call-stop-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.91 r13725' width='16.0002' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='12.48702' inkscape:cy='9.47968' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='140' originy='650' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-101.0002,-867)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-101.0002,-867)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-101.0002,-867)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-101.0002,-867)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-101.0002,-867)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-101.0002,-867)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-101.0002,-867)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-101.0002,-867)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-101.0002,-867)'>
+
+ <path inkscape:connector-curvature='0' d='m 112.00038,878 -1.00001,0 c -0.25689,10e-6 -0.52845,0.12983 -0.71875,0.31251 l -1.28124,1.28124 -1.28125,-1.28125 c -0.19004,-0.18293 -0.46186,-0.3125 -0.71878,-0.31245 l -1,0 -1e-5,1 c 0,0.30945 0.0903,0.55231 0.2813,0.74998 l 2.71876,2.65625 2.71874,-2.65625 c 0.19093,-0.19772 0.28126,-0.44056 0.28126,-0.75 l 0,-1 z' id='rect3217-6-2-2-4-2' sodipodi:nodetypes='ccccccccccccc' style='color:#bebebe;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:&apos;Bitstream Vera Sans&apos;;-inkscape-font-specification:&apos;Bitstream Vera Sans&apos;;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 101.25983,873.64243 c -0.34368,-0.34368 -0.34865,-1.07502 -2e-5,-1.42366 l 0.0404,-0.0403 c 4.26664,-4.24462 11.16673,-4.2381 15.42494,0.0201 l 0.02,0.0201 c 0.35061,0.35061 0.31853,1.07025 -0.0201,1.44378 l -1.93063,1.99693 c -0.35652,0.35653 -0.93056,0.35652 -1.28709,10e-6 l -1.28709,-1.2871 c -0.35652,-0.35653 -0.35653,-0.93055 -10e-6,-1.28709 l 0.30167,-0.30165 c -2.22715,-1.06378 -4.81163,-1.06378 -7.03876,10e-6 l 0.30166,0.30164 c 0.35653,0.35654 0.35652,0.93056 0,1.2871 l -1.28709,1.28708 c -0.35653,0.35653 -0.93663,0.3625 -1.28709,0 z' id='rect5922-5' sodipodi:nodetypes='ccccccccscccccscc' style='display:inline;opacity:1;fill:#bebebe;fill-opacity:1;stroke:none;enable-background:new'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/camera-photo-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/camera-photo-symbolic-ref.png
new file mode 100644
index 00000000..5ed9656c
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/camera-photo-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/camera-photo-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/camera-photo-symbolic.svg
new file mode 100644
index 00000000..83b52cb6
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/camera-photo-symbolic.svg
@@ -0,0 +1,26 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:svg='http://www.w3.org/2000/svg' id='svg7384' version='1.1' height='16' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs id='defs7386'/>
+ <g transform='translate(-80,-338)' id='layer9' style='display:inline'/>
+ <g transform='translate(-80,-338)' id='layer10'>
+
+ <path inkscape:connector-curvature='0' d='m 86,340 c -0.549959,0 -1,0.45004 -1,1 l 0,1 -3,0 c -0.552014,0 -1,0.45004 -1,1 l 0,8 c 0,0.54996 0.447986,1 1,1 l 12,0 c 0.552014,0 1,-0.45004 1,-1 l 0,-8 c 0,-0.54996 -0.447986,-1 -1,-1 l -3,0 0,-1 c 0,-0.54996 -0.450041,-1 -1,-1 l -4,0 z m 2,3 c 2.209139,0 4,1.79086 4,4 0,2.20914 -1.790861,4 -4,4 -2.209139,0 -4,-1.79086 -4,-4 0,-2.20914 1.790861,-4 4,-4 z m 0,2 c -1.10457,0 -2,0.89543 -2,2 0,1.10457 0.89543,2 2,2 1.10457,0 2,-0.89543 2,-2 0,-1.10457 -0.89543,-2 -2,-2 z' id='rect5238' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ </g>
+ <g transform='translate(-80,-338)' id='layer11'/>
+ <g transform='translate(-80,-338)' id='layer12'/>
+ <g transform='translate(-80,-338)' id='layer13'/>
+ <g transform='translate(-80,-338)' id='layer14'/>
+ <g transform='translate(-80,-338)' id='layer15'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/camera-switch-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/camera-switch-symbolic-ref.png
new file mode 100644
index 00000000..f3807cab
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/camera-switch-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/camera-switch-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/camera-switch-symbolic.svg
new file mode 100644
index 00000000..572468b8
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/camera-switch-symbolic.svg
@@ -0,0 +1,36 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='camera-switch-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.92+devel unknown' viewBox='0 0 16.0002 16' width='16.0002' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='5.27897' inkscape:cy='3.80566' inkscape:document-rotation='0' inkscape:document-units='px' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:measure-end='0,0' inkscape:measure-start='-190.687,-191.14' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='3440' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='16'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-120' originy='510' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-361.0002,-727)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-361.0002,-727)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-361.0002,-727)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-361.0002,-727)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-361.0002,-727)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-361.0002,-727)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-361.0002,-727)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-361.0002,-727)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-361.0002,-727)'>
+
+ <path inkscape:connector-curvature='0' d='m 374.26576,737.47612 2.189,-2.47549 h 0.54564 v 5.00427 h -0.53372 z M 368.0002,734 h 5.0004 c 0.55389,0 0.9998,0.446 0.9998,1 v 5 c 0,0.554 -0.44591,1 -0.9998,1 h -5.0004 c -0.55389,0 -0.9998,-0.446 -0.9998,-1 v -5 c 0,-0.554 0.44591,-1 0.9998,-1 z' id='path3382' sodipodi:nodetypes='ccccccsssssssss' style='color:#bebebe;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none'/>
+ <path inkscape:connector-curvature='0' d='m 365.0002,728.99415 c -0.55389,0 -1,0.446 -1,1 v 5.00781 c 0,0.554 0.44611,1 1,1 h 0.99804 V 735 c 0,-1.05007 0.95203,-2.00742 2.00196,-2.00196 h 3 v -3.00389 c 0,-0.554 -0.44611,-1 -1,-1 z m -4,1.00897 v 5.00569 h 0.47928 l 2.2551,-2.5873 -2.12321,-2.41839 z' id='path3386' sodipodi:nodetypes='sssscsscssscccccc' style='color:#bebebe;display:inline;overflow:visible;visibility:visible;opacity:0.5;vector-effect:none;fill:#c3c3c3;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/camera-video-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/camera-video-symbolic-ref.png
new file mode 100644
index 00000000..decf508c
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/camera-video-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/camera-video-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/camera-video-symbolic.svg
new file mode 100644
index 00000000..7757396c
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/camera-video-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='camera-video-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer10' inkscape:cx='288.3481' inkscape:cy='-6.47383' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1373' inkscape:window-maximized='0' inkscape:window-width='1279' inkscape:window-x='1279' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='60.000003px' originy='250px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ <inkscape:grid color='#000000' empcolor='#000000' empopacity='0' empspacing='4' enabled='true' id='grid5968' opacity='0.1254902' originx='60.000003px' originy='250px' snapvisiblegridlinesonly='true' spacingx='0.5px' spacingy='0.5px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-181.0002,-467)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-181.0002,-467)'>
+
+ <path inkscape:connector-curvature='0' d='m 192.5018,468 c 1.933,0 3.5,1.567 3.5,3.5 0,1.11938 -0.526,2.10932 -1.34375,2.75 0.20995,0.18305 0.34375,0.4483 0.34375,0.75 -0.002,2 0,3.05212 0,6 0,0.554 -0.446,1 -1,1 l -9,0 c -0.554,0 -1,-0.446 -1,-1 l 0,-2.15625 -2.5625,1.90625 c -0.0194,0.013 -0.0404,0.0236 -0.0625,0.0312 -0.0309,0.005 -0.0628,0.005 -0.0937,0 -0.0207,0.002 -0.0418,0.002 -0.0625,0 -0.0221,-0.008 -0.0431,-0.0182 -0.0625,-0.0312 -0.0221,-0.008 -0.0431,-0.0181 -0.0625,-0.0312 -0.0112,-0.01 -0.0217,-0.02 -0.0312,-0.0312 -0.0112,-0.01 -0.0217,-0.02 -0.0312,-0.0312 -0.0131,-0.0194 -0.0236,-0.0404 -0.0312,-0.0625 -0.002,-0.0207 -0.002,-0.0418 0,-0.0625 l 0,-6.0625 c -0.002,-0.0207 -0.002,-0.0418 0,-0.0625 0.008,-0.0221 0.0181,-0.0431 0.0312,-0.0625 0.01,-0.0112 0.02,-0.0217 0.0312,-0.0312 0.01,-0.0112 0.02,-0.0217 0.0312,-0.0312 0.01,-0.0112 0.02,-0.0217 0.0312,-0.0312 0.01,-0.0112 0.02,-0.0217 0.0312,-0.0312 0.0194,-0.013 0.0404,-0.0236 0.0625,-0.0312 0.0309,-0.005 0.0628,-0.005 0.0937,0 0.0104,-6e-4 0.0208,-6e-4 0.0312,0 0.0112,0.01 0.0217,0.02 0.0312,0.0312 0.0221,0.008 0.0431,0.0181 0.0625,0.0312 l 2.5625,1.90625 0,-1.15625 c 0,-0.3017 0.1338,-0.56695 0.34375,-0.75 -0.81775,-0.64068 -1.34375,-1.63062 -1.34375,-2.75 0,-1.933 1.567,-3.5 3.5,-3.5 1.2836,0 2.39085,0.68846 3,1.71875 0.60915,-1.03029 1.7164,-1.71875 3,-1.71875 z m 0,2 c -0.82843,0 -1.5,0.67157 -1.5,1.5 0,0.82843 0.67157,1.5 1.5,1.5 0.82843,0 1.5,-0.67157 1.5,-1.5 0,-0.82843 -0.67157,-1.5 -1.5,-1.5 z m -6,0 c -0.82843,0 -1.5,0.67157 -1.5,1.5 0,0.82843 0.67157,1.5 1.5,1.5 0.82843,0 1.5,-0.67157 1.5,-1.5 0,-0.82843 -0.67157,-1.5 -1.5,-1.5 z m 3,3.28125 c -0.15809,0.26739 -0.34144,0.50321 -0.5625,0.71875 l 1.125,0 c -0.22106,-0.21554 -0.40441,-0.45136 -0.5625,-0.71875 z' id='rect3057' sodipodi:nodetypes='cscccsssccccccccccccccccccccccccscsscccsssssssssscccc' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-181.0002,-467)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-181.0002,-467)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-181.0002,-467)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-181.0002,-467)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-181.0002,-467)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-181.0002,-467)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-181.0002,-467)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/camera-web-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/camera-web-symbolic-ref.png
new file mode 100644
index 00000000..cbe62404
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/camera-web-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/camera-web-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/camera-web-symbolic.svg
new file mode 100644
index 00000000..6077bd71
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/camera-web-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='camera-web-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer10' inkscape:cx='40.21343' inkscape:cy='24.78205' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1374' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='160.0002px' originy='230px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-81,-447)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-81,-447)'>
+
+ <rect height='9' id='rect6844' rx='0.99980003' ry='1' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible' transform='scale(-1,1)' width='9.96875' x='-95.96875' y='451'/>
+ <path inkscape:connector-curvature='0' d='M 86,455.4693 82.530705,452 l -0.530905,0 0,7 0.5,0 z' id='path6846' sodipodi:nodetypes='cccccc' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-81,-447)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-81,-447)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-81,-447)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-81,-447)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-81,-447)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-81,-447)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-81,-447)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/changes-allow-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/changes-allow-symbolic-ref.png
new file mode 100644
index 00000000..9b4ea85e
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/changes-allow-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/changes-allow-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/changes-allow-symbolic.svg
new file mode 100644
index 00000000..2b9f965b
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/changes-allow-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='changes-allow-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='122.71175' inkscape:cy='30.316778' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='true' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1401' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='2560' inkscape:window-y='0' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='40px' originy='20px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-201.0002,-237)'>
+
+ <path inkscape:connector-curvature='0' d='m 208.0002,237 c -1.64469,0 -3,1.35529 -3,3 l 0,3 2,0 0,-3 c 0,-0.57129 0.42873,-1 1,-1 l 2,0 c 0.57127,0 1,0.42871 1,1 l 0,6 -7,0 c -0.554,0 -1,0.446 -1,1 l 0,0.53125 0,5.46875 12,0 0,-5.46875 0,-0.53125 c 0,-0.554 -0.446,-1 -1,-1 l -1,0 0,-6 c 0,-1.64471 -1.35531,-3 -3,-3 l -2,0 z' id='rect4063-6' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-201.0002,-237)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-201.0002,-237)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-201.0002,-237)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-201.0002,-237)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-201.0002,-237)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-201.0002,-237)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-201.0002,-237)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-201.0002,-237)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/changes-prevent-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/changes-prevent-symbolic-ref.png
new file mode 100644
index 00000000..ec0ee22d
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/changes-prevent-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/changes-prevent-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/changes-prevent-symbolic.svg
new file mode 100644
index 00000000..6cbbc43e
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/changes-prevent-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='changes-prevent-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='142.71175' inkscape:cy='30.316778' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='true' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1401' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='2560' inkscape:window-y='0' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='60px' originy='20px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-181.0002,-237)'>
+
+ <path inkscape:connector-curvature='0' d='m 188.0002,238 c -1.6447,0 -3,1.3553 -3,3 l 0,3 -1,0 c -0.554,0 -1,0.446 -1,1 l 0,0.53125 0,5.46875 5,0 2,0 5,0 0,-5.46875 0,-0.53125 c 0,-0.554 -0.446,-1 -1,-1 l -1,0 0,-3 c 0,-1.6447 -1.3553,-3 -3,-3 l -2,0 z m 0,2 2,0 c 0.5713,0 1,0.4287 1,1 l 0,3 -4,0 0,-3 c 0,-0.5713 0.4287,-1 1,-1 z' id='rect4063' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-181.0002,-237)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-181.0002,-237)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-181.0002,-237)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-181.0002,-237)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-181.0002,-237)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-181.0002,-237)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-181.0002,-237)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-181.0002,-237)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/channel-insecure-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/channel-insecure-symbolic-ref.png
new file mode 100644
index 00000000..7a043d2d
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/channel-insecure-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/channel-insecure-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/channel-insecure-symbolic.svg
new file mode 100644
index 00000000..d5cf0097
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/channel-insecure-symbolic.svg
@@ -0,0 +1,33 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:svg='http://www.w3.org/2000/svg' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' sodipodi:docname='channel-insecure-symbolic.svg' version='1.1' inkscape:version='0.48.1 r9760' height='16' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:cy='14.57916' pagecolor='#555753' borderopacity='1' showborder='false' inkscape:bbox-paths='false' guidetolerance='10' inkscape:object-paths='true' inkscape:window-width='1539' showguides='true' inkscape:object-nodes='true' inkscape:snap-bbox='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:snap-nodes='true' bordercolor='#666666' objecttolerance='10' id='namedview88' showgrid='false' inkscape:window-maximized='0' inkscape:window-x='1676' inkscape:snap-global='true' inkscape:window-y='120' gridtolerance='10' inkscape:window-height='948' inkscape:snap-to-guides='true' inkscape:current-layer='layer9' inkscape:snap-bbox-midpoints='false' inkscape:zoom='1' inkscape:cx='235.69749' inkscape:snap-grids='true' inkscape:pageopacity='1'>
+ <inkscape:grid spacingx='1px' spacingy='1px' id='grid4866' empspacing='2' enabled='true' type='xygrid' snapvisiblegridlinesonly='true' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:label='status' transform='translate(-101.0002,-397)' inkscape:groupmode='layer' id='layer9' style='display:inline'>
+ <g inkscape:label='lock' transform='translate(81.0002,121)' id='g4053-3-8' style='fill:#bebebe;fill-opacity:1'>
+
+ </g>
+ <path inkscape:connector-curvature='0' d='m 106.0002,397 c -1.64469,0 -3,1.35529 -3,3 l 0,3 2,0 0,-3 c 0,-0.57129 0.42873,-1 1,-1 l 2,0 c 0.57127,0 1,0.42871 1,1 l 0,0.25 c 0.26687,-0.14912 0.55674,-0.25 0.875,-0.25 l 1.125,0 c 0,-1.64471 -1.35531,-3 -3,-3 z m -3.0625,9 c -0.554,0 -1.06473,0.44979 -1,1 l 0,0.53125 0,4.46875 10.0625,0 0,-2 -2.125,0 c -1.01035,0 -1.875,-0.86466 -1.875,-1.875 l 0,-2.125 z' id='rect4063-6-6' sodipodi:nodetypes='ssccsssscscssssccccsscs' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible'/>
+ <path inkscape:connector-curvature='0' class='warning' d='m 109.875,401 c -0.49245,0 -0.875,0.38256 -0.875,0.875 l 0,6.25 c 0,0.49244 0.38255,0.875 0.875,0.875 l 6.25,0 c 0.49245,0 0.875,-0.38256 0.875,-0.875 l 0,-6.25 C 117,401.38256 116.61745,401 116.125,401 l -6.25,0 z m 2.125,1 2,0 0,4 -2,0 0,-4 z m 0,5 2,0 0,1 -2,0 0,-1 z' id='path10898-3-1' sodipodi:nodetypes='ccccccccccccccccccc' style='color:#bebebe;fill:#f57900;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible'/>
+ </g>
+ <g inkscape:label='devices' transform='translate(-101.0002,-397)' inkscape:groupmode='layer' id='layer10'/>
+ <g inkscape:label='apps' transform='translate(-101.0002,-397)' inkscape:groupmode='layer' id='layer11'/>
+ <g inkscape:label='actions' transform='translate(-101.0002,-397)' inkscape:groupmode='layer' id='layer12'/>
+ <g inkscape:label='places' transform='translate(-101.0002,-397)' inkscape:groupmode='layer' id='layer13'/>
+ <g inkscape:label='mimetypes' transform='translate(-101.0002,-397)' inkscape:groupmode='layer' id='layer14'/>
+ <g inkscape:label='emblems' transform='translate(-101.0002,-397)' inkscape:groupmode='layer' id='layer15' style='display:inline'/>
+ <g inkscape:label='categories' transform='translate(-101.0002,-397)' inkscape:groupmode='layer' id='g4953' style='display:inline'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/channel-secure-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/channel-secure-symbolic-ref.png
new file mode 100644
index 00000000..7018465f
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/channel-secure-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/channel-secure-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/channel-secure-symbolic.svg
new file mode 100644
index 00000000..08aee837
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/channel-secure-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='channel-secure-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='202.71175' inkscape:cy='190.31678' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='true' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1401' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='2560' inkscape:window-y='0' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='120px' originy='180px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-121.0002,-397)'>
+
+ <path inkscape:connector-curvature='0' d='m 128.0002,399 c -1.6447,0 -3,1.3553 -3,3 l 0,2 c 0,0 -1,0 -1,1 l 0,0.53125 0,4.46875 10,0 0,-4.46875 0,-0.53125 c 0,0 0,-1 -1,-1 l 0,-2 c 0,-1.6447 -1.3553,-3 -3,-3 l -2,0 z m 0,2 2,0 c 0.5713,0 1,0.4287 1,1 l 0,2 -4,0 0,-2 c 0,-0.5713 0.4287,-1 1,-1 z' id='rect4063-8-6' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-121.0002,-397)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-121.0002,-397)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-121.0002,-397)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-121.0002,-397)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-121.0002,-397)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-121.0002,-397)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-121.0002,-397)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-121.0002,-397)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/checkbox-checked-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/checkbox-checked-symbolic-ref.png
new file mode 100644
index 00000000..4152c467
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/checkbox-checked-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/checkbox-checked-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/checkbox-checked-symbolic.svg
new file mode 100644
index 00000000..2dc6cb8a
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/checkbox-checked-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='checkbox-checked-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='6.52031' inkscape:cy='7.7686' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1375' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-159.99995px' originy='120px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-401.00015,-337)'>
+
+ <path inkscape:connector-curvature='0' d='M 404.46875,338 C 403.10458,338 402,339.10458 402,340.46875 l 0,9.0625 c 0,1.36417 1.10458,2.46875 2.46875,2.46875 l 9.0625,0 C 414.89542,352 416,350.89542 416,349.53125 l 0,-9.0625 C 416,339.10458 414.89542,338 413.53125,338 l -9.0625,0 z m 0,1 9.0625,0 c 0.83222,0 1.46875,0.63653 1.46875,1.46875 l 0,9.0625 C 415,350.36347 414.36347,351 413.53125,351 l -9.0625,0 C 403.63653,351 403,350.36347 403,349.53125 l 0,-9.0625 C 403,339.63653 403.63653,339 404.46875,339 z' id='rect9618-8' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:0.99115032;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 415.17698,339.82322 -5.67683,5.55178 -1.9375,-1.9375 -2.125,2.125 3,3 1.0625,1.0625 1.0625,-1.0625 4.61433,-4.73928 z' id='path8913-6-7-1-5-1' sodipodi:nodetypes='ccccccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-401.00015,-337)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-401.00015,-337)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-401.00015,-337)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-401.00015,-337)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-401.00015,-337)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-401.00015,-337)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-401.00015,-337)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-401.00015,-337)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/checkbox-mixed-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/checkbox-mixed-symbolic-ref.png
new file mode 100644
index 00000000..099603f4
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/checkbox-mixed-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/checkbox-mixed-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/checkbox-mixed-symbolic.svg
new file mode 100644
index 00000000..6ccf3d65
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/checkbox-mixed-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='checkbox-mixed-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='6.52031' inkscape:cy='27.7686' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1375' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-159.99995px' originy='140px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-401.00015,-357)'>
+
+ <path inkscape:connector-curvature='0' d='M 404.46875,358 C 403.10458,358 402,359.10458 402,360.46875 l 0,9.0625 c 0,1.36417 1.10458,2.46875 2.46875,2.46875 l 9.0625,0 C 414.89542,372 416,370.89542 416,369.53125 l 0,-9.0625 C 416,359.10458 414.89542,358 413.53125,358 l -9.0625,0 z m 0,1 9.0625,0 c 0.83222,0 1.46875,0.63653 1.46875,1.46875 l 0,9.0625 C 415,370.36347 414.36347,371 413.53125,371 l -9.0625,0 C 403.63653,371 403,370.36347 403,369.53125 l 0,-9.0625 C 403,359.63653 403.63653,359 404.46875,359 z' id='rect9696' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:0.9911505;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 405.6875,363.0625 a 2.0029885,2.0029885 0 1 0 0.21875,4 l 6.125,0 a 2.0002,2.0002 0 1 0 0,-4 l -6.125,0 a 2.0002,2.0002 0 0 0 -0.21875,0 z' id='path9616' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-401.00015,-357)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-401.00015,-357)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-401.00015,-357)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-401.00015,-357)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-401.00015,-357)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-401.00015,-357)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-401.00015,-357)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-401.00015,-357)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/checkbox-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/checkbox-symbolic-ref.png
new file mode 100644
index 00000000..57a628b6
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/checkbox-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/checkbox-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/checkbox-symbolic.svg
new file mode 100644
index 00000000..293eb1f9
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/checkbox-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='checkbox-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='6.52031' inkscape:cy='-12.2314' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1375' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-159.99995px' originy='100px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-401.00015,-317)'>
+
+ <path inkscape:connector-curvature='0' d='m 404.4375,318 c -1.37299,0 -2.5,1.1012 -2.5,2.46875 l 0,9.0625 c 0,1.36755 1.12701,2.46875 2.5,2.46875 l 9.125,0 c 1.37299,0 2.5,-1.1012 2.5,-2.46875 l 0,-9.0625 c 0,-1.36755 -1.12701,-2.46875 -2.5,-2.46875 l -9.125,0 z m 0,1 9.125,0 c 0.84376,0 1.5,0.64066 1.5,1.46875 l 0,9.0625 c 0,0.82809 -0.65624,1.46875 -1.5,1.46875 l -9.125,0 c -0.84376,0 -1.5,-0.64066 -1.5,-1.46875 l 0,-9.0625 c 0,-0.82809 0.65624,-1.46875 1.5,-1.46875 z' id='rect9618' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:0.99556434;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-401.00015,-317)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-401.00015,-317)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-401.00015,-317)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-401.00015,-317)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-401.00015,-317)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-401.00015,-317)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-401.00015,-317)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-401.00015,-317)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/color-select-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/color-select-symbolic-ref.png
new file mode 100644
index 00000000..6d298fad
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/color-select-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/color-select-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/color-select-symbolic.svg
new file mode 100644
index 00000000..a7a9e8c1
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/color-select-symbolic.svg
@@ -0,0 +1,34 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='color-select-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.5 r10040' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='false' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='-17.727993' inkscape:cy='25.57145' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1014' inkscape:window-maximized='1' inkscape:window-width='1920' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='2.8284271'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-20px' originy='550px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-261.0002,-767)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-261.0002,-767)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-261.0002,-767)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-261.0002,-767)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-261.0002,-767)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-261.0002,-767)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-261.0002,-767)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-261.0002,-767)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-261.0002,-767)'>
+
+ <path clip-rule='evenodd' inkscape:connector-curvature='0' d='m 265.0002,781.42734 c 0,0.86794 -0.70471,1.57266 -1.57266,1.57266 -0.86795,0 -1.57266,-0.70472 -1.57266,-1.57266 0,-0.86795 1.79571,-3.34735 1.79571,-3.34735 0,0 1.34961,2.4794 1.34961,3.34735 z' id='path26492' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new'/>
+ <path inkscape:connector-curvature='0' d='m 271.0002,769 -6,6 -1,2.44194 0.49177,0.55806 2.50823,-1 6,-6 z m 0,1 1,1 -4,4 -2,0 z' id='path26533' sodipodi:nodetypes='cccccccccccc' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new'/>
+ <path sodipodi:cx='-10.250001' sodipodi:cy='554.25' d='m -7.5000017,554.25 a 2.7499993,2.7499993 0 1 1 -5.4999983,0 2.7499993,2.7499993 0 1 1 5.4999983,0 z' id='path26535' sodipodi:rx='2.7499993' sodipodi:ry='2.7499993' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' transform='translate(282.5002,215.5)' sodipodi:type='arc'/>
+ <path inkscape:connector-curvature='0' d='m 267.59395,769 0.6875,0.71875 4,4 0.71875,0.6875 1.125,-1.125 -0.40625,-1 -4,-4 -1.15625,-0.25 z' id='path26540' sodipodi:nodetypes='ccccccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/colorimeter-colorhug-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/colorimeter-colorhug-symbolic-ref.png
new file mode 100644
index 00000000..e3f9d576
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/colorimeter-colorhug-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/colorimeter-colorhug-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/colorimeter-colorhug-symbolic.svg
new file mode 100644
index 00000000..c6c9ebd1
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/colorimeter-colorhug-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='colorimeter-colorhug-symbolic.svg' height='16.009148' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.2 r9819' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-paths='false' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer10' inkscape:cx='47.52504' inkscape:cy='3.0535175' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#555753' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='740' inkscape:window-maximized='0' inkscape:window-width='639' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(258.9998,-446.99085)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(258.9998,-446.99085)'>
+
+ <path inkscape:connector-curvature='0' d='m -251.9373,447 c -0.4543,0.0495 -0.88397,0.2214 -1.25,0.5 -0.48804,0.37146 -0.8125,0.95486 -0.8125,1.6875 l 0,5.3125 c 0,0 0.23582,0.50712 0.5,0.50712 0.26418,0 0.5,-0.50712 0.5,-0.50712 l 0,-5.3125 c 0,-0.4491 0.17164,-0.70389 0.4375,-0.90625 0.26586,-0.20236 0.66376,-0.30023 1.0625,-0.28125 0.39874,0.019 0.78428,0.15409 1.0625,0.40625 0.27822,0.25216 0.46875,0.5845 0.46875,1.125 0,2.1653 1.46382,3.50909 3,3.46875 0.85672,-0.0225 1.68825,-0.47696 2.25,-1.3125 l -0.5625,-1 c -0.37537,0.9157 -1.06785,1.29541 -1.71875,1.3125 -0.96046,0.0252 -1.96875,-0.72975 -1.96875,-2.46875 0,-0.79197 -0.33682,-1.44388 -0.8125,-1.875 -0.47568,-0.43112 -1.08104,-0.62738 -1.6875,-0.65625 -0.15162,-0.007 -0.31732,-0.0165 -0.46875,0 z m 6.9375,2 c 0,0.0455 8.9e-4,0.0807 0,0.125 l 0.78125,1.375 c 0.0114,-0.0408 0.0208,-0.0833 0.0312,-0.125 z m 0,0.34375 c -0.006,0.10599 -0.0202,0.21386 -0.0312,0.3125 l 0.71875,1.21875 c 0.0234,-0.0625 0.0415,-0.12233 0.0625,-0.1875 z m -0.0625,0.5 c -0.0138,0.0899 -0.0444,0.16659 -0.0625,0.25 l 0.65625,1.125 c 0.0293,-0.0609 0.067,-0.12359 0.0937,-0.1875 z m -0.0937,0.4375 c -0.0237,0.0889 -0.0654,0.16899 -0.0937,0.25 l 0.59375,1.03125 c 0.0401,-0.0651 0.088,-0.1182 0.125,-0.1875 z' id='path23000' sodipodi:nodetypes='ssccsccscssscccsscscccccccccccccccccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <rect height='7.9999976' id='rect23032' rx='0.7270034' ry='0.7270034' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' width='7.0000138' x='-256.99979' y='453'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(258.9998,-446.99085)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(258.9998,-446.99085)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(258.9998,-446.99085)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(258.9998,-446.99085)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(258.9998,-446.99085)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(258.9998,-446.99085)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(258.9998,-446.99085)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/computer-apple-ipad-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/computer-apple-ipad-symbolic-ref.png
new file mode 100644
index 00000000..f7665a27
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/computer-apple-ipad-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/computer-apple-ipad-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/computer-apple-ipad-symbolic.svg
new file mode 100644
index 00000000..2230f432
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/computer-apple-ipad-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='computer-apple-ipad-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.2 r9819' version='1.1' width='16.000002' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-paths='false' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer10' inkscape:cx='27.525042' inkscape:cy='3.05352' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#555753' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='740' inkscape:window-maximized='0' inkscape:window-width='639' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(238.9998,-447)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(238.9998,-447)'>
+
+ <path inkscape:connector-curvature='0' d='m -236.53105,448 c -0.82099,0 -1.46875,0.64776 -1.46875,1.46875 l 0,11.0625 c 0,0.82099 0.64776,1.46875 1.46875,1.46875 l 9.0625,0 c 0.82099,0 1.46875,-0.64776 1.46875,-1.46875 l 0,-11.0625 c 0,-0.82099 -0.64776,-1.46875 -1.46875,-1.46875 z m -0.46875,1 10,0 0,11 -10,0 z' id='path23849' sodipodi:nodetypes='sssssssssccccc' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(238.9998,-447)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(238.9998,-447)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(238.9998,-447)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(238.9998,-447)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(238.9998,-447)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(238.9998,-447)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(238.9998,-447)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/computer-fail-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/computer-fail-symbolic-ref.png
new file mode 100644
index 00000000..f94778f0
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/computer-fail-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/computer-fail-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/computer-fail-symbolic.svg
new file mode 100644
index 00000000..09fc840e
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/computer-fail-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='computer-fail-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='31.967565' inkscape:cy='-380.09189' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='702' inkscape:window-maximized='1' inkscape:window-width='1366' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='18px' originy='-20px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-223.0002,-197)'>
+
+ <path inkscape:connector-curvature='0' d='m 227.0002,198 c -1.662,0 -3,1.338 -3,3 l 0,6 c 0,1.662 1.338,3 3,3 l 8,0 c 1.662,0 3,-1.338 3,-3 l 0,-6 c 0,-1.662 -1.338,-3 -3,-3 l -8,0 z m 2,3 c 0.55833,0 1.03125,0.47292 1.03125,1.03125 l 0,0.96875 c 0,0.55833 -0.47292,1 -1.03125,1 -0.55833,0 -1,-0.44167 -1,-1 l 0,-0.96875 c 0,-0.55833 0.44167,-1.03125 1,-1.03125 z m 4,0 c 0.55833,0 1,0.47292 1,1.03125 l 0,0.96875 c 0,0.55833 -0.44167,1 -1,1 -0.55833,0 -1,-0.44167 -1,-1 l 0,-0.96875 c 0,-0.55833 0.44167,-1.03125 1,-1.03125 z m -2,4.03125 c 3.25585,0 5,0.87374 5,1.40625 l 0,0.5 c -0.99656,-0.6369 -4.01648,-0.90625 -5,-0.90625 -0.98352,0 -3.80457,-0.0621 -5,0.90625 l 0,-0.5 c 0,-0.68098 1.74415,-1.40625 5,-1.40625 z' id='rect3773-4' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+ <path inkscape:connector-curvature='0' d='m 231.0002,211 c -5,0 -5,1 -5,1 0,1 1,1 1,1 l 8,0 c 1,0 1,-1 1,-1 0,0 0,-1 -5,-1 z' id='rect3778-3' sodipodi:nodetypes='sscccs' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-223.0002,-197)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-223.0002,-197)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-223.0002,-197)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-223.0002,-197)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-223.0002,-197)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-223.0002,-197)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-223.0002,-197)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-223.0002,-197)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/computer-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/computer-symbolic-ref.png
new file mode 100644
index 00000000..d67d960c
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/computer-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/computer-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/computer-symbolic.svg
new file mode 100644
index 00000000..b1d7b6a9
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/computer-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='computer-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer10' inkscape:cx='73.967565' inkscape:cy='-130.09189' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='702' inkscape:window-maximized='1' inkscape:window-width='1366' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='60px' originy='230px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-181.0002,-447)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-181.0002,-447)'>
+
+ <path inkscape:connector-curvature='0' d='m 193.0002,448 c 1.662,0 3,1.338 3,3 l 0,6 c 0,1.662 -1.338,3 -3,3 l -8,0 c -1.662,0 -3,-1.338 -3,-3 l 0,-6 c 0,-1.662 1.338,-3 3,-3 l 8,0 z m 0,2 -8,0 c -0.554,0 -1,0.446 -1,1 l 0,6 c 0,0.554 0.446,1 1,1 l 8,0 c 0.554,0 1,-0.446 1,-1 l 0,-6 c 0,-0.554 -0.446,-1 -1,-1 z' id='rect3773' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+ <path inkscape:connector-curvature='0' d='m 189.0002,461 c -5,0 -5,1 -5,1 0,1 1,1 1,1 l 8,0 c 1,0 1,-1 1,-1 0,0 0,-1 -5,-1 z' id='rect3778' sodipodi:nodetypes='sscccs' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-181.0002,-447)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-181.0002,-447)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-181.0002,-447)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-181.0002,-447)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-181.0002,-447)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-181.0002,-447)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-181.0002,-447)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/contact-new-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/contact-new-symbolic-ref.png
new file mode 100644
index 00000000..7e0d1b21
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/contact-new-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/contact-new-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/contact-new-symbolic.svg
new file mode 100644
index 00000000..eae33db8
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/contact-new-symbolic.svg
@@ -0,0 +1,33 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='contact-new-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.5 r10040' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='12.236067' inkscape:cy='5.87665' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='true' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1375' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='45.254834'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-19.999998px' originy='510px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-261.0002,-727)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-261.0002,-727)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-261.0002,-727)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-261.0002,-727)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-261.0002,-727)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-261.0002,-727)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-261.0002,-727)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-261.0002,-727)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-261.0002,-727)'>
+
+ <path inkscape:connector-curvature='0' d='m 269.55489,735.09373 c -0.70541,0.62353 -1.53918,0.90625 -2.55469,0.90625 -1.01551,0 -1.85318,-0.29053 -2.55859,-0.91406 -1.10938,0.36328 -2.43603,1.28775 -2.4375,2.90234 l -0.004,3.01172 c -7.2e-4,0.554 0.446,1.00002 1,1.00002 l 8,0 c 0.554,0 1,-0.44602 1,-1.00002 l 0,-3 c 0,-1.38672 -1.10231,-2.5558 -2.44531,-2.90625 z' id='path3940-5-0' sodipodi:nodetypes='csccsssscc' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+ <path sodipodi:cx='49.5' sodipodi:cy='342.5' d='m 52,342.5 a 2.5,2.5 0 1 1 -5,0 2.5,2.5 0 1 1 5,0 z' id='path3942-6-0' sodipodi:rx='2.5' sodipodi:ry='2.5' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' transform='matrix(1.2,0,0,1.2,207.6002,320.99997)' sodipodi:type='arc'/>
+ <path inkscape:connector-curvature='0' d='m 273.00019,728.00327 0,1.99673 -1.99999,0 0,1.99673 1.99999,0 0,1.99673 2.00001,0 0,-1.99673 2,0 0,-1.99673 -2,0 0,-1.99673 -2.00001,0 z' id='path26815-7' style='fill:#bebebe;fill-opacity:1;stroke:none;display:inline'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/content-loading-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/content-loading-symbolic-ref.png
new file mode 100644
index 00000000..bfd5ef8c
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/content-loading-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/content-loading-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/content-loading-symbolic.svg
new file mode 100644
index 00000000..608ef80b
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/content-loading-symbolic.svg
@@ -0,0 +1,33 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='content-loading-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.4 r9939' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='22.585693' inkscape:cy='15.85982' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1381' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='39.9998px' originy='650px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-201.0004,-867)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-201.0004,-867)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-201.0004,-867)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-201.0004,-867)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-201.0004,-867)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-201.0004,-867)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-201.0004,-867)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-201.0004,-867)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-201.0004,-867)'>
+
+ <path sodipodi:cx='28' sodipodi:cy='209' d='m 29,209 a 1,1 0 1 1 -2,0 1,1 0 1 1 2,0 z' id='path4955-1-2' sodipodi:rx='1' sodipodi:ry='1' style='fill:#bebebe;fill-opacity:1;stroke:none;display:inline' transform='matrix(2.000025,0,0,2.000025,147.99952,456.9948)' sodipodi:type='arc'/>
+ <path sodipodi:cx='28' sodipodi:cy='209' d='m 29,209 a 1,1 0 1 1 -2,0 1,1 0 1 1 2,0 z' id='path4957-2-4' sodipodi:rx='1' sodipodi:ry='1' style='fill:#bebebe;fill-opacity:1;stroke:none;display:inline' transform='matrix(2,0,0,2,153.00025,457)' sodipodi:type='arc'/>
+ <path sodipodi:cx='28' sodipodi:cy='209' d='m 29,209 a 1,1 0 1 1 -2,0 1,1 0 1 1 2,0 z' id='path4959-4-6' sodipodi:rx='1' sodipodi:ry='1' style='fill:#bebebe;fill-opacity:1;stroke:none;display:inline' transform='matrix(2,0,0,2,158.0002,457)' sodipodi:type='arc'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/daytime-sunrise-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/daytime-sunrise-symbolic-ref.png
new file mode 100644
index 00000000..f81ed350
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/daytime-sunrise-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/daytime-sunrise-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/daytime-sunrise-symbolic.svg
new file mode 100644
index 00000000..b8721d2d
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/daytime-sunrise-symbolic.svg
@@ -0,0 +1,36 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='daytime-sunrise-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.92.0 r' viewBox='0 0 16 16' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='9.8723237' inkscape:cy='8.67013' inkscape:document-units='px' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:measure-end='0,0' inkscape:measure-start='0,0' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='421' inkscape:window-maximized='0' inkscape:window-width='517' inkscape:window-x='1161' inkscape:window-y='108' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='1.6894531e-05' originy='80' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-241.00018,-297)'>
+ <path inkscape:connector-curvature='0' d='m 241.0002,312 v 1 h 15 v -1 z' id='path6996' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 248.5002,298.5 -3.5,4.50004 h 3 V 305.5 c 0,0.277 0.223,0.5 0.5,0.5 0.069,0 0.1354,-0.0138 0.1953,-0.0391 0.1796,-0.0756 0.3047,-0.25319 0.3047,-0.46094 V 303 h 3 z m -4.9492,7.54883 c -0.1278,0 -0.2556,0.0505 -0.3535,0.14844 -0.1959,0.19586 -0.1959,0.51116 0,0.70703 l 0.707,0.70703 c 0.1469,0.1469 0.3605,0.18281 0.541,0.10937 0.06,-0.0245 0.1171,-0.0604 0.166,-0.10937 0.1959,-0.19588 0.1959,-0.51117 0,-0.70703 l -0.707,-0.70703 c -0.098,-0.0979 -0.2257,-0.14844 -0.3535,-0.14844 z m 9.8984,0.002 c -0.1278,0 -0.2556,0.0486 -0.3535,0.14649 l -0.707,0.70703 c -0.1959,0.19587 -0.1959,0.51117 0,0.70703 0.098,0.0979 0.2257,0.14648 0.3535,0.14648 0.064,0 0.1273,-0.0126 0.1875,-0.0371 0.06,-0.0245 0.117,-0.0604 0.166,-0.10937 l 0.707,-0.70703 c 0.1959,-0.19587 0.1959,-0.51118 0,-0.70703 -0.098,-0.0979 -0.2257,-0.14649 -0.3535,-0.14649 z M 248.5002,307 c -2.3139,0 -4.1973,1.75339 -4.4492,4 h 8.8984 c -0.2519,-2.24661 -2.1353,-4 -4.4492,-4 z m -7,3 c -0.277,0 -0.5,0.223 -0.5,0.5 0,0.277 0.223,0.5 0.5,0.5 h 1 c 0.277,0 0.5,-0.223 0.5,-0.5 0,-0.277 -0.223,-0.5 -0.5,-0.5 z m 13,0 c -0.277,0 -0.5,0.223 -0.5,0.5 0,0.277 0.223,0.5 0.5,0.5 h 1 c 0.277,0 0.5,-0.223 0.5,-0.5 0,-0.277 -0.223,-0.5 -0.5,-0.5 z' id='path6998' sodipodi:nodetypes='cccsscscccscccccccsscccsccccssscssssssssssssssss' style='opacity:1;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1'/>
+
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-241.00018,-297)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-241.00018,-297)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-241.00018,-297)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-241.00018,-297)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-241.00018,-297)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-241.00018,-297)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-241.00018,-297)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-241.00018,-297)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/daytime-sunset-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/daytime-sunset-symbolic-ref.png
new file mode 100644
index 00000000..58af4cc4
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/daytime-sunset-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/daytime-sunset-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/daytime-sunset-symbolic.svg
new file mode 100644
index 00000000..174c9dfc
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/daytime-sunset-symbolic.svg
@@ -0,0 +1,36 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='daytime-sunset-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.92.0 r' viewBox='0 0 16 16' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='-10.127676' inkscape:cy='8.67013' inkscape:document-units='px' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:measure-end='0,0' inkscape:measure-start='0,0' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-19.999983' originy='80' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-261.00018,-297)'>
+ <path inkscape:connector-curvature='0' d='m 261.0002,312 v 1 h 15 v -1 z' id='path7002' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 261.5002,298 c -0.277,0 -0.5,0.223 -0.5,0.5 0,0.277 0.223,0.5 0.5,0.5 h 1 c 0.277,0 0.5,-0.223 0.5,-0.5 0,-0.277 -0.223,-0.5 -0.5,-0.5 z m 2.5508,0 c 0.2519,2.24661 2.1353,4 4.4492,4 2.3139,0 4.1973,-1.75339 4.4492,-4 z m 10.4492,0 c -0.277,0 -0.5,0.223 -0.5,0.5 0,0.277 0.223,0.5 0.5,0.5 h 1 c 0.277,0 0.5,-0.223 0.5,-0.5 0,-0.277 -0.223,-0.5 -0.5,-0.5 z m -1.7578,3.24219 c -0.1278,0 -0.2555,0.0486 -0.3535,0.14648 -0.1959,0.19586 -0.1959,0.51116 0,0.70703 l 0.707,0.70703 c 0.098,0.0979 0.2257,0.14649 0.3535,0.14649 0.1278,0 0.2555,-0.0486 0.3535,-0.14649 0.1959,-0.19585 0.1959,-0.51116 0,-0.70703 l -0.707,-0.70703 c -0.049,-0.049 -0.106,-0.0849 -0.166,-0.10937 -0.06,-0.0245 -0.1235,-0.0371 -0.1875,-0.0371 z m -8.5801,0.01 c -0.094,0.0182 -0.1844,0.0633 -0.2578,0.13672 l -0.707,0.70703 c -0.1959,0.19587 -0.1959,0.51117 0,0.70703 0.098,0.0979 0.2257,0.14844 0.3535,0.14844 0.1278,0 0.2555,-0.0505 0.3535,-0.14844 l 0.707,-0.70703 c 0.1959,-0.19586 0.1959,-0.51115 0,-0.70703 -0.049,-0.049 -0.106,-0.0849 -0.166,-0.10937 -0.09,-0.0367 -0.1889,-0.0455 -0.2832,-0.0273 z M 268.5002,303 c -0.277,0 -0.5,0.223 -0.5,0.5 v 2.5 h -3 l 3.5,4.5 3.5625,-4.5 h -3.0625 v -2.5 c 0,-0.20775 -0.1251,-0.38534 -0.3047,-0.46094 -0.06,-0.0253 -0.1263,-0.0391 -0.1953,-0.0391 z' id='path7004' sodipodi:nodetypes='ssssssscsccsssssssscccsccccsssccsccccssscccccscsccc' style='opacity:1;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1'/>
+
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-261.00018,-297)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-261.00018,-297)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-261.00018,-297)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-261.00018,-297)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-261.00018,-297)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-261.00018,-297)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-261.00018,-297)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-261.00018,-297)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/dialog-error-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/dialog-error-symbolic-ref.png
new file mode 100644
index 00000000..05711cf9
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/dialog-error-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/dialog-error-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/dialog-error-symbolic.svg
new file mode 100644
index 00000000..597207d3
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/dialog-error-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='dialog-error-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.4 r9939' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='-68.715991' inkscape:cy='-381.9103' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='702' inkscape:window-maximized='1' inkscape:window-width='1366' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='-99.9998px' originy='40px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ <inkscape:grid color='#000000' empcolor='#000000' empopacity='0' empspacing='4' enabled='true' id='grid5968' opacity='0.1254902' originx='-99.9998px' originy='40px' snapvisiblegridlinesonly='true' spacingx='0.5px' spacingy='0.5px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-341,-257)'>
+
+ <path inkscape:connector-curvature='0' d='m 349.0002,258 c -3.87055,0 -7,3.12944 -7,7 0,3.87055 3.12945,7 7,7 3.87055,0 7,-3.12945 7,-7 0,-3.87056 -3.12945,-7 -7,-7 z m -4,6 8,0 0,2 -8,0 z' id='path10839-3' sodipodi:nodetypes='sssssccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.78124988;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Andale Mono;-inkscape-font-specification:Andale Mono'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-341,-257)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-341,-257)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-341,-257)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-341,-257)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-341,-257)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-341,-257)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-341,-257)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-341,-257)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/dialog-information-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/dialog-information-symbolic-ref.png
new file mode 100644
index 00000000..e93657af
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/dialog-information-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/dialog-information-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/dialog-information-symbolic.svg
new file mode 100644
index 00000000..06ad8676
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/dialog-information-symbolic.svg
@@ -0,0 +1,33 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:svg='http://www.w3.org/2000/svg' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' sodipodi:docname='dialog-information-symbolic.svg' version='1.1' inkscape:version='0.48.0 r9654' height='16' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:cy='30.533763' pagecolor='#555753' borderopacity='1' showborder='false' inkscape:bbox-paths='false' guidetolerance='10' inkscape:object-paths='true' inkscape:window-width='1920' showguides='true' inkscape:object-nodes='true' inkscape:snap-bbox='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:snap-nodes='false' bordercolor='#666666' objecttolerance='10' id='namedview88' showgrid='false' inkscape:window-maximized='1' inkscape:window-x='0' inkscape:snap-global='true' inkscape:window-y='26' gridtolerance='10' inkscape:window-height='1021' inkscape:snap-to-guides='true' inkscape:current-layer='layer9' inkscape:snap-bbox-midpoints='false' inkscape:zoom='1' inkscape:cx='-164.94057' inkscape:snap-grids='true' inkscape:pageopacity='1'>
+ <inkscape:grid spacingx='1px' spacingy='1px' id='grid4866' empspacing='2' enabled='true' type='xygrid' snapvisiblegridlinesonly='true' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:label='status' transform='translate(-260.99994,-257)' inkscape:groupmode='layer' id='layer9' style='display:inline'>
+
+ <path inkscape:connector-curvature='0' d='m 269,257 c -2.74958,0 -5,2.25042 -5,5 0,1.58622 0.84459,2.90336 2,3.8125 l 0,2.1875 0,1 1,0 4,0 1,0 0,-1 0,-2.1875 c 1.15541,-0.90914 2,-2.22628 2,-3.8125 0,-2.74958 -2.25042,-5 -5,-5 z m 0,2 c 1.66868,0 3,1.33132 3,3 0,1.11585 -0.59507,2.03788 -1.5,2.5625 l -0.5,0.3125 0,0.5625 0,1.5625 -2,0 0,-1.5625 0,-0.5625 -0.5,-0.3125 C 266.59507,264.03788 266,263.11585 266,262 c 0,-1.66868 1.33132,-3 3,-3 z' id='path4561' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2.00000024;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 267,272 0,1 4,0 0,-1 -4,0 z' id='path4488-4' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 266,270 0,1 6,0 0,-1 -6,0 z' id='path4488-4-7' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 268,262 0,1 2,0 0,-1 -2,0 z' id='path4488-4-4' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.35;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+ <g inkscape:label='devices' transform='translate(-260.99994,-257)' inkscape:groupmode='layer' id='layer10'/>
+ <g inkscape:label='apps' transform='translate(-260.99994,-257)' inkscape:groupmode='layer' id='layer11'/>
+ <g inkscape:label='actions' transform='translate(-260.99994,-257)' inkscape:groupmode='layer' id='layer12'/>
+ <g inkscape:label='places' transform='translate(-260.99994,-257)' inkscape:groupmode='layer' id='layer13'/>
+ <g inkscape:label='mimetypes' transform='translate(-260.99994,-257)' inkscape:groupmode='layer' id='layer14'/>
+ <g inkscape:label='emblems' transform='translate(-260.99994,-257)' inkscape:groupmode='layer' id='layer15' style='display:inline'/>
+ <g inkscape:label='categories' transform='translate(-260.99994,-257)' inkscape:groupmode='layer' id='g4953' style='display:inline'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/dialog-password-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/dialog-password-symbolic-ref.png
new file mode 100644
index 00000000..6f5abd7f
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/dialog-password-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/dialog-password-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/dialog-password-symbolic.svg
new file mode 100644
index 00000000..fafbe797
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/dialog-password-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:svg='http://www.w3.org/2000/svg' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' version='1.1' inkscape:version='0.47 r22583' height='16' sodipodi:docname='dialog-password-symbolic.svg' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:object-paths='true' inkscape:cy='3.688503' inkscape:current-layer='layer9' inkscape:window-width='1920' pagecolor='#555753' showborder='false' showguides='true' inkscape:snap-nodes='false' objecttolerance='10' showgrid='false' inkscape:object-nodes='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:window-x='0' inkscape:snap-bbox='true' bordercolor='#666666' id='namedview88' inkscape:window-maximized='1' inkscape:snap-global='true' inkscape:window-y='26' gridtolerance='10' inkscape:zoom='1' inkscape:window-height='1021' borderopacity='1' guidetolerance='10' inkscape:snap-bbox-midpoints='false' inkscape:cx='15.608578' inkscape:bbox-paths='false' inkscape:snap-grids='true' inkscape:pageopacity='1' inkscape:snap-to-guides='true'>
+ <inkscape:grid visible='true' spacingx='1px' type='xygrid' spacingy='1px' id='grid4866' empspacing='2' enabled='true' snapvisiblegridlinesonly='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g transform='translate(-340.99994,-257)' inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline'>
+
+ <path d='m 346,260 c -2.74958,0 -5,2.25042 -5,5 0,2.74958 2.25042,5 5,5 1.58622,0 2.90336,-0.84459 3.8125,-2 l 4.84375,0 0.75,0 0.21875,-0.75 1.03125,-4 0.3125,-1.25 -1.28125,0 -5.875,0 c -0.90914,-1.15541 -2.22628,-2 -3.8125,-2 z m 0,2 c 1.11585,0 2.03788,0.59507 2.5625,1.5 l 0.3125,0.5 0.5625,0 4.96875,0 -0.53125,2 -4.4375,0 -0.5625,0 -0.3125,0.5 c -0.52462,0.90493 -1.44665,1.5 -2.5625,1.5 -1.66868,0 -3,-1.33132 -3,-3 0,-1.66868 1.33132,-3 3,-3 z' id='path19754' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2.00000024;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/>
+ <path inkscape:connector-curvature='0' d='M 355.49794,265 350,265 349.43744,266.99994 355,267 z' id='path19764' style='opacity:0.35;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ <path sodipodi:cy='265' sodipodi:type='arc' d='m 346,265 a 1,1 0 1 1 -2,0 1,1 0 1 1 2,0 z' id='path19766' sodipodi:rx='1' sodipodi:ry='1' sodipodi:cx='345' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ </g>
+ <g transform='translate(-340.99994,-257)' inkscape:groupmode='layer' id='layer10' inkscape:label='devices'/>
+ <g transform='translate(-340.99994,-257)' inkscape:groupmode='layer' id='layer11' inkscape:label='apps'/>
+ <g transform='translate(-340.99994,-257)' inkscape:groupmode='layer' id='layer12' inkscape:label='actions'/>
+ <g transform='translate(-340.99994,-257)' inkscape:groupmode='layer' id='layer13' inkscape:label='places'/>
+ <g transform='translate(-340.99994,-257)' inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes'/>
+ <g transform='translate(-340.99994,-257)' inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline'/>
+ <g transform='translate(-340.99994,-257)' inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/dialog-question-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/dialog-question-symbolic-ref.png
new file mode 100644
index 00000000..4215b1d8
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/dialog-question-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/dialog-question-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/dialog-question-symbolic.svg
new file mode 100644
index 00000000..5cbf8148
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/dialog-question-symbolic.svg
@@ -0,0 +1,30 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:svg='http://www.w3.org/2000/svg' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' version='1.1' inkscape:version='0.47 r22583' height='16' sodipodi:docname='dialog-question-symbolic.svg' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:cy='5.594091' inkscape:current-layer='layer9' inkscape:window-width='1310' pagecolor='#555753' showborder='false' showguides='true' inkscape:snap-nodes='true' objecttolerance='10' showgrid='false' inkscape:object-nodes='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:window-x='58' inkscape:snap-bbox='true' bordercolor='#666666' id='namedview88' inkscape:window-maximized='0' inkscape:snap-global='true' inkscape:window-y='353' gridtolerance='10' inkscape:zoom='1' inkscape:window-height='690' borderopacity='1' guidetolerance='10' inkscape:cx='7.13198' inkscape:bbox-paths='false' inkscape:snap-grids='true' inkscape:pageopacity='1' inkscape:snap-to-guides='true'>
+ <inkscape:grid visible='true' spacingx='1px' type='xygrid' spacingy='1px' id='grid4866' empspacing='2' enabled='true' snapvisiblegridlinesonly='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g transform='translate(-281.0002,-257)' inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline'>
+
+ <path d='m 289,257.03125 c -0.40018,0 -0.81534,0.15911 -1.125,0.46875 l -6.375,6.375 c -0.61932,0.61929 -0.61932,1.63071 0,2.25 l 6.375,6.375 c 0.61931,0.61929 1.63068,0.61929 2.25,0 l 6.375,-6.375 c 0.61932,-0.61929 0.61931,-1.63071 0,-2.25 l -6.375,-6.375 c -0.30966,-0.30964 -0.72482,-0.46875 -1.125,-0.46875 z M 288.8125,260 c 1.64243,-0.092 3.0955,1.17008 3.1875,2.8125 -10e-5,1.40136 -0.37771,1.92177 -1.59375,2.84375 -0.19093,0.14364 -0.3256,0.2506 -0.375,0.3125 C 289.98185,266.03085 290,266.002 290,266 c 0.007,0.52831 -0.47163,1 -1,1 -0.52837,0 -1.007,-0.47169 -1,-1 0,-0.50239 0.22424,-0.94342 0.46875,-1.25 0.24451,-0.30663 0.4913,-0.51638 0.71875,-0.6875 0.20405,-0.16056 0.46083,-0.38454 0.6875,-0.65625 0.0935,-0.1121 0.129,-0.30766 0.125,-0.4375 l 0,-0.0313 c -0.0316,-0.56324 -0.49926,-0.9691 -1.0625,-0.9375 -0.56324,0.0316 -0.9691,0.43676 -0.9375,1 l -2,0 c -0.092,-1.64243 1.17007,-2.9079 2.8125,-3 z M 289,268 c 0.55228,0 1,0.44772 1,1 0,0.55228 -0.44772,1 -1,1 -0.55228,0 -1,-0.44772 -1,-1 0,-0.55228 0.44772,-1 1,-1 z' id='path19592' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible'/>
+ </g>
+ <g transform='translate(-281.0002,-257)' inkscape:groupmode='layer' id='layer10' inkscape:label='devices'/>
+ <g transform='translate(-281.0002,-257)' inkscape:groupmode='layer' id='layer11' inkscape:label='apps'/>
+ <g transform='translate(-281.0002,-257)' inkscape:groupmode='layer' id='layer12' inkscape:label='actions'/>
+ <g transform='translate(-281.0002,-257)' inkscape:groupmode='layer' id='layer13' inkscape:label='places'/>
+ <g transform='translate(-281.0002,-257)' inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes'/>
+ <g transform='translate(-281.0002,-257)' inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline'/>
+ <g transform='translate(-281.0002,-257)' inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/dialog-warning-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/dialog-warning-symbolic-ref.png
new file mode 100644
index 00000000..0de92859
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/dialog-warning-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/dialog-warning-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/dialog-warning-symbolic.svg
new file mode 100644
index 00000000..1be0fc73
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/dialog-warning-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='dialog-warning-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.4 r9939' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='-48.715991' inkscape:cy='-381.9103' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='702' inkscape:window-maximized='1' inkscape:window-width='1366' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='-79.9998px' originy='40px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ <inkscape:grid color='#000000' empcolor='#000000' empopacity='0' empspacing='4' enabled='true' id='grid5968' opacity='0.1254902' originx='-79.9998px' originy='40px' snapvisiblegridlinesonly='true' spacingx='0.5px' spacingy='0.5px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-321,-257)'>
+
+ <path inkscape:connector-curvature='0' d='m 328.90645,257.09375 c -0.5255,-0.0286 -1.03823,0.28305 -1.4375,0.96875 l -6.25,11.59375 C 320.68548,270.61964 321.26717,272 322.3127,272 l 13.15625,0 c 0.98172,0 1.90311,-1.15939 1.21875,-2.34375 L 330.3752,258.125 c -0.39872,-0.64617 -0.94325,-1.00262 -1.46875,-1.03125 z m 0.0625,3.9375 c 0.54448,-0.0172 1.04849,0.48677 1.03125,1.03125 l 0,3.9375 c 0.007,0.52831 -0.47163,1 -1,1 -0.52836,0 -1.00747,-0.47169 -1,-1 l 0,-3.9375 c -0.008,-0.4666 0.3541,-0.91253 0.8125,-1 0.0511,-0.0145 0.10345,-0.0249 0.15625,-0.0312 z M 329.0002,268 c 0.55228,0 1,0.44772 1,1 0,0.55228 -0.44772,1 -1,1 -0.55228,0 -1,-0.44772 -1,-1 0,-0.55228 0.44772,-1 1,-1 z' id='path18112' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.78124988;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-321,-257)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-321,-257)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-321,-257)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-321,-257)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-321,-257)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-321,-257)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-321,-257)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-321,-257)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/display-brightness-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/display-brightness-symbolic-ref.png
new file mode 100644
index 00000000..ce39419f
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/display-brightness-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/display-brightness-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/display-brightness-symbolic.svg
new file mode 100644
index 00000000..ac4eb261
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/display-brightness-symbolic.svg
@@ -0,0 +1,40 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='display-brightness-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.4 r9939' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='524.57352' inkscape:cy='-152.42645' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='702' inkscape:window-maximized='1' inkscape:window-width='1366' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='160.0002px' originy='100px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ <inkscape:grid color='#000000' empcolor='#000000' empopacity='0' empspacing='4' enabled='true' id='grid5968' opacity='0.1254902' originx='160.0002px' originy='100px' snapvisiblegridlinesonly='true' spacingx='0.5px' spacingy='0.5px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-81,-317)'>
+
+ <rect height='2' id='rect4906-43-6' rx='0.49999836' ry='0.5' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' width='3.0002' x='81' y='324'/>
+ <rect height='2' id='rect4906-4-6-6' rx='0.4998' ry='0.5' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' width='2.9998' x='94.000198' y='324'/>
+ <rect height='2' id='rect8386' rx='0.49999836' ry='0.5' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' transform='matrix(0.70710678,-0.70710678,0.70710678,0.70710678,0,0)' width='3.0002' x='-174.8772' y='291.74222'/>
+ <rect height='2' id='rect8388' rx='0.4998' ry='0.5' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' transform='matrix(0.70710678,-0.70710678,0.70710678,0.70710678,0,0)' width='2.9998' x='-161.877' y='291.74222'/>
+ <rect height='2' id='rect8390' rx='0.49999836' ry='0.5' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' transform='matrix(0,-1,1,0,0,0)' width='3.0002' x='-333' y='88.000031'/>
+ <rect height='2' id='rect8392' rx='0.4998' ry='0.5' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' transform='matrix(0,-1,1,0,0,0)' width='2.9998' x='-319.99982' y='88.000031'/>
+ <rect height='2' id='rect8394' rx='0.49999836' ry='0.5' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' transform='matrix(-0.70710678,-0.70710678,0.70710678,-0.70710678,0,0)' width='3.0002' x='-300.74222' y='-167.87718'/>
+ <rect height='2' id='rect8396' rx='0.4998' ry='0.5' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' transform='matrix(-0.70710678,-0.70710678,0.70710678,-0.70710678,0,0)' width='2.9998' x='-287.74203' y='-167.87718'/>
+ <path inkscape:connector-curvature='0' d='m 88.988538,321.00774 c -2.197297,0 -3.979304,1.78201 -3.979304,3.9793 0,2.1973 1.782007,4.00857 3.979304,4.00857 2.197297,0 4.008564,-1.81127 4.008564,-4.00857 0,-2.19729 -1.811267,-3.9793 -4.008564,-3.9793 z m 0,1.98965 c 1.116415,0 2.018912,0.87324 2.018912,1.98965 0,1.11642 -0.902497,2.01891 -2.018912,2.01891 -1.116415,0 -1.989652,-0.90249 -1.989652,-2.01891 0,-1.11641 0.873237,-1.98965 1.989652,-1.98965 z' id='path32729' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2.13605189;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-81,-317)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-81,-317)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-81,-317)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-81,-317)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-81,-317)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-81,-317)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-81,-317)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-81,-317)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/display-projector-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/display-projector-symbolic-ref.png
new file mode 100644
index 00000000..b331f653
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/display-projector-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/display-projector-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/display-projector-symbolic.svg
new file mode 100644
index 00000000..5bb86f85
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/display-projector-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='display-projector-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.2 r9819' version='1.1' width='16.000004' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-paths='false' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer10' inkscape:cx='-27.5297' inkscape:cy='8.96987' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#555753' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1381' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='1600' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-101.03161,-467)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-101.03161,-467)'>
+
+ <path inkscape:connector-curvature='0' d='m 102.02965,472 c -0.55291,0 -0.99804,0.5231 -0.99804,1.15625 l 0,4.5625 c 0,0.63314 0.41568,1.28125 0.96859,1.28125 l 1,0 c 0,0.63315 0.47458,1 1.02749,1 l 0.99607,0 c 0.55291,0 0.97644,-0.36685 0.97644,-1 l 5.98822,0 c 0,0.63315 0.46672,1 1.01963,1 l 0.99411,0 c 0.55291,0 0.99804,-0.36685 0.99804,-1 l 1.00196,0 c 0.55292,0 0.99804,-0.64811 0.99804,-1.28125 l 0,-4.5625 C 117.0002,472.5231 116.55508,472 116.00216,472 z m 0.49902,1.19211 c 0.2756,0 0.49902,0.92718 0.49902,2.30789 0,1.38071 -0.22342,2.23803 -0.49902,2.23803 -0.2756,0 -0.49902,-0.85732 -0.49902,-2.23803 0,-1.38071 0.22342,-2.30789 0.49902,-2.30789 z m 1.99607,-1.8e-4 c 0.2756,0 0.49902,1.11929 0.49902,2.5 0,1.38071 -0.25828,2.04082 -0.53388,2.04082 -0.2756,0 -0.46416,-0.85204 -0.46416,-2.23275 0,-1.38071 0.22342,-2.30807 0.49902,-2.30807 z m 1.96121,0 c 0.2756,0 0.53388,0.92736 0.53388,2.30807 0,1.38071 -0.22342,2.23275 -0.49902,2.23275 -0.27559,0 -0.49901,-0.85204 -0.49901,-2.23275 0,-1.38071 0.18856,-2.30807 0.46415,-2.30807 z M 113.50707,473 c 1.378,0 2.49509,1.11929 2.49509,2.5 0,1.38071 -1.11709,2.5 -2.49509,2.5 -1.378,0 -2.49509,-1.11929 -2.49509,-2.5 0,-1.38071 1.11709,-2.5 2.49509,-2.5 z' id='rect9405' sodipodi:nodetypes='sssscssccsscsssssssssssssssssssssssss' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+ <path sodipodi:cx='-127' sodipodi:cy='258' d='m -125,258 a 2,2 0 1 1 -4,0 2,2 0 1 1 4,0 z' id='path9418' sodipodi:rx='2' sodipodi:ry='2' style='fill:#bebebe;fill-opacity:1;stroke:none' transform='matrix(0.75,0,0,0.75,208.7502,282)' sodipodi:type='arc'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-101.03161,-467)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-101.03161,-467)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-101.03161,-467)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-101.03161,-467)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-101.03161,-467)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-101.03161,-467)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-101.03161,-467)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/document-edit-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/document-edit-symbolic-ref.png
new file mode 100644
index 00000000..45e1972f
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/document-edit-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/document-edit-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/document-edit-symbolic.svg
new file mode 100644
index 00000000..a3c4dc27
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/document-edit-symbolic.svg
@@ -0,0 +1,36 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='document-edit-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.91 r13725' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='-112.38968' inkscape:cy='133.96583' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='false' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='4'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-159.9838' originy='549.98573' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-400.984,-766.98573)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-400.984,-766.98573)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-400.984,-766.98573)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-400.984,-766.98573)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-400.984,-766.98573)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-400.984,-766.98573)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-400.984,-766.98573)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-400.984,-766.98573)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-400.984,-766.98573)'>
+
+ <path inkscape:connector-curvature='0' d='m 403.66263,777.27842 5.84933,-5.85075 2.99982,2.99981 -5.82888,5.87306 -4.02677,1.07184 z' id='path13107' sodipodi:nodetypes='cccccc' style='fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none'/>
+ <path inkscape:connector-curvature='0' d='m 412.62129,768.66211 c -0.20052,0 -0.40103,0.0768 -0.55468,0.23047 l -1.76953,1.76758 3.05273,3.05273 1.76953,-1.76953 c 0.3073,-0.3073 0.3073,-0.80208 0,-1.10938 l -1.94336,-1.9414 c -0.15365,-0.15365 -0.35417,-0.23047 -0.55469,-0.23047 z' id='rect9831' style='color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/document-new-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/document-new-symbolic-ref.png
new file mode 100644
index 00000000..0df7bc26
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/document-new-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/document-new-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/document-new-symbolic.svg
new file mode 100644
index 00000000..631ffe64
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/document-new-symbolic.svg
@@ -0,0 +1,36 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='document-new-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16.000099' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.92pre3 r' viewBox='0 0 16 16.000099' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='-6.2696536' inkscape:cy='11.09041' inkscape:document-units='px' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:measure-end='0,0' inkscape:measure-start='0,0' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1016' inkscape:window-maximized='1' inkscape:window-width='1920' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='16'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-180.06251' originy='590.00009' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-421.06271,-807)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-421.06271,-807)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-421.06271,-807)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-421.06271,-807)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-421.06271,-807)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-421.06271,-807)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-421.06271,-807)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-421.06271,-807)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-421.06271,-807)'>
+ <path inkscape:connector-curvature='0' d='m 424,808 a 1.0001,1.0001 0 0 0 -1,1 v 13 a 1.0001,1.0001 0 0 0 1,1 h 4 a 1.0001,1.0001 0 1 0 0,-2 h -3 v -11 h 5.58594 L 433,812.41406 V 815 a 1.0001,1.0001 0 1 0 2,0 v -3 a 1.0001,1.0001 0 0 0 -0.29297,-0.70703 l -3,-3 A 1.0001,1.0001 0 0 0 431,808 Z' id='path9936' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+
+ <path inkscape:connector-curvature='0' d='M 432.0002,817.00327 V 819 h -2 v 1.99673 h 2 v 1.99674 h 2 v -1.99674 h 2 V 819 h -2 v -1.99673 z' id='path9951' style='display:inline;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:0.99918258'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/document-open-recent-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/document-open-recent-symbolic-ref.png
new file mode 100644
index 00000000..6ad78f88
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/document-open-recent-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/document-open-recent-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/document-open-recent-symbolic.svg
new file mode 100644
index 00000000..608741f2
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/document-open-recent-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:svg='http://www.w3.org/2000/svg' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' sodipodi:docname='document-open-recent-symbolic.svg' version='1.1' inkscape:version='0.48.0 r9654' height='16' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:cy='4.92089' pagecolor='#555753' borderopacity='1' showborder='false' inkscape:bbox-paths='false' guidetolerance='10' inkscape:window-width='1310' showguides='true' inkscape:object-nodes='true' inkscape:snap-bbox='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:snap-nodes='false' bordercolor='#666666' objecttolerance='10' id='namedview88' showgrid='false' inkscape:window-maximized='0' inkscape:window-x='52' inkscape:snap-global='true' inkscape:window-y='24' gridtolerance='10' inkscape:window-height='690' inkscape:snap-to-guides='true' inkscape:current-layer='layer12' inkscape:zoom='1' inkscape:cx='17.439503' inkscape:snap-grids='true' inkscape:pageopacity='1'>
+ <inkscape:grid spacingx='1px' spacingy='1px' id='grid4866' empspacing='2' enabled='true' type='xygrid' snapvisiblegridlinesonly='true' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:label='status' transform='translate(-40,-688)' inkscape:groupmode='layer' id='layer9' style='display:inline'/>
+ <g inkscape:label='devices' transform='translate(-40,-688)' inkscape:groupmode='layer' id='layer10'/>
+ <g inkscape:label='apps' transform='translate(-40,-688)' inkscape:groupmode='layer' id='layer11'/>
+ <g inkscape:label='actions' transform='translate(-40,-688)' inkscape:groupmode='layer' id='layer12'>
+
+ <path inkscape:connector-curvature='0' d='m 47.5,688.0134 c -4.130291,0 -7.486607,3.35631 -7.486607,7.48661 0,4.13029 3.356316,7.4866 7.486607,7.4866 4.130291,0 7.486607,-3.35631 7.486607,-7.4866 0,-4.1303 -3.356316,-7.48661 -7.486607,-7.48661 z m 0,1.97321 c 3.049411,0 5.513393,2.46399 5.513393,5.5134 0,3.04941 -2.463982,5.51339 -5.513393,5.51339 -3.049411,0 -5.513393,-2.46398 -5.513393,-5.51339 0,-3.04941 2.463982,-5.5134 5.513393,-5.5134 z' id='path3869' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2.15384626;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 50.40625,692 a 0.50005,0.50005 0 0 0 -0.25,0.15625 L 47.5,694.8125 45.84375,693.15625 a 0.50005,0.50005 0 1 0 -0.6875,0.6875 l 2,2 a 0.50005,0.50005 0 0 0 0.6875,0 l 3,-3 A 0.50005,0.50005 0 0 0 50.40625,692 z' id='path4639' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+ <g inkscape:label='places' transform='translate(-40,-688)' inkscape:groupmode='layer' id='layer13'/>
+ <g inkscape:label='mimetypes' transform='translate(-40,-688)' inkscape:groupmode='layer' id='layer14'/>
+ <g inkscape:label='emblems' transform='translate(-40,-688)' inkscape:groupmode='layer' id='layer15' style='display:inline'/>
+ <g inkscape:label='categories' transform='translate(-40,-688)' inkscape:groupmode='layer' id='g4953' style='display:inline'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/document-open-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/document-open-symbolic-ref.png
new file mode 100644
index 00000000..e5cf76e9
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/document-open-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/document-open-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/document-open-symbolic.svg
new file mode 100644
index 00000000..1e09f56c
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/document-open-symbolic.svg
@@ -0,0 +1,36 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='document-open-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.92pre3 r' viewBox='0 0 16.000002 16' width='16.000002' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='11.882422' inkscape:cy='4.1229492' inkscape:document-units='px' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1016' inkscape:window-maximized='1' inkscape:window-width='1920' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='40.000002' originy='549.98993' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-201.0002,-766.98993)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-201.0002,-766.98993)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-201.0002,-766.98993)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-201.0002,-766.98993)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-201.0002,-766.98993)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-201.0002,-766.98993)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-201.0002,-766.98993)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-201.0002,-766.98993)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-201.0002,-766.98993)'>
+ <path inkscape:connector-curvature='0' d='m 205.8127,767 c -0.4584,0.0875 -0.82072,0.5334 -0.8125,1 v 7 h 2 v -6 h 4 v 3 h 3 v 3 h 2 v -3.4375 c 0.006,-0.2641 -0.0976,-0.529 -0.28125,-0.7188 l -3.5625,-3.56245 c -0.18978,-0.1837 -0.45469,-0.28737 -0.71875,-0.28125 h -5.4375 c -0.0312,-10e-4 -0.0625,-10e-4 -0.0937,0 -0.0312,-10e-4 -0.0625,-10e-4 -0.0937,0 z' id='path1234-3' sodipodi:nodetypes='cccccccccccccccccc' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:Sans;-inkscape-font-specification:Sans;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.99999988;marker:none;enable-background:accumulate'/>
+
+ <path inkscape:connector-curvature='0' d='m 202.03145,769.99023 c 0,0 -1,0 -1,1 L 201.0002,780 c 2e-5,0.83333 0.57399,1.50574 1.0625,1.75 0.48851,0.24436 0.9375,0.25 0.9375,0.25 h 12 c 0,0 0.44899,-0.006 0.9375,-0.25 0.48851,-0.24426 1.0625,-0.91667 1.0625,-1.75 v -4 h -13.03125 l -0.46875,4.03125 c -0.0164,0.2618 -0.26945,0.48511 -0.53125,0.46875 -0.2618,-0.0164 -0.48511,-0.26945 -0.46875,-0.53125 l 0.5,-4.5 c 0.01,-0.22281 0.18713,-0.42714 0.40625,-0.46875 0.0312,-0.003 0.0626,-0.003 0.0937,0 h 0.5 v -5.00977 z' id='path6390-20' sodipodi:nodetypes='cccccccsccccccccccc' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:Sans;-inkscape-font-specification:Sans;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;enable-background:accumulate'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/document-page-setup-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/document-page-setup-symbolic-ref.png
new file mode 100644
index 00000000..e12d066c
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/document-page-setup-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/document-page-setup-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/document-page-setup-symbolic.svg
new file mode 100644
index 00000000..8f9ee143
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/document-page-setup-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:svg='http://www.w3.org/2000/svg' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' sodipodi:docname='document-page-setup-symbolic.svg' version='1.1' inkscape:version='0.48.1 r9760' height='16' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:cy='-10.48056' pagecolor='#555753' borderopacity='1' showborder='false' inkscape:bbox-paths='false' guidetolerance='10' inkscape:object-paths='true' inkscape:window-width='1239' showguides='true' inkscape:object-nodes='true' inkscape:snap-bbox='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:snap-nodes='true' bordercolor='#666666' objecttolerance='10' id='namedview88' showgrid='false' inkscape:window-maximized='0' inkscape:window-x='2529' inkscape:snap-global='true' inkscape:window-y='250' gridtolerance='10' inkscape:window-height='1056' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:current-layer='layer12' inkscape:snap-bbox-midpoints='false' inkscape:zoom='8' inkscape:cx='-103.80752' inkscape:snap-grids='true' inkscape:pageopacity='1'>
+ <inkscape:grid spacingx='1px' spacingy='1px' id='grid4866' empspacing='2' enabled='true' type='xygrid' snapvisiblegridlinesonly='true' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:label='status' transform='translate(-340,-646)' inkscape:groupmode='layer' id='layer9' style='display:inline'/>
+ <g inkscape:label='devices' transform='translate(-340,-646)' inkscape:groupmode='layer' id='layer10'/>
+ <g inkscape:label='apps' transform='translate(-340,-646)' inkscape:groupmode='layer' id='layer11'/>
+ <g inkscape:label='places' transform='translate(-340,-646)' inkscape:groupmode='layer' id='layer13'/>
+ <g inkscape:label='mimetypes' transform='translate(-340,-646)' inkscape:groupmode='layer' id='layer14'/>
+ <g inkscape:label='emblems' transform='translate(-340,-646)' inkscape:groupmode='layer' id='layer15' style='display:inline'/>
+ <g inkscape:label='emotes' transform='translate(-340,-646)' inkscape:groupmode='layer' id='g71291' style='display:inline'/>
+ <g inkscape:label='categories' transform='translate(-340,-646)' inkscape:groupmode='layer' id='g4953' style='display:inline'/>
+ <g inkscape:label='actions' transform='translate(-340,-646)' inkscape:groupmode='layer' id='layer12' style='display:inline'>
+ <path inkscape:connector-curvature='0' d='m 342.0002,652 0,7 12.01999,0 z m 2,3.05362 3.11558,1.97763 -3.11558,0 z' id='path3757' sodipodi:nodetypes='cccccccc' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+
+ <path inkscape:connector-curvature='0' d='m 343.0162,647.01427 c -0.52358,5e-5 -0.99995,0.47642 -1,1 l 0,2.5625 2,1.1875 0,-2.75 4.5625,0 3.40625,3.40625 0,3.625 2,1.1875 0,-5.25 c -0.002,-0.26843 -0.11756,-0.53419 -0.3125,-0.71875 l -3.96875,-3.9375 c -0.18456,-0.19494 -0.45032,-0.31049 -0.71875,-0.3125 z m -1,13 0,0.96875 c 5e-5,0.52358 0.47642,0.99995 1,1 l 9.96875,0 c 0.52358,-5e-5 0.99995,-0.47642 1,-1 l 0,-0.96875 z' id='path5034' sodipodi:nodetypes='ccccccccccccccccccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/document-print-preview-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/document-print-preview-symbolic-ref.png
new file mode 100644
index 00000000..0a4c68cd
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/document-print-preview-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/document-print-preview-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/document-print-preview-symbolic.svg
new file mode 100644
index 00000000..f33446fa
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/document-print-preview-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='document-print-preview-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.5 r10040' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='21.279769' inkscape:cy='10.53061' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1375' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-39.9998px' originy='510px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-281,-727)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-281,-727)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-281,-727)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-281,-727)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-281,-727)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-281,-727)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-281,-727)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-281,-727)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-281,-727)'>
+
+ <path inkscape:connector-curvature='0' d='m 285.0002,728 0,2 8,0 0,-2 z m -2,3 c -0.5,0 -1,0.5 -1,1 l 0,4 c 0,0.5 0.5,1 1,1 l 1,0 0,-2 5.125,0 c 0.66316,-0.63263 1.55072,-1.03125 2.53125,-1.03125 1.78152,0 3.29058,1.27976 3.625,2.96875 0.39274,-0.13746 0.71875,-0.53064 0.71875,-0.9375 l 0,-4 c 0,-0.5 -0.5,-1 -1,-1 z m 2,5 0,5 5.09375,0 c -1.25368,-0.5913 -2.125,-1.87524 -2.125,-3.34375 0,-0.59537 0.15156,-1.15644 0.40625,-1.65625 z' id='path27294' sodipodi:nodetypes='cccccsssscccscsssscccscc' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+ <path inkscape:connector-curvature='0' d='m 291.65645,734.9375 c -1.4956,0 -2.71875,1.22315 -2.71875,2.71875 0,1.4956 1.22315,2.71875 2.71875,2.71875 0.4871,0 0.94729,-0.14835 1.34375,-0.375 a 0.750075,0.750075 0 0 0 0.15625,0.21875 l 1.84375,1.8125 a 0.75130096,0.75130096 0 1 0 1.0625,-1.0625 l -1.84375,-1.8125 A 0.750075,0.750075 0 0 0 294.0002,739 c 0.22665,-0.39646 0.375,-0.85664 0.375,-1.34375 0,-1.4956 -1.22315,-2.71875 -2.71875,-2.71875 z m 0,1 c 0.95516,0 1.71875,0.76359 1.71875,1.71875 0,0.95516 -0.76359,1.71875 -1.71875,1.71875 -0.95516,0 -1.71875,-0.76359 -1.71875,-1.71875 0,-0.95516 0.76359,-1.71875 1.71875,-1.71875 z' id='path27332' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/document-print-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/document-print-symbolic-ref.png
new file mode 100644
index 00000000..0a6c12ac
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/document-print-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/document-print-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/document-print-symbolic.svg
new file mode 100644
index 00000000..a75e34bf
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/document-print-symbolic.svg
@@ -0,0 +1,33 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='document-print-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='271.21322' inkscape:cy='282.00268' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1373' inkscape:window-maximized='0' inkscape:window-width='1279' inkscape:window-x='1279' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='140px' originy='570px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-101.0002,-787)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-101.0002,-787)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-101.0002,-787)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-101.0002,-787)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-101.0002,-787)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-101.0002,-787)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-101.0002,-787)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-101.0002,-787)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-101.0002,-787)'>
+
+ <path inkscape:connector-curvature='0' d='m 103.0002,791 c -0.5,0 -1,0.5 -1,1 l 0,4 c 0,0.5 0.5,1 1,1 l 1,0 0,-2 10,0 0,2 1,0 c 0.5,0 1,-0.5 1,-1 l 0,-4 c 0,-0.5 -0.5,-1 -1,-1 l -12,0 z' id='path5670' sodipodi:nodetypes='ccccccccccccc' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+ <path inkscape:connector-curvature='0' d='m 105.0002,788 0,2 8,0 0,-2 -8,0 z' id='path5672' sodipodi:nodetypes='ccccc' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+ <path inkscape:connector-curvature='0' d='m 105.0002,796 0,5 8,0 0,-5 z' id='path5674' sodipodi:nodetypes='ccccc' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/document-properties-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/document-properties-symbolic-ref.png
new file mode 100644
index 00000000..245c70e6
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/document-properties-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/document-properties-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/document-properties-symbolic.svg
new file mode 100644
index 00000000..96a4eae6
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/document-properties-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='document-properties-symbolic.svg' height='16.01759' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.2 r9819' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-paths='false' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='23.032' inkscape:cy='19.16696' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#555753' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1381' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='1600' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-360,-766)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-360,-766)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-360,-766)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-360,-766)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-360,-766)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-360,-766)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-360,-766)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-360,-766)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-360,-766)'>
+
+ <path inkscape:connector-curvature='0' d='m 367.0002,780 -2.96875,0 0,-11 4.5625,0 3.40625,3.40625 0,5.57813 2,3.01563 0,-9.03126 c -0.002,-0.26843 -0.11756,-0.53419 -0.3125,-0.71875 l -3.96875,-3.9375 c -0.18456,-0.19494 -0.45032,-0.31049 -0.71875,-0.3125 l -5.96875,0 c -0.52358,5e-5 -0.99995,0.47642 -1,1 l 0,12 0,0.25 0,0.71875 c 5e-5,0.52358 0.47642,0.99995 1,1 l 5.01562,0 z' id='path6682' sodipodi:nodetypes='ccccccccccccccccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 369.0201,773.86275 c -0.32486,-0.059 -0.6669,-0.0455 -0.99404,-0.003 l 0.9759,1.72872 c 0.20088,0.35507 -0.0237,0.76283 -0.45022,1.00909 l -0.76991,0.44451 c -0.43052,0.23932 -0.91014,0.20778 -1.11067,-0.14747 l -0.97565,-1.72885 c -0.20685,0.25617 -0.39602,0.54042 -0.51415,0.84765 -0.56538,1.4706 0.23676,2.8917 1.79162,3.17415 0.32485,0.0591 0.66688,0.0455 0.99402,0.003 0.0263,-0.004 1.5184,2.76504 1.5184,2.76504 l 3.50484,0.062 -2.66726,-4.12967 c 0.20681,-0.25617 0.37073,-0.54378 0.48887,-0.85103 0.56534,-1.47056 -0.23679,-2.89167 -1.79161,-3.17413 z' id='path3908-6-6' sodipodi:nodetypes='cccscccssccccssc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/document-revert-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/document-revert-symbolic-ref.png
new file mode 100644
index 00000000..5e4b1d4e
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/document-revert-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/document-revert-symbolic-rtl-ref.png b/rsvg/tests/fixtures/reftests/adwaita/document-revert-symbolic-rtl-ref.png
new file mode 100644
index 00000000..3cb2129f
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/document-revert-symbolic-rtl-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/document-revert-symbolic-rtl.svg b/rsvg/tests/fixtures/reftests/adwaita/document-revert-symbolic-rtl.svg
new file mode 100644
index 00000000..9e147956
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/document-revert-symbolic-rtl.svg
@@ -0,0 +1,35 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='document-revert-symbolic-rtl.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.92pre3 r' viewBox='0 0 16 16' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='33.730346' inkscape:cy='11.09031' inkscape:document-units='px' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:measure-end='0,0' inkscape:measure-start='0,0' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1016' inkscape:window-maximized='1' inkscape:window-width='1920' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='16'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-140.06251' originy='590' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-381.06271,-807)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-381.06271,-807)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-381.06271,-807)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-381.06271,-807)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-381.06271,-807)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-381.06271,-807)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-381.06271,-807)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-381.06271,-807)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-381.06271,-807)'>
+ <path inkscape:connector-curvature='0' d='m 384.0002,808 a 1.0001,1.0001 0 0 0 -1,1 v 4 a 1.0001,1.0001 0 1 0 2,0 v -3 h 5.58594 l 2.41406,2.41406 V 821 h -8 v -3 c 0,-0.66667 0.18578,-0.72473 0.44727,-0.85547 C 385.70895,817.01379 386.0002,817 386.0002,817 h 1.58594 l -0.29297,0.29297 c -0.18755,0.1875 -0.29293,0.44183 -0.29297,0.70703 v 1 h 1 c 0.27,0 0.52853,-0.10919 0.7168,-0.30273 L 391.41426,816 388.70723,813.29297 C 388.51973,813.10542 388.2654,813.00004 388.0002,813 h -1 v 1 c 4e-5,0.2652 0.10566,0.51976 0.29297,0.70703 0.003,0.004 0.007,0.007 0.01,0.01 L 387.58614,815 h -1.58594 c 0,0 -0.70875,-0.0138 -1.44727,0.35547 -0.73851,0.36926 -1.55273,1.3112 -1.55273,2.64453 v 4 a 1.0001,1.0001 0 0 0 1,1 h 10 a 1.0001,1.0001 0 0 0 1,-1 v -10 a 1.0001,1.0001 0 0 0 -0.29297,-0.70703 l -3,-3 A 1.0001,1.0001 0 0 0 391.0002,808 Z' id='path9795' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/document-revert-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/document-revert-symbolic.svg
new file mode 100644
index 00000000..61c67193
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/document-revert-symbolic.svg
@@ -0,0 +1,35 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='document-revert-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.92pre3 r' viewBox='0 0 16 16' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='53.792846' inkscape:cy='11.09031' inkscape:document-units='px' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:measure-end='0,0' inkscape:measure-start='0,0' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1016' inkscape:window-maximized='1' inkscape:window-width='1920' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='16'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-120.00001' originy='590' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-361.00021,-807)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-361.00021,-807)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-361.00021,-807)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-361.00021,-807)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-361.00021,-807)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-361.00021,-807)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-361.00021,-807)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-361.00021,-807)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-361.00021,-807)'>
+ <path inkscape:connector-curvature='0' d='m 364.0002,808 a 1.0001,1.0001 0 0 0 -1,1 v 13 a 1.0001,1.0001 0 0 0 1,1 h 10 a 1.0001,1.0001 0 0 0 1,-1 v -4 c 0,-1.33333 -0.81422,-2.27527 -1.55273,-2.64453 C 372.70895,814.98621 372.0002,815 372.0002,815 h -1.58594 l 0.28321,-0.2832 c 0.003,-0.003 0.007,-0.006 0.01,-0.01 0.18683,-0.18681 0.29269,-0.4416 0.29273,-0.7068 v -1 h -1 c -0.2652,4e-5 -0.51953,0.10542 -0.70703,0.29297 L 366.58614,816 l 2.69726,2.69727 c 0.18827,0.19354 0.4468,0.30273 0.7168,0.30273 h 1 v -1 c -4e-5,-0.2652 -0.10542,-0.51953 -0.29297,-0.70703 L 370.41426,817 h 1.58594 c 0,0 0.29125,0.0138 0.55273,0.14453 0.26149,0.13074 0.44727,0.1888 0.44727,0.85547 v 3 h -8 v -11 h 5.58594 l 2.41406,2.41406 V 813 a 1.0001,1.0001 0 1 0 2,0 v -1 a 1.0001,1.0001 0 0 0 -0.29297,-0.70703 l -3,-3 A 1.0001,1.0001 0 0 0 371.0002,808 Z' id='path9737' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/document-save-as-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/document-save-as-symbolic-ref.png
new file mode 100644
index 00000000..42bf66be
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/document-save-as-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/document-save-as-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/document-save-as-symbolic.svg
new file mode 100644
index 00000000..7284b371
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/document-save-as-symbolic.svg
@@ -0,0 +1,35 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' id='svg7384' sodipodi:docname='document-save-as-symbolic.svg' height='16' xmlns:cc='http://creativecommons.org/ns#' xmlns='http://www.w3.org/2000/svg' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' width='16' xmlns:dc='http://purl.org/dc/elements/1.1/' version='1.1' inkscape:version='0.48.1 r9760' xmlns:svg='http://www.w3.org/2000/svg' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview id='namedview88' inkscape:snap-to-guides='true' inkscape:snap-others='false' objecttolerance='10' inkscape:snap-grids='true' inkscape:guide-bbox='true' inkscape:bbox-paths='false' borderopacity='1' showgrid='false' inkscape:snap-nodes='true' gridtolerance='10' inkscape:window-width='1226' inkscape:snap-bbox='true' inkscape:object-paths='false' inkscape:object-nodes='false' showborder='false' inkscape:snap-bbox-midpoints='false' inkscape:pageshadow='2' pagecolor='#555753' inkscape:cx='10.86986' inkscape:cy='11.18857' inkscape:window-maximized='0' inkscape:zoom='32' inkscape:window-x='2571' inkscape:window-y='354' guidetolerance='10' inkscape:current-layer='layer12' inkscape:pageopacity='1' bordercolor='#666666' showguides='true' inkscape:snap-global='true' inkscape:window-height='967'>
+ <inkscape:grid id='grid4866' visible='true' enabled='true' spacingx='1px' spacingy='1px' snapvisiblegridlinesonly='true' empspacing='2' type='xygrid'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g id='layer9' style='display:inline' inkscape:label='status' inkscape:groupmode='layer' transform='translate(-101.0002,-647)'/>
+ <g id='layer10' inkscape:label='devices' inkscape:groupmode='layer' transform='translate(-101.0002,-647)'/>
+ <g id='layer11' inkscape:label='apps' inkscape:groupmode='layer' transform='translate(-101.0002,-647)'/>
+ <g id='layer13' inkscape:label='places' inkscape:groupmode='layer' transform='translate(-101.0002,-647)'/>
+ <g id='layer14' inkscape:label='mimetypes' inkscape:groupmode='layer' transform='translate(-101.0002,-647)'/>
+ <g id='layer15' style='display:inline' inkscape:label='emblems' inkscape:groupmode='layer' transform='translate(-101.0002,-647)'/>
+ <g style='display:inline' id='g71291' inkscape:label='emotes' inkscape:groupmode='layer' transform='translate(-101.0002,-647)'/>
+ <g style='display:inline' id='g4953' inkscape:label='categories' inkscape:groupmode='layer' transform='translate(-101.0002,-647)'/>
+ <g id='layer12' style='display:inline' inkscape:label='actions' inkscape:groupmode='layer' transform='translate(-101.0002,-647)'>
+
+ <path style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans' d='m 105.0002,652 0,1 c 10e-6,0.2653 0.0931,0.53058 0.28125,0.71875 l 3,3 0.28125,0.28125 0.875,0 0.28125,-0.28125 3,-3 c 0.18819,-0.18817 0.28124,-0.45345 0.28125,-0.71875 l 0,-1 -1,0 c -0.2653,10e-6 -0.53059,0.0931 -0.71875,0.28125 l -2.28125,2.28125 -2.28125,-2.28125 C 106.53079,652.0931 106.2655,652.00001 106.0002,652 l -1,0 z' id='path3613-6' inkscape:connector-curvature='0'/>
+ <path style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans' d='m 108,650 0,5 2,0 0,-5 -2,0 z' id='path4388-5' inkscape:connector-curvature='0'/>
+ <path style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' d='m 104.0002,658 0,4 10,0 0,-4 z m 3.34375,1.4375 c 0.0208,-10e-4 0.0417,-10e-4 0.0625,0 0.29096,-0.0556 0.59898,0.20383 0.59375,0.5 l 0,0.0625 2,0 0,-0.0625 c -0.004,-0.26416 0.23582,-0.50712 0.5,-0.50712 0.26418,0 0.50373,0.24296 0.5,0.50712 l 0,0.0625 c 0,0.54535 -0.45465,1 -1,1 l -2,0 c -0.54535,0 -1,-0.45465 -1,-1 l 0,-0.0625 c -0.0108,-0.21706 0.13723,-0.43234 0.34375,-0.5 z' id='rect11668-7-5-4' sodipodi:nodetypes='ccccccsccccsccccccc' inkscape:connector-curvature='0'/>
+ <path style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans' d='m 104,647 c -0.54535,0 -1,0.45465 -1,1 l 0,2 c 0,0.54535 0.45465,1 1,1 l 10,0 c 0.54535,0 1,-0.45465 1,-1 l 0,-2 c 0,-0.54535 -0.45465,-1 -1,-1 l -10,0 z m 0,1 10,0 0,2 -10,0 0,-2 z' id='rect4390' inkscape:connector-curvature='0'/>
+ <path style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans' d='m 105.40625,656 a 0.50005,0.50005 0 0 0 -0.3125,0.21875 l -1,1.5 a 0.50005,0.50005 0 1 0 0.8125,0.5625 l 1,-1.5 a 0.50005,0.50005 0 0 0 -0.5,-0.78125 z m 7,0 a 0.50005,0.50005 0 0 0 -0.3125,0.78125 l 1,1.5 a 0.50005,0.50005 0 1 0 0.8125,-0.5625 l -1,-1.5 a 0.50005,0.50005 0 0 0 -0.5,-0.21875 z' id='rect4390-9-1' inkscape:connector-curvature='0'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/document-save-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/document-save-symbolic-ref.png
new file mode 100644
index 00000000..3c9faf9d
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/document-save-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/document-save-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/document-save-symbolic.svg
new file mode 100644
index 00000000..e34b24a1
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/document-save-symbolic.svg
@@ -0,0 +1,33 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:svg='http://www.w3.org/2000/svg' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' sodipodi:docname='document-save-symbolic.svg' version='1.1' inkscape:version='0.48pre1 r9509' height='16' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:cy='119.948' pagecolor='#555753' borderopacity='1' showborder='false' inkscape:bbox-paths='false' guidetolerance='10' inkscape:window-width='1310' showguides='true' inkscape:object-nodes='true' inkscape:snap-bbox='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:snap-nodes='true' bordercolor='#666666' objecttolerance='10' id='namedview88' showgrid='false' inkscape:window-maximized='0' inkscape:window-x='54' inkscape:snap-global='true' inkscape:window-y='24' gridtolerance='10' inkscape:window-height='690' inkscape:snap-to-guides='true' inkscape:current-layer='layer12' inkscape:zoom='1' inkscape:cx='32.15721' inkscape:snap-grids='true' inkscape:pageopacity='1'>
+ <inkscape:grid spacingx='1px' spacingy='1px' id='grid4866' empspacing='2' enabled='true' type='xygrid' snapvisiblegridlinesonly='true' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:label='status' transform='translate(-80,-648)' inkscape:groupmode='layer' id='layer9' style='display:inline'/>
+ <g inkscape:label='devices' transform='translate(-80,-648)' inkscape:groupmode='layer' id='layer10'/>
+ <g inkscape:label='apps' transform='translate(-80,-648)' inkscape:groupmode='layer' id='layer11'/>
+ <g inkscape:label='actions' transform='translate(-80,-648)' inkscape:groupmode='layer' id='layer12'>
+ <path inkscape:connector-curvature='0' d='m 84.40625,657 a 0.50005,0.50005 0 0 0 -0.3125,0.21875 l -1,1.5 a 0.50005,0.50005 0 1 0 0.8125,0.5625 l 1,-1.5 A 0.50005,0.50005 0 0 0 84.40625,657 z m 7,0 a 0.50005,0.50005 0 0 0 -0.3125,0.78125 l 1,1.5 a 0.50005,0.50005 0 1 0 0.8125,-0.5625 l -1,-1.5 A 0.50005,0.50005 0 0 0 91.40625,657 z' id='rect4390-9' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+
+ <g transform='translate(-80,110)' id='g4555'>
+ <path inkscape:connector-curvature='0' d='m 167,539 0,5.5625 -1.28125,-1.28125 C 165.53059,543.0931 165.2653,543.00001 165,543 l -1,0 0,1 c 1e-5,0.2653 0.0931,0.53058 0.28125,0.71875 l 3,3 0.28125,0.28125 0.875,0 0.28125,-0.28125 3,-3 C 171.90694,544.53058 171.99999,544.2653 172,544 l 0,-1 -1,0 c -0.2653,10e-6 -0.53059,0.0931 -0.71875,0.28125 L 169,544.5625 169,539 z' id='path3613' sodipodi:nodetypes='ccccccccccccccccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/>
+ <path inkscape:connector-curvature='0' d='m 163,549 0,4 10,0 0,-4 z m 3.34375,1.4375 c 0.0208,-10e-4 0.0417,-10e-4 0.0625,0 0.29096,-0.0556 0.59898,0.20383 0.59375,0.5 l 0,0.0625 2,0 0,-0.0625 c -0.004,-0.26416 0.23582,-0.50712 0.5,-0.50712 0.26418,0 0.50373,0.24296 0.5,0.50712 L 170,551 c 0,0.54535 -0.45465,1 -1,1 l -2,0 c -0.54535,0 -1,-0.45465 -1,-1 l 0,-0.0625 c -0.0108,-0.21706 0.13723,-0.43234 0.34375,-0.5 z' id='rect11668-7-5' sodipodi:nodetypes='ccccccsccccsccccccc' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ </g>
+ </g>
+ <g inkscape:label='places' transform='translate(-80,-648)' inkscape:groupmode='layer' id='layer13'/>
+ <g inkscape:label='mimetypes' transform='translate(-80,-648)' inkscape:groupmode='layer' id='layer14'/>
+ <g inkscape:label='emblems' transform='translate(-80,-648)' inkscape:groupmode='layer' id='layer15' style='display:inline'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/document-send-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/document-send-symbolic-ref.png
new file mode 100644
index 00000000..f176e85c
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/document-send-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/document-send-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/document-send-symbolic.svg
new file mode 100644
index 00000000..01c9734a
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/document-send-symbolic.svg
@@ -0,0 +1,35 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='document-send-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16.000099' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.92pre3 r' viewBox='0 0 16 16.000099' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='13.730346' inkscape:cy='11.09041' inkscape:document-units='px' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:measure-end='0,0' inkscape:measure-start='0,0' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1016' inkscape:window-maximized='1' inkscape:window-width='1920' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='16'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-160.06251' originy='590.00009' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-401.06271,-807)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-401.06271,-807)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-401.06271,-807)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-401.06271,-807)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-401.06271,-807)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-401.06271,-807)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-401.06271,-807)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-401.06271,-807)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-401.06271,-807)'>
+ <path inkscape:connector-curvature='0' d='m 404.0002,808 a 1.0001,1.0001 0 0 0 -1,1 v 13 a 1.0001,1.0001 0 0 0 1,1 h 2 a 1.0001,1.0001 0 1 0 0,-2 h -1 v -11 h 5.58594 l 2.41406,2.41406 V 821 h -3 v -2 -1.58594 l 0.29297,0.29297 c 0.1875,0.18755 0.44183,0.29293 0.70703,0.29297 h 1 v -1 c 0,-0.27 -0.10919,-0.52853 -0.30273,-0.7168 l -2.69727,-2.69726 -2.70703,2.70703 c -0.18755,0.1875 -0.29293,0.44183 -0.29297,0.70703 v 1 h 1 c 0.2652,-4e-5 0.51976,-0.10566 0.70703,-0.29297 0.004,-0.003 0.007,-0.007 0.01,-0.01 l 0.28297,-0.28297 V 819 v 3 a 1.0001,1.0001 0 0 0 1,1 h 5 a 1.0001,1.0001 0 0 0 1,-1 v -10 a 1.0001,1.0001 0 0 0 -0.29297,-0.70703 l -3,-3 A 1.0001,1.0001 0 0 0 411.0002,808 Z' id='path9920' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/drive-harddisk-ieee1394-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/drive-harddisk-ieee1394-symbolic-ref.png
new file mode 100644
index 00000000..66526d41
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/drive-harddisk-ieee1394-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/drive-harddisk-ieee1394-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/drive-harddisk-ieee1394-symbolic.svg
new file mode 100644
index 00000000..c3010972
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/drive-harddisk-ieee1394-symbolic.svg
@@ -0,0 +1,35 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='drive-harddisk-ieee1394-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.91 r13725' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer10' inkscape:cx='527.3722' inkscape:cy='-119.30766' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='740.0002' originy='230' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(499,-447)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(499,-447)'>
+
+ <path inkscape:connector-curvature='0' d='m -496.00022,448.03456 c -1,0 -1,1 -1,1 l 0,12 c 0,0 0,1 1,1 l 10,0 c 0,0 1,0 1,-1 l 0,-12 c 0,0 0,-1 -1,-1 z m 5,2 c 2.20914,0 4,1.79086 4,4 0,2.20914 -1.79086,4 -4,4 l -4,0 0,-4 c 0,-2.20914 1.79086,-4 4,-4 z m 0,2 c -1.10457,0 -2,0.89543 -2,2 0,1.10457 0.89543,2 2,2 1.10457,0 2,-0.89543 2,-2 0,-1.10457 -0.89543,-2 -2,-2 z' id='path10053' sodipodi:nodetypes='sccscscssssscsssssss' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(499,-447)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(499,-447)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(499,-447)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(499,-447)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(499,-447)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(499,-447)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(499,-447)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/drive-harddisk-solidstate-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/drive-harddisk-solidstate-symbolic-ref.png
new file mode 100644
index 00000000..4a68eb3b
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/drive-harddisk-solidstate-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/drive-harddisk-solidstate-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/drive-harddisk-solidstate-symbolic.svg
new file mode 100644
index 00000000..2d957004
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/drive-harddisk-solidstate-symbolic.svg
@@ -0,0 +1,38 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='drive-harddisk-solidstate-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.5 r10040' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer10' inkscape:cx='13.583886' inkscape:cy='5.40374' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1375' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='40.0002px' originy='350px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-201,-567)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-201,-567)'>
+
+ <path inkscape:connector-curvature='0' d='M 204.1875,567 C 202.9859,567 202,567.98758 202,569.1875 l 0,11.625 c 0,1.19992 0.9859,2.1875 2.1875,2.1875 l 9.625,0 c 1.2016,0 2.1875,-0.98758 2.1875,-2.1875 l 0,-11.625 C 216,567.98758 215.0141,567 213.8125,567 l -9.625,0 z m 0,2 9.625,0 c 0.1238,0 0.1875,0.0566 0.1875,0.1875 l 0,11.625 c 0,0.1309 -0.0637,0.1875 -0.1875,0.1875 l -9.625,0 C 204.0637,581 204,580.9434 204,580.8125 l 0,-11.625 C 204,569.0566 204.0637,569 204.1875,569 z' id='rect27159' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <rect height='7' id='rect27165' rx='0' ry='0' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' width='6.0000052' x='206.0002' y='571'/>
+ <path inkscape:connector-curvature='0' d='m 205.0625,572 0,1 0.5,0 6.9375,0 0.5,0 0,-1 -0.5,0 -6.9375,0 -0.5,0 z' id='path27167' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 205.0625,574 0,1 0.5,0 6.9375,0 0.5,0 0,-1 -0.5,0 -6.9375,0 -0.5,0 z' id='path27169' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 205.0625,576 0,1 0.5,0 6.9375,0 0.5,0 0,-1 -0.5,0 -6.9375,0 -0.5,0 z' id='path27171' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 207,570 0,0.5 0,8 0,0.5 1,0 0,-0.5 0,-8 0,-0.5 -1,0 z' id='path27175' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 209,570 0,0.5 0,8 0,0.5 1,0 0,-0.5 0,-8 0,-0.5 -1,0 z' id='path27177' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 211,570 0,0.5 0,8 0,0.5 1,0 0,-0.5 0,-8 0,-0.5 -1,0 z' id='path27179' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-201,-567)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-201,-567)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-201,-567)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-201,-567)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-201,-567)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-201,-567)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-201,-567)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/drive-harddisk-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/drive-harddisk-symbolic-ref.png
new file mode 100644
index 00000000..1249b3d4
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/drive-harddisk-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/drive-harddisk-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/drive-harddisk-symbolic.svg
new file mode 100644
index 00000000..71fec975
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/drive-harddisk-symbolic.svg
@@ -0,0 +1,34 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:svg='http://www.w3.org/2000/svg' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' version='1.1' inkscape:version='0.47 r22583' height='16' sodipodi:docname='drive-harddisk-symbolic.svg' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:cy='10.65376' inkscape:current-layer='layer10' inkscape:window-width='1310' pagecolor='#555753' showborder='false' showguides='true' inkscape:snap-nodes='true' objecttolerance='10' showgrid='false' inkscape:object-nodes='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:window-x='58' inkscape:snap-bbox='true' bordercolor='#666666' id='namedview88' inkscape:window-maximized='0' inkscape:snap-global='true' inkscape:window-y='353' gridtolerance='10' inkscape:zoom='1' inkscape:window-height='690' borderopacity='1' guidetolerance='10' inkscape:cx='-64.11032' inkscape:bbox-paths='false' inkscape:snap-grids='true' inkscape:pageopacity='1' inkscape:snap-to-guides='true'>
+ <inkscape:grid visible='true' spacingx='1px' type='xygrid' spacingy='1px' id='grid4866' empspacing='2' enabled='true' snapvisiblegridlinesonly='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g transform='translate(-182,-448)' inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline'/>
+ <g transform='translate(-182,-448)' inkscape:groupmode='layer' id='layer10' inkscape:label='devices'>
+ <g transform='translate(134,50)' id='g42757' inkscape:label='accessories-calculator'>
+
+ </g>
+ <path d='M 185.1875,448 C 183.9859,448 183,448.98758 183,450.1875 l 0,11.625 c 0,1.19992 0.9859,2.1875 2.1875,2.1875 l 9.625,0 c 1.2016,0 2.1875,-0.98758 2.1875,-2.1875 l 0,-11.625 C 197,448.98758 196.0141,448 194.8125,448 l -9.625,0 z m 0,2 9.625,0 c 0.1238,0 0.1875,0.0566 0.1875,0.1875 l 0,11.625 c 0,0.1309 -0.0637,0.1875 -0.1875,0.1875 l -9.625,0 C 185.0637,462 185,461.9434 185,461.8125 l 0,-11.625 C 185,450.0566 185.0637,450 185.1875,450 z' id='rect42761' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.99999988;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/>
+ <path inkscape:connector-curvature='0' d='m 189.84375,451 c -0.26556,0.0109 -0.54445,0.0586 -0.8125,0.125 -2.14441,0.53085 -3.4371,2.69934 -2.90625,4.84375 0.4498,1.81699 2.07532,3.0225 3.86571,3.02533 0.16806,2.7e-4 0.33757,-0.0101 0.5077,-0.0315 l -0.3888,-2.97965 c -0.0347,0.01 -0.0704,0.017 -0.10961,0.017 -0.55254,0 -1,-0.44746 -1,-1 0,-0.55254 0.44746,-1 1,-1 0.55254,0 1,0.44746 1,1 0,0.11765 -0.0285,0.22486 -0.0726,0.32494 l 2.70058,1.38685 c 0.38616,-0.83016 0.46978,-1.78065 0.24701,-2.68054 -0.46449,-1.87636 -2.1723,-3.10719 -4.03125,-3.03125 z' id='path42765' sodipodi:nodetypes='ccssccssssccssc' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='M 190.66095,456 192,460 c 0.73426,2.05595 3,0.38433 1.4966,-1 z' id='path42767' sodipodi:nodetypes='cccc' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ </g>
+ <g transform='translate(-182,-448)' inkscape:groupmode='layer' id='layer11' inkscape:label='apps'/>
+ <g transform='translate(-182,-448)' inkscape:groupmode='layer' id='layer12' inkscape:label='actions'/>
+ <g transform='translate(-182,-448)' inkscape:groupmode='layer' id='layer13' inkscape:label='places'/>
+ <g transform='translate(-182,-448)' inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes'/>
+ <g transform='translate(-182,-448)' inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline'/>
+ <g transform='translate(-182,-448)' inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/drive-harddisk-system-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/drive-harddisk-system-symbolic-ref.png
new file mode 100644
index 00000000..30917d83
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/drive-harddisk-system-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/drive-harddisk-system-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/drive-harddisk-system-symbolic.svg
new file mode 100644
index 00000000..39414817
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/drive-harddisk-system-symbolic.svg
@@ -0,0 +1,36 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='drive-harddisk-system-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.91 r13725' width='14' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer10' inkscape:cx='64.51764' inkscape:cy='-10.25377' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='719.0002' originy='230' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(478,-447)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(478,-447)'>
+ <path inkscape:connector-curvature='0' d='m -475.80469,447 c -1.20159,0 -2.19531,1.00125 -2.19531,2.20117 l 0,11.59766 c 0,1.19992 0.99372,2.20117 2.19531,2.20117 l 9.60938,0 c 1.20159,0 2.19531,-1.00125 2.19531,-2.20117 l 0,-11.59766 C -464,448.00125 -464.99372,447 -466.19531,447 l -9.60938,0 z m 0,2 9.60938,0 c 0.12379,0 0.19531,0.0703 0.19531,0.20117 l 0,11.59766 c 0,0.1309 -0.0715,0.20117 -0.19531,0.20117 l -9.60938,0 C -475.92848,461 -476,460.92973 -476,460.79883 l 0,-11.59766 c 0,-0.1309 0.0715,-0.20117 0.19531,-0.20117 z' id='rect12956-4' style='color:#bebebe;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.99999988;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m -471.15623,450 c -0.26556,0.0109 -0.54445,0.0586 -0.8125,0.125 -2.14441,0.53085 -3.4371,2.69934 -2.90625,4.84375 0.4498,1.81699 2.07532,3.0225 3.86571,3.02533 0.16806,2.7e-4 0.33757,-0.0101 0.5077,-0.0315 l -0.3888,-2.97965 c -0.0347,0.01 -0.0704,0.017 -0.10961,0.017 -0.55254,0 -1,-0.44746 -1,-1 0,-0.55254 0.44746,-1 1,-1 0.55254,0 1,0.44746 1,1 0,0.11765 -0.0285,0.22486 -0.0726,0.32494 l 2.70058,1.38685 c 0.38616,-0.83016 0.46978,-1.78065 0.24701,-2.68054 -0.46449,-1.87636 -2.1723,-3.10719 -4.03125,-3.03125 z' id='path12958-9' sodipodi:nodetypes='ccssccssssccssc' style='color:#000000;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m -470.33903,455 1.33905,4 c 0.73426,2.05595 3,0.38433 1.4966,-1 z' id='path12960-6' sodipodi:nodetypes='cccc' style='color:#000000;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(478,-447)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(478,-447)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(478,-447)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(478,-447)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(478,-447)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(478,-447)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(478,-447)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/drive-harddisk-usb-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/drive-harddisk-usb-symbolic-ref.png
new file mode 100644
index 00000000..66526d41
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/drive-harddisk-usb-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/drive-harddisk-usb-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/drive-harddisk-usb-symbolic.svg
new file mode 100644
index 00000000..61aa81be
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/drive-harddisk-usb-symbolic.svg
@@ -0,0 +1,35 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='drive-harddisk-usb-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.91 r13725' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer10' inkscape:cx='487.3722' inkscape:cy='-119.30766' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='700.0002' originy='230' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(459,-447)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(459,-447)'>
+
+ <path inkscape:connector-curvature='0' d='m -456.00022,448.03456 c -1,0 -1,1 -1,1 l 0,12 c 0,0 0,1 1,1 l 10,0 c 0,0 1,0 1,-1 l 0,-12 c 0,0 0,-1 -1,-1 z m 5,2 c 2.20914,0 4,1.79086 4,4 0,2.20914 -1.79086,4 -4,4 l -4,0 0,-4 c 0,-2.20914 1.79086,-4 4,-4 z m 0,2 c -1.10457,0 -2,0.89543 -2,2 0,1.10457 0.89543,2 2,2 1.10457,0 2,-0.89543 2,-2 0,-1.10457 -0.89543,-2 -2,-2 z' id='path10063' sodipodi:nodetypes='sccscscssssscsssssss' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(459,-447)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(459,-447)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(459,-447)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(459,-447)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(459,-447)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(459,-447)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(459,-447)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/drive-multidisk-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/drive-multidisk-symbolic-ref.png
new file mode 100644
index 00000000..acc321ce
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/drive-multidisk-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/drive-multidisk-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/drive-multidisk-symbolic.svg
new file mode 100644
index 00000000..30a4fe69
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/drive-multidisk-symbolic.svg
@@ -0,0 +1,36 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='drive-multidisk-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.91 r13725' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer10' inkscape:cx='-232.628' inkscape:cy='0.69234' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-20' originy='350' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-261.0002,-567)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-261.0002,-567)'>
+
+ <path inkscape:connector-curvature='0' d='m 264.19571,567 c -1.20159,0 -2.19531,1.00125 -2.19531,2.20117 l 0,7.59766 c 0,1.19992 0.99372,2.20117 2.19531,2.20117 l 6.60938,0 c 1.20159,0 2.19531,-1.00125 2.19531,-2.20117 l 0,-7.59766 c 0,-1.19992 -0.99372,-2.20117 -2.19531,-2.20117 l -6.60938,0 z m 3.30469,2 c 1.92115,0 3.5,1.57885 3.5,3.5 0,1.92115 -1.57885,3.49958 -3.5,3.5 l -3.50586,0 0.006,-3.5 c -0.0237,-1.921 1.57885,-3.5 3.5,-3.5 z m 0,2 c -0.84027,0 -1.5,0.65973 -1.5,1.5 0,0.84027 0.65973,1.5 1.5,1.5 0.84027,0 1.5,-0.65973 1.5,-1.5 0,-0.84027 -0.65973,-1.5 -1.5,-1.5 z' id='rect42761-1' style='color:#bebebe;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.99999976;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 274.0004,571 0,2.1875 0,6.8125 0,0.8125 c 0,0.1309 -0.0637,0.1875 -0.1875,0.1875 l -6.625,0 c -0.1238,0 -0.1875,-0.0566 -0.1875,-0.1875 l 0,-0.8125 -2,0 0,0.8125 c 0,1.19992 0.9859,2.1875 2.1875,2.1875 l 6.625,0 c 1.2016,0 2.1875,-0.98758 2.1875,-2.1875 l 0,-7.625 c 0,-1.13596 -0.88628,-2.08992 -2,-2.1875 z' id='rect42761-1-8' style='color:#bebebe;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:Sans;-inkscape-font-specification:Sans;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.99999976;marker:none;enable-background:accumulate'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-261.0002,-567)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-261.0002,-567)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-261.0002,-567)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-261.0002,-567)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-261.0002,-567)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-261.0002,-567)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-261.0002,-567)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/drive-optical-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/drive-optical-symbolic-ref.png
new file mode 100644
index 00000000..2c4b9461
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/drive-optical-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/drive-optical-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/drive-optical-symbolic.svg
new file mode 100644
index 00000000..d98f5ac8
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/drive-optical-symbolic.svg
@@ -0,0 +1,34 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='drive-optical-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.4 r9939' version='1.1' width='16.0002' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer10' inkscape:cx='71.284009' inkscape:cy='-171.9103' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='702' inkscape:window-maximized='1' inkscape:window-width='1366' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='40.0002px' originy='250px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ <inkscape:grid color='#000000' empcolor='#000000' empopacity='0' empspacing='4' enabled='true' id='grid5968' opacity='0.1254902' originx='40.0002px' originy='250px' snapvisiblegridlinesonly='true' spacingx='0.5px' spacingy='0.5px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-201,-467)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-201,-467)'>
+ <path inkscape:connector-curvature='0' d='m 203.5002,468 c -1.385,0 -2.5,1.115 -2.5,2.5 l 0,8 c 0,1.385 1.115,2.5 2.5,2.5 l 0,-2 c -0.277,0 -0.5,-0.223 -0.5,-0.5 l 0,-1.5 0.5,0 11,0 0.5,0 0,1.5 c 0,0.277 -0.223,0.5 -0.5,0.5 l 0,2 c 1.385,0 2.5,-1.115 2.5,-2.5 l 0,-8 c 0,-1.385 -1.115,-2.5 -2.5,-2.5 l -11,0 z' id='path8478' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+
+ <path inkscape:connector-curvature='0' d='m 203.8752,478.03876 c 0,2.69092 2.29876,4.90426 5.11583,4.90426 2.81708,0 5.13418,-2.21334 5.13418,-4.90426 l -2.017,0 c 0,1.65243 -1.38729,2.97759 -3.11718,2.97759 -1.72988,0 -3.09884,-1.32516 -3.09884,-2.97759 z' id='path40815' sodipodi:nodetypes='csccscc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:3.4283843;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 207.0002,478 c 0,1.09864 0.90135,2 2,2 1.09865,0 2,-0.90136 2,-2 l -1,0 c 0,0.5582 -0.44179,1 -1,1 -0.55821,0 -1,-0.4418 -1,-1 l -1,0 z' id='path40342-8' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.87825239;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-201,-467)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-201,-467)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-201,-467)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-201,-467)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-201,-467)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-201,-467)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-201,-467)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/drive-removable-media-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/drive-removable-media-symbolic-ref.png
new file mode 100644
index 00000000..8c945a78
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/drive-removable-media-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/drive-removable-media-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/drive-removable-media-symbolic.svg
new file mode 100644
index 00000000..732e6c14
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/drive-removable-media-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='drive-removable-media-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.4 r9939' version='1.1' width='16.0002' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer10' inkscape:cx='51.284009' inkscape:cy='-171.9103' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='702' inkscape:window-maximized='1' inkscape:window-width='1366' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='20.0002px' originy='250px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ <inkscape:grid color='#000000' empcolor='#000000' empopacity='0' empspacing='4' enabled='true' id='grid5968' opacity='0.1254902' originx='20.0002px' originy='250px' snapvisiblegridlinesonly='true' spacingx='0.5px' spacingy='0.5px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-221,-467)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-221,-467)'>
+ <path inkscape:connector-curvature='0' d='m 223.5002,468 c -1.385,0 -2.5,1.115 -2.5,2.5 l 0,8 c 0,1.385 1.115,2.5 2.5,2.5 l 11,0 c 1.385,0 2.5,-1.115 2.5,-2.5 l 0,-8 c 0,-1.385 -1.115,-2.5 -2.5,-2.5 z m 0,9 11,0 0.5,0 0,1.5 c 0,0.277 -0.223,0.5 -0.5,0.5 l -11,0 c -0.277,0 -0.5,-0.223 -0.5,-0.5 l 0,-1.5 z' id='rect8463' sodipodi:nodetypes='ssssssssscccsssscc' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+
+ </g>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-221,-467)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-221,-467)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-221,-467)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-221,-467)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-221,-467)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-221,-467)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-221,-467)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/edit-clear-all-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/edit-clear-all-symbolic-ref.png
new file mode 100644
index 00000000..9554b5f0
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/edit-clear-all-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/edit-clear-all-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/edit-clear-all-symbolic.svg
new file mode 100644
index 00000000..332f5670
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/edit-clear-all-symbolic.svg
@@ -0,0 +1,37 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='edit-clear-all-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.91 r13725' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='-5.8089504' inkscape:cy='-2.44557' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='false' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='8'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='0' originy='550' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-241.0002,-767)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-241.0002,-767)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-241.0002,-767)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-241.0002,-767)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-241.0002,-767)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-241.0002,-767)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-241.0002,-767)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-241.0002,-767)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-241.0002,-767)'>
+
+ <path inkscape:connector-curvature='0' d='m 252.08789,767.05078 a 1.0001,1.0001 0 0 0 -0.88672,0.50391 l -3.3125,5.625 a 1.0001,1.0001 0 1 0 1.72266,1.01562 l 3.3125,-5.625 a 1.0001,1.0001 0 0 0 -0.83594,-1.51953 z' id='path36048' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new'/>
+ <path inkscape:connector-curvature='0' d='m 246.21895,772.09375 4.94742,3.05384 c 0.60355,0.31472 0.81997,1.11313 0.16464,1.59705 l -0.62186,0.21653 -6.01923,-3.52145 0.0177,-0.90733 c 0.28883,-0.58524 0.75466,-0.81586 1.51132,-0.43864 z' id='path36050' sodipodi:nodetypes='ccccccc' style='color:#000000;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.55063653;marker:none;enable-background:new'/>
+ <path inkscape:connector-curvature='0' d='m 244.05404,774.48847 5.98988,3.4746 -1.04457,1.54209 c -0.22097,0.24307 -0.13258,0.57452 0.0884,0.7071 l 0.95017,0.81759 -5.36959,0 c -2.19054,0 -3.19682,-2.06453 -2.14342,-3.88909 z' id='path9831' sodipodi:nodetypes='cccccccc' style='color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999994;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/edit-clear-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/edit-clear-symbolic-ref.png
new file mode 100644
index 00000000..3ae67641
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/edit-clear-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/edit-clear-symbolic-rtl-ref.png b/rsvg/tests/fixtures/reftests/adwaita/edit-clear-symbolic-rtl-ref.png
new file mode 100644
index 00000000..bcc84c58
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/edit-clear-symbolic-rtl-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/edit-clear-symbolic-rtl.svg b/rsvg/tests/fixtures/reftests/adwaita/edit-clear-symbolic-rtl.svg
new file mode 100644
index 00000000..e0a180ec
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/edit-clear-symbolic-rtl.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='edit-clear-symbolic-rtl.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='-59.78677' inkscape:cy='344.78205' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1374' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='60px' originy='550px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-181.0002,-767)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-181.0002,-767)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-181.0002,-767)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-181.0002,-767)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-181.0002,-767)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-181.0002,-767)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-181.0002,-767)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-181.0002,-767)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-181.0002,-767)'>
+ <path inkscape:connector-curvature='0' d='m 191.0002,769 6,6 -6,6 -9.0353,0 c -0.53033,-0.0221 -0.9647,-0.49177 -0.9647,-1 l 0,-10 c 0,-0.53079 0.34561,-1 1.0089,-1 l 8.9911,0 z m -1,3 -1,0 c -0.0104,-1.2e-4 -0.0208,-4.6e-4 -0.0313,0 -0.25495,0.0112 -0.50987,0.12858 -0.6875,0.3125 l -1.2812,1.28125 -1.3125,-1.28125 C 185.42208,772.082 185.24103,772.007 185.0002,772 l -1,0 0,1 c 0,0.28647 0.0343,0.55065 0.25,0.75 l 1.28125,1.28125 -1.25,1.25 c -0.18819,0.18817 -0.28124,0.45345 -0.28125,0.71875 l 0,1 1,0 c 0.2653,-10e-6 0.53059,-0.0931 0.71875,-0.28125 l 1.28125,-1.28125 1.28125,1.28125 C 188.46961,777.90694 188.73491,778 189.0002,778 l 1,0 0,-1 c 0,-0.26529 -0.0931,-0.53058 -0.28125,-0.71875 l -1.28125,-1.25 1.28125,-1.28125 c 0.21074,-0.19463 0.30316,-0.46925 0.28125,-0.75 l 0,-1 z' id='path43079' sodipodi:nodetypes='ccccccccccsccccccccccccccccccccccc' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/edit-clear-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/edit-clear-symbolic.svg
new file mode 100644
index 00000000..9785c3d5
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/edit-clear-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:svg='http://www.w3.org/2000/svg' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' version='1.1' inkscape:version='0.47 r22583' height='16' sodipodi:docname='edit-clear-symbolic.svg' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:cy='226.99928' inkscape:current-layer='layer12' inkscape:window-width='1310' pagecolor='#555753' showborder='false' showguides='true' inkscape:snap-nodes='true' objecttolerance='10' showgrid='false' inkscape:object-nodes='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:window-x='54' inkscape:snap-bbox='true' bordercolor='#666666' id='namedview88' inkscape:window-maximized='0' inkscape:snap-global='true' inkscape:window-y='25' gridtolerance='10' inkscape:zoom='1' inkscape:window-height='690' borderopacity='1' guidetolerance='10' inkscape:cx='145.67275' inkscape:bbox-paths='false' inkscape:snap-grids='true' inkscape:pageopacity='1' inkscape:snap-to-guides='true'>
+ <inkscape:grid visible='true' spacingx='1px' type='xygrid' spacingy='1px' id='grid4866' empspacing='2' enabled='true' snapvisiblegridlinesonly='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g transform='translate(-120,-538)' inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline'/>
+ <g transform='translate(-120,-538)' inkscape:groupmode='layer' id='layer10' inkscape:label='devices'/>
+ <g transform='translate(-120,-538)' inkscape:groupmode='layer' id='layer11' inkscape:label='apps'/>
+ <g transform='translate(-120,-538)' inkscape:groupmode='layer' id='layer12' inkscape:label='actions'>
+ <g transform='translate(79,-222)' id='g27035' style='display:inline'>
+ <path transform='translate(-79,222)' d='m 126,540 -6,6 6,6 9.0353,0 C 135.56563,551.9779 136,551.50823 136,551 l 0,-10 c 0,-0.53079 -0.34561,-1 -1.0089,-1 L 126,540 z m 1,3 1,0 c 0.0104,-1.2e-4 0.0208,-4.6e-4 0.0313,0 0.25495,0.0112 0.50987,0.12858 0.6875,0.3125 l 1.2812,1.28125 1.3125,-1.28125 C 131.57812,543.082 131.75917,543.007 132,543 l 1,0 0,1 c 0,0.28647 -0.0343,0.55065 -0.25,0.75 l -1.28125,1.28125 1.25,1.25 C 132.90694,547.46942 132.99999,547.7347 133,548 l 0,1 -1,0 c -0.2653,-10e-6 -0.53059,-0.0931 -0.71875,-0.28125 L 130,547.4375 l -1.28125,1.28125 C 128.53059,548.90694 128.26529,549 128,549 l -1,0 0,-1 c 0,-0.26529 0.0931,-0.53058 0.28125,-0.71875 l 1.28125,-1.25 -1.28125,-1.28125 C 127.07051,544.55537 126.97809,544.28075 127,544 l 0,-1 z' id='path27041' sodipodi:nodetypes='ccccccccccsccccccccccccccccccccccc' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+
+ </g>
+ </g>
+ <g transform='translate(-120,-538)' inkscape:groupmode='layer' id='layer13' inkscape:label='places'/>
+ <g transform='translate(-120,-538)' inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes'/>
+ <g transform='translate(-120,-538)' inkscape:groupmode='layer' id='layer15' inkscape:label='emblems'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/edit-copy-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/edit-copy-symbolic-ref.png
new file mode 100644
index 00000000..cbe847a1
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/edit-copy-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/edit-copy-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/edit-copy-symbolic.svg
new file mode 100644
index 00000000..0fe56197
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/edit-copy-symbolic.svg
@@ -0,0 +1,30 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:svg='http://www.w3.org/2000/svg' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' version='1.1' inkscape:version='0.47 r22583' height='16' sodipodi:docname='edit-copy-symbolic.svg' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:cy='204.1708' inkscape:current-layer='layer12' inkscape:window-width='1310' pagecolor='#555753' showborder='false' showguides='true' inkscape:snap-nodes='true' objecttolerance='10' showgrid='false' inkscape:object-nodes='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:window-x='54' inkscape:snap-bbox='true' bordercolor='#666666' id='namedview88' inkscape:window-maximized='0' inkscape:snap-global='true' inkscape:window-y='25' gridtolerance='10' inkscape:zoom='1' inkscape:window-height='690' borderopacity='1' guidetolerance='10' inkscape:cx='276.82494' inkscape:bbox-paths='false' inkscape:snap-grids='true' inkscape:pageopacity='1' inkscape:snap-to-guides='true'>
+ <inkscape:grid visible='true' spacingx='1px' type='xygrid' spacingy='1px' id='grid4866' empspacing='2' enabled='true' snapvisiblegridlinesonly='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g transform='translate(-80,-668)' inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline'/>
+ <g transform='translate(-80,-668)' inkscape:groupmode='layer' id='layer10' inkscape:label='devices'/>
+ <g transform='translate(-80,-668)' inkscape:groupmode='layer' id='layer11' inkscape:label='apps'/>
+ <g transform='translate(-80,-668)' inkscape:groupmode='layer' id='layer12' inkscape:label='actions'>
+
+ <path inkscape:connector-curvature='0' d='m 87,675 0,6.96874 5.000005,0 1.990842,-1.98705 -0.0221,-4.98168 -6.96875,0 L 87,675 z' id='path41071' sodipodi:nodetypes='ccccccc' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+ <path inkscape:connector-curvature='0' d='m 82.000003,670 0,7.96874 L 86,678 l 0,-4 3,0 -0.03125,-3.99999 -6.96875,0 3e-6,-10e-6 z' id='path41077' sodipodi:nodetypes='cccccccc' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+ </g>
+ <g transform='translate(-80,-668)' inkscape:groupmode='layer' id='layer13' inkscape:label='places'/>
+ <g transform='translate(-80,-668)' inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes'/>
+ <g transform='translate(-80,-668)' inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/edit-cut-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/edit-cut-symbolic-ref.png
new file mode 100644
index 00000000..b66e4cd4
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/edit-cut-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/edit-cut-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/edit-cut-symbolic.svg
new file mode 100644
index 00000000..efa1df28
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/edit-cut-symbolic.svg
@@ -0,0 +1,37 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='edit-cut-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16.010475' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.91 r13725' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='84.805737' inkscape:cy='-19.640425' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='true' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='11.313708'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='200' originy='570.01047' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-41.0002,-787)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-41.0002,-787)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-41.0002,-787)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-41.0002,-787)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-41.0002,-787)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-41.0002,-787)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-41.0002,-787)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-41.0002,-787)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-41.0002,-787)'>
+
+ <path inkscape:connector-curvature='0' d='m 44.5,796 c -1.921152,0 -3.5,1.57885 -3.5,3.5 0,1.92115 1.578848,3.5 3.5,3.5 1.921152,0 3.5,-1.57885 3.5,-3.5 0,-1.92115 -1.578848,-3.5 -3.5,-3.5 z m 0,2 c 0.840272,0 1.5,0.65973 1.5,1.5 0,0.84027 -0.659728,1.5 -1.5,1.5 -0.840272,0 -1.5,-0.65973 -1.5,-1.5 0,-0.84027 0.659728,-1.5 1.5,-1.5 z' id='path3940' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 53.5,796 c -1.921152,0 -3.5,1.57885 -3.5,3.5 0,1.92115 1.578848,3.5 3.5,3.5 1.921152,0 3.5,-1.57885 3.5,-3.5 0,-1.92115 -1.578848,-3.5 -3.5,-3.5 z m 0,2 c 0.840272,0 1.5,0.65973 1.5,1.5 0,0.84027 -0.659728,1.5 -1.5,1.5 -0.840272,0 -1.5,-0.65973 -1.5,-1.5 0,-0.84027 0.659728,-1.5 1.5,-1.5 z' id='path3942' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.00000024;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 44.096312,787 c -1.060411,0.554 -1.406518,1.7592 -0.794292,2.71875 L 47.722426,797 l -1.746288,2.36796 1.414082,2.08517 1.60998,-2.48438 1.57873,2.48438 1.401138,-1.99679 L 50.277974,797 54.69838,789.71875 C 55.310606,788.7592 54.964499,787.554 53.904088,787 l -4.903888,8 -4.903888,-8 z' id='rect4875' sodipodi:nodetypes='ccccccccccccc' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/edit-delete-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/edit-delete-symbolic-ref.png
new file mode 100644
index 00000000..27d8d654
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/edit-delete-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/edit-delete-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/edit-delete-symbolic.svg
new file mode 100644
index 00000000..9d6e3562
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/edit-delete-symbolic.svg
@@ -0,0 +1,26 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:svg='http://www.w3.org/2000/svg' id='svg7384' version='1.1' height='16' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs id='defs7386'/>
+ <g transform='translate(-40,-518)' id='layer9' style='display:inline'/>
+ <g transform='translate(-40,-518)' id='layer10'/>
+ <g transform='translate(-40,-518)' id='layer11'/>
+ <g transform='translate(-40,-518)' id='layer12'>
+
+ <path inkscape:connector-curvature='0' d='m 48,519.03125 c -3.85327,0 -6.96875,3.11547 -6.96875,6.96875 0,3.85327 3.11548,6.96875 6.96875,6.96875 3.85327,0 6.96875,-3.11548 6.96875,-6.96875 0,-3.85328 -3.11548,-6.96875 -6.96875,-6.96875 z M 45,523 l 1,0 c 0.01037,-1.2e-4 0.02079,-4.6e-4 0.03125,0 0.254951,0.0112 0.50987,0.12858 0.6875,0.3125 L 48,524.59375 49.3125,523.3125 C 49.578125,523.082 49.759172,523.007 50,523 l 1,0 0,1 c 0,0.28647 -0.03434,0.55065 -0.25,0.75 l -1.28125,1.28125 1.25,1.25 C 50.906938,527.46942 50.999992,527.7347 51,528 l 0,1 -1,0 c -0.265301,-10e-6 -0.530586,-0.0931 -0.71875,-0.28125 L 48,527.4375 46.71875,528.71875 C 46.530586,528.90694 46.26529,529 46,529 l -1,0 0,-1 c -3e-6,-0.26529 0.09306,-0.53058 0.28125,-0.71875 l 1.28125,-1.25 L 45.28125,524.75 C 45.070508,524.55537 44.97809,524.28075 45,524 l 0,-1 z' id='path10839' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.78124988;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Andale Mono;-inkscape-font-specification:Andale Mono'/>
+ </g>
+ <g transform='translate(-40,-518)' id='layer13'/>
+ <g transform='translate(-40,-518)' id='layer14'/>
+ <g transform='translate(-40,-518)' id='layer15'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/edit-find-replace-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/edit-find-replace-symbolic-ref.png
new file mode 100644
index 00000000..f69807f9
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/edit-find-replace-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/edit-find-replace-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/edit-find-replace-symbolic.svg
new file mode 100644
index 00000000..2377fd9d
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/edit-find-replace-symbolic.svg
@@ -0,0 +1,33 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='edit-find-replace-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.5 r10040' width='16.0002' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='5.804508' inkscape:cy='10.46213' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1375' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='60px' originy='550px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-181.0002,-767)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-181.0002,-767)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-181.0002,-767)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-181.0002,-767)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-181.0002,-767)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-181.0002,-767)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-181.0002,-767)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-181.0002,-767)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-181.0002,-767)'>
+ <path inkscape:connector-curvature='0' d='m 186.5002,767 c -3.02528,0 -5.5,2.4784 -5.5,5.5 0,1.99861 1.08914,3.75057 2.70067,4.70973 l 1.36183,-1.52223 c -1.22112,-0.54149 -2.0625,-1.75673 -2.0625,-3.1875 0,-1.94138 1.55626,-3.5 3.5,-3.5 1.3972,0 2.59519,0.79765 3.15625,1.96875 L 191.1252,769.5 c -0.98492,-1.50354 -2.7028,-2.5 -4.625,-2.5 z m 4.90625,8.96875 -1.40625,1.40625 3.28125,3.3125 c 0.36811,0.37651 1.04567,0.38405 1.42208,0.0158 0.3764,-0.36822 0.38375,-1.04578 0.0154,-1.42208 z' id='path27941-3' sodipodi:nodetypes='ssccssccscccscc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.99999988;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Sans;-inkscape-font-specification:Sans'/>
+
+ <path inkscape:connector-curvature='0' d='m 184.00201,778 8.99819,-9 c 1,0 2,1 2,2 l -9,9 -2,0 z' id='path2273-6-2-8' sodipodi:nodetypes='cccccc' style='fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none'/>
+ <path inkscape:connector-curvature='0' d='m 194.0002,768 c 1,0 2,1 2,2 l 1,-1 c 0,-1 -0.75185,-2 -2,-2 z' id='path4113-1-6-3-4' sodipodi:nodetypes='ccccc' style='fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/edit-find-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/edit-find-symbolic-ref.png
new file mode 100644
index 00000000..06ef5c7b
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/edit-find-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/edit-find-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/edit-find-symbolic.svg
new file mode 100644
index 00000000..7ded1798
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/edit-find-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:svg='http://www.w3.org/2000/svg' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' sodipodi:docname='edit-find-symbolic.svg' version='1.1' inkscape:version='0.48+devel r10008 custom' height='16' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:cy='6.1661' pagecolor='#555753' borderopacity='1' showborder='false' inkscape:bbox-paths='false' guidetolerance='10' inkscape:object-paths='true' inkscape:window-width='1296' showguides='true' inkscape:object-nodes='true' inkscape:snap-bbox='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:snap-nodes='false' bordercolor='#666666' objecttolerance='10' id='namedview88' showgrid='true' inkscape:window-maximized='0' inkscape:window-x='1697' inkscape:snap-global='true' inkscape:window-y='0' gridtolerance='10' inkscape:window-height='1118' inkscape:snap-to-guides='true' inkscape:current-layer='layer12' inkscape:snap-bbox-midpoints='false' inkscape:zoom='32' inkscape:cx='9.864577' inkscape:snap-grids='true' inkscape:pageopacity='1'>
+ <inkscape:grid spacingx='1px' spacingy='1px' id='grid4866' empspacing='2' enabled='true' type='xygrid' snapvisiblegridlinesonly='true' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:label='status' transform='translate(-140.0002,-645.96875)' inkscape:groupmode='layer' id='layer9' style='display:inline'/>
+ <g inkscape:label='devices' transform='translate(-140.0002,-645.96875)' inkscape:groupmode='layer' id='layer10'/>
+ <g inkscape:label='apps' transform='translate(-140.0002,-645.96875)' inkscape:groupmode='layer' id='layer11'/>
+ <g inkscape:label='actions' transform='translate(-140.0002,-645.96875)' inkscape:groupmode='layer' id='layer12'>
+ <path inkscape:connector-curvature='0' d='m 146.50761,646.99554 c -3.02886,0 -5.51073,2.47905 -5.51073,5.50447 0,3.02541 2.48187,5.50446 5.51073,5.50446 3.02885,0 5.51072,-2.47905 5.51072,-5.50446 0,-3.02542 -2.48187,-5.50447 -5.51072,-5.50447 z m 0,2.00893 c 1.94735,0 3.49951,1.55039 3.49951,3.49554 0,1.94514 -1.55216,3.49553 -3.49951,3.49553 -1.94736,0 -3.49952,-1.55039 -3.49952,-3.49553 0,-1.94515 1.55216,-3.49554 3.49952,-3.49554 z' id='path27918' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.55467153;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 149.8125,655 a 1.0001,1.0001 0 0 0 -0.5,1.71875 l 4,4 a 1.0054782,1.0054782 0 1 0 1.40625,-1.4375 l -4,-4 A 1.0001,1.0001 0 0 0 149.8125,655 z' id='path27941' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Sans;-inkscape-font-specification:Sans'/>
+
+ </g>
+ <g inkscape:label='places' transform='translate(-140.0002,-645.96875)' inkscape:groupmode='layer' id='layer13'/>
+ <g inkscape:label='mimetypes' transform='translate(-140.0002,-645.96875)' inkscape:groupmode='layer' id='layer14'/>
+ <g inkscape:label='emblems' transform='translate(-140.0002,-645.96875)' inkscape:groupmode='layer' id='layer15' style='display:inline'/>
+ <g inkscape:label='categories' transform='translate(-140.0002,-645.96875)' inkscape:groupmode='layer' id='g4953' style='display:inline'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/edit-paste-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/edit-paste-symbolic-ref.png
new file mode 100644
index 00000000..0c62d9f3
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/edit-paste-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/edit-paste-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/edit-paste-symbolic.svg
new file mode 100644
index 00000000..4126c7ed
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/edit-paste-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:svg='http://www.w3.org/2000/svg' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' version='1.1' inkscape:version='0.47 r22583' height='16.00297' sodipodi:docname='edit-paste-symbolic.svg' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:cy='204.17377' inkscape:current-layer='layer12' inkscape:window-width='1310' pagecolor='#555753' showborder='false' showguides='true' inkscape:snap-nodes='true' objecttolerance='10' showgrid='false' inkscape:object-nodes='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:window-x='54' inkscape:snap-bbox='true' bordercolor='#666666' id='namedview88' inkscape:window-maximized='0' inkscape:snap-global='true' inkscape:window-y='25' gridtolerance='10' inkscape:zoom='1' inkscape:window-height='690' borderopacity='1' guidetolerance='10' inkscape:cx='296.82494' inkscape:bbox-paths='false' inkscape:snap-grids='true' inkscape:pageopacity='1' inkscape:snap-to-guides='true'>
+ <inkscape:grid visible='true' spacingx='1px' type='xygrid' spacingy='1px' id='grid4866' empspacing='2' enabled='true' snapvisiblegridlinesonly='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g transform='translate(-60,-668)' inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline'/>
+ <g transform='translate(-60,-668)' inkscape:groupmode='layer' id='layer10' inkscape:label='devices'/>
+ <g transform='translate(-60,-668)' inkscape:groupmode='layer' id='layer11' inkscape:label='apps'/>
+ <g transform='translate(-60,-668)' inkscape:groupmode='layer' id='layer12' inkscape:label='actions'>
+
+ <path inkscape:connector-curvature='0' d='m 64.031245,673.03127 0,6.96874 5.000005,0 1.990842,-1.98705 -0.0221,-4.98168 -6.96875,0 3e-6,-1e-5 z' id='rect4897' sodipodi:nodetypes='ccccccc' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+ <rect x='64.999992' y='668' id='rect4899' rx='0.53033006' ry='0.53033006' height='4' width='5.0625052' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+ <path d='m 62.5,669 c -0.293087,0 -0.646731,0.036 -1,0.3125 -0.353269,0.27647 -0.53125,0.76875 -0.53125,1.125 l 0,12.03125 c 0,0.384 0.127689,0.81517 0.4375,1.125 0.285418,0.28544 0.709136,0.38602 1.09375,0.375 l 0,0.0313 0.09375,0 9.875,0 c 0.362847,0 0.759922,-0.12788 1.0625,-0.40625 C 73.833828,683.31538 74,682.88305 74,682.46875 L 74,670.375 c 0,-0.33333 -0.118934,-0.72959 -0.40625,-1 C 73.306434,669.10459 72.924851,669 72.625,669 l -1.65625,0 0,2 1.03125,0 0,11 -9.03125,0 0,-11 0.96875,0 0,-2 -1.4375,0 z' id='path41043' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/>
+ </g>
+ <g transform='translate(-60,-668)' inkscape:groupmode='layer' id='layer13' inkscape:label='places'/>
+ <g transform='translate(-60,-668)' inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes'/>
+ <g transform='translate(-60,-668)' inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/edit-redo-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/edit-redo-symbolic-ref.png
new file mode 100644
index 00000000..ea1bfcd6
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/edit-redo-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/edit-redo-symbolic-rtl-ref.png b/rsvg/tests/fixtures/reftests/adwaita/edit-redo-symbolic-rtl-ref.png
new file mode 100644
index 00000000..44b05d1e
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/edit-redo-symbolic-rtl-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/edit-redo-symbolic-rtl.svg b/rsvg/tests/fixtures/reftests/adwaita/edit-redo-symbolic-rtl.svg
new file mode 100644
index 00000000..c9066a2c
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/edit-redo-symbolic-rtl.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg height='16' version='1.1' inkscape:version='0.48.1 r9760' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='edit-undo-symbolic.svg' xmlns='http://www.w3.org/2000/svg' id='svg7384' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:cc='http://creativecommons.org/ns#' xmlns:svg='http://www.w3.org/2000/svg' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' width='16' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview objecttolerance='10' inkscape:zoom='4' inkscape:snap-bbox='true' inkscape:object-nodes='false' inkscape:object-paths='false' inkscape:snap-global='true' inkscape:snap-grids='true' showgrid='false' showborder='false' inkscape:window-x='2684' inkscape:window-y='355' inkscape:snap-others='false' inkscape:guide-bbox='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' guidetolerance='10' id='namedview88' inkscape:pageshadow='2' inkscape:cx='266.07513' inkscape:cy='49.4033' inkscape:pageopacity='1' inkscape:snap-nodes='true' pagecolor='#555753' inkscape:window-height='967' gridtolerance='10' showguides='true' inkscape:bbox-paths='false' inkscape:snap-bbox-midpoints='false' inkscape:snap-to-guides='true' inkscape:window-width='1226' inkscape:window-maximized='0'>
+ <inkscape:grid snapvisiblegridlinesonly='true' visible='true' type='xygrid' id='grid4866' empspacing='2' enabled='true' spacingx='1px' spacingy='1px'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' transform='translate(-121.00015,-667)' id='layer9' inkscape:label='status' style='display:inline'/>
+ <g inkscape:groupmode='layer' transform='translate(-121.00015,-667)' id='layer10' inkscape:label='devices'/>
+ <g inkscape:groupmode='layer' transform='translate(-121.00015,-667)' id='layer11' inkscape:label='apps'/>
+ <g inkscape:groupmode='layer' transform='translate(-121.00015,-667)' id='layer13' inkscape:label='places'/>
+ <g inkscape:groupmode='layer' transform='translate(-121.00015,-667)' id='layer14' inkscape:label='mimetypes'/>
+ <g inkscape:groupmode='layer' transform='translate(-121.00015,-667)' id='layer15' inkscape:label='emblems' style='display:inline'/>
+ <g inkscape:groupmode='layer' transform='translate(-121.00015,-667)' id='g71291' inkscape:label='emotes' style='display:inline'/>
+ <g inkscape:groupmode='layer' transform='translate(-121.00015,-667)' id='g4953' inkscape:label='categories' style='display:inline'/>
+ <g inkscape:groupmode='layer' transform='translate(-121.00015,-667)' id='layer12' inkscape:label='actions' style='display:inline'>
+
+ <path d='m 125,673 0,2 6.5,0 c 0.84027,0 1.5,0.65973 1.5,1.5 0,0.84027 -0.65973,1.5 -1.5,1.5 l -0.5,0 0,2 0.5,0 c 1.92115,0 3.5,-1.57885 3.5,-3.5 0,-1.92115 -1.57885,-3.5 -3.5,-3.5 l -6.5,0 z' id='path35770-4-9' inkscape:connector-curvature='0' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path sodipodi:nodetypes='ccccccccccccc' d='m 128,670.0221 0,1 c 0,0.25689 -0.12983,0.52846 -0.3125,0.71875 l -2.28125,2.28125 2.28125,2.28125 c 0.18267,0.19029 0.3125,0.46186 0.3125,0.71875 l 0,1 -1,0 c -0.30945,0 -0.55232,-0.0903 -0.75,-0.28125 l -3.65625,-3.71875 3.65625,-3.71875 c 0.19768,-0.19095 0.44055,-0.28125 0.75,-0.28125 z' id='rect3217-6-2-2-4-85-2' inkscape:connector-curvature='0' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/edit-redo-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/edit-redo-symbolic.svg
new file mode 100644
index 00000000..4718db2b
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/edit-redo-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg height='16' version='1.1' inkscape:version='0.48.1 r9760' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='edit-redo-symbolic.svg' xmlns='http://www.w3.org/2000/svg' id='svg7384' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:cc='http://creativecommons.org/ns#' xmlns:svg='http://www.w3.org/2000/svg' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' width='16' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview objecttolerance='10' inkscape:zoom='4' inkscape:snap-bbox='true' inkscape:object-nodes='false' inkscape:object-paths='false' inkscape:snap-global='true' inkscape:snap-grids='true' showgrid='false' showborder='false' inkscape:window-x='2684' inkscape:window-y='355' inkscape:snap-others='false' inkscape:guide-bbox='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' guidetolerance='10' id='namedview88' inkscape:pageshadow='2' inkscape:cx='246.07513' inkscape:cy='49.4033' inkscape:pageopacity='1' inkscape:snap-nodes='true' pagecolor='#555753' inkscape:window-height='967' gridtolerance='10' showguides='true' inkscape:bbox-paths='false' inkscape:snap-bbox-midpoints='false' inkscape:snap-to-guides='true' inkscape:window-width='1226' inkscape:window-maximized='0'>
+ <inkscape:grid snapvisiblegridlinesonly='true' visible='true' type='xygrid' id='grid4866' empspacing='2' enabled='true' spacingx='1px' spacingy='1px'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' transform='translate(-141.00015,-667)' id='layer9' inkscape:label='status' style='display:inline'/>
+ <g inkscape:groupmode='layer' transform='translate(-141.00015,-667)' id='layer10' inkscape:label='devices'/>
+ <g inkscape:groupmode='layer' transform='translate(-141.00015,-667)' id='layer11' inkscape:label='apps'/>
+ <g inkscape:groupmode='layer' transform='translate(-141.00015,-667)' id='layer13' inkscape:label='places'/>
+ <g inkscape:groupmode='layer' transform='translate(-141.00015,-667)' id='layer14' inkscape:label='mimetypes'/>
+ <g inkscape:groupmode='layer' transform='translate(-141.00015,-667)' id='layer15' inkscape:label='emblems' style='display:inline'/>
+ <g inkscape:groupmode='layer' transform='translate(-141.00015,-667)' id='g71291' inkscape:label='emotes' style='display:inline'/>
+ <g inkscape:groupmode='layer' transform='translate(-141.00015,-667)' id='g4953' inkscape:label='categories' style='display:inline'/>
+ <g inkscape:groupmode='layer' transform='translate(-141.00015,-667)' id='layer12' inkscape:label='actions' style='display:inline'>
+
+ <path d='m 146.5,673 c -1.92115,0 -3.5,1.57885 -3.5,3.5 0,1.92115 1.57885,3.5 3.5,3.5 l 0.5,0 0,-2 -0.5,0 c -0.84027,0 -1.5,-0.65973 -1.5,-1.5 0,-0.84027 0.65973,-1.5 1.5,-1.5 l 6.5,0 0,-2 -6.5,0 z' id='path35770-4-9-4' inkscape:connector-curvature='0' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path sodipodi:nodetypes='ccccccccccccc' d='m 150.0002,670 0,1 c 0,0.25689 0.12983,0.52846 0.3125,0.71875 l 2.28125,2.28125 -2.28125,2.28125 c -0.18267,0.19029 -0.3125,0.46186 -0.3125,0.71875 l 0,1 1,0 c 0.30945,0 0.55232,-0.0903 0.75,-0.28125 L 155.40645,674 151.7502,670.28125 C 151.55252,670.0903 151.30965,670 151.0002,670 z' id='rect3217-6-2-2-4-85' inkscape:connector-curvature='0' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/edit-select-all-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/edit-select-all-symbolic-ref.png
new file mode 100644
index 00000000..4642768b
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/edit-select-all-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/edit-select-all-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/edit-select-all-symbolic.svg
new file mode 100644
index 00000000..5fd662a0
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/edit-select-all-symbolic.svg
@@ -0,0 +1,57 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='edit-select-all-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='15.973852' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.91 r13725' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='6.1436034' inkscape:cy='7.3087922' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='0' inkscape:window-width='2507' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='5.6568542'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-40' originy='549.97385' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-281.0002,-767)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-281.0002,-767)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-281.0002,-767)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-281.0002,-767)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-281.0002,-767)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-281.0002,-767)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-281.0002,-767)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-281.0002,-767)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-281.0002,-767)'>
+
+ <rect height='1' id='rect9818' style='color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate' width='1' x='282.00021' y='768'/>
+ <rect height='1' id='rect9820' style='color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate' width='1' x='284.00021' y='768'/>
+ <rect height='1' id='rect9822' style='color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate' width='1' x='286.00021' y='768'/>
+ <rect height='1' id='rect9824' style='color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate' width='1' x='288.00021' y='768'/>
+ <rect height='1' id='rect9826' style='color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate' width='1' x='290.00021' y='768'/>
+ <rect height='1' id='rect9828' style='color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate' width='1' x='292.00021' y='768'/>
+ <rect height='1' id='rect9830' style='color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate' width='1' x='294.00021' y='768'/>
+ <rect height='1' id='rect9832' style='color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate' width='1' x='294.00021' y='770'/>
+ <rect height='1' id='rect9834' style='color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate' width='1' x='294.00021' y='772'/>
+ <rect height='1' id='rect9836' style='color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate' width='1' x='294.00021' y='774'/>
+ <rect height='1' id='rect9838' style='color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate' width='1' x='294.00021' y='776'/>
+ <rect height='1' id='rect9840' style='color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate' width='1' x='294.00021' y='778'/>
+ <rect height='1' id='rect9842' style='color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate' width='1' x='294.00021' y='780'/>
+ <rect height='1' id='rect9844' style='color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate' width='1' x='292.00021' y='780'/>
+ <rect height='1' id='rect9846' style='color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate' width='1' x='290.00021' y='780'/>
+ <rect height='1' id='rect9848' style='color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate' width='1' x='288.00021' y='780'/>
+ <rect height='1' id='rect9850' style='color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate' width='1' x='286.00021' y='780'/>
+ <rect height='1' id='rect9852' style='color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate' width='1' x='284.00021' y='780'/>
+ <rect height='1' id='rect9854' style='color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate' width='1' x='282.00021' y='780'/>
+ <rect height='1' id='rect9856' style='color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate' width='1' x='282.00021' y='778'/>
+ <rect height='1' id='rect9858' style='color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate' width='1' x='282.00021' y='776'/>
+ <rect height='1' id='rect9860' style='color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate' width='1' x='282.00021' y='774'/>
+ <rect height='1' id='rect9862' style='color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate' width='1' x='282.00021' y='772'/>
+ <rect height='1' id='rect9864' style='color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate' width='1' x='282.00021' y='770'/>
+ <rect height='3.9999998' id='rect9866' style='color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate' width='3.9999998' x='284.00021' y='775.10443'/>
+ <rect height='3.9999998' id='rect9868' style='color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate' width='3.9999998' x='289.00021' y='775.10443'/>
+ <rect height='3.9999998' id='rect9870' style='color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate' width='9' x='284.00021' y='770'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/edit-select-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/edit-select-symbolic-ref.png
new file mode 100644
index 00000000..a177c17c
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/edit-select-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/edit-select-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/edit-select-symbolic.svg
new file mode 100644
index 00000000..9c297543
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/edit-select-symbolic.svg
@@ -0,0 +1,33 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='edit-select-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.4 r9939' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='140.6001' inkscape:cy='565.11648' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='702' inkscape:window-maximized='1' inkscape:window-width='1366' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='200px' originy='670px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ <inkscape:grid color='#000000' empcolor='#000000' empopacity='0' empspacing='4' enabled='true' id='grid5968' opacity='0.1254902' originx='200px' originy='670px' snapvisiblegridlinesonly='true' spacingx='0.5px' spacingy='0.5px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-41.0002,-887)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-41.0002,-887)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-41.0002,-887)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-41.0002,-887)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-41.0002,-887)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-41.0002,-887)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-41.0002,-887)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-41.0002,-887)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-41.0002,-887)'>
+
+ <path inkscape:connector-curvature='0' d='m 43.000002,892 0,1 c 0,0.25689 0.12983,0.52846 0.3125,0.71875 l 1.28125,1.28125 -1.28125,1.28125 c -0.18267,0.19029 -0.3125,0.46186 -0.3125,0.71875 l 0,1 1,0 c 0.30945,0 0.55232,-0.0903 0.75,-0.28125 L 47.406252,895 44.750002,892.28125 C 44.552322,892.0903 44.309452,892 44.000002,892 l -1,0 z' id='path8864' sodipodi:nodetypes='ccccccccccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/>
+ <path inkscape:connector-curvature='0' d='m 55.000202,892 0,1 c 0,0.25689 -0.12983,0.52846 -0.3125,0.71875 L 53.406452,895 l 1.28125,1.28125 c 0.18267,0.19029 0.3125,0.46186 0.3125,0.71875 l 0,1 -1,0 c -0.30945,0 -0.55232,-0.0903 -0.75,-0.28125 L 50.593952,895 l 2.65625,-2.71875 C 53.447882,892.0903 53.690752,892 54.000202,892 l 1,0 z' id='path8866' sodipodi:nodetypes='ccccccccccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/edit-undo-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/edit-undo-symbolic-ref.png
new file mode 100644
index 00000000..44b05d1e
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/edit-undo-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/edit-undo-symbolic-rtl-ref.png b/rsvg/tests/fixtures/reftests/adwaita/edit-undo-symbolic-rtl-ref.png
new file mode 100644
index 00000000..ea1bfcd6
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/edit-undo-symbolic-rtl-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/edit-undo-symbolic-rtl.svg b/rsvg/tests/fixtures/reftests/adwaita/edit-undo-symbolic-rtl.svg
new file mode 100644
index 00000000..4718db2b
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/edit-undo-symbolic-rtl.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg height='16' version='1.1' inkscape:version='0.48.1 r9760' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='edit-redo-symbolic.svg' xmlns='http://www.w3.org/2000/svg' id='svg7384' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:cc='http://creativecommons.org/ns#' xmlns:svg='http://www.w3.org/2000/svg' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' width='16' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview objecttolerance='10' inkscape:zoom='4' inkscape:snap-bbox='true' inkscape:object-nodes='false' inkscape:object-paths='false' inkscape:snap-global='true' inkscape:snap-grids='true' showgrid='false' showborder='false' inkscape:window-x='2684' inkscape:window-y='355' inkscape:snap-others='false' inkscape:guide-bbox='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' guidetolerance='10' id='namedview88' inkscape:pageshadow='2' inkscape:cx='246.07513' inkscape:cy='49.4033' inkscape:pageopacity='1' inkscape:snap-nodes='true' pagecolor='#555753' inkscape:window-height='967' gridtolerance='10' showguides='true' inkscape:bbox-paths='false' inkscape:snap-bbox-midpoints='false' inkscape:snap-to-guides='true' inkscape:window-width='1226' inkscape:window-maximized='0'>
+ <inkscape:grid snapvisiblegridlinesonly='true' visible='true' type='xygrid' id='grid4866' empspacing='2' enabled='true' spacingx='1px' spacingy='1px'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' transform='translate(-141.00015,-667)' id='layer9' inkscape:label='status' style='display:inline'/>
+ <g inkscape:groupmode='layer' transform='translate(-141.00015,-667)' id='layer10' inkscape:label='devices'/>
+ <g inkscape:groupmode='layer' transform='translate(-141.00015,-667)' id='layer11' inkscape:label='apps'/>
+ <g inkscape:groupmode='layer' transform='translate(-141.00015,-667)' id='layer13' inkscape:label='places'/>
+ <g inkscape:groupmode='layer' transform='translate(-141.00015,-667)' id='layer14' inkscape:label='mimetypes'/>
+ <g inkscape:groupmode='layer' transform='translate(-141.00015,-667)' id='layer15' inkscape:label='emblems' style='display:inline'/>
+ <g inkscape:groupmode='layer' transform='translate(-141.00015,-667)' id='g71291' inkscape:label='emotes' style='display:inline'/>
+ <g inkscape:groupmode='layer' transform='translate(-141.00015,-667)' id='g4953' inkscape:label='categories' style='display:inline'/>
+ <g inkscape:groupmode='layer' transform='translate(-141.00015,-667)' id='layer12' inkscape:label='actions' style='display:inline'>
+
+ <path d='m 146.5,673 c -1.92115,0 -3.5,1.57885 -3.5,3.5 0,1.92115 1.57885,3.5 3.5,3.5 l 0.5,0 0,-2 -0.5,0 c -0.84027,0 -1.5,-0.65973 -1.5,-1.5 0,-0.84027 0.65973,-1.5 1.5,-1.5 l 6.5,0 0,-2 -6.5,0 z' id='path35770-4-9-4' inkscape:connector-curvature='0' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path sodipodi:nodetypes='ccccccccccccc' d='m 150.0002,670 0,1 c 0,0.25689 0.12983,0.52846 0.3125,0.71875 l 2.28125,2.28125 -2.28125,2.28125 c -0.18267,0.19029 -0.3125,0.46186 -0.3125,0.71875 l 0,1 1,0 c 0.30945,0 0.55232,-0.0903 0.75,-0.28125 L 155.40645,674 151.7502,670.28125 C 151.55252,670.0903 151.30965,670 151.0002,670 z' id='rect3217-6-2-2-4-85' inkscape:connector-curvature='0' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/edit-undo-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/edit-undo-symbolic.svg
new file mode 100644
index 00000000..c9066a2c
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/edit-undo-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg height='16' version='1.1' inkscape:version='0.48.1 r9760' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='edit-undo-symbolic.svg' xmlns='http://www.w3.org/2000/svg' id='svg7384' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:cc='http://creativecommons.org/ns#' xmlns:svg='http://www.w3.org/2000/svg' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' width='16' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview objecttolerance='10' inkscape:zoom='4' inkscape:snap-bbox='true' inkscape:object-nodes='false' inkscape:object-paths='false' inkscape:snap-global='true' inkscape:snap-grids='true' showgrid='false' showborder='false' inkscape:window-x='2684' inkscape:window-y='355' inkscape:snap-others='false' inkscape:guide-bbox='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' guidetolerance='10' id='namedview88' inkscape:pageshadow='2' inkscape:cx='266.07513' inkscape:cy='49.4033' inkscape:pageopacity='1' inkscape:snap-nodes='true' pagecolor='#555753' inkscape:window-height='967' gridtolerance='10' showguides='true' inkscape:bbox-paths='false' inkscape:snap-bbox-midpoints='false' inkscape:snap-to-guides='true' inkscape:window-width='1226' inkscape:window-maximized='0'>
+ <inkscape:grid snapvisiblegridlinesonly='true' visible='true' type='xygrid' id='grid4866' empspacing='2' enabled='true' spacingx='1px' spacingy='1px'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' transform='translate(-121.00015,-667)' id='layer9' inkscape:label='status' style='display:inline'/>
+ <g inkscape:groupmode='layer' transform='translate(-121.00015,-667)' id='layer10' inkscape:label='devices'/>
+ <g inkscape:groupmode='layer' transform='translate(-121.00015,-667)' id='layer11' inkscape:label='apps'/>
+ <g inkscape:groupmode='layer' transform='translate(-121.00015,-667)' id='layer13' inkscape:label='places'/>
+ <g inkscape:groupmode='layer' transform='translate(-121.00015,-667)' id='layer14' inkscape:label='mimetypes'/>
+ <g inkscape:groupmode='layer' transform='translate(-121.00015,-667)' id='layer15' inkscape:label='emblems' style='display:inline'/>
+ <g inkscape:groupmode='layer' transform='translate(-121.00015,-667)' id='g71291' inkscape:label='emotes' style='display:inline'/>
+ <g inkscape:groupmode='layer' transform='translate(-121.00015,-667)' id='g4953' inkscape:label='categories' style='display:inline'/>
+ <g inkscape:groupmode='layer' transform='translate(-121.00015,-667)' id='layer12' inkscape:label='actions' style='display:inline'>
+
+ <path d='m 125,673 0,2 6.5,0 c 0.84027,0 1.5,0.65973 1.5,1.5 0,0.84027 -0.65973,1.5 -1.5,1.5 l -0.5,0 0,2 0.5,0 c 1.92115,0 3.5,-1.57885 3.5,-3.5 0,-1.92115 -1.57885,-3.5 -3.5,-3.5 l -6.5,0 z' id='path35770-4-9' inkscape:connector-curvature='0' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path sodipodi:nodetypes='ccccccccccccc' d='m 128,670.0221 0,1 c 0,0.25689 -0.12983,0.52846 -0.3125,0.71875 l -2.28125,2.28125 2.28125,2.28125 c 0.18267,0.19029 0.3125,0.46186 0.3125,0.71875 l 0,1 -1,0 c -0.30945,0 -0.55232,-0.0903 -0.75,-0.28125 l -3.65625,-3.71875 3.65625,-3.71875 c 0.19768,-0.19095 0.44055,-0.28125 0.75,-0.28125 z' id='rect3217-6-2-2-4-85-2' inkscape:connector-curvature='0' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/emblem-default-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/emblem-default-symbolic-ref.png
new file mode 100644
index 00000000..f77d074c
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/emblem-default-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/emblem-default-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/emblem-default-symbolic.svg
new file mode 100644
index 00000000..e387ae6a
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/emblem-default-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:svg='http://www.w3.org/2000/svg' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' sodipodi:docname='emblem-default-symbolic.svg' version='1.1' inkscape:version='0.48+devel r10008 custom' height='16' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:cy='6.8225906' pagecolor='#555753' borderopacity='1' showborder='false' inkscape:bbox-paths='false' guidetolerance='10' inkscape:object-paths='true' inkscape:window-width='1145' showguides='true' inkscape:object-nodes='true' inkscape:snap-bbox='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:snap-nodes='false' bordercolor='#666666' objecttolerance='10' id='namedview88' showgrid='false' inkscape:window-maximized='0' inkscape:window-x='201' inkscape:snap-global='true' inkscape:window-y='17' gridtolerance='10' inkscape:window-height='1115' inkscape:snap-to-guides='true' inkscape:current-layer='layer15' inkscape:snap-bbox-midpoints='false' inkscape:zoom='1' inkscape:cx='8.2954357' inkscape:snap-grids='true' inkscape:pageopacity='1'>
+ <inkscape:grid spacingx='1px' spacingy='1px' id='grid4866' empspacing='2' enabled='true' type='xygrid' snapvisiblegridlinesonly='true' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:label='status' transform='translate(-482,-381.99998)' inkscape:groupmode='layer' id='layer9' style='display:inline'/>
+ <g inkscape:label='devices' transform='translate(-482,-381.99998)' inkscape:groupmode='layer' id='layer10'/>
+ <g inkscape:label='apps' transform='translate(-482,-381.99998)' inkscape:groupmode='layer' id='layer11'/>
+ <g inkscape:label='actions' transform='translate(-482,-381.99998)' inkscape:groupmode='layer' id='layer12'/>
+ <g inkscape:label='places' transform='translate(-482,-381.99998)' inkscape:groupmode='layer' id='layer13'/>
+ <g inkscape:label='mimetypes' transform='translate(-482,-381.99998)' inkscape:groupmode='layer' id='layer14'/>
+ <g inkscape:label='emblems' transform='translate(-482,-381.99998)' inkscape:groupmode='layer' id='layer15' style='display:inline'>
+ <g inkscape:label='emblem-important' transform='translate(135.8093,-581.17812)' id='g17779'>
+
+ </g>
+ <path inkscape:connector-curvature='0' d='m 490.03562,383 c -3.83886,0 -6.94167,3.1349 -6.94167,7 0,3.8651 3.10281,7 6.94167,7 3.83885,0 6.97083,-3.1349 6.97083,-7 0,-0.38885 -0.0561,-0.76591 -0.11667,-1.1375 l -6.43347,5.76353 -4.05327,-4.05506 2.12561,-2.08587 1.92855,2.05936 5.06175,-4.86113 C 494.24667,384.04651 492.26001,383 490.03562,383 z' id='path74' sodipodi:nodetypes='ssssccccccs' style='fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;display:inline'/>
+ </g>
+ <g inkscape:label='categories' transform='translate(-482,-381.99998)' inkscape:groupmode='layer' id='g4953' style='display:inline'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/emblem-documents-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/emblem-documents-symbolic-ref.png
new file mode 100644
index 00000000..61f4c3dc
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/emblem-documents-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/emblem-documents-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/emblem-documents-symbolic.svg
new file mode 100644
index 00000000..3ccc653b
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/emblem-documents-symbolic.svg
@@ -0,0 +1,36 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:svg='http://www.w3.org/2000/svg' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' sodipodi:docname='emblem-documents-symbolic.svg' version='1.1' inkscape:version='0.48.1 r9760' height='16.000019' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16.000004'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:cy='8.01412' pagecolor='#555753' borderopacity='1' showborder='false' inkscape:bbox-paths='false' guidetolerance='10' inkscape:object-paths='true' inkscape:window-width='1239' showguides='true' inkscape:object-nodes='true' inkscape:snap-bbox='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:snap-nodes='true' bordercolor='#666666' objecttolerance='10' id='namedview88' showgrid='false' inkscape:window-maximized='0' inkscape:window-x='125' inkscape:snap-global='true' inkscape:window-y='26' gridtolerance='10' inkscape:window-height='708' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:current-layer='layer15' inkscape:snap-bbox-midpoints='false' inkscape:zoom='1' inkscape:cx='33.02647' inkscape:snap-grids='true' inkscape:pageopacity='1'>
+ <inkscape:grid spacingx='1px' spacingy='1px' id='grid4866' empspacing='2' enabled='true' type='xygrid' snapvisiblegridlinesonly='true' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:label='status' transform='translate(-542,-381.99998)' inkscape:groupmode='layer' id='layer9' style='display:inline'/>
+ <g inkscape:label='devices' transform='translate(-542,-381.99998)' inkscape:groupmode='layer' id='layer10'/>
+ <g inkscape:label='apps' transform='translate(-542,-381.99998)' inkscape:groupmode='layer' id='layer11'/>
+ <g inkscape:label='places' transform='translate(-542,-381.99998)' inkscape:groupmode='layer' id='layer13'/>
+ <g inkscape:label='mimetypes' transform='translate(-542,-381.99998)' inkscape:groupmode='layer' id='layer14'/>
+ <g inkscape:label='emblems' transform='translate(-542,-381.99998)' inkscape:groupmode='layer' id='layer15' style='display:inline'>
+
+ <path inkscape:connector-curvature='0' d='m 544,382 c -1.0907,0 -2,0.9093 -2,2 l 0,9 c 0,1.0907 0.9093,2 2,2 l 7,0 c 1.0907,0 2,-0.9093 2,-2 l 0,-9 c 0,-1.0907 -0.9093,-2 -2,-2 l -7,0 z m 0,2 7,0 0,9 -7,0 0,-9 z' id='rect4513' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.50793636;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 554.0002,385 0,2 1,0 0,9 -3,0 -4,0 -2,0 c 0,1.0907 0.9093,2 2,2 l 7,0 c 1.0907,0 2,-0.9093 2,-2 l 0,-9 c 0,-1.0907 -0.9093,-2 -2,-2 z' id='rect4513-9' sodipodi:nodetypes='cccccccsssssc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.50793636;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <rect x='545.00018' y='385' id='rect5313' rx='0.5' height='1' ry='0.5' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.50793636;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' width='4'/>
+ <rect x='545.00018' y='387' id='rect5313-6' rx='0.5' height='1' ry='0.5' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.50793636;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' width='5'/>
+ <rect x='545.00018' y='389' id='rect5313-6-0' rx='0.5' height='1' ry='0.5' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.50793636;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' width='3.0000169'/>
+ <rect x='545.00018' y='391' id='rect5313-6-0-8' rx='0.5' height='1' ry='0.5' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.50793636;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' width='5'/>
+ </g>
+ <g inkscape:label='emotes' transform='translate(-542,-381.99998)' inkscape:groupmode='layer' id='g71291' style='display:inline'/>
+ <g inkscape:label='categories' transform='translate(-542,-381.99998)' inkscape:groupmode='layer' id='g4953' style='display:inline'/>
+ <g inkscape:label='actions' transform='translate(-542,-381.99998)' inkscape:groupmode='layer' id='layer12' style='display:inline'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/emblem-favorite-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/emblem-favorite-symbolic-ref.png
new file mode 100644
index 00000000..ecd154de
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/emblem-favorite-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/emblem-favorite-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/emblem-favorite-symbolic.svg
new file mode 100644
index 00000000..1054a13d
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/emblem-favorite-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='emblem-favorite-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.4 r9939' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer15' inkscape:cx='-168.7162' inkscape:cy='-257.9103' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='702' inkscape:window-maximized='1' inkscape:window-width='1366' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='-200.00001px' originy='164px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ <inkscape:grid color='#000000' empcolor='#000000' empopacity='0' empspacing='4' enabled='true' id='grid5968' opacity='0.1254902' originx='-200.00001px' originy='164px' snapvisiblegridlinesonly='true' spacingx='0.5px' spacingy='0.5px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-441.00021,-381)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-441.00021,-381)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-441.00021,-381)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-441.00021,-381)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-441.00021,-381)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-441.00021,-381)'>
+
+ <path inkscape:connector-curvature='0' d='m 456.0002,386.76617 c 0,-2.07495 -1.68742,-3.75698 -3.76925,-3.75698 -1.37132,0 -2.57123,0.73006 -3.23065,1.8214 -0.65942,-1.09135 -1.85953,-1.8214 -3.23085,-1.8214 -2.08183,0 -3.76925,1.68203 -3.76925,3.75698 0,1.07968 0.45777,2.05239 1.18953,2.73766 l -10e-4,0 5.72506,5.49617 5.89867,-5.49617 -0.002,0 c 0.73186,-0.68517 1.18933,-1.65788 1.18933,-2.73766' id='path4' sodipodi:nodetypes='cscsscccccc' style='fill:#bebebe;fill-opacity:1;stroke:none;display:inline;enable-background:new'/>
+ </g>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-441.00021,-381)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-441.00021,-381)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-441.00021,-381)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/emblem-important-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/emblem-important-symbolic-ref.png
new file mode 100644
index 00000000..81a8cd91
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/emblem-important-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/emblem-important-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/emblem-important-symbolic.svg
new file mode 100644
index 00000000..d8123ab8
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/emblem-important-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:svg='http://www.w3.org/2000/svg' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' sodipodi:docname='emblem-important-symbolic.svg' version='1.1' inkscape:version='0.48pre1 r9509' height='16' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:cy='-146.05202' pagecolor='#555753' borderopacity='1' showborder='false' inkscape:bbox-paths='false' guidetolerance='10' inkscape:window-width='1310' showguides='true' inkscape:object-nodes='true' inkscape:snap-bbox='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:snap-nodes='true' bordercolor='#666666' objecttolerance='10' id='namedview88' showgrid='false' inkscape:window-maximized='0' inkscape:window-x='54' inkscape:snap-global='true' inkscape:window-y='24' gridtolerance='10' inkscape:window-height='690' inkscape:snap-to-guides='true' inkscape:current-layer='layer15' inkscape:zoom='1' inkscape:cx='-349.84279' inkscape:snap-grids='true' inkscape:pageopacity='1'>
+ <inkscape:grid spacingx='1px' spacingy='1px' id='grid4866' empspacing='2' enabled='true' type='xygrid' snapvisiblegridlinesonly='true' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:label='status' transform='translate(-462,-381.99998)' inkscape:groupmode='layer' id='layer9' style='display:inline'/>
+ <g inkscape:label='devices' transform='translate(-462,-381.99998)' inkscape:groupmode='layer' id='layer10'/>
+ <g inkscape:label='apps' transform='translate(-462,-381.99998)' inkscape:groupmode='layer' id='layer11'/>
+ <g inkscape:label='actions' transform='translate(-462,-381.99998)' inkscape:groupmode='layer' id='layer12'/>
+ <g inkscape:label='places' transform='translate(-462,-381.99998)' inkscape:groupmode='layer' id='layer13'/>
+ <g inkscape:label='mimetypes' transform='translate(-462,-381.99998)' inkscape:groupmode='layer' id='layer14'/>
+ <g inkscape:label='emblems' transform='translate(-462,-381.99998)' inkscape:groupmode='layer' id='layer15' style='display:inline'>
+ <g inkscape:label='emblem-important' transform='translate(115.8093,-581.17812)' id='g35541'>
+ <path transform='translate(284.1907,141.17812)' inkscape:connector-curvature='0' d='m 70,823 c -3.86599,0 -7,3.13401 -7,7 0,3.86599 3.13401,7 7,7 3.86599,0 7,-3.13401 7,-7 0,-3.86599 -3.13401,-7 -7,-7 z m -0.09375,1.96875 A 1.0001,1.0001 0 0 1 71,826 l 0,5 a 1.0001,1.0001 0 1 1 -2,0 l 0,-5 a 1.0001,1.0001 0 0 1 0.78125,-1 1.0001,1.0001 0 0 1 0.125,-0.0313 z M 70,833 c 0.552285,0 1,0.44772 1,1 0,0.55228 -0.447715,1 -1,1 -0.552285,0 -1,-0.44772 -1,-1 0,-0.55228 0.447715,-1 1,-1 z' id='path35543' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+
+ </g>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/emblem-music-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/emblem-music-symbolic-ref.png
new file mode 100644
index 00000000..af0e265a
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/emblem-music-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/emblem-music-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/emblem-music-symbolic.svg
new file mode 100644
index 00000000..b0fdd595
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/emblem-music-symbolic.svg
@@ -0,0 +1,35 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:svg='http://www.w3.org/2000/svg' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' sodipodi:docname='emblem-music-symbolic.svg' version='1.1' inkscape:version='0.48.1 r9760' height='16' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:cy='8.0141006' pagecolor='#555753' borderopacity='1' showborder='false' inkscape:bbox-paths='false' guidetolerance='10' inkscape:object-paths='true' inkscape:window-width='1239' showguides='true' inkscape:object-nodes='true' inkscape:snap-bbox='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:snap-nodes='true' bordercolor='#666666' objecttolerance='10' id='namedview88' showgrid='false' inkscape:window-maximized='0' inkscape:window-x='125' inkscape:snap-global='true' inkscape:window-y='26' gridtolerance='10' inkscape:window-height='708' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:current-layer='layer15' inkscape:snap-bbox-midpoints='false' inkscape:zoom='1' inkscape:cx='-6.9735343' inkscape:snap-grids='true' inkscape:pageopacity='1'>
+ <inkscape:grid spacingx='1px' spacingy='1px' id='grid4866' empspacing='2' enabled='true' type='xygrid' snapvisiblegridlinesonly='true' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:label='status' transform='translate(-582,-381.99998)' inkscape:groupmode='layer' id='layer9' style='display:inline'/>
+ <g inkscape:label='devices' transform='translate(-582,-381.99998)' inkscape:groupmode='layer' id='layer10'/>
+ <g inkscape:label='apps' transform='translate(-582,-381.99998)' inkscape:groupmode='layer' id='layer11'/>
+ <g inkscape:label='places' transform='translate(-582,-381.99998)' inkscape:groupmode='layer' id='layer13'/>
+ <g inkscape:label='mimetypes' transform='translate(-582,-381.99998)' inkscape:groupmode='layer' id='layer14'/>
+ <g inkscape:label='emblems' transform='translate(-582,-381.99998)' inkscape:groupmode='layer' id='layer15' style='display:inline'>
+
+ <path inkscape:connector-curvature='0' d='m 585.50413,390.01363 c -1.92115,0 -3.50339,1.5501 -3.50339,3.47125 0,1.92115 1.58224,3.50339 3.50339,3.50339 1.92115,0 3.50339,-1.58224 3.50339,-3.50339 0,-1.92115 -1.58224,-3.47125 -3.50339,-3.47125 z m 0,1.99275 c 0.84027,0 1.51064,0.63823 1.51064,1.4785 0,0.84027 -0.67037,1.51063 -1.51064,1.51063 -0.84027,0 -1.51064,-0.67036 -1.51064,-1.51063 0,-0.84027 0.67037,-1.4785 1.51064,-1.4785 z' id='path6170' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.94454503;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 593.50413,390.01363 c -1.92115,0 -3.50339,1.5501 -3.50339,3.47125 0,1.92115 1.58224,3.50339 3.50339,3.50339 1.92115,0 3.50339,-1.58224 3.50339,-3.50339 0,-1.92115 -1.58224,-3.47125 -3.50339,-3.47125 z m 0,1.99275 c 0.84027,0 1.51064,0.63823 1.51064,1.4785 0,0.84027 -0.67037,1.51063 -1.51064,1.51063 -0.84027,0 -1.51064,-0.67036 -1.51064,-1.51063 0,-0.84027 0.67037,-1.4785 1.51064,-1.4785 z' id='path6170-5' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.94454503;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <rect x='587.00018' y='384' id='rect6190' height='9.515729' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.50793636;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' width='2.0000219'/>
+ <rect x='595.00018' y='384' id='rect6190-8' height='9.5626974' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.50793636;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' width='2.0000412'/>
+ <rect x='587.00018' y='384' id='rect6190-8-8' height='2' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.50793636;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' width='10.000017'/>
+ </g>
+ <g inkscape:label='emotes' transform='translate(-582,-381.99998)' inkscape:groupmode='layer' id='g71291' style='display:inline'/>
+ <g inkscape:label='categories' transform='translate(-582,-381.99998)' inkscape:groupmode='layer' id='g4953' style='display:inline'/>
+ <g inkscape:label='actions' transform='translate(-582,-381.99998)' inkscape:groupmode='layer' id='layer12' style='display:inline'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/emblem-ok-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/emblem-ok-symbolic-ref.png
new file mode 100644
index 00000000..b3dd9994
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/emblem-ok-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/emblem-ok-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/emblem-ok-symbolic.svg
new file mode 100644
index 00000000..6e81d498
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/emblem-ok-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='emblem-ok-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.2 r9819' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-paths='false' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer15' inkscape:cx='13.231752' inkscape:cy='13.99294' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#555753' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1168' inkscape:window-maximized='1' inkscape:window-width='1600' inkscape:window-x='0' inkscape:window-y='0' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-461.0002,-401)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-461.0002,-401)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-461.0002,-401)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-461.0002,-401)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-461.0002,-401)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-461.0002,-401)'>
+ <path inkscape:connector-curvature='0' d='M 472.9375,404.9375 468,409.875 l -1.9375,-1.9375 -2.125,2.125 3,3 1.0625,1.0625 1.0625,-1.0625 6,-6 -2.125,-2.125 z' id='path5037' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+
+ </g>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-461.0002,-401)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-461.0002,-401)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-461.0002,-401)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/emblem-photos-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/emblem-photos-symbolic-ref.png
new file mode 100644
index 00000000..f799559b
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/emblem-photos-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/emblem-photos-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/emblem-photos-symbolic.svg
new file mode 100644
index 00000000..43b38cb8
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/emblem-photos-symbolic.svg
@@ -0,0 +1,33 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:svg='http://www.w3.org/2000/svg' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' sodipodi:docname='emblem-photos-symbolic.svg' version='1.1' inkscape:version='0.48.1 r9760' height='16' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16.0002'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:cy='8.0141006' pagecolor='#555753' borderopacity='1' showborder='false' inkscape:bbox-paths='false' guidetolerance='10' inkscape:object-paths='true' inkscape:window-width='1239' showguides='true' inkscape:object-nodes='true' inkscape:snap-bbox='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:snap-nodes='true' bordercolor='#666666' objecttolerance='10' id='namedview88' showgrid='false' inkscape:window-maximized='0' inkscape:window-x='125' inkscape:snap-global='true' inkscape:window-y='26' gridtolerance='10' inkscape:window-height='708' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:current-layer='layer15' inkscape:snap-bbox-midpoints='false' inkscape:zoom='1' inkscape:cx='-26.97353' inkscape:snap-grids='true' inkscape:pageopacity='1'>
+ <inkscape:grid spacingx='1px' spacingy='1px' id='grid4866' empspacing='2' enabled='true' type='xygrid' snapvisiblegridlinesonly='true' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:label='status' transform='translate(-602,-381.99998)' inkscape:groupmode='layer' id='layer9' style='display:inline'/>
+ <g inkscape:label='devices' transform='translate(-602,-381.99998)' inkscape:groupmode='layer' id='layer10'/>
+ <g inkscape:label='apps' transform='translate(-602,-381.99998)' inkscape:groupmode='layer' id='layer11'/>
+ <g inkscape:label='places' transform='translate(-602,-381.99998)' inkscape:groupmode='layer' id='layer13'/>
+ <g inkscape:label='mimetypes' transform='translate(-602,-381.99998)' inkscape:groupmode='layer' id='layer14'/>
+ <g inkscape:label='emblems' transform='translate(-602,-381.99998)' inkscape:groupmode='layer' id='layer15' style='display:inline'>
+
+ <path inkscape:connector-curvature='0' d='m 615.0002,387 0,2 1,0 0,5 -10,0 0,2 12,0 0,-9 z' id='rect6307-1' sodipodi:nodetypes='ccccccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 602,384 0,9 12,0 0,-9 z m 2,2 8,0 0,5 -8,0 z' id='rect6307' sodipodi:nodetypes='cccccccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 605.0002,389 c 2.32075,1 3.04463,-1.65963 6,0 l 0,1 -6,0 z' id='rect6402' sodipodi:nodetypes='ccccc' style='opacity:0.35;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new'/>
+ </g>
+ <g inkscape:label='emotes' transform='translate(-602,-381.99998)' inkscape:groupmode='layer' id='g71291' style='display:inline'/>
+ <g inkscape:label='categories' transform='translate(-602,-381.99998)' inkscape:groupmode='layer' id='g4953' style='display:inline'/>
+ <g inkscape:label='actions' transform='translate(-602,-381.99998)' inkscape:groupmode='layer' id='layer12' style='display:inline'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/emblem-shared-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/emblem-shared-symbolic-ref.png
new file mode 100644
index 00000000..0f6c0bdc
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/emblem-shared-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/emblem-shared-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/emblem-shared-symbolic.svg
new file mode 100644
index 00000000..c062aec0
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/emblem-shared-symbolic.svg
@@ -0,0 +1,34 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='emblem-shared-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.3.1 r9886' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-paths='false' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer15' inkscape:cx='4.4977557' inkscape:cy='6.6184206' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1381' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='1600' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='-280px' originy='164px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-521.0002,-381)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-521.0002,-381)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-521.0002,-381)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-521.0002,-381)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-521.0002,-381)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-521.0002,-381)'>
+
+ <path sodipodi:cx='289.03125' sodipodi:cy='178.03125' d='m 291,178.03125 a 1.96875,1.96875 0 1 1 -3.9375,0 1.96875,1.96875 0 1 1 3.9375,0 z' id='path24876-5-1' sodipodi:rx='1.96875' sodipodi:ry='1.96875' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999994;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' transform='matrix(1.5079365,0,0,1.5079365,88.159628,120.50893)' sodipodi:type='arc'/>
+ <path sodipodi:cx='289.03125' sodipodi:cy='178.03125' d='m 291,178.03125 a 1.96875,1.96875 0 1 1 -3.9375,0 1.96875,1.96875 0 1 1 3.9375,0 z' id='path18806' sodipodi:rx='1.96875' sodipodi:ry='1.96875' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999994;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' transform='matrix(1.5079365,0,0,1.5079365,98.128178,125.50893)' sodipodi:type='arc'/>
+ <path sodipodi:cx='289.03125' sodipodi:cy='178.03125' d='m 291,178.03125 a 1.96875,1.96875 0 1 1 -3.9375,0 1.96875,1.96875 0 1 1 3.9375,0 z' id='path18808' sodipodi:rx='1.96875' sodipodi:ry='1.96875' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999994;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' transform='matrix(1.5079365,0,0,1.5079365,98.128178,115.50893)' sodipodi:type='arc'/>
+ <path inkscape:connector-curvature='0' d='m 533.625,383.15625 -10.0625,4.875 -1.8125,0.90625 1.8125,0.90625 10.03125,5.0625 0.90625,-1.8125 -8.21875,-4.15625 8.21875,-4 -0.875,-1.78125 z' id='path18810' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-521.0002,-381)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-521.0002,-381)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-521.0002,-381)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/emblem-synchronizing-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/emblem-synchronizing-symbolic-ref.png
new file mode 100644
index 00000000..edee0d18
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/emblem-synchronizing-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/emblem-synchronizing-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/emblem-synchronizing-symbolic.svg
new file mode 100644
index 00000000..a14d0eea
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/emblem-synchronizing-symbolic.svg
@@ -0,0 +1,34 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='emblem-synchronizing-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.4 r9939' version='1.1' width='16.000013' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer15' inkscape:cx='13.68559' inkscape:cy='-2.83871' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='true' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='702' inkscape:window-maximized='1' inkscape:window-width='1366' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='8'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='-260px' originy='164px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ <inkscape:grid color='#000000' empcolor='#000000' empopacity='0' empspacing='4' enabled='true' id='grid5968' opacity='0.1254902' originx='-260px' originy='164px' snapvisiblegridlinesonly='true' spacingx='0.5px' spacingy='0.5px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-501.0002,-381)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-501.0002,-381)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-501.0002,-381)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-501.0002,-381)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-501.0002,-381)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-501.0002,-381)'>
+
+ <path inkscape:connector-curvature='0' d='m 515.90195,383.0005 c -0.0423,0.008 -0.0841,0.0181 -0.125,0.0312 -0.44715,0.10014 -0.79228,0.5419 -0.78125,1 l 0,1.6875 c 0.004,1.31255 0.004,1.31255 -1.5625,1.3125 l -1.4375,0 c -0.52358,5e-5 -0.99995,0.47642 -1,1 -0.008,0.0726 -0.008,0.14613 0,0.21875 l 0,0.78125 6,0 0,-1 0,-4 c 0.006,-0.0623 0.006,-0.12518 0,-0.1875 l 0,-0.8125 -0.8125,0 c -0.0916,-0.0236 -0.18665,-0.0342 -0.28125,-0.0312 z' id='path4597-1' sodipodi:nodetypes='cccccccccccccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 501.0047,389 0,1 0,4 c -0.006,0.0623 -0.006,0.12518 0,0.1875 l 0,0.8125 0.8125,0 c 0.0916,0.0236 0.18665,0.0342 0.28125,0.0312 0.0423,-0.008 0.0841,-0.0181 0.125,-0.0312 0.44715,-0.10014 0.79228,-0.5419 0.78125,-1 l 0,-1.6875 C 503.00029,391 503.00029,391 504.5672,391 l 1.4375,0 c 0.52358,-5e-5 0.99995,-0.47642 1,-1 0.008,-0.0726 0.008,-0.14613 0,-0.21875 l 0,-0.78125 z' id='path10913' sodipodi:nodetypes='cccccccccccccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 509.0002,382 c -3.15321,0 -5.81948,2.12571 -6.6875,5 l 2.09375,0 c 0.7734,-1.76501 2.53819,-3 4.59375,-3 2.05556,0 3.82035,1.23499 4.59375,3 l 2.09375,0 c -0.86802,-2.87429 -3.53429,-5 -6.6875,-5 z m -6.6875,9 c 0.86802,2.87429 3.53429,5 6.6875,5 3.15321,0 5.81948,-2.12571 6.6875,-5 l -2.09375,0 c -0.7734,1.76501 -2.53819,3 -4.59375,3 -2.05556,0 -3.82035,-1.23499 -4.59375,-3 l -2.09375,0 z' id='path1483' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2.33333325;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-501.0002,-381)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-501.0002,-381)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-501.0002,-381)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/emblem-system-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/emblem-system-symbolic-ref.png
new file mode 100644
index 00000000..eb4c1ef3
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/emblem-system-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/emblem-system-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/emblem-system-symbolic.svg
new file mode 100644
index 00000000..b6bea55c
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/emblem-system-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns='http://www.w3.org/2000/svg' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:cc='http://creativecommons.org/ns#' xmlns:svg='http://www.w3.org/2000/svg' width='16' sodipodi:docname='emblem-system-symbolic.svg' height='16' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' version='1.1' inkscape:version='0.48.1 r9760'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:window-height='967' inkscape:snap-bbox-midpoints='false' inkscape:snap-grids='true' inkscape:object-paths='false' pagecolor='#555753' inkscape:zoom='1' inkscape:current-layer='layer15' borderopacity='1' inkscape:snap-others='false' inkscape:window-x='2259' inkscape:window-y='356' inkscape:snap-to-guides='true' gridtolerance='10' id='namedview88' inkscape:snap-global='true' inkscape:cx='9.30971' inkscape:cy='-0.23089111' bordercolor='#666666' inkscape:window-width='1226' inkscape:snap-bbox='true' guidetolerance='10' showguides='true' showborder='false' inkscape:guide-bbox='true' inkscape:object-nodes='false' inkscape:pageopacity='1' inkscape:window-maximized='0' objecttolerance='10' showgrid='false' inkscape:snap-nodes='true' inkscape:bbox-paths='false' inkscape:pageshadow='2'>
+ <inkscape:grid visible='true' spacingx='1px' spacingy='1px' id='grid4866' type='xygrid' empspacing='2' enabled='true' snapvisiblegridlinesonly='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:label='status' id='layer9' style='display:inline' transform='translate(-441.0002,-400.99999)' inkscape:groupmode='layer'/>
+ <g inkscape:label='devices' id='layer10' transform='translate(-441.0002,-400.99999)' inkscape:groupmode='layer'/>
+ <g inkscape:label='apps' id='layer11' transform='translate(-441.0002,-400.99999)' inkscape:groupmode='layer'/>
+ <g inkscape:label='places' id='layer13' transform='translate(-441.0002,-400.99999)' inkscape:groupmode='layer'/>
+ <g inkscape:label='mimetypes' id='layer14' transform='translate(-441.0002,-400.99999)' inkscape:groupmode='layer'/>
+ <g inkscape:label='emblems' id='layer15' style='display:inline' transform='translate(-441.0002,-400.99999)' inkscape:groupmode='layer'>
+
+ <path id='path35543-6-4' d='m 449.0004,402.00002 c -0.22065,0 -0.44081,0.0113 -0.65625,0.0312 l -0.40625,2.09375 c -0.33446,0.0733 -0.66305,0.17589 -0.96875,0.3125 l -1.53125,-1.46875 c -0.38863,0.23011 -0.72695,0.51408 -1.0625,0.8125 l 0.90625,1.90625 c -0.22242,0.24899 -0.42425,0.5225 -0.59375,0.8125 l -2.09375,-0.28125 c -0.17772,0.40877 -0.30872,0.83637 -0.40625,1.28125 l 1.84375,1 c -0.0171,0.16809 -0.0312,0.3274 -0.0312,0.5 0,0.1726 0.0142,0.33191 0.0312,0.5 l -1.84375,1 c 0.0975,0.44488 0.22853,0.87248 0.40625,1.28125 l 2.09375,-0.28125 c 0.1695,0.29 0.37133,0.56351 0.59375,0.8125 l -0.90625,1.90625 c 0.33555,0.29842 0.67387,0.58239 1.0625,0.8125 l 1.53125,-1.46875 c 0.3057,0.13661 0.63429,0.23916 0.96875,0.3125 l 0.40625,2.09375 c 0.21544,0.02 0.4356,0.0312 0.65625,0.0312 0.22065,0 0.44081,-0.0113 0.65625,-0.0312 l 0.40625,-2.09375 c 0.33446,-0.0733 0.66305,-0.17589 0.96875,-0.3125 l 1.53125,1.46875 c 0.38863,-0.23011 0.72695,-0.51408 1.0625,-0.8125 l -0.90625,-1.90625 c 0.22242,-0.24899 0.42425,-0.5225 0.59375,-0.8125 l 2.09375,0.28125 c 0.17772,-0.40877 0.30872,-0.83637 0.40625,-1.28125 l -1.84375,-1 c 0.0171,-0.16809 0.0312,-0.3274 0.0312,-0.5 0,-0.1726 -0.0142,-0.33191 -0.0312,-0.5 l 1.84375,-1 c -0.0975,-0.44488 -0.22853,-0.87248 -0.40625,-1.28125 l -2.09375,0.28125 c -0.1695,-0.29 -0.37133,-0.56351 -0.59375,-0.8125 l 0.90625,-1.90625 c -0.33555,-0.29842 -0.67387,-0.58239 -1.0625,-0.8125 l -1.53125,1.46875 c -0.3057,-0.13661 -0.63429,-0.23916 -0.96875,-0.3125 l -0.40625,-2.09375 c -0.21544,-0.02 -0.4356,-0.0312 -0.65625,-0.0312 z m 0,4 c 1.65685,0 3,1.34315 3,3 0,1.65685 -1.34315,3 -3,3 -1.65685,0 -3,-1.34315 -3,-3 0,-1.65685 1.34315,-3 3,-3 z' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' inkscape:connector-curvature='0' sodipodi:nodetypes='sccccccccccsccccccccccsccccccccccsccccccccccssssss'/>
+ </g>
+ <g inkscape:label='emotes' id='g71291' style='display:inline' transform='translate(-441.0002,-400.99999)' inkscape:groupmode='layer'/>
+ <g inkscape:label='categories' id='g4953' style='display:inline' transform='translate(-441.0002,-400.99999)' inkscape:groupmode='layer'/>
+ <g inkscape:label='actions' id='layer12' style='display:inline' transform='translate(-441.0002,-400.99999)' inkscape:groupmode='layer'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/emblem-videos-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/emblem-videos-symbolic-ref.png
new file mode 100644
index 00000000..a039ee4b
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/emblem-videos-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/emblem-videos-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/emblem-videos-symbolic.svg
new file mode 100644
index 00000000..3c8f82b9
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/emblem-videos-symbolic.svg
@@ -0,0 +1,33 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='emblem-videos-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer15' inkscape:cx='-91.6517' inkscape:cy='-92.47383' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1373' inkscape:window-maximized='0' inkscape:window-width='1279' inkscape:window-x='1279' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='-319.9998px' originy='164px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ <inkscape:grid color='#000000' empcolor='#000000' empopacity='0' empspacing='4' enabled='true' id='grid5968' opacity='0.1254902' originx='-319.9998px' originy='164px' snapvisiblegridlinesonly='true' spacingx='0.5px' spacingy='0.5px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-561,-381)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-561,-381)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-561,-381)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-561,-381)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-561,-381)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-561,-381)'>
+
+ <rect height='9' id='rect5538' rx='0.99980003' ry='1' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible' width='9.96875' x='562.03125' y='385'/>
+ <path inkscape:connector-curvature='0' d='m 572,389.4693 3.46929,-3.4693 0.53091,0 0,7 -0.5,0 z' id='path5540' sodipodi:nodetypes='cccccc' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible'/>
+ </g>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-561,-381)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-561,-381)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-561,-381)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/emoji-activities-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/emoji-activities-symbolic-ref.png
new file mode 100644
index 00000000..fb692581
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/emoji-activities-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/emoji-activities-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/emoji-activities-symbolic.svg
new file mode 100644
index 00000000..e642e281
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/emoji-activities-symbolic.svg
@@ -0,0 +1,35 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='emoji-activities-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.92.2 2405546, 2018-03-11' viewBox='0 0 16.003477 16' width='16.003477' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='g4953' inkscape:cx='-8.4655675' inkscape:cy='-1.596014' inkscape:document-rotation='0' inkscape:document-units='px' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:measure-end='0,0' inkscape:measure-start='-190.687,-191.14' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='3440' inkscape:window-x='0' inkscape:window-y='61' inkscape:zoom='11.313708'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-240' originy='264.00001' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-481.0002,-481.00001)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-481.0002,-481.00001)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-481.0002,-481.00001)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-481.0002,-481.00001)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-481.0002,-481.00001)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-481.0002,-481.00001)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-481.0002,-481.00001)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-481.0002,-481.00001)'>
+
+ <path inkscape:connector-curvature='0' d='m 489.0002,481.00195 c -4.40867,0 -8,3.59385 -8,7.99805 0,4.40421 3.59133,7.99805 8,7.99805 4.40867,0 8,-3.59384 8,-7.99805 0,-4.4042 -3.59133,-7.99805 -8,-7.99805 z m 0,1.9961 c 0.12727,0 0.2517,0.0118 0.37695,0.0195 -0.5196,1.63714 -0.18737,3.4333 0.98047,4.70508 1.17778,1.28257 2.95656,1.7589 4.63867,1.35351 -0.041,3.29188 -2.69849,5.92578 -5.99609,5.92578 -0.002,0 -0.004,1e-5 -0.006,0 0.36368,-1.65315 -0.11523,-3.38793 -1.37305,-4.54297 -1.24383,-1.14218 -2.98982,-1.48273 -4.59765,-1.01171 -0.0109,-0.14832 -0.0215,-0.29606 -0.0215,-0.44727 0,-3.32777 2.67473,-6.00195 5.99805,-6.00195 z m 1.37695,0.16211 c 2.3605,0.55086 4.17153,2.48612 4.54493,4.91406 -1.39332,0.39923 -2.86719,0.0211 -3.82813,-1.02539 -0.95374,-1.03862 -1.21175,-2.53353 -0.7168,-3.88867 z m -5.89648,7.15625 c 0.90447,-0.0274 1.78068,0.25065 2.46484,0.8789 1.01572,0.93272 1.28874,2.34352 0.92969,3.69922 -2.2698,-0.42794 -4.07526,-2.1266 -4.66406,-4.33594 0.41947,-0.1427 0.84633,-0.22937 1.26953,-0.24218 z' id='path6109' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-481.0002,-481.00001)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/emoji-body-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/emoji-body-symbolic-ref.png
new file mode 100644
index 00000000..f2a98222
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/emoji-body-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/emoji-body-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/emoji-body-symbolic.svg
new file mode 100644
index 00000000..cea8e574
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/emoji-body-symbolic.svg
@@ -0,0 +1,36 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='emoji-body-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.92.2 2405546, 2018-03-11' viewBox='0 0 16 16' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='g4953' inkscape:cx='18.74169' inkscape:cy='-0.69598' inkscape:document-rotation='0' inkscape:document-units='px' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:measure-end='0,0' inkscape:measure-start='-190.687,-191.14' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='3440' inkscape:window-x='0' inkscape:window-y='61' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-280' originy='264' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-521.0002,-481)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-521.0002,-481)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-521.0002,-481)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-521.0002,-481)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-521.0002,-481)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-521.0002,-481)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-521.0002,-481)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-521.0002,-481)'>
+ <path inkscape:connector-curvature='0' d='m 529.0002,481.05032 c 1.12129,0 2.03009,0.9088 2.03009,2.03009 0,1.12128 -0.9088,2.03008 -2.03009,2.03008 -1.12129,0 -2.03009,-0.9088 -2.03009,-2.03008 0,-1.12129 0.9088,-2.03009 2.03009,-2.03009 z' id='path3297' style='display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none'/>
+ <path inkscape:connector-curvature='0' d='m 522.48622,486.05101 c 3.53288,-0.0505 9.42252,-0.0143 12.9274,0.0149 0,0 0.471,-0.008 0.471,0.46354 v 0.22802 c 0,0.24682 -0.25753,0.31481 -0.25753,0.31481 l -4.62689,0.37529 V 491 l 2.09503,4.60829 c 0.16815,0.27744 -0.19468,0.3567 -0.19468,0.3567 l -0.64713,0.006 c -0.31118,0 -0.42785,-0.26183 -0.42785,-0.26183 l -2.51547,-4.34645 c -0.2963,-0.67197 -0.31482,-0.58627 -0.59524,0.001 l -2.65057,4.33978 c -0.0892,0.26751 -0.43707,0.27334 -0.43707,0.27334 l -0.70097,-0.0106 c 0,0 -0.25625,-0.007 -0.19746,-0.25711 L 527.0002,491 v -3.55243 l -4.65371,-0.34509 c -0.2561,-0.0867 -0.3623,-0.32429 -0.3623,-0.32429 v -0.23977 c 0,0 -0.0107,-0.48855 0.50203,-0.48855 z' id='path3850-0' sodipodi:nodetypes='ccsscccccccccccccccccccc' style='display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.99999988;marker:none'/>
+
+ </g>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-521.0002,-481)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/emoji-flags-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/emoji-flags-symbolic-ref.png
new file mode 100644
index 00000000..97f149bc
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/emoji-flags-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/emoji-flags-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/emoji-flags-symbolic.svg
new file mode 100644
index 00000000..ce95b7ae
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/emoji-flags-symbolic.svg
@@ -0,0 +1,35 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='emoji-flags-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.92.2 2405546, 2018-03-11' viewBox='0 0 16 16' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='g4953' inkscape:cx='-9.04799' inkscape:cy='-0.89953' inkscape:document-rotation='0' inkscape:document-units='px' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:measure-end='0,0' inkscape:measure-start='-190.687,-191.14' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='3440' inkscape:window-x='0' inkscape:window-y='61' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-340' originy='264' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-581.0002,-481)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-581.0002,-481)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-581.0002,-481)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-581.0002,-481)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-581.0002,-481)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-581.0002,-481)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-581.0002,-481)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-581.0002,-481)'>
+
+ <path inkscape:connector-curvature='0' d='m 585.69612,483.23396 c -3.58218,0 -4.66582,1.39975 -4.66582,1.39975 v 10.04946 c 0,0 1.08364,-1.07673 4.66582,-1.07673 2.9161,0 4.47225,1.07673 7.17818,1.07673 2.08923,0 3.19429,-1.39975 3.19429,-1.39975 v -10.04946 c 0,0 -1.14095,1.04084 -3.23018,1.04084 -3.3734,0 -3.97619,-1.04084 -7.14229,-1.04084 z' id='path76627-1' sodipodi:nodetypes='sccssccss' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-581.0002,-481)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/emoji-food-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/emoji-food-symbolic-ref.png
new file mode 100644
index 00000000..9f8fe88a
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/emoji-food-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/emoji-food-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/emoji-food-symbolic.svg
new file mode 100644
index 00000000..a9b945aa
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/emoji-food-symbolic.svg
@@ -0,0 +1,36 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='emoji-food-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.92.2 2405546, 2018-03-11' viewBox='0 0 16 16' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='g4953' inkscape:cx='0.87563444' inkscape:cy='10.267906' inkscape:document-rotation='0' inkscape:document-units='px' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:measure-end='0,0' inkscape:measure-start='-190.687,-191.14' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='3440' inkscape:window-x='0' inkscape:window-y='61' inkscape:zoom='11.313708'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-220.00348' originy='264.00001' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-461.00368,-481.00001)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-461.00368,-481.00001)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-461.00368,-481.00001)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-461.00368,-481.00001)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-461.00368,-481.00001)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-461.00368,-481.00001)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-461.00368,-481.00001)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-461.00368,-481.00001)'>
+
+ <path inkscape:connector-curvature='0' d='m 471.0002,482 v 7 1.0918 c -0.58192,0.20544 -1,0.75185 -1,1.40429 v 3.00782 c 0,0.87716 0.65319,1.49609 1.5,1.49609 0.85539,0 1.5,-0.60886 1.5,-1.49609 v -3.00782 c 0,-0.65244 -0.41808,-1.19885 -1,-1.40429 V 489 h 0.66406 c 0.73509,0 1.32617,-0.58919 1.32617,-1.32227 V 486 c 0,-2.38216 -0.99023,-4 -2.99023,-4 z' id='rect6072' sodipodi:nodetypes='cccscscsccsssc' style='opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:26.07395554;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal'/>
+ <path inkscape:connector-curvature='0' d='m 463.0002,483 v 3.44922 c 0,0.84978 0.69879,1.54883 1.55078,1.54883 h 0.44922 v 2.09375 c -0.58192,0.20544 -1,0.75185 -1,1.40429 v 3.00782 c 0,0.82872 0.669,1.49609 1.5,1.49609 0.831,0 1.5,-0.66737 1.5,-1.49609 v -3.00782 c 0,-0.65244 -0.41808,-1.19885 -1,-1.40429 v -2.09375 h 0.44922 c 0.85199,0 1.55273,-0.69905 1.55273,-1.54883 V 483 c 0,-0.51586 -0.46789,-1 -1.00195,-1 v 4.44922 c 0,0.31528 -0.23771,0.55078 -0.55078,0.55078 h -0.44922 v -4.98242 l -1,-0.002 V 487 h -0.44922 c -0.31307,0 -0.55078,-0.23551 -0.55078,-0.55078 V 482 c -0.5471,0 -1,0.46071 -1,1 z' id='rect6078' sodipodi:nodetypes='cssccsssssccssccssccccsscc' style='opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:23.99999809;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-461.00368,-481.00001)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/emoji-nature-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/emoji-nature-symbolic-ref.png
new file mode 100644
index 00000000..bb1ecf59
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/emoji-nature-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/emoji-nature-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/emoji-nature-symbolic.svg
new file mode 100644
index 00000000..501c6d76
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/emoji-nature-symbolic.svg
@@ -0,0 +1,36 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='emoji-nature-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.92.2 2405546, 2018-03-11' viewBox='0 0 16 16' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='g4953' inkscape:cx='18.771013' inkscape:cy='-2.6302435' inkscape:document-rotation='0' inkscape:document-units='px' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:measure-end='0,0' inkscape:measure-start='-190.687,-191.14' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='3440' inkscape:window-x='0' inkscape:window-y='61' inkscape:zoom='11.313708'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-300' originy='264' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-541.0002,-481)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-541.0002,-481)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-541.0002,-481)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-541.0002,-481)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-541.0002,-481)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-541.0002,-481)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-541.0002,-481)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-541.0002,-481)'>
+
+ <rect height='0' id='rect3364' style='opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#bebebe;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal' width='0' x='241.0002' y='217'/>
+ <path inkscape:connector-curvature='0' d='m 547.0627,482 c -0.86447,0 -1.5754,0.42591 -2.0957,0.96289 -0.52031,0.53698 -0.9043,1.21757 -0.9043,2.03711 v 5 c 0,0.6701 -0.0156,1.41867 -0.0312,2.00042 0,0.99958 -0.5377,1.41303 -1.40438,2.12067 -0.62725,0.48985 -0.77411,1.31026 -0.30664,1.69727 0.42932,0.35542 1.16167,0.30404 1.66016,-0.34375 L 545.0002,494 c 0.69754,-1.01395 0.98273,-1.87583 1,-3 v -6 c 0,-0.50152 0.48432,-1 1,-1 v 6.57422 l 1,-1.06641 1,-1 1,-1 V 485 c 0,-0.47037 0.47656,-1 1,-1 v 2.50781 l 2,-2.04297 c 0.33843,-0.31195 0.60778,-0.45379 1,-0.46484 v 1 l -2,2 -1,1 -1,1 h 4 c 0,0.57079 -0.48384,1 -1,1 h -4 l -1,1 -0.50781,0.50781 L 547.0002,492 c 0,0.42593 0,2.00586 2,2.00586 0,0 2.80992,0.006 4,0.006 0.83538,0 1.55818,-0.38387 2.08984,-0.91797 0.53167,-0.53468 0.91016,-1.25566 0.91016,-2.08412 V 482 h -1 z' id='path3529' sodipodi:nodetypes='scssccccccscccccscccccccccscccccccsccs' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-541.0002,-481)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/emoji-objects-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/emoji-objects-symbolic-ref.png
new file mode 100644
index 00000000..6d6392b1
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/emoji-objects-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/emoji-objects-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/emoji-objects-symbolic.svg
new file mode 100644
index 00000000..6fc4e3d7
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/emoji-objects-symbolic.svg
@@ -0,0 +1,35 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='emoji-objects-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.92.2 2405546, 2018-03-11' viewBox='0 0 16 16' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='g4953' inkscape:cx='0.9045167' inkscape:cy='12.049798' inkscape:document-rotation='0' inkscape:document-units='px' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:measure-end='0,0' inkscape:measure-start='-190.687,-191.14' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='true' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='3440' inkscape:window-x='0' inkscape:window-y='61' inkscape:zoom='22.627417'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-360' originy='264' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-601.0002,-481)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-601.0002,-481)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-601.0002,-481)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-601.0002,-481)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-601.0002,-481)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-601.0002,-481)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-601.0002,-481)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-601.0002,-481)'>
+ <path inkscape:connector-curvature='0' d='m 607.0004,482 c -1.00916,0.005 -1,1 -1,1 v 11 c 0,1 1,1 1,1 h 4 c 1,0 1,-1 1,-1 v -8 c 9e-4,-0.554 -0.446,-1 -1,-1 h -3 v -2 c 0,0 -0.009,-0.99447 -1,-1 z m 0,4 h 4 v 3.03125 l -4,-0.0312 z m 0,4 h 1 v 1 h 1 v -1 h 1 v 1 h 1 v 1 h -1 v 1 h 1 v 1 h -1 v -1 h -1 v 1 h -1 v -1 h -1 v -1 h 1 v -1 h -1 z m 1,2 v 1 h 1 v -1 z m 1,0 h 1 v -1 h -1 z' id='path3438' sodipodi:nodetypes='ccscsccsccccccccccccccccccccccccccccccccccccccccccc' style='color:#000000;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;marker:none;enable-background:accumulate'/>
+
+ </g>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-601.0002,-481)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/emoji-people-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/emoji-people-symbolic-ref.png
new file mode 100644
index 00000000..3c14e034
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/emoji-people-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/emoji-people-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/emoji-people-symbolic.svg
new file mode 100644
index 00000000..c6c23e71
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/emoji-people-symbolic.svg
@@ -0,0 +1,36 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='emoji-people-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.92.2 2405546, 2018-03-11' viewBox='0 0 16 16' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='g4953' inkscape:cx='-16.43704' inkscape:cy='12.06177' inkscape:document-rotation='0' inkscape:document-units='px' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:measure-end='0,0' inkscape:measure-start='-190.687,-191.14' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='true' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='3440' inkscape:window-x='0' inkscape:window-y='61' inkscape:zoom='32'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-260' originy='264' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-501.0002,-481)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-501.0002,-481)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-501.0002,-481)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-501.0002,-481)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-501.0002,-481)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-501.0002,-481)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-501.0002,-481)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-501.0002,-481)'>
+
+ <path inkscape:connector-curvature='0' d='m 511.55489,489.09373 c -0.70541,0.62353 -1.53918,0.90625 -2.55469,0.90625 -1.01551,0 -1.85318,-0.29053 -2.55859,-0.91406 -1.10938,0.36328 -2.43603,1.28775 -2.4375,2.90234 l -0.004,3.01172 c -7.2e-4,0.554 0.446,1.00002 1,1.00002 h 8 c 0.554,0 1,-0.44602 1,-1.00002 v -3 c 0,-1.38672 -1.10231,-2.5558 -2.44531,-2.90625 z' id='path3332' sodipodi:nodetypes='csccsssscc' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+ <circle cx='509.00018' cy='485.99997' id='circle3334' r='3' style='color:#bebebe;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.4000001;marker:none;enable-background:accumulate'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-501.0002,-481)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/emoji-recent-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/emoji-recent-symbolic-ref.png
new file mode 100644
index 00000000..7f7fa570
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/emoji-recent-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/emoji-recent-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/emoji-recent-symbolic.svg
new file mode 100644
index 00000000..7d51b9b1
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/emoji-recent-symbolic.svg
@@ -0,0 +1,36 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='emoji-recent-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.92.2 2405546, 2018-03-11' viewBox='0 0 16 16' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='g4953' inkscape:cx='-897.95546' inkscape:cy='-115.95944' inkscape:document-rotation='0' inkscape:document-units='px' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:measure-end='0,0' inkscape:measure-start='-190.687,-191.14' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='true' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='3440' inkscape:window-x='0' inkscape:window-y='61' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-400' originy='264' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-641.0002,-481)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-641.0002,-481)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-641.0002,-481)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-641.0002,-481)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-641.0002,-481)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-641.0002,-481)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-641.0002,-481)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-641.0002,-481)'>
+
+ <path inkscape:connector-curvature='0' d='m 649.48681,481.01994 c -4.13029,0 -7.48661,3.35631 -7.48661,7.48661 0,4.13029 3.35632,7.4866 7.48661,7.4866 4.13029,0 7.4866,-3.35631 7.4866,-7.4866 0,-4.1303 -3.35631,-7.48661 -7.4866,-7.48661 z m 0,1.97321 c 3.04941,0 5.51339,2.46399 5.51339,5.5134 0,3.04941 -2.46398,5.51339 -5.51339,5.51339 -3.04941,0 -5.5134,-2.46398 -5.5134,-5.51339 0,-3.04941 2.46399,-5.5134 5.5134,-5.5134 z' id='path3557' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:Sans;-inkscape-font-specification:Sans;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2.15384626;marker:none;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 652.39306,485.00654 a 0.50005,0.50005 0 0 0 -0.25,0.15625 l -2.65625,2.65625 -1.65625,-1.65625 a 0.50005,0.50005 0 1 0 -0.6875,0.6875 l 2,2 a 0.50005,0.50005 0 0 0 0.6875,0 l 3,-3 a 0.50005,0.50005 0 0 0 -0.4375,-0.84375 z' id='path3559' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:Sans;-inkscape-font-specification:Sans;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;enable-background:accumulate'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-641.0002,-481)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/emoji-symbols-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/emoji-symbols-symbolic-ref.png
new file mode 100644
index 00000000..ecd154de
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/emoji-symbols-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/emoji-symbols-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/emoji-symbols-symbolic.svg
new file mode 100644
index 00000000..2a352747
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/emoji-symbols-symbolic.svg
@@ -0,0 +1,35 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='emoji-symbols-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.92.2 2405546, 2018-03-11' viewBox='0 0 16 16' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='g4953' inkscape:cx='-38.138504' inkscape:cy='20.90965' inkscape:document-rotation='0' inkscape:document-units='px' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:measure-end='0,0' inkscape:measure-start='-190.687,-191.14' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='true' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='3440' inkscape:window-x='0' inkscape:window-y='61' inkscape:zoom='16'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-380' originy='264' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-621.0002,-481)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-621.0002,-481)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-621.0002,-481)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-621.0002,-481)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-621.0002,-481)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-621.0002,-481)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-621.0002,-481)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-621.0002,-481)'>
+
+ <path inkscape:connector-curvature='0' d='m 636.00019,486.76617 c 0,-2.07495 -1.68742,-3.75698 -3.76925,-3.75698 -1.37132,0 -2.57123,0.73006 -3.23065,1.8214 -0.65942,-1.09135 -1.85953,-1.8214 -3.23085,-1.8214 -2.08183,0 -3.76925,1.68203 -3.76925,3.75698 0,1.07968 0.45777,2.05239 1.18953,2.73766 h -10e-4 l 5.72506,5.49617 5.89867,-5.49617 h -0.002 c 0.73186,-0.68517 1.18933,-1.65788 1.18933,-2.73766' id='path3536' sodipodi:nodetypes='cscsscccccc' style='display:inline;fill:#bebebe;fill-opacity:1;stroke:none;enable-background:new'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-621.0002,-481)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/emoji-travel-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/emoji-travel-symbolic-ref.png
new file mode 100644
index 00000000..32fd53f1
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/emoji-travel-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/emoji-travel-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/emoji-travel-symbolic.svg
new file mode 100644
index 00000000..0bdb2b8c
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/emoji-travel-symbolic.svg
@@ -0,0 +1,35 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='emoji-travel-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.92.2 2405546, 2018-03-11' viewBox='0 0 16 16' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='g4953' inkscape:cx='-9.1189836' inkscape:cy='-15.54785' inkscape:document-rotation='0' inkscape:document-units='px' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:measure-end='0,0' inkscape:measure-start='-190.687,-191.14' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='true' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='3440' inkscape:window-x='0' inkscape:window-y='61' inkscape:zoom='16'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-320.03467' originy='263.96875' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-561.03487,-480.96875)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-561.03487,-480.96875)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-561.03487,-480.96875)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-561.03487,-480.96875)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-561.03487,-480.96875)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-561.03487,-480.96875)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-561.03487,-480.96875)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-561.03487,-480.96875)'>
+
+ <path inkscape:connector-curvature='0' d='m 567.53145,481.96875 c -0.79399,9.7e-4 -0.78072,0.0333 -0.53125,1.03125 l 1.625,4.96875 h -4.5 l -1.21875,-1.78125 c -0.13926,-0.20883 -0.1227,-0.21873 -0.34375,-0.21875 h -0.21875 c -0.42773,0 -0.28125,0.4375 -0.28125,0.4375 l 0.28125,2.5625 -0.28125,2.5625 c 0,0 -0.13986,0.43749 0.25,0.4375 h 0.25 c 0.21159,0 0.20422,-0.009 0.34375,-0.21875 l 1.21875,-1.78125 h 4.5 l -1.625,4.9375 c -0.26171,1.04691 -0.2647,1.06251 0.53125,1.0625 0.43199,0 0.43388,-0.0117 0.71875,-0.5 l 3.6875,-5.5 h 3.09375 c 0.554,0 1,-0.446 1,-1 0,-0.554 -0.446,-1 -1,-1 h -3.09375 l -3.6875,-5.5 c -0.2665,-0.45685 -0.28331,-0.49822 -0.65625,-0.5 z' id='path3364' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-561.03487,-480.96875)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/emote-love-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/emote-love-symbolic-ref.png
new file mode 100644
index 00000000..ecd154de
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/emote-love-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/emote-love-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/emote-love-symbolic.svg
new file mode 100644
index 00000000..23d1da62
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/emote-love-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='emote-love-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.91 r13725' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='g71291' inkscape:cx='-310.4313' inkscape:cy='9.53054' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-240.00001' originy='464' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-481.00021,-681)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-481.00021,-681)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-481.00021,-681)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-481.00021,-681)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-481.00021,-681)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-481.00021,-681)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-481.00021,-681)'>
+
+ <path inkscape:connector-curvature='0' d='m 496.0002,686.76617 c 0,-2.07495 -1.68742,-3.75698 -3.76925,-3.75698 -1.37132,0 -2.57123,0.73006 -3.23065,1.8214 -0.65942,-1.09135 -1.85953,-1.8214 -3.23085,-1.8214 -2.08183,0 -3.76925,1.68203 -3.76925,3.75698 0,1.07968 0.45777,2.05239 1.18953,2.73766 l -10e-4,0 5.72506,5.49617 5.89867,-5.49617 -0.002,0 c 0.73186,-0.68517 1.18933,-1.65788 1.18933,-2.73766' id='path10086' sodipodi:nodetypes='cscsscccccc' style='display:inline;fill:#bebebe;fill-opacity:1;stroke:none;enable-background:new'/>
+ </g>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-481.00021,-681)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-481.00021,-681)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/error-correct-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/error-correct-symbolic-ref.png
new file mode 100644
index 00000000..d6c0c0cf
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/error-correct-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/error-correct-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/error-correct-symbolic.svg
new file mode 100644
index 00000000..90676c44
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/error-correct-symbolic.svg
@@ -0,0 +1,36 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='error-correct-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.92+devel unknown' viewBox='0 0 16 16' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='11.37579' inkscape:cy='4.25452' inkscape:document-rotation='0' inkscape:document-units='px' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:measure-end='0,0' inkscape:measure-start='0,0' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='3440' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-179.9838' originy='549.98573' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-420.984,-766.98573)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-420.984,-766.98573)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-420.984,-766.98573)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-420.984,-766.98573)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-420.984,-766.98573)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-420.984,-766.98573)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-420.984,-766.98573)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-420.984,-766.98573)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-420.984,-766.98573)'>
+
+ <path inkscape:connector-curvature='0' d='m 423.66263,777.27842 5.84933,-5.85075 2.99982,2.99981 -5.82888,5.87306 -4.02677,1.07184 z' id='path3065' sodipodi:nodetypes='cccccc' style='fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none'/>
+ <path inkscape:connector-curvature='0' d='m 425.99825,767 c -1.33332,0 -2.27524,0.81426 -2.64453,1.55273 C 422.98449,769.29127 422.99825,770 422.99825,770 v 1.58594 l -0.28321,-0.28321 c -0.003,-0.003 -0.005,-0.006 -0.008,-0.01 -0.18665,-0.18658 -0.44163,-0.29271 -0.70684,-0.29273 h -1 v 1 c 5e-5,0.26522 0.10545,0.51951 0.29297,0.70703 l 2.70703,2.70703 2.69727,-2.69726 c 0.19374,-0.18807 0.30272,-0.44681 0.30273,-0.7168 v -1 h -1 c -0.26523,4e-5 -0.51953,0.10546 -0.70703,0.29297 l -0.29297,0.29297 V 770 c 0,0 0.0134,-0.29137 0.14453,-0.55273 0.13078,-0.26143 0.18882,-0.44726 0.85547,-0.44727 h 5.95898 l -1.6621,1.66016 3.05273,3.05273 1.76953,-1.76953 c 0.3073,-0.3073 0.3073,-0.80208 0,-1.10938 L 433.2834,769 431.69942,767.58984 C 431.25164,767.2085 430.8123,767 430.0002,767 Z' id='path3067' sodipodi:nodetypes='scccsccccscccccccccccccscccss' style='color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/face-angel-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/face-angel-symbolic-ref.png
new file mode 100644
index 00000000..e59d6728
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/face-angel-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/face-angel-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/face-angel-symbolic.svg
new file mode 100644
index 00000000..f9c0e974
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/face-angel-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:svg='http://www.w3.org/2000/svg' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' sodipodi:docname='face-angel-symbolic.svg' version='1.1' inkscape:version='0.48.1 r9760' height='16' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:cy='-0.054679414' pagecolor='#555753' borderopacity='1' showborder='false' inkscape:bbox-paths='false' guidetolerance='10' inkscape:object-paths='true' inkscape:window-width='1508' showguides='true' inkscape:object-nodes='true' inkscape:snap-bbox='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:snap-nodes='false' bordercolor='#666666' objecttolerance='10' id='namedview88' showgrid='false' inkscape:window-maximized='0' inkscape:window-x='1636' inkscape:snap-global='true' inkscape:window-y='336' gridtolerance='10' inkscape:window-height='1060' inkscape:snap-to-guides='true' inkscape:current-layer='g71291' inkscape:snap-bbox-midpoints='false' inkscape:zoom='1' inkscape:cx='27.245286' inkscape:snap-grids='true' inkscape:pageopacity='1'>
+ <inkscape:grid spacingx='1px' spacingy='1px' id='grid4866' empspacing='2' enabled='true' type='xygrid' snapvisiblegridlinesonly='true' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:label='status' transform='translate(-441.0002,-519)' inkscape:groupmode='layer' id='layer9' style='display:inline'/>
+ <g inkscape:label='devices' transform='translate(-441.0002,-519)' inkscape:groupmode='layer' id='layer10'/>
+ <g inkscape:label='apps' transform='translate(-441.0002,-519)' inkscape:groupmode='layer' id='layer11'/>
+ <g inkscape:label='places' transform='translate(-441.0002,-519)' inkscape:groupmode='layer' id='layer13'/>
+ <g inkscape:label='mimetypes' transform='translate(-441.0002,-519)' inkscape:groupmode='layer' id='layer14'/>
+ <g inkscape:label='emblems' transform='translate(-441.0002,-519)' inkscape:groupmode='layer' id='layer15' style='display:inline'/>
+ <g inkscape:label='emotes' transform='translate(-441.0002,-519)' inkscape:groupmode='layer' id='g71291' style='display:inline'>
+ <path inkscape:connector-curvature='0' d='m 443.1877,523.09375 c -0.75477,1.11721 -1.1875,2.4565 -1.1875,3.90625 0,3.86599 3.13401,7 7,7 3.86599,0 7,-3.13401 7,-7 0,-1.44975 -0.43273,-2.78904 -1.1875,-3.90625 -0.19893,0.13572 -0.42444,0.25079 -0.625,0.34375 -0.85019,0.39407 -1.8545,0.5625 -2.9375,0.5625 l -4.5,0 c -1.083,0 -2.08731,-0.16843 -2.9375,-0.5625 -0.20056,-0.093 -0.42607,-0.20803 -0.625,-0.34375 z M 447.0002,525 c 0.55833,0 1.03125,0.47292 1.03125,1.03125 l 0,0.96875 c 0,0.55833 -0.47292,1 -1.03125,1 -0.55833,0 -1,-0.44167 -1,-1 l 0,-0.96875 c 0,-0.55833 0.44167,-1.03125 1,-1.03125 z m 4,0 c 0.55833,0 1,0.47292 1,1.03125 l 0,0.96875 c 0,0.55833 -0.44167,1 -1,1 -0.55833,0 -1,-0.44167 -1,-1 l 0,-0.96875 c 0,-0.55833 0.44167,-1.03125 1,-1.03125 z m -7,3.0625 c 0.71531,1.0744 2.23523,1.9375 5,1.9375 2.45227,0 4.21082,-0.75041 5,-1.9375 l 0,0.5 c 0,0.68098 -0.8379,2.40625 -5,2.40625 -3.88085,0 -5,-1.87374 -5,-2.40625 z' id='path86756' sodipodi:nodetypes='cssscsssscsssssssssssssscscsssc' style='fill:#babdb6;fill-opacity:1;stroke:none'/>
+
+ <path inkscape:connector-curvature='0' d='m 446.75,519 c -0.95862,0 -1.82664,0.18789 -2.5,0.5 -0.67336,0.31211 -1.25,0.79502 -1.25,1.5 0,0.70498 0.57664,1.18789 1.25,1.5 0.67336,0.31211 1.54138,0.5 2.5,0.5 l 4.5,0 c 0.95862,0 1.82664,-0.18789 2.5,-0.5 0.67336,-0.31211 1.25,-0.79502 1.25,-1.5 0,-0.70498 -0.57664,-1.18789 -1.25,-1.5 -0.67336,-0.31211 -1.54138,-0.5 -2.5,-0.5 l -4.5,0 z m 0,1 4.5,0 c 0.83424,0 1.59722,0.17611 2.09375,0.40625 C 453.84028,520.63639 454,520.87398 454,521 c 0,0.12602 -0.15972,0.36361 -0.65625,0.59375 C 452.84722,521.82389 452.08424,522 451.25,522 l -4.5,0 c -0.83424,0 -1.59722,-0.17611 -2.09375,-0.40625 C 444.15972,521.36361 444,521.12602 444,521 c 0,-0.12602 0.15972,-0.36361 0.65625,-0.59375 C 445.15278,520.17611 445.91576,520 446.75,520 z' id='rect86760' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#babdb6;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+ <g inkscape:label='categories' transform='translate(-441.0002,-519)' inkscape:groupmode='layer' id='g4953' style='display:inline'/>
+ <g inkscape:label='actions' transform='translate(-441.0002,-519)' inkscape:groupmode='layer' id='layer12' style='display:inline'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/face-angry-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/face-angry-symbolic-ref.png
new file mode 100644
index 00000000..dc4156df
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/face-angry-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/face-angry-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/face-angry-symbolic.svg
new file mode 100644
index 00000000..472c61ec
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/face-angry-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:svg='http://www.w3.org/2000/svg' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' sodipodi:docname='face-angry-symbolic.svg' version='1.1' inkscape:version='0.48.1 r9760' height='16' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:cy='6.7066606' pagecolor='#555753' borderopacity='1' showborder='false' inkscape:bbox-paths='false' guidetolerance='10' inkscape:object-paths='true' inkscape:window-width='1508' showguides='true' inkscape:object-nodes='true' inkscape:snap-bbox='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:snap-nodes='false' bordercolor='#666666' objecttolerance='10' id='namedview88' showgrid='false' inkscape:window-maximized='0' inkscape:window-x='2022' inkscape:snap-global='true' inkscape:window-y='300' gridtolerance='10' inkscape:window-height='1060' inkscape:snap-to-guides='true' inkscape:current-layer='g71291' inkscape:snap-bbox-midpoints='false' inkscape:zoom='1' inkscape:cx='9.0543957' inkscape:snap-grids='true' inkscape:pageopacity='1'>
+ <inkscape:grid spacingx='1px' spacingy='1px' id='grid4866' empspacing='2' enabled='true' type='xygrid' snapvisiblegridlinesonly='true' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:label='status' transform='translate(-461.0002,-519)' inkscape:groupmode='layer' id='layer9' style='display:inline'/>
+ <g inkscape:label='devices' transform='translate(-461.0002,-519)' inkscape:groupmode='layer' id='layer10'/>
+ <g inkscape:label='apps' transform='translate(-461.0002,-519)' inkscape:groupmode='layer' id='layer11'/>
+ <g inkscape:label='places' transform='translate(-461.0002,-519)' inkscape:groupmode='layer' id='layer13'/>
+ <g inkscape:label='mimetypes' transform='translate(-461.0002,-519)' inkscape:groupmode='layer' id='layer14'/>
+ <g inkscape:label='emblems' transform='translate(-461.0002,-519)' inkscape:groupmode='layer' id='layer15' style='display:inline'/>
+ <g inkscape:label='emotes' transform='translate(-461.0002,-519)' inkscape:groupmode='layer' id='g71291' style='display:inline'>
+ <path inkscape:connector-curvature='0' d='m 469.0002,520 c -3.86599,0 -7,3.13401 -7,7 0,3.86599 3.13401,7 7,7 3.86599,0 7,-3.13401 7,-7 0,-3.86599 -3.13401,-7 -7,-7 z m -4,4.125 c 0,0 0.47388,0.83875 1.25,0.84375 l 1.75,0 0,1.03125 c 0,0.55616 -0.66683,1 -1.5,1 -0.83315,0 -1.5,-0.44384 -1.5,-1 z m 8,0 0,1.875 c 0,0.55616 -0.66685,1 -1.5,1 -0.83317,0 -1.5,-0.44384 -1.5,-1 l 0,-1.03125 1.71875,0 c 0.77612,-0.005 1.28125,-0.84375 1.28125,-0.84375 z M 469.03145,528 c 3.25585,0 3,0.38381 3,0.76164 l 0,0.26609 -6.03125,0 0,-0.28818 c 0,-0.34953 -0.2246,-0.73955 3.03125,-0.73955 z' id='path87316' sodipodi:nodetypes='ssssscccsssccssscccssccss' style='fill:#babdb6;fill-opacity:1;stroke:none'/>
+
+ </g>
+ <g inkscape:label='categories' transform='translate(-461.0002,-519)' inkscape:groupmode='layer' id='g4953' style='display:inline'/>
+ <g inkscape:label='actions' transform='translate(-461.0002,-519)' inkscape:groupmode='layer' id='layer12' style='display:inline'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/face-confused-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/face-confused-symbolic-ref.png
new file mode 100644
index 00000000..2ca0ee40
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/face-confused-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/face-confused-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/face-confused-symbolic.svg
new file mode 100644
index 00000000..f50b4ea4
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/face-confused-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='face-confused-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.2 r9819' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-paths='false' bordercolor='#666666' borderopacity='1' inkscape:current-layer='g71291' inkscape:cx='-109.23749' inkscape:cy='54.38778' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#555753' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1381' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='1600' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-542.00019,-538.9688)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-542.00019,-538.9688)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-542.00019,-538.9688)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-542.00019,-538.9688)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-542.00019,-538.9688)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-542.00019,-538.9688)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-542.00019,-538.9688)'>
+ <path inkscape:connector-curvature='0' d='m 550.00019,539.96875 c -3.86599,0 -7,3.13401 -7,7 0,3.86599 3.13401,7 7,7 3.86599,0 7,-3.13401 7,-7 0,-3.86599 -3.13401,-7 -7,-7 z m -2,4 c 0.55833,0 1.03125,0.47292 1.03125,1.03125 l 0,0.96875 c 0,0.55833 -0.47292,1 -1.03125,1 -0.55833,0 -1,-0.44167 -1,-1 l 0,-0.96875 c 0,-0.55833 0.44167,-1.03125 1,-1.03125 z m 4,0 c 0.55833,0 1,0.47292 1,1.03125 l 0,0.96875 c 0,0.55833 -0.44167,1 -1,1 -0.55833,0 -1,-0.44167 -1,-1 l 0,-0.96875 c 0,-0.55833 0.44167,-1.03125 1,-1.03125 z m -5.40637,3.8125 c 0.0644,-0.009 -0.27909,0.0131 -0.21225,0.0312 4.48078,-0.0312 1.44996,2.58157 6.58725,2.64342 0.26734,0.0725 0.41625,0.35766 0.34375,0.625 -0.0725,0.26736 -0.3264,0.41625 -0.59375,0.34375 -4.94757,-0.0138 -2.90625,-2.70587 -6.1875,-2.64337 -0.26734,-0.0725 -0.41625,-0.35766 -0.34375,-0.625 0.0544,-0.20051 0.21312,-0.34894 0.40625,-0.375 z' id='path6000' sodipodi:nodetypes='ssssssssssssssssssscccscccc' style='fill:#babdb6;fill-opacity:1;stroke:none'/>
+
+ </g>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-542.00019,-538.9688)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-542.00019,-538.9688)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/face-cool-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/face-cool-symbolic-ref.png
new file mode 100644
index 00000000..733f89b2
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/face-cool-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/face-cool-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/face-cool-symbolic.svg
new file mode 100644
index 00000000..288582da
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/face-cool-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='face-cool-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.2 r9819' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-paths='false' bordercolor='#666666' borderopacity='1' inkscape:current-layer='g71291' inkscape:cx='64.197859' inkscape:cy='21.978621' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#555753' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1381' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='1600' inkscape:window-y='27' inkscape:zoom='5.6568542'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-461,-538.99998)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-461,-538.99998)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-461,-538.99998)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-461,-538.99998)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-461,-538.99998)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-461,-538.99998)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-461,-538.99998)'>
+ <path inkscape:connector-curvature='0' d='m 469.0002,540 c -3.86599,0 -7,3.13401 -7,7 0,3.86599 3.13401,7 7,7 3.86599,0 7,-3.13401 7,-7 0,-3.86599 -3.13401,-7 -7,-7 z m -5.78125,4.03125 c 3.91256,-0.0377 7.97164,-1.6e-4 11.5625,0 0,1.642 -1.24971,2.96875 -2.78125,2.96875 -1.27537,0 -2.33255,-0.93056 -2.65625,-2.1875 l -0.6875,0 c -0.3237,1.25699 -1.38088,2.1875 -2.65625,2.1875 -1.53154,0 -2.78125,-1.3268 -2.78125,-2.96875 z m 0.78125,4.03125 c 0.71531,1.0744 2.23523,1.9375 5,1.9375 2.45227,0 4.21082,-0.75041 5,-1.9375 l 0,0.5 c 0,0.68098 -0.8379,2.40625 -5,2.40625 -3.88085,0 -5,-1.87374 -5,-2.40625 l 0,-0.5 z' id='path4894' style='fill:#babdb6;fill-opacity:1;stroke:none'/>
+
+ </g>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-461,-538.99998)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-461,-538.99998)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/face-crying-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/face-crying-symbolic-ref.png
new file mode 100644
index 00000000..1b49c106
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/face-crying-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/face-crying-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/face-crying-symbolic.svg
new file mode 100644
index 00000000..dc00fc96
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/face-crying-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='face-crying-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.2 r9819' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-paths='false' bordercolor='#666666' borderopacity='1' inkscape:current-layer='g71291' inkscape:cx='-95.802326' inkscape:cy='1.97864' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#555753' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1381' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='1600' inkscape:window-y='27' inkscape:zoom='5.6568542'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-621.00019,-519)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-621.00019,-519)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-621.00019,-519)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-621.00019,-519)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-621.00019,-519)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-621.00019,-519)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-621.00019,-519)'>
+
+ <path inkscape:connector-curvature='0' d='m 629.0002,520 c -3.86599,0 -7,3.13401 -7,7 0,3.86599 3.13401,7 7,7 3.86599,0 7,-3.13401 7,-7 0,-3.86599 -3.13401,-7 -7,-7 z m -2,4 c 0.55833,0 1.03125,0.40972 1.03125,0.875 l 0,0.78125 c 0,0.46528 -0.47292,0.84375 -1.03125,0.84375 -0.55833,0 -1,-0.37847 -1,-0.84375 l 0,-0.78125 c 0,-0.46528 0.44167,-0.875 1,-0.875 z m 4,0 c 0.55833,0 1,0.37848 1,0.84375 l 0,0.8125 c 0,0.46527 -0.44167,0.84375 -1,0.84375 -0.55833,0 -1,-0.37848 -1,-0.84375 l 0,-0.8125 c 0,-0.46527 0.44167,-0.84375 1,-0.84375 z m 1.75,2.28125 c 1.20777,0.44874 2.04627,0.93632 2.21875,1.5625 0.17247,0.62616 -0.30586,1.24159 -0.9375,1.25 -0.51878,0.007 -0.7686,-0.2154 -0.9375,-0.875 -0.16672,-0.66017 0.0828,-1.29237 -0.34375,-1.9375 z m -3.78125,2.6875 c 2.58832,0 3.96875,0.98014 3.96875,1.5625 l 0,0.53125 c -0.79224,-0.69651 -3.18687,-1 -3.96875,-1 -0.78187,0 -3.01841,-0.059 -3.96875,1 l 0,-0.53125 c 0,-0.74472 1.38044,-1.5625 3.96875,-1.5625 z' id='path4824' sodipodi:nodetypes='ssssssssssssssssssscssccsscscss' style='fill:#babdb6;fill-opacity:1;stroke:none;display:inline'/>
+ </g>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-621.00019,-519)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-621.00019,-519)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/face-devilish-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/face-devilish-symbolic-ref.png
new file mode 100644
index 00000000..eb6c3643
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/face-devilish-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/face-devilish-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/face-devilish-symbolic.svg
new file mode 100644
index 00000000..5f17e9b5
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/face-devilish-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='face-devilish-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.2 r9819' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-paths='false' bordercolor='#666666' borderopacity='1' inkscape:current-layer='g71291' inkscape:cx='-113.48169' inkscape:cy='38.1868' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#555753' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1381' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='1600' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-441.00021,-539)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-441.00021,-539)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-441.00021,-539)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-441.00021,-539)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-441.00021,-539)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-441.00021,-539)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-441.00021,-539)'>
+
+ <path inkscape:connector-curvature='0' d='m 449.0002,540 c -1.65216,0 -3.17769,0.57397 -4.375,1.53125 -1.13384,-0.44386 -2.09344,-0.94913 -2.6875,-1.46875 l -0.0937,0.59375 c -0.0334,0.27084 0.10323,1.51302 1.15625,2.75 -0.63172,1.05171 -1,2.27758 -1,3.59375 0,3.86599 3.13401,7 7,7 3.86599,0 7,-3.13401 7,-7 0,-1.29065 -0.35953,-2.49314 -0.96875,-3.53125 1.011,-1.21813 1.18917,-2.38943 1.15625,-2.65625 l -0.0937,-0.59375 c -0.57868,0.50616 -1.49864,0.97101 -2.59375,1.40625 -0.006,-0.005 -0.0256,0.005 -0.0312,0 -1.21509,-1.01518 -2.76196,-1.625 -4.4689,-1.625 z m -2,4 c 0.55833,0 1.03125,0.47292 1.03125,1.03125 l 0,0.96875 c 0,0.55833 -0.47292,1 -1.03125,1 -0.55833,0 -1,-0.44167 -1,-1 l 0,-0.96875 c 0,-0.55833 0.44167,-1.03125 1,-1.03125 z m 4,0 c 0.55833,0 1,0.47292 1,1.03125 l 0,0.96875 c 0,0.55833 -0.44167,1 -1,1 -0.55833,0 -1,-0.44167 -1,-1 l 0,-0.96875 c 0,-0.55833 0.44167,-1.03125 1,-1.03125 z m 2,4.97812 c -0.0291,0.34377 -0.92509,3.00323 -4,3.00938 -2.7886,0.006 -4,-2.55838 -4,-2.98438 z' id='path5619-4' sodipodi:nodetypes='sccccssscccccssssssssssssssscscc' style='fill:#babdb6;fill-opacity:1;stroke:none;display:inline'/>
+ </g>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-441.00021,-539)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-441.00021,-539)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/face-embarrassed-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/face-embarrassed-symbolic-ref.png
new file mode 100644
index 00000000..0e76479e
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/face-embarrassed-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/face-embarrassed-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/face-embarrassed-symbolic.svg
new file mode 100644
index 00000000..264b581c
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/face-embarrassed-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='face-embarrassed-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.2 r9819' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-paths='false' bordercolor='#666666' borderopacity='1' inkscape:current-layer='g71291' inkscape:cx='-334.48168' inkscape:cy='38.1868' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#555753' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1381' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='1600' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-662.0002,-539)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-662.0002,-539)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-662.0002,-539)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-662.0002,-539)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-662.0002,-539)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-662.0002,-539)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-662.0002,-539)'>
+
+ <path inkscape:connector-curvature='0' d='m 670.00022,540 c -3.86599,0 -7,3.13401 -7,7 0,3.86599 3.13401,7 7,7 3.86599,0 7,-3.13401 7,-7 0,-3.86599 -3.13401,-7 -7,-7 z m -2.46875,5.17678 c 0.73437,0 1.46875,0.44603 1.46875,1.3125 -1.5,-0.33848 -3.125,1.73294 -3,0 0.0625,-0.86647 0.79688,-1.3125 1.53125,-1.3125 z m 4.9375,0 c 0.73437,0 1.46875,0.44603 1.53125,1.3125 0.125,1.73294 -1.5,-0.33848 -3,0 0,-0.86647 0.73438,-1.3125 1.46875,-1.3125 z m -5.99908,2.55805 c 0.41493,0 0.75,0.33507 0.75,0.75 0,0.41493 -0.33507,0.75 -0.75,0.75 -0.41493,0 -0.75,-0.33507 -0.75,-0.75 0,-0.41493 0.33507,-0.75 0.75,-0.75 z m 7.01647,0 c 0.41493,0 0.75,0.33507 0.75,0.75 0,0.41493 -0.33507,0.75 -0.75,0.75 -0.41493,0 -0.75,-0.33507 -0.75,-0.75 0,-0.41493 0.33507,-0.75 0.75,-0.75 z m -4.09015,2.26249 1.17187,0 c 0.20621,0 0.54688,0.223 0.54688,0.5 0,0.277 -0.34067,0.51562 -0.54688,0.51562 l -1.17187,0 c -0.20621,0 -0.48438,-0.23862 -0.48438,-0.51562 0,-0.277 0.27817,-0.5 0.48438,-0.5 z' id='path7221' sodipodi:nodetypes='sssssscsssscssssssssssssssssss' style='fill:#babdb6;fill-opacity:1;stroke:none;display:inline'/>
+ </g>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-662.0002,-539)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-662.0002,-539)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/face-glasses-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/face-glasses-symbolic-ref.png
new file mode 100644
index 00000000..48141d5c
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/face-glasses-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/face-glasses-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/face-glasses-symbolic.svg
new file mode 100644
index 00000000..e331a951
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/face-glasses-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='face-glasses-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='g71291' inkscape:cx='-4.3795943' inkscape:cy='-11.936129' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1375' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-220px' originy='462px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-461.0002,-679)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-461.0002,-679)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-461.0002,-679)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-461.0002,-679)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-461.0002,-679)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-461.0002,-679)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-461.0002,-679)'>
+ <path inkscape:connector-curvature='0' d='m 469.0002,680 c -2.79099,0 -5.18831,1.63698 -6.3125,4 l 2.5625,0 c 0.35037,-0.58405 0.99227,-0.96875 1.71875,-0.96875 0.56579,0 1.07266,0.24358 1.4375,0.625 0.20065,-0.13245 0.41238,-0.15625 0.5625,-0.15625 0.16562,0 0.39413,0.0219 0.59375,0.15625 0.36484,-0.38142 0.87171,-0.625 1.4375,-0.625 0.72648,0 1.36838,0.3847 1.71875,0.96875 l 2.59375,0 c -1.12419,-2.36302 -3.52151,-4 -6.3125,-4 z m -2.03125,4.03125 c -0.56265,0 -1,0.43735 -1,1 l 0,0.96875 c 0,0.56265 0.43735,1 1,1 0.56265,0 1,-0.43735 1,-1 l 0,-0.96875 c 0,-0.56265 -0.43735,-1 -1,-1 z m 4.03125,0 c -0.56265,0 -1,0.43735 -1,1 l 0,0.96875 c 0,0.56265 0.43735,1 1,1 0.56265,0 1,-0.43735 1,-1 l 0,-0.96875 c 0,-0.56265 -0.43735,-1 -1,-1 z m -2.03125,0.78125 c 10e-4,0.009 -0.0322,0.0218 -0.0312,0.0312 0.006,0.0624 0.0312,0.12364 0.0312,0.1875 l 0,0.96875 c 0,1.09935 -0.90065,2 -2,2 -1.09935,0 -2,-0.90065 -2,-2 l 0,-0.96875 c 0,-0.0105 -1.6e-4,-0.0208 0,-0.0312 l -2.6875,0 c -0.18662,0.63065 -0.28125,1.30883 -0.28125,2 0,3.86599 3.13401,7 7,7 3.86599,0 7,-3.13401 7,-7 0,-0.69117 -0.0946,-1.36935 -0.28125,-2 l -2.71875,0 c 1.6e-4,0.0105 0,0.0207 0,0.0312 l 0,0.9688 c 0,1.09935 -0.90065,2 -2,2 -1.09935,0 -2,-0.90065 -2,-2 l 0,-0.96875 c 0,-0.042 -0.003,-0.0836 0,-0.125 -0.001,-0.0208 -0.001,-0.0417 0,-0.0625 -0.0109,-0.01 -0.0213,-0.0204 -0.0312,-0.0312 z m -4.96875,4.25 c 0.99656,0.6369 4.01648,0.9375 5,0.9375 0.98352,0 3.80457,0.0308 5,-0.9375 l 0,0.5 c 0,0.68098 -1.74415,1.40625 -5,1.40625 -3.25585,0 -5,-0.87374 -5,-1.40625 z' id='path8527' sodipodi:nodetypes='sccscscsccsssssssssssssssccsssssccsssccsssssccccscsssc' style='fill:#babdb6;fill-opacity:1;stroke:none'/>
+
+ </g>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-461.0002,-679)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-461.0002,-679)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/face-kiss-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/face-kiss-symbolic-ref.png
new file mode 100644
index 00000000..258d240f
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/face-kiss-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/face-kiss-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/face-kiss-symbolic.svg
new file mode 100644
index 00000000..eb77359e
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/face-kiss-symbolic.svg
@@ -0,0 +1,34 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='face-kiss-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.2 r9819' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-paths='false' bordercolor='#666666' borderopacity='1' inkscape:current-layer='g71291' inkscape:cx='-115.80232' inkscape:cy='1.97864' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#555753' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1381' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='1600' inkscape:window-y='27' inkscape:zoom='5.6568542'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-641.00019,-519)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-641.00019,-519)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-641.00019,-519)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-641.00019,-519)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-641.00019,-519)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-641.00019,-519)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-641.00019,-519)'>
+
+ <g id='g5238' transform='translate(19.999996,-18)'>
+ <path inkscape:connector-curvature='0' d='m 388,321 c -3.86599,0 -7,3.13401 -7,7 0,3.86599 3.13401,7 7,7 3.86599,0 7,-3.13401 7,-7 0,-3.86599 -3.13401,-7 -7,-7 z m -2.46875,4 c 0.73437,0 1.46875,0.22506 1.46875,1.09153 -2.56066,-0.60365 -2.41789,1.68874 -3,0.22097 -0.32026,-0.80753 0.79688,-1.3125 1.53125,-1.3125 z m 4.9375,0 c 0.73437,0 1.70462,0.46125 1.53125,1.3125 -0.31694,1.55616 -0.52773,-0.9572 -3,-0.22097 C 389,325.22506 389.73438,325 390.46875,325 z M 387,328 c 0.41039,-0.01 0.74927,0.13366 1.03125,0.34375 0.28192,-0.21009 0.65216,-0.3567 1.0625,-0.34375 0.63161,0.0199 0.90651,0.7599 0.9062,1.18745 -5.5e-4,0.77497 0.47532,0.76512 1,0.82812 -0.63413,0.15122 -0.98711,1.22486 -0.98438,1.76563 0.005,0.97211 -0.93028,1.2559 -2.01562,1.25 -1.08536,-0.004 -1.98715,-0.25121 -1.98437,-1.23437 10e-4,-0.40742 -0.35236,-1.59059 -1.03125,-1.76563 0.67889,-0.0931 1.01562,-0.24993 1.01562,-0.85938 0,-0.80891 0.52875,-1.16033 1.00005,-1.17182 z' id='path5202' sodipodi:nodetypes='sssssscsssscsscsscscscss' style='fill:#babdb6;fill-opacity:1;stroke:none' transform='translate(241.0002,217)'/>
+ <path inkscape:connector-curvature='0' d='m 630.00013,547.27423 c -0.16971,0.0801 -0.32084,0.16013 -0.322,0.27191 -0.0182,0.26976 -0.37424,0.48105 -0.67205,0.47943 -0.29781,-7.8e-4 -0.5939,-0.20967 -0.59392,-0.47943 7.8e-4,-0.11178 -0.11135,-0.18959 -0.27191,-0.27191 0.5291,-0.39533 1.25299,-0.33834 1.85988,0 z' id='path5217' sodipodi:nodetypes='cccccc' style='fill:#babdb6;fill-opacity:1;stroke:none'/>
+ </g>
+ </g>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-641.00019,-519)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-641.00019,-519)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/face-laugh-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/face-laugh-symbolic-ref.png
new file mode 100644
index 00000000..a425faa0
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/face-laugh-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/face-laugh-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/face-laugh-symbolic.svg
new file mode 100644
index 00000000..e440f4ff
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/face-laugh-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='face-laugh-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.2 r9819' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-paths='false' bordercolor='#666666' borderopacity='1' inkscape:current-layer='g71291' inkscape:cx='44.197667' inkscape:cy='21.94739' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#555753' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1381' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='1600' inkscape:window-y='27' inkscape:zoom='5.6568542'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-481.0002,-538.96875)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-481.0002,-538.96875)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-481.0002,-538.96875)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-481.0002,-538.96875)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-481.0002,-538.96875)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-481.0002,-538.96875)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-481.0002,-538.96875)'>
+
+ <path inkscape:connector-curvature='0' d='m 489.00019,539.96875 c -3.86599,0 -7,3.13401 -7,7 0,3.86599 3.13401,7 7,7 3.86599,0 7,-3.13401 7,-7 0,-3.86599 -3.13401,-7 -7,-7 z m -2.46875,3.71875 c 0.73437,0 1.46875,0.44603 1.46875,1.3125 -1.5,-0.33848 -3.125,1.73294 -3,0 0.0625,-0.86647 0.79688,-1.3125 1.53125,-1.3125 z m 4.9375,0 c 0.73437,0 1.46875,0.44603 1.53125,1.3125 0.125,1.73294 -1.5,-0.33848 -3,0 0,-0.86647 0.73438,-1.3125 1.46875,-1.3125 z M 484.00019,548 c 2,1.30345 7.98706,1.30345 10.03125,0 l -0.0312,0.53125 c -0.0364,0.42971 -0.99999,3.375 -5,3.40625 -3.99999,0.0312 -5,-2.78 -5,-3.3125 l 0,-0.625 z' id='path5785' style='fill:#babdb6;fill-opacity:1;stroke:none;display:inline'/>
+ </g>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-481.0002,-538.96875)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-481.0002,-538.96875)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/face-monkey-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/face-monkey-symbolic-ref.png
new file mode 100644
index 00000000..55a68ebd
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/face-monkey-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/face-monkey-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/face-monkey-symbolic.svg
new file mode 100644
index 00000000..5f0c3544
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/face-monkey-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='face-monkey-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.2 r9819' version='1.1' width='16.000017' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-paths='false' bordercolor='#666666' borderopacity='1' inkscape:current-layer='g71291' inkscape:cx='-18.85723' inkscape:cy='-171.08226' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#555753' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1381' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='1600' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-641.00018,-659)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-641.00018,-659)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-641.00018,-659)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-641.00018,-659)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-641.00018,-659)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-641.00018,-659)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-641.00018,-659)'>
+
+ <path inkscape:connector-curvature='0' d='m 648.84395,659.03125 c -1.22726,0.73385 -1.06237,1.63247 -0.90625,2.03125 -1.80729,0.26848 -3.54878,1.31123 -4.125,3.1875 -0.28347,-0.21168 -0.58797,-0.34375 -0.9375,-0.34375 -1.03385,0 -1.875,1.08269 -1.875,2.375 0,1.29231 0.84115,2.34375 1.875,2.34375 0.46667,0 0.88574,-0.21164 1.21875,-0.5625 2.719,-1.27361 7.09252,-1.46625 9.875,0.0312 0.31962,0.32225 0.71112,0.53125 1.15625,0.53125 1.03385,0 1.875,-1.05144 1.875,-2.34375 0,-1.29231 -0.84115,-2.375 -1.875,-2.375 -0.42839,0 -0.81111,0.19311 -1.125,0.5 -0.50745,-1.70199 -1.83978,-2.91021 -3.8125,-3.28125 -0.17036,-0.63874 -0.28432,-1.91587 1.625,-1.78125 -2.16948,-0.79311 -2.71875,1.625 -2.71875,1.625 -0.26551,-0.11722 -0.96537,-0.6383 -0.25,-1.9375 z m -1.375,5.03125 c 0.37988,0 0.71875,0.64637 0.71875,1.46875 0,0.82238 -0.33887,1.5 -0.71875,1.5 -0.37988,0 -0.65625,-0.67762 -0.65625,-1.5 0,-0.82238 0.27637,-1.46875 0.65625,-1.46875 z m 3,0 c 0.37988,0 0.71875,0.64637 0.71875,1.46875 0,0.82238 -0.33887,1.5 -0.71875,1.5 -0.37988,0 -0.65625,-0.67762 -0.65625,-1.5 0,-0.82238 0.27637,-1.46875 0.65625,-1.46875 z m -7.46875,0.90625 c 0.25587,0 0.47396,0.14945 0.65625,0.34375 -0.0332,0.52908 -0.0185,1.11829 0.125,1.75 -0.19168,0.29374 -0.45209,0.5 -0.78125,0.5 -0.57176,0 -1.03125,-0.56655 -1.03125,-1.28125 0,-0.7147 0.45949,-1.3125 1.03125,-1.3125 z m 12.03125,0 c 0.57182,0 1.0625,0.59772 1.0625,1.3125 0,0.71478 -0.49068,1.28125 -1.0625,1.28125 -0.37247,0 -0.65921,-0.26193 -0.84375,-0.625 0.055,-0.48001 0.0368,-0.93512 0,-1.375 0.18776,-0.35024 0.48432,-0.59375 0.84375,-0.59375 z' id='path9123' style='fill:#babdb6;fill-opacity:1;stroke:none;display:inline'/>
+ <path inkscape:connector-curvature='0' d='m 648.96895,667.96875 c -3.88002,0 -7.03125,1.567 -7.03125,3.5 0,1.933 3.15123,3.5 7.03125,3.5 3.88002,0 7.03125,-1.567 7.03125,-3.5 0,-1.933 -3.15123,-3.5 -7.03125,-3.5 z m -4.96875,2.0625 c 0,0 0.36695,2.03125 4.96875,2.03125 4.38662,0 5.09375,-2 5.09375,-2 0,0 -0.0395,2.97659 -5.09375,2.9375 -5.1481,-0.0398 -4.96875,-2.96875 -4.96875,-2.96875 z' id='path8939' sodipodi:nodetypes='ssssscscsc' style='color:#000000;fill:#babdb6;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new'/>
+ </g>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-641.00018,-659)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-641.00018,-659)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/face-plain-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/face-plain-symbolic-ref.png
new file mode 100644
index 00000000..16c3ac2a
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/face-plain-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/face-plain-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/face-plain-symbolic.svg
new file mode 100644
index 00000000..fe3275e9
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/face-plain-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='face-plain-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.2 r9819' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-paths='false' bordercolor='#666666' borderopacity='1' inkscape:current-layer='g71291' inkscape:cx='-75.802337' inkscape:cy='1.9786406' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#555753' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1381' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='1600' inkscape:window-y='27' inkscape:zoom='5.6568542'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-601.0002,-519)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-601.0002,-519)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-601.0002,-519)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-601.0002,-519)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-601.0002,-519)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-601.0002,-519)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-601.0002,-519)'>
+ <path inkscape:connector-curvature='0' d='m 609.0002,520 c -3.86599,0 -7,3.13401 -7,7 0,3.86599 3.13401,7 7,7 3.86599,0 7,-3.13401 7,-7 0,-3.86599 -3.13401,-7 -7,-7 z m -2,4 c 0.55833,0 1.03125,0.47292 1.03125,1.03125 l 0,0.96875 c 0,0.55833 -0.47292,1 -1.03125,1 -0.55833,0 -1,-0.44167 -1,-1 l 0,-0.96875 c 0,-0.55833 0.44167,-1.03125 1,-1.03125 z m 4,0 c 0.55833,0 1,0.47292 1,1.03125 l 0,0.96875 c 0,0.55833 -0.44167,1 -1,1 -0.55833,0 -1,-0.44167 -1,-1 l 0,-0.96875 c 0,-0.55833 0.44167,-1.03125 1,-1.03125 z m -6.5,5 9,0 c 0.277,0 0.5,0.223 0.5,0.5 0,0.277 -0.223,0.5 -0.5,0.5 l -9,0 c -0.277,0 -0.5,-0.223 -0.5,-0.5 0,-0.277 0.223,-0.5 0.5,-0.5 z' id='path4930' style='fill:#babdb6;fill-opacity:1;stroke:none'/>
+
+ </g>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-601.0002,-519)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-601.0002,-519)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/face-raspberry-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/face-raspberry-symbolic-ref.png
new file mode 100644
index 00000000..60be59e0
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/face-raspberry-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/face-raspberry-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/face-raspberry-symbolic.svg
new file mode 100644
index 00000000..0e883218
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/face-raspberry-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='face-raspberry-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.2 r9819' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-paths='false' bordercolor='#666666' borderopacity='1' inkscape:current-layer='g71291' inkscape:cx='-55.802316' inkscape:cy='21.97864' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#555753' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1381' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='1600' inkscape:window-y='27' inkscape:zoom='5.6568542'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-581.00018,-539)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-581.00018,-539)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-581.00018,-539)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-581.00018,-539)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-581.00018,-539)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-581.00018,-539)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-581.00018,-539)'>
+ <path inkscape:connector-curvature='0' d='m 589.00018,540 c -3.86599,0 -7,3.13401 -7,7 0,3.86599 3.13401,7 7,7 3.86599,0 7,-3.13401 7,-7 0,-3.86599 -3.13401,-7 -7,-7 z m -2,4 c 0.55833,0 1.03125,0.47292 1.03125,1.03125 l 0,0.96875 c 0,0.55833 -0.47292,1 -1.03125,1 -0.55833,0 -1,-0.44167 -1,-1 l 0,-0.96875 c 0,-0.55833 0.44167,-1.03125 1,-1.03125 z m 4,0 c 0.55833,0 1,0.47292 1,1.03125 l 0,0.96875 c 0,0.55833 -0.44167,1 -1,1 -0.55833,0 -1,-0.44167 -1,-1 l 0,-0.96875 c 0,-0.55833 0.44167,-1.03125 1,-1.03125 z m -7,4.0625 c 0.99656,0.6369 4.01648,0.9375 5,0.9375 0.49176,0 1.42862,0.0145 2.40625,-0.0937 0.97763,-0.10827 1.99604,-0.35958 2.59375,-0.84375 l 0,0.5 c 0,0.44149 -0.75339,0.91906 -2.15625,1.1875 l 0.25,0.53125 c 0.27902,0.60331 0.0833,1.27559 -0.4375,1.53125 l -0.25,0.125 c -0.52084,0.25561 -1.17494,-0.0293 -1.46875,-0.625 l -0.625,-1.28125 c -0.0171,-0.0347 -0.0191,-0.0351 -0.0312,-0.0625 -0.0961,10e-4 -0.18233,0 -0.28125,0 -3.25585,0 -5,-0.87374 -5,-1.40625 l 0,-0.5 z' id='path6188' style='fill:#babdb6;fill-opacity:1;stroke:none'/>
+
+ </g>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-581.00018,-539)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-581.00018,-539)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/face-sad-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/face-sad-symbolic-ref.png
new file mode 100644
index 00000000..d9c5901a
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/face-sad-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/face-sad-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/face-sad-symbolic.svg
new file mode 100644
index 00000000..f8761df0
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/face-sad-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:svg='http://www.w3.org/2000/svg' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' sodipodi:docname='face-sad-symbolic.svg' version='1.1' inkscape:version='0.48.1 r9760' height='16' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:cy='106.97802' pagecolor='#555753' borderopacity='1' showborder='false' inkscape:bbox-paths='false' guidetolerance='10' inkscape:object-paths='true' inkscape:window-width='1508' showguides='true' inkscape:object-nodes='true' inkscape:snap-bbox='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:snap-nodes='false' bordercolor='#666666' objecttolerance='10' id='namedview88' showgrid='false' inkscape:window-maximized='0' inkscape:window-x='1705' inkscape:snap-global='true' inkscape:window-y='310' gridtolerance='10' inkscape:window-height='1060' inkscape:snap-to-guides='true' inkscape:current-layer='g71291' inkscape:snap-bbox-midpoints='false' inkscape:zoom='1' inkscape:cx='19.000196' inkscape:snap-grids='true' inkscape:pageopacity='1'>
+ <inkscape:grid spacingx='1px' spacingy='1px' id='grid4866' empspacing='2' enabled='true' type='xygrid' snapvisiblegridlinesonly='true' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:label='status' transform='translate(-461.0002,-519)' inkscape:groupmode='layer' id='layer9' style='display:inline'/>
+ <g inkscape:label='devices' transform='translate(-461.0002,-519)' inkscape:groupmode='layer' id='layer10'/>
+ <g inkscape:label='apps' transform='translate(-461.0002,-519)' inkscape:groupmode='layer' id='layer11'/>
+ <g inkscape:label='places' transform='translate(-461.0002,-519)' inkscape:groupmode='layer' id='layer13'/>
+ <g inkscape:label='mimetypes' transform='translate(-461.0002,-519)' inkscape:groupmode='layer' id='layer14'/>
+ <g inkscape:label='emblems' transform='translate(-461.0002,-519)' inkscape:groupmode='layer' id='layer15' style='display:inline'/>
+ <g inkscape:label='emotes' transform='translate(-461.0002,-519)' inkscape:groupmode='layer' id='g71291' style='display:inline'>
+ <path inkscape:connector-curvature='0' d='m 469.0004,520.00002 c -3.86599,0 -7,3.13401 -7,7 0,3.86599 3.13401,7 7,7 3.86599,0 7,-3.13401 7,-7 0,-3.86599 -3.13401,-7 -7,-7 z m -2,4 c 0.55833,0 1.03125,0.47292 1.03125,1.03125 l 0,0.96875 c 0,0.55833 -0.47292,1 -1.03125,1 -0.55833,0 -1,-0.44167 -1,-1 l 0,-0.96875 c 0,-0.55833 0.44167,-1.03125 1,-1.03125 z m 4,0 c 0.55833,0 1,0.47292 1,1.03125 l 0,0.96875 c 0,0.55833 -0.44167,1 -1,1 -0.55833,0 -1,-0.44167 -1,-1 l 0,-0.96875 c 0,-0.55833 0.44167,-1.03125 1,-1.03125 z m 3,5.94286 c -0.99656,-0.6369 -4.01648,-0.91724 -5,-0.91724 -0.98352,0 -3.80457,-0.0511 -5,0.91724 l 0,-0.5 c 0,-0.68098 1.74415,-1.4043 5,-1.4043 3.25585,0 5,0.87179 5,1.4043 z' id='path71360' sodipodi:nodetypes='sssssssssssssssssssczcczsc' style='fill:#babdb6;fill-opacity:1;stroke:none'/>
+
+ </g>
+ <g inkscape:label='categories' transform='translate(-461.0002,-519)' inkscape:groupmode='layer' id='g4953' style='display:inline'/>
+ <g inkscape:label='actions' transform='translate(-461.0002,-519)' inkscape:groupmode='layer' id='layer12' style='display:inline'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/face-shutmouth-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/face-shutmouth-symbolic-ref.png
new file mode 100644
index 00000000..a8ec44d7
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/face-shutmouth-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/face-shutmouth-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/face-shutmouth-symbolic.svg
new file mode 100644
index 00000000..0bc02cbe
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/face-shutmouth-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='face-shutmouth-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.2 r9819' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-paths='false' bordercolor='#666666' borderopacity='1' inkscape:current-layer='g71291' inkscape:cx='-193.48166' inkscape:cy='38.1868' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#555753' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1381' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='1600' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-521.00018,-539)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-521.00018,-539)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-521.00018,-539)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-521.00018,-539)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-521.00018,-539)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-521.00018,-539)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-521.00018,-539)'>
+ <path inkscape:connector-curvature='0' d='m 529.0002,540 c -3.86599,0 -7,3.13401 -7,7 0,3.86599 3.13401,7 7,7 3.86599,0 7,-3.13401 7,-7 0,-3.86599 -3.13401,-7 -7,-7 z m -2,4 c 0.55833,0 1.03125,0.47292 1.03125,1.03125 l 0,0.96875 c 0,0.55833 -0.47292,1 -1.03125,1 -0.55833,0 -1,-0.44167 -1,-1 l 0,-0.96875 c 0,-0.55833 0.44167,-1.03125 1,-1.03125 z m 4,0 c 0.55833,0 1,0.47292 1,1.03125 l 0,0.96875 c 0,0.55833 -0.44167,1 -1,1 -0.55833,0 -1,-0.44167 -1,-1 l 0,-0.96875 c 0,-0.55833 0.44167,-1.03125 1,-1.03125 z m -6,4 4,1 4,-1 c 0.0825,0.59047 -0.16081,1.05401 -0.67132,1.16783 l -1.32868,0.33217 1.30883,0.32721 c 0.71468,0.1915 0.69117,0.74919 0.69117,1.17279 l -4,-1 -4,1 c -0.0655,-0.63125 0.0374,-0.98324 0.52023,-1.13006 L 527.0002,549.5 525.49607,549.16498 C 525.02156,549.03702 524.91706,548.48377 525.0002,548 z' id='path5954' sodipodi:nodetypes='sssssssssssssssssssccccccccccccc' style='fill:#babdb6;fill-opacity:1;stroke:none'/>
+
+ </g>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-521.00018,-539)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-521.00018,-539)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/face-sick-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/face-sick-symbolic-ref.png
new file mode 100644
index 00000000..b2691912
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/face-sick-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/face-sick-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/face-sick-symbolic.svg
new file mode 100644
index 00000000..0419a4e8
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/face-sick-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='face-sick-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.2 r9819' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-paths='false' bordercolor='#666666' borderopacity='1' inkscape:current-layer='g71291' inkscape:cx='-229.23748' inkscape:cy='34.41898' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#555753' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1381' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='1600' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-662.00018,-519)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-662.00018,-519)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-662.00018,-519)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-662.00018,-519)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-662.00018,-519)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-662.00018,-519)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-662.00018,-519)'>
+ <path inkscape:connector-curvature='0' d='m 670.0002,520 c -3.86599,0 -7,3.13401 -7,7 0,3.86599 3.13401,7 7,7 3.86599,0 7,-3.13401 7,-7 0,-3.86599 -3.13401,-7 -7,-7 z m -3.6875,3.6875 c 0.0418,0.003 0.0839,0.007 0.125,0.0312 l 1.125,0.65625 1.15625,-0.65625 c 0.16541,-0.0917 0.34038,-0.0211 0.40625,0.15625 0.0659,0.17731 -0.0221,0.40825 -0.1875,0.5 l -0.71875,0.40625 0.71875,0.40625 c 0.16421,0.0939 0.22441,0.29229 0.15625,0.46875 -0.0683,0.17645 -0.24204,0.21885 -0.40625,0.125 l -1.125,-0.625 -1.15625,0.625 c -0.16541,0.0918 -0.34036,0.0523 -0.40625,-0.125 -0.0659,-0.17731 0.0221,-0.40825 0.1875,-0.5 l 0.6875,-0.40625 -0.6875,-0.375 c -0.16421,-0.0939 -0.25566,-0.32355 -0.1875,-0.5 0.0512,-0.13233 0.1874,-0.20014 0.3125,-0.1875 z m 5.15625,0 c 0.0418,0.003 0.0839,0.007 0.125,0.0312 l 1.125,0.65625 1.15625,-0.65625 c 0.16541,-0.0917 0.34038,-0.0211 0.40625,0.15625 0.0659,0.17731 -0.0221,0.40825 -0.1875,0.5 l -0.71875,0.40625 0.71875,0.40625 c 0.16421,0.0939 0.25566,0.29229 0.1875,0.46875 -0.0683,0.17645 -0.27329,0.21885 -0.4375,0.125 l -1.125,-0.65625 -1.15625,0.65625 c -0.16541,0.0918 -0.34036,0.0523 -0.40625,-0.125 -0.0659,-0.17731 0.0221,-0.40825 0.1875,-0.5 l 0.71875,-0.40625 -0.71875,-0.40625 c -0.16421,-0.0939 -0.25566,-0.2923 -0.1875,-0.46875 0.0512,-0.13233 0.1874,-0.20014 0.3125,-0.1875 z m -4.34375,4.34375 c 0.60381,-0.0539 1.26781,0.0911 1.875,0.53125 0.34921,0.22009 0.41248,0.27376 1,0.34375 0.15925,0.0555 0.60706,-0.041 1,-0.34375 0.28067,-0.20469 0.56128,-0.29566 0.84375,-0.375 1.30927,-0.36774 2.57407,0.4362 3.15625,1.25 l 0,0.5 c -0.51128,-0.28582 -1.06053,-0.59799 -1.625,-0.78125 l 0.46875,0.9375 c 0.32788,0.64742 0.13224,1.39897 -0.4375,1.6875 -0.56975,0.28853 -1.29712,-0.009 -1.625,-0.65625 l -0.59375,-1.15625 c -0.051,-0.1008 -0.0675,-0.20871 -0.0937,-0.3125 -0.0265,0.0104 -0.0709,0.0278 -0.0937,0.0312 -0.54153,0.31352 -1.55932,0.19637 -2,0 -0.91691,-0.43721 -0.90913,-0.66739 -1.53125,-0.6875 -0.85242,0.0189 -1.84336,0.39879 -2.46875,0.9375 l 0,-0.5 c 0.26351,-0.67866 1.11865,-1.3165 2.125,-1.40625 z' id='path7113' style='fill:#babdb6;fill-opacity:1;stroke:none;display:inline;overflow:visible'/>
+
+ </g>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-662.00018,-519)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-662.00018,-519)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/face-smile-big-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/face-smile-big-symbolic-ref.png
new file mode 100644
index 00000000..a0b37c43
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/face-smile-big-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/face-smile-big-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/face-smile-big-symbolic.svg
new file mode 100644
index 00000000..5d427afd
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/face-smile-big-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='face-smile-big-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.2 r9819' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-paths='false' bordercolor='#666666' borderopacity='1' inkscape:current-layer='g71291' inkscape:cx='-15.802334' inkscape:cy='1.94739' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#555753' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1381' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='1600' inkscape:window-y='27' inkscape:zoom='5.6568542'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-541.0002,-518.96875)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-541.0002,-518.96875)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-541.0002,-518.96875)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-541.0002,-518.96875)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-541.0002,-518.96875)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-541.0002,-518.96875)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-541.0002,-518.96875)'>
+
+ <path inkscape:connector-curvature='0' d='m 549.00019,519.96875 c -3.86599,0 -7,3.13401 -7,7 0,3.86599 3.13401,7 7,7 3.86599,0 7,-3.13401 7,-7 0,-3.86599 -3.13401,-7 -7,-7 z m -2,4 c 0.55833,0 1.03125,0.47292 1.03125,1.03125 l 0,0.96875 c 0,0.55833 -0.47292,1 -1.03125,1 -0.55833,0 -1,-0.44167 -1,-1 l 0,-0.96875 c 0,-0.55833 0.44167,-1.03125 1,-1.03125 z m 4,0 c 0.55833,0 1,0.47292 1,1.03125 l 0,0.96875 c 0,0.55833 -0.44167,1 -1,1 -0.55833,0 -1,-0.44167 -1,-1 l 0,-0.96875 c 0,-0.55833 0.44167,-1.03125 1,-1.03125 z m -7,4.03125 c 2,1.30345 7.98706,1.30345 10.03125,0 l -0.0312,0.53125 c -0.0364,0.42971 -0.99999,3.375 -5,3.40625 -3.99999,0.0312 -5,-2.78 -5,-3.3125 l 0,-0.625 z' id='path10549' style='fill:#babdb6;fill-opacity:1;stroke:none;display:inline'/>
+ </g>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-541.0002,-518.96875)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-541.0002,-518.96875)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/face-smile-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/face-smile-symbolic-ref.png
new file mode 100644
index 00000000..0ccbf876
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/face-smile-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/face-smile-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/face-smile-symbolic.svg
new file mode 100644
index 00000000..4334750c
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/face-smile-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:svg='http://www.w3.org/2000/svg' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' sodipodi:docname='face-smile-symbolic.svg' version='1.1' inkscape:version='0.48.1 r9760' height='16' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:cy='106.97802' pagecolor='#555753' borderopacity='1' showborder='false' inkscape:bbox-paths='false' guidetolerance='10' inkscape:object-paths='true' inkscape:window-width='1508' showguides='true' inkscape:object-nodes='true' inkscape:snap-bbox='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:snap-nodes='false' bordercolor='#666666' objecttolerance='10' id='namedview88' showgrid='false' inkscape:window-maximized='0' inkscape:window-x='1705' inkscape:snap-global='true' inkscape:window-y='310' gridtolerance='10' inkscape:window-height='1060' inkscape:snap-to-guides='true' inkscape:current-layer='g71291' inkscape:snap-bbox-midpoints='false' inkscape:zoom='1' inkscape:cx='39.0002' inkscape:snap-grids='true' inkscape:pageopacity='1'>
+ <inkscape:grid spacingx='1px' spacingy='1px' id='grid4866' empspacing='2' enabled='true' type='xygrid' snapvisiblegridlinesonly='true' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:label='status' transform='translate(-441.0002,-519)' inkscape:groupmode='layer' id='layer9' style='display:inline'/>
+ <g inkscape:label='devices' transform='translate(-441.0002,-519)' inkscape:groupmode='layer' id='layer10'/>
+ <g inkscape:label='apps' transform='translate(-441.0002,-519)' inkscape:groupmode='layer' id='layer11'/>
+ <g inkscape:label='places' transform='translate(-441.0002,-519)' inkscape:groupmode='layer' id='layer13'/>
+ <g inkscape:label='mimetypes' transform='translate(-441.0002,-519)' inkscape:groupmode='layer' id='layer14'/>
+ <g inkscape:label='emblems' transform='translate(-441.0002,-519)' inkscape:groupmode='layer' id='layer15' style='display:inline'/>
+ <g inkscape:label='emotes' transform='translate(-441.0002,-519)' inkscape:groupmode='layer' id='g71291' style='display:inline'>
+ <path inkscape:connector-curvature='0' d='m 449.0004,520.00002 c -3.86599,0 -7,3.13401 -7,7 0,3.86599 3.13401,7 7,7 3.86599,0 7,-3.13401 7,-7 0,-3.86599 -3.13401,-7 -7,-7 z m -2,4 c 0.55833,0 1.03125,0.47292 1.03125,1.03125 l 0,0.96875 c 0,0.55833 -0.47292,1 -1.03125,1 -0.55833,0 -1,-0.44167 -1,-1 l 0,-0.96875 c 0,-0.55833 0.44167,-1.03125 1,-1.03125 z m 4,0 c 0.55833,0 1,0.47292 1,1.03125 l 0,0.96875 c 0,0.55833 -0.44167,1 -1,1 -0.55833,0 -1,-0.44167 -1,-1 l 0,-0.96875 c 0,-0.55833 0.44167,-1.03125 1,-1.03125 z m -7,4.06981 c 0.99656,0.6369 4.01648,0.91724 5,0.91724 0.98352,0 3.80457,0.0511 5,-0.91724 l 0,0.5 c 0,0.68098 -1.74415,1.4043 -5,1.4043 -3.25585,0 -5,-0.87179 -5,-1.4043 z' id='path5253' sodipodi:nodetypes='sssssssssssssssssssczcczsc' style='fill:#babdb6;fill-opacity:1;stroke:none'/>
+
+ </g>
+ <g inkscape:label='categories' transform='translate(-441.0002,-519)' inkscape:groupmode='layer' id='g4953' style='display:inline'/>
+ <g inkscape:label='actions' transform='translate(-441.0002,-519)' inkscape:groupmode='layer' id='layer12' style='display:inline'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/face-smirk-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/face-smirk-symbolic-ref.png
new file mode 100644
index 00000000..485fce78
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/face-smirk-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/face-smirk-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/face-smirk-symbolic.svg
new file mode 100644
index 00000000..008b2a59
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/face-smirk-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='face-smirk-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.2 r9819' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-paths='false' bordercolor='#666666' borderopacity='1' inkscape:current-layer='g71291' inkscape:cx='-35.849484' inkscape:cy='22.16619' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#555753' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1381' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='1600' inkscape:window-y='27' inkscape:zoom='5.6568542'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-561.04735,-539.18755)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-561.04735,-539.18755)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-561.04735,-539.18755)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-561.04735,-539.18755)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-561.04735,-539.18755)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-561.04735,-539.18755)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-561.04735,-539.18755)'>
+ <path inkscape:connector-curvature='0' d='m 569.0627,540.1875 c -3.86599,0 -7,3.13401 -7,7 0,3.86599 3.13401,7 7,7 3.86599,0 7,-3.13401 7,-7 0,-3.86599 -3.13401,-7 -7,-7 z m -2,4 c 0.55833,0 1.03125,0.47292 1.03125,1.03125 l 0,0.96875 c 0,0.55833 -0.47292,1 -1.03125,1 -0.55833,0 -1,-0.44167 -1,-1 l 0,-0.96875 c 0,-0.55833 0.44167,-1.03125 1,-1.03125 z m 4,0 c 0.55833,0 1,0.47292 1,1.03125 l 0,0.96875 c 0,0.55833 -0.44167,1 -1,1 -0.55833,0 -1,-0.44167 -1,-1 l 0,-0.96875 c 0,-0.55833 0.44167,-1.03125 1,-1.03125 z m -6.41236,2.71875 c 0.77942,3.30615 4.69296,4.43234 7.7053,3.28697 0.007,0.59795 -0.19508,1.09717 -1.15444,1.28594 -2.16551,0.4261 -5.16082,-0.14239 -6.68,-2.59331 -0.6661,-1.07464 -0.12703,-1.68512 0.12914,-1.97969 z' id='path6081' sodipodi:nodetypes='sssssssssssssssssssccsscc' style='fill:#babdb6;fill-opacity:1;stroke:none'/>
+
+ </g>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-561.04735,-539.18755)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-561.04735,-539.18755)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/face-surprise-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/face-surprise-symbolic-ref.png
new file mode 100644
index 00000000..c5874908
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/face-surprise-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/face-surprise-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/face-surprise-symbolic.svg
new file mode 100644
index 00000000..6539f6ad
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/face-surprise-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='face-surprise-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='g71291' inkscape:cx='-1.2142766' inkscape:cy='72.03105' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1373' inkscape:window-maximized='0' inkscape:window-width='1279' inkscape:window-x='1279' inkscape:window-y='27' inkscape:zoom='1.4142136'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-300px' originy='422px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-541.0002,-639)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-541.0002,-639)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-541.0002,-639)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-541.0002,-639)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-541.0002,-639)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-541.0002,-639)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-541.0002,-639)'>
+
+ <path inkscape:connector-curvature='0' d='m 549.00022,640 c -3.86599,0 -7,3.13401 -7,7 0,3.86599 3.13401,7 7,7 3.86599,0 7,-3.13401 7,-7 0,-3.86599 -3.13401,-7 -7,-7 z m -2,4 c 0.55833,0 1.03125,0.47292 1.03125,1.03125 l 0,0.96875 c 0,0.55833 -0.47292,1 -1.03125,1 -0.55833,0 -1,-0.44167 -1,-1 l 0,-0.96875 c 0,-0.55833 0.44167,-1.03125 1,-1.03125 z m 4,0 c 0.55833,0 1,0.47292 1,1.03125 l 0,0.96875 c 0,0.55833 -0.44167,1 -1,1 -0.55833,0 -1,-0.44167 -1,-1 l 0,-0.96875 c 0,-0.55833 0.44167,-1.03125 1,-1.03125 z m -2,4.59375 c 1.05921,0 1.92914,0.9211 1.9375,2.03125 0,1.11641 -0.87235,2.03125 -1.9375,2.03125 -1.06515,0 -1.9375,-0.91484 -1.9375,-2.03125 0,-1.11641 0.87235,-2.03125 1.9375,-2.03125 z' id='path71360-4' style='fill:#babdb6;fill-opacity:1;stroke:none;display:inline'/>
+ </g>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-541.0002,-639)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-541.0002,-639)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/face-tired-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/face-tired-symbolic-ref.png
new file mode 100644
index 00000000..46f3911c
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/face-tired-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/face-tired-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/face-tired-symbolic.svg
new file mode 100644
index 00000000..558cdf80
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/face-tired-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='face-tired-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.2 r9819' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-paths='false' bordercolor='#666666' borderopacity='1' inkscape:current-layer='g71291' inkscape:cx='-75.802316' inkscape:cy='21.97864' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#555753' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1381' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='1600' inkscape:window-y='27' inkscape:zoom='5.6568542'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-601.00018,-539)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-601.00018,-539)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-601.00018,-539)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-601.00018,-539)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-601.00018,-539)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-601.00018,-539)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-601.00018,-539)'>
+ <path inkscape:connector-curvature='0' d='m 609.00018,540 c -3.86599,0 -7,3.13401 -7,7 0,3.86599 3.13401,7 7,7 3.86599,0 7,-3.13401 7,-7 0,-3.86599 -3.13401,-7 -7,-7 z m -1.375,5.75 c 0.18146,-0.0534 0.34945,0.0626 0.375,0.25 0.0256,0.18743 -0.0998,0.3841 -0.28125,0.4375 l -2.78125,0.8125 c -0.18146,0.0534 -0.34945,-0.0313 -0.375,-0.21875 -0.0256,-0.18743 0.0998,-0.3841 0.28125,-0.4375 l 2.78125,-0.84375 z m 2.625,0 c 0.0415,-0.006 0.0796,-0.0134 0.125,0 l 2.78125,0.84375 c 0.18146,0.0534 0.3068,0.25007 0.28125,0.4375 -0.0256,0.18743 -0.19354,0.27215 -0.375,0.21875 l -2.78125,-0.8125 c -0.18146,-0.0534 -0.3068,-0.25007 -0.28125,-0.4375 0.0192,-0.14057 0.12537,-0.2334 0.25,-0.25 z m -4.84375,3.25 7.1875,0 c 0.2216,0 0.40625,0.223 0.40625,0.5 0,0.277 -0.18465,0.5 -0.40625,0.5 l -7.1875,0 c -0.2216,0 -0.40625,-0.223 -0.40625,-0.5 0,-0.277 0.18465,-0.5 0.40625,-0.5 z' id='path6411' style='fill:#babdb6;fill-opacity:1;stroke:none'/>
+
+ </g>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-601.00018,-539)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-601.00018,-539)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/face-uncertain-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/face-uncertain-symbolic-ref.png
new file mode 100644
index 00000000..9d3f6d26
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/face-uncertain-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/face-uncertain-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/face-uncertain-symbolic.svg
new file mode 100644
index 00000000..c5b07844
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/face-uncertain-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='face-uncertain-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.2 r9819' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-paths='false' bordercolor='#666666' borderopacity='1' inkscape:current-layer='g71291' inkscape:cx='24.197663' inkscape:cy='21.978645' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#555753' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1381' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='1600' inkscape:window-y='27' inkscape:zoom='5.6568542'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-501.0002,-539)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-501.0002,-539)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-501.0002,-539)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-501.0002,-539)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-501.0002,-539)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-501.0002,-539)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-501.0002,-539)'>
+ <path inkscape:connector-curvature='0' d='m 509.0002,540 c -3.86599,0 -7,3.13401 -7,7 0,3.86599 3.13401,7 7,7 3.86599,0 7,-3.13401 7,-7 0,-3.86599 -3.13401,-7 -7,-7 z m -2,4 c 0.55833,0 1.03125,0.47292 1.03125,1.03125 l 0,0.96875 c 0,0.55833 -0.47292,1 -1.03125,1 -0.55833,0 -1,-0.44167 -1,-1 l 0,-0.96875 c 0,-0.55833 0.44167,-1.03125 1,-1.03125 z m 4,0 c 0.55833,0 1,0.47292 1,1.03125 l 0,0.96875 c 0,0.55833 -0.44167,1 -1,1 -0.55833,0 -1,-0.44167 -1,-1 l 0,-0.96875 c 0,-0.55833 0.44167,-1.03125 1,-1.03125 z m -6,4 8,2 0,1 -8,-2 0,-1 z' id='path5861' style='fill:#babdb6;fill-opacity:1;stroke:none'/>
+
+ </g>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-501.0002,-539)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-501.0002,-539)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/face-wink-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/face-wink-symbolic-ref.png
new file mode 100644
index 00000000..149b77f0
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/face-wink-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/face-wink-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/face-wink-symbolic.svg
new file mode 100644
index 00000000..d5349d80
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/face-wink-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='face-wink-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.2 r9819' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-paths='false' bordercolor='#666666' borderopacity='1' inkscape:current-layer='g71291' inkscape:cx='-35.802138' inkscape:cy='1.9786206' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#555753' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1381' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='1600' inkscape:window-y='27' inkscape:zoom='5.6568542'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-561,-518.99998)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-561,-518.99998)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-561,-518.99998)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-561,-518.99998)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-561,-518.99998)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-561,-518.99998)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-561,-518.99998)'>
+ <path inkscape:connector-curvature='0' d='m 569.0002,520 c -3.86599,0 -7,3.13401 -7,7 0,3.86599 3.13401,7 7,7 3.86599,0 7,-3.13401 7,-7 0,-3.86599 -3.13401,-7 -7,-7 z m -2,4 c 0.55833,0 1.03125,0.47292 1.03125,1.03125 l 0,0.96875 c 0,0.55833 -0.47292,1 -1.03125,1 -0.55833,0 -1,-0.44167 -1,-1 l 0,-0.96875 c 0,-0.55833 0.44167,-1.03125 1,-1.03125 z m 3.4375,1 0.90625,0 c 0.5224,0 0.96875,0.21617 0.96875,0.5 0,0.28382 -0.44635,0.5 -0.96875,0.5 l -0.90625,0 c -0.52241,0 -0.9375,-0.21618 -0.9375,-0.5 0,-0.28383 0.41509,-0.5 0.9375,-0.5 z m -6.4375,3.0625 c 0.71531,1.0744 2.23523,1.9375 5,1.9375 2.45227,0 4.21082,-0.75041 5,-1.9375 l 0,0.5 c 0,0.68098 -0.8379,2.40625 -5,2.40625 -3.88085,0 -5,-1.87374 -5,-2.40625 l 0,-0.5 z' id='path4734' style='fill:#babdb6;fill-opacity:1;stroke:none'/>
+
+ </g>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-561,-518.99998)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-561,-518.99998)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/face-worried-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/face-worried-symbolic-ref.png
new file mode 100644
index 00000000..0e0ca124
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/face-worried-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/face-worried-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/face-worried-symbolic.svg
new file mode 100644
index 00000000..59ef7d59
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/face-worried-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg sodipodi:docname='face-worried-symbolic.svg' xmlns:cc='http://creativecommons.org/ns#' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:svg='http://www.w3.org/2000/svg' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns='http://www.w3.org/2000/svg' width='16' xmlns:dc='http://purl.org/dc/elements/1.1/' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' version='1.1' inkscape:version='0.48.1 r9760'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:snap-others='false' inkscape:cx='-103.1532' inkscape:cy='40.32375' inkscape:window-x='2082' inkscape:window-y='102' inkscape:zoom='1' inkscape:window-height='1162' bordercolor='#666666' pagecolor='#555753' guidetolerance='10' inkscape:object-nodes='true' inkscape:guide-bbox='true' inkscape:snap-bbox='true' borderopacity='1' objecttolerance='10' inkscape:pageshadow='2' inkscape:object-paths='true' inkscape:window-maximized='0' gridtolerance='10' showgrid='false' inkscape:snap-nodes='true' inkscape:bbox-paths='false' inkscape:snap-to-guides='true' id='namedview88' showguides='true' inkscape:snap-global='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-grids='true' inkscape:pageopacity='1' showborder='false' inkscape:current-layer='g71291' inkscape:window-width='1598'>
+ <inkscape:grid empspacing='2' visible='true' type='xygrid' enabled='true' spacingx='1px' spacingy='1px' id='grid4866' snapvisiblegridlinesonly='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:label='status' transform='translate(-601.00018,-519)' style='display:inline' inkscape:groupmode='layer' id='layer9'/>
+ <g inkscape:label='devices' transform='translate(-601.00018,-519)' inkscape:groupmode='layer' id='layer10'/>
+ <g inkscape:label='apps' transform='translate(-601.00018,-519)' inkscape:groupmode='layer' id='layer11'/>
+ <g inkscape:label='places' transform='translate(-601.00018,-519)' inkscape:groupmode='layer' id='layer13'/>
+ <g inkscape:label='mimetypes' transform='translate(-601.00018,-519)' inkscape:groupmode='layer' id='layer14'/>
+ <g inkscape:label='emblems' transform='translate(-601.00018,-519)' style='display:inline' inkscape:groupmode='layer' id='layer15'/>
+ <g inkscape:label='emotes' transform='translate(-601.00018,-519)' style='display:inline' inkscape:groupmode='layer' id='g71291'>
+ <path sodipodi:nodetypes='ssssssssssssssssssscccccccccccc' d='m 609.0002,520 c -3.86599,0 -7,3.13401 -7,7 0,3.86599 3.13401,7 7,7 3.86599,0 7,-3.13401 7,-7 0,-3.86599 -3.13401,-7 -7,-7 z m -2,4 c 0.55833,0 1.03125,0.47292 1.03125,1.03125 l 0,0.96875 c 0,0.55833 -0.47292,1 -1.03125,1 -0.55833,0 -1,-0.44167 -1,-1 l 0,-0.96875 c 0,-0.55833 0.44167,-1.03125 1,-1.03125 z m 4,0 c 0.55833,0 1,0.47292 1,1.03125 l 0,0.96875 c 0,0.55833 -0.44167,1 -1,1 -0.55833,0 -1,-0.44167 -1,-1 l 0,-0.96875 c 0,-0.55833 0.44167,-1.03125 1,-1.03125 z m 3,5.94286 c -0.76555,-0.42797 -1.6121,-0.92076 -2.47566,-0.93995 -0.65285,0.0193 -1.23894,0.6539 -1.52434,0.69709 -0.54153,0.31352 -1.55932,0.19637 -2,0 -0.91691,-0.43721 -0.92121,-0.68027 -1.54333,-0.70038 -0.85242,0.0189 -1.83128,0.40453 -2.45667,0.94324 l 0,-0.5 c 0.42161,-1.08586 2.38082,-2.04455 4,-0.87083 0.34921,0.22009 0.42727,0.26657 1.01479,0.33656 0.15925,0.0555 0.59227,-0.0338 0.98521,-0.33659 1.5816,-1.15342 3.29222,-0.11851 4,0.87086 z' inkscape:connector-curvature='0' style='fill:#babdb6;fill-opacity:1;stroke:none;display:inline;overflow:visible' id='path71360-0'/>
+
+ </g>
+ <g inkscape:label='categories' transform='translate(-601.00018,-519)' style='display:inline' inkscape:groupmode='layer' id='g4953'/>
+ <g inkscape:label='actions' transform='translate(-601.00018,-519)' style='display:inline' inkscape:groupmode='layer' id='layer12'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/face-yawn-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/face-yawn-symbolic-ref.png
new file mode 100644
index 00000000..0c8fb5f8
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/face-yawn-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/face-yawn-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/face-yawn-symbolic.svg
new file mode 100644
index 00000000..9a116655
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/face-yawn-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='face-yawn-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.2 r9819' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-paths='false' bordercolor='#666666' borderopacity='1' inkscape:current-layer='g71291' inkscape:cx='-95.802316' inkscape:cy='21.97864' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#555753' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1381' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='1600' inkscape:window-y='27' inkscape:zoom='5.6568542'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-621.00018,-539)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-621.00018,-539)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-621.00018,-539)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-621.00018,-539)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-621.00018,-539)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-621.00018,-539)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-621.00018,-539)'>
+ <path inkscape:connector-curvature='0' d='m 629.0002,540 c -3.86599,0 -7,3.13401 -7,7 0,3.86599 3.13401,7 7,7 3.86599,0 7,-3.13401 7,-7 0,-3.86599 -3.13401,-7 -7,-7 z m -2.46875,3 c 0.73437,0 1.46875,0.44603 1.46875,1.3125 -1.5,-0.33848 -3.125,1.73294 -3,0 0.0625,-0.86647 0.79688,-1.3125 1.53125,-1.3125 z m 4.9375,0 c 0.73437,0 1.46875,0.44603 1.53125,1.3125 0.125,1.73294 -1.5,-0.33848 -3,0 0,-0.86647 0.73438,-1.3125 1.46875,-1.3125 z m -2.46875,3 c 1.38071,0 2.5,1.34315 2.5,3 0,1.65685 -1.11929,3 -2.5,3 -1.38071,0 -2.5,-1.34315 -2.5,-3 0,-1.65685 1.11929,-3 2.5,-3 z' id='path6445' style='fill:#babdb6;fill-opacity:1;stroke:none'/>
+
+ </g>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-621.00018,-539)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-621.00018,-539)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/find-location-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/find-location-symbolic-ref.png
new file mode 100644
index 00000000..eb1e82a2
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/find-location-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/find-location-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/find-location-symbolic.svg
new file mode 100644
index 00000000..f882f6ab
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/find-location-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='find-location-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.5 r10040' width='15.973606' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='10.964181' inkscape:cy='6.96904' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1014' inkscape:window-maximized='1' inkscape:window-width='1920' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='11.313708'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='60.000093px' originy='590px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-181.00011,-807)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-181.00011,-807)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-181.00011,-807)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-181.00011,-807)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-181.00011,-807)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-181.00011,-807)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-181.00011,-807)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-181.00011,-807)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-181.00011,-807)'>
+
+ <path inkscape:connector-curvature='0' d='m 188.00019,807 0,1.03125 c -3.16245,0.26289 -5.68961,2.80226 -5.9375,5.96875 l -1.06249,0 0,1 1.06249,0 c 0.24791,3.16676 2.77466,5.70624 5.9375,5.96875 l 0,1.03125 1,0 0,-1.03125 c 3.18813,-0.23381 5.72399,-2.78064 5.96875,-5.96875 l 1.03125,0 0,-1 -1.03125,0 c -0.2448,-3.18868 -2.77982,-5.76697 -5.96875,-6 l 0,-1 -1,0 z m 0.53125,2.8125 c 2.60638,0 4.68751,2.08113 4.68751,4.6875 0,2.60637 -2.08113,4.6875 -4.68751,4.6875 -2.60637,0 -4.75,-2.08113 -4.75,-4.6875 0,-2.60637 2.14363,-4.6875 4.75,-4.6875 z M 188.50019,811 c -1.93299,0 -3.5,1.567 -3.5,3.5 0,1.933 1.56701,3.5 3.5,3.5 1.933,0 3.5,-1.567 3.5,-3.5 0,-1.933 -1.567,-3.5 -3.5,-3.5 z' id='path5742' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/focus-legacy-systray-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/focus-legacy-systray-symbolic-ref.png
new file mode 100644
index 00000000..aa132342
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/focus-legacy-systray-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/focus-legacy-systray-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/focus-legacy-systray-symbolic.svg
new file mode 100644
index 00000000..061caf01
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/focus-legacy-systray-symbolic.svg
@@ -0,0 +1,33 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='focus-legacy-systray-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.91 r13725' width='16.002001' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='-3.40805' inkscape:cy='8.29396' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='180.002' originy='770.00001' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-60.9982,-987.00001)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-60.9982,-987.00001)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-60.9982,-987.00001)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-60.9982,-987.00001)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-60.9982,-987.00001)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-60.9982,-987.00001)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-60.9982,-987.00001)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-60.9982,-987.00001)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-60.9982,-987.00001)'>
+
+ <path inkscape:connector-curvature='0' d='m 68.93379,989 -7.93359,0.01 -0.002,11.9687 9.96875,0 0.0273,-9.91792 c 0,-1.12431 -0.93624,-2.06055 -2.06055,-2.06055 z m -4.91797,3 1,0 c 0.30945,0 0.55233,0.0903 0.75,0.28125 L 68.42208,995 65.76582,997.71875 C 65.56815,997.9097 65.32527,998 65.01582,998 l -1,0 0,-1 c 10e-6,-0.25689 0.12983,-0.52846 0.3125,-0.71875 L 65.60958,995 64.32832,993.71875 C 64.14565,993.52846 64.01582,993.25689 64.01582,993 Z' id='path10873' sodipodi:nodetypes='cccccccscccscccccsc' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 70.98458,989.03125 c 0,0 1.03125,0.48405 1.03125,1.96875 l 0,10 0.98437,0 0,-10 c 0,-1.2501 -2.01562,-1.96875 -2.01562,-1.96875 z' id='path10910' sodipodi:nodetypes='cccccc' style='color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 72.96895,989.03125 c 0,0 1.03125,0.48405 1.03125,1.96875 l 0,10 1,0 0,-10 c 0,-1.2501 -2.03125,-1.96875 -2.03125,-1.96875 z' id='path10912' sodipodi:nodetypes='cccccc' style='color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/focus-top-bar-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/focus-top-bar-symbolic-ref.png
new file mode 100644
index 00000000..72833203
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/focus-top-bar-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/focus-top-bar-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/focus-top-bar-symbolic.svg
new file mode 100644
index 00000000..f7573ba1
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/focus-top-bar-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='focus-top-bar-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.91 r13725' width='16.02536' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='16.58995' inkscape:cy='8.29396' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='200' originy='770.00001' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-41.0002,-987.00001)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-41.0002,-987.00001)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-41.0002,-987.00001)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-41.0002,-987.00001)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-41.0002,-987.00001)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-41.0002,-987.00001)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-41.0002,-987.00001)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-41.0002,-987.00001)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-41.0002,-987.00001)'>
+
+ <path inkscape:connector-curvature='0' d='m 43.06075,989 c -1.12431,0 -2.06055,0.93624 -2.06055,2.06055 l 0,7.89062 1.03711,0 0,-1.01562 0.96289,0 0,-4.875 c 0,-0.0509 0.01,-0.0606 0.0606,-0.0606 l 11.90429,0 c 0.0509,0 0.0605,0.01 0.0605,0.0606 l 0,7.98045 0.93359,0 0.0449,-1.06053 1.02148,0 0,-8.91992 C 57.02556,989.93624 56.08932,989 54.96501,989 Z m 7.94922,2.07422 3.97656,0 0,0.92773 -3.97656,0 z' id='rect10862' sodipodi:nodetypes='ssccccssssccccsssccccc' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/focus-windows-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/focus-windows-symbolic-ref.png
new file mode 100644
index 00000000..75b60525
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/focus-windows-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/focus-windows-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/focus-windows-symbolic.svg
new file mode 100644
index 00000000..e3625d7e
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/focus-windows-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='focus-windows-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.91 r13725' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='-23.41005' inkscape:cy='8.29395' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='160' originy='770' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-81.0002,-987)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-81.0002,-987)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-81.0002,-987)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-81.0002,-987)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-81.0002,-987)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-81.0002,-987)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-81.0002,-987)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-81.0002,-987)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-81.0002,-987)'>
+
+ <path inkscape:connector-curvature='0' d='m 83.03536,994.00781 c -0.53125,0 -1.03125,0.42167 -1.03125,1 l 0,7.01169 8.01171,0 0,-3.98434 -2,0 0,1.98434 -4.01171,0 0,-2.99606 2.01562,0 0,-3.01563 z' id='rect10938' sodipodi:nodetypes='sscccccccccs' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 89.019731,988.00781 c -0.53125,0 -1.03125,0.42167 -1.03125,1 l 0,7.01172 8.011719,0 0,-7.04297 c 0,-0.57833 -0.521484,-0.96875 -1.021484,-0.96875 z m 0.96875,3.01563 4.011719,0 0,2.99609 -4.011719,0 z' id='path10942' sodipodi:nodetypes='cccccccccccc' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/folder-documents-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/folder-documents-symbolic-ref.png
new file mode 100644
index 00000000..191b4db3
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/folder-documents-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/folder-documents-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/folder-documents-symbolic.svg
new file mode 100644
index 00000000..1c6560ea
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/folder-documents-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='folder-documents-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.2 r9819' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-paths='false' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer13' inkscape:cx='-191.02406' inkscape:cy='0.353506' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#555753' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1168' inkscape:window-maximized='1' inkscape:window-width='1600' inkscape:window-x='0' inkscape:window-y='0' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-481,-195.00012)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-481,-195.00012)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-481,-195.00012)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-481,-195.00012)'>
+
+ <path inkscape:connector-curvature='0' d='m 483.8127,196.00012 a 1.0000999,1.0000999 0 0 0 -0.8125,1 l 0,13 a 1.0000999,1.0000999 0 0 0 1,1 l 10,0 a 1.0000999,1.0000999 0 0 0 1,-1 l 0,-9.4375 a 1.0000999,1.0000999 0 0 0 -0.28125,-0.71875 l -3.5625,-3.5625 a 1.0000999,1.0000999 0 0 0 -0.71875,-0.28125 l -6.4375,0 a 1.0000999,1.0000999 0 0 0 -0.0937,0 1.0000999,1.0000999 0 0 0 -0.0937,0 z m 1.1875,2 5,0 0,3 3,0 0,8 -8,0 0,-11 z' id='path5003' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.99999988;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-481,-195.00012)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-481,-195.00012)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-481,-195.00012)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-481,-195.00012)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-481,-195.00012)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/folder-download-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/folder-download-symbolic-ref.png
new file mode 100644
index 00000000..7655ffdb
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/folder-download-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/folder-download-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/folder-download-symbolic.svg
new file mode 100644
index 00000000..8b537064
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/folder-download-symbolic.svg
@@ -0,0 +1,38 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='folder-download-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.91 r13725' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer13' inkscape:cx='3.08023' inkscape:cy='5.926153' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='false' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='8'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-280' originy='-22' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-521.0002,-195)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-521.0002,-195)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-521.0002,-195)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-521.0002,-195)'>
+
+ <path inkscape:connector-curvature='0' d='m 523.0002,203.00315 0,1 c -1.2e-4,0.0104 -4.6e-4,0.0208 0,0.0313 0.0112,0.25495 0.12858,0.50987 0.3125,0.6875 l 5.21875,5.28125 0.96875,-0.003 5.21875,-5.27805 c 0.18819,-0.18821 0.28125,-0.45351 0.28125,-0.7188 l 0,-1 -1.7071,0 c -0.26529,0 -0.53058,0.0931 -0.71875,0.28125 l -3.55574,3.84451 -0.003,0.14062 -0.0185,-0.14062 -3.5843,-3.84451 c -0.19463,-0.21074 -0.46925,-0.30316 -0.75,-0.28125 z' id='path11142' sodipodi:nodetypes='ccscccccccccccccc' style='color:#bebebe;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:&apos;Andale Mono&apos;;-inkscape-font-specification:&apos;Andale Mono&apos;;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.78124988;marker:none;enable-background:new'/>
+ <rect height='2' id='rect81861' rx='0.5' ry='0.5' style='color:#000000;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.29999995;marker:none;enable-background:new' width='2' x='528.00018' y='202'/>
+ <rect height='2' id='rect81863' rx='0.5' ry='0.5' style='color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.29999995;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new' width='2' x='528.00018' y='196'/>
+ <rect height='2' id='rect81886' rx='0.5' ry='0.44999999' style='color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.29999995;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new' width='2' x='528.00018' y='199'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-521.0002,-195)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-521.0002,-195)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-521.0002,-195)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-521.0002,-195)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-521.0002,-195)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/folder-drag-accept-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/folder-drag-accept-symbolic-ref.png
new file mode 100644
index 00000000..fa4dd7ca
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/folder-drag-accept-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/folder-drag-accept-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/folder-drag-accept-symbolic.svg
new file mode 100644
index 00000000..2a61193c
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/folder-drag-accept-symbolic.svg
@@ -0,0 +1,35 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='folder-drag-accept-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.92pre3 r' viewBox='0 0 16.000286 16' width='16.000286' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='394.36077' inkscape:cy='212.81118' inkscape:document-units='px' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1016' inkscape:window-maximized='1' inkscape:window-width='1920' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='160' originy='179.98993' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-81.0002,-396.98993)'>
+
+ <path inkscape:connector-curvature='0' d='M 81.0002,398.98993 V 410 c 2e-5,0.83333 0.57399,1.50574 1.0625,1.75 0.48851,0.24436 0.9375,0.25 0.9375,0.25 h 12 c 0,0 0.44899,-0.006 0.9375,-0.25 0.48851,-0.24426 1.07765,-0.91681 1.0625,-1.75 v -3 H 83.96895 l -0.46875,3.03125 c -0.0164,0.2618 -0.26945,0.48511 -0.53125,0.46875 -0.2618,-0.0164 -0.48511,-0.26945 -0.46875,-0.53125 l 0.5,-3.5 c 0.01,-0.22281 0.18713,-0.42714 0.40625,-0.46875 0.0312,-0.003 0.0626,-0.003 0.0937,0 h 11.5 l 5e-5,-5.01007 c 0,-1 -1,-1 -1,-1 l -5,7e-5 -2,-2 c -1.43156,0.002 -5,0 -5,0 0,0 -1,0 -1,1 z' id='path7987' sodipodi:nodetypes='ccccccscccscccccccccccc' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:Sans;-inkscape-font-specification:Sans;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;enable-background:accumulate'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-81.0002,-396.98993)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-81.0002,-396.98993)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-81.0002,-396.98993)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-81.0002,-396.98993)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-81.0002,-396.98993)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-81.0002,-396.98993)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-81.0002,-396.98993)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-81.0002,-396.98993)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/folder-music-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/folder-music-symbolic-ref.png
new file mode 100644
index 00000000..af0e265a
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/folder-music-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/folder-music-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/folder-music-symbolic.svg
new file mode 100644
index 00000000..a34ebeb7
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/folder-music-symbolic.svg
@@ -0,0 +1,35 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='folder-music-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.2 r9819' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-paths='false' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer13' inkscape:cx='-171.02426' inkscape:cy='0.353386' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#555753' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1168' inkscape:window-maximized='1' inkscape:window-width='1600' inkscape:window-x='0' inkscape:window-y='0' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-461.0002,-195)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-461.0002,-195)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-461.0002,-195)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-461.0002,-195)'>
+
+ <path inkscape:connector-curvature='0' d='m 464.50433,203.01365 c -1.92115,0 -3.50339,1.5501 -3.50339,3.47125 0,1.92115 1.58224,3.50339 3.50339,3.50339 1.92115,0 3.50339,-1.58224 3.50339,-3.50339 0,-1.92115 -1.58224,-3.47125 -3.50339,-3.47125 z m 0,1.99275 c 0.84027,0 1.51064,0.63823 1.51064,1.4785 0,0.84027 -0.67037,1.51063 -1.51064,1.51063 -0.84027,0 -1.51064,-0.67036 -1.51064,-1.51063 0,-0.84027 0.67037,-1.4785 1.51064,-1.4785 z' id='path5005' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.94454503;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 472.50433,203.01365 c -1.92115,0 -3.50339,1.5501 -3.50339,3.47125 0,1.92115 1.58224,3.50339 3.50339,3.50339 1.92115,0 3.50339,-1.58224 3.50339,-3.50339 0,-1.92115 -1.58224,-3.47125 -3.50339,-3.47125 z m 0,1.99275 c 0.84027,0 1.51064,0.63823 1.51064,1.4785 0,0.84027 -0.67037,1.51063 -1.51064,1.51063 -0.84027,0 -1.51064,-0.67036 -1.51064,-1.51063 0,-0.84027 0.67037,-1.4785 1.51064,-1.4785 z' id='path5007' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.94454503;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <rect height='9.515729' id='rect5009' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.50793636;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' width='2.0000219' x='466.0004' y='197.00002'/>
+ <rect height='9.5626974' id='rect5011' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.50793636;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' width='2.0000412' x='474.0004' y='197.00002'/>
+ <rect height='2' id='rect5013' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.50793636;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' width='10.000017' x='466.0004' y='197.00002'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-461.0002,-195)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-461.0002,-195)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-461.0002,-195)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-461.0002,-195)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-461.0002,-195)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/folder-new-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/folder-new-symbolic-ref.png
new file mode 100644
index 00000000..e4377d3e
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/folder-new-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/folder-new-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/folder-new-symbolic.svg
new file mode 100644
index 00000000..40190a07
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/folder-new-symbolic.svg
@@ -0,0 +1,36 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='folder-new-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.92pre3 r' viewBox='0 0 16.00034 16' width='16.00034' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='174.36091' inkscape:cy='542.82126' inkscape:document-units='px' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1016' inkscape:window-maximized='1' inkscape:window-width='1920' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-59.99986' originy='510' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-301.00006,-727)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-301.00006,-727)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-301.00006,-727)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-301.00006,-727)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-301.00006,-727)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-301.00006,-727)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-301.00006,-727)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-301.00006,-727)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-301.00006,-727)'>
+ <path inkscape:connector-curvature='0' d='M 313.0002,736.0032 V 738 h -2 v 1.9967 h 2 v 1.9967 h 2 v -1.9967 h 2 V 738 h -2 v -1.9968 z' id='path7307' style='display:inline;fill:#bebebe;fill-opacity:1;stroke:none'/>
+
+ <path inkscape:connector-curvature='0' d='m 303.0002,728 c -0.83333,0 -1.52527,0.56422 -1.76953,1.05273 C 300.98641,729.54125 301.0002,730 301.0002,730 v 10 c 0,0.83333 0.56422,1.52527 1.05273,1.76953 0.48852,0.24426 0.94727,0.23047 0.94727,0.23047 h 6 c 0,0 1,0 1,-1 0,-1 -1,-1 -1,-1 h -6 v -10 h 4.58594 l 2,2 h 5.41406 v 2 c 0,1 1,1 1,1 0,0 1,0 1,-1 v -2 c 0,0 0.0138,-0.45875 -0.23047,-0.94727 C 316.52547,730.56422 315.83353,730 315.0002,730 h -4.58594 l -2,-2 z' id='path9166-8' sodipodi:nodetypes='sccscccccccccccccccsccs' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/folder-open-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/folder-open-symbolic-ref.png
new file mode 100644
index 00000000..e42f8e34
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/folder-open-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/folder-open-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/folder-open-symbolic.svg
new file mode 100644
index 00000000..3546bc0a
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/folder-open-symbolic.svg
@@ -0,0 +1,35 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='folder-open-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.92pre3 r' viewBox='0 0 16.0312 16' width='16.0312' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='434.36072' inkscape:cy='212.81118' inkscape:document-units='px' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1016' inkscape:window-maximized='1' inkscape:window-width='1920' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='199.99994' originy='179.98993' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-41.00025,-396.98993)'>
+
+ <path inkscape:connector-curvature='0' d='M 41.03145,398.98993 41.00025,410 c 2e-5,0.83333 0.57399,1.50574 1.0625,1.75 0.48851,0.24436 0.9375,0.25 0.9375,0.25 h 12 c 0,0 0.44899,-0.006 0.9375,-0.25 0.48851,-0.24426 1.06473,-0.91667 1.0625,-1.75 v -5 H 43.969 l -0.46875,5.03125 c -0.0164,0.2618 -0.26945,0.48511 -0.53125,0.46875 -0.2618,-0.0164 -0.48511,-0.26945 -0.46875,-0.53125 l 0.5,-5.5 c 0.01,-0.22281 0.18713,-0.42714 0.40625,-0.46875 0.0312,-0.003 0.0626,-0.003 0.0937,0 h 11.5 l 0.0312,-3.01007 c 0,-1 -0.96528,-0.98993 -0.96528,-0.98993 h -5.06597 l -1.96875,-2.01007 h -5 c 0,0 -1,0 -1,1 z' id='path6390' sodipodi:nodetypes='ccccccscccsccccccccccc' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:Sans;-inkscape-font-specification:Sans;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;enable-background:accumulate'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-41.00025,-396.98993)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-41.00025,-396.98993)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-41.00025,-396.98993)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-41.00025,-396.98993)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-41.00025,-396.98993)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-41.00025,-396.98993)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-41.00025,-396.98993)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-41.00025,-396.98993)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/folder-pictures-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/folder-pictures-symbolic-ref.png
new file mode 100644
index 00000000..5ed9656c
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/folder-pictures-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/folder-pictures-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/folder-pictures-symbolic.svg
new file mode 100644
index 00000000..7b85641d
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/folder-pictures-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='folder-pictures-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.2 r9819' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-paths='false' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer13' inkscape:cx='-231.02406' inkscape:cy='0.353386' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#555753' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1168' inkscape:window-maximized='1' inkscape:window-width='1600' inkscape:window-x='0' inkscape:window-y='0' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-521,-195)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-521,-195)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-521,-195)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-521,-195)'>
+
+ <path inkscape:connector-curvature='0' d='m 527,197 c -0.54996,0 -1,0.45004 -1,1 l 0,1 -3,0 c -0.55201,0 -1,0.45004 -1,1 l 0,8 c 0,0.54996 0.44799,1 1,1 l 12,0 c 0.55201,0 1,-0.45004 1,-1 l 0,-8 c 0,-0.54996 -0.44799,-1 -1,-1 l -3,0 0,-1 c 0,-0.54996 -0.45004,-1 -1,-1 l -4,0 z m 2,3 c 2.20914,0 4,1.79086 4,4 0,2.20914 -1.79086,4 -4,4 -2.20914,0 -4,-1.79086 -4,-4 0,-2.20914 1.79086,-4 4,-4 z m 0,2 c -1.10457,0 -2,0.89543 -2,2 0,1.10457 0.89543,2 2,2 1.10457,0 2,-0.89543 2,-2 0,-1.10457 -0.89543,-2 -2,-2 z' id='path4975' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-521,-195)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-521,-195)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-521,-195)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-521,-195)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-521,-195)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/folder-publicshare-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/folder-publicshare-symbolic-ref.png
new file mode 100644
index 00000000..0f6c0bdc
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/folder-publicshare-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/folder-publicshare-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/folder-publicshare-symbolic.svg
new file mode 100644
index 00000000..44332188
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/folder-publicshare-symbolic.svg
@@ -0,0 +1,34 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='folder-publicshare-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.3.1 r9886' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-paths='false' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer13' inkscape:cx='-55.50224' inkscape:cy='-178.38158' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1381' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='1600' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='-340px' originy='-20.999999px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-581.0002,-196)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-581.0002,-196)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-581.0002,-196)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-581.0002,-196)'>
+
+ <path sodipodi:cx='289.03125' sodipodi:cy='178.03125' d='m 291,178.03125 a 1.96875,1.96875 0 1 1 -3.9375,0 1.96875,1.96875 0 1 1 3.9375,0 z' id='path8192' sodipodi:rx='1.96875' sodipodi:ry='1.96875' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999994;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' transform='matrix(1.5079365,0,0,1.5079365,148.15963,-64.49107)' sodipodi:type='arc'/>
+ <path sodipodi:cx='289.03125' sodipodi:cy='178.03125' d='m 291,178.03125 a 1.96875,1.96875 0 1 1 -3.9375,0 1.96875,1.96875 0 1 1 3.9375,0 z' id='path8194' sodipodi:rx='1.96875' sodipodi:ry='1.96875' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999994;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' transform='matrix(1.5079365,0,0,1.5079365,158.12818,-59.49107)' sodipodi:type='arc'/>
+ <path sodipodi:cx='289.03125' sodipodi:cy='178.03125' d='m 291,178.03125 a 1.96875,1.96875 0 1 1 -3.9375,0 1.96875,1.96875 0 1 1 3.9375,0 z' id='path8196' sodipodi:rx='1.96875' sodipodi:ry='1.96875' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999994;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' transform='matrix(1.5079365,0,0,1.5079365,158.12818,-69.49107)' sodipodi:type='arc'/>
+ <path inkscape:connector-curvature='0' d='m 593.625,198.15625 -10.0625,4.875 -1.8125,0.90625 1.8125,0.90625 10.03125,5.0625 0.90625,-1.8125 -8.21875,-4.15625 8.21875,-4 -0.875,-1.78125 z' id='path8198' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-581.0002,-196)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-581.0002,-196)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-581.0002,-196)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-581.0002,-196)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-581.0002,-196)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/folder-remote-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/folder-remote-symbolic-ref.png
new file mode 100644
index 00000000..4432ccfe
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/folder-remote-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/folder-remote-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/folder-remote-symbolic.svg
new file mode 100644
index 00000000..0f24907b
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/folder-remote-symbolic.svg
@@ -0,0 +1,35 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='folder-remote-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16.010071' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.92pre3 r' viewBox='0 0 16.031294 16.010071' width='16.031294' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer13' inkscape:cx='-5.63923' inkscape:cy='-9.178743' inkscape:document-units='px' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1016' inkscape:window-maximized='1' inkscape:window-width='1920' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-240' originy='-42.000001' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-481.0002,-174.98993)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-481.0002,-174.98993)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-481.0002,-174.98993)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-481.0002,-174.98993)'>
+
+ <path inkscape:connector-curvature='0' d='m 482.03145,174.99023 c 0,0 -1,0 -1,1 L 481.0002,185 c 2e-5,0.83333 0.57399,1.50574 1.0625,1.75 0.48851,0.24436 0.9375,0.25 0.9375,0.25 h 4 v 2 h -5.53125 c -0.26299,0 -0.46875,0.20565 -0.46875,0.46875 v 1.0625 c 0,0.263 0.20576,0.46875 0.46875,0.46875 h 13.0625 c 0.26299,0 0.46875,-0.20575 0.46875,-0.46875 v -1.0625 c 0,-0.263 -0.20575,-0.46875 -0.46875,-0.46875 h -5.53125 v -2 h 4 c 2,0 2,-2 2,-2 v -5 h -11.03125 l -0.46875,5.03125 c -0.0164,0.2618 -0.26945,0.48511 -0.53125,0.46875 -0.2618,-0.0164 -0.48511,-0.26945 -0.46875,-0.53125 l 0.5,-5.5 c 0.01,-0.22281 0.18713,-0.42714 0.40625,-0.46875 0.0312,-0.003 0.0626,-0.003 0.0937,0 h 10.50005 l 0.0312,-1.00977 c 0,-1 -0.96484,-0.99023 -0.96484,-0.99023 h -4.06636 l -1.96875,-2.00977 z' id='path9199' sodipodi:nodetypes='cccccccsssssssscccccccccccccccccc' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:Sans;-inkscape-font-specification:Sans;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;enable-background:accumulate'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-481.0002,-174.98993)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-481.0002,-174.98993)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-481.0002,-174.98993)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-481.0002,-174.98993)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-481.0002,-174.98993)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/folder-saved-search-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/folder-saved-search-symbolic-ref.png
new file mode 100644
index 00000000..e35933f8
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/folder-saved-search-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/folder-saved-search-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/folder-saved-search-symbolic.svg
new file mode 100644
index 00000000..30e8ae7b
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/folder-saved-search-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='folder-saved-search-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.2 r9819' version='1.1' width='16.000002' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-paths='false' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer13' inkscape:cx='-151.02446' inkscape:cy='0.353386' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#555753' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1168' inkscape:window-maximized='1' inkscape:window-width='1600' inkscape:window-x='0' inkscape:window-y='0' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-441.0004,-195)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-441.0004,-195)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-441.0004,-195)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-441.0004,-195)'>
+ <path inkscape:connector-curvature='0' d='m 447.50781,195.99554 c -3.02886,0 -5.51073,2.47905 -5.51073,5.50447 0,3.02541 2.48187,5.50446 5.51073,5.50446 3.02885,0 5.51072,-2.47905 5.51072,-5.50446 0,-3.02542 -2.48187,-5.50447 -5.51072,-5.50447 z m 0,2.00893 c 1.94735,0 3.49951,1.55039 3.49951,3.49554 0,1.94514 -1.55216,3.49553 -3.49951,3.49553 -1.94736,0 -3.49952,-1.55039 -3.49952,-3.49553 0,-1.94515 1.55216,-3.49554 3.49952,-3.49554 z' id='path5079' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.55467153;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 450.8125,204 a 1.0001,1.0001 0 0 0 -0.5,1.71875 l 4,4 a 1.0054782,1.0054782 0 1 0 1.40625,-1.4375 l -4,-4 A 1.0001,1.0001 0 0 0 450.8125,204 z' id='path5081' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Sans;-inkscape-font-specification:Sans'/>
+
+ </g>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-441.0004,-195)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-441.0004,-195)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-441.0004,-195)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-441.0004,-195)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-441.0004,-195)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/folder-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/folder-symbolic-ref.png
new file mode 100644
index 00000000..25821e74
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/folder-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/folder-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/folder-symbolic.svg
new file mode 100644
index 00000000..36260772
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/folder-symbolic.svg
@@ -0,0 +1,35 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='folder-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.92pre3 r' viewBox='0 0 16.0312 16' width='16.0312' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer13' inkscape:cx='14.36067' inkscape:cy='-9.1888169' inkscape:document-units='px' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1016' inkscape:window-maximized='1' inkscape:window-width='1920' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-220.00009' originy='-42.010074' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-461.0003,-174.98993)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-461.0003,-174.98993)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-461.0003,-174.98993)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-461.0003,-174.98993)'>
+
+ <path inkscape:connector-curvature='0' d='M 461.0315,176.98993 461.0003,188 c 2e-5,0.83333 0.57399,1.50574 1.0625,1.75 0.48851,0.24436 0.9375,0.25 0.9375,0.25 h 12 c 0,0 0.44899,-0.006 0.9375,-0.25 0.48851,-0.24426 1.06473,-0.91667 1.0625,-1.75 v -7 h -13.03125 l -0.46875,7.03125 c -0.0164,0.2618 -0.26945,0.48511 -0.53125,0.46875 -0.2618,-0.0164 -0.48511,-0.26945 -0.46875,-0.53125 l 0.5,-7.5 c 0.01,-0.22281 0.18713,-0.42714 0.40625,-0.46875 0.0312,-0.003 0.0626,-0.003 0.0937,0 h 11.5 l 0.0312,-1.01007 c 0,-1 -0.96528,-0.98993 -0.96528,-0.98993 h -5.06597 l -1.96875,-2.01007 h -5 c 0,0 -1,0 -1,1 z' id='path6390-2' sodipodi:nodetypes='ccccccscccscccccccccccc' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:Sans;-inkscape-font-specification:Sans;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;enable-background:accumulate'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-461.0003,-174.98993)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-461.0003,-174.98993)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-461.0003,-174.98993)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-461.0003,-174.98993)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-461.0003,-174.98993)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/folder-templates-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/folder-templates-symbolic-ref.png
new file mode 100644
index 00000000..cd915a9a
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/folder-templates-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/folder-templates-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/folder-templates-symbolic.svg
new file mode 100644
index 00000000..b5cf3eca
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/folder-templates-symbolic.svg
@@ -0,0 +1,47 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='folder-templates-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.2 r9819' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-paths='false' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer13' inkscape:cx='15.023187' inkscape:cy='9.693193' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#555753' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1168' inkscape:window-maximized='1' inkscape:window-width='1600' inkscape:window-x='0' inkscape:window-y='0' inkscape:zoom='11.313708'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-561,-195.00012)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-561,-195.00012)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-561,-195.00012)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-561,-195.00012)'>
+
+ <rect height='1' id='rect12037' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' width='0.99998313' x='564.00018' y='204'/>
+ <rect height='1' id='rect12039' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' width='0.99998313' x='563.00018' y='205'/>
+ <rect height='1' id='rect12041' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' width='0.99998313' x='564.00018' y='206'/>
+ <rect height='1' id='rect12043' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' width='0.99998313' x='563.00018' y='207'/>
+ <rect height='1' id='rect12045' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' width='0.99998313' x='564.00018' y='208'/>
+ <rect height='1' id='rect12047' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' width='0.99998313' x='563.00018' y='209'/>
+ <rect height='1' id='rect12051' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' width='0.99998313' x='565.00018' y='209'/>
+ <rect height='1' id='rect12055' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' width='0.99998313' x='567.00018' y='209'/>
+ <rect height='1' id='rect12059' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' width='0.99998313' x='569.00018' y='209'/>
+ <rect height='1' id='rect12063' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' width='0.99998313' x='571.00018' y='209'/>
+ <path inkscape:connector-curvature='0' d='m 563.8127,196 c -0.4584,0.0875 -0.82072,0.5334 -0.8125,1 l 0,8 2,0 0,-7 5,0 0,3 3,0 0,7.99746 2,0 0,-8.43496 c 0.006,-0.26406 -0.0976,-0.52897 -0.28125,-0.71875 l -3.5625,-3.5625 C 570.96667,196.09754 570.70176,195.99388 570.4377,196 l -6.4375,0 c -0.0312,-0.001 -0.0625,-0.001 -0.0937,0 -0.0312,-0.001 -0.0625,-0.001 -0.0937,0 z' id='path1234-5' sodipodi:nodetypes='cccccccccccccccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.99999988;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <rect height='1' id='rect12326' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' width='0.99998313' x='564.00018' y='210'/>
+ <rect height='1' id='rect12328' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' width='0.99998313' x='566.00018' y='210'/>
+ <rect height='1' id='rect12330' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' width='0.99998313' x='568.00018' y='210'/>
+ <rect height='1' id='rect12332' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' width='0.99998313' x='570.00018' y='210'/>
+ <rect height='1' id='rect12334' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' width='0.99998313' x='572.00024' y='210'/>
+ <rect height='1.1875' id='rect12336' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' width='0.99998474' x='573.00018' y='208.8125'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-561,-195.00012)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-561,-195.00012)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-561,-195.00012)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-561,-195.00012)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-561,-195.00012)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/folder-videos-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/folder-videos-symbolic-ref.png
new file mode 100644
index 00000000..cbe62404
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/folder-videos-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/folder-videos-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/folder-videos-symbolic.svg
new file mode 100644
index 00000000..0084b574
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/folder-videos-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='folder-videos-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer13' inkscape:cx='-439.78657' inkscape:cy='-227.21795' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1374' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-319.9998px' originy='-22px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-561,-195)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-561,-195)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-561,-195)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-561,-195)'>
+
+ <rect height='9' id='rect5544' rx='0.99980003' ry='1' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible' transform='scale(-1,1)' width='9.96875' x='-575.96875' y='199'/>
+ <path inkscape:connector-curvature='0' d='M 566,203.4693 562.5307,200 l -0.5309,0 0,7 0.5,0 z' id='path5546' sodipodi:nodetypes='cccccc' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-561,-195)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-561,-195)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-561,-195)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-561,-195)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-561,-195)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/folder-visiting-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/folder-visiting-symbolic-ref.png
new file mode 100644
index 00000000..053a5a27
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/folder-visiting-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/folder-visiting-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/folder-visiting-symbolic.svg
new file mode 100644
index 00000000..64061601
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/folder-visiting-symbolic.svg
@@ -0,0 +1,35 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='folder-visiting-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.92pre3 r' viewBox='0 0 16.000343 16' width='16.000343' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='414.36111' inkscape:cy='212.82126' inkscape:document-units='px' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1016' inkscape:window-maximized='1' inkscape:window-width='1920' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='180.00034' originy='180' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-60.999858,-397)'>
+
+ <path inkscape:connector-curvature='0' d='m 63,398 c -0.833333,0 -1.525274,0.56422 -1.769531,1.05273 C 60.986212,399.54125 61,400 61,400 v 10 c 0,0.83333 0.56422,1.52527 1.052734,1.76953 C 62.541248,412.01379 63,412 63,412 h 12 c 0.833333,0 1.525274,-0.56422 1.769531,-1.05273 C 77.013788,410.45875 77,410 77,410 v -8 c 0,0 0.01379,-0.45875 -0.230469,-0.94727 C 76.525274,400.56422 75.833333,400 75,400 h -4.585938 l -2,-2 z m 0,2 h 4.585938 l 2,2 H 75 v 8 H 63 Z' id='path9166' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-60.999858,-397)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-60.999858,-397)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-60.999858,-397)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-60.999858,-397)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-60.999858,-397)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-60.999858,-397)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-60.999858,-397)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-60.999858,-397)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/font-select-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/font-select-symbolic-ref.png
new file mode 100644
index 00000000..5c3f65fb
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/font-select-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/font-select-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/font-select-symbolic.svg
new file mode 100644
index 00000000..b944ddde
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/font-select-symbolic.svg
@@ -0,0 +1,33 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='font-select-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.5 r10040' width='16.0002' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='11.855711' inkscape:cy='8.56615' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1375' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='0.0002px' originy='610px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-241,-827)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-241,-827)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-241,-827)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-241,-827)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-241,-827)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-241,-827)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-241,-827)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-241,-827)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-241,-827)'>
+
+ <path inkscape:connector-curvature='0' d='m 241,832 0,1 c 0,0.25689 0.12983,0.52846 0.3125,0.71875 L 242.59375,835 241.3125,836.28125 C 241.12983,836.47154 241,836.74311 241,837 l 0,1 1,0 c 0.30945,0 0.55232,-0.0903 0.75,-0.28125 L 245.40625,835 242.75,832.28125 C 242.55232,832.0903 242.30945,832 242,832 l -1,0 z' id='path26548' sodipodi:nodetypes='ccccccccccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/>
+ <path inkscape:connector-curvature='0' d='m 257.0002,832 0,1 c 0,0.25689 -0.12983,0.52846 -0.3125,0.71875 L 255.40645,835 l 1.28125,1.28125 c 0.18267,0.19029 0.3125,0.46186 0.3125,0.71875 l 0,1 -1,0 c -0.30945,0 -0.55232,-0.0903 -0.75,-0.28125 L 252.59395,835 255.2502,832.28125 C 255.44788,832.0903 255.69075,832 256.0002,832 l 1,0 z' id='path26550' sodipodi:nodetypes='ccccccccccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/>
+ <path inkscape:connector-curvature='0' d='m 248,830 0,2 1.90625,0 c -0.0552,0 0.0937,0.17104 0.0937,0.0937 l 0,0.9375 -1,0 c -1.71588,0 -3.03787,1.10986 -3.0625,2.46875 -0.0123,0.67944 0.3195,1.35323 0.875,1.8125 0.5555,0.45927 1.30959,0.71875 2.1875,0.71875 l 2,0 1,0 0,-1 0,-4.9375 C 252,830.92256 251.10309,830 249.90625,830 L 248,830 z m 1,5.03125 1,0 0,1 -1,0 c -0.51941,0 -0.78011,-0.14571 -0.90625,-0.25 -0.12614,-0.10429 -0.15755,-0.17804 -0.15625,-0.25 0.003,-0.14393 0.0927,-0.5 1.0625,-0.5 z' id='path11643-3-2-67' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/font-x-generic-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/font-x-generic-symbolic-ref.png
new file mode 100644
index 00000000..466fd8a4
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/font-x-generic-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/font-x-generic-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/font-x-generic-symbolic.svg
new file mode 100644
index 00000000..50b26e0b
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/font-x-generic-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='font-x-generic-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.91 r13725' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer14' inkscape:cx='-28.514868' inkscape:cy='-364.65398' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-340' originy='104' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-581.0002,-321)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-581.0002,-321)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-581.0002,-321)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-581.0002,-321)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-581.0002,-321)'>
+
+ <path inkscape:connector-curvature='0' d='m 584,326.01172 0,2 1.91992,0 c -0.0552,0 0.084,0.15932 0.084,0.082 l 0,0.92383 -1.00391,0 c -1.71588,0 -3.03006,1.12548 -3.05469,2.48437 -0.0123,0.67945 0.30583,1.363 0.86133,1.82227 0.5555,0.45927 1.31545,0.69922 2.19336,0.69922 l 3.00391,0 0,-5.92969 c 0,-1.17119 -0.88715,-2.08203 -2.08399,-2.08203 l -1.91992,0 z m 1,5.00586 1.00391,0 0,1.00586 -1.00391,0 c -0.51941,0 -0.79379,-0.1379 -0.91992,-0.24219 -0.12614,-0.10429 -0.13607,-0.17218 -0.13477,-0.24414 0.003,-0.14393 0.0849,-0.51953 1.05469,-0.51953 z' id='path10080' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 588.99805,325 0,9.02344 3.00195,0 c 0.93855,0 1.76882,-0.37254 2.29883,-0.95899 0.53,-0.58644 0.76574,-1.33658 0.75586,-2.0664 -0.01,-0.72982 -0.26223,-1.46579 -0.78907,-2.04297 C 593.73879,328.3779 592.92105,328 592,328 l -1.00195,0 0,-3 -2,0 z m 2,5 1.00195,0 c 0.42179,0 0.62551,0.12569 0.78711,0.30273 0.1616,0.17705 0.26384,0.44685 0.26758,0.72266 0.004,0.27581 -0.0886,0.52949 -0.24024,0.69727 -0.15162,0.16777 -0.35569,0.30078 -0.81445,0.30078 l -1.00195,0 0,-2.02344 z' id='path10082' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-581.0002,-321)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-581.0002,-321)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-581.0002,-321)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-581.0002,-321)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/format-indent-less-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/format-indent-less-symbolic-ref.png
new file mode 100644
index 00000000..0529370d
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/format-indent-less-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/format-indent-less-symbolic-rtl-ref.png b/rsvg/tests/fixtures/reftests/adwaita/format-indent-less-symbolic-rtl-ref.png
new file mode 100644
index 00000000..2fe4b228
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/format-indent-less-symbolic-rtl-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/format-indent-less-symbolic-rtl.svg b/rsvg/tests/fixtures/reftests/adwaita/format-indent-less-symbolic-rtl.svg
new file mode 100644
index 00000000..d77a3d4e
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/format-indent-less-symbolic-rtl.svg
@@ -0,0 +1,33 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:svg='http://www.w3.org/2000/svg' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' version='1.1' inkscape:version='0.47 r22583' height='16' sodipodi:docname='format-indent-more-symbolic.svg' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:cy='-2.68007' inkscape:current-layer='layer9' inkscape:window-width='1310' pagecolor='#555753' showborder='false' showguides='true' inkscape:snap-nodes='false' objecttolerance='10' showgrid='false' inkscape:object-nodes='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:window-x='92' inkscape:snap-bbox='true' bordercolor='#666666' id='namedview88' inkscape:window-maximized='0' inkscape:snap-global='true' inkscape:window-y='59' gridtolerance='10' inkscape:zoom='2' inkscape:window-height='690' borderopacity='1' guidetolerance='10' inkscape:cx='14.003912' inkscape:bbox-paths='false' inkscape:snap-grids='true' inkscape:pageopacity='1' inkscape:snap-to-guides='true'>
+ <inkscape:grid visible='true' spacingx='1px' type='xygrid' spacingy='1px' id='grid4866' empspacing='2' enabled='true' snapvisiblegridlinesonly='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g transform='translate(-161.0002,-277)' inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline'>
+
+ <rect x='169' y='279.99979' id='rect3825-9-8-7-9-1-7' height='2.0002136' inkscape:label='a' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible' width='5'/>
+ <rect x='169' y='283.99979' id='rect3825-9-8-7-8-4-7-66' height='2.0002136' inkscape:label='a' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible' width='5.9999981'/>
+ <rect x='163.0004' y='287.99979' id='rect3825-9-8-7-8-9-9-8-8' height='2.0002136' inkscape:label='a' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible' width='6.9996033'/>
+ <path d='m 163,280 0,1 c 0,0.25689 0.12983,0.52846 0.3125,0.71875 L 164.59375,283 163.3125,284.28125 C 163.12983,284.47154 163,284.74311 163,285 l 0,1 1,0 c 0.30945,0 0.55232,-0.0903 0.75,-0.28125 L 167.40625,283 164.75,280.28125 C 164.55232,280.0903 164.30945,280 164,280 l -1,0 z' id='rect3217-6-2-2-4' sodipodi:nodetypes='ccccccccccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/>
+ </g>
+ <g transform='translate(-161.0002,-277)' inkscape:groupmode='layer' id='layer10' inkscape:label='devices'/>
+ <g transform='translate(-161.0002,-277)' inkscape:groupmode='layer' id='layer11' inkscape:label='apps'/>
+ <g transform='translate(-161.0002,-277)' inkscape:groupmode='layer' id='layer12' inkscape:label='actions'/>
+ <g transform='translate(-161.0002,-277)' inkscape:groupmode='layer' id='layer13' inkscape:label='places'/>
+ <g transform='translate(-161.0002,-277)' inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes'/>
+ <g transform='translate(-161.0002,-277)' inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline'/>
+ <g transform='translate(-161.0002,-277)' inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/format-indent-less-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/format-indent-less-symbolic.svg
new file mode 100644
index 00000000..acd9401a
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/format-indent-less-symbolic.svg
@@ -0,0 +1,35 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='format-indent-less-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.4 r9939' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='40.600095' inkscape:cy='505.11648' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='702' inkscape:window-maximized='1' inkscape:window-width='1366' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='99.999998px' originy='610px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ <inkscape:grid color='#000000' empcolor='#000000' empopacity='0' empspacing='4' enabled='true' id='grid5968' opacity='0.1254902' originx='99.999998px' originy='610px' snapvisiblegridlinesonly='true' spacingx='0.5px' spacingy='0.5px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-141.0002,-827)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-141.0002,-827)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-141.0002,-827)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-141.0002,-827)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-141.0002,-827)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-141.0002,-827)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-141.0002,-827)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-141.0002,-827)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-141.0002,-827)'>
+
+ <rect height='2.0002136' id='rect8526' inkscape:label='a' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible' transform='scale(-1,1)' width='5' x='-148.0002' y='830'/>
+ <rect height='2.0002136' id='rect8528' inkscape:label='a' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible' transform='scale(-1,1)' width='5.9999981' x='-149.0004' y='833.99976'/>
+ <rect height='2.0002136' id='rect8530' inkscape:label='a' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible' transform='scale(-1,1)' width='6.9996033' x='-155' y='837.99976'/>
+ <path inkscape:connector-curvature='0' d='m 155.0004,830 0,1 c 0,0.25689 -0.12983,0.52846 -0.3125,0.71875 L 153.40665,833 l 1.28125,1.28125 c 0.18267,0.19029 0.3125,0.46186 0.3125,0.71875 l 0,1 -1,0 c -0.30945,0 -0.55232,-0.0903 -0.75,-0.28125 L 150.59415,833 153.2504,830.28125 C 153.44808,830.0903 153.69095,830 154.0004,830 l 1,0 z' id='path8532' sodipodi:nodetypes='ccccccccccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/format-indent-more-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/format-indent-more-symbolic-ref.png
new file mode 100644
index 00000000..2fe4b228
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/format-indent-more-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/format-indent-more-symbolic-rtl-ref.png b/rsvg/tests/fixtures/reftests/adwaita/format-indent-more-symbolic-rtl-ref.png
new file mode 100644
index 00000000..0529370d
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/format-indent-more-symbolic-rtl-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/format-indent-more-symbolic-rtl.svg b/rsvg/tests/fixtures/reftests/adwaita/format-indent-more-symbolic-rtl.svg
new file mode 100644
index 00000000..acd9401a
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/format-indent-more-symbolic-rtl.svg
@@ -0,0 +1,35 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='format-indent-less-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.4 r9939' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='40.600095' inkscape:cy='505.11648' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='702' inkscape:window-maximized='1' inkscape:window-width='1366' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='99.999998px' originy='610px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ <inkscape:grid color='#000000' empcolor='#000000' empopacity='0' empspacing='4' enabled='true' id='grid5968' opacity='0.1254902' originx='99.999998px' originy='610px' snapvisiblegridlinesonly='true' spacingx='0.5px' spacingy='0.5px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-141.0002,-827)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-141.0002,-827)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-141.0002,-827)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-141.0002,-827)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-141.0002,-827)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-141.0002,-827)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-141.0002,-827)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-141.0002,-827)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-141.0002,-827)'>
+
+ <rect height='2.0002136' id='rect8526' inkscape:label='a' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible' transform='scale(-1,1)' width='5' x='-148.0002' y='830'/>
+ <rect height='2.0002136' id='rect8528' inkscape:label='a' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible' transform='scale(-1,1)' width='5.9999981' x='-149.0004' y='833.99976'/>
+ <rect height='2.0002136' id='rect8530' inkscape:label='a' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible' transform='scale(-1,1)' width='6.9996033' x='-155' y='837.99976'/>
+ <path inkscape:connector-curvature='0' d='m 155.0004,830 0,1 c 0,0.25689 -0.12983,0.52846 -0.3125,0.71875 L 153.40665,833 l 1.28125,1.28125 c 0.18267,0.19029 0.3125,0.46186 0.3125,0.71875 l 0,1 -1,0 c -0.30945,0 -0.55232,-0.0903 -0.75,-0.28125 L 150.59415,833 153.2504,830.28125 C 153.44808,830.0903 153.69095,830 154.0004,830 l 1,0 z' id='path8532' sodipodi:nodetypes='ccccccccccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/format-indent-more-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/format-indent-more-symbolic.svg
new file mode 100644
index 00000000..d77a3d4e
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/format-indent-more-symbolic.svg
@@ -0,0 +1,33 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:svg='http://www.w3.org/2000/svg' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' version='1.1' inkscape:version='0.47 r22583' height='16' sodipodi:docname='format-indent-more-symbolic.svg' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:cy='-2.68007' inkscape:current-layer='layer9' inkscape:window-width='1310' pagecolor='#555753' showborder='false' showguides='true' inkscape:snap-nodes='false' objecttolerance='10' showgrid='false' inkscape:object-nodes='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:window-x='92' inkscape:snap-bbox='true' bordercolor='#666666' id='namedview88' inkscape:window-maximized='0' inkscape:snap-global='true' inkscape:window-y='59' gridtolerance='10' inkscape:zoom='2' inkscape:window-height='690' borderopacity='1' guidetolerance='10' inkscape:cx='14.003912' inkscape:bbox-paths='false' inkscape:snap-grids='true' inkscape:pageopacity='1' inkscape:snap-to-guides='true'>
+ <inkscape:grid visible='true' spacingx='1px' type='xygrid' spacingy='1px' id='grid4866' empspacing='2' enabled='true' snapvisiblegridlinesonly='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g transform='translate(-161.0002,-277)' inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline'>
+
+ <rect x='169' y='279.99979' id='rect3825-9-8-7-9-1-7' height='2.0002136' inkscape:label='a' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible' width='5'/>
+ <rect x='169' y='283.99979' id='rect3825-9-8-7-8-4-7-66' height='2.0002136' inkscape:label='a' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible' width='5.9999981'/>
+ <rect x='163.0004' y='287.99979' id='rect3825-9-8-7-8-9-9-8-8' height='2.0002136' inkscape:label='a' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible' width='6.9996033'/>
+ <path d='m 163,280 0,1 c 0,0.25689 0.12983,0.52846 0.3125,0.71875 L 164.59375,283 163.3125,284.28125 C 163.12983,284.47154 163,284.74311 163,285 l 0,1 1,0 c 0.30945,0 0.55232,-0.0903 0.75,-0.28125 L 167.40625,283 164.75,280.28125 C 164.55232,280.0903 164.30945,280 164,280 l -1,0 z' id='rect3217-6-2-2-4' sodipodi:nodetypes='ccccccccccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/>
+ </g>
+ <g transform='translate(-161.0002,-277)' inkscape:groupmode='layer' id='layer10' inkscape:label='devices'/>
+ <g transform='translate(-161.0002,-277)' inkscape:groupmode='layer' id='layer11' inkscape:label='apps'/>
+ <g transform='translate(-161.0002,-277)' inkscape:groupmode='layer' id='layer12' inkscape:label='actions'/>
+ <g transform='translate(-161.0002,-277)' inkscape:groupmode='layer' id='layer13' inkscape:label='places'/>
+ <g transform='translate(-161.0002,-277)' inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes'/>
+ <g transform='translate(-161.0002,-277)' inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline'/>
+ <g transform='translate(-161.0002,-277)' inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/format-justify-center-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/format-justify-center-symbolic-ref.png
new file mode 100644
index 00000000..aeb7d12e
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/format-justify-center-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/format-justify-center-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/format-justify-center-symbolic.svg
new file mode 100644
index 00000000..c94017e4
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/format-justify-center-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:svg='http://www.w3.org/2000/svg' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' version='1.1' inkscape:version='0.47 r22583' height='16' sodipodi:docname='format-justify-center-symbolic.svg' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:cy='-2.68007' inkscape:current-layer='layer9' inkscape:window-width='1310' pagecolor='#555753' showborder='false' showguides='true' inkscape:snap-nodes='false' objecttolerance='10' showgrid='false' inkscape:object-nodes='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:window-x='92' inkscape:snap-bbox='true' bordercolor='#666666' id='namedview88' inkscape:window-maximized='0' inkscape:snap-global='true' inkscape:window-y='59' gridtolerance='10' inkscape:zoom='2' inkscape:window-height='690' borderopacity='1' guidetolerance='10' inkscape:cx='74.003912' inkscape:bbox-paths='false' inkscape:snap-grids='true' inkscape:pageopacity='1' inkscape:snap-to-guides='true'>
+ <inkscape:grid visible='true' spacingx='1px' type='xygrid' spacingy='1px' id='grid4866' empspacing='2' enabled='true' snapvisiblegridlinesonly='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g transform='translate(-101.0002,-277)' inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline'>
+
+ <rect x='105.0004' y='279.99979' id='rect3825-9-8-7-9' height='2.0002136' inkscape:label='a' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible' width='7.9996052'/>
+ <rect x='104.0004' y='283.99979' id='rect3825-9-8-7-8-4' height='2.0002136' inkscape:label='a' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible' width='9.9996014'/>
+ <rect x='107.0004' y='287.99979' id='rect3825-9-8-7-8-9-9' height='2.0002136' inkscape:label='a' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible' width='3.9996014'/>
+ </g>
+ <g transform='translate(-101.0002,-277)' inkscape:groupmode='layer' id='layer10' inkscape:label='devices'/>
+ <g transform='translate(-101.0002,-277)' inkscape:groupmode='layer' id='layer11' inkscape:label='apps'/>
+ <g transform='translate(-101.0002,-277)' inkscape:groupmode='layer' id='layer12' inkscape:label='actions'/>
+ <g transform='translate(-101.0002,-277)' inkscape:groupmode='layer' id='layer13' inkscape:label='places'/>
+ <g transform='translate(-101.0002,-277)' inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes'/>
+ <g transform='translate(-101.0002,-277)' inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline'/>
+ <g transform='translate(-101.0002,-277)' inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/format-justify-fill-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/format-justify-fill-symbolic-ref.png
new file mode 100644
index 00000000..9e6aba6b
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/format-justify-fill-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/format-justify-fill-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/format-justify-fill-symbolic.svg
new file mode 100644
index 00000000..1b8cefb7
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/format-justify-fill-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:svg='http://www.w3.org/2000/svg' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' version='1.1' inkscape:version='0.47 r22583' height='16' sodipodi:docname='format-justify-fill-symbolic.svg' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:cy='-2.68007' inkscape:current-layer='layer9' inkscape:window-width='1310' pagecolor='#555753' showborder='false' showguides='true' inkscape:snap-nodes='false' objecttolerance='10' showgrid='false' inkscape:object-nodes='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:window-x='92' inkscape:snap-bbox='true' bordercolor='#666666' id='namedview88' inkscape:window-maximized='0' inkscape:snap-global='true' inkscape:window-y='59' gridtolerance='10' inkscape:zoom='2' inkscape:window-height='690' borderopacity='1' guidetolerance='10' inkscape:cx='94.00391' inkscape:bbox-paths='false' inkscape:snap-grids='true' inkscape:pageopacity='1' inkscape:snap-to-guides='true'>
+ <inkscape:grid visible='true' spacingx='1px' type='xygrid' spacingy='1px' id='grid4866' empspacing='2' enabled='true' snapvisiblegridlinesonly='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g transform='translate(-81.0002,-277)' inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline'>
+
+ <rect x='84.000397' y='279.99979' id='rect3825-9-8-7' height='2.0002136' inkscape:label='a' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible' width='9.9996014'/>
+ <rect x='84.000397' y='283.99979' id='rect3825-9-8-7-8' height='2.0002136' inkscape:label='a' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible' width='9.9996014'/>
+ <rect x='84.000397' y='287.99979' id='rect3825-9-8-7-8-9' height='2.0002136' inkscape:label='a' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible' width='9.9996014'/>
+ </g>
+ <g transform='translate(-81.0002,-277)' inkscape:groupmode='layer' id='layer10' inkscape:label='devices'/>
+ <g transform='translate(-81.0002,-277)' inkscape:groupmode='layer' id='layer11' inkscape:label='apps'/>
+ <g transform='translate(-81.0002,-277)' inkscape:groupmode='layer' id='layer12' inkscape:label='actions'/>
+ <g transform='translate(-81.0002,-277)' inkscape:groupmode='layer' id='layer13' inkscape:label='places'/>
+ <g transform='translate(-81.0002,-277)' inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes'/>
+ <g transform='translate(-81.0002,-277)' inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline'/>
+ <g transform='translate(-81.0002,-277)' inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/format-justify-left-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/format-justify-left-symbolic-ref.png
new file mode 100644
index 00000000..36f7ba31
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/format-justify-left-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/format-justify-left-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/format-justify-left-symbolic.svg
new file mode 100644
index 00000000..66433603
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/format-justify-left-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:svg='http://www.w3.org/2000/svg' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' version='1.1' inkscape:version='0.47 r22583' height='16' sodipodi:docname='format-justify-left-symbolic.svg' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:cy='-2.68007' inkscape:current-layer='layer9' inkscape:window-width='1310' pagecolor='#555753' showborder='false' showguides='true' inkscape:snap-nodes='false' objecttolerance='10' showgrid='false' inkscape:object-nodes='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:window-x='92' inkscape:snap-bbox='true' bordercolor='#666666' id='namedview88' inkscape:window-maximized='0' inkscape:snap-global='true' inkscape:window-y='59' gridtolerance='10' inkscape:zoom='2' inkscape:window-height='690' borderopacity='1' guidetolerance='10' inkscape:cx='54.003912' inkscape:bbox-paths='false' inkscape:snap-grids='true' inkscape:pageopacity='1' inkscape:snap-to-guides='true'>
+ <inkscape:grid visible='true' spacingx='1px' type='xygrid' spacingy='1px' id='grid4866' empspacing='2' enabled='true' snapvisiblegridlinesonly='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g transform='translate(-121.0002,-277)' inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline'>
+
+ <rect x='124.0004' y='279.99979' id='rect3825-9-8-7-9-1' height='2.0002136' inkscape:label='a' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible' width='7.9996052'/>
+ <rect x='124.0004' y='283.99979' id='rect3825-9-8-7-8-4-7' height='2.0002136' inkscape:label='a' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible' width='9.9996014'/>
+ <rect x='124.0004' y='287.99979' id='rect3825-9-8-7-8-9-9-8' height='2.0002136' inkscape:label='a' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible' width='3.9996033'/>
+ </g>
+ <g transform='translate(-121.0002,-277)' inkscape:groupmode='layer' id='layer10' inkscape:label='devices'/>
+ <g transform='translate(-121.0002,-277)' inkscape:groupmode='layer' id='layer11' inkscape:label='apps'/>
+ <g transform='translate(-121.0002,-277)' inkscape:groupmode='layer' id='layer12' inkscape:label='actions'/>
+ <g transform='translate(-121.0002,-277)' inkscape:groupmode='layer' id='layer13' inkscape:label='places'/>
+ <g transform='translate(-121.0002,-277)' inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes'/>
+ <g transform='translate(-121.0002,-277)' inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline'/>
+ <g transform='translate(-121.0002,-277)' inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/format-justify-right-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/format-justify-right-symbolic-ref.png
new file mode 100644
index 00000000..36340523
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/format-justify-right-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/format-justify-right-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/format-justify-right-symbolic.svg
new file mode 100644
index 00000000..7d0f2696
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/format-justify-right-symbolic.svg
@@ -0,0 +1,34 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:svg='http://www.w3.org/2000/svg' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' version='1.1' inkscape:version='0.47 r22583' height='16' sodipodi:docname='format-justify-right-symbolic.svg' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:cy='-2.68007' inkscape:current-layer='layer9' inkscape:window-width='1310' pagecolor='#555753' showborder='false' showguides='true' inkscape:snap-nodes='false' objecttolerance='10' showgrid='false' inkscape:object-nodes='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:window-x='92' inkscape:snap-bbox='true' bordercolor='#666666' id='namedview88' inkscape:window-maximized='0' inkscape:snap-global='true' inkscape:window-y='59' gridtolerance='10' inkscape:zoom='2' inkscape:window-height='690' borderopacity='1' guidetolerance='10' inkscape:cx='34.003912' inkscape:bbox-paths='false' inkscape:snap-grids='true' inkscape:pageopacity='1' inkscape:snap-to-guides='true'>
+ <inkscape:grid visible='true' spacingx='1px' type='xygrid' spacingy='1px' id='grid4866' empspacing='2' enabled='true' snapvisiblegridlinesonly='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g transform='translate(-141.0002,-277)' inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline'>
+ <g transform='translate(40,-80)' id='g4910'>
+
+ <rect x='106.0004' y='359.99979' id='rect3825-9-8-7-9-1-5' height='2.0002136' inkscape:label='a' width='7.9996052' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible'/>
+ <rect x='104.0004' y='363.99979' id='rect3825-9-8-7-8-4-7-6' height='2.0002136' inkscape:label='a' width='9.9996014' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible'/>
+ <rect x='110' y='367.99979' id='rect3825-9-8-7-8-9-9-8-3' height='2.0002136' inkscape:label='a' width='4.0000019' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible'/>
+ </g>
+ </g>
+ <g transform='translate(-141.0002,-277)' inkscape:groupmode='layer' id='layer10' inkscape:label='devices'/>
+ <g transform='translate(-141.0002,-277)' inkscape:groupmode='layer' id='layer11' inkscape:label='apps'/>
+ <g transform='translate(-141.0002,-277)' inkscape:groupmode='layer' id='layer12' inkscape:label='actions'/>
+ <g transform='translate(-141.0002,-277)' inkscape:groupmode='layer' id='layer13' inkscape:label='places'/>
+ <g transform='translate(-141.0002,-277)' inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes'/>
+ <g transform='translate(-141.0002,-277)' inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline'/>
+ <g transform='translate(-141.0002,-277)' inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/format-text-bold-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/format-text-bold-symbolic-ref.png
new file mode 100644
index 00000000..c4d650ac
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/format-text-bold-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/format-text-bold-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/format-text-bold-symbolic.svg
new file mode 100644
index 00000000..6ab5e8e6
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/format-text-bold-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:svg='http://www.w3.org/2000/svg' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' sodipodi:docname='format-text-bold-symbolic.svg' version='1.1' inkscape:version='0.48.0 r9654' height='16' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:cy='11.29341' pagecolor='#555753' borderopacity='1' showborder='false' inkscape:bbox-paths='false' guidetolerance='10' inkscape:window-width='1310' showguides='true' inkscape:object-nodes='true' inkscape:snap-bbox='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:snap-nodes='false' bordercolor='#666666' objecttolerance='10' id='namedview88' showgrid='false' inkscape:window-maximized='0' inkscape:window-x='54' inkscape:snap-global='true' inkscape:window-y='26' gridtolerance='10' inkscape:window-height='690' inkscape:snap-to-guides='true' inkscape:current-layer='layer12' inkscape:zoom='1' inkscape:cx='110.533' inkscape:snap-grids='true' inkscape:pageopacity='1'>
+ <inkscape:grid spacingx='1px' spacingy='1px' id='grid4866' empspacing='2' enabled='true' type='xygrid' snapvisiblegridlinesonly='true' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:label='status' transform='translate(-160.0002,-706)' inkscape:groupmode='layer' id='layer9' style='display:inline'/>
+ <g inkscape:label='devices' transform='translate(-160.0002,-706)' inkscape:groupmode='layer' id='layer10'/>
+ <g inkscape:label='apps' transform='translate(-160.0002,-706)' inkscape:groupmode='layer' id='layer11'/>
+ <g inkscape:label='actions' transform='translate(-160.0002,-706)' inkscape:groupmode='layer' id='layer12'>
+
+ <path inkscape:connector-curvature='0' d='m 165,709 0,2 6,0 c 0.42816,0 1,0.61414 1,1 l 0,1 -5,0 c -0.91927,0 -1.7356,0.38396 -2.25,0.96875 -0.5144,0.58479 -0.75639,1.31063 -0.75,2.03125 0.006,0.72062 0.26893,1.45271 0.78125,2.03125 C 165.29357,718.60979 166.09172,719 167,719 l 6,0 1,0 0,-1 0,-6 c 0,-1.63434 -1.3198,-3 -3,-3 l -6,0 z m 2,6 5,0 0,2 -5,0 c -0.39787,0 -0.56691,-0.10979 -0.71875,-0.28125 C 166.12941,716.54729 166.00248,716.27938 166,716 c -0.002,-0.27938 0.10467,-0.55354 0.25,-0.71875 C 166.39533,715.11604 166.57764,715 167,715 z' id='path11643-3-1' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 164,709 0,2 5,0 c 0.42816,0 1,0.61414 1,1 l 0,1 -5,0 c -0.91927,0 -1.7356,0.38396 -2.25,0.96875 -0.5144,0.58479 -0.75639,1.31063 -0.75,2.03125 0.006,0.72062 0.26893,1.45271 0.78125,2.03125 C 163.29357,718.60979 164.09172,719 165,719 l 6,0 1,0 0,-1 0,-6 c 0,-1.63434 -1.3198,-3 -3,-3 l -5,0 z m 1,6 5,0 0,2 -5,0 c -0.39787,0 -0.56691,-0.10979 -0.71875,-0.28125 C 164.12941,716.54729 164.00248,716.27938 164,716 c -0.002,-0.27938 0.10467,-0.55354 0.25,-0.71875 C 164.39533,715.11604 164.57764,715 165,715 z' id='path11643-3-1-2' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+ <g inkscape:label='places' transform='translate(-160.0002,-706)' inkscape:groupmode='layer' id='layer13'/>
+ <g inkscape:label='mimetypes' transform='translate(-160.0002,-706)' inkscape:groupmode='layer' id='layer14'/>
+ <g inkscape:label='emblems' transform='translate(-160.0002,-706)' inkscape:groupmode='layer' id='layer15' style='display:inline'/>
+ <g inkscape:label='categories' transform='translate(-160.0002,-706)' inkscape:groupmode='layer' id='g4953' style='display:inline'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/format-text-direction-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/format-text-direction-symbolic-ref.png
new file mode 100644
index 00000000..2e348775
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/format-text-direction-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/format-text-direction-symbolic-rtl-ref.png b/rsvg/tests/fixtures/reftests/adwaita/format-text-direction-symbolic-rtl-ref.png
new file mode 100644
index 00000000..c84401d3
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/format-text-direction-symbolic-rtl-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/format-text-direction-symbolic-rtl.svg b/rsvg/tests/fixtures/reftests/adwaita/format-text-direction-symbolic-rtl.svg
new file mode 100644
index 00000000..884a332f
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/format-text-direction-symbolic-rtl.svg
@@ -0,0 +1,33 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.1 r9760' version='1.1' height='15.999999' sodipodi:docname='format-text-direction-rtl-symbolic.svg' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns='http://www.w3.org/2000/svg' id='svg7384' width='16.00001' xmlns:cc='http://creativecommons.org/ns#' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:snap-global='true' inkscape:snap-others='false' inkscape:pageopacity='1' inkscape:pageshadow='2' inkscape:object-nodes='false' inkscape:object-paths='false' inkscape:bbox-paths='false' inkscape:zoom='1' pagecolor='#555753' borderopacity='1' id='namedview88' inkscape:snap-grids='true' inkscape:window-width='1226' inkscape:window-height='967' guidetolerance='10' showgrid='false' inkscape:current-layer='layer12' bordercolor='#666666' objecttolerance='10' gridtolerance='10' showborder='false' inkscape:snap-bbox='true' showguides='true' inkscape:snap-nodes='true' inkscape:cx='-245.32057' inkscape:cy='-123.01275' inkscape:snap-bbox-midpoints='false' inkscape:guide-bbox='true' inkscape:snap-to-guides='true' inkscape:window-maximized='0' inkscape:window-x='2804' inkscape:window-y='77'>
+ <inkscape:grid type='xygrid' enabled='true' id='grid4866' visible='true' spacingx='1px' spacingy='1px' snapvisiblegridlinesonly='true' empspacing='2'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g transform='translate(-301.00019,-647)' inkscape:groupmode='layer' id='layer9' style='display:inline' inkscape:label='status'/>
+ <g transform='translate(-301.00019,-647)' inkscape:groupmode='layer' id='layer10' inkscape:label='devices'/>
+ <g transform='translate(-301.00019,-647)' inkscape:groupmode='layer' id='layer11' inkscape:label='apps'/>
+ <g transform='translate(-301.00019,-647)' inkscape:groupmode='layer' id='layer13' inkscape:label='places'/>
+ <g transform='translate(-301.00019,-647)' inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes'/>
+ <g transform='translate(-301.00019,-647)' inkscape:groupmode='layer' id='layer15' style='display:inline' inkscape:label='emblems'/>
+ <g transform='translate(-301.00019,-647)' inkscape:groupmode='layer' id='g71291' style='display:inline' inkscape:label='emotes'/>
+ <g transform='translate(-301.00019,-647)' inkscape:groupmode='layer' id='g4953' style='display:inline' inkscape:label='categories'/>
+ <g transform='translate(-301.00019,-647)' inkscape:groupmode='layer' id='layer12' style='display:inline' inkscape:label='actions'>
+ <path d='m 307.00032,647.04926 0,2 6,0 c 0.42816,0 1,0.61414 1,1 l 0,1 -5,0 c -0.91927,0 -1.7356,0.38396 -2.25,0.96875 -0.5144,0.58479 -0.75639,1.31063 -0.75,2.03125 0.006,0.72062 0.26893,1.45271 0.78125,2.03125 0.51232,0.57854 1.31047,0.96875 2.21875,0.96875 l 6,0 1,0 0,-1 0,-6 c 0,-1.63434 -1.3198,-3 -3,-3 l -6,0 z m 2,6 5,0 0,2 -5,0 c -0.39787,0 -0.56691,-0.10979 -0.71875,-0.28125 -0.15184,-0.17146 -0.27877,-0.43937 -0.28125,-0.71875 -0.002,-0.27938 0.10467,-0.55354 0.25,-0.71875 0.14533,-0.16521 0.32764,-0.28125 0.75,-0.28125 z' id='path11643-3-2-9' style='font-size:xx-small;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans' inkscape:connector-curvature='0'/>
+
+ <path sodipodi:nodetypes='ccccccccscccccccc' d='m 305.0002,662.00001 -1,-10e-6 c -0.26531,-3e-5 -0.53058,-0.0931 -0.71875,-0.28124 l -2,-2.00001 -0.28126,-0.28125 0,-0.87499 0.28126,-0.28126 2,-1.99999 c 0.18818,-0.18821 0.45347,-0.28121 0.71876,-0.28121 l 1,-10e-6 0,1 c 4e-5,0.26531 -0.0931,0.53059 -0.28121,0.71877 l -1.28126,1.28124 1.28125,1.28125 c 0.18815,0.18817 0.28125,0.45345 0.28125,0.71875 l 0,1 z' id='path4484' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans' inkscape:connector-curvature='0'/>
+ <path d='m 303,658 0,2 12.9375,0 0,-2 L 303,658 z' id='path4486' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans' inkscape:connector-curvature='0'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/format-text-direction-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/format-text-direction-symbolic.svg
new file mode 100644
index 00000000..51ecb9f0
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/format-text-direction-symbolic.svg
@@ -0,0 +1,33 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.1 r9760' version='1.1' height='16' sodipodi:docname='format-text-direction-ltr-symbolic.svg' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns='http://www.w3.org/2000/svg' id='svg7384' width='16.000002' xmlns:cc='http://creativecommons.org/ns#' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:snap-global='true' inkscape:snap-others='false' inkscape:pageopacity='1' inkscape:pageshadow='2' inkscape:object-nodes='false' inkscape:object-paths='false' inkscape:bbox-paths='false' inkscape:zoom='1' pagecolor='#555753' borderopacity='1' id='namedview88' inkscape:snap-grids='true' inkscape:window-width='1226' inkscape:window-height='967' guidetolerance='10' showgrid='false' inkscape:current-layer='layer12' bordercolor='#666666' objecttolerance='10' gridtolerance='10' showborder='false' inkscape:snap-bbox='true' showguides='true' inkscape:snap-nodes='true' inkscape:cx='-225.32058' inkscape:cy='-123.01275' inkscape:snap-bbox-midpoints='false' inkscape:guide-bbox='true' inkscape:snap-to-guides='true' inkscape:window-maximized='0' inkscape:window-x='2804' inkscape:window-y='77'>
+ <inkscape:grid type='xygrid' enabled='true' id='grid4866' visible='true' spacingx='1px' spacingy='1px' snapvisiblegridlinesonly='true' empspacing='2'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g transform='translate(-281.0002,-647)' inkscape:groupmode='layer' id='layer9' style='display:inline' inkscape:label='status'/>
+ <g transform='translate(-281.0002,-647)' inkscape:groupmode='layer' id='layer10' inkscape:label='devices'/>
+ <g transform='translate(-281.0002,-647)' inkscape:groupmode='layer' id='layer11' inkscape:label='apps'/>
+ <g transform='translate(-281.0002,-647)' inkscape:groupmode='layer' id='layer13' inkscape:label='places'/>
+ <g transform='translate(-281.0002,-647)' inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes'/>
+ <g transform='translate(-281.0002,-647)' inkscape:groupmode='layer' id='layer15' style='display:inline' inkscape:label='emblems'/>
+ <g transform='translate(-281.0002,-647)' inkscape:groupmode='layer' id='g71291' style='display:inline' inkscape:label='emotes'/>
+ <g transform='translate(-281.0002,-647)' inkscape:groupmode='layer' id='g4953' style='display:inline' inkscape:label='categories'/>
+ <g transform='translate(-281.0002,-647)' inkscape:groupmode='layer' id='layer12' style='display:inline' inkscape:label='actions'>
+
+ <path d='m 283.00032,647 0,2 6,0 c 0.42816,0 1,0.61414 1,1 l 0,1 -5,0 c -0.91927,0 -1.7356,0.38396 -2.25,0.96875 -0.5144,0.58479 -0.75639,1.31063 -0.75,2.03125 0.006,0.72062 0.26893,1.45271 0.78125,2.03125 0.51232,0.57854 1.31047,0.96875 2.21875,0.96875 l 6,0 1,0 0,-1 0,-6 c 0,-1.63434 -1.3198,-3 -3,-3 l -6,0 z m 2,6 5,0 0,2 -5,0 c -0.39787,0 -0.56691,-0.10979 -0.71875,-0.28125 -0.15184,-0.17146 -0.27877,-0.43937 -0.28125,-0.71875 -0.002,-0.27938 0.10467,-0.55354 0.25,-0.71875 0.14533,-0.16521 0.32764,-0.28125 0.75,-0.28125 z' id='path11643-3-2-2' style='font-size:xx-small;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans' inkscape:connector-curvature='0'/>
+ <path sodipodi:nodetypes='ccccccccscccccccc' d='m 293.00019,662.00001 1,-10e-6 c 0.26531,-3e-5 0.53058,-0.0931 0.71875,-0.28124 l 2,-2.00001 0.28126,-0.28125 0,-0.87499 -0.28126,-0.28126 -2,-1.99999 c -0.18818,-0.18821 -0.45347,-0.28121 -0.71876,-0.28121 l -1,-10e-6 0,1 c -4e-5,0.26531 0.0931,0.53059 0.28121,0.71877 l 1.28126,1.28124 -1.28125,1.28125 c -0.18815,0.18817 -0.28125,0.45345 -0.28125,0.71875 l 0,1 z' id='path4484-2' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans' inkscape:connector-curvature='0'/>
+ <path d='m 281.9375,658 0,2 13.0625,0 0,-2 -13.0625,0 z' id='path4486-0' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans' inkscape:connector-curvature='0'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/format-text-italic-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/format-text-italic-symbolic-ref.png
new file mode 100644
index 00000000..c2e6a36c
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/format-text-italic-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/format-text-italic-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/format-text-italic-symbolic.svg
new file mode 100644
index 00000000..0498699b
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/format-text-italic-symbolic.svg
@@ -0,0 +1,30 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:svg='http://www.w3.org/2000/svg' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' sodipodi:docname='format-text-italic-symbolic.svg' version='1.1' inkscape:version='0.48.0 r9654' height='16' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:cy='11.29341' pagecolor='#555753' borderopacity='1' showborder='false' inkscape:bbox-paths='false' guidetolerance='10' inkscape:window-width='1310' showguides='true' inkscape:object-nodes='true' inkscape:snap-bbox='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:snap-nodes='false' bordercolor='#666666' objecttolerance='10' id='namedview88' showgrid='false' inkscape:window-maximized='0' inkscape:window-x='54' inkscape:snap-global='true' inkscape:window-y='26' gridtolerance='10' inkscape:window-height='690' inkscape:snap-to-guides='true' inkscape:current-layer='layer12' inkscape:zoom='1' inkscape:cx='50.533002' inkscape:snap-grids='true' inkscape:pageopacity='1'>
+ <inkscape:grid spacingx='1px' spacingy='1px' id='grid4866' empspacing='2' enabled='true' type='xygrid' snapvisiblegridlinesonly='true' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:label='status' transform='translate(-220.0002,-706)' inkscape:groupmode='layer' id='layer9' style='display:inline'/>
+ <g inkscape:label='devices' transform='translate(-220.0002,-706)' inkscape:groupmode='layer' id='layer10'/>
+ <g inkscape:label='apps' transform='translate(-220.0002,-706)' inkscape:groupmode='layer' id='layer11'/>
+ <g inkscape:label='actions' transform='translate(-220.0002,-706)' inkscape:groupmode='layer' id='layer12'>
+
+ <path inkscape:connector-curvature='0' d='m 224.5,709 0,2 6,0 c 0.42816,0 0.59383,0.26733 0.46875,0.71875 L 230.625,713 l -5.25,0 c -1.83854,0 -3.12514,1.35237 -3.5,2.75 -0.18743,0.69881 -0.16219,1.47883 0.25,2.15625 0.41219,0.67742 1.24797,1.09375 2.15625,1.09375 l 6,0 0.75,0 0.21875,-0.71875 1.65625,-6 C 233.34093,710.71247 232.1802,709 230.5,709 l -6,0 z m 0.875,6 4.6875,0 -0.5625,2 -5.21875,0 c -0.39787,0 -0.42459,-0.0837 -0.46875,-0.15625 -0.0442,-0.0726 -0.0808,-0.29256 0,-0.59375 0.16157,-0.60237 0.71778,-1.25 1.5625,-1.25 z' id='path11643-3-5' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+ <g inkscape:label='places' transform='translate(-220.0002,-706)' inkscape:groupmode='layer' id='layer13'/>
+ <g inkscape:label='mimetypes' transform='translate(-220.0002,-706)' inkscape:groupmode='layer' id='layer14'/>
+ <g inkscape:label='emblems' transform='translate(-220.0002,-706)' inkscape:groupmode='layer' id='layer15' style='display:inline'/>
+ <g inkscape:label='categories' transform='translate(-220.0002,-706)' inkscape:groupmode='layer' id='g4953' style='display:inline'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/format-text-strikethrough-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/format-text-strikethrough-symbolic-ref.png
new file mode 100644
index 00000000..49e86668
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/format-text-strikethrough-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/format-text-strikethrough-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/format-text-strikethrough-symbolic.svg
new file mode 100644
index 00000000..75fed301
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/format-text-strikethrough-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:svg='http://www.w3.org/2000/svg' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' sodipodi:docname='format-text-strikethrough-symbolic.svg' version='1.1' inkscape:version='0.48.0 r9654' height='16' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:cy='11.29341' pagecolor='#555753' borderopacity='1' showborder='false' inkscape:bbox-paths='false' guidetolerance='10' inkscape:window-width='1310' showguides='true' inkscape:object-nodes='true' inkscape:snap-bbox='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:snap-nodes='false' bordercolor='#666666' objecttolerance='10' id='namedview88' showgrid='false' inkscape:window-maximized='0' inkscape:window-x='54' inkscape:snap-global='true' inkscape:window-y='26' gridtolerance='10' inkscape:window-height='690' inkscape:snap-to-guides='true' inkscape:current-layer='layer12' inkscape:zoom='1' inkscape:cx='70.533' inkscape:snap-grids='true' inkscape:pageopacity='1'>
+ <inkscape:grid spacingx='1px' spacingy='1px' id='grid4866' empspacing='2' enabled='true' type='xygrid' snapvisiblegridlinesonly='true' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:label='status' transform='translate(-200.0002,-706)' inkscape:groupmode='layer' id='layer9' style='display:inline'/>
+ <g inkscape:label='devices' transform='translate(-200.0002,-706)' inkscape:groupmode='layer' id='layer10'/>
+ <g inkscape:label='apps' transform='translate(-200.0002,-706)' inkscape:groupmode='layer' id='layer11'/>
+ <g inkscape:label='actions' transform='translate(-200.0002,-706)' inkscape:groupmode='layer' id='layer12'>
+
+ <path inkscape:connector-curvature='0' d='m 204,709 0,2 6,0 c 0.42816,0 1,0.61414 1,1 l 2,0 c 0,-1.63434 -1.3198,-3 -3,-3 l -6,0 z m -1,7 c 0.006,0.72062 0.26893,1.45271 0.78125,2.03125 C 204.29357,718.60979 205.09172,719 206,719 l 6,0 1,0 0,-1 0,-2 -2,0 0,1 -5,0 c -0.39787,0 -0.56691,-0.10979 -0.71875,-0.28125 C 205.12941,716.54729 205.00248,716.27938 205,716 l -2,0 z' id='path11643-3-2-6' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 201,713 0,2 14,0 0,-2 -14,0 z' id='path5100-8' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+ <g inkscape:label='places' transform='translate(-200.0002,-706)' inkscape:groupmode='layer' id='layer13'/>
+ <g inkscape:label='mimetypes' transform='translate(-200.0002,-706)' inkscape:groupmode='layer' id='layer14'/>
+ <g inkscape:label='emblems' transform='translate(-200.0002,-706)' inkscape:groupmode='layer' id='layer15' style='display:inline'/>
+ <g inkscape:label='categories' transform='translate(-200.0002,-706)' inkscape:groupmode='layer' id='g4953' style='display:inline'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/format-text-underline-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/format-text-underline-symbolic-ref.png
new file mode 100644
index 00000000..d68ce07c
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/format-text-underline-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/format-text-underline-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/format-text-underline-symbolic.svg
new file mode 100644
index 00000000..a9e5bda8
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/format-text-underline-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:svg='http://www.w3.org/2000/svg' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' sodipodi:docname='format-text-underline-symbolic.svg' version='1.1' inkscape:version='0.48.0 r9654' height='16' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:cy='11.29341' pagecolor='#555753' borderopacity='1' showborder='false' inkscape:bbox-paths='false' guidetolerance='10' inkscape:window-width='1310' showguides='true' inkscape:object-nodes='true' inkscape:snap-bbox='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:snap-nodes='false' bordercolor='#666666' objecttolerance='10' id='namedview88' showgrid='false' inkscape:window-maximized='0' inkscape:window-x='54' inkscape:snap-global='true' inkscape:window-y='26' gridtolerance='10' inkscape:window-height='690' inkscape:snap-to-guides='true' inkscape:current-layer='layer12' inkscape:zoom='1' inkscape:cx='90.533' inkscape:snap-grids='true' inkscape:pageopacity='1'>
+ <inkscape:grid spacingx='1px' spacingy='1px' id='grid4866' empspacing='2' enabled='true' type='xygrid' snapvisiblegridlinesonly='true' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:label='status' transform='translate(-180.0002,-706)' inkscape:groupmode='layer' id='layer9' style='display:inline'/>
+ <g inkscape:label='devices' transform='translate(-180.0002,-706)' inkscape:groupmode='layer' id='layer10'/>
+ <g inkscape:label='apps' transform='translate(-180.0002,-706)' inkscape:groupmode='layer' id='layer11'/>
+ <g inkscape:label='actions' transform='translate(-180.0002,-706)' inkscape:groupmode='layer' id='layer12'>
+
+ <path inkscape:connector-curvature='0' d='m 184,708 0,2 6,0 c 0.42816,0 1,0.61414 1,1 l 0,1 -5,0 c -0.91927,0 -1.7356,0.38396 -2.25,0.96875 -0.5144,0.58479 -0.75639,1.31063 -0.75,2.03125 0.006,0.72062 0.26893,1.45271 0.78125,2.03125 C 184.29357,717.60979 185.09172,718 186,718 l 6,0 1,0 0,-1 0,-6 c 0,-1.63434 -1.3198,-3 -3,-3 l -6,0 z m 2,6 5,0 0,2 -5,0 c -0.39787,0 -0.56691,-0.10979 -0.71875,-0.28125 C 185.12941,715.54729 185.00248,715.27938 185,715 c -0.002,-0.27938 0.10467,-0.55354 0.25,-0.71875 C 185.39533,714.11604 185.57764,714 186,714 z' id='path11643-3-2' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 182,719 0,2 12,0 0,-2 -12,0 z' id='path5100' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+ <g inkscape:label='places' transform='translate(-180.0002,-706)' inkscape:groupmode='layer' id='layer13'/>
+ <g inkscape:label='mimetypes' transform='translate(-180.0002,-706)' inkscape:groupmode='layer' id='layer14'/>
+ <g inkscape:label='emblems' transform='translate(-180.0002,-706)' inkscape:groupmode='layer' id='layer15' style='display:inline'/>
+ <g inkscape:label='categories' transform='translate(-180.0002,-706)' inkscape:groupmode='layer' id='g4953' style='display:inline'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/gnome-power-manager-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/gnome-power-manager-symbolic-ref.png
new file mode 100644
index 00000000..58153dad
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/gnome-power-manager-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/gnome-power-manager-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/gnome-power-manager-symbolic.svg
new file mode 100644
index 00000000..10ddd4ac
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/gnome-power-manager-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg sodipodi:docname='gnome-power-manager-symbolic.svg' xmlns:cc='http://creativecommons.org/ns#' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:svg='http://www.w3.org/2000/svg' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns='http://www.w3.org/2000/svg' width='16' xmlns:dc='http://purl.org/dc/elements/1.1/' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' version='1.1' inkscape:version='0.48.1 r9760'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:snap-others='false' inkscape:cx='355.84678' inkscape:cy='51.32375' inkscape:window-x='2082' inkscape:window-y='102' inkscape:zoom='1' inkscape:window-height='1162' bordercolor='#666666' pagecolor='#555753' guidetolerance='10' inkscape:object-nodes='true' inkscape:guide-bbox='true' inkscape:snap-bbox='true' borderopacity='1' objecttolerance='10' inkscape:pageshadow='2' inkscape:object-paths='true' inkscape:window-maximized='0' gridtolerance='10' showgrid='false' inkscape:snap-nodes='true' inkscape:bbox-paths='false' inkscape:snap-to-guides='true' id='namedview88' showguides='true' inkscape:snap-global='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-grids='true' inkscape:pageopacity='1' showborder='false' inkscape:current-layer='layer11' inkscape:window-width='1598'>
+ <inkscape:grid empspacing='2' visible='true' type='xygrid' enabled='true' spacingx='1px' spacingy='1px' id='grid4866' snapvisiblegridlinesonly='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:label='status' transform='translate(-142.0002,-530)' style='display:inline' inkscape:groupmode='layer' id='layer9'/>
+ <g inkscape:label='devices' transform='translate(-142.0002,-530)' inkscape:groupmode='layer' id='layer10'/>
+ <g inkscape:label='apps' transform='translate(-142.0002,-530)' inkscape:groupmode='layer' id='layer11'>
+ <path sodipodi:nodetypes='cssccccccccccccccccccsccccc' d='m 145.46889,530 c -0.49032,0 -0.79606,0.2289 -1.03123,0.46967 -0.23518,0.24077 -0.4375,0.5596 -0.4375,1.03327 l 4e-5,0.49706 -2,0 0,14 c 0,0 7,0 7.00007,0 l 0,-2 -4.95072,0.0494 L 144.0002,534 l 1.99993,0 c 0,-0.66536 7e-5,-2 7e-5,-2 l 3,0 -1.3e-4,2 1.99997,0 1.6e-4,1 2,0 -2e-4,-3 -1.99996,0 0,-0.37182 0,-0.0313 c -0.0239,-0.43144 -0.17024,-0.75376 -0.40625,-1.03327 -0.22372,-0.26496 -0.62668,-0.53034 -1.15623,-0.53229 l 0,-0.0313 -0.0625,0 -3.90618,0 z' inkscape:connector-curvature='0' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans' id='path11308-6'/>
+ <path sodipodi:nodetypes='ccccccccccccccccc' d='m 148.0002,540 2,0 c 0.27642,-1.10346 1.06513,-3.72415 3,-4 l 3,0 0,2 2,0 0,2 -2,0 0,2 2,0 0,2 -2,0 0,2 -3,0 c -1.93487,-0.27585 -2.72358,-2.89656 -3,-4 l -2,0 z' inkscape:connector-curvature='0' style='fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;display:inline' id='path2182'/>
+
+ </g>
+ <g inkscape:label='places' transform='translate(-142.0002,-530)' inkscape:groupmode='layer' id='layer13'/>
+ <g inkscape:label='mimetypes' transform='translate(-142.0002,-530)' inkscape:groupmode='layer' id='layer14'/>
+ <g inkscape:label='emblems' transform='translate(-142.0002,-530)' style='display:inline' inkscape:groupmode='layer' id='layer15'/>
+ <g inkscape:label='emotes' transform='translate(-142.0002,-530)' style='display:inline' inkscape:groupmode='layer' id='g71291'/>
+ <g inkscape:label='categories' transform='translate(-142.0002,-530)' style='display:inline' inkscape:groupmode='layer' id='g4953'/>
+ <g inkscape:label='actions' transform='translate(-142.0002,-530)' style='display:inline' inkscape:groupmode='layer' id='layer12'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/go-bottom-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/go-bottom-symbolic-ref.png
new file mode 100644
index 00000000..feb60922
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/go-bottom-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/go-bottom-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/go-bottom-symbolic.svg
new file mode 100644
index 00000000..610d2472
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/go-bottom-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='go-bottom-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.5 r10040' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='false' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='82.272007' inkscape:cy='5.5714516' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1014' inkscape:window-maximized='1' inkscape:window-width='1920' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='2.8284271'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='80px' originy='530px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-161.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-161.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-161.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-161.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-161.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-161.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-161.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-161.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-161.0002,-747)'>
+
+ <rect height='12' id='rect8382' rx='0' ry='0' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' transform='matrix(0,1,-1,0,0,0)' width='2' x='758' y='-175.0002'/>
+ <path inkscape:connector-curvature='0' d='m 169.0002,757.4375 -5.71875,-5.71875 C 163.08558,751.52288 163.0002,751.25562 163.0002,751 l 0,-1 1,0 c 0.25562,0 0.52288,0.0854 0.71875,0.28125 l 4.28125,4.28125 4.28125,-4.28125 C 173.47732,750.08538 173.74458,750 174.0002,750 l 1,0 0,1 c 0,0.25562 -0.0854,0.52288 -0.28125,0.71875 z' id='rect6014-1-6-3' sodipodi:nodetypes='ccscsccsscscc' style='fill:#bebebe;fill-opacity:1;stroke:none;display:inline'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/go-down-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/go-down-symbolic-ref.png
new file mode 100644
index 00000000..afd4741b
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/go-down-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/go-down-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/go-down-symbolic.svg
new file mode 100644
index 00000000..f8585118
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/go-down-symbolic.svg
@@ -0,0 +1,35 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='go-down-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.92pre1 r' viewBox='0 0 16 16' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='25.750874' inkscape:cy='27.7195' inkscape:document-units='px' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='false' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='8'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='60' originy='530' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-181.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-181.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-181.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-181.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-181.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-181.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-181.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-181.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-181.0002,-747)'>
+
+ <path inkscape:connector-curvature='0' d='m 189.0002,759.4375 -5.71875,-5.7187 C 183.08558,753.5229 183.0002,753.2556 183.0002,753 v -1 h 1 c 0.25562,0 0.52288,0.085 0.71875,0.2813 l 4.28125,4.2812 4.28125,-4.2812 C 193.47732,752.0854 193.74458,752 194.0002,752 h 1 v 1 c 0,0.2556 -0.0854,0.5229 -0.28125,0.7188 z' id='path9955' sodipodi:nodetypes='ccscsccsscscc' style='display:inline;fill:#bebebe;fill-opacity:1;stroke:none'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/go-first-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/go-first-symbolic-ref.png
new file mode 100644
index 00000000..14818311
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/go-first-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/go-first-symbolic-rtl-ref.png b/rsvg/tests/fixtures/reftests/adwaita/go-first-symbolic-rtl-ref.png
new file mode 100644
index 00000000..33667edb
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/go-first-symbolic-rtl-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/go-first-symbolic-rtl.svg b/rsvg/tests/fixtures/reftests/adwaita/go-first-symbolic-rtl.svg
new file mode 100644
index 00000000..ac89ae8e
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/go-first-symbolic-rtl.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='go-last-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.5 r10040' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='false' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='102.27201' inkscape:cy='5.57145' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1014' inkscape:window-maximized='1' inkscape:window-width='1920' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='2.8284271'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='99.999998px' originy='530px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-141.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-141.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-141.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-141.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-141.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-141.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-141.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-141.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-141.0002,-747)'>
+
+ <rect height='12' id='rect8360' rx='0' ry='0' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' width='2' x='152.0002' y='749'/>
+ <path inkscape:connector-curvature='0' d='m 151.4377,755 -5.71875,5.71875 C 145.52308,760.91462 145.25582,761 145.0002,761 l -1,0 0,-1 c 0,-0.25562 0.0854,-0.52288 0.28125,-0.71875 L 148.5627,755 144.28145,750.71875 C 144.08558,750.52288 144.0002,750.25562 144.0002,750 l 0,-1 1,0 c 0.25562,0 0.52288,0.0854 0.71875,0.28125 z' id='rect6014-1-6' sodipodi:nodetypes='ccscsccsscscc' style='fill:#bebebe;fill-opacity:1;stroke:none;display:inline'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/go-first-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/go-first-symbolic.svg
new file mode 100644
index 00000000..476e7836
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/go-first-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='go-first-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.5 r10040' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='false' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='162.27201' inkscape:cy='5.57145' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1014' inkscape:window-maximized='1' inkscape:window-width='1920' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='2.8284271'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='160px' originy='530px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-81.000198,-747)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-81.000198,-747)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-81.000198,-747)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-81.000198,-747)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-81.000198,-747)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-81.000198,-747)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-81.000198,-747)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-81.000198,-747)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-81.000198,-747)'>
+
+ <rect height='12' id='rect4317-41' rx='0' ry='0' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' transform='scale(-1,1)' width='2' x='-86.000198' y='749'/>
+ <path inkscape:connector-curvature='0' d='m 86.5627,755 5.71875,5.71875 C 92.47732,760.91462 92.74458,761 93.0002,761 l 1,0 0,-1 c 0,-0.25562 -0.0854,-0.52288 -0.28125,-0.71875 L 89.4377,755 93.71895,750.71875 C 93.91482,750.52288 94.0002,750.25562 94.0002,750 l 0,-1 -1,0 c -0.25562,0 -0.52288,0.0854 -0.71875,0.28125 z' id='rect6014' sodipodi:nodetypes='ccscsccsscscc' style='fill:#bebebe;fill-opacity:1;stroke:none;display:inline'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/go-home-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/go-home-symbolic-ref.png
new file mode 100644
index 00000000..8a96e7b5
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/go-home-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/go-home-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/go-home-symbolic.svg
new file mode 100644
index 00000000..b8c018d8
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/go-home-symbolic.svg
@@ -0,0 +1,44 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='go-home-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='15.999979' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16.012655' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='452.96493' inkscape:cy='762.11486' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='702' inkscape:window-maximized='1' inkscape:window-width='1366' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='196.00653px' originy='732.00001px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-44.993672,-949.00003)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-44.993672,-949.00003)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-44.993672,-949.00003)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-44.993672,-949.00003)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-44.993672,-949.00003)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-44.993672,-949.00003)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-44.993672,-949.00003)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-44.993672,-949.00003)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-44.993672,-949.00003)'>
+ <g id='g5273' transform='matrix(1,0,0,0.99999871,-112.37982,189.09791)'>
+ <title id='title5275'>go-home</title>
+ <g id='g5277' style='fill:#bebebe;fill-opacity:1' transform='matrix(0.02603569,0,0,0.02603569,345.96663,902.07624)'>
+ <g id='g5279' style='fill:#bebebe;fill-opacity:1'/>
+ <g id='g5281' style='fill:#bebebe;fill-opacity:1'/>
+ </g>
+ <g id='g5283' inkscape:label='go-down' transform='matrix(0,1,1,0,-360.61998,639.9031)'>
+
+ </g>
+ </g>
+ <path inkscape:connector-curvature='0' d='M 47.78125,954 A 1.0001,1.0001 0 0 0 47,955 l 0,7 a 1.0001,1.0001 0 0 0 1,1 l 10,0 a 1.0001,1.0001 0 0 0 1,-1 l 0,-7 a 1.0001,1.0001 0 1 0 -2,0 l 0,6 -8,0 0,-6 a 1.0001,1.0001 0 0 0 -1.21875,-1 z' id='path5287' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 52.90625,950 a 1.0001,1.0001 0 0 0 -0.5,0.1875 l -7,5 a 1.0063276,1.0063276 0 1 0 1.1875,1.625 L 53,952.25 l 6.40625,4.5625 a 1.0063276,1.0063276 0 1 0 1.1875,-1.625 l -7,-5 A 1.0001,1.0001 0 0 0 52.90625,950 z' id='path5289' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <rect height='6' id='rect5291' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' width='3' x='51.000244' y='957'/>
+ <rect height='1' id='rect5293' rx='0' ry='1' style='fill:#bebebe;fill-opacity:1;stroke:none;display:inline' transform='scale(-1,1)' width='1' x='-61.000366' y='956'/>
+ <rect height='1' id='rect5295' rx='0' ry='1' style='fill:#bebebe;fill-opacity:1;stroke:none;display:inline' transform='scale(-1,1)' width='1' x='-46.000366' y='956'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/go-jump-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/go-jump-symbolic-ref.png
new file mode 100644
index 00000000..39f51212
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/go-jump-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/go-jump-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/go-jump-symbolic.svg
new file mode 100644
index 00000000..020b1d99
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/go-jump-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg height='16' version='1.1' inkscape:version='0.48.1 r9760' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='go-jump-symbolic.svg' xmlns='http://www.w3.org/2000/svg' id='svg7384' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:cc='http://creativecommons.org/ns#' xmlns:svg='http://www.w3.org/2000/svg' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' width='16' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview objecttolerance='10' inkscape:zoom='4' inkscape:snap-bbox='true' inkscape:object-nodes='false' inkscape:object-paths='false' inkscape:snap-global='true' inkscape:snap-grids='true' showgrid='false' showborder='false' inkscape:window-x='2684' inkscape:window-y='355' inkscape:snap-others='false' inkscape:guide-bbox='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' guidetolerance='10' id='namedview88' inkscape:pageshadow='2' inkscape:cx='26.07518' inkscape:cy='9.4032999' inkscape:pageopacity='1' inkscape:snap-nodes='true' pagecolor='#555753' inkscape:window-height='967' gridtolerance='10' showguides='true' inkscape:bbox-paths='false' inkscape:snap-bbox-midpoints='false' inkscape:snap-to-guides='true' inkscape:window-width='1226' inkscape:window-maximized='0'>
+ <inkscape:grid snapvisiblegridlinesonly='true' visible='true' type='xygrid' id='grid4866' empspacing='2' enabled='true' spacingx='1px' spacingy='1px'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' transform='translate(-361.0001,-627)' id='layer9' inkscape:label='status' style='display:inline'/>
+ <g inkscape:groupmode='layer' transform='translate(-361.0001,-627)' id='layer10' inkscape:label='devices'/>
+ <g inkscape:groupmode='layer' transform='translate(-361.0001,-627)' id='layer11' inkscape:label='apps'/>
+ <g inkscape:groupmode='layer' transform='translate(-361.0001,-627)' id='layer13' inkscape:label='places'/>
+ <g inkscape:groupmode='layer' transform='translate(-361.0001,-627)' id='layer14' inkscape:label='mimetypes'/>
+ <g inkscape:groupmode='layer' transform='translate(-361.0001,-627)' id='layer15' inkscape:label='emblems' style='display:inline'/>
+ <g inkscape:groupmode='layer' transform='translate(-361.0001,-627)' id='g71291' inkscape:label='emotes' style='display:inline'/>
+ <g inkscape:groupmode='layer' transform='translate(-361.0001,-627)' id='g4953' inkscape:label='categories' style='display:inline'/>
+ <g inkscape:groupmode='layer' transform='translate(-361.0001,-627)' id='layer12' inkscape:label='actions' style='display:inline'>
+
+ <path d='m 367.5,629 c -1.92115,0 -3.5,1.57885 -3.5,3.5 l 0,0.5 2,0 0,-0.5 c 0,-0.84027 0.65973,-1.5 1.5,-1.5 0.84027,0 1.5,0.65973 1.5,1.5 l 0,6.5 2,0 0,-6.5 c 0,-1.92115 -1.57885,-3.5 -3.5,-3.5 z' id='path5641' inkscape:connector-curvature='0' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path sodipodi:nodetypes='ccccccccccccc' d='m 374.0001,636.00005 -1,0 c -0.25689,0 -0.52846,0.12983 -0.71875,0.3125 l -2.28125,2.28125 -2.28125,-2.28125 c -0.19029,-0.18267 -0.46186,-0.3125 -0.71875,-0.3125 l -1,0 0,1 c 0,0.30945 0.0903,0.55232 0.28125,0.75 l 3.71875,3.65625 3.71875,-3.65625 c 0.19095,-0.19768 0.28125,-0.44055 0.28125,-0.75 z' id='path5643' inkscape:connector-curvature='0' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/go-last-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/go-last-symbolic-ref.png
new file mode 100644
index 00000000..33667edb
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/go-last-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/go-last-symbolic-rtl-ref.png b/rsvg/tests/fixtures/reftests/adwaita/go-last-symbolic-rtl-ref.png
new file mode 100644
index 00000000..14818311
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/go-last-symbolic-rtl-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/go-last-symbolic-rtl.svg b/rsvg/tests/fixtures/reftests/adwaita/go-last-symbolic-rtl.svg
new file mode 100644
index 00000000..476e7836
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/go-last-symbolic-rtl.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='go-first-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.5 r10040' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='false' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='162.27201' inkscape:cy='5.57145' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1014' inkscape:window-maximized='1' inkscape:window-width='1920' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='2.8284271'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='160px' originy='530px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-81.000198,-747)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-81.000198,-747)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-81.000198,-747)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-81.000198,-747)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-81.000198,-747)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-81.000198,-747)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-81.000198,-747)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-81.000198,-747)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-81.000198,-747)'>
+
+ <rect height='12' id='rect4317-41' rx='0' ry='0' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' transform='scale(-1,1)' width='2' x='-86.000198' y='749'/>
+ <path inkscape:connector-curvature='0' d='m 86.5627,755 5.71875,5.71875 C 92.47732,760.91462 92.74458,761 93.0002,761 l 1,0 0,-1 c 0,-0.25562 -0.0854,-0.52288 -0.28125,-0.71875 L 89.4377,755 93.71895,750.71875 C 93.91482,750.52288 94.0002,750.25562 94.0002,750 l 0,-1 -1,0 c -0.25562,0 -0.52288,0.0854 -0.71875,0.28125 z' id='rect6014' sodipodi:nodetypes='ccscsccsscscc' style='fill:#bebebe;fill-opacity:1;stroke:none;display:inline'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/go-last-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/go-last-symbolic.svg
new file mode 100644
index 00000000..ac89ae8e
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/go-last-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='go-last-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.5 r10040' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='false' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='102.27201' inkscape:cy='5.57145' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1014' inkscape:window-maximized='1' inkscape:window-width='1920' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='2.8284271'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='99.999998px' originy='530px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-141.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-141.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-141.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-141.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-141.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-141.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-141.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-141.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-141.0002,-747)'>
+
+ <rect height='12' id='rect8360' rx='0' ry='0' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' width='2' x='152.0002' y='749'/>
+ <path inkscape:connector-curvature='0' d='m 151.4377,755 -5.71875,5.71875 C 145.52308,760.91462 145.25582,761 145.0002,761 l -1,0 0,-1 c 0,-0.25562 0.0854,-0.52288 0.28125,-0.71875 L 148.5627,755 144.28145,750.71875 C 144.08558,750.52288 144.0002,750.25562 144.0002,750 l 0,-1 1,0 c 0.25562,0 0.52288,0.0854 0.71875,0.28125 z' id='rect6014-1-6' sodipodi:nodetypes='ccscsccsscscc' style='fill:#bebebe;fill-opacity:1;stroke:none;display:inline'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/go-next-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/go-next-symbolic-ref.png
new file mode 100644
index 00000000..ce7040dd
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/go-next-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/go-next-symbolic-rtl-ref.png b/rsvg/tests/fixtures/reftests/adwaita/go-next-symbolic-rtl-ref.png
new file mode 100644
index 00000000..1f038e9c
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/go-next-symbolic-rtl-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/go-next-symbolic-rtl.svg b/rsvg/tests/fixtures/reftests/adwaita/go-next-symbolic-rtl.svg
new file mode 100644
index 00000000..40e13a82
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/go-next-symbolic-rtl.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='go-previous-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.5 r10040' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='false' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='143.27201' inkscape:cy='5.57145' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1014' inkscape:window-maximized='1' inkscape:window-width='1920' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='2.8284271'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='141px' originy='530px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-100.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-100.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-100.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-100.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-100.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-100.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-100.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-100.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-100.0002,-747)'>
+ <path inkscape:connector-curvature='0' d='m 104.5627,755 5.71875,5.71875 C 110.47732,760.91462 110.74458,761 111.0002,761 l 1,0 0,-1 c 0,-0.25562 -0.0854,-0.52288 -0.28125,-0.71875 L 107.4377,755 l 4.28125,-4.28125 c 0.19587,-0.19587 0.28125,-0.46313 0.28125,-0.71875 l 0,-1 -1,0 c -0.25562,0 -0.52288,0.0854 -0.71875,0.28125 z' id='rect6014-2' sodipodi:nodetypes='ccscsccsscscc' style='fill:#bebebe;fill-opacity:1;stroke:none;display:inline'/>
+
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/go-next-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/go-next-symbolic.svg
new file mode 100644
index 00000000..1b43fa7c
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/go-next-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='go-next-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.5 r10040' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='false' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='122.27201' inkscape:cy='5.57145' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1014' inkscape:window-maximized='1' inkscape:window-width='1920' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='2.8284271'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='120px' originy='530px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-121.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-121.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-121.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-121.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-121.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-121.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-121.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-121.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-121.0002,-747)'>
+
+ <path inkscape:connector-curvature='0' d='m 132.4377,755 -5.71875,5.71875 C 126.52308,760.91462 126.25582,761 126.0002,761 l -1,0 0,-1 c 0,-0.25562 0.0854,-0.52288 0.28125,-0.71875 L 129.5627,755 125.28145,750.71875 C 125.08558,750.52288 125.0002,750.25562 125.0002,750 l 0,-1 1,0 c 0.25562,0 0.52288,0.0854 0.71875,0.28125 z' id='rect6014-1' sodipodi:nodetypes='ccscsccsscscc' style='fill:#bebebe;fill-opacity:1;stroke:none;display:inline'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/go-previous-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/go-previous-symbolic-ref.png
new file mode 100644
index 00000000..1f038e9c
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/go-previous-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/go-previous-symbolic-rtl-ref.png b/rsvg/tests/fixtures/reftests/adwaita/go-previous-symbolic-rtl-ref.png
new file mode 100644
index 00000000..ce7040dd
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/go-previous-symbolic-rtl-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/go-previous-symbolic-rtl.svg b/rsvg/tests/fixtures/reftests/adwaita/go-previous-symbolic-rtl.svg
new file mode 100644
index 00000000..1b43fa7c
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/go-previous-symbolic-rtl.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='go-next-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.5 r10040' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='false' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='122.27201' inkscape:cy='5.57145' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1014' inkscape:window-maximized='1' inkscape:window-width='1920' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='2.8284271'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='120px' originy='530px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-121.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-121.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-121.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-121.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-121.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-121.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-121.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-121.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-121.0002,-747)'>
+
+ <path inkscape:connector-curvature='0' d='m 132.4377,755 -5.71875,5.71875 C 126.52308,760.91462 126.25582,761 126.0002,761 l -1,0 0,-1 c 0,-0.25562 0.0854,-0.52288 0.28125,-0.71875 L 129.5627,755 125.28145,750.71875 C 125.08558,750.52288 125.0002,750.25562 125.0002,750 l 0,-1 1,0 c 0.25562,0 0.52288,0.0854 0.71875,0.28125 z' id='rect6014-1' sodipodi:nodetypes='ccscsccsscscc' style='fill:#bebebe;fill-opacity:1;stroke:none;display:inline'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/go-previous-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/go-previous-symbolic.svg
new file mode 100644
index 00000000..40e13a82
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/go-previous-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='go-previous-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.5 r10040' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='false' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='143.27201' inkscape:cy='5.57145' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1014' inkscape:window-maximized='1' inkscape:window-width='1920' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='2.8284271'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='141px' originy='530px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-100.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-100.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-100.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-100.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-100.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-100.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-100.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-100.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-100.0002,-747)'>
+ <path inkscape:connector-curvature='0' d='m 104.5627,755 5.71875,5.71875 C 110.47732,760.91462 110.74458,761 111.0002,761 l 1,0 0,-1 c 0,-0.25562 -0.0854,-0.52288 -0.28125,-0.71875 L 107.4377,755 l 4.28125,-4.28125 c 0.19587,-0.19587 0.28125,-0.46313 0.28125,-0.71875 l 0,-1 -1,0 c -0.25562,0 -0.52288,0.0854 -0.71875,0.28125 z' id='rect6014-2' sodipodi:nodetypes='ccscsccsscscc' style='fill:#bebebe;fill-opacity:1;stroke:none;display:inline'/>
+
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/go-top-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/go-top-symbolic-ref.png
new file mode 100644
index 00000000..e750c613
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/go-top-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/go-top-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/go-top-symbolic.svg
new file mode 100644
index 00000000..3cce40e2
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/go-top-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='go-top-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.5 r10040' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='false' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='22.272007' inkscape:cy='5.5714484' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1014' inkscape:window-maximized='1' inkscape:window-width='1920' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='2.8284271'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='20px' originy='530px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-221.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-221.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-221.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-221.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-221.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-221.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-221.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-221.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-221.0002,-747)'>
+
+ <rect height='12' id='rect8436' rx='0' ry='0' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' transform='matrix(0,-1,-1,0,0,0)' width='2' x='-752' y='-235.0002'/>
+ <path inkscape:connector-curvature='0' d='m 229.0002,752.5625 -5.71875,5.71875 c -0.19587,0.19587 -0.28125,0.46313 -0.28125,0.71875 l 0,1 1,0 c 0.25562,0 0.52288,-0.0854 0.71875,-0.28125 l 4.28125,-4.28125 4.28125,4.28125 C 233.47732,759.91462 233.74458,760 234.0002,760 l 1,0 0,-1 c 0,-0.25562 -0.0854,-0.52288 -0.28125,-0.71875 z' id='rect6014-1-6-3-5-9-7' sodipodi:nodetypes='ccscsccsscscc' style='fill:#bebebe;fill-opacity:1;stroke:none;display:inline'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/go-up-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/go-up-symbolic-ref.png
new file mode 100644
index 00000000..8857e707
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/go-up-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/go-up-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/go-up-symbolic.svg
new file mode 100644
index 00000000..373157a1
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/go-up-symbolic.svg
@@ -0,0 +1,35 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='go-up-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.91 r13725' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='74.218031' inkscape:cy='-5.3896334' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='false' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='5.6568542'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='40' originy='530' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-201.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-201.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-201.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-201.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-201.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-201.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-201.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-201.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-201.0002,-747)'>
+
+ <path inkscape:connector-curvature='0' d='m 209.0002,750.5625 -5.71875,5.7187 c -0.19587,0.1959 -0.28125,0.4632 -0.28125,0.7188 l 0,1 1,0 c 0.25562,0 0.52288,-0.085 0.71875,-0.2813 l 4.28125,-4.2812 4.28125,4.2812 c 0.19587,0.1959 0.46313,0.2813 0.71875,0.2813 l 1,0 0,-1 c 0,-0.2556 -0.0854,-0.5229 -0.28125,-0.7188 z' id='rect6014-1-6-3-5-9' sodipodi:nodetypes='ccscsccsscscc' style='display:inline;fill:#bebebe;fill-opacity:1;stroke:none'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/goa-panel-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/goa-panel-symbolic-ref.png
new file mode 100644
index 00000000..0041916a
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/goa-panel-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/goa-panel-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/goa-panel-symbolic.svg
new file mode 100644
index 00000000..d30eb833
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/goa-panel-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='goa-panel-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer11' inkscape:cx='-3.0992766' inkscape:cy='17.48597' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1374' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='16'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-1.9998px' originy='432px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-243,-649)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-243,-649)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-243,-649)'>
+
+ <path inkscape:connector-curvature='0' d='m 247.03145,650 0,4 -3,0 c -0.54534,0 -0.96875,0.42341 -0.96875,0.96875 0,0.54535 0.42341,1 0.96875,1 l 3,0 0,2.0625 -3,0 c -0.54534,0 -0.96875,0.42341 -0.96875,0.96875 0,0.54535 0.42341,1 0.96875,1 l 3,0 0,4 1,-0.0937 c 3.67508,-0.34454 5.76683,-4.02303 5.9375,-6.875 0.23648,-0.0665 0.53042,0.0111 0.6875,0.1875 l 0,0.0312 c 0.16445,0.15757 0.37436,0.41118 0.625,0.65625 0.25064,0.24507 0.60354,0.47879 1.0625,0.53125 0.4719,0.04 0.88833,-0.15809 1.15625,-0.46875 0.26137,-0.30307 0.3995,-0.70745 0.375,-1.125 -2.3e-4,-0.011 3.9e-4,-0.0204 0,-0.0312 -0.0363,-1.00877 -0.73453,-1.69168 -1.21875,-2.21875 -0.32738,-0.35889 -0.51919,-0.79134 -0.40625,-1.125 0.0978,-0.28616 0.46274,-0.49156 0.8125,-0.46875 l 0.0312,0 0.0312,0 c 0.57283,-0.0201 0.70488,0.003 1.3125,0 l 0,-1 c -0.56205,0.003 -0.73654,-0.0187 -1.3125,0 -0.0137,4.5e-4 -0.0172,-5e-4 -0.0312,0 -0.74361,-0.0366 -1.51171,0.36762 -1.78125,1.15625 -0.28648,0.84634 0.1721,1.62849 0.625,2.125 0.50634,0.55116 0.92597,1.0521 0.9375,1.59375 l 0.0312,0 c 0.0101,0.12705 -0.0578,0.32333 -0.15625,0.4375 -0.0985,0.11417 -0.19795,0.16596 -0.3125,0.15625 -0.16676,-0.0191 -0.2944,-0.11077 -0.46875,-0.28125 -0.16979,-0.16602 -0.35398,-0.39175 -0.59375,-0.625 -0.007,-0.007 -0.0247,0.007 -0.0312,0 -0.36526,-0.39563 -0.90243,-0.60685 -1.40625,-0.5625 -0.44674,-3.11853 -2.91199,-5.469 -5.90625,-5.90625 l -1,-0.0937 z m 1,2.09375 c 2.04247,0.42745 3.70504,2.1191 3.96875,4.3125 0.31355,2.60795 -1.39127,5.02493 -3.96875,5.53125 l 0,-9.84375 z' id='path7920' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 249.34395,652.875 c -0.77785,-0.13108 -1.21212,1.33576 -0.29427,0.81948 -0.0229,-0.92977 0.68165,0.0909 0.0766,0.26611 -0.45485,0.0897 -0.65532,-0.0705 -0.94235,0.45497 -0.35676,0.37222 -0.18167,1.19375 0.31937,0.50676 0.39013,-0.2891 0.62946,0.78353 0.59147,-0.0209 0.0744,0.16412 0.37541,0.50927 0.60493,0.35853 0.56636,0.11105 0.62179,0.66202 -0.016,0.52878 -0.63563,0.11569 -1.65077,-0.93807 -1.66318,0.26192 0.0198,0.64976 0.007,1.3 0.0109,1.95 0.95308,-0.34702 0.95854,1.07759 0.91402,1.71997 0.0923,0.50281 0.16312,1.89906 0.92481,1.20656 0.49057,-0.69648 0.93548,-1.37271 0.84745,-2.25365 0.23169,-0.35036 0.95594,-1.36279 0.0629,-1.29611 -0.33412,-0.25815 -0.69825,-1.71966 -0.18848,-0.8122 0.046,0.76672 0.7391,0.98167 1.0293,0.20833 0.35039,-0.39282 -0.91916,-0.47489 -0.30833,-0.69789 0.44865,0.57012 0.93158,0.0258 0.52953,-0.49467 -0.37325,-0.79864 -0.83934,-2.17532 -1.72159,-2.29708 -0.27079,0.22095 -0.49588,-0.13404 -0.12291,-0.20005 -0.18632,-0.13561 -0.46288,-0.0776 -0.65405,-0.20889 z' id='path7922' style='opacity:0.3;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-243,-649)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-243,-649)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-243,-649)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-243,-649)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-243,-649)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-243,-649)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/help-about-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/help-about-symbolic-ref.png
new file mode 100644
index 00000000..ec92cfde
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/help-about-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/help-about-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/help-about-symbolic.svg
new file mode 100644
index 00000000..2cfb995b
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/help-about-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='help-about-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.5 r10040' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='6.91717' inkscape:cy='18.25543' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='true' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1402' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='2560' inkscape:window-y='0' inkscape:zoom='32'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-100px' originy='610px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-341.0002,-827)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-341.0002,-827)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-341.0002,-827)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-341.0002,-827)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-341.0002,-827)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-341.0002,-827)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-341.0002,-827)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-341.0002,-827)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-341.0002,-827)'>
+
+ <path sodipodi:arg1='1.5707963' sodipodi:arg2='2.3561945' sodipodi:cx='7.9549513' sodipodi:cy='8.0450487' d='m 7.9549515,15.20505 c -0.736079,0 -1.8727276,-4.246301 -2.3932141,-4.766787 C 5.0412509,9.9177761 0.79494952,8.7811279 0.79494953,8.0450489 0.79494954,7.3089699 5.041251,6.1723213 5.5617374,5.6518348 6.0822239,5.1313484 7.2188721,0.88504695 7.9549511,0.88504696 c 0.736079,10e-9 1.8727276,4.24630144 2.3932139,4.76678794 0.520487,0.5204864 4.766788,1.6571346 4.766788,2.3932136 0,0.736079 -4.246301,1.8727276 -4.766788,2.3932145 -0.5204863,0.520486 -1.6571345,4.766787 -2.3932135,4.766787 z' inkscape:flatsided='false' id='path67' sodipodi:r1='7.1600018' sodipodi:r2='3.3845155' inkscape:randomized='0' inkscape:rounded='0.13800197' sodipodi:sides='4' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.03395915;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' transform='matrix(0.97765337,0,0,0.97765339,341.22302,827.13473)' sodipodi:type='star'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/help-browser-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/help-browser-symbolic-ref.png
new file mode 100644
index 00000000..40b9788e
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/help-browser-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/help-browser-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/help-browser-symbolic.svg
new file mode 100644
index 00000000..b103ec46
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/help-browser-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:svg='http://www.w3.org/2000/svg' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' version='1.1' inkscape:version='0.47 r22583' height='16' sodipodi:docname='help-browser-symbolic.svg' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:object-paths='true' inkscape:cy='-218.16054' inkscape:current-layer='layer11' inkscape:window-width='1920' pagecolor='#555753' showborder='false' showguides='true' inkscape:snap-nodes='false' objecttolerance='10' showgrid='true' inkscape:object-nodes='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:window-x='0' inkscape:snap-bbox='true' bordercolor='#666666' id='namedview88' inkscape:window-maximized='1' inkscape:snap-global='true' inkscape:window-y='26' gridtolerance='10' inkscape:zoom='1' inkscape:window-height='1021' borderopacity='1' guidetolerance='10' inkscape:snap-bbox-midpoints='false' inkscape:cx='-124.56688' inkscape:bbox-paths='false' inkscape:snap-grids='true' inkscape:pageopacity='1' inkscape:snap-to-guides='true'>
+ <inkscape:grid visible='true' spacingx='1px' type='xygrid' spacingy='1px' id='grid4866' empspacing='2' enabled='true' snapvisiblegridlinesonly='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g transform='translate(-182,-490)' inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline'/>
+ <g transform='translate(-182,-490)' inkscape:groupmode='layer' id='layer10' inkscape:label='devices'/>
+ <g transform='translate(-182,-490)' inkscape:groupmode='layer' id='layer11' inkscape:label='apps'>
+ <path d='m 190,490 c -4.4147,0 -8,3.5853 -8,8 0,4.4147 3.5853,8 8,8 4.4147,0 8,-3.5853 8,-8 0,-4.4147 -3.5853,-8 -8,-8 z m 0,2 c 3.3413,0 6,2.6587 6,6 0,3.3413 -2.6587,6 -6,6 -3.3413,0 -6,-2.6587 -6,-6 0,-3.3413 2.6587,-6 6,-6 z' id='rect11749-5-0-3' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/>
+
+ <path d='M 189.34375,495 C 188.05763,495 187,496.05763 187,497.34375 l 0,1.3125 c 0,1.28612 1.05763,2.34375 2.34375,2.34375 l 1.3125,0 C 191.94237,501 193,499.94237 193,498.65625 l 0,-1.3125 C 193,496.05763 191.94237,495 190.65625,495 l -1.3125,0 z m 0,1 1.3125,0 c 0.74942,0 1.34375,0.59433 1.34375,1.34375 l 0,1.3125 C 192,499.40567 191.40567,500 190.65625,500 l -1.3125,0 C 188.59433,500 188,499.40567 188,498.65625 l 0,-1.3125 C 188,496.59433 188.59433,496 189.34375,496 z' id='rect11749-5-0-3-3' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:0.99999994;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/>
+ <path inkscape:connector-curvature='0' d='m 186.71875,491.4375 c -1.51031,0.6073 -2.6811,1.7985 -3.28125,3.3125 l 3.75,1.875 c 0.25196,-0.64029 0.74249,-1.17056 1.375,-1.4375 l -1.84375,-3.75 z m 6.5625,0 -1.84375,3.75 c 0.63251,0.26694 1.12304,0.79721 1.375,1.4375 l 3.75,-1.875 c -0.60015,-1.514 -1.77094,-2.7052 -3.28125,-3.3125 z m -6.09375,8 -3.75,1.875 c 0.60709,1.48862 1.78896,2.64995 3.28125,3.25 l 1.875,-3.75 c -0.62682,-0.25556 -1.14334,-0.75203 -1.40625,-1.375 z m 5.625,0 c -0.26291,0.62297 -0.77943,1.11944 -1.40625,1.375 l 1.875,3.75 c 1.49229,-0.60005 2.67416,-1.76138 3.28125,-3.25 l -3.75,-1.875 z' id='path4624' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+ </g>
+ <g transform='translate(-182,-490)' inkscape:groupmode='layer' id='layer12' inkscape:label='actions'/>
+ <g transform='translate(-182,-490)' inkscape:groupmode='layer' id='layer13' inkscape:label='places'/>
+ <g transform='translate(-182,-490)' inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes'/>
+ <g transform='translate(-182,-490)' inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline'/>
+ <g transform='translate(-182,-490)' inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/help-contents-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/help-contents-symbolic-ref.png
new file mode 100644
index 00000000..b1dbfae2
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/help-contents-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/help-contents-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/help-contents-symbolic.svg
new file mode 100644
index 00000000..73664dc3
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/help-contents-symbolic.svg
@@ -0,0 +1,38 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='help-contents-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16.000036' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.92pre3 r' viewBox='0 0 16 16.000036' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer11' inkscape:cx='12.05567' inkscape:cy='9.9807229' inkscape:document-units='px' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1016' inkscape:window-maximized='1' inkscape:window-width='1920' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='16'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='138' originy='452.00003' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-103.0002,-669)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-103.0002,-669)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-103.0002,-669)'>
+ <path inkscape:connector-curvature='0' d='m 106.02539,669 0.0332,0.002 c -0.0413,-0.001 -0.0837,-7.6e-4 -0.125,0 -0.011,2.1e-4 -0.0222,-3.5e-4 -0.0332,0 l 0.0332,1.99805 -0.0781,-1.99609 c -1.08552,0.0845 -1.87445,0.95319 -1.85547,2.04101 v 11.91406 c -0.0172,1.15954 0.88113,2.05793 2.04102,2.04102 h 9.91796 c 1.16021,0.0172 2.05786,-0.88185 2.04102,-2.04102 V 674.00781 674 c -0.008,-0.54268 -0.22494,-1.04499 -0.61719,-1.42188 l -2.95703,-2.95898 c -0.3763,-0.39244 -0.87813,-0.61129 -1.42187,-0.61914 h -0.008 z m -0.0176,2 c -0.002,-0.002 0.005,8.4e-4 0.002,0 h 6.96484 c -0.0102,-1.5e-4 0.0146,0.011 0.008,0.004 l 0.008,0.008 2.99805,3.00195 0.008,0.006 c -0.007,-0.007 0.004,0.0184 0.004,0.01 v 8.95117 0.008 c -0.001,-0.0796 -0.0934,0.0105 -0.0117,0.0117 h -0.006 -9.96289 -0.008 c 0.0814,-0.001 -0.0105,-0.0916 -0.0117,-0.0117 v -0.008 -11.96094 -0.01 c 9.8e-4,0.0562 0.0272,0.006 0.008,-0.01 z' id='path27838' style='color:#bebebe;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+
+ <path inkscape:connector-curvature='0' d='m 111,673.87695 c -2.24078,0 -4.06055,1.81977 -4.06055,4.06055 0,2.24078 1.81977,4.06055 4.06055,4.06055 2.24078,0 4.06055,-1.81977 4.06055,-4.06055 0,-2.24078 -1.81977,-4.06055 -4.06055,-4.06055 z m 0,1 c 1.70408,0 3.06055,1.35647 3.06055,3.06055 0,1.70408 -1.35647,3.06055 -3.06055,3.06055 -1.70408,0 -3.06055,-1.35647 -3.06055,-3.06055 0,-1.70408 1.35647,-3.06055 3.06055,-3.06055 z' id='rect11749-5-0-3-8' style='color:#bebebe;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 111,675.9375 c -1.09935,0 -2,0.90065 -2,2 0,1.09935 0.90065,2 2,2 1.09935,0 2,-0.90065 2,-2 0,-1.09935 -0.90065,-2 -2,-2 z m 0,1 c 0.56265,0 1,0.43735 1,1 0,0.56265 -0.43735,1 -1,1 -0.56265,0 -1,-0.43735 -1,-1 0,-0.56265 0.43735,-1 1,-1 z' id='rect11749-5-0-3-3-0' style='color:#bebebe;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 109.33129,674.59968 c -0.76818,0.30889 -1.36366,0.91476 -1.66891,1.68481 l 1.90732,0.95366 c 0.12816,-0.32566 0.37765,-0.59537 0.69936,-0.73114 z m 3.33782,0 -0.93777,1.90733 c 0.32171,0.13577 0.5712,0.40548 0.69936,0.73114 l 1.90732,-0.95366 c -0.30524,-0.77005 -0.90073,-1.37592 -1.66891,-1.68481 z m -3.09941,4.06897 -1.90732,0.95366 c 0.30877,0.75714 0.9099,1.34782 1.66891,1.65302 l 0.95366,-1.90733 c -0.31881,-0.12998 -0.58152,-0.3825 -0.71525,-0.69935 z m 2.861,0 c -0.13373,0.31685 -0.39644,0.56937 -0.71525,0.69935 l 0.95366,1.90733 c 0.75901,-0.3052 1.36014,-0.89588 1.66891,-1.65302 z' id='path4624-6' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-103.0002,-669)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-103.0002,-669)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-103.0002,-669)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-103.0002,-669)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-103.0002,-669)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-103.0002,-669)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/help-faq-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/help-faq-symbolic-ref.png
new file mode 100644
index 00000000..37dd2ed4
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/help-faq-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/help-faq-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/help-faq-symbolic.svg
new file mode 100644
index 00000000..9f4444ea
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/help-faq-symbolic.svg
@@ -0,0 +1,36 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='help-faq-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.92pre3 r' viewBox='0 0 16.000002 16' width='16.000002' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer11' inkscape:cx='32.832838' inkscape:cy='-9.06521' inkscape:document-units='px' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:measure-end='0,0' inkscape:measure-start='0,0' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1016' inkscape:window-maximized='1' inkscape:window-width='1920' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='118' originy='452' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-123.0002,-669)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-123.0002,-669)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-123.0002,-669)'>
+ <path inkscape:connector-curvature='0' d='m 125.0002,674 c -1.108,0 -2,0.892 -2,2 v 7 c 0,1.108 0.892,2 2,2 h 9 c 1.108,0 2,-0.892 2,-2 v -3.80078 l 3,-3.19922 h -3 c 0,-1.108 -0.892,-2 -2,-2 z m 4.4375,2 c 1.31394,-0.0736 2.4889,0.93606 2.5625,2.25 -8e-5,1.12109 -0.30842,1.54366 -1.28125,2.28125 -0.15274,0.11491 -0.24173,0.20048 -0.28125,0.25 -0.0395,0.0497 -0.0312,0.0328 -0.0312,0.0312 0.006,0.42265 -0.3898,0.78125 -0.8125,0.78125 -0.4227,0 -0.78685,-0.3586 -0.78125,-0.78125 0,-0.40191 0.17939,-0.75474 0.375,-1 0.19561,-0.24531 0.38054,-0.42561 0.5625,-0.5625 0.16324,-0.12845 0.38116,-0.31388 0.5625,-0.53125 0.0748,-0.0897 0.097,-0.23988 0.0937,-0.34375 v -0.0312 c -0.0253,-0.45059 -0.39316,-0.77528 -0.84375,-0.75 -0.45059,0.0253 -0.81239,0.36191 -0.85094,0.75792 -0.0386,0.39602 -0.34177,0.64833 -0.71742,0.64833 -0.37565,0 -0.67886,-0.25231 -0.78125,-0.59375 -0.0265,-0.19622 -0.017,-0.40625 0.01,-0.5332 0.005,-0.014 0.006,-0.0294 0.0117,-0.043 0.20252,-1.0241 1.08979,-1.76765 2.20312,-1.83008 z m 0.15625,6.40625 c 0.44182,0 0.8125,0.37067 0.8125,0.8125 0,0.44182 -0.37068,0.78125 -0.8125,0.78125 -0.44182,0 -0.78125,-0.33943 -0.78125,-0.78125 0,-0.44183 0.33943,-0.8125 0.78125,-0.8125 z' id='rect9381' sodipodi:nodetypes='sssssscccsscccccsccccccccsccccsssss' style='opacity:1;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1'/>
+
+ <path inkscape:connector-curvature='0' d='m 125.0002,670 c -1.108,0 -2,0.892 -2,2 v 0.56836 c 0.59305,-0.35095 1.27204,-0.56836 2,-0.56836 h 9 c 1.37588,0 2.55024,0.7628 3.26758,1.84766 L 139.0002,672 h -3 c 0,-1.108 -0.892,-2 -2,-2 z' id='path9419' sodipodi:nodetypes='sscsscccss' style='opacity:1;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-123.0002,-669)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-123.0002,-669)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-123.0002,-669)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-123.0002,-669)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-123.0002,-669)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-123.0002,-669)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/image-loading-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/image-loading-symbolic-ref.png
new file mode 100644
index 00000000..bfd5ef8c
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/image-loading-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/image-loading-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/image-loading-symbolic.svg
new file mode 100644
index 00000000..2b8f0253
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/image-loading-symbolic.svg
@@ -0,0 +1,33 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='image-loading-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.5 r10040' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='60.928908' inkscape:cy='-253.16036' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1375' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='39.9998px' originy='100px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-201.0004,-317)'>
+
+ <path sodipodi:cx='28' sodipodi:cy='209' d='m 29,209 a 1,1 0 1 1 -2,0 1,1 0 1 1 2,0 z' id='path5938' sodipodi:rx='1' sodipodi:ry='1' style='fill:#bebebe;fill-opacity:1;stroke:none;display:inline' transform='matrix(2.000025,0,0,2.000025,147.99952,-93.0052)' sodipodi:type='arc'/>
+ <path sodipodi:cx='28' sodipodi:cy='209' d='m 29,209 a 1,1 0 1 1 -2,0 1,1 0 1 1 2,0 z' id='path5940' sodipodi:rx='1' sodipodi:ry='1' style='fill:#bebebe;fill-opacity:1;stroke:none;display:inline' transform='matrix(2,0,0,2,153.00025,-93)' sodipodi:type='arc'/>
+ <path sodipodi:cx='28' sodipodi:cy='209' d='m 29,209 a 1,1 0 1 1 -2,0 1,1 0 1 1 2,0 z' id='path5942' sodipodi:rx='1' sodipodi:ry='1' style='fill:#bebebe;fill-opacity:1;stroke:none;display:inline' transform='matrix(2,0,0,2,158.0002,-93)' sodipodi:type='arc'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-201.0004,-317)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-201.0004,-317)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-201.0004,-317)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-201.0004,-317)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-201.0004,-317)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-201.0004,-317)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-201.0004,-317)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-201.0004,-317)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/image-x-generic-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/image-x-generic-symbolic-ref.png
new file mode 100644
index 00000000..4b1026e3
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/image-x-generic-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/image-x-generic-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/image-x-generic-symbolic.svg
new file mode 100644
index 00000000..f7082871
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/image-x-generic-symbolic.svg
@@ -0,0 +1,33 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='image-x-generic-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer14' inkscape:cx='-17.05236' inkscape:cy='4.961624' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1170' inkscape:window-maximized='0' inkscape:window-width='1519' inkscape:window-x='242' inkscape:window-y='180' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-380.03125px' originy='84.03125px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-621.03145,-301.03125)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-621.03145,-301.03125)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-621.03145,-301.03125)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-621.03145,-301.03125)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-621.03145,-301.03125)'>
+
+ <path inkscape:connector-curvature='0' d='m 622.0625,302.0625 0,1 0,11.96875 0,1 1,0 11.96875,0 1,0 0,-1 0,-11.96875 0,-1 -1,0 -11.96875,0 -1,0 z m 2,2 9.96875,0 0,9.96875 -9.96875,0 0,-9.96875 z' id='rect35282' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 630.5625,309.34375 c -0.46643,-0.0643 -1.04585,-0.1297 -1.53125,0.25 -0.40319,0.3154 -0.7654,0.72703 -1.09375,1.03125 -0.32835,0.30422 -0.65996,0.4375 -0.59375,0.4375 l -3.84375,0 0,1 3.84375,0 c 0.58207,0 0.88604,-0.38153 1.25,-0.71875 0.36396,-0.33722 0.75079,-0.69367 1.0625,-0.9375 0.10629,-0.0831 0.40859,-0.14514 0.78125,-0.0937 0.37266,0.0514 0.69959,0.1875 1.09375,0.1875 0.14648,0 0.20407,0.0328 0.3125,0.125 0.10843,0.0922 0.24045,0.24389 0.375,0.4375 0.13455,0.19361 0.28193,0.42119 0.5,0.625 0.21807,0.20381 0.56155,0.375 0.9375,0.375 l 0.84375,0 0,-1 -0.84375,0 c -0.0991,0 -0.15147,-0.002 -0.25,-0.0937 -0.0985,-0.0921 -0.23537,-0.26783 -0.375,-0.46875 -0.13963,-0.20092 -0.29184,-0.42134 -0.53125,-0.625 -0.23941,-0.20366 -0.57764,-0.375 -0.96875,-0.375 -0.0328,0 -0.50232,-0.0919 -0.96875,-0.15625 z' id='path35302' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 626.47137,304.91487 c -0.86024,0 -1.55632,0.72246 -1.55632,1.58269 0,0.86024 0.69608,1.55632 1.55632,1.55632 0.86024,0 1.5827,-0.69608 1.5827,-1.55632 0,-0.86023 -0.72246,-1.58269 -1.5827,-1.58269 z m 0,1.00237 c 0.3198,0 0.58032,0.26053 0.58032,0.58032 0,0.3198 -0.26052,0.55395 -0.58032,0.55395 -0.3198,0 -0.55394,-0.23415 -0.55394,-0.55395 0,-0.31979 0.23414,-0.58032 0.55394,-0.58032 z' id='path35306' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.18468678;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-621.03145,-301.03125)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-621.03145,-301.03125)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-621.03145,-301.03125)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-621.03145,-301.03125)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/inode-directory-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/inode-directory-symbolic-ref.png
new file mode 100644
index 00000000..b92bd7d1
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/inode-directory-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/inode-directory-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/inode-directory-symbolic.svg
new file mode 100644
index 00000000..193dc388
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/inode-directory-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='inode-directory-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16.000002' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer14' inkscape:cx='643.91952' inkscape:cy='222.27779' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1374' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='600px' originy='298px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(358.9998,-515)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(358.9998,-515)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(358.9998,-515)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(358.9998,-515)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(358.9998,-515)'>
+ <path inkscape:connector-curvature='0' d='m -358.46855,516 c -0.28913,0 -0.53125,0.24212 -0.53125,0.53125 l 0,13.93755 c 0,0.2985 0.23264,0.5312 0.53125,0.5312 l 14.9375,0 c 0.2986,0 0.53125,-0.2326 0.53125,-0.5312 l 0,-8.9376 c 0,-0.2891 -0.24212,-0.5312 -0.53125,-0.5312 l -12.46875,0 0,7.5 c 0,0.277 -0.223,0.5 -0.5,0.5 -0.277,0 -0.5,-0.223 -0.5,-0.5 l 0,-8 c 0,-0.277 0.223,-0.5 0.5,-0.5 l 2.96875,0 8.53125,0 0,-1.4062 c 0,-0.3272 -0.26666,-0.5938 -0.59375,-0.5938 l -7.40625,0 0,-1.46875 c 0,-0.28915 -0.24212,-0.53125 -0.53125,-0.53125 z' id='path5682' sodipodi:nodetypes='ccccccccccsccccccccccc' style='fill:#bebebe;fill-opacity:1;stroke:none;display:inline'/>
+
+ </g>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(358.9998,-515)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(358.9998,-515)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(358.9998,-515)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(358.9998,-515)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/input-dialpad-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/input-dialpad-symbolic-ref.png
new file mode 100644
index 00000000..a0da6b8e
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/input-dialpad-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/input-dialpad-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/input-dialpad-symbolic.svg
new file mode 100644
index 00000000..bfbf2ec5
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/input-dialpad-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='input-dialpad-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.4 r9939' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer10' inkscape:cx='31.284009' inkscape:cy='-191.9103' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='702' inkscape:window-maximized='1' inkscape:window-width='1366' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='0.0002px' originy='230px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ <inkscape:grid color='#000000' empcolor='#000000' empopacity='0' empspacing='4' enabled='true' id='grid5968' opacity='0.1254902' originx='0.0002px' originy='230px' snapvisiblegridlinesonly='true' spacingx='0.5px' spacingy='0.5px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-241,-447)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-241,-447)'>
+
+ <path inkscape:connector-curvature='0' d='m 244.5002,447 c 0,0 -1.5,0 -1.5,1.5 l 0,9 c 0,1.5 1.5,1.5 1.5,1.5 l 1.5,0 0,2 c 0,0.554 0.446,1 1,1 l 4,0 c 0.554,0 1,-0.446 1,-1 l 0,-2 1.5,0 c 1.5,0 1.5,-1.5 1.5,-1.5 l 0,-9 c 0,-1.5 -1.5,-1.5 -1.5,-1.5 z m 0.5,2 2,0 0,2 -2,0 z m 3,0 2,0 0,2 -2,0 z m 3,0 2,0 0,2 -2,0 z m -6,3 2,0 0,2 -2,0 z m 3,0 2,0 0,2 -2,0 z m 3,0 2,0 0,2 -2,0 z m -6,3 2,0 0,2 -2,0 z m 3,0 2,0 0,2 -2,0 z m 3,0 2,0 0,2 -2,0 z m -3,3 2,0 0,2 -2,0 z' id='rect8806' sodipodi:nodetypes='cssccsssscscscccccccccccccccccccccccccccccccccccccccccccccccccccc' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-241,-447)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-241,-447)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-241,-447)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-241,-447)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-241,-447)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-241,-447)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-241,-447)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/input-gaming-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/input-gaming-symbolic-ref.png
new file mode 100644
index 00000000..f61bc878
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/input-gaming-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/input-gaming-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/input-gaming-symbolic.svg
new file mode 100644
index 00000000..97e779be
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/input-gaming-symbolic.svg
@@ -0,0 +1,35 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='input-gaming-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.92.2 (5c3e80d, 2017-08-06)' viewBox='0 0 16 16' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer10' inkscape:cx='10.441812' inkscape:cy='4.54477' inkscape:document-rotation='0' inkscape:document-units='px' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:measure-end='0,0' inkscape:measure-start='-190.687,-191.14' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='true' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='3440' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='8'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-80' originy='310' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-321.0002,-527)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-321.0002,-527)'>
+
+ <path inkscape:connector-curvature='0' d='m 323.24629,530 c -0.15239,0 -0.25615,0.073 -0.29101,0.20312 l -1.69336,8.6211 c -0.22665,0.84586 1.55948,1.85636 2.73828,1.17578 l 3,-4 h 4 l 3,4 c 1.1788,0.68058 2.96493,-0.32992 2.73828,-1.17578 l -1.69336,-8.6211 C 335.01026,530.07302 334.9065,530 334.75411,530 Z m 8.25391,1.89063 c 0.40558,0 0.73437,0.32879 0.73437,0.73437 0,0.40558 -0.32879,0.73437 -0.73437,0.73437 -0.40558,0 -0.73437,-0.32879 -0.73438,-0.73437 10e-6,-0.40558 0.3288,-0.73437 0.73438,-0.73437 z m -6.40625,-0.89058 h 0.8125 c 0.0519,0 0.0937,0.0418 0.0937,0.0937 V 532 h 0.90625 c 0.0519,0 0.0937,0.0418 0.0937,0.0937 v 0.8126 c 0,0.0519 -0.0418,0.0937 -0.0937,0.0937 h -0.90625 v 0.9063 c 0,0.0519 -0.0418,0.0937 -0.0937,0.0937 h -0.8125 c -0.0519,0 -0.0937,-0.0418 -0.0937,-0.0937 v -0.90625 h -0.90625 c -0.0519,0 -0.0937,-0.0418 -0.0937,-0.0937 v -0.8125 c 0,-0.0519 0.0418,-0.0937 0.0937,-0.0937 h 0.90625 v -0.90625 c 0,-0.0519 0.043,-0.0937 0.0937,-0.0937 z m 8.36206,1.84554 c 0.40558,0 0.73437,0.32879 0.73437,0.73438 0,0.40558 -0.32879,0.73437 -0.73437,0.73437 -0.40559,0 -0.73438,-0.32879 -0.73438,-0.73437 0,-0.40559 0.32879,-0.73438 0.73438,-0.73438 z' id='path3183' sodipodi:nodetypes='cccccccccccscscsssscsssscsssscsssscscssssss' style='color:#000000;display:inline;overflow:visible;vector-effect:none;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-321.0002,-527)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-321.0002,-527)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-321.0002,-527)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-321.0002,-527)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-321.0002,-527)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-321.0002,-527)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-321.0002,-527)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/input-keyboard-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/input-keyboard-symbolic-ref.png
new file mode 100644
index 00000000..27a3b2cf
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/input-keyboard-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/input-keyboard-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/input-keyboard-symbolic.svg
new file mode 100644
index 00000000..6d61254e
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/input-keyboard-symbolic.svg
@@ -0,0 +1,35 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='input-keyboard-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.92pre3 r' viewBox='0 0 16.0002 16' width='16.0002' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer10' inkscape:cx='16.40475' inkscape:cy='2.14352' inkscape:document-units='px' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:measure-end='0,0' inkscape:measure-start='0,0' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1016' inkscape:window-maximized='1' inkscape:window-width='1920' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='120.0002' originy='310' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-121,-527)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-121,-527)'>
+
+ <path inkscape:connector-curvature='0' d='m 122.0002,529 c -0.554,0 -1,0.446 -1,1 v 10 c 0,0.554 0.446,1 1,1 h 14 c 0.554,0 1,-0.446 1,-1 v -10 c 0,-0.554 -0.446,-1 -1,-1 z m 1.25,2 h 1.5 c 0.1385,0 0.25,0.1115 0.25,0.25 v 1.5 c 0,0.1385 -0.1115,0.25 -0.25,0.25 h -1.5 c -0.1385,0 -0.25,-0.1115 -0.25,-0.25 v -1.5 c 0,-0.1385 0.1115,-0.25 0.25,-0.25 z m 3,0 h 1.5 c 0.1385,0 0.25,0.1115 0.25,0.25 v 1.5 c 0,0.1385 -0.1115,0.25 -0.25,0.25 h -1.5 c -0.1385,0 -0.25,-0.1115 -0.25,-0.25 v -1.5 c 0,-0.1385 0.1115,-0.25 0.25,-0.25 z m 3,0 h 1.5 c 0.1385,0 0.25,0.1115 0.25,0.25 v 1.5 c 0,0.1385 -0.1115,0.25 -0.25,0.25 h -1.5 c -0.1385,0 -0.25,-0.1115 -0.25,-0.25 v -1.5 c 0,-0.1385 0.1115,-0.25 0.25,-0.25 z m 3,0 h 1.5 c 0.1385,0 0.25,0.1115 0.25,0.25 v 1.5 c 0,0.1385 -0.1115,0.25 -0.25,0.25 h -1.5 c -0.1385,0 -0.25,-0.1115 -0.25,-0.25 v -1.5 c 0,-0.1385 0.1115,-0.25 0.25,-0.25 z m -8,3 h 1.5 c 0.1385,0 0.25,0.1115 0.25,0.25 v 1.5 c 0,0.1385 -0.1115,0.25 -0.25,0.25 h -1.5 c -0.1385,0 -0.25,-0.1115 -0.25,-0.25 v -1.5 c 0,-0.1385 0.1115,-0.25 0.25,-0.25 z m 3,0 h 1.5 c 0.1385,0 0.25,0.1115 0.25,0.25 v 1.5 c 0,0.1385 -0.1115,0.25 -0.25,0.25 h -1.5 c -0.1385,0 -0.25,-0.1115 -0.25,-0.25 v -1.5 c 0,-0.1385 0.1115,-0.25 0.25,-0.25 z m 3,0 h 1.5 c 0.1385,0 0.25,0.1115 0.25,0.25 v 1.5 c 0,0.1385 -0.1115,0.25 -0.25,0.25 h -1.5 c -0.1385,0 -0.25,-0.1115 -0.25,-0.25 v -1.5 c 0,-0.1385 0.1115,-0.25 0.25,-0.25 z m 3,0 h 1.5 c 0.1385,0 0.25,0.1115 0.25,0.25 v 1.5 c 0,0.1385 -0.1115,0.25 -0.25,0.25 h -1.5 c -0.1385,0 -0.25,-0.1115 -0.25,-0.25 v -1.5 c 0,-0.1385 0.1115,-0.25 0.25,-0.25 z m -10,3 h 1.5 c 0.1385,0 0.25,0.1115 0.25,0.25 v 1.5 c 0,0.1385 -0.1115,0.25 -0.25,0.25 h -1.5 c -0.1385,0 -0.25,-0.1115 -0.25,-0.25 v -1.5 c 0,-0.1385 0.1115,-0.25 0.25,-0.25 z m 3,0 h 5.5 c 0.1385,0 0.25,0.1115 0.25,0.25 v 1.5 c 0,0.1385 -0.1115,0.25 -0.25,0.25 h -5.5 c -0.1385,0 -0.25,-0.1115 -0.25,-0.25 v -1.5 c 0,-0.1385 0.1115,-0.25 0.25,-0.25 z m 7,0 h 2.5 c 0.1385,0 0.25,0.1115 0.25,0.25 v 1.5 c 0,0.1385 -0.1115,0.25 -0.25,0.25 h -2.5 c -0.1385,0 -0.25,-0.1115 -0.25,-0.25 v -1.5 c 0,-0.1385 0.1115,-0.25 0.25,-0.25 z' id='rect4890' style='color:#bebebe;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;marker:none;enable-background:accumulate'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-121,-527)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-121,-527)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-121,-527)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-121,-527)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-121,-527)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-121,-527)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-121,-527)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/input-mouse-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/input-mouse-symbolic-ref.png
new file mode 100644
index 00000000..0e1af7aa
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/input-mouse-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/input-mouse-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/input-mouse-symbolic.svg
new file mode 100644
index 00000000..8d4619b1
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/input-mouse-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='input-mouse-symbolic.svg' height='16.009148' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.2 r9819' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-paths='false' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer10' inkscape:cx='-267.49829' inkscape:cy='-11.030133' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#555753' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1381' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='1600' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-341.0002,-446.99085)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-341.0002,-446.99085)'>
+
+ <path inkscape:connector-curvature='0' d='m 345.67931,450.99343 c -0.93151,-0.003 -1.68515,0.76529 -1.68971,1.72648 0.018,0.74437 0.0221,1.50686 0.015,2.26896 l 2.92137,0.0153 0.0189,-4.00381 -1.26571,-0.006 z m 2.40728,0.0117 -0.0189,4.00384 2.9215,0.0153 c 0.015,-0.7651 0.03,-1.53284 0.0366,-2.26867 0.003,-0.96119 -0.74166,-1.7388 -1.67322,-1.74352 l -1.26604,-0.006 z m -4.08639,5.08092 c -0.0113,0.83161 -0.037,1.50046 -0.0375,2.26595 -0.009,2.01107 1.55182,3.63807 3.50087,3.64796 1.94903,0.01 3.52584,-1.6012 3.53542,-3.6123 -0.0353,-0.83655 -0.046,-1.50842 -0.0375,-2.30161 z' id='rect7357' sodipodi:nodetypes='cccccccccccccccccccc' style='fill:#bebebe;fill-opacity:1;stroke:none' inkscape:transform-center-x='-0.34277078' inkscape:transform-center-y='-0.61561899'/>
+ <path inkscape:connector-curvature='0' d='m 349.0627,447 c -0.4543,0.0495 -0.88397,0.2214 -1.25,0.5 -0.48804,0.37146 -0.8125,0.95486 -0.8125,1.6875 -0.004,0.26416 0.23582,0.50712 0.5,0.50712 0.26418,0 0.50374,-0.24296 0.5,-0.50712 0,-0.4491 0.17164,-0.70389 0.4375,-0.90625 0.26586,-0.20236 0.66376,-0.30023 1.0625,-0.28125 0.39874,0.019 0.78428,0.15409 1.0625,0.40625 0.27822,0.25216 0.46875,0.5845 0.46875,1.125 0,2.1653 1.46382,3.50909 3,3.46875 0.85672,-0.0225 1.68825,-0.47696 2.25,-1.3125 l -0.5625,-1 c -0.37537,0.9157 -1.06785,1.29541 -1.71875,1.3125 -0.96046,0.0252 -1.96875,-0.72975 -1.96875,-2.46875 0,-0.79197 -0.33682,-1.44388 -0.8125,-1.875 -0.47568,-0.43112 -1.08104,-0.62738 -1.6875,-0.65625 -0.15162,-0.007 -0.31732,-0.0165 -0.46875,0 z m 6.9375,1.9687 c -3.3e-4,0.0104 -3.3e-4,0.0208 0,0.0312 0,0.0455 8.9e-4,0.0807 0,0.125 l 0.78125,1.375 c 0.0114,-0.0408 0.0208,-0.0833 0.0312,-0.125 z m 0,0.375 c -0.006,0.10599 -0.0201,0.21386 -0.0312,0.3125 l 0.71875,1.21875 c 0.0234,-0.0625 0.0415,-0.12233 0.0625,-0.1875 z m -0.0625,0.5 c -0.0138,0.0899 -0.0444,0.16659 -0.0625,0.25 l 0.65625,1.125 c 0.0293,-0.0609 0.0669,-0.12359 0.0937,-0.1875 z m -0.0937,0.4375 c -0.0237,0.0889 -0.0653,0.16899 -0.0937,0.25 l 0.59375,1.03125 c 0.0401,-0.0651 0.088,-0.1182 0.125,-0.1875 z' id='path7413' sodipodi:nodetypes='sscscscssccccsscsccccccccccccccccccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-341.0002,-446.99085)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-341.0002,-446.99085)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-341.0002,-446.99085)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-341.0002,-446.99085)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-341.0002,-446.99085)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-341.0002,-446.99085)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-341.0002,-446.99085)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/input-tablet-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/input-tablet-symbolic-ref.png
new file mode 100644
index 00000000..6ec4e87a
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/input-tablet-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/input-tablet-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/input-tablet-symbolic.svg
new file mode 100644
index 00000000..ae42bfe2
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/input-tablet-symbolic.svg
@@ -0,0 +1,36 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='input-tablet-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.91 r13725' width='16.53125' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer10' inkscape:cx='1.315968' inkscape:cy='-3.1959' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='false' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-19.75' originy='330' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-260.7502,-547)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-260.7502,-547)'>
+
+ <path inkscape:connector-curvature='0' d='m 269.0021,547.00379 -1.0019,0.0275 0.0312,0.5 c 0.0471,0.46556 -0.20254,0.96951 -0.59375,1.21875 -0.35305,0.24895 -0.90493,0.1983 -1.59375,0.21875 -0.34855,0.003 -0.70297,0.0839 -1.03125,0.28125 -0.32828,0.19733 -0.64985,0.5469 -0.71875,1 -0.15832,0.89239 0.45382,1.63343 1.15625,1.78125 0.80729,0.17604 1.64453,0.0756 2.625,0 0.25579,-0.0197 0.60056,0.0205 0.8125,0.125 0.33374,0.26075 0.28443,0.40291 0.28125,0.875 l -4.90625,0 -0.75,0 -0.21875,0.71875 -1.96875,7 -0.375,1.28125 1.34375,0 13.875,0 1.3125,0 -0.375,-1.28125 -1.81315,-6.02719 -1.58617,1.53661 1.14932,3.77183 -11.28125,0 1.4375,-5 3.3125,0 1.84375,-1.9687 0,-0.0312 0,-0.46875 c -0.003,-0.61146 -0.40574,-1.09656 -0.84375,-1.3125 -0.43801,-0.21594 -0.93011,-0.25063 -1.34375,-0.21875 -0.99591,0.0768 -1.73951,0.12494 -2.3125,0 l -0.0312,0 c -0.19949,-0.042 -0.41743,-0.20971 -0.34375,-0.625 0.0189,-0.12428 0.0777,-0.19648 0.21875,-0.28125 0.14101,-0.0848 0.35246,-0.15487 0.53125,-0.15625 l 0.0312,0 c 0.56397,-0.0167 1.37705,0.11764 2.09375,-0.40625 0.81874,-0.59848 1.15373,-1.39515 1.0625,-2.125 z' id='path12732' sodipodi:nodetypes='cccccccccccccccccccccccccccccscccccccssc' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:Sans;-inkscape-font-specification:Sans;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;enable-background:new'/>
+ <path inkscape:connector-curvature='0' d='m 275.012,551.35352 c -0.40883,-0.40883 -1.07168,-0.40883 -1.48051,0 -0.0349,0.0354 -0.0672,0.0733 -0.0967,0.11324 l -4.95263,4.95262 -0.45047,1.89789 1.87026,-0.38976 4.99956,-4.99958 c 0.0389,-0.0287 0.0759,-0.0601 0.11048,-0.0939 0.40883,-0.40883 0.40883,-1.07167 0,-1.4805 z' id='path12757' sodipodi:nodetypes='cccccccccc' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:evenodd;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.03800011;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:normal;color-rendering:auto;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision;enable-background:accumulate'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-260.7502,-547)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-260.7502,-547)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-260.7502,-547)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-260.7502,-547)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-260.7502,-547)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-260.7502,-547)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-260.7502,-547)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/input-touchpad-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/input-touchpad-symbolic-ref.png
new file mode 100644
index 00000000..9fab123b
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/input-touchpad-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/input-touchpad-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/input-touchpad-symbolic.svg
new file mode 100644
index 00000000..7b8af4a0
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/input-touchpad-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:svg='http://www.w3.org/2000/svg' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' sodipodi:docname='input-touchpad-symbolic.svg' version='1.1' inkscape:version='0.48.1 r9760' height='16' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:cy='38.35394' pagecolor='#555753' borderopacity='1' showborder='false' inkscape:bbox-paths='false' guidetolerance='10' inkscape:object-paths='true' inkscape:window-width='1539' showguides='true' inkscape:object-nodes='true' inkscape:snap-bbox='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:snap-nodes='false' bordercolor='#666666' objecttolerance='10' id='namedview88' showgrid='false' inkscape:window-maximized='0' inkscape:window-x='3' inkscape:snap-global='true' inkscape:window-y='60' gridtolerance='10' inkscape:window-height='948' inkscape:snap-to-guides='true' inkscape:current-layer='layer10' inkscape:snap-bbox-midpoints='false' inkscape:zoom='1' inkscape:cx='-130.68357' inkscape:snap-grids='true' inkscape:pageopacity='1'>
+ <inkscape:grid spacingx='1px' spacingy='1px' id='grid4866' empspacing='2' enabled='true' type='xygrid' snapvisiblegridlinesonly='true' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:label='status' transform='translate(-281,-448)' inkscape:groupmode='layer' id='layer9' style='display:inline'/>
+ <g inkscape:label='devices' transform='translate(-281,-448)' inkscape:groupmode='layer' id='layer10'>
+
+ <path inkscape:connector-curvature='0' d='m 284.03145,449 c -1.66919,0 -3.03125,1.36206 -3.03125,3.03125 l 0,7.9375 c 0,1.66919 1.36206,3.03125 3.03125,3.03125 l 8.9375,0 c 1.66919,0 3.03125,-1.36206 3.03125,-3.03125 l 0,-7.9375 c 0,-1.66919 -1.36206,-3.03125 -3.03125,-3.03125 l -8.9375,0 z m 0,2 8.9375,0 c 0.59578,0 1.03125,0.43547 1.03125,1.03125 l 0,5.96875 -11,0 0,-5.96875 c 0,-0.59578 0.43547,-1.03125 1.03125,-1.03125 z m -1.03125,8 5,0 0,2 -3.96875,0 c -0.59578,0 -1.03125,-0.43547 -1.03125,-1.03125 l 0,-0.96875 z m 6,0 5,0 0,0.96875 c 0,0.59578 -0.43547,1.03125 -1.03125,1.03125 l -3.96875,0 0,-2 z' id='rect5837' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <rect x='283.00018' y='451' id='rect5839-9' rx='0' height='7' ry='0' style='opacity:0.35;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' width='11.000002'/>
+ </g>
+ <g inkscape:label='apps' transform='translate(-281,-448)' inkscape:groupmode='layer' id='layer11'/>
+ <g inkscape:label='actions' transform='translate(-281,-448)' inkscape:groupmode='layer' id='layer12' style='display:inline'/>
+ <g inkscape:label='places' transform='translate(-281,-448)' inkscape:groupmode='layer' id='layer13'/>
+ <g inkscape:label='mimetypes' transform='translate(-281,-448)' inkscape:groupmode='layer' id='layer14'/>
+ <g inkscape:label='emblems' transform='translate(-281,-448)' inkscape:groupmode='layer' id='layer15' style='display:inline'/>
+ <g inkscape:label='categories' transform='translate(-281,-448)' inkscape:groupmode='layer' id='g4953' style='display:inline'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/insert-image-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/insert-image-symbolic-ref.png
new file mode 100644
index 00000000..3e7589a5
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/insert-image-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/insert-image-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/insert-image-symbolic.svg
new file mode 100644
index 00000000..0fbcc32d
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/insert-image-symbolic.svg
@@ -0,0 +1,33 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='insert-image-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.2 r9819' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-paths='false' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='391.7625' inkscape:cy='322.41898' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#555753' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1381' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='1600' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-41.0002,-807)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-41.0002,-807)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-41.0002,-807)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-41.0002,-807)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-41.0002,-807)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-41.0002,-807)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-41.0002,-807)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-41.0002,-807)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-41.0002,-807)'>
+
+ <path inkscape:connector-curvature='0' d='m 43.0002,807 0,9 12,0 0,-9 z m 2,2 8,0 0,5 -8,0 z' id='path9159' sodipodi:nodetypes='cccccccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 46.0004,812 c 2.32075,1 3.04463,-1.65963 6,0 l 0,1 -6,0 z' id='path9161' sodipodi:nodetypes='ccccc' style='opacity:0.35;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new'/>
+ <path inkscape:connector-curvature='0' d='m 52.003606,818.03877 -1.00114,0 c -0.2572,0 -0.52906,0.12998 -0.71957,0.31286 l -1.28269,1.28271 -1.2827,-1.28272 c -0.19026,-0.18312 -0.46238,-0.31285 -0.71959,-0.31281 l -1.00114,0 -10e-6,1.00114 c 0,0.3098 0.0903,0.55295 0.28162,0.75083 l 2.72184,2.65927 2.72182,-2.65927 c 0.19115,-0.19793 0.28158,-0.44106 0.28158,-0.75085 l 0,-1.00114 z' id='path9197' sodipodi:nodetypes='ccccccccccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/insert-link-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/insert-link-symbolic-ref.png
new file mode 100644
index 00000000..78135be8
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/insert-link-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/insert-link-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/insert-link-symbolic.svg
new file mode 100644
index 00000000..588f7892
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/insert-link-symbolic.svg
@@ -0,0 +1,34 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='insert-link-symbolic.svg' height='15.981833' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.2 r9819' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-paths='false' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='491.07501' inkscape:cy='254.28687' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#555753' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1381' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='1600' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-61.0002,-807.03638)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-61.0002,-807.03638)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-61.0002,-807.03638)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-61.0002,-807.03638)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-61.0002,-807.03638)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-61.0002,-807.03638)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-61.0002,-807.03638)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-61.0002,-807.03638)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-61.0002,-807.03638)'>
+ <path inkscape:connector-curvature='0' d='m 72.001437,819.02276 -1.000104,0 c -0.256939,1e-5 -0.52852,0.10844 -0.718842,0.26103 l -1.281366,1.07023 -1.281376,-1.07023 c -0.190072,-0.15281 -0.461903,-0.26103 -0.718862,-0.26099 l -1.000104,0 -1e-5,0.83531 c 0,0.25848 0.09021,0.46133 0.281332,0.62645 l 2.741452,2.53365 2.696608,-2.53365 c 0.190962,-0.16516 0.281292,-0.368 0.281292,-0.62647 l 0,-0.83531 z' id='path12141' sodipodi:nodetypes='cccccccccccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/>
+
+ <path inkscape:connector-curvature='0' d='m 70.804241,811.07609 a 0.93589869,1.0099261 0 0 0 0.185131,1.99773 l 4.936783,0 a 0.93589869,1.0099261 0 1 0 0,-1.99773 l -4.936783,0 a 0.93589869,1.0099261 0 0 0 -0.185131,0 z' id='path12155' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.89557707;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 61.813375,811.07609 c -0.449901,0.10227 -0.78916,0.59895 -0.743395,1.08834 0.04581,0.4894 0.470284,0.9044 0.930216,0.90939 l 4.916121,0 c 0.535231,0.0854 1.083884,-0.42019 1.083884,-0.99887 0,-0.57867 -0.548653,-1.08427 -1.083884,-0.99886 l -4.916121,0 c -0.06211,-0.007 -0.124754,-0.007 -0.186821,0 z' id='path12167' sodipodi:nodetypes='csccsccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.89557707;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 67.058903,807.99999 c -0.854177,0.12953 -1.568589,0.69462 -1.906257,1.46875 -0.07101,0.16272 -0.118204,0.34541 -0.156248,0.53125 l 8.003803,0 c -0.0261,-0.12512 -0.05351,-0.26249 -0.09371,-0.375 -0.346459,-0.96755 -1.269294,-1.625 -2.343747,-1.625 l -3.128807,0 c -0.126964,0 -0.252979,-0.0185 -0.374993,0 z m -2.062505,6 c 0.235307,1.13195 1.239871,2 2.437498,2 l 3.128807,0 c 1.197617,0 2.202201,-0.86805 2.437498,-2 z' id='path16654' sodipodi:nodetypes='cccccsscccsccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2.00102353;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/insert-object-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/insert-object-symbolic-ref.png
new file mode 100644
index 00000000..5a416e4b
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/insert-object-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/insert-object-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/insert-object-symbolic.svg
new file mode 100644
index 00000000..4bf42a0e
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/insert-object-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='insert-object-symbolic.svg' height='15.99993' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.2 r9819' version='1.1' width='16.000132' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-paths='false' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='35.319589' inkscape:cy='24.91767' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#555753' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1381' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='1600' inkscape:window-y='27' inkscape:zoom='11.313708'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-101.00014,-927)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-101.00014,-927)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-101.00014,-927)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-101.00014,-927)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-101.00014,-927)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-101.00014,-927)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-101.00014,-927)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-101.00014,-927)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-101.00014,-927)'>
+ <path inkscape:connector-curvature='0' d='m 109.0002,927 -4.99967,3.14259 0,4.71482 4.99951,3.14259 5.00049,-3.14259 0,-4.71482 z m 0,6 -3.64507,-2.17601 3.64507,-2.29205 3.64623,2.29205 z' id='path15214' sodipodi:nodetypes='cccccccccccc' style='fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none'/>
+
+ <path inkscape:connector-curvature='0' d='m 112.00019,939 -0.99999,0 c -0.2569,10e-6 -0.52845,0.11786 -0.71875,0.28369 l -1.28123,1.16309 -1.28123,-1.1631 c -0.19004,-0.16606 -0.46185,-0.28368 -0.71877,-0.28364 l -1,0 -1e-5,0.90779 c 0,0.28091 0.0902,0.50137 0.2813,0.68082 l 2.71874,2.41128 2.71871,-2.41128 c 0.19093,-0.17949 0.28125,-0.39993 0.28125,-0.68084 l 0,-0.90778 z' id='path15265' sodipodi:nodetypes='ccccccccccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/insert-text-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/insert-text-symbolic-ref.png
new file mode 100644
index 00000000..c80fcb10
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/insert-text-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/insert-text-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/insert-text-symbolic.svg
new file mode 100644
index 00000000..d4d9a742
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/insert-text-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='insert-text-symbolic.svg' height='15.999935' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.2 r9819' version='1.1' width='16.000132' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-paths='false' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='471.07507' inkscape:cy='254.2686' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#555753' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1381' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='1600' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-81.000135,-807)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-81.000135,-807)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-81.000135,-807)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-81.000135,-807)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-81.000135,-807)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-81.000135,-807)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-81.000135,-807)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-81.000135,-807)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-81.000135,-807)'>
+
+ <path inkscape:connector-curvature='0' d='m 92.000179,819 -0.999993,0 c -0.256903,10e-6 -0.528453,0.11786 -0.718755,0.28369 l -1.281223,1.16309 -1.281234,-1.1631 C 87.52893,819.11762 87.257123,819 87.000201,819.00004 l -0.999993,0 -1e-5,0.90779 c 0,0.28091 0.09021,0.50137 0.281297,0.68082 l 2.718741,2.41128 2.718704,-2.41128 c 0.190934,-0.17949 0.281258,-0.39993 0.281258,-0.68084 l 0,-0.90778 z' id='path7325' sodipodi:nodetypes='ccccccccccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/>
+ <path inkscape:connector-curvature='0' d='m 85,807 0,2 6,0 c 0.428164,0 1,0.61414 1,1 l 0,1 -5,0 c -0.919269,0 -1.735601,0.38396 -2.25,0.96875 -0.514399,0.58479 -0.756392,1.31063 -0.75,2.03125 0.0064,0.72062 0.268927,1.45271 0.78125,2.03125 C 85.293573,816.60979 86.091722,817 87,817 l 6,0 1,0 0,-1 0,-6 c 0,-1.63434 -1.319804,-3 -3,-3 l -6,0 z m 2,6 5,0 0,2 -5,0 c -0.397872,0 -0.566911,-0.10979 -0.71875,-0.28125 C 86.129411,814.54729 86.002478,814.27938 86,814 c -0.0025,-0.27938 0.104672,-0.55354 0.25,-0.71875 C 86.395328,813.11604 86.577639,813 87,813 z' id='path7493' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/keyboard-brightness-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/keyboard-brightness-symbolic-ref.png
new file mode 100644
index 00000000..84dc918c
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/keyboard-brightness-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/keyboard-brightness-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/keyboard-brightness-symbolic.svg
new file mode 100644
index 00000000..8d02358f
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/keyboard-brightness-symbolic.svg
@@ -0,0 +1,37 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='keyboard-brightness-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.4 r9939' version='1.1' width='16.000002' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='504.57332' inkscape:cy='-152.42645' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='702' inkscape:window-maximized='1' inkscape:window-width='1366' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='140px' originy='100px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ <inkscape:grid color='#000000' empcolor='#000000' empopacity='0' empspacing='4' enabled='true' id='grid5968' opacity='0.1254902' originx='140px' originy='100px' snapvisiblegridlinesonly='true' spacingx='0.5px' spacingy='0.5px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-101.0002,-317)'>
+
+ <rect height='2' id='rect5434' rx='0.47227278' ry='0.5' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' width='2.9722719' x='101.0002' y='327'/>
+ <rect height='2' id='rect5436' rx='0.499998' ry='0.5' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' width='3.0164659' x='113.98373' y='327'/>
+ <rect height='2' id='rect11183' rx='0.499998' ry='0.5' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' transform='matrix(0.70710678,-0.70710678,0.70710678,0.70710678,0,0)' width='3.0164659' x='-149.87271' y='308.0058'/>
+ <rect height='2' id='rect11189' rx='0.499998' ry='0.5' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' transform='matrix(-0.70710678,-0.70710678,0.70710678,-0.70710678,0,0)' width='3.0164659' x='-304.01929' y='-155.85748'/>
+ <rect height='1.999998' id='rect5448' rx='0.5' ry='0.50000203' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' transform='matrix(0,-1,1,0,0,0)' width='3' x='-323' y='108.0002'/>
+ <path inkscape:connector-curvature='0' d='m 107.24548,326.00034 c -0.16704,0.009 -0.32215,0.11722 -0.37496,0.26083 l -0.83643,2.21705 c -0.10137,0.23354 0.12645,0.52786 0.4038,0.52166 0,0 1.0705,1.2e-4 2.56698,1.2e-4 1.49648,0 2.56698,-1.2e-4 2.56698,-1.2e-4 0.27735,0.006 0.50517,-0.28812 0.4038,-0.52166 l -0.83643,-2.21705 c -0.0727,-0.19298 -0.33686,-0.30615 -0.54801,-0.23475 -0.21274,0.0692 -0.82049,0.26083 -1.58634,0.26083 -0.76585,0 -1.37363,-0.19167 -1.58634,-0.26083 -0.0548,-0.0194 -0.11421,-0.0284 -0.17305,-0.026 z' id='path7977' sodipodi:nodetypes='cccczccccsccc' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-101.0002,-317)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-101.0002,-317)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-101.0002,-317)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-101.0002,-317)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-101.0002,-317)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-101.0002,-317)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-101.0002,-317)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-101.0002,-317)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/list-add-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/list-add-symbolic-ref.png
new file mode 100644
index 00000000..fe1811e9
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/list-add-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/list-add-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/list-add-symbolic.svg
new file mode 100644
index 00000000..81ec4614
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/list-add-symbolic.svg
@@ -0,0 +1,30 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:svg='http://www.w3.org/2000/svg' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' version='1.1' inkscape:version='0.47 r22583' height='16' sodipodi:docname='list-add-symbolic.svg' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:object-paths='true' inkscape:cy='17.83946' inkscape:current-layer='layer12' inkscape:window-width='1920' pagecolor='#555753' showborder='false' showguides='true' inkscape:snap-nodes='false' objecttolerance='10' showgrid='true' inkscape:object-nodes='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:window-x='0' inkscape:snap-bbox='true' bordercolor='#666666' id='namedview88' inkscape:window-maximized='1' inkscape:snap-global='true' inkscape:window-y='26' gridtolerance='10' inkscape:zoom='1' inkscape:window-height='1021' borderopacity='1' guidetolerance='10' inkscape:snap-bbox-midpoints='false' inkscape:cx='-2.56708' inkscape:bbox-paths='false' inkscape:snap-grids='true' inkscape:pageopacity='1' inkscape:snap-to-guides='true'>
+ <inkscape:grid visible='true' spacingx='1px' type='xygrid' spacingy='1px' id='grid4866' empspacing='2' enabled='true' snapvisiblegridlinesonly='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g transform='translate(-60.0002,-726)' inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline'/>
+ <g transform='translate(-60.0002,-726)' inkscape:groupmode='layer' id='layer10' inkscape:label='devices'/>
+ <g transform='translate(-60.0002,-726)' inkscape:groupmode='layer' id='layer11' inkscape:label='apps'/>
+ <g transform='translate(-60.0002,-726)' inkscape:groupmode='layer' id='layer12' inkscape:label='actions'>
+
+ <path d='m 67.0002,729 0,4 -4,0 0,2 4,0 0,4 2,0 0,-4 4,0 0,-2 -4,0 0,-4 -2,0 z' id='rect31992' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible'/>
+ </g>
+ <g transform='translate(-60.0002,-726)' inkscape:groupmode='layer' id='layer13' inkscape:label='places'/>
+ <g transform='translate(-60.0002,-726)' inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes'/>
+ <g transform='translate(-60.0002,-726)' inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline'/>
+ <g transform='translate(-60.0002,-726)' inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/list-remove-all-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/list-remove-all-symbolic-ref.png
new file mode 100644
index 00000000..acb5ea7e
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/list-remove-all-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/list-remove-all-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/list-remove-all-symbolic.svg
new file mode 100644
index 00000000..aa1cedfe
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/list-remove-all-symbolic.svg
@@ -0,0 +1,35 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='list-remove-all-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.2 r9819' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-paths='false' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='9.3862167' inkscape:cy='1.0297' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#555753' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1381' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='1600' inkscape:window-y='27' inkscape:zoom='11.313708'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-81.0004,-847)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-81.0004,-847)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-81.0004,-847)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-81.0004,-847)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-81.0004,-847)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-81.0004,-847)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-81.0004,-847)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-81.0004,-847)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-81.0004,-847)'>
+
+ <rect height='2.0002136' id='rect38609' inkscape:label='a' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible' width='9.9996014' x='84.000595' y='849.99976'/>
+ <rect height='2.0002136' id='rect38611' inkscape:label='a' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible' width='2.9999998' x='91.000198' y='853.99976'/>
+ <rect height='2.0002136' id='rect38613' inkscape:label='a' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible' width='2.9999998' x='91.000198' y='857.99976'/>
+ <path inkscape:connector-curvature='0' d='m 82,853.0625 0,0.5 0,6.96875 0,0.5 0.5,0 7,0 0.5,0 0,-0.5 0,-6.96875 0,-0.5 -0.5,0 -7,0 -0.5,0 z m 1,1 6,0 0,5.96875 -6,0 0,-5.96875 z' id='rect38615' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 84.03125,856 0,2 4.03125,0 0,-2 -4.03125,0 z' id='path38617' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/list-remove-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/list-remove-symbolic-ref.png
new file mode 100644
index 00000000..ecfa9640
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/list-remove-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/list-remove-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/list-remove-symbolic.svg
new file mode 100644
index 00000000..33bdec5f
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/list-remove-symbolic.svg
@@ -0,0 +1,30 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:svg='http://www.w3.org/2000/svg' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' version='1.1' inkscape:version='0.47 r22583' height='16' sodipodi:docname='list-remove-symbolic.svg' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:object-paths='true' inkscape:cy='17.83946' inkscape:current-layer='layer12' inkscape:window-width='1920' pagecolor='#555753' showborder='false' showguides='true' inkscape:snap-nodes='false' objecttolerance='10' showgrid='true' inkscape:object-nodes='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:window-x='0' inkscape:snap-bbox='true' bordercolor='#666666' id='namedview88' inkscape:window-maximized='1' inkscape:snap-global='true' inkscape:window-y='26' gridtolerance='10' inkscape:zoom='1' inkscape:window-height='1021' borderopacity='1' guidetolerance='10' inkscape:snap-bbox-midpoints='false' inkscape:cx='17.43292' inkscape:bbox-paths='false' inkscape:snap-grids='true' inkscape:pageopacity='1' inkscape:snap-to-guides='true'>
+ <inkscape:grid visible='true' spacingx='1px' type='xygrid' spacingy='1px' id='grid4866' empspacing='2' enabled='true' snapvisiblegridlinesonly='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g transform='translate(-40.0002,-726)' inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline'/>
+ <g transform='translate(-40.0002,-726)' inkscape:groupmode='layer' id='layer10' inkscape:label='devices'/>
+ <g transform='translate(-40.0002,-726)' inkscape:groupmode='layer' id='layer11' inkscape:label='apps'/>
+ <g transform='translate(-40.0002,-726)' inkscape:groupmode='layer' id='layer12' inkscape:label='actions'>
+
+ <rect x='43.000397' y='732.99976' id='rect31984' height='2.0002136' inkscape:label='a' width='9.9996014' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible'/>
+ </g>
+ <g transform='translate(-40.0002,-726)' inkscape:groupmode='layer' id='layer13' inkscape:label='places'/>
+ <g transform='translate(-40.0002,-726)' inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes'/>
+ <g transform='translate(-40.0002,-726)' inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline'/>
+ <g transform='translate(-40.0002,-726)' inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/mail-attachment-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/mail-attachment-symbolic-ref.png
new file mode 100644
index 00000000..9f439c83
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/mail-attachment-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/mail-attachment-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/mail-attachment-symbolic.svg
new file mode 100644
index 00000000..b7ac76ad
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/mail-attachment-symbolic.svg
@@ -0,0 +1,35 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:svg='http://www.w3.org/2000/svg' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' version='1.1' inkscape:version='0.47 r22583' height='16' sodipodi:docname='mail-attachment-symbolic.svg' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:cy='-166.8292' inkscape:current-layer='layer9' inkscape:window-width='1310' pagecolor='#555753' showborder='false' showguides='true' inkscape:snap-nodes='true' objecttolerance='10' showgrid='false' inkscape:object-nodes='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:window-x='54' inkscape:snap-bbox='true' bordercolor='#666666' id='namedview88' inkscape:window-maximized='0' inkscape:snap-global='true' inkscape:window-y='25' gridtolerance='10' inkscape:zoom='1' inkscape:window-height='690' borderopacity='1' guidetolerance='10' inkscape:cx='255.82499' inkscape:bbox-paths='false' inkscape:snap-grids='true' inkscape:pageopacity='1' inkscape:snap-to-guides='true'>
+ <inkscape:grid visible='true' spacingx='1px' type='xygrid' spacingy='1px' id='grid4866' empspacing='2' enabled='true' snapvisiblegridlinesonly='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g transform='translate(-100.99995,-297)' inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline'>
+
+ <path d='m 106.98492,302.01596 a 0.99827605,1.0019266 0 0 1 -0.98363,-1.01579 c 0,-2.19827 1.7971,-4.00194 3.98737,-4.00194 2.19027,0 3.98736,1.80367 3.98736,4.00194 a 0.99827605,1.0019266 0 1 1 -1.99571,0 c 0,-1.11542 -0.88029,-1.99893 -1.99165,-1.99893 -1.11136,0 -1.99165,0.88351 -1.99165,1.99893 a 0.99827605,1.0019266 0 0 1 -1.01209,1.01579 z' id='path35480' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:15.34865284;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/>
+ <path d='m 108.4998,309.0008 c -1.36887,0 -2.50071,-1.13184 -2.50071,-2.50071 a 1.0004883,1.0004876 0 1 1 2.00098,0 c 0,0.28799 0.21174,0.49973 0.49973,0.49973 0.28799,0 0.49974,-0.21174 0.49974,-0.49973 a 1.0004883,1.0004876 0 1 1 2.00097,0 c 0,1.36887 -1.13184,2.50071 -2.50071,2.50071 z' id='path35482' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:30.64129829;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/>
+ <path d='M 109.78125,302 A 1.0001,1.0001 0 0 0 109,303 l 0,3.46875 a 1.0001,1.0001 0 1 0 2,0 L 111,303 a 1.0001,1.0001 0 0 0 -1.21875,-1 z' id='path35484' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/>
+ <path d='M 112.78125,300 A 1.0001,1.0001 0 0 0 112,301 l 0,6.8125 a 1.0001,1.0001 0 1 0 2,0 L 114,301 a 1.0001,1.0001 0 0 0 -1.21875,-1 z' id='path35486' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/>
+ <path d='M 106.78125,300 A 1.0001,1.0001 0 0 0 106,301 l 0,5.40625 a 1.0001,1.0001 0 1 0 2,0 L 108,301 a 1.0001,1.0001 0 0 0 -1.21875,-1 z' id='path35488' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/>
+ <path d='M 103.78125,301 A 1.0001,1.0001 0 0 0 103,302 l 0,6 a 1.0001,1.0001 0 1 0 2,0 l 0,-6 a 1.0001,1.0001 0 0 0 -1.21875,-1 z' id='path35490' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/>
+ <path d='m 112.84375,307 a 1.0001,1.0001 0 0 0 -0.65625,0.40625 L 109.5,311 l -2.03125,0 -2.6875,-3.53125 a 1.0001,1.0001 0 1 0 -1.5625,1.1875 l 3,3.9375 A 1.0001,1.0001 0 0 0 107,313 l 3,0 a 1.0001,1.0001 0 0 0 0.8125,-0.40625 l 3,-4 A 1.0001,1.0001 0 0 0 112.84375,307 z' id='path35494' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/>
+ </g>
+ <g transform='translate(-100.99995,-297)' inkscape:groupmode='layer' id='layer10' inkscape:label='devices'/>
+ <g transform='translate(-100.99995,-297)' inkscape:groupmode='layer' id='layer11' inkscape:label='apps'/>
+ <g transform='translate(-100.99995,-297)' inkscape:groupmode='layer' id='layer12' inkscape:label='actions'/>
+ <g transform='translate(-100.99995,-297)' inkscape:groupmode='layer' id='layer13' inkscape:label='places'/>
+ <g transform='translate(-100.99995,-297)' inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes'/>
+ <g transform='translate(-100.99995,-297)' inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/mail-mark-important-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/mail-mark-important-symbolic-ref.png
new file mode 100644
index 00000000..9d22cd6d
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/mail-mark-important-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/mail-mark-important-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/mail-mark-important-symbolic.svg
new file mode 100644
index 00000000..fe38ad76
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/mail-mark-important-symbolic.svg
@@ -0,0 +1,33 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:svg='http://www.w3.org/2000/svg' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' sodipodi:docname='mail-mark-important-symbolic.svg' version='1.1' inkscape:version='0.48.1 r9760' height='16' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:cy='10.84176' pagecolor='#555753' borderopacity='1' showborder='false' inkscape:bbox-paths='false' guidetolerance='10' inkscape:object-paths='true' inkscape:window-width='1239' showguides='true' inkscape:object-nodes='true' inkscape:snap-bbox='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:snap-nodes='true' bordercolor='#666666' objecttolerance='10' id='namedview88' showgrid='true' inkscape:window-maximized='0' inkscape:window-x='2529' inkscape:snap-global='true' inkscape:window-y='250' gridtolerance='10' inkscape:window-height='1056' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:current-layer='layer12' inkscape:snap-bbox-midpoints='false' inkscape:zoom='16' inkscape:cx='7.958716' inkscape:snap-grids='true' inkscape:pageopacity='1'>
+ <inkscape:grid spacingx='1px' spacingy='1px' id='grid4866' empspacing='2' enabled='true' type='xygrid' snapvisiblegridlinesonly='true' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:label='status' transform='translate(-321.0002,-647)' inkscape:groupmode='layer' id='layer9' style='display:inline'/>
+ <g inkscape:label='devices' transform='translate(-321.0002,-647)' inkscape:groupmode='layer' id='layer10'/>
+ <g inkscape:label='apps' transform='translate(-321.0002,-647)' inkscape:groupmode='layer' id='layer11'/>
+ <g inkscape:label='places' transform='translate(-321.0002,-647)' inkscape:groupmode='layer' id='layer13'/>
+ <g inkscape:label='mimetypes' transform='translate(-321.0002,-647)' inkscape:groupmode='layer' id='layer14'/>
+ <g inkscape:label='emblems' transform='translate(-321.0002,-647)' inkscape:groupmode='layer' id='layer15' style='display:inline'/>
+ <g inkscape:label='emotes' transform='translate(-321.0002,-647)' inkscape:groupmode='layer' id='g71291' style='display:inline'/>
+ <g inkscape:label='categories' transform='translate(-321.0002,-647)' inkscape:groupmode='layer' id='g4953' style='display:inline'/>
+ <g inkscape:label='actions' transform='translate(-321.0002,-647)' inkscape:groupmode='layer' id='layer12' style='display:inline'>
+ <path inkscape:connector-curvature='0' d='m 322.78093,648.71918 a 1.0000999,1.0000318 0 0 0 -0.40625,1.78113 l 5,3.99972 0.625,0.49997 0.625,-0.49997 5,-3.99972 a 1.0004905,1.0004223 0 1 0 -1.25,-1.5624 l -4.375,3.49977 -4.375,-3.49977 a 1.0000999,1.0000318 0 0 0 -0.84375,-0.21873 z' id='path35600-1' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.99999976;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/>
+ <path inkscape:connector-curvature='0' d='m 321.81284,648.00075 c -0.45841,0.0875 -0.82073,0.53337 -0.8125,0.99993 l 0,8.9994 c 5e-5,0.52354 0.47641,0.99987 1,0.99992 l 5.99986,0 0,-1.99986 -4.99986,0 0,-6.99952 10,0 -1.4e-4,3.99972 2,0 1.4e-4,-4.99966 c -5e-5,-0.52354 -0.47642,-0.99988 -1,-0.99993 l -12,0 c -0.0312,-9.9e-4 -0.0625,-9.9e-4 -0.0937,0 -0.0312,-9.9e-4 -0.0625,-9.9e-4 -0.0937,0 z' id='rect35604-4' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/>
+ <path inkscape:connector-curvature='0' class='warning' d='m 329.8752,655.06919 c -0.49245,0 -0.875,0.37923 -0.875,0.8674 l 0,6.19571 c 0,0.48816 0.38255,0.8674 0.875,0.8674 l 6.25,0 c 0.49245,0 0.875,-0.37924 0.875,-0.8674 l 0,-6.19571 c 0,-0.48817 -0.38255,-0.8674 -0.875,-0.8674 l -6.25,0 z m 2.125,0.99131 2,0 0,3.96526 -2,0 0,-3.96526 z m 0,4.95657 2,0 0,0.99131 -2,0 0,-0.99131 z' id='path10898-2-9' style='color:#bebebe;fill:#f57900;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible'/>
+
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/mail-read-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/mail-read-symbolic-ref.png
new file mode 100644
index 00000000..37f38b99
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/mail-read-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/mail-read-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/mail-read-symbolic.svg
new file mode 100644
index 00000000..589565bf
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/mail-read-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='mail-read-symbolic.svg' height='16.001099' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.4 r9939' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='295.28538' inkscape:cy='-277.42182' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1403' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='0' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='180.00025px' originy='80.000001px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-60.99995,-296.9989)'>
+
+ <path inkscape:connector-curvature='0' d='m 68.8752,297 a 1.0001,1.0001 0 0 0 -0.5,0.25 l -4.90625,4 a 1.0001,1.0001 0 0 0 -0.0625,0.0312 c 0,0 -0.32587,0.29728 -0.65625,0.75 -0.22334,0.30605 -0.3527,0.8316 -0.5,1.3125 a 1.0001,1.0001 0 0 0 -0.03125,0.0312 1.0001,1.0001 0 0 0 -0.21875,0.5625 c -5.1e-4,0.0118 3.6e-4,0.0195 0,0.0312 a 1.0001,1.0001 0 0 0 0,0.0312 1.0001,1.0001 0 0 0 0,0.15625 l 0,7.84375 a 1.0001,1.0001 0 0 0 1,1 l 12,0 a 1.0001,1.0001 0 0 0 1,-1 l 0,-7.84375 a 1.0001,1.0001 0 0 0 0,-0.15625 1.0001,1.0001 0 0 0 -0.21875,-0.65625 1.0001,1.0001 0 0 0 -0.03125,-0.0312 c -0.32774,-1.18787 -1.125,-2 -1.125,-2 a 1.0001,1.0001 0 0 0 -0.0312,-0.0312 L 69.6252,297.25 a 1.0001,1.0001 0 0 0 -0.65625,-0.25 1.0001,1.0001 0 0 0 -0.0937,0 z m 0.125,2.28125 4.3125,3.53125 0.0312,0.0312 c 0.021,0.0255 0.18032,0.24952 0.34375,0.5 l -4.68745,3.53125 -4.6875,-3.53125 c 0.0259,-0.0394 0.0349,-0.0872 0.0625,-0.125 0.1908,-0.26146 0.31874,-0.41421 0.34375,-0.4375 l 0.03125,-0.0312 4.25,-3.46875 z m -5,5.09375 4.6875,3.53125 0.3125,0.21875 0.3125,-0.21875 4.6875,-3.53125 0,6.625 -10,0 0,-6.625 z' id='path35631' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.5;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-60.99995,-296.9989)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-60.99995,-296.9989)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-60.99995,-296.9989)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-60.99995,-296.9989)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-60.99995,-296.9989)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-60.99995,-296.9989)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-60.99995,-296.9989)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-60.99995,-296.9989)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/mail-replied-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/mail-replied-symbolic-ref.png
new file mode 100644
index 00000000..9cc5086c
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/mail-replied-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/mail-replied-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/mail-replied-symbolic.svg
new file mode 100644
index 00000000..cf4b3962
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/mail-replied-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:svg='http://www.w3.org/2000/svg' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' sodipodi:docname='mail-replied-symbolic.svg' version='1.1' inkscape:version='0.48.0 r9654' height='16' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:cy='-376.32726' pagecolor='#555753' borderopacity='1' showborder='false' inkscape:bbox-paths='false' guidetolerance='10' inkscape:window-width='1310' showguides='true' inkscape:object-nodes='true' inkscape:snap-bbox='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:snap-nodes='true' bordercolor='#666666' objecttolerance='10' id='namedview88' showgrid='false' inkscape:window-maximized='0' inkscape:window-x='52' inkscape:snap-global='true' inkscape:window-y='24' gridtolerance='10' inkscape:window-height='690' inkscape:snap-to-guides='true' inkscape:current-layer='layer9' inkscape:zoom='1' inkscape:cx='84.56551' inkscape:snap-grids='true' inkscape:pageopacity='1'>
+ <inkscape:grid spacingx='1px' spacingy='1px' id='grid4866' empspacing='2' enabled='true' type='xygrid' snapvisiblegridlinesonly='true' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:label='status' transform='translate(-80.99995,-297)' inkscape:groupmode='layer' id='layer9' style='display:inline'>
+
+ <g transform='translate(61.0002,1.000001)' id='g35737' style='opacity:0.25'/>
+ <path inkscape:connector-curvature='0' d='M 89.000002,301.99999 87.999999,302 c -0.265308,3e-5 -0.530582,0.0931 -0.718754,0.28124 l -2.999999,3.00001 -0.281254,0.28125 2e-6,0.87499 0.281255,0.28126 3.000003,2.99999 c 0.188182,0.18821 0.45347,0.28121 0.718754,0.28121 l 1.000001,10e-6 3e-6,-1 c 3.8e-5,-0.26531 -0.0931,-0.53059 -0.281208,-0.71877 l -2.281257,-2.28124 2.281247,-2.28125 c 0.18815,-0.18817 0.281244,-0.45345 0.281249,-0.71875 l 3e-6,-1 z' id='path3613-6-6' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/>
+ <path inkscape:connector-curvature='0' d='m 93,301 0,2.5 c 0,0.84027 -0.65973,1.5 -1.5,1.5 l -5.5,0 0,2 5.5,0 c 1.921152,0 3.5,-1.57885 3.5,-3.5 l 0,-2.5 -2,0 z' id='path35770' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+ <g inkscape:label='devices' transform='translate(-80.99995,-297)' inkscape:groupmode='layer' id='layer10'/>
+ <g inkscape:label='apps' transform='translate(-80.99995,-297)' inkscape:groupmode='layer' id='layer11'/>
+ <g inkscape:label='actions' transform='translate(-80.99995,-297)' inkscape:groupmode='layer' id='layer12'/>
+ <g inkscape:label='places' transform='translate(-80.99995,-297)' inkscape:groupmode='layer' id='layer13'/>
+ <g inkscape:label='mimetypes' transform='translate(-80.99995,-297)' inkscape:groupmode='layer' id='layer14'/>
+ <g inkscape:label='emblems' transform='translate(-80.99995,-297)' inkscape:groupmode='layer' id='layer15' style='display:inline'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/mail-send-receive-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/mail-send-receive-symbolic-ref.png
new file mode 100644
index 00000000..c0782259
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/mail-send-receive-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/mail-send-receive-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/mail-send-receive-symbolic.svg
new file mode 100644
index 00000000..181da67e
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/mail-send-receive-symbolic.svg
@@ -0,0 +1,34 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' id='svg7384' xmlns:svg='http://www.w3.org/2000/svg' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns='http://www.w3.org/2000/svg' height='16' width='16' sodipodi:docname='mail-send-receive-symbolic.svg' version='1.1' inkscape:version='0.48.1 r9760' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:cx='32.58415' inkscape:cy='12.92131' inkscape:snap-bbox='true' objecttolerance='10' showgrid='false' showborder='false' inkscape:window-width='1226' inkscape:snap-grids='true' inkscape:zoom='16' guidetolerance='10' inkscape:pageopacity='1' pagecolor='#555753' inkscape:snap-bbox-midpoints='false' inkscape:bbox-paths='false' inkscape:snap-others='false' gridtolerance='10' id='namedview88' inkscape:window-x='2774' inkscape:window-y='363' borderopacity='1' inkscape:pageshadow='2' inkscape:window-height='967' inkscape:window-maximized='0' bordercolor='#666666' showguides='true' inkscape:guide-bbox='true' inkscape:snap-nodes='true' inkscape:snap-to-guides='true' inkscape:object-paths='false' inkscape:current-layer='layer12' inkscape:object-nodes='false' inkscape:snap-global='true'>
+ <inkscape:grid type='xygrid' snapvisiblegridlinesonly='true' visible='true' id='grid4866' empspacing='2' enabled='true' spacingx='1px' spacingy='1px'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:label='status' id='layer9' transform='translate(-81.00015,-687)' style='display:inline' inkscape:groupmode='layer'/>
+ <g inkscape:label='devices' id='layer10' transform='translate(-81.00015,-687)' inkscape:groupmode='layer'/>
+ <g inkscape:label='apps' id='layer11' transform='translate(-81.00015,-687)' inkscape:groupmode='layer'/>
+ <g inkscape:label='places' id='layer13' transform='translate(-81.00015,-687)' inkscape:groupmode='layer'/>
+ <g inkscape:label='mimetypes' id='layer14' transform='translate(-81.00015,-687)' inkscape:groupmode='layer'/>
+ <g inkscape:label='emblems' id='layer15' transform='translate(-81.00015,-687)' style='display:inline' inkscape:groupmode='layer'/>
+ <g inkscape:label='emotes' transform='translate(-81.00015,-687)' id='g71291' style='display:inline' inkscape:groupmode='layer'/>
+ <g inkscape:label='categories' id='g4953' transform='translate(-81.00015,-687)' style='display:inline' inkscape:groupmode='layer'/>
+ <g inkscape:label='actions' id='layer12' transform='translate(-81.00015,-687)' style='display:inline' inkscape:groupmode='layer'>
+
+ <path d='m 90.00016,694.00001 -10e-6,-1 c -3e-5,-0.26531 -0.0931,-0.53058 -0.28124,-0.71876 L 86.7189,689.28126 86.43765,689 l -0.87499,0 -0.28126,0.28126 -2.99999,3 c -0.18821,0.18818 -0.28121,0.45347 -0.28121,0.71876 l -1e-5,1 1,0 c 0.26531,4e-5 0.53059,-0.0931 0.71877,-0.28121 l 2.28124,-2.28126 2.28125,2.28125 c 0.18817,0.18815 0.45345,0.28125 0.71875,0.28125 l 1,0 z' id='path3613-6-6-9' inkscape:connector-curvature='0' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/>
+ <path d='m 85,691 0,7 2,0 0,-7 -2,0 z' id='path35770-1' inkscape:connector-curvature='0' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path d='m 96.00016,694.99999 -10e-6,1 c -3e-5,0.26531 -0.0931,0.53058 -0.28124,0.71876 L 92.7189,699.71874 92.43765,700 l -0.87499,0 -0.28126,-0.28126 -2.99999,-3 c -0.18821,-0.18818 -0.28121,-0.45347 -0.28121,-0.71876 l -1e-5,-1 1,0 c 0.26531,-4e-5 0.53059,0.0931 0.71877,0.28121 l 2.28124,2.28126 2.28125,-2.28125 c 0.18817,-0.18815 0.45345,-0.28125 0.71875,-0.28125 l 1,0 z' id='path3613-6-6-9-5' inkscape:connector-curvature='0' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/>
+ <path d='m 91,691 0,7 2,0 0,-7 -2,0 z' id='path35770-1-5' inkscape:connector-curvature='0' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/mail-send-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/mail-send-symbolic-ref.png
new file mode 100644
index 00000000..a44516ff
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/mail-send-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/mail-send-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/mail-send-symbolic.svg
new file mode 100644
index 00000000..709b92f7
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/mail-send-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='mail-send-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='-105.03245' inkscape:cy='208.90811' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='702' inkscape:window-maximized='1' inkscape:window-width='1366' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='-119.00001px' originy='569px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-360.00021,-786)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-360.00021,-786)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-360.00021,-786)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-360.00021,-786)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-360.00021,-786)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-360.00021,-786)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-360.00021,-786)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-360.00021,-786)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-360.00021,-786)'>
+ <path inkscape:connector-curvature='0' d='m 361.0002,786 0,2 c 0.55228,0 1,0.44772 1,1 0,0.55228 -0.44772,1 -1,1 l 0,1 c 0.55229,0 1,0.44772 1,1 0,0.55228 -0.44771,1 -1,1 l 0,1 c 0.55228,0 1,0.44772 1,1 0,0.55228 -0.44772,1 -1,1 l 0,1 c 0.55228,0 1,0.44772 1,1 0,0.55228 -0.44772,1 -1,1 l 0,2 2,0 c 0,-0.55228 0.44772,-1 1,-1 0.55228,0 1,0.44772 1,1 l 1,0 c 0,-0.55228 0.44772,-1 1,-1 0.55228,0 1,0.44772 1,1 l 1,0 c 0,-0.55228 0.44772,-1 1,-1 0.55229,0 1,0.44772 1,1 l 1,0 c 0,-0.55228 0.44771,-1 1,-1 0.55229,0 1,0.44772 1,1 l 2,0 0,-2 c -0.55229,0 -1,-0.44772 -1,-1 0,-0.55228 0.44771,-1 1,-1 l 0,-1 c -0.55229,0 -1,-0.44772 -1,-1 0,-0.55228 0.44771,-1 1,-1 l 0,-1 c -0.55229,0 -1,-0.44772 -1,-1 0,-0.55228 0.44771,-1 1,-1 l 0,-1 c -0.55229,0 -1,-0.44772 -1,-1 0,-0.55228 0.44771,-1 1,-1 l 0,-2 -2,0 c 0,0.55228 -0.44771,1 -1,1 -0.55229,0 -1,-0.44772 -1,-1 l -1,0 c 0,0.55228 -0.44771,1 -1,1 -0.55228,0 -1,-0.44772 -1,-1 l -1,0 c 0,0.55228 -0.44772,1 -1,1 -0.55228,0 -1,-0.44772 -1,-1 l -1,0 c 0,0.55228 -0.44772,1 -1,1 -0.55228,0 -1,-0.44772 -1,-1 l -2,0 z m 2,2 11,0 0,11 -2,0 0,-2.0625 c 0,-1.0667 -0.77865,-1.98042 -1.71875,-2.25 -0.49379,0.47964 -1.07039,0.6875 -1.78125,0.6875 -0.71086,0 -1.28746,-0.20786 -1.78125,-0.6875 -0.77657,0.27945 -1.71772,0.97676 -1.71875,2.21875 l 0,2.09375 -2,0 0,-11 z' id='path9296' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+ <path sodipodi:cx='49.5' sodipodi:cy='342.5' d='m 52,342.5 a 2.5,2.5 0 1 1 -5,0 2.5,2.5 0 1 1 5,0 z' id='path9298' sodipodi:rx='2.5' sodipodi:ry='2.5' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' transform='matrix(0.92307481,0,0,0.92307481,322.80799,476.15456)' sodipodi:type='arc'/>
+
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/mail-unread-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/mail-unread-symbolic-ref.png
new file mode 100644
index 00000000..49f657f6
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/mail-unread-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/mail-unread-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/mail-unread-symbolic.svg
new file mode 100644
index 00000000..9219b508
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/mail-unread-symbolic.svg
@@ -0,0 +1,30 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:svg='http://www.w3.org/2000/svg' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' version='1.1' inkscape:version='0.47 r22583' height='16' sodipodi:docname='mail-unread-symbolic.svg' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:cy='-166.8292' inkscape:current-layer='layer9' inkscape:window-width='1310' pagecolor='#555753' showborder='false' showguides='true' inkscape:snap-nodes='true' objecttolerance='10' showgrid='false' inkscape:object-nodes='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:window-x='54' inkscape:snap-bbox='true' bordercolor='#666666' id='namedview88' inkscape:window-maximized='0' inkscape:snap-global='true' inkscape:window-y='25' gridtolerance='10' inkscape:zoom='1' inkscape:window-height='690' borderopacity='1' guidetolerance='10' inkscape:cx='315.82499' inkscape:bbox-paths='false' inkscape:snap-grids='true' inkscape:pageopacity='1' inkscape:snap-to-guides='true'>
+ <inkscape:grid visible='true' spacingx='1px' type='xygrid' spacingy='1px' id='grid4866' empspacing='2' enabled='true' snapvisiblegridlinesonly='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g transform='translate(-40.99995,-297)' inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline'>
+
+ <path d='m 43.78125,301 a 1.0000999,1.0000999 0 0 0 -0.40625,1.78125 l 5,4 0.625,0.5 0.625,-0.5 5,-4 a 1.0004882,1.0004882 0 1 0 -1.25,-1.5625 l -4.375,3.5 -4.375,-3.5 A 1.0000999,1.0000999 0 0 0 43.78125,301 z' id='path35600' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.99999976;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/>
+ <path d='M 42.90625,300 A 1.0001,1.0001 0 0 0 42,301 l 0,9 a 1.0001,1.0001 0 0 0 1,1 l 12,0 a 1.0001,1.0001 0 0 0 1,-1 l 0,-9 a 1.0001,1.0001 0 0 0 -1,-1 l -12,0 a 1.0001,1.0001 0 0 0 -0.09375,0 z M 44,302 l 10,0 0,7 -10,0 0,-7 z' id='rect35604' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/>
+ </g>
+ <g transform='translate(-40.99995,-297)' inkscape:groupmode='layer' id='layer10' inkscape:label='devices'/>
+ <g transform='translate(-40.99995,-297)' inkscape:groupmode='layer' id='layer11' inkscape:label='apps'/>
+ <g transform='translate(-40.99995,-297)' inkscape:groupmode='layer' id='layer12' inkscape:label='actions'/>
+ <g transform='translate(-40.99995,-297)' inkscape:groupmode='layer' id='layer13' inkscape:label='places'/>
+ <g transform='translate(-40.99995,-297)' inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes'/>
+ <g transform='translate(-40.99995,-297)' inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/mark-location-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/mark-location-symbolic-ref.png
new file mode 100644
index 00000000..b63fceb2
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/mark-location-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/mark-location-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/mark-location-symbolic.svg
new file mode 100644
index 00000000..731ba38e
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/mark-location-symbolic.svg
@@ -0,0 +1,35 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='mark-location-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16.003361' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.91 r13725' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='-35.194213' inkscape:cy='0.3491' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='true' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='11.313708'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='80.00005' originy='590' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-161.00015,-806.99664)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-161.00015,-806.99664)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-161.00015,-806.99664)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-161.00015,-806.99664)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-161.00015,-806.99664)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-161.00015,-806.99664)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-161.00015,-806.99664)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-161.00015,-806.99664)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-161.00015,-806.99664)'>
+
+ <path inkscape:connector-curvature='0' d='m 169.0003,806.99664 c -2.76142,0 -5,2.23858 -5,5 0,0.17259 0.0142,0.33191 0.0312,0.5 0.0137,0.16725 0.0358,0.33617 0.0625,0.5 0.57248,3.51444 2.9063,6.00336 4.9063,8.00336 2,-2 4.33372,-4.48892 4.9062,-8.00336 0.0267,-0.16383 0.0488,-0.33275 0.0625,-0.5 0.0171,-0.16809 0.0312,-0.32741 0.0312,-0.5 0,-2.76142 -2.23858,-5 -5,-5 z m 0,3 c 1.10457,0 2,0.89543 2,2 0,1.10457 -0.89543,2 -2,2 -1.10457,0 -2,-0.89543 -2,-2 0,-1.10457 0.89543,-2 2,-2 z' id='path5874' sodipodi:nodetypes='cscccccsccsssss' style='color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/media-eject-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/media-eject-symbolic-ref.png
new file mode 100644
index 00000000..1d3cc1ed
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/media-eject-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/media-eject-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/media-eject-symbolic.svg
new file mode 100644
index 00000000..8bd0fb19
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/media-eject-symbolic.svg
@@ -0,0 +1,35 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:svg='http://www.w3.org/2000/svg' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' sodipodi:docname='media-eject-symbolic.svg' version='1.1' inkscape:version='0.48.1 r9760' height='16' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:cy='0.27139' pagecolor='#555753' borderopacity='1' showborder='false' inkscape:bbox-paths='false' guidetolerance='10' inkscape:object-paths='true' inkscape:window-width='1198' showguides='true' inkscape:object-nodes='true' inkscape:snap-bbox='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:snap-nodes='false' bordercolor='#666666' objecttolerance='10' id='namedview88' showgrid='false' inkscape:window-maximized='0' inkscape:window-x='1569' inkscape:snap-global='true' inkscape:window-y='86' gridtolerance='10' inkscape:window-height='1079' inkscape:snap-to-guides='true' inkscape:current-layer='layer12' inkscape:snap-bbox-midpoints='false' inkscape:zoom='1' inkscape:cx='14.307476' inkscape:snap-grids='true' inkscape:pageopacity='1'>
+ <inkscape:grid spacingx='1px' spacingy='1px' id='grid4866' empspacing='2' enabled='true' type='xygrid' snapvisiblegridlinesonly='true' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:label='status' transform='translate(-180.00019,-606)' inkscape:groupmode='layer' id='layer9' style='display:inline'/>
+ <g inkscape:label='devices' transform='translate(-180.00019,-606)' inkscape:groupmode='layer' id='layer10'/>
+ <g inkscape:label='apps' transform='translate(-180.00019,-606)' inkscape:groupmode='layer' id='layer11'/>
+ <g inkscape:label='actions' transform='translate(-180.00019,-606)' inkscape:groupmode='layer' id='layer12'>
+
+ <g transform='matrix(0,1,-1,0,682.99995,626)' id='g4007'>
+ <path inkscape:connector-curvature='0' d='m -9,488.99975 0,12 2,0 0,-12 z' id='path3807-1-1-9-3-0-9' sodipodi:nodetypes='ccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <g id='g4002'>
+ <path inkscape:connector-curvature='0' d='m -18,494.99995 c 0,0.26598 0.0891,0.53317 0.28125,0.71875 l 5,5 c 0.15909,0.1562 0.3719,0.25725 0.59375,0.28125 l 0.125,0 1,0 0,-12 -1,0 -0.125,0 c -0.22185,0.024 -0.43466,0.12505 -0.59375,0.28125 l -5,5 C -17.91087,494.46678 -18,494.73397 -18,494.99995 z' id='path3807-1-1-9-8-4' sodipodi:nodetypes='sccccccccccs' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+ </g>
+ </g>
+ <g inkscape:label='places' transform='translate(-180.00019,-606)' inkscape:groupmode='layer' id='layer13'/>
+ <g inkscape:label='mimetypes' transform='translate(-180.00019,-606)' inkscape:groupmode='layer' id='layer14'/>
+ <g inkscape:label='emblems' transform='translate(-180.00019,-606)' inkscape:groupmode='layer' id='layer15' style='display:inline'/>
+ <g inkscape:label='categories' transform='translate(-180.00019,-606)' inkscape:groupmode='layer' id='g4953' style='display:inline'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/media-flash-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/media-flash-symbolic-ref.png
new file mode 100644
index 00000000..86b7ab8b
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/media-flash-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/media-flash-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/media-flash-symbolic.svg
new file mode 100644
index 00000000..ca5a479e
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/media-flash-symbolic.svg
@@ -0,0 +1,34 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='media-flash-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16.000002' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer10' inkscape:cx='12.38862' inkscape:cy='10.70209' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1373' inkscape:window-maximized='0' inkscape:window-width='1279' inkscape:window-x='1279' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='120px' originy='270px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-121.0002,-487)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-121.0002,-487)'>
+ <g id='g43190' inkscape:label='musicplayer' transform='translate(60.000002,20)'>
+
+ </g>
+ <path inkscape:connector-curvature='0' d='m 125.5627,489 c -0.84831,0 -1.5625,0.71419 -1.5625,1.5625 l 0,8.875 c 0,0.84832 0.71417,1.5625 1.5625,1.5625 l 7.875,0 c 0.84834,0 1.5625,-0.71416 1.5625,-1.5625 l 0,-7.90625 L 132.5627,489 z m 0.4375,2 6.125,0 0.875,0.9375 0,7.0625 -7,0 z' id='rect3042' sodipodi:nodetypes='ssssssccscccccc' style='font-size:xx-small;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:sans-serif;-inkscape-font-specification:sans-serif'/>
+ <path inkscape:connector-curvature='0' d='m 127.9377,492 c -0.51728,0 -0.9375,0.42022 -0.9375,0.9375 l 0,2.03125 c 0,0.51727 0.42022,0.9375 0.9375,0.9375 l 0.0625,0 0,-2.90625 1,0 0,2.90625 2.0625,0 c 0.51728,0 0.9375,-0.42023 0.9375,-0.9375 l 0,-2.03125 c 0,-0.51728 -0.42022,-0.9375 -0.9375,-0.9375 l -0.0625,0 0,3.03125 -1,0 0,-3.03125 -2.0625,0 z' id='rect6261-6' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-121.0002,-487)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-121.0002,-487)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-121.0002,-487)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-121.0002,-487)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-121.0002,-487)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-121.0002,-487)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-121.0002,-487)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/media-floppy-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/media-floppy-symbolic-ref.png
new file mode 100644
index 00000000..14231ee7
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/media-floppy-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/media-floppy-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/media-floppy-symbolic.svg
new file mode 100644
index 00000000..802edb2d
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/media-floppy-symbolic.svg
@@ -0,0 +1,34 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='media-floppy-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16.000002' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer10' inkscape:cx='32.38862' inkscape:cy='10.70209' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1373' inkscape:window-maximized='0' inkscape:window-width='1279' inkscape:window-x='1279' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='140px' originy='270px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-101.0002,-487)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-101.0002,-487)'>
+ <g id='g40649' inkscape:label='musicplayer' transform='translate(40.000002,20)'>
+
+ </g>
+ <path inkscape:connector-curvature='0' d='m 103.96895,488 c -1.07534,0 -1.96875,0.89341 -1.96875,1.96875 l 0,9.03125 0,0.4375 0.3125,0.28125 1.6875,1.6875 0,-11.40625 10,0 0,10 -2,0 0,2 2.03125,0 c 1.07534,0 1.96875,-0.89341 1.96875,-1.96875 l 0,-10.0625 c 0,-1.07534 -0.89341,-1.96875 -1.96875,-1.96875 z' id='rect2860' sodipodi:nodetypes='sscccccccccsssss' style='font-size:xx-small;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.99999964;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:sans-serif;-inkscape-font-specification:sans-serif'/>
+ <path inkscape:connector-curvature='0' d='m 106.0002,496 c -0.554,0 -1,0.446 -1,1 l 0,4 c 0,0.554 0.446,1 1,1 l 4,0 c 0.554,0 1,-0.446 1,-1 l 0,-4 c 0,-0.554 -0.446,-1 -1,-1 l -4,0 z m 0,1 2,0 0,4 -2,0 0,-4 z' id='rect2880' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.99999964;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-101.0002,-487)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-101.0002,-487)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-101.0002,-487)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-101.0002,-487)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-101.0002,-487)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-101.0002,-487)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-101.0002,-487)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/media-optical-bd-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/media-optical-bd-symbolic-ref.png
new file mode 100644
index 00000000..21e28dcc
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/media-optical-bd-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/media-optical-bd-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/media-optical-bd-symbolic.svg
new file mode 100644
index 00000000..bb5bc1b6
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/media-optical-bd-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='media-optical-bd-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.2 r9819' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-paths='false' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer10' inkscape:cx='107.52524' inkscape:cy='3.05352' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#555753' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='419' inkscape:window-maximized='0' inkscape:window-width='511' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(319,-447)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(319,-447)'>
+
+ <path inkscape:connector-curvature='0' d='m -311.01113,447.99554 c -3.84231,0 -6.99332,3.15102 -6.99332,6.99332 0,3.8423 3.15101,7.01559 6.99332,7.01559 3.8423,0 7.01559,-3.17329 7.01559,-7.01559 0,-3.8423 -3.17329,-6.99332 -7.01559,-6.99332 z m 0,4.00891 c 1.68054,0 3.00668,1.30387 3.00668,2.98441 0,1.68054 -1.32614,3.00668 -3.00668,3.00668 -1.68055,0 -2.98441,-1.32614 -2.98441,-3.00668 0,-1.68054 1.30386,-2.98441 2.98441,-2.98441 z' id='path5040' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:5.61250019;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m -310.99496,453.0058 c -1.09865,0 -2.01317,0.89789 -2.01317,1.99654 0,1.09864 0.91452,1.99653 2.01317,1.99653 1.09865,0 1.99654,-0.89789 1.99654,-1.99653 0,-1.09865 -0.89789,-1.99654 -1.99654,-1.99654 z m 0,0.99827 c 0.55821,0 0.99827,0.44006 0.99827,0.99827 0,0.5582 -0.44006,0.99826 -0.99827,0.99826 -0.55821,0 -0.99827,-0.44006 -0.99827,-0.99826 0,-0.55821 0.44006,-0.99827 0.99827,-0.99827 z' id='path5042' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.87825239;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(319,-447)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(319,-447)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(319,-447)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(319,-447)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(319,-447)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(319,-447)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(319,-447)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/media-optical-cd-audio-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/media-optical-cd-audio-symbolic-ref.png
new file mode 100644
index 00000000..21e28dcc
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/media-optical-cd-audio-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/media-optical-cd-audio-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/media-optical-cd-audio-symbolic.svg
new file mode 100644
index 00000000..5900adda
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/media-optical-cd-audio-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='media-optical-cd-audio-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.2 r9819' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-paths='false' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer10' inkscape:cx='87.52524' inkscape:cy='3.05352' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#555753' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='740' inkscape:window-maximized='0' inkscape:window-width='639' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(299,-447)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(299,-447)'>
+
+ <path inkscape:connector-curvature='0' d='m -291.01113,447.99554 c -3.84231,0 -6.99332,3.15102 -6.99332,6.99332 0,3.8423 3.15101,7.01559 6.99332,7.01559 3.8423,0 7.01559,-3.17329 7.01559,-7.01559 0,-3.8423 -3.17329,-6.99332 -7.01559,-6.99332 z m 0,4.00891 c 1.68054,0 3.00668,1.30387 3.00668,2.98441 0,1.68054 -1.32614,3.00668 -3.00668,3.00668 -1.68055,0 -2.98441,-1.32614 -2.98441,-3.00668 0,-1.68054 1.30386,-2.98441 2.98441,-2.98441 z' id='path5050' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:5.61250019;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m -290.99496,453.0058 c -1.09865,0 -2.01317,0.89789 -2.01317,1.99654 0,1.09864 0.91452,1.99653 2.01317,1.99653 1.09865,0 1.99654,-0.89789 1.99654,-1.99653 0,-1.09865 -0.89789,-1.99654 -1.99654,-1.99654 z m 0,0.99827 c 0.55821,0 0.99827,0.44006 0.99827,0.99827 0,0.5582 -0.44006,0.99826 -0.99827,0.99826 -0.55821,0 -0.99827,-0.44006 -0.99827,-0.99826 0,-0.55821 0.44006,-0.99827 0.99827,-0.99827 z' id='path5052' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.87825239;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(299,-447)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(299,-447)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(299,-447)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(299,-447)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(299,-447)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(299,-447)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(299,-447)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/media-optical-dvd-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/media-optical-dvd-symbolic-ref.png
new file mode 100644
index 00000000..21e28dcc
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/media-optical-dvd-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/media-optical-dvd-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/media-optical-dvd-symbolic.svg
new file mode 100644
index 00000000..166ec546
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/media-optical-dvd-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='media-optical-dvd-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.2 r9819' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-paths='false' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer10' inkscape:cx='67.52524' inkscape:cy='3.05352' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#555753' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='740' inkscape:window-maximized='0' inkscape:window-width='639' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(279,-447)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(279,-447)'>
+
+ <path inkscape:connector-curvature='0' d='m -271.01113,447.99554 c -3.84231,0 -6.99332,3.15102 -6.99332,6.99332 0,3.8423 3.15101,7.01559 6.99332,7.01559 3.8423,0 7.01559,-3.17329 7.01559,-7.01559 0,-3.8423 -3.17329,-6.99332 -7.01559,-6.99332 z m 0,4.00891 c 1.68054,0 3.00668,1.30387 3.00668,2.98441 0,1.68054 -1.32614,3.00668 -3.00668,3.00668 -1.68055,0 -2.98441,-1.32614 -2.98441,-3.00668 0,-1.68054 1.30386,-2.98441 2.98441,-2.98441 z' id='path5060' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:5.61250019;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m -270.99496,453.0058 c -1.09865,0 -2.01317,0.89789 -2.01317,1.99654 0,1.09864 0.91452,1.99653 2.01317,1.99653 1.09865,0 1.99654,-0.89789 1.99654,-1.99653 0,-1.09865 -0.89789,-1.99654 -1.99654,-1.99654 z m 0,0.99827 c 0.55821,0 0.99827,0.44006 0.99827,0.99827 0,0.5582 -0.44006,0.99826 -0.99827,0.99826 -0.55821,0 -0.99827,-0.44006 -0.99827,-0.99826 0,-0.55821 0.44006,-0.99827 0.99827,-0.99827 z' id='path5062' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.87825239;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(279,-447)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(279,-447)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(279,-447)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(279,-447)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(279,-447)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(279,-447)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(279,-447)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/media-optical-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/media-optical-symbolic-ref.png
new file mode 100644
index 00000000..21e28dcc
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/media-optical-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/media-optical-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/media-optical-symbolic.svg
new file mode 100644
index 00000000..e14f3880
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/media-optical-symbolic.svg
@@ -0,0 +1,33 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:svg='http://www.w3.org/2000/svg' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' sodipodi:docname='media-optical-symbolic.svg' version='1.1' inkscape:version='0.48.1 r9760' height='16' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:cy='1.30312' pagecolor='#555753' borderopacity='1' showborder='false' inkscape:bbox-paths='false' guidetolerance='10' inkscape:object-paths='true' inkscape:window-width='1296' showguides='true' inkscape:object-nodes='true' inkscape:snap-bbox='false' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:snap-nodes='false' bordercolor='#666666' objecttolerance='10' id='namedview88' showgrid='false' inkscape:window-maximized='0' inkscape:window-x='9' inkscape:snap-global='true' inkscape:window-y='26' gridtolerance='10' inkscape:window-height='1013' inkscape:snap-to-guides='true' inkscape:current-layer='layer10' inkscape:snap-bbox-midpoints='false' inkscape:zoom='1' inkscape:cx='12.345535' inkscape:snap-grids='true' inkscape:pageopacity='1'>
+ <inkscape:grid spacingx='1px' spacingy='1px' id='grid4866' empspacing='2' enabled='true' type='xygrid' snapvisiblegridlinesonly='true' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:label='status' transform='translate(-201.0002,-448)' inkscape:groupmode='layer' id='layer9' style='display:inline'/>
+ <g inkscape:label='devices' transform='translate(-201.0002,-448)' inkscape:groupmode='layer' id='layer10'>
+ <g inkscape:label='accessories-calculator' transform='translate(153.0002,50)' id='g39787'>
+
+ </g>
+ <path inkscape:connector-curvature='0' d='m 208.98907,448.99554 c -3.84231,0 -6.99332,3.15102 -6.99332,6.99332 0,3.8423 3.15101,7.01559 6.99332,7.01559 3.8423,0 7.01559,-3.17329 7.01559,-7.01559 0,-3.8423 -3.17329,-6.99332 -7.01559,-6.99332 z m 0,4.00891 c 1.68054,0 3.00668,1.30387 3.00668,2.98441 0,1.68054 -1.32614,3.00668 -3.00668,3.00668 -1.68055,0 -2.98441,-1.32614 -2.98441,-3.00668 0,-1.68054 1.30386,-2.98441 2.98441,-2.98441 z' id='path39797' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:5.61250019;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 209.00524,454.0058 c -1.09865,0 -2.01317,0.89789 -2.01317,1.99654 0,1.09864 0.91452,1.99653 2.01317,1.99653 1.09865,0 1.99654,-0.89789 1.99654,-1.99653 0,-1.09865 -0.89789,-1.99654 -1.99654,-1.99654 z m 0,0.99827 c 0.55821,0 0.99827,0.44006 0.99827,0.99827 0,0.5582 -0.44006,0.99826 -0.99827,0.99826 -0.55821,0 -0.99827,-0.44006 -0.99827,-0.99826 0,-0.55821 0.44006,-0.99827 0.99827,-0.99827 z' id='path40342' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.87825239;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+ <g inkscape:label='apps' transform='translate(-201.0002,-448)' inkscape:groupmode='layer' id='layer11'/>
+ <g inkscape:label='actions' transform='translate(-201.0002,-448)' inkscape:groupmode='layer' id='layer12'/>
+ <g inkscape:label='places' transform='translate(-201.0002,-448)' inkscape:groupmode='layer' id='layer13'/>
+ <g inkscape:label='mimetypes' transform='translate(-201.0002,-448)' inkscape:groupmode='layer' id='layer14'/>
+ <g inkscape:label='emblems' transform='translate(-201.0002,-448)' inkscape:groupmode='layer' id='layer15' style='display:inline'/>
+ <g inkscape:label='categories' transform='translate(-201.0002,-448)' inkscape:groupmode='layer' id='g4953' style='display:inline'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/media-playback-pause-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/media-playback-pause-symbolic-ref.png
new file mode 100644
index 00000000..e99da7e5
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/media-playback-pause-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/media-playback-pause-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/media-playback-pause-symbolic.svg
new file mode 100644
index 00000000..e5ac9c9d
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/media-playback-pause-symbolic.svg
@@ -0,0 +1,29 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:svg='http://www.w3.org/2000/svg' id='svg7384' version='1.1' height='16' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs id='defs7386'/>
+ <g transform='translate(-159.99995,-496)' id='layer9' style='display:inline'/>
+ <g transform='translate(-159.99995,-496)' id='layer10'/>
+ <g transform='translate(-159.99995,-496)' id='layer11'/>
+ <g transform='translate(-159.99995,-496)' id='layer12'>
+
+ <g transform='translate(39.99995,9)' id='g3221'>
+ <path inkscape:connector-curvature='0' d='m 124,491 0,8 3,0 0,-8 -3,0 z' id='path3807-1-1-5-8-6' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0pt;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;font-family:Andale Mono'/>
+ <path inkscape:connector-curvature='0' d='m 129,491 0,8 3,0 0,-8 -3,0 z' id='path3807-1-1-5-8-6-3' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0pt;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;font-family:Andale Mono'/>
+ </g>
+ </g>
+ <g transform='translate(-159.99995,-496)' id='layer13'/>
+ <g transform='translate(-159.99995,-496)' id='layer14'/>
+ <g transform='translate(-159.99995,-496)' id='layer15'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/media-playback-start-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/media-playback-start-symbolic-ref.png
new file mode 100644
index 00000000..4964cece
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/media-playback-start-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/media-playback-start-symbolic-rtl-ref.png b/rsvg/tests/fixtures/reftests/adwaita/media-playback-start-symbolic-rtl-ref.png
new file mode 100644
index 00000000..5c323a5d
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/media-playback-start-symbolic-rtl-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/media-playback-start-symbolic-rtl.svg b/rsvg/tests/fixtures/reftests/adwaita/media-playback-start-symbolic-rtl.svg
new file mode 100644
index 00000000..9f352015
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/media-playback-start-symbolic-rtl.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='media-playback-start-symbolic-rtl.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='-119.78672' inkscape:cy='304.78205' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1374' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='5e-05px' originy='510px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-241.00015,-727)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-241.00015,-727)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-241.00015,-727)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-241.00015,-727)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-241.00015,-727)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-241.00015,-727)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-241.00015,-727)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-241.00015,-727)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-241.00015,-727)'>
+
+ <path inkscape:connector-curvature='0' d='m 253.0001,730 0,10 -0.90625,0 -0.0937,0 c -0.17491,10e-4 -0.34778,-0.0388 -0.5,-0.125 l -7,-4 c -0.3107,-0.17189 -0.46875,-0.52345 -0.46875,-0.875 0,-0.35155 0.15805,-0.70311 0.46875,-0.875 l 7,-4 c 0.15222,-0.0862 0.32509,-0.12631 0.5,-0.125 l 0.0937,0 z' id='path5730' sodipodi:nodetypes='ccccccsccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/media-playback-start-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/media-playback-start-symbolic.svg
new file mode 100644
index 00000000..50e3403d
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/media-playback-start-symbolic.svg
@@ -0,0 +1,29 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:svg='http://www.w3.org/2000/svg' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' sodipodi:docname='media-playback-start-symbolic.svg' version='1.1' inkscape:version='0.48pre1 r9509' height='16' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:cy='122.27773' pagecolor='#555753' borderopacity='1' showborder='false' inkscape:bbox-paths='false' guidetolerance='10' inkscape:window-width='1310' showguides='true' inkscape:object-nodes='true' inkscape:snap-bbox='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:snap-nodes='true' bordercolor='#666666' objecttolerance='10' id='namedview88' showgrid='false' inkscape:window-maximized='0' inkscape:window-x='54' inkscape:snap-global='true' inkscape:window-y='24' gridtolerance='10' inkscape:window-height='690' inkscape:snap-to-guides='true' inkscape:current-layer='layer12' inkscape:zoom='1' inkscape:cx='79.3513' inkscape:snap-grids='true' inkscape:pageopacity='1'>
+ <inkscape:grid spacingx='1px' spacingy='1px' id='grid4866' empspacing='2' enabled='true' type='xygrid' snapvisiblegridlinesonly='true' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:label='status' transform='translate(-79.99995,-606)' inkscape:groupmode='layer' id='layer9' style='display:inline'/>
+ <g inkscape:label='devices' transform='translate(-79.99995,-606)' inkscape:groupmode='layer' id='layer10'/>
+ <g inkscape:label='apps' transform='translate(-79.99995,-606)' inkscape:groupmode='layer' id='layer11'/>
+ <g inkscape:label='actions' transform='translate(-79.99995,-606)' inkscape:groupmode='layer' id='layer12'>
+
+ <path inkscape:connector-curvature='0' d='m 84,609 0,10 0.90625,0 L 85,619 c 0.174914,10e-4 0.347782,-0.0388 0.5,-0.125 l 7,-4 c 0.310699,-0.17189 0.46875,-0.52345 0.46875,-0.875 0,-0.35155 -0.158051,-0.70311 -0.46875,-0.875 l -7,-4 C 85.347782,609.03875 85.174914,608.99869 85,609 l -0.09375,0 z' id='path3807-1-1-9-38-4' sodipodi:nodetypes='ccccccsccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/>
+ </g>
+ <g inkscape:label='places' transform='translate(-79.99995,-606)' inkscape:groupmode='layer' id='layer13'/>
+ <g inkscape:label='mimetypes' transform='translate(-79.99995,-606)' inkscape:groupmode='layer' id='layer14'/>
+ <g inkscape:label='emblems' transform='translate(-79.99995,-606)' inkscape:groupmode='layer' id='layer15' style='display:inline'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/media-playback-stop-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/media-playback-stop-symbolic-ref.png
new file mode 100644
index 00000000..78c76328
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/media-playback-stop-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/media-playback-stop-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/media-playback-stop-symbolic.svg
new file mode 100644
index 00000000..0d99845e
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/media-playback-stop-symbolic.svg
@@ -0,0 +1,29 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:svg='http://www.w3.org/2000/svg' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' sodipodi:docname='media-playback-stop-symbolic.svg' version='1.1' inkscape:version='0.48pre1 r9509' height='16' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:cy='122.27773' pagecolor='#555753' borderopacity='1' showborder='false' inkscape:bbox-paths='false' guidetolerance='10' inkscape:window-width='1310' showguides='true' inkscape:object-nodes='true' inkscape:snap-bbox='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:snap-nodes='true' bordercolor='#666666' objecttolerance='10' id='namedview88' showgrid='false' inkscape:window-maximized='0' inkscape:window-x='54' inkscape:snap-global='true' inkscape:window-y='24' gridtolerance='10' inkscape:window-height='690' inkscape:snap-to-guides='true' inkscape:current-layer='layer12' inkscape:zoom='1' inkscape:cx='19.3513' inkscape:snap-grids='true' inkscape:pageopacity='1'>
+ <inkscape:grid spacingx='1px' spacingy='1px' id='grid4866' empspacing='2' enabled='true' type='xygrid' snapvisiblegridlinesonly='true' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:label='status' transform='translate(-139.99995,-606)' inkscape:groupmode='layer' id='layer9' style='display:inline'/>
+ <g inkscape:label='devices' transform='translate(-139.99995,-606)' inkscape:groupmode='layer' id='layer10'/>
+ <g inkscape:label='apps' transform='translate(-139.99995,-606)' inkscape:groupmode='layer' id='layer11'/>
+ <g inkscape:label='actions' transform='translate(-139.99995,-606)' inkscape:groupmode='layer' id='layer12'>
+
+ <path inkscape:connector-curvature='0' d='m 143.99995,610 0,8 8,0 0,-8 -8,0 z' id='path3807-1-1-5-8' sodipodi:nodetypes='ccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0pt;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;font-family:Andale Mono'/>
+ </g>
+ <g inkscape:label='places' transform='translate(-139.99995,-606)' inkscape:groupmode='layer' id='layer13'/>
+ <g inkscape:label='mimetypes' transform='translate(-139.99995,-606)' inkscape:groupmode='layer' id='layer14'/>
+ <g inkscape:label='emblems' transform='translate(-139.99995,-606)' inkscape:groupmode='layer' id='layer15' style='display:inline'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/media-playlist-consecutive-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/media-playlist-consecutive-symbolic-ref.png
new file mode 100644
index 00000000..41ed3e60
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/media-playlist-consecutive-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/media-playlist-consecutive-symbolic-rtl-ref.png b/rsvg/tests/fixtures/reftests/adwaita/media-playlist-consecutive-symbolic-rtl-ref.png
new file mode 100644
index 00000000..2eb18c8a
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/media-playlist-consecutive-symbolic-rtl-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/media-playlist-consecutive-symbolic-rtl.svg b/rsvg/tests/fixtures/reftests/adwaita/media-playlist-consecutive-symbolic-rtl.svg
new file mode 100644
index 00000000..b21de1fb
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/media-playlist-consecutive-symbolic-rtl.svg
@@ -0,0 +1,34 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='media-playlist-consecutive-rtl-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.4 r9939' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='267.82372' inkscape:cy='-199.06477' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1374' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='60.000248px' originy='60.000001px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-180.99995,-277)'>
+
+ <path inkscape:connector-curvature='0' d='m 183,284 0,2 12.96875,0 0,-2 L 183,284 z' id='path5429' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 184.875,282 a 1.0001,1.0001 0 0 0 -0.59375,0.28125 l -2,2 -0.6875,0.71875 0.6875,0.71875 2,2 a 1.016466,1.016466 0 1 0 1.4375,-1.4375 L 184.4375,285 l 1.28125,-1.28125 A 1.0001,1.0001 0 0 0 184.875,282 z' id='path5431' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <rect height='1' id='rect5433' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' transform='scale(-1,1)' width='1' x='-185.99989' y='282'/>
+ <rect height='1' id='rect5435' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' transform='scale(-1,1)' width='1' x='-185.99989' y='287'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-180.99995,-277)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-180.99995,-277)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-180.99995,-277)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-180.99995,-277)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-180.99995,-277)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-180.99995,-277)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-180.99995,-277)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-180.99995,-277)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/media-playlist-consecutive-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/media-playlist-consecutive-symbolic.svg
new file mode 100644
index 00000000..a17c717e
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/media-playlist-consecutive-symbolic.svg
@@ -0,0 +1,34 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='media-playlist-consecutive-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.4 r9939' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='20.889842' inkscape:cy='1.700942' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1381' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='140.00025px' originy='60.000001px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-100.99995,-277)'>
+
+ <path inkscape:connector-curvature='0' d='m 102.03125,284 0,2 12.96875,0 0,-2 -12.96875,0 z' id='path8300' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 112.78125,282 a 1.0001,1.0001 0 0 0 -0.5,1.71875 L 113.5625,285 l -1.28125,1.28125 a 1.016466,1.016466 0 1 0 1.4375,1.4375 l 2,-2 0.6875,-0.71875 -0.6875,-0.71875 -2,-2 A 1.0001,1.0001 0 0 0 112.78125,282 z' id='path8302' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <rect height='1' id='rect8308' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' width='1' x='112' y='282'/>
+ <rect height='1' id='rect8310' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' width='1' x='112' y='287'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-100.99995,-277)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-100.99995,-277)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-100.99995,-277)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-100.99995,-277)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-100.99995,-277)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-100.99995,-277)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-100.99995,-277)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-100.99995,-277)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/media-playlist-repeat-song-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/media-playlist-repeat-song-symbolic-ref.png
new file mode 100644
index 00000000..663b945c
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/media-playlist-repeat-song-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/media-playlist-repeat-song-symbolic-rtl-ref.png b/rsvg/tests/fixtures/reftests/adwaita/media-playlist-repeat-song-symbolic-rtl-ref.png
new file mode 100644
index 00000000..fe4e9d72
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/media-playlist-repeat-song-symbolic-rtl-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/media-playlist-repeat-song-symbolic-rtl.svg b/rsvg/tests/fixtures/reftests/adwaita/media-playlist-repeat-song-symbolic-rtl.svg
new file mode 100644
index 00000000..97bdb18c
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/media-playlist-repeat-song-symbolic-rtl.svg
@@ -0,0 +1,36 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='media-playlist-repeat-song-rtl-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.4 r9939' version='1.1' width='16.00025' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='464.57357' inkscape:cy='-192.42645' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='702' inkscape:window-maximized='1' inkscape:window-width='1366' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='100.00025px' originy='60.000001px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ <inkscape:grid color='#000000' empcolor='#000000' empopacity='0' empspacing='4' enabled='true' id='grid5968' opacity='0.1254902' originx='100.00025px' originy='60.000001px' snapvisiblegridlinesonly='true' spacingx='0.5px' spacingy='0.5px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-140.99995,-277)'>
+
+ <path inkscape:connector-curvature='0' d='m 146.78125,286 a 1.0001,1.0001 0 0 0 -0.5,1.71875 L 147.5625,289 l -1.28125,1.28125 a 1.016466,1.016466 0 1 0 1.4375,1.4375 l 2,-2 0.6875,-0.71875 -0.6875,-0.71875 -2,-2 A 1.0001,1.0001 0 0 0 146.78125,286 z' id='path10497' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 156.0002,286.00549 0,0.99451 c 0,1.6447 -1.3553,3 -3,3 l -1,0 0,-2 1,0 c 0.5713,0 1,-0.4287 1,-1 l 0,-0.98346 z M 147.99288,282 l -2.99268,0 c -0.5713,0 -1,0.4287 -1,1 l 0,4 c 0,0.5713 0.4287,1 1,1 l 4,0 0,2 -4,0 c -1.6447,0 -3,-1.3553 -3,-3 l 0,-4 c 0,-1.6447 1.3553,-3 3,-3 l 2.98163,0 z' id='path10499' sodipodi:nodetypes='cssccsscccssssccsssscc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <rect height='1' id='rect10501' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' transform='scale(-1,1)' width='1' x='-146.99995' y='286'/>
+ <rect height='1' id='rect10503' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' transform='scale(-1,1)' width='1' x='-146.99995' y='291'/>
+ <path inkscape:connector-curvature='0' d='m 153.0002,277 c -2.20914,0 -4,1.79086 -4,4 0,2.20915 1.79086,4 4,4 2.20914,0 4,-1.79085 4,-4 0,-2.20914 -1.79086,-4 -4,-4 z m -1,2 2,0 0,4 -2,0 -0.004,-1.98857 -0.9959,-0.0114 0,-1 z' id='path10505' sodipodi:nodetypes='ssssscccccccc' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.36104703;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-140.99995,-277)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-140.99995,-277)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-140.99995,-277)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-140.99995,-277)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-140.99995,-277)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-140.99995,-277)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-140.99995,-277)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-140.99995,-277)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/media-playlist-repeat-song-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/media-playlist-repeat-song-symbolic.svg
new file mode 100644
index 00000000..470368bb
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/media-playlist-repeat-song-symbolic.svg
@@ -0,0 +1,36 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='media-playlist-repeat-song-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.4 r9939' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='544.57357' inkscape:cy='-192.42645' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='702' inkscape:window-maximized='1' inkscape:window-width='1366' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='180.00025px' originy='60.000001px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ <inkscape:grid color='#000000' empcolor='#000000' empopacity='0' empspacing='4' enabled='true' id='grid5968' opacity='0.1254902' originx='180.00025px' originy='60.000001px' snapvisiblegridlinesonly='true' spacingx='0.5px' spacingy='0.5px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-60.99995,-277)'>
+
+ <path inkscape:connector-curvature='0' d='m 70.875,286 a 1.0001,1.0001 0 0 0 -0.59375,0.28125 l -2,2 -0.6875,0.71875 0.6875,0.71875 2,2 a 1.016466,1.016466 0 1 0 1.4375,-1.4375 L 70.4375,289 71.71875,287.71875 A 1.0001,1.0001 0 0 0 70.875,286 z' id='path8282' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 62.0002,286.00549 0,0.99451 c 0,1.6447 1.355297,3 3,3 l 1,0 0,-2 -1,0 c -0.571297,0 -1,-0.4287 -1,-1 l 0,-0.98346 z M 70.007523,282 73.0002,282 c 0.571297,0 1,0.4287 1,1 l 0,4 c 0,0.5713 -0.428703,1 -1,1 l -4,0 0,2 4,0 c 1.644703,0 3,-1.3553 3,-3 l 0,-4 c 0,-1.6447 -1.355297,-3 -3,-3 l -2.981628,0 z' id='path8284' sodipodi:nodetypes='cssccsscccssssccsssscc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <rect height='1' id='rect8286' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' width='1' x='71' y='286'/>
+ <rect height='1' id='rect8288' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' width='1' x='71' y='291'/>
+ <path inkscape:connector-curvature='0' d='m 65.0002,277 c -2.209143,0 -4,1.79086 -4,4 0,2.20915 1.790857,4 4,4 2.209143,0 4,-1.79085 4,-4 0,-2.20914 -1.790857,-4 -4,-4 z m -1,2 2,0 0,4 -2,0 0,-2 -1,0 0,-1 z' id='path8290' sodipodi:nodetypes='ssssscccccccc' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.36104703;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-60.99995,-277)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-60.99995,-277)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-60.99995,-277)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-60.99995,-277)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-60.99995,-277)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-60.99995,-277)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-60.99995,-277)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-60.99995,-277)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/media-playlist-repeat-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/media-playlist-repeat-symbolic-ref.png
new file mode 100644
index 00000000..eabf5e9f
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/media-playlist-repeat-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/media-playlist-repeat-symbolic-rtl-ref.png b/rsvg/tests/fixtures/reftests/adwaita/media-playlist-repeat-symbolic-rtl-ref.png
new file mode 100644
index 00000000..b5750f5a
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/media-playlist-repeat-symbolic-rtl-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/media-playlist-repeat-symbolic-rtl.svg b/rsvg/tests/fixtures/reftests/adwaita/media-playlist-repeat-symbolic-rtl.svg
new file mode 100644
index 00000000..164d6c27
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/media-playlist-repeat-symbolic-rtl.svg
@@ -0,0 +1,34 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='media-playlist-repeat-rtl-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.4 r9939' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='327.82372' inkscape:cy='-199.06477' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1374' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='120.00025px' originy='60.000001px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-120.99995,-277)'>
+
+ <path inkscape:connector-curvature='0' d='m 126.78125,286 a 1.0001,1.0001 0 0 0 -0.5,1.71875 L 127.5625,289 l -1.28125,1.28125 a 1.016466,1.016466 0 1 0 1.4375,1.4375 l 2,-2 0.6875,-0.71875 -0.6875,-0.71875 -2,-2 A 1.0001,1.0001 0 0 0 126.78125,286 z' id='path5363' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 125,280 c -1.6447,0 -3,1.3553 -3,3 l 0,4 c 0,1.6447 1.3553,3 3,3 l 4,0 0,-2 -4,0 c -0.5713,0 -1,-0.4287 -1,-1 l 0,-4 c 0,-0.5713 0.4287,-1 1,-1 l 8,0 c 0.5713,0 1,0.4287 1,1 l 0,4 c 0,0.5713 -0.4287,1 -1,1 l -1,0 0,2 1,0 c 1.6447,0 3,-1.3553 3,-3 l 0,-4 c 0,-1.6447 -1.3553,-3 -3,-3 l -8,0 z' id='path5365' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <rect height='1' id='rect5367' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' transform='scale(-1,1)' width='1' x='-126.9999' y='286'/>
+ <rect height='1' id='rect5369' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' transform='scale(-1,1)' width='1' x='-126.9999' y='291'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-120.99995,-277)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-120.99995,-277)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-120.99995,-277)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-120.99995,-277)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-120.99995,-277)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-120.99995,-277)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-120.99995,-277)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-120.99995,-277)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/media-playlist-repeat-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/media-playlist-repeat-symbolic.svg
new file mode 100644
index 00000000..c46727bf
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/media-playlist-repeat-symbolic.svg
@@ -0,0 +1,33 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:svg='http://www.w3.org/2000/svg' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' sodipodi:docname='media-playlist-repeat-symbolic.svg' version='1.1' inkscape:version='0.48.0 r9654' height='16' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:cy='-254.16755' pagecolor='#555753' borderopacity='1' showborder='false' inkscape:bbox-paths='false' guidetolerance='10' inkscape:window-width='1310' showguides='true' inkscape:object-nodes='true' inkscape:snap-bbox='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:snap-nodes='true' bordercolor='#666666' objecttolerance='10' id='namedview88' showgrid='false' inkscape:window-maximized='0' inkscape:window-x='54' inkscape:snap-global='true' inkscape:window-y='26' gridtolerance='10' inkscape:window-height='690' inkscape:snap-to-guides='true' inkscape:current-layer='layer9' inkscape:zoom='1' inkscape:cx='232.18282' inkscape:snap-grids='true' inkscape:pageopacity='1'>
+ <inkscape:grid spacingx='1px' spacingy='1px' id='grid4866' empspacing='2' enabled='true' type='xygrid' snapvisiblegridlinesonly='true' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:label='status' transform='translate(-40.99995,-277)' inkscape:groupmode='layer' id='layer9' style='display:inline'>
+
+ <path inkscape:connector-curvature='0' d='m 50.875,286 a 1.0001,1.0001 0 0 0 -0.59375,0.28125 l -2,2 -0.6875,0.71875 0.6875,0.71875 2,2 a 1.016466,1.016466 0 1 0 1.4375,-1.4375 L 50.4375,289 51.71875,287.71875 A 1.0001,1.0001 0 0 0 50.875,286 z' id='path4516' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 45,280 c -1.644703,0 -3,1.3553 -3,3 l 0,4 c 0,1.6447 1.355297,3 3,3 l 1,0 0,-2 -1,0 c -0.571297,0 -1,-0.4287 -1,-1 l 0,-4 c 0,-0.5713 0.428703,-1 1,-1 l 8,0 c 0.571297,0 1,0.4287 1,1 l 0,4 c 0,0.5713 -0.428703,1 -1,1 l -4,0 0,2 4,0 c 1.644703,0 3,-1.3553 3,-3 l 0,-4 c 0,-1.6447 -1.355297,-3 -3,-3 l -8,0 z' id='path3991' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <rect x='51' y='286' id='rect4723' height='1' width='1' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ <rect x='51' y='291' id='rect4723-0' height='1' width='1' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ </g>
+ <g inkscape:label='devices' transform='translate(-40.99995,-277)' inkscape:groupmode='layer' id='layer10'/>
+ <g inkscape:label='apps' transform='translate(-40.99995,-277)' inkscape:groupmode='layer' id='layer11'/>
+ <g inkscape:label='actions' transform='translate(-40.99995,-277)' inkscape:groupmode='layer' id='layer12'/>
+ <g inkscape:label='places' transform='translate(-40.99995,-277)' inkscape:groupmode='layer' id='layer13'/>
+ <g inkscape:label='mimetypes' transform='translate(-40.99995,-277)' inkscape:groupmode='layer' id='layer14'/>
+ <g inkscape:label='emblems' transform='translate(-40.99995,-277)' inkscape:groupmode='layer' id='layer15' style='display:inline'/>
+ <g inkscape:label='categories' transform='translate(-40.99995,-277)' inkscape:groupmode='layer' id='g4953' style='display:inline'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/media-playlist-shuffle-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/media-playlist-shuffle-symbolic-ref.png
new file mode 100644
index 00000000..60e8a22d
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/media-playlist-shuffle-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/media-playlist-shuffle-symbolic-rtl-ref.png b/rsvg/tests/fixtures/reftests/adwaita/media-playlist-shuffle-symbolic-rtl-ref.png
new file mode 100644
index 00000000..87df7465
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/media-playlist-shuffle-symbolic-rtl-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/media-playlist-shuffle-symbolic-rtl.svg b/rsvg/tests/fixtures/reftests/adwaita/media-playlist-shuffle-symbolic-rtl.svg
new file mode 100644
index 00000000..2078d3d5
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/media-playlist-shuffle-symbolic-rtl.svg
@@ -0,0 +1,38 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='media-playlist-shuffle-rtl-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.4 r9939' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='287.82372' inkscape:cy='-199.06477' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1374' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='80.000248px' originy='60.000001px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-160.99995,-277)'>
+
+ <path inkscape:connector-curvature='0' d='m 173,280 c -1.6447,0 -3,1.3553 -3,3 l 0,4 c 0,0.5713 -0.4287,1 -1,1 l -6,0 0,2 6,0 c 1.6447,0 3,-1.3553 3,-3 l 0,-4 c 0,-0.5713 0.4287,-1 1,-1 l 3,0 0,-2 -3,0 z' id='path5375' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 164.875,286 a 1.0001,1.0001 0 0 0 -0.59375,0.28125 l -2,2 -0.6875,0.71875 0.6875,0.71875 2,2 a 1.016466,1.016466 0 1 0 1.4375,-1.4375 L 164.4375,289 l 1.28125,-1.28125 A 1.0001,1.0001 0 0 0 164.875,286 z' id='path5377' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 164.875,278 a 1.0001,1.0001 0 0 0 -0.59375,0.28125 l -2,2 -0.6875,0.71875 0.6875,0.71875 2,2 a 1.016466,1.016466 0 1 0 1.4375,-1.4375 L 164.4375,281 l 1.28125,-1.28125 A 1.0001,1.0001 0 0 0 164.875,278 z' id='path5379' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 168.99995,280 c 0.22957,0 0.44085,0.0438 0.65625,0.0937 -0.4813,0.5511 -0.86125,1.17761 -1.03125,1.90625 l -5.625,0 0,-2 6,0 z m 7,8 0,2 -3,0 c -0.22957,0 -0.44085,-0.0438 -0.65625,-0.0937 0.4813,-0.55115 0.86125,-1.17766 1.03125,-1.9063 l 2.625,0 z' id='path5381' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0pt;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;font-family:Andale Mono'/>
+ <rect height='1' id='rect5383' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' transform='scale(-1,1)' width='1' x='-165.99989' y='286'/>
+ <rect height='1' id='rect5385' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' transform='scale(-1,1)' width='1' x='-165.99989' y='291'/>
+ <rect height='1' id='rect5387' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' transform='scale(-1,1)' width='1' x='-165.99989' y='278'/>
+ <rect height='1' id='rect5389' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' transform='scale(-1,1)' width='1' x='-165.99989' y='283'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-160.99995,-277)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-160.99995,-277)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-160.99995,-277)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-160.99995,-277)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-160.99995,-277)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-160.99995,-277)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-160.99995,-277)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-160.99995,-277)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/media-playlist-shuffle-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/media-playlist-shuffle-symbolic.svg
new file mode 100644
index 00000000..69f3e838
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/media-playlist-shuffle-symbolic.svg
@@ -0,0 +1,38 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' sodipodi:docname='media-playlist-shuffle-symbolic.svg' width='16' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:cc='http://creativecommons.org/ns#' height='16' xmlns='http://www.w3.org/2000/svg' inkscape:version='0.48.1 r9760' version='1.1' xmlns:svg='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:current-layer='layer9' pagecolor='#555753' guidetolerance='10' inkscape:object-paths='false' showborder='false' inkscape:zoom='11.313708' inkscape:snap-global='true' inkscape:window-width='1226' inkscape:pageshadow='2' borderopacity='1' objecttolerance='10' inkscape:window-height='967' inkscape:snap-bbox-midpoints='false' inkscape:snap-to-guides='true' id='namedview88' showguides='true' inkscape:pageopacity='1' inkscape:snap-bbox='true' inkscape:snap-others='false' bordercolor='#666666' inkscape:window-maximized='0' inkscape:cx='-11.080382' inkscape:cy='-11.109093' inkscape:snap-nodes='true' inkscape:object-nodes='false' inkscape:window-x='2259' inkscape:window-y='356' gridtolerance='10' showgrid='false' inkscape:bbox-paths='false' inkscape:snap-grids='true' inkscape:guide-bbox='true'>
+ <inkscape:grid spacingx='1px' spacingy='1px' visible='true' id='grid4866' enabled='true' type='xygrid' empspacing='2' snapvisiblegridlinesonly='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g style='display:inline' transform='translate(-60.999948,-277)' id='layer9' inkscape:label='status' inkscape:groupmode='layer'>
+
+ <path style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans' inkscape:connector-curvature='0' id='path4544' d='m 62,280 0,2 3,0 c 0.571297,0 1,0.4287 1,1 l 0,4 c 0,1.6447 1.355297,3 3,3 l 6,0 0,-2 -6,0 c -0.571297,0 -1,-0.4287 -1,-1 l 0,-4 c 0,-1.6447 -1.355297,-3 -3,-3 l -3,0 z'/>
+ <path style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans' inkscape:connector-curvature='0' id='rect3217-6-2' d='m 72.78125,286 a 1.0001,1.0001 0 0 0 -0.5,1.71875 L 73.5625,289 l -1.28125,1.28125 a 1.016466,1.016466 0 1 0 1.4375,1.4375 l 2,-2 0.6875,-0.71875 -0.6875,-0.71875 -2,-2 A 1.0001,1.0001 0 0 0 72.78125,286 z'/>
+ <path style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans' inkscape:connector-curvature='0' id='rect3217-6-2-2' d='m 72.78125,278 a 1.0001,1.0001 0 0 0 -0.5,1.71875 L 73.5625,281 l -1.28125,1.28125 a 1.016466,1.016466 0 1 0 1.4375,1.4375 l 2,-2 0.6875,-0.71875 -0.6875,-0.71875 -2,-2 A 1.0001,1.0001 0 0 0 72.78125,278 z'/>
+ <path style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0pt;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;font-family:Andale Mono' inkscape:connector-curvature='0' id='path4544-1' d='m 68.99995,280 c -0.229573,0 -0.440853,0.0438 -0.65625,0.0937 0.481303,0.5511 0.861254,1.17761 1.03125,1.90625 l 5.625,0 0,-2 -6,0 z m -7,8 0,2 3,0 c 0.229573,0 0.440853,-0.0438 0.65625,-0.0937 -0.481303,-0.55115 -0.861254,-1.17766 -1.03125,-1.9063 l -2.625,0 z'/>
+ <rect style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' width='1' id='rect4723-9' height='1' y='286' x='72'/>
+ <rect style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' width='1' id='rect4723-0-7' height='1' y='291' x='72'/>
+ <rect style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' width='1' id='rect4723-9-6' height='1' y='278' x='72'/>
+ <rect style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' width='1' id='rect4723-0-7-8' height='1' y='283' x='72'/>
+ </g>
+ <g transform='translate(-60.999948,-277)' id='layer10' inkscape:label='devices' inkscape:groupmode='layer'/>
+ <g transform='translate(-60.999948,-277)' id='layer11' inkscape:label='apps' inkscape:groupmode='layer'/>
+ <g transform='translate(-60.999948,-277)' id='layer13' inkscape:label='places' inkscape:groupmode='layer'/>
+ <g transform='translate(-60.999948,-277)' id='layer14' inkscape:label='mimetypes' inkscape:groupmode='layer'/>
+ <g style='display:inline' transform='translate(-60.999948,-277)' id='layer15' inkscape:label='emblems' inkscape:groupmode='layer'/>
+ <g transform='translate(-60.999948,-277)' style='display:inline' id='g71291' inkscape:label='emotes' inkscape:groupmode='layer'/>
+ <g style='display:inline' transform='translate(-60.999948,-277)' id='g4953' inkscape:label='categories' inkscape:groupmode='layer'/>
+ <g transform='translate(-60.999948,-277)' style='display:inline' id='layer12' inkscape:label='actions' inkscape:groupmode='layer'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/media-record-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/media-record-symbolic-ref.png
new file mode 100644
index 00000000..bcb915e9
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/media-record-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/media-record-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/media-record-symbolic.svg
new file mode 100644
index 00000000..f1a5f8db
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/media-record-symbolic.svg
@@ -0,0 +1,26 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:svg='http://www.w3.org/2000/svg' id='svg7384' version='1.1' height='16' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs id='defs7386'/>
+ <g transform='translate(-199.99995,-496)' id='layer9' style='display:inline'/>
+ <g transform='translate(-199.99995,-496)' id='layer10'/>
+ <g transform='translate(-199.99995,-496)' id='layer11'/>
+ <g transform='translate(-199.99995,-496)' id='layer12'>
+
+ <path inkscape:connector-curvature='0' d='m 207.99995,499.01754 c -2.74957,0 -4.98246,2.23288 -4.98246,4.98246 0,2.74957 2.23289,4.98246 4.98246,4.98246 2.74957,0 4.98246,-2.23289 4.98246,-4.98246 0,-2.74958 -2.23289,-4.98246 -4.98246,-4.98246 z' id='path4646-0' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0pt;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.78125;marker:none;visibility:visible;display:inline;overflow:visible;font-family:Andale Mono'/>
+ </g>
+ <g transform='translate(-199.99995,-496)' id='layer13'/>
+ <g transform='translate(-199.99995,-496)' id='layer14'/>
+ <g transform='translate(-199.99995,-496)' id='layer15'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/media-removable-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/media-removable-symbolic-ref.png
new file mode 100644
index 00000000..c0814752
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/media-removable-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/media-removable-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/media-removable-symbolic.svg
new file mode 100644
index 00000000..6385d908
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/media-removable-symbolic.svg
@@ -0,0 +1,34 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='media-removable-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.2 r9819' version='1.1' width='16.000002' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-paths='false' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer10' inkscape:cx='-47.49829' inkscape:cy='8.96987' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#555753' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1381' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='1600' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-121.0002,-467)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-121.0002,-467)'>
+ <g id='g9439' inkscape:label='musicplayer' transform='translate(60.000002,0)'>
+
+ </g>
+ <path inkscape:connector-curvature='0' d='m 133.0002,473 0,5.06173 c 0,2.7358 -1.784,4.93827 -4,4.93827 -2.216,0 -4,-2.20247 -4,-4.93827 l 0,-5.06173 z' id='rect9463' sodipodi:nodetypes='cssscc' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+ <path inkscape:connector-curvature='0' d='m 126.00022,468 0,4 5.99998,0 0,-4 -5.99998,0 z m 0.99998,1 1.00002,0 0,1 -1.00002,0 0,-1 z m 3,0 1.00002,0 0,1 -1.00002,0 0,-1 z' id='rect9466' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-121.0002,-467)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-121.0002,-467)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-121.0002,-467)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-121.0002,-467)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-121.0002,-467)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-121.0002,-467)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-121.0002,-467)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/media-seek-backward-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/media-seek-backward-symbolic-ref.png
new file mode 100644
index 00000000..7c64312c
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/media-seek-backward-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/media-seek-backward-symbolic-rtl-ref.png b/rsvg/tests/fixtures/reftests/adwaita/media-seek-backward-symbolic-rtl-ref.png
new file mode 100644
index 00000000..c3cab175
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/media-seek-backward-symbolic-rtl-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/media-seek-backward-symbolic-rtl.svg b/rsvg/tests/fixtures/reftests/adwaita/media-seek-backward-symbolic-rtl.svg
new file mode 100644
index 00000000..4196f177
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/media-seek-backward-symbolic-rtl.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:svg='http://www.w3.org/2000/svg' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' sodipodi:docname='media-seek-forward-symbolic.svg' version='1.1' inkscape:version='0.48pre1 r9509' height='16' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:cy='122.27773' pagecolor='#555753' borderopacity='1' showborder='false' inkscape:bbox-paths='false' guidetolerance='10' inkscape:window-width='1310' showguides='true' inkscape:object-nodes='true' inkscape:snap-bbox='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:snap-nodes='true' bordercolor='#666666' objecttolerance='10' id='namedview88' showgrid='false' inkscape:window-maximized='0' inkscape:window-x='54' inkscape:snap-global='true' inkscape:window-y='24' gridtolerance='10' inkscape:window-height='690' inkscape:snap-to-guides='true' inkscape:current-layer='layer12' inkscape:zoom='1' inkscape:cx='59.2263' inkscape:snap-grids='true' inkscape:pageopacity='1'>
+ <inkscape:grid spacingx='1px' spacingy='1px' id='grid4866' empspacing='2' enabled='true' type='xygrid' snapvisiblegridlinesonly='true' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:label='status' transform='translate(-100.12495,-606)' inkscape:groupmode='layer' id='layer9' style='display:inline'/>
+ <g inkscape:label='devices' transform='translate(-100.12495,-606)' inkscape:groupmode='layer' id='layer10'/>
+ <g inkscape:label='apps' transform='translate(-100.12495,-606)' inkscape:groupmode='layer' id='layer11'/>
+ <g inkscape:label='actions' transform='translate(-100.12495,-606)' inkscape:groupmode='layer' id='layer12'>
+
+ <g transform='matrix(-1,0,0,1,136.06255,119)' id='g3940-7' style='display:inline'>
+ <path inkscape:connector-curvature='0' d='m 34.00005,491 c -0.177384,0.008 -0.351174,0.0592 -0.5,0.15625 l -5,3 c -0.282396,0.17971 -0.4375,0.51173 -0.4375,0.84375 0,0.33202 0.155104,0.66404 0.4375,0.84375 l 5,3 c 0.148826,0.097 0.322616,0.14825 0.5,0.15625 l 0.15625,0 0.84375,0 0,-8 -0.84375,0 z' id='path3807-1-1-4-7-2-1' sodipodi:nodetypes='cccscccccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/>
+ <path inkscape:connector-curvature='0' d='m 27.00005,491 c -0.177384,0.008 -0.351174,0.0592 -0.5,0.15625 l -5,3 c -0.282396,0.17971 -0.4375,0.51173 -0.4375,0.84375 0,0.33202 0.155104,0.66404 0.4375,0.84375 l 5,3 c 0.148826,0.097 0.322616,0.14825 0.5,0.15625 l 0.15625,0 0.84375,0 0,-8 -0.84375,0 z' id='path3807-1-1-4-7-2-0-1' sodipodi:nodetypes='cccscccccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/>
+ </g>
+ </g>
+ <g inkscape:label='places' transform='translate(-100.12495,-606)' inkscape:groupmode='layer' id='layer13'/>
+ <g inkscape:label='mimetypes' transform='translate(-100.12495,-606)' inkscape:groupmode='layer' id='layer14'/>
+ <g inkscape:label='emblems' transform='translate(-100.12495,-606)' inkscape:groupmode='layer' id='layer15' style='display:inline'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/media-seek-backward-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/media-seek-backward-symbolic.svg
new file mode 100644
index 00000000..5c0aee1f
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/media-seek-backward-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:svg='http://www.w3.org/2000/svg' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' sodipodi:docname='media-seek-backward-symbolic.svg' version='1.1' inkscape:version='0.48pre1 r9509' height='16' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:cy='122.27773' pagecolor='#555753' borderopacity='1' showborder='false' inkscape:bbox-paths='false' guidetolerance='10' inkscape:window-width='1310' showguides='true' inkscape:object-nodes='true' inkscape:snap-bbox='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:snap-nodes='true' bordercolor='#666666' objecttolerance='10' id='namedview88' showgrid='false' inkscape:window-maximized='0' inkscape:window-x='54' inkscape:snap-global='true' inkscape:window-y='24' gridtolerance='10' inkscape:window-height='690' inkscape:snap-to-guides='true' inkscape:current-layer='layer12' inkscape:zoom='1' inkscape:cx='99.351048' inkscape:snap-grids='true' inkscape:pageopacity='1'>
+ <inkscape:grid spacingx='1px' spacingy='1px' id='grid4866' empspacing='2' enabled='true' type='xygrid' snapvisiblegridlinesonly='true' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:label='status' transform='translate(-60.000202,-606)' inkscape:groupmode='layer' id='layer9' style='display:inline'/>
+ <g inkscape:label='devices' transform='translate(-60.000202,-606)' inkscape:groupmode='layer' id='layer10'/>
+ <g inkscape:label='apps' transform='translate(-60.000202,-606)' inkscape:groupmode='layer' id='layer11'/>
+ <g inkscape:label='actions' transform='translate(-60.000202,-606)' inkscape:groupmode='layer' id='layer12'>
+
+ <g transform='translate(39.99995,119)' id='g3940' style='display:inline'>
+ <path inkscape:connector-curvature='0' d='m 34.00005,491 c -0.177384,0.008 -0.351174,0.0592 -0.5,0.15625 l -5,3 c -0.282396,0.17971 -0.4375,0.51173 -0.4375,0.84375 0,0.33202 0.155104,0.66404 0.4375,0.84375 l 5,3 c 0.148826,0.097 0.322616,0.14825 0.5,0.15625 l 0.15625,0 0.84375,0 0,-8 -0.84375,0 z' id='path3807-1-1-4-7-2' sodipodi:nodetypes='cccscccccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/>
+ <path inkscape:connector-curvature='0' d='m 27.00005,491 c -0.177384,0.008 -0.351174,0.0592 -0.5,0.15625 l -5,3 c -0.282396,0.17971 -0.4375,0.51173 -0.4375,0.84375 0,0.33202 0.155104,0.66404 0.4375,0.84375 l 5,3 c 0.148826,0.097 0.322616,0.14825 0.5,0.15625 l 0.15625,0 0.84375,0 0,-8 -0.84375,0 z' id='path3807-1-1-4-7-2-0' sodipodi:nodetypes='cccscccccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/>
+ </g>
+ </g>
+ <g inkscape:label='places' transform='translate(-60.000202,-606)' inkscape:groupmode='layer' id='layer13'/>
+ <g inkscape:label='mimetypes' transform='translate(-60.000202,-606)' inkscape:groupmode='layer' id='layer14'/>
+ <g inkscape:label='emblems' transform='translate(-60.000202,-606)' inkscape:groupmode='layer' id='layer15' style='display:inline'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/media-seek-forward-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/media-seek-forward-symbolic-ref.png
new file mode 100644
index 00000000..c3cab175
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/media-seek-forward-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/media-seek-forward-symbolic-rtl-ref.png b/rsvg/tests/fixtures/reftests/adwaita/media-seek-forward-symbolic-rtl-ref.png
new file mode 100644
index 00000000..7c64312c
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/media-seek-forward-symbolic-rtl-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/media-seek-forward-symbolic-rtl.svg b/rsvg/tests/fixtures/reftests/adwaita/media-seek-forward-symbolic-rtl.svg
new file mode 100644
index 00000000..5c0aee1f
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/media-seek-forward-symbolic-rtl.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:svg='http://www.w3.org/2000/svg' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' sodipodi:docname='media-seek-backward-symbolic.svg' version='1.1' inkscape:version='0.48pre1 r9509' height='16' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:cy='122.27773' pagecolor='#555753' borderopacity='1' showborder='false' inkscape:bbox-paths='false' guidetolerance='10' inkscape:window-width='1310' showguides='true' inkscape:object-nodes='true' inkscape:snap-bbox='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:snap-nodes='true' bordercolor='#666666' objecttolerance='10' id='namedview88' showgrid='false' inkscape:window-maximized='0' inkscape:window-x='54' inkscape:snap-global='true' inkscape:window-y='24' gridtolerance='10' inkscape:window-height='690' inkscape:snap-to-guides='true' inkscape:current-layer='layer12' inkscape:zoom='1' inkscape:cx='99.351048' inkscape:snap-grids='true' inkscape:pageopacity='1'>
+ <inkscape:grid spacingx='1px' spacingy='1px' id='grid4866' empspacing='2' enabled='true' type='xygrid' snapvisiblegridlinesonly='true' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:label='status' transform='translate(-60.000202,-606)' inkscape:groupmode='layer' id='layer9' style='display:inline'/>
+ <g inkscape:label='devices' transform='translate(-60.000202,-606)' inkscape:groupmode='layer' id='layer10'/>
+ <g inkscape:label='apps' transform='translate(-60.000202,-606)' inkscape:groupmode='layer' id='layer11'/>
+ <g inkscape:label='actions' transform='translate(-60.000202,-606)' inkscape:groupmode='layer' id='layer12'>
+
+ <g transform='translate(39.99995,119)' id='g3940' style='display:inline'>
+ <path inkscape:connector-curvature='0' d='m 34.00005,491 c -0.177384,0.008 -0.351174,0.0592 -0.5,0.15625 l -5,3 c -0.282396,0.17971 -0.4375,0.51173 -0.4375,0.84375 0,0.33202 0.155104,0.66404 0.4375,0.84375 l 5,3 c 0.148826,0.097 0.322616,0.14825 0.5,0.15625 l 0.15625,0 0.84375,0 0,-8 -0.84375,0 z' id='path3807-1-1-4-7-2' sodipodi:nodetypes='cccscccccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/>
+ <path inkscape:connector-curvature='0' d='m 27.00005,491 c -0.177384,0.008 -0.351174,0.0592 -0.5,0.15625 l -5,3 c -0.282396,0.17971 -0.4375,0.51173 -0.4375,0.84375 0,0.33202 0.155104,0.66404 0.4375,0.84375 l 5,3 c 0.148826,0.097 0.322616,0.14825 0.5,0.15625 l 0.15625,0 0.84375,0 0,-8 -0.84375,0 z' id='path3807-1-1-4-7-2-0' sodipodi:nodetypes='cccscccccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/>
+ </g>
+ </g>
+ <g inkscape:label='places' transform='translate(-60.000202,-606)' inkscape:groupmode='layer' id='layer13'/>
+ <g inkscape:label='mimetypes' transform='translate(-60.000202,-606)' inkscape:groupmode='layer' id='layer14'/>
+ <g inkscape:label='emblems' transform='translate(-60.000202,-606)' inkscape:groupmode='layer' id='layer15' style='display:inline'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/media-seek-forward-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/media-seek-forward-symbolic.svg
new file mode 100644
index 00000000..4196f177
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/media-seek-forward-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:svg='http://www.w3.org/2000/svg' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' sodipodi:docname='media-seek-forward-symbolic.svg' version='1.1' inkscape:version='0.48pre1 r9509' height='16' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:cy='122.27773' pagecolor='#555753' borderopacity='1' showborder='false' inkscape:bbox-paths='false' guidetolerance='10' inkscape:window-width='1310' showguides='true' inkscape:object-nodes='true' inkscape:snap-bbox='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:snap-nodes='true' bordercolor='#666666' objecttolerance='10' id='namedview88' showgrid='false' inkscape:window-maximized='0' inkscape:window-x='54' inkscape:snap-global='true' inkscape:window-y='24' gridtolerance='10' inkscape:window-height='690' inkscape:snap-to-guides='true' inkscape:current-layer='layer12' inkscape:zoom='1' inkscape:cx='59.2263' inkscape:snap-grids='true' inkscape:pageopacity='1'>
+ <inkscape:grid spacingx='1px' spacingy='1px' id='grid4866' empspacing='2' enabled='true' type='xygrid' snapvisiblegridlinesonly='true' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:label='status' transform='translate(-100.12495,-606)' inkscape:groupmode='layer' id='layer9' style='display:inline'/>
+ <g inkscape:label='devices' transform='translate(-100.12495,-606)' inkscape:groupmode='layer' id='layer10'/>
+ <g inkscape:label='apps' transform='translate(-100.12495,-606)' inkscape:groupmode='layer' id='layer11'/>
+ <g inkscape:label='actions' transform='translate(-100.12495,-606)' inkscape:groupmode='layer' id='layer12'>
+
+ <g transform='matrix(-1,0,0,1,136.06255,119)' id='g3940-7' style='display:inline'>
+ <path inkscape:connector-curvature='0' d='m 34.00005,491 c -0.177384,0.008 -0.351174,0.0592 -0.5,0.15625 l -5,3 c -0.282396,0.17971 -0.4375,0.51173 -0.4375,0.84375 0,0.33202 0.155104,0.66404 0.4375,0.84375 l 5,3 c 0.148826,0.097 0.322616,0.14825 0.5,0.15625 l 0.15625,0 0.84375,0 0,-8 -0.84375,0 z' id='path3807-1-1-4-7-2-1' sodipodi:nodetypes='cccscccccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/>
+ <path inkscape:connector-curvature='0' d='m 27.00005,491 c -0.177384,0.008 -0.351174,0.0592 -0.5,0.15625 l -5,3 c -0.282396,0.17971 -0.4375,0.51173 -0.4375,0.84375 0,0.33202 0.155104,0.66404 0.4375,0.84375 l 5,3 c 0.148826,0.097 0.322616,0.14825 0.5,0.15625 l 0.15625,0 0.84375,0 0,-8 -0.84375,0 z' id='path3807-1-1-4-7-2-0-1' sodipodi:nodetypes='cccscccccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/>
+ </g>
+ </g>
+ <g inkscape:label='places' transform='translate(-100.12495,-606)' inkscape:groupmode='layer' id='layer13'/>
+ <g inkscape:label='mimetypes' transform='translate(-100.12495,-606)' inkscape:groupmode='layer' id='layer14'/>
+ <g inkscape:label='emblems' transform='translate(-100.12495,-606)' inkscape:groupmode='layer' id='layer15' style='display:inline'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/media-skip-backward-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/media-skip-backward-symbolic-ref.png
new file mode 100644
index 00000000..8ab98032
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/media-skip-backward-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/media-skip-backward-symbolic-rtl-ref.png b/rsvg/tests/fixtures/reftests/adwaita/media-skip-backward-symbolic-rtl-ref.png
new file mode 100644
index 00000000..e14e4557
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/media-skip-backward-symbolic-rtl-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/media-skip-backward-symbolic-rtl.svg b/rsvg/tests/fixtures/reftests/adwaita/media-skip-backward-symbolic-rtl.svg
new file mode 100644
index 00000000..2fb8d262
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/media-skip-backward-symbolic-rtl.svg
@@ -0,0 +1,33 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:svg='http://www.w3.org/2000/svg' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' sodipodi:docname='media-skip-forward-symbolic.svg' version='1.1' inkscape:version='0.48pre1 r9509' height='16' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:cy='122.27773' pagecolor='#555753' borderopacity='1' showborder='false' inkscape:bbox-paths='false' guidetolerance='10' inkscape:window-width='1310' showguides='true' inkscape:object-nodes='true' inkscape:snap-bbox='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:snap-nodes='true' bordercolor='#666666' objecttolerance='10' id='namedview88' showgrid='false' inkscape:window-maximized='0' inkscape:window-x='54' inkscape:snap-global='true' inkscape:window-y='24' gridtolerance='10' inkscape:window-height='690' inkscape:snap-to-guides='true' inkscape:current-layer='layer12' inkscape:zoom='1' inkscape:cx='39.3513' inkscape:snap-grids='true' inkscape:pageopacity='1'>
+ <inkscape:grid spacingx='1px' spacingy='1px' id='grid4866' empspacing='2' enabled='true' type='xygrid' snapvisiblegridlinesonly='true' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:label='status' transform='translate(-119.99995,-606)' inkscape:groupmode='layer' id='layer9' style='display:inline'/>
+ <g inkscape:label='devices' transform='translate(-119.99995,-606)' inkscape:groupmode='layer' id='layer10'/>
+ <g inkscape:label='apps' transform='translate(-119.99995,-606)' inkscape:groupmode='layer' id='layer11'/>
+ <g inkscape:label='actions' transform='translate(-119.99995,-606)' inkscape:groupmode='layer' id='layer12'>
+
+ <g transform='translate(99.99975,119)' id='g4399-9-1' style='display:inline'>
+ <path transform='matrix(-1,0,0,1,76.00025,-119)' inkscape:connector-curvature='0' d='m 55,610 c -0.177384,0.008 -0.351174,0.0592 -0.5,0.15625 l -5,3 c -0.282396,0.17971 -0.4375,0.51173 -0.4375,0.84375 0,0.33202 0.155104,0.66404 0.4375,0.84375 l 5,3 c 0.148826,0.097 0.322616,0.14825 0.5,0.15625 l 0.15625,0 0.84375,0 0,-8 -0.84375,0 z' id='path3807-1-1-4-90' sodipodi:nodetypes='cccscccccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/>
+ <path inkscape:connector-curvature='0' d='m 34,491 0,8 2,0 0,-8 z' id='path3807-1-1-9-3-0-98' sodipodi:nodetypes='ccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 28.00025,491 c 0.177384,0.008 0.351174,0.0592 0.5,0.15625 l 5,3 c 0.282396,0.17971 0.4375,0.51173 0.4375,0.84375 0,0.33202 -0.155104,0.66404 -0.4375,0.84375 l -5,3 c -0.148826,0.097 -0.322616,0.14825 -0.5,0.15625 l -0.15625,0 -0.84375,0 0,-8 0.84375,0 z' id='path3807-1-1-4-7-8' sodipodi:nodetypes='cccscccccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/>
+ </g>
+ </g>
+ <g inkscape:label='places' transform='translate(-119.99995,-606)' inkscape:groupmode='layer' id='layer13'/>
+ <g inkscape:label='mimetypes' transform='translate(-119.99995,-606)' inkscape:groupmode='layer' id='layer14'/>
+ <g inkscape:label='emblems' transform='translate(-119.99995,-606)' inkscape:groupmode='layer' id='layer15' style='display:inline'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/media-skip-backward-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/media-skip-backward-symbolic.svg
new file mode 100644
index 00000000..a7e2f362
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/media-skip-backward-symbolic.svg
@@ -0,0 +1,33 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:svg='http://www.w3.org/2000/svg' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' sodipodi:docname='media-skip-backward-symbolic.svg' version='1.1' inkscape:version='0.48pre1 r9509' height='16' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:cy='122.27773' pagecolor='#555753' borderopacity='1' showborder='false' inkscape:bbox-paths='false' guidetolerance='10' inkscape:window-width='1310' showguides='true' inkscape:object-nodes='true' inkscape:snap-bbox='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:snap-nodes='true' bordercolor='#666666' objecttolerance='10' id='namedview88' showgrid='false' inkscape:window-maximized='0' inkscape:window-x='54' inkscape:snap-global='true' inkscape:window-y='24' gridtolerance='10' inkscape:window-height='690' inkscape:snap-to-guides='true' inkscape:current-layer='layer12' inkscape:zoom='1' inkscape:cx='119.35105' inkscape:snap-grids='true' inkscape:pageopacity='1'>
+ <inkscape:grid spacingx='1px' spacingy='1px' id='grid4866' empspacing='2' enabled='true' type='xygrid' snapvisiblegridlinesonly='true' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:label='status' transform='translate(-40.000202,-606)' inkscape:groupmode='layer' id='layer9' style='display:inline'/>
+ <g inkscape:label='devices' transform='translate(-40.000202,-606)' inkscape:groupmode='layer' id='layer10'/>
+ <g inkscape:label='apps' transform='translate(-40.000202,-606)' inkscape:groupmode='layer' id='layer11'/>
+ <g inkscape:label='actions' transform='translate(-40.000202,-606)' inkscape:groupmode='layer' id='layer12'>
+
+ <g transform='matrix(-1,0,0,1,76.00025,119)' id='g4399-9'>
+ <path transform='matrix(-1,0,0,1,76.00025,-119)' inkscape:connector-curvature='0' d='m 55,610 c -0.177384,0.008 -0.351174,0.0592 -0.5,0.15625 l -5,3 c -0.282396,0.17971 -0.4375,0.51173 -0.4375,0.84375 0,0.33202 0.155104,0.66404 0.4375,0.84375 l 5,3 c 0.148826,0.097 0.322616,0.14825 0.5,0.15625 l 0.15625,0 0.84375,0 0,-8 -0.84375,0 z' id='path3807-1-1-4' sodipodi:nodetypes='cccscccccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/>
+ <path inkscape:connector-curvature='0' d='m 34,491 0,8 2,0 0,-8 z' id='path3807-1-1-9-3-0' sodipodi:nodetypes='ccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 28.00025,491 c 0.177384,0.008 0.351174,0.0592 0.5,0.15625 l 5,3 c 0.282396,0.17971 0.4375,0.51173 0.4375,0.84375 0,0.33202 -0.155104,0.66404 -0.4375,0.84375 l -5,3 c -0.148826,0.097 -0.322616,0.14825 -0.5,0.15625 l -0.15625,0 -0.84375,0 0,-8 0.84375,0 z' id='path3807-1-1-4-7' sodipodi:nodetypes='cccscccccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/>
+ </g>
+ </g>
+ <g inkscape:label='places' transform='translate(-40.000202,-606)' inkscape:groupmode='layer' id='layer13'/>
+ <g inkscape:label='mimetypes' transform='translate(-40.000202,-606)' inkscape:groupmode='layer' id='layer14'/>
+ <g inkscape:label='emblems' transform='translate(-40.000202,-606)' inkscape:groupmode='layer' id='layer15' style='display:inline'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/media-skip-forward-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/media-skip-forward-symbolic-ref.png
new file mode 100644
index 00000000..e14e4557
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/media-skip-forward-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/media-skip-forward-symbolic-rtl-ref.png b/rsvg/tests/fixtures/reftests/adwaita/media-skip-forward-symbolic-rtl-ref.png
new file mode 100644
index 00000000..8ab98032
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/media-skip-forward-symbolic-rtl-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/media-skip-forward-symbolic-rtl.svg b/rsvg/tests/fixtures/reftests/adwaita/media-skip-forward-symbolic-rtl.svg
new file mode 100644
index 00000000..a7e2f362
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/media-skip-forward-symbolic-rtl.svg
@@ -0,0 +1,33 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:svg='http://www.w3.org/2000/svg' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' sodipodi:docname='media-skip-backward-symbolic.svg' version='1.1' inkscape:version='0.48pre1 r9509' height='16' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:cy='122.27773' pagecolor='#555753' borderopacity='1' showborder='false' inkscape:bbox-paths='false' guidetolerance='10' inkscape:window-width='1310' showguides='true' inkscape:object-nodes='true' inkscape:snap-bbox='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:snap-nodes='true' bordercolor='#666666' objecttolerance='10' id='namedview88' showgrid='false' inkscape:window-maximized='0' inkscape:window-x='54' inkscape:snap-global='true' inkscape:window-y='24' gridtolerance='10' inkscape:window-height='690' inkscape:snap-to-guides='true' inkscape:current-layer='layer12' inkscape:zoom='1' inkscape:cx='119.35105' inkscape:snap-grids='true' inkscape:pageopacity='1'>
+ <inkscape:grid spacingx='1px' spacingy='1px' id='grid4866' empspacing='2' enabled='true' type='xygrid' snapvisiblegridlinesonly='true' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:label='status' transform='translate(-40.000202,-606)' inkscape:groupmode='layer' id='layer9' style='display:inline'/>
+ <g inkscape:label='devices' transform='translate(-40.000202,-606)' inkscape:groupmode='layer' id='layer10'/>
+ <g inkscape:label='apps' transform='translate(-40.000202,-606)' inkscape:groupmode='layer' id='layer11'/>
+ <g inkscape:label='actions' transform='translate(-40.000202,-606)' inkscape:groupmode='layer' id='layer12'>
+
+ <g transform='matrix(-1,0,0,1,76.00025,119)' id='g4399-9'>
+ <path transform='matrix(-1,0,0,1,76.00025,-119)' inkscape:connector-curvature='0' d='m 55,610 c -0.177384,0.008 -0.351174,0.0592 -0.5,0.15625 l -5,3 c -0.282396,0.17971 -0.4375,0.51173 -0.4375,0.84375 0,0.33202 0.155104,0.66404 0.4375,0.84375 l 5,3 c 0.148826,0.097 0.322616,0.14825 0.5,0.15625 l 0.15625,0 0.84375,0 0,-8 -0.84375,0 z' id='path3807-1-1-4' sodipodi:nodetypes='cccscccccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/>
+ <path inkscape:connector-curvature='0' d='m 34,491 0,8 2,0 0,-8 z' id='path3807-1-1-9-3-0' sodipodi:nodetypes='ccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 28.00025,491 c 0.177384,0.008 0.351174,0.0592 0.5,0.15625 l 5,3 c 0.282396,0.17971 0.4375,0.51173 0.4375,0.84375 0,0.33202 -0.155104,0.66404 -0.4375,0.84375 l -5,3 c -0.148826,0.097 -0.322616,0.14825 -0.5,0.15625 l -0.15625,0 -0.84375,0 0,-8 0.84375,0 z' id='path3807-1-1-4-7' sodipodi:nodetypes='cccscccccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/>
+ </g>
+ </g>
+ <g inkscape:label='places' transform='translate(-40.000202,-606)' inkscape:groupmode='layer' id='layer13'/>
+ <g inkscape:label='mimetypes' transform='translate(-40.000202,-606)' inkscape:groupmode='layer' id='layer14'/>
+ <g inkscape:label='emblems' transform='translate(-40.000202,-606)' inkscape:groupmode='layer' id='layer15' style='display:inline'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/media-skip-forward-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/media-skip-forward-symbolic.svg
new file mode 100644
index 00000000..2fb8d262
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/media-skip-forward-symbolic.svg
@@ -0,0 +1,33 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:svg='http://www.w3.org/2000/svg' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' sodipodi:docname='media-skip-forward-symbolic.svg' version='1.1' inkscape:version='0.48pre1 r9509' height='16' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:cy='122.27773' pagecolor='#555753' borderopacity='1' showborder='false' inkscape:bbox-paths='false' guidetolerance='10' inkscape:window-width='1310' showguides='true' inkscape:object-nodes='true' inkscape:snap-bbox='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:snap-nodes='true' bordercolor='#666666' objecttolerance='10' id='namedview88' showgrid='false' inkscape:window-maximized='0' inkscape:window-x='54' inkscape:snap-global='true' inkscape:window-y='24' gridtolerance='10' inkscape:window-height='690' inkscape:snap-to-guides='true' inkscape:current-layer='layer12' inkscape:zoom='1' inkscape:cx='39.3513' inkscape:snap-grids='true' inkscape:pageopacity='1'>
+ <inkscape:grid spacingx='1px' spacingy='1px' id='grid4866' empspacing='2' enabled='true' type='xygrid' snapvisiblegridlinesonly='true' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:label='status' transform='translate(-119.99995,-606)' inkscape:groupmode='layer' id='layer9' style='display:inline'/>
+ <g inkscape:label='devices' transform='translate(-119.99995,-606)' inkscape:groupmode='layer' id='layer10'/>
+ <g inkscape:label='apps' transform='translate(-119.99995,-606)' inkscape:groupmode='layer' id='layer11'/>
+ <g inkscape:label='actions' transform='translate(-119.99995,-606)' inkscape:groupmode='layer' id='layer12'>
+
+ <g transform='translate(99.99975,119)' id='g4399-9-1' style='display:inline'>
+ <path transform='matrix(-1,0,0,1,76.00025,-119)' inkscape:connector-curvature='0' d='m 55,610 c -0.177384,0.008 -0.351174,0.0592 -0.5,0.15625 l -5,3 c -0.282396,0.17971 -0.4375,0.51173 -0.4375,0.84375 0,0.33202 0.155104,0.66404 0.4375,0.84375 l 5,3 c 0.148826,0.097 0.322616,0.14825 0.5,0.15625 l 0.15625,0 0.84375,0 0,-8 -0.84375,0 z' id='path3807-1-1-4-90' sodipodi:nodetypes='cccscccccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/>
+ <path inkscape:connector-curvature='0' d='m 34,491 0,8 2,0 0,-8 z' id='path3807-1-1-9-3-0-98' sodipodi:nodetypes='ccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 28.00025,491 c 0.177384,0.008 0.351174,0.0592 0.5,0.15625 l 5,3 c 0.282396,0.17971 0.4375,0.51173 0.4375,0.84375 0,0.33202 -0.155104,0.66404 -0.4375,0.84375 l -5,3 c -0.148826,0.097 -0.322616,0.14825 -0.5,0.15625 l -0.15625,0 -0.84375,0 0,-8 0.84375,0 z' id='path3807-1-1-4-7-8' sodipodi:nodetypes='cccscccccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/>
+ </g>
+ </g>
+ <g inkscape:label='places' transform='translate(-119.99995,-606)' inkscape:groupmode='layer' id='layer13'/>
+ <g inkscape:label='mimetypes' transform='translate(-119.99995,-606)' inkscape:groupmode='layer' id='layer14'/>
+ <g inkscape:label='emblems' transform='translate(-119.99995,-606)' inkscape:groupmode='layer' id='layer15' style='display:inline'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/media-tape-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/media-tape-symbolic-ref.png
new file mode 100644
index 00000000..ce96746b
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/media-tape-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/media-tape-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/media-tape-symbolic.svg
new file mode 100644
index 00000000..a107c24b
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/media-tape-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='media-tape-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.5 r10040' width='16.0002' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer10' inkscape:cx='7.692985' inkscape:cy='4.8145' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1375' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='20.0002px' originy='350px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-221,-567)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-221,-567)'>
+ <path inkscape:connector-curvature='0' d='m 223.5002,570 c -1.385,0 -2.5,1.115 -2.5,2.5 l 0,6 c 0,1.385 1.115,2.5 2.5,2.5 l 11,0 c 1.385,0 2.5,-1.115 2.5,-2.5 l 0,-6 c 0,-1.385 -1.115,-2.5 -2.5,-2.5 l -11,0 z m 2,3 c 1.37479,0 2.5,1.12521 2.5,2.5 0,0.56453 -0.21241,1.08026 -0.53125,1.5 l 3.0625,0 c -0.31884,-0.41974 -0.53125,-0.93547 -0.53125,-1.5 0,-1.37479 1.12521,-2.5 2.5,-2.5 1.37479,0 2.5,1.12521 2.5,2.5 0,1.37479 -1.12521,2.5 -2.5,2.5 l -0.5,0 -6,0 -0.5,0 c -1.37479,0 -2.5,-1.12521 -2.5,-2.5 0,-1.37479 1.12521,-2.5 2.5,-2.5 z m 0,1 c -0.83435,0 -1.5,0.66565 -1.5,1.5 0,0.83435 0.66565,1.5 1.5,1.5 0.83435,0 1.5,-0.66565 1.5,-1.5 0,-0.83435 -0.66565,-1.5 -1.5,-1.5 z m 7,0 c -0.83435,0 -1.5,0.66565 -1.5,1.5 0,0.83435 0.66565,1.5 1.5,1.5 0.83435,0 1.5,-0.66565 1.5,-1.5 0,-0.83435 -0.66565,-1.5 -1.5,-1.5 z' id='path27183' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+
+ </g>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-221,-567)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-221,-567)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-221,-567)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-221,-567)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-221,-567)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-221,-567)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-221,-567)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/media-view-subtitles-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/media-view-subtitles-symbolic-ref.png
new file mode 100644
index 00000000..c9e80b9f
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/media-view-subtitles-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/media-view-subtitles-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/media-view-subtitles-symbolic.svg
new file mode 100644
index 00000000..132cb62e
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/media-view-subtitles-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='media-view-subtitles-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16.000002' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='-219.48283' inkscape:cy='29.51407' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1374' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-99.999998px' originy='510px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-341.0002,-727)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-341.0002,-727)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-341.0002,-727)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-341.0002,-727)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-341.0002,-727)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-341.0002,-727)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-341.0002,-727)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-341.0002,-727)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-341.0002,-727)'>
+ <path inkscape:connector-curvature='0' d='m 343.5002,730 c -1.385,0 -2.5,1.11499 -2.5,2.5 l 0,5 c 0,1.385 1.115,2.5 2.5,2.5 l 7.0625,0 c 1.38501,0 2.48022,-1.11514 2.5,-2.5 l 0,-2.375 3.9375,-3.125 -4,0 c -0.23235,-1.14125 -1.22562,-2 -2.4375,-2 z m -0.5,5 8,0 0,1 -8,0 z m 0,2 5,0 0,1 -5,0 z' id='path8268-0' sodipodi:nodetypes='sssssccccsscccccccccc' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/media-zip-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/media-zip-symbolic-ref.png
new file mode 100644
index 00000000..1249b3d4
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/media-zip-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/media-zip-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/media-zip-symbolic.svg
new file mode 100644
index 00000000..e4454557
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/media-zip-symbolic.svg
@@ -0,0 +1,33 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='media-zip-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.2 r9819' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-paths='false' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer10' inkscape:cx='167.52524' inkscape:cy='23.05352' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#555753' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='419' inkscape:window-maximized='0' inkscape:window-width='511' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(379,-467)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(379,-467)'>
+
+ <path inkscape:connector-curvature='0' d='m -375.8125,467 c -1.2016,0 -2.1875,0.98758 -2.1875,2.1875 l 0,11.625 c 0,1.19992 0.9859,2.1875 2.1875,2.1875 l 9.625,0 c 1.2016,0 2.1875,-0.98758 2.1875,-2.1875 l 0,-11.625 c 0,-1.19992 -0.9859,-2.1875 -2.1875,-2.1875 l -9.625,0 z m 0,2 9.625,0 c 0.1238,0 0.1875,0.0566 0.1875,0.1875 l 0,11.625 c 0,0.1309 -0.0637,0.1875 -0.1875,0.1875 l -9.625,0 c -0.1238,0 -0.1875,-0.0566 -0.1875,-0.1875 l 0,-11.625 c 0,-0.1309 0.0637,-0.1875 0.1875,-0.1875 z' id='rect5028' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.99999988;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m -371.15625,470 c -0.26556,0.0109 -0.54445,0.0586 -0.8125,0.125 -2.14441,0.53085 -3.4371,2.69934 -2.90625,4.84375 0.4498,1.81699 2.07532,3.0225 3.86571,3.02533 0.16806,2.7e-4 0.33757,-0.0101 0.5077,-0.0315 l -0.3888,-2.97965 c -0.0347,0.01 -0.0704,0.017 -0.10961,0.017 -0.55254,0 -1,-0.44746 -1,-1 0,-0.55254 0.44746,-1 1,-1 0.55254,0 1,0.44746 1,1 0,0.11765 -0.0285,0.22486 -0.0726,0.32494 l 2.70058,1.38685 c 0.38616,-0.83016 0.46978,-1.78065 0.24701,-2.68054 -0.46449,-1.87636 -2.1723,-3.10719 -4.03125,-3.03125 z' id='path5030' sodipodi:nodetypes='ccssccssssccssc' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='M -370.33905,475 -369,479 c 0.73426,2.05595 3,0.38433 1.4966,-1 z' id='path5032' sodipodi:nodetypes='cccc' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(379,-467)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(379,-467)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(379,-467)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(379,-467)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(379,-467)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(379,-467)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(379,-467)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/microphone-sensitivity-high-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/microphone-sensitivity-high-symbolic-ref.png
new file mode 100644
index 00000000..e13762bd
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/microphone-sensitivity-high-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/microphone-sensitivity-high-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/microphone-sensitivity-high-symbolic.svg
new file mode 100644
index 00000000..b5578ea3
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/microphone-sensitivity-high-symbolic.svg
@@ -0,0 +1,45 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='microphone-sensitivity-high-symbolic.svg' height='16.001951' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.4 r9939' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='91.284009' inkscape:cy='-441.90835' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='702' inkscape:window-maximized='1' inkscape:window-width='1366' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='60.0002px' originy='-19.998049px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ <inkscape:grid color='#000000' empcolor='#000000' empopacity='0' empspacing='4' enabled='true' id='grid5968' opacity='0.1254902' originx='60.0002px' originy='-19.998049px' snapvisiblegridlinesonly='true' spacingx='0.5px' spacingy='0.5px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <clipPath clipPathUnits='userSpaceOnUse' id='clipPath6810-7-87'>
+ <rect height='11' id='rect6812-2-4' style='color:#bebebe;fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible' width='14' x='21' y='281'/>
+ </clipPath>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-181,-197)'>
+
+ <rect height='10.012877' id='rect12327' rx='2.5' ry='2.5' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible' width='5' x='184' y='197.98712'/>
+ <path clip-path='url(#clipPath6810-7-87)' inkscape:connector-curvature='0' d='m 27.96875,273.625 c -2.502477,0 -4.53125,2.02877 -4.53125,4.53125 l 0,5.8125 c 0,2.50248 2.028773,4.53125 4.53125,4.53125 2.502477,0 4.53125,-2.02877 4.53125,-4.53125 l 0,-5.8125 c 0,-2.50248 -2.028773,-4.53125 -4.53125,-4.53125 z m 0,1 c 1.964148,0 3.53125,1.5671 3.53125,3.53125 l 0,5.8125 c 0,1.96415 -1.567102,3.53125 -3.53125,3.53125 -1.964148,0 -3.53125,-1.5671 -3.53125,-3.53125 l 0,-5.8125 c 0,-1.96415 1.567102,-3.53125 3.53125,-3.53125 z' id='rect12329' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.00302994;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans' transform='matrix(0.993968,0,0,1,158.7069,-78.486135)'/>
+ <path sodipodi:cx='23' sodipodi:cy='361' d='m 24,361 a 1,1 0 1 1 -2,0 1,1 0 1 1 2,0 z' id='path12331' sodipodi:rx='1' sodipodi:ry='1' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible' transform='matrix(0.5,0,0,0.5,171,22)' sodipodi:type='arc'/>
+ <path sodipodi:cx='23' sodipodi:cy='361' d='m 24,361 a 1,1 0 1 1 -2,0 1,1 0 1 1 2,0 z' id='path12333' sodipodi:rx='1' sodipodi:ry='1' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible' transform='matrix(0.5,0,0,0.5,179,22)' sodipodi:type='arc'/>
+ <path inkscape:connector-curvature='0' d='m 182.875,211 a 1.0019512,1.0019512 0 1 0 0.125,2 l 7.03125,0 a 1.0001,1.0001 0 1 0 0,-2 L 183,211 a 1.0001,1.0001 0 0 0 -0.125,0 z' id='path12335' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <rect height='1' id='rect12337' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible' width='9' x='182' y='212'/>
+ <rect height='4' id='rect12339' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible' width='3' x='185' y='209'/>
+ <path sodipodi:cx='-188' sodipodi:cy='184.0625' d='m -186.0625,184.0625 a 1.9375,1.9375 0 1 1 -3.875,0 1.9375,1.9375 0 1 1 3.875,0 z' id='path12343' sodipodi:rx='1.9375' sodipodi:ry='1.9375' style='color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.2784189;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' transform='matrix(1.0322581,0,0,1.0322551,388.06472,20.00054)' sodipodi:type='arc'/>
+ <path sodipodi:cx='-188' sodipodi:cy='184.0625' d='m -186.0625,184.0625 a 1.9375,1.9375 0 1 1 -3.875,0 1.9375,1.9375 0 1 1 3.875,0 z' id='path12345' sodipodi:rx='1.9375' sodipodi:ry='1.9375' style='color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.2784189;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' transform='matrix(1.0322581,0,0,1.0322551,388.06472,15.00054)' sodipodi:type='arc'/>
+ <path sodipodi:cx='-188' sodipodi:cy='184.0625' d='m -186.0625,184.0625 a 1.9375,1.9375 0 1 1 -3.875,0 1.9375,1.9375 0 1 1 3.875,0 z' id='path12347' sodipodi:rx='1.9375' sodipodi:ry='1.9375' style='color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.2784189;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' transform='matrix(1.0322581,0,0,1.0322551,388.06472,10.00054)' sodipodi:type='arc'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-181,-197)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-181,-197)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-181,-197)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-181,-197)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-181,-197)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-181,-197)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-181,-197)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-181,-197)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/microphone-sensitivity-low-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/microphone-sensitivity-low-symbolic-ref.png
new file mode 100644
index 00000000..4b6ba79d
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/microphone-sensitivity-low-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/microphone-sensitivity-low-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/microphone-sensitivity-low-symbolic.svg
new file mode 100644
index 00000000..612d4d01
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/microphone-sensitivity-low-symbolic.svg
@@ -0,0 +1,45 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='microphone-sensitivity-low-symbolic.svg' height='16.001099' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.4 r9939' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='131.28401' inkscape:cy='-441.9092' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='702' inkscape:window-maximized='1' inkscape:window-width='1366' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='100.0002px' originy='-19.998902px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ <inkscape:grid color='#000000' empcolor='#000000' empopacity='0' empspacing='4' enabled='true' id='grid5968' opacity='0.1254902' originx='100.0002px' originy='-19.998902px' snapvisiblegridlinesonly='true' spacingx='0.5px' spacingy='0.5px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <clipPath clipPathUnits='userSpaceOnUse' id='clipPath6810-7-87'>
+ <rect height='11' id='rect6812-2-4' style='color:#bebebe;fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible' width='14' x='21' y='281'/>
+ </clipPath>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-141,-197)'>
+ <path inkscape:connector-curvature='0' d='m 154.0002,198 c -1.10457,0 -2,0.89543 -2,2 0,1.10457 0.89543,2 2,2 1.10457,0 2,-0.89543 2,-2 0,-1.10457 -0.89543,-2 -2,-2 z m 0,1 c 0.55228,0 1,0.44771 1,1 0,0.55228 -0.44772,1 -1,1 -0.55229,0 -1,-0.44772 -1,-1 0,-0.55229 0.44771,-1 1,-1 z' id='path8179' style='opacity:0.5;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.2784189;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+
+ <rect height='10' id='rect12259' rx='2.4999001' ry='2.5' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible' width='4.9998002' x='144.0002' y='198'/>
+ <path clip-path='url(#clipPath6810-7-87)' inkscape:connector-curvature='0' d='m 27.96875,273.625 c -2.502477,0 -4.53125,2.02877 -4.53125,4.53125 l 0,5.8125 c 0,2.50248 2.028773,4.53125 4.53125,4.53125 2.502477,0 4.53125,-2.02877 4.53125,-4.53125 l 0,-5.8125 c 0,-2.50248 -2.028773,-4.53125 -4.53125,-4.53125 z m 0,1 c 1.964148,0 3.53125,1.5671 3.53125,3.53125 l 0,5.8125 c 0,1.96415 -1.567102,3.53125 -3.53125,3.53125 -1.964148,0 -3.53125,-1.5671 -3.53125,-3.53125 l 0,-5.8125 c 0,-1.96415 1.567102,-3.53125 3.53125,-3.53125 z' id='rect12261' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.00302994;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans' transform='matrix(0.993968,0,0,1,118.7069,-78.486135)'/>
+ <path sodipodi:cx='23' sodipodi:cy='361' d='m 24,361 a 1,1 0 1 1 -2,0 1,1 0 1 1 2,0 z' id='path12263' sodipodi:rx='1' sodipodi:ry='1' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible' transform='matrix(0.5,0,0,0.5,131,22)' sodipodi:type='arc'/>
+ <path sodipodi:cx='23' sodipodi:cy='361' d='m 24,361 a 1,1 0 1 1 -2,0 1,1 0 1 1 2,0 z' id='path12265' sodipodi:rx='1' sodipodi:ry='1' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible' transform='matrix(0.5,0,0,0.5,139,22)' sodipodi:type='arc'/>
+ <path inkscape:connector-curvature='0' d='M 142.90625,211 A 1.001098,1.001098 0 1 0 143,213 l 7,0 a 1.0001,1.0001 0 1 0 0,-2 l -7,0 a 1.0001,1.0001 0 0 0 -0.0937,0 z' id='path12267' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <rect height='1' id='rect12269' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible' width='9' x='142' y='212'/>
+ <rect height='4' id='rect12271' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible' width='3' x='145' y='209'/>
+ <path sodipodi:cx='-188' sodipodi:cy='184.0625' d='m -186.0625,184.0625 a 1.9375,1.9375 0 1 1 -3.875,0 1.9375,1.9375 0 1 1 3.875,0 z' id='path12275' sodipodi:rx='1.9375' sodipodi:ry='1.9375' style='color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.2784189;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' transform='matrix(1.0322581,0,0,1.0322551,348.06472,20.000543)' sodipodi:type='arc'/>
+ <path inkscape:connector-curvature='0' d='m 154.0002,203 c -1.10457,0 -2,0.89543 -2,2 0,1.10457 0.89543,2 2,2 1.10457,0 2,-0.89543 2,-2 0,-1.10457 -0.89543,-2 -2,-2 z m 0,1 c 0.55228,0 1,0.44771 1,1 0,0.55228 -0.44772,1 -1,1 -0.55228,0 -1,-0.44772 -1,-1 0,-0.55229 0.44772,-1 1,-1 z' id='path8174' style='opacity:0.5;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.2784189;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-141,-197)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-141,-197)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-141,-197)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-141,-197)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-141,-197)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-141,-197)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-141,-197)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-141,-197)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/microphone-sensitivity-medium-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/microphone-sensitivity-medium-symbolic-ref.png
new file mode 100644
index 00000000..0c2b14de
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/microphone-sensitivity-medium-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/microphone-sensitivity-medium-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/microphone-sensitivity-medium-symbolic.svg
new file mode 100644
index 00000000..9a471075
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/microphone-sensitivity-medium-symbolic.svg
@@ -0,0 +1,45 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='microphone-sensitivity-medium-symbolic.svg' height='16.001099' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.4 r9939' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='111.28401' inkscape:cy='-441.9092' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='702' inkscape:window-maximized='1' inkscape:window-width='1366' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='80.0002px' originy='-19.998902px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ <inkscape:grid color='#000000' empcolor='#000000' empopacity='0' empspacing='4' enabled='true' id='grid5968' opacity='0.1254902' originx='80.0002px' originy='-19.998902px' snapvisiblegridlinesonly='true' spacingx='0.5px' spacingy='0.5px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <clipPath clipPathUnits='userSpaceOnUse' id='clipPath6810-7-87'>
+ <rect height='11' id='rect6812-2-4' style='color:#bebebe;fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible' width='14' x='21' y='281'/>
+ </clipPath>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-161,-197)'>
+ <path inkscape:connector-curvature='0' d='m 174.0002,198 c -1.10457,0 -2,0.89543 -2,2 0,1.10457 0.89543,2 2,2 1.10457,0 2,-0.89543 2,-2 0,-1.10457 -0.89543,-2 -2,-2 z m 0,1 c 0.55228,0 1,0.44771 1,1 0,0.55228 -0.44772,1 -1,1 -0.55228,0 -1,-0.44772 -1,-1 0,-0.55229 0.44772,-1 1,-1 z' id='path8169' style='opacity:0.5;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.2784189;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+
+ <rect height='10.012877' id='rect12283' rx='2.5' ry='2.5' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible' width='5' x='164' y='197.98712'/>
+ <path clip-path='url(#clipPath6810-7-87)' inkscape:connector-curvature='0' d='m 27.96875,273.625 c -2.502477,0 -4.53125,2.02877 -4.53125,4.53125 l 0,5.8125 c 0,2.50248 2.028773,4.53125 4.53125,4.53125 2.502477,0 4.53125,-2.02877 4.53125,-4.53125 l 0,-5.8125 c 0,-2.50248 -2.028773,-4.53125 -4.53125,-4.53125 z m 0,1 c 1.964148,0 3.53125,1.5671 3.53125,3.53125 l 0,5.8125 c 0,1.96415 -1.567102,3.53125 -3.53125,3.53125 -1.964148,0 -3.53125,-1.5671 -3.53125,-3.53125 l 0,-5.8125 c 0,-1.96415 1.567102,-3.53125 3.53125,-3.53125 z' id='rect12285' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.00302994;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans' transform='matrix(0.993968,0,0,1,138.7069,-78.486135)'/>
+ <path sodipodi:cx='23' sodipodi:cy='361' d='m 24,361 a 1,1 0 1 1 -2,0 1,1 0 1 1 2,0 z' id='path12287' sodipodi:rx='1' sodipodi:ry='1' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible' transform='matrix(0.5,0,0,0.5,151,22)' sodipodi:type='arc'/>
+ <path sodipodi:cx='23' sodipodi:cy='361' d='m 24,361 a 1,1 0 1 1 -2,0 1,1 0 1 1 2,0 z' id='path12289' sodipodi:rx='1' sodipodi:ry='1' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible' transform='matrix(0.5,0,0,0.5,159,22)' sodipodi:type='arc'/>
+ <path inkscape:connector-curvature='0' d='M 162.90625,211 A 1.001098,1.001098 0 1 0 163,213 l 7,0 a 1.0001,1.0001 0 1 0 0,-2 l -7,0 a 1.0001,1.0001 0 0 0 -0.0937,0 z' id='path12291' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <rect height='1' id='rect12293' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible' width='9' x='162' y='212'/>
+ <rect height='4' id='rect12295' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible' width='3' x='165' y='209'/>
+ <path sodipodi:cx='-188' sodipodi:cy='184.0625' d='m -186.0625,184.0625 a 1.9375,1.9375 0 1 1 -3.875,0 1.9375,1.9375 0 1 1 3.875,0 z' id='path12275-1' sodipodi:rx='1.9375' sodipodi:ry='1.9375' style='color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.2784189;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' transform='matrix(1.0322581,0,0,1.0322551,368.06472,20.00054)' sodipodi:type='arc'/>
+ <path sodipodi:cx='-188' sodipodi:cy='184.0625' d='m -186.0625,184.0625 a 1.9375,1.9375 0 1 1 -3.875,0 1.9375,1.9375 0 1 1 3.875,0 z' id='path12321' sodipodi:rx='1.9375' sodipodi:ry='1.9375' style='color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.2784189;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' transform='matrix(1.0322581,0,0,1.0322551,368.06472,15.00054)' sodipodi:type='arc'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-161,-197)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-161,-197)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-161,-197)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-161,-197)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-161,-197)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-161,-197)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-161,-197)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-161,-197)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/microphone-sensitivity-muted-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/microphone-sensitivity-muted-symbolic-ref.png
new file mode 100644
index 00000000..5db44ab7
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/microphone-sensitivity-muted-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/microphone-sensitivity-muted-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/microphone-sensitivity-muted-symbolic.svg
new file mode 100644
index 00000000..1914ed31
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/microphone-sensitivity-muted-symbolic.svg
@@ -0,0 +1,45 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='microphone-sensitivity-muted-symbolic.svg' height='16.001099' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.4 r9939' version='1.1' width='16.0002' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='151.28401' inkscape:cy='-441.9092' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='702' inkscape:window-maximized='1' inkscape:window-width='1366' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='120.0002px' originy='-19.998902px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ <inkscape:grid color='#000000' empcolor='#000000' empopacity='0' empspacing='4' enabled='true' id='grid5968' opacity='0.1254902' originx='120.0002px' originy='-19.998902px' snapvisiblegridlinesonly='true' spacingx='0.5px' spacingy='0.5px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <clipPath clipPathUnits='userSpaceOnUse' id='clipPath6810-7-87'>
+ <rect height='11' id='rect6812-2-4' style='color:#bebebe;fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible' width='14' x='21' y='281'/>
+ </clipPath>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-121,-197)'>
+
+ <rect height='10.012877' id='rect12235' rx='2.5' ry='2.5' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible' width='5' x='124' y='197.98712'/>
+ <path clip-path='url(#clipPath6810-7-87)' inkscape:connector-curvature='0' d='m 27.96875,273.625 c -2.502477,0 -4.53125,2.02877 -4.53125,4.53125 l 0,5.8125 c 0,2.50248 2.028773,4.53125 4.53125,4.53125 2.502477,0 4.53125,-2.02877 4.53125,-4.53125 l 0,-5.8125 c 0,-2.50248 -2.028773,-4.53125 -4.53125,-4.53125 z m 0,1 c 1.964148,0 3.53125,1.5671 3.53125,3.53125 l 0,5.8125 c 0,1.96415 -1.567102,3.53125 -3.53125,3.53125 -1.964148,0 -3.53125,-1.5671 -3.53125,-3.53125 l 0,-5.8125 c 0,-1.96415 1.567102,-3.53125 3.53125,-3.53125 z' id='rect12237' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.00302994;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans' transform='matrix(0.993968,0,0,1,98.706899,-78.486135)'/>
+ <path sodipodi:cx='23' sodipodi:cy='361' d='m 24,361 a 1,1 0 1 1 -2,0 1,1 0 1 1 2,0 z' id='path12239' sodipodi:rx='1' sodipodi:ry='1' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible' transform='matrix(0.5,0,0,0.5,111,22)' sodipodi:type='arc'/>
+ <path sodipodi:cx='23' sodipodi:cy='361' d='m 24,361 a 1,1 0 1 1 -2,0 1,1 0 1 1 2,0 z' id='path12241' sodipodi:rx='1' sodipodi:ry='1' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible' transform='matrix(0.5,0,0,0.5,119,22)' sodipodi:type='arc'/>
+ <path inkscape:connector-curvature='0' d='M 122.90625,211 A 1.001098,1.001098 0 1 0 123,213 l 7,0 a 1.0001,1.0001 0 1 0 0,-2 l -7,0 a 1.0001,1.0001 0 0 0 -0.0937,0 z' id='path12243' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <rect height='1' id='rect12245' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible' width='9.0002003' x='122' y='212'/>
+ <rect height='4' id='rect12247' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible' width='3' x='125' y='209'/>
+ <path inkscape:connector-curvature='0' d='m 134.0002,197.99193 c -1.09865,0 -2.00806,0.90942 -2.00806,2.00807 0,1.09865 0.90941,2.00806 2.00806,2.00806 1.09865,0 2.00806,-0.90941 2.00806,-2.00806 0,-1.09865 -0.90941,-2.00807 -2.00806,-2.00807 z m 0,1.01613 c 0.55821,0 0.99193,0.43373 0.99193,0.99194 0,0.55821 -0.43372,0.99193 -0.99193,0.99193 -0.55821,0 -0.99193,-0.43372 -0.99193,-0.99193 0,-0.55821 0.43372,-0.99194 0.99193,-0.99194 z' id='path12249' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.5;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.29166746;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 134.00019,202.99193 c -1.09865,0 -2.00806,0.90941 -2.00806,2.00806 0,1.09865 0.90941,2.00807 2.00806,2.00807 1.09865,0 2.00807,-0.90942 2.00807,-2.00807 0,-1.09865 -0.90942,-2.00806 -2.00807,-2.00806 z m 0,1.01613 c 0.55821,0 0.99194,0.43373 0.99194,0.99193 0,0.55821 -0.43373,0.99194 -0.99194,0.99194 -0.55821,0 -0.99193,-0.43373 -0.99193,-0.99194 0,-0.5582 0.43372,-0.99193 0.99193,-0.99193 z' id='path12253' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.5;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.29166651;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 132.0002,208 1.375,0 1.125,1.09375 1.09375,-1.09375 1.40625,0 0,1.46875 -1.09375,1.0625 1.09375,1.0625 0,1.40625 -1.4375,0 -1.0625,-1.0625 -1.0625,1.0625 -1.4375,0 0,-1.40625 1.0625,-1.0625 -1.0625,-1.0625 0,-1.46875 z' id='path3761-2-3-5-4-8-9-8-0-9-0-4' sodipodi:nodetypes='ccccccccccccccccc' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-121,-197)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-121,-197)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-121,-197)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-121,-197)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-121,-197)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-121,-197)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-121,-197)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-121,-197)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/modem-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/modem-symbolic-ref.png
new file mode 100644
index 00000000..d4474e00
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/modem-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/modem-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/modem-symbolic.svg
new file mode 100644
index 00000000..cf828adc
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/modem-symbolic.svg
@@ -0,0 +1,36 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='modem-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.91 r13725' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer10' inkscape:cx='9.54878' inkscape:cy='4.80213' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='false' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='159.9998' originy='350' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-81.0004,-567)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-81.0004,-567)'>
+
+ <path inkscape:connector-curvature='0' d='m 92.10532,577 c -0.78136,0.64834 -1.68021,1.51805 -3.06472,2.0098 l -7.0404,-0.01 0,3 14,0 0,-3 -2,-2 z m -0.60512,1.79687 c 0.38953,0 0.70313,0.3136 0.70313,0.70313 0,0.38953 -0.3136,0.70313 -0.70313,0.70313 -0.38953,0 -0.70313,-0.3136 -0.70313,-0.70313 0,-0.38953 0.3136,-0.70313 0.70313,-0.70313 z m 2,0.0234 c 0.37655,0 0.67969,0.30314 0.67969,0.67969 0,0.37655 -0.30314,0.67969 -0.67969,0.67969 -0.37655,0 -0.67969,-0.30314 -0.67969,-0.67969 0,-0.37655 0.30314,-0.67969 0.67969,-0.67969 z' id='path26971' sodipodi:nodetypes='ccccccccssssssssss' style='color:#000000;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;enable-background:new'/>
+ <path inkscape:connector-curvature='0' d='m 92.446603,570.05447 c 0.327975,0 0.594959,0.26223 0.594959,0.59496 l 0,0.0383 c -0.01051,4.06126 -3.306079,7.35062 -7.36981,7.35062 l -0.01916,0 c -0.334607,0 -0.594989,-0.27391 -0.594989,-0.61415 l 0,-0.61415 0,-1.22831 c 0,-0.34023 0.273912,-0.61414 0.614151,-0.61414 l 1.228301,0 c 0.34024,0 0.614151,0.27391 0.614151,0.61414 l 0,0.28789 c 1.570298,-0.55512 2.803519,-1.78834 3.358638,-3.35864 l -0.287883,0 c -0.340246,0 -0.61415,-0.27391 -0.61415,-0.61415 l 0,-1.2283 c 0,-0.34025 0.273904,-0.61415 0.61415,-0.61415 l 0.614151,0 0.614151,0 0.594958,0 0.01916,0 0.01916,0 z' id='rect5922-4' style='display:inline;opacity:1;fill:#bebebe;fill-opacity:1;stroke:none;enable-background:new'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-81.0004,-567)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-81.0004,-567)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-81.0004,-567)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-81.0004,-567)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-81.0004,-567)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-81.0004,-567)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-81.0004,-567)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/multimedia-player-apple-ipod-touch-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/multimedia-player-apple-ipod-touch-symbolic-ref.png
new file mode 100644
index 00000000..beb0ec4e
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/multimedia-player-apple-ipod-touch-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/multimedia-player-apple-ipod-touch-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/multimedia-player-apple-ipod-touch-symbolic.svg
new file mode 100644
index 00000000..cbd3996e
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/multimedia-player-apple-ipod-touch-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='multimedia-player-apple-ipod-touch-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.2 r9819' version='1.1' width='16.000002' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-paths='false' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer10' inkscape:cx='7.5250416' inkscape:cy='3.05352' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#555753' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='419' inkscape:window-maximized='0' inkscape:window-width='511' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(218.9998,-447)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(218.9998,-447)'>
+
+ <path inkscape:connector-curvature='0' d='m -213.53105,448 c -0.82099,0 -1.46875,0.64776 -1.46875,1.46875 l 0,11.0625 c 0,0.82099 0.64776,1.46875 1.46875,1.46875 l 5.125,0 c 0.82099,0 1.46875,-0.64776 1.46875,-1.46875 l 0,-11.0625 c 0,-0.82099 -0.64776,-1.46875 -1.46875,-1.46875 z m -0.46875,1 6.0625,0 0,11 -6.0625,0 z' id='path23868' sodipodi:nodetypes='sssssssssccccc' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(218.9998,-447)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(218.9998,-447)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(218.9998,-447)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(218.9998,-447)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(218.9998,-447)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(218.9998,-447)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(218.9998,-447)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/multimedia-player-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/multimedia-player-symbolic-ref.png
new file mode 100644
index 00000000..95f397e2
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/multimedia-player-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/multimedia-player-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/multimedia-player-symbolic.svg
new file mode 100644
index 00000000..1afcdd6b
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/multimedia-player-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='multimedia-player-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.2 r9819' version='1.1' width='16.000002' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-paths='false' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer10' inkscape:cx='12.50171' inkscape:cy='8.96987' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#555753' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1381' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='1600' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-61.0002,-467)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-61.0002,-467)'>
+
+ <path inkscape:connector-curvature='0' d='m 65.468952,468 c -0.82099,0 -1.46875,0.64776 -1.46875,1.46875 l 0,11.0625 c 0,0.82099 0.64776,1.46875 1.46875,1.46875 l 7.0625,0 c 0.82099,0 1.46875,-0.64776 1.46875,-1.46875 l 0,-11.0625 c 0,-0.82099 -0.64776,-1.46875 -1.46875,-1.46875 l -7.0625,0 z m -0.46875,1 8,0 0,5 -8,0 0,-5 z m 4,6 c 1.65685,0 3,1.34315 3,3 0,1.65685 -1.34315,3 -3,3 -1.65685,0 -3,-1.34315 -3,-3 0,-1.65685 1.34315,-3 3,-3 z' id='path16980' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+ <path sodipodi:cx='-171' sodipodi:cy='261' d='m -170,261 a 1,1 0 1 1 -2,0 1,1 0 1 1 2,0 z' id='path16982' sodipodi:rx='1' sodipodi:ry='1' style='fill:#bebebe;fill-opacity:1;stroke:none' transform='matrix(1.5,0,0,1.5,325.5002,86.5)' sodipodi:type='arc'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-61.0002,-467)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-61.0002,-467)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-61.0002,-467)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-61.0002,-467)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-61.0002,-467)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-61.0002,-467)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-61.0002,-467)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/multimedia-volume-control-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/multimedia-volume-control-symbolic-ref.png
new file mode 100644
index 00000000..7038e4af
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/multimedia-volume-control-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/multimedia-volume-control-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/multimedia-volume-control-symbolic.svg
new file mode 100644
index 00000000..4d23a00a
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/multimedia-volume-control-symbolic.svg
@@ -0,0 +1,37 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='multimedia-volume-control-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.92.2 5c3e80d, 2017-08-06' viewBox='0 0 16 16' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer11' inkscape:cx='3.1751' inkscape:cy='3.08376' inkscape:document-rotation='0' inkscape:document-units='px' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:measure-end='0,0' inkscape:measure-start='-190.687,-191.14' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='3440' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='158' originy='452' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-83.0002,-669)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-83.0002,-669)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-83.0002,-669)'>
+ <path inkscape:connector-curvature='0' d='m 83.000202,673.99979 h 2.484375 L 88.453331,671 h 0.546871 v 11.99917 L 88.524905,683 85.484577,679.99938 h -2.484375 z' id='path14137' sodipodi:nodetypes='ccccccccc' style='color:#bebebe;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none'/>
+
+ <path inkscape:connector-curvature='0' d='m 97.000192,677.0002 c 0,-2.16664 -0.73878,-4.01982 -2,-5 h -1 v 2 c 0.60652,0.78878 1,1.75887 1,3 0,1.24113 -0.39348,2.21938 -1,3 v 2 h 1 c 1.2229,-0.99478 2,-2.8734 2,-5 z' id='path14143' sodipodi:nodetypes='scccscccs' style='color:#000000;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0;marker:none;enable-background:accumulate'/>
+ <path clip-path='none' inkscape:connector-curvature='0' d='m 94.000192,677.0002 c 0,-1.25733 -0.31165,-2.21571 -1,-3 h -1 v 6 h 1 c 0.67206,-0.8369 1,-1.74267 1,-3 z' id='path14145' mask='none' sodipodi:nodetypes='zccccz' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:Sans;-inkscape-font-specification:Sans;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2.32782054;marker:none;enable-background:accumulate'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-83.0002,-669)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-83.0002,-669)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-83.0002,-669)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-83.0002,-669)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-83.0002,-669)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-83.0002,-669)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-cellular-3g-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/network-cellular-3g-symbolic-ref.png
new file mode 100644
index 00000000..567962fe
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-cellular-3g-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-cellular-3g-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/network-cellular-3g-symbolic.svg
new file mode 100644
index 00000000..93441a06
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-cellular-3g-symbolic.svg
@@ -0,0 +1,30 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:svg='http://www.w3.org/2000/svg' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' sodipodi:docname='network-cellular-3g-symbolic.svg' version='1.1' inkscape:version='0.48+devel r10053 custom' height='16' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:cy='29.221195' pagecolor='#555753' borderopacity='1' showborder='false' inkscape:bbox-paths='false' guidetolerance='10' inkscape:object-paths='true' inkscape:window-width='1296' showguides='true' inkscape:object-nodes='true' inkscape:snap-bbox='false' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:snap-nodes='true' bordercolor='#666666' objecttolerance='10' id='namedview88' showgrid='false' inkscape:window-maximized='0' inkscape:window-x='1697' inkscape:snap-global='true' inkscape:window-y='0' gridtolerance='10' inkscape:window-height='1118' inkscape:snap-to-guides='true' inkscape:current-layer='layer9' inkscape:snap-bbox-midpoints='false' inkscape:zoom='1' inkscape:cx='222.81103' inkscape:snap-grids='true' inkscape:pageopacity='1'>
+ <inkscape:grid spacingx='1px' spacingy='1px' id='grid4866' empspacing='2' enabled='true' type='xygrid' snapvisiblegridlinesonly='true' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:label='status' transform='translate(-81.0002,-237)' inkscape:groupmode='layer' id='layer9' style='display:inline'>
+
+ <path inkscape:connector-curvature='0' d='m 83.0627,237 c -1.15073,0 -2.0625,0.91177 -2.0625,2.0625 l 0,11.875 c 0,1.15073 0.91177,2.0625 2.0625,2.0625 l 11.875,0 c 1.15073,0 2.0625,-0.91177 2.0625,-2.0625 l 0,-11.875 C 97.0002,237.91177 96.08843,237 94.9377,237 l -11.875,0 z m -0.0625,3 4,0 a 1.0001,1.0001 0 0 1 0.875,1.4375 l -1.375,2.78125 c 0.35458,0.11552 0.74913,0.19557 0.96875,0.4375 0.33238,0.36614 0.53125,0.8102 0.53125,1.34375 l 0,2 c 0,1.11243 -0.90732,2 -2,2 l -3,0 0,-2 3,0 0,-2 -1,0 a 1.0001,1.0001 0 0 1 -0.875,-1.4375 l 1.25,-2.5625 -2.375,0 0,-2 z m 8.0625,0.0312 1.84375,0 0.0625,0 c 0.003,-1e-4 -0.003,0.0315 0,0.0312 0.52731,-0.0204 1.07254,0.076 1.5,0.46875 0.41475,0.38112 0.59343,1.00751 0.5625,1.59375 l 0.0312,0 0,0.125 0,0.75 -2,0 0,-0.875 0,-0.0625 0,-0.0312 c -0.0176,-0.002 0.003,-0.002 -0.0312,0 l -0.0312,0 -0.0312,0 -1.90625,0 c -0.0276,0 -0.022,0.002 -0.0312,0 -0.006,0.004 -0.0292,-0.003 -0.0312,0 -0.007,0.0224 0.007,0.0466 0,0.0625 l 0,0.0312 0,5.8125 c -0.0237,-0.0217 0,0.0625 0,0.0625 l 1.96875,0 c 0.007,-0.0193 0.0294,-0.016 0.0312,0 8.8e-4,0.008 0,-0.0555 0,-0.0312 l 0,-1.9375 -1,0 0,-2 2,0 1,0 0,1 0,2.9375 c 0,0.56264 -0.22708,0.99952 -0.5625,1.375 -0.31592,0.35364 -0.85192,0.632 -1.46875,0.625 l 0,0.0312 -0.0937,0 -1.875,0 c -0.6248,0 -0.99413,-0.24123 -1.34375,-0.5625 -0.33105,-0.30421 -0.64392,-0.78987 -0.625,-1.4375 6e-5,-0.002 -0.0313,0.002 -0.0312,0 l 0,-0.0937 0,-5.8125 0,-0.0937 0,-0.0625 c 0.0625,-0.43728 0.20536,-0.88912 0.5625,-1.28125 0.35715,-0.39213 0.94608,-0.625 1.5,-0.625 z' id='path1244' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible'/>
+ </g>
+ <g inkscape:label='devices' transform='translate(-81.0002,-237)' inkscape:groupmode='layer' id='layer10'/>
+ <g inkscape:label='apps' transform='translate(-81.0002,-237)' inkscape:groupmode='layer' id='layer11'/>
+ <g inkscape:label='actions' transform='translate(-81.0002,-237)' inkscape:groupmode='layer' id='layer12'/>
+ <g inkscape:label='places' transform='translate(-81.0002,-237)' inkscape:groupmode='layer' id='layer13'/>
+ <g inkscape:label='mimetypes' transform='translate(-81.0002,-237)' inkscape:groupmode='layer' id='layer14'/>
+ <g inkscape:label='emblems' transform='translate(-81.0002,-237)' inkscape:groupmode='layer' id='layer15' style='display:inline'/>
+ <g inkscape:label='categories' transform='translate(-81.0002,-237)' inkscape:groupmode='layer' id='g4953' style='display:inline'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-cellular-4g-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/network-cellular-4g-symbolic-ref.png
new file mode 100644
index 00000000..d2ffc2a7
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-cellular-4g-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-cellular-4g-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/network-cellular-4g-symbolic.svg
new file mode 100644
index 00000000..66c3ca2d
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-cellular-4g-symbolic.svg
@@ -0,0 +1,30 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:svg='http://www.w3.org/2000/svg' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' sodipodi:docname='network-cellular-4g-symbolic.svg' version='1.1' inkscape:version='0.48+devel r10053 custom' height='16' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:cy='29.221195' pagecolor='#555753' borderopacity='1' showborder='false' inkscape:bbox-paths='false' guidetolerance='10' inkscape:object-paths='true' inkscape:window-width='1296' showguides='true' inkscape:object-nodes='true' inkscape:snap-bbox='false' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:snap-nodes='true' bordercolor='#666666' objecttolerance='10' id='namedview88' showgrid='false' inkscape:window-maximized='0' inkscape:window-x='1697' inkscape:snap-global='true' inkscape:window-y='0' gridtolerance='10' inkscape:window-height='1118' inkscape:snap-to-guides='true' inkscape:current-layer='layer9' inkscape:snap-bbox-midpoints='false' inkscape:zoom='1' inkscape:cx='202.81103' inkscape:snap-grids='true' inkscape:pageopacity='1'>
+ <inkscape:grid spacingx='1px' spacingy='1px' id='grid4866' empspacing='2' enabled='true' type='xygrid' snapvisiblegridlinesonly='true' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:label='status' transform='translate(-101.0002,-237)' inkscape:groupmode='layer' id='layer9' style='display:inline'>
+
+ <path inkscape:connector-curvature='0' d='m 103.0627,237 c -1.15073,0 -2.0625,0.91177 -2.0625,2.0625 l 0,11.875 c 0,1.15073 0.91177,2.0625 2.0625,2.0625 l 11.875,0 c 1.15073,0 2.0625,-0.91177 2.0625,-2.0625 l 0,-11.875 c 0,-1.15073 -0.91177,-2.0625 -2.0625,-2.0625 z m -0.0625,3 2,0 0,4 1,0 0,-1 2,0 0,7 -2,0 0,-4 -1,0 c -1,0 -2,-0.84167 -2,-2 z m 8.0625,0.0312 1.84375,0 0.0625,0 c 0.003,-1e-4 -0.003,0.0315 0,0.0312 0.52731,-0.0204 1.07254,0.076 1.5,0.46875 0.41475,0.38112 0.59343,1.00751 0.5625,1.59375 l 0.0312,0 0,0.125 0,0.75 -2,0 0,-0.875 0,-0.0625 0,-0.0312 c -0.0176,-0.002 0.003,-0.002 -0.0312,0 l -0.0312,0 -0.0312,0 -1.90625,0 c -0.0276,0 -0.0221,0.002 -0.0312,0 -0.006,0.004 -0.0292,-0.003 -0.0312,0 -0.007,0.0224 0.007,0.0466 0,0.0625 l 0,0.0312 0,5.8125 c -0.0237,-0.0217 0,0.0625 0,0.0625 l 1.96875,0 c 0.007,-0.0193 0.0294,-0.016 0.0312,0 8.8e-4,0.008 0,-0.0555 0,-0.0312 l 0,-1.9375 -1,0 0,-2 2,0 1,0 0,1 0,2.9375 c 0,0.56264 -0.22708,0.99952 -0.5625,1.375 -0.31592,0.35364 -0.85192,0.632 -1.46875,0.625 l 0,0.0312 -0.0937,0 -1.875,0 c -0.6248,0 -0.99413,-0.24123 -1.34375,-0.5625 -0.33105,-0.30421 -0.64392,-0.78987 -0.625,-1.4375 6e-5,-0.002 -0.0314,0.002 -0.0312,0 l 0,-0.0937 0,-5.8125 0,-0.0937 0,-0.0625 c 0.0625,-0.43728 0.20536,-0.88912 0.5625,-1.28125 0.35715,-0.39213 0.94608,-0.625 1.5,-0.625 z' id='path1245' sodipodi:nodetypes='ssssssssscccccccccsscscccccccccccccccscccccccccccccccsccccsscccccccs' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible'/>
+ </g>
+ <g inkscape:label='devices' transform='translate(-101.0002,-237)' inkscape:groupmode='layer' id='layer10'/>
+ <g inkscape:label='apps' transform='translate(-101.0002,-237)' inkscape:groupmode='layer' id='layer11'/>
+ <g inkscape:label='actions' transform='translate(-101.0002,-237)' inkscape:groupmode='layer' id='layer12'/>
+ <g inkscape:label='places' transform='translate(-101.0002,-237)' inkscape:groupmode='layer' id='layer13'/>
+ <g inkscape:label='mimetypes' transform='translate(-101.0002,-237)' inkscape:groupmode='layer' id='layer14'/>
+ <g inkscape:label='emblems' transform='translate(-101.0002,-237)' inkscape:groupmode='layer' id='layer15' style='display:inline'/>
+ <g inkscape:label='categories' transform='translate(-101.0002,-237)' inkscape:groupmode='layer' id='g4953' style='display:inline'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-cellular-acquiring-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/network-cellular-acquiring-symbolic-ref.png
new file mode 100644
index 00000000..7962b386
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-cellular-acquiring-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-cellular-acquiring-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/network-cellular-acquiring-symbolic.svg
new file mode 100644
index 00000000..bcd5398c
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-cellular-acquiring-symbolic.svg
@@ -0,0 +1,40 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='network-cellular-acquiring-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.4 r9939' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='131.28381' inkscape:cy='-381.9103' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='702' inkscape:window-maximized='1' inkscape:window-width='1366' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='100px' originy='40.000001px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ <inkscape:grid color='#000000' empcolor='#000000' empopacity='0' empspacing='4' enabled='true' id='grid5968' opacity='0.1254902' originx='100px' originy='40.000001px' snapvisiblegridlinesonly='true' spacingx='0.5px' spacingy='0.5px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-141.0002,-257)'>
+
+ <path inkscape:connector-curvature='0' d='m 141.02205,266 0,3 0,3 1,0 2,0 0,-3 -2,0 0,-3 -1,0 z' id='rect4162' style='opacity:0.35;color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible'/>
+ <path inkscape:connector-curvature='0' d='m 152.99995,257.0221 0,7 2,0 0,5 -2,0 0,3 3,0 0,-3 0,-5 0,-1 0,-6 -3,0 z' id='rect4162-9' style='opacity:0.35;color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible'/>
+ <path inkscape:connector-curvature='0' d='m 144.99995,269 0,3 3,0 0,-3 -3,0 z' id='rect4162-92' sodipodi:nodetypes='ccccc' style='opacity:0.35;color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible'/>
+ <path inkscape:connector-curvature='0' d='m 148.99995,269 0,3 3,0 0,-3 -3,0 z' id='rect4162-92-3' sodipodi:nodetypes='ccccc' style='opacity:0.35;color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible'/>
+ <path inkscape:connector-curvature='0' d='m 144.99995,263 0,1 3,0 0,-1 -3,0 z' id='rect4162-92-5' sodipodi:nodetypes='ccccc' style='opacity:0.35;color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible'/>
+ <path inkscape:connector-curvature='0' d='m 148.99995,260 0,4 3,0 0,-4 -3,0 z' id='rect4162-92-3-0' sodipodi:nodetypes='ccccc' style='opacity:0.35;color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible'/>
+ <path sodipodi:cx='28' sodipodi:cy='209' d='m 29,209 a 1,1 0 1 1 -2,0 1,1 0 1 1 2,0 z' id='path4955-3' sodipodi:rx='1' sodipodi:ry='1' style='fill:#bebebe;fill-opacity:1;stroke:none;display:inline' transform='matrix(1.5,0,0,1.5,102.5,-46.999999)' sodipodi:type='arc'/>
+ <path sodipodi:cx='28' sodipodi:cy='209' d='m 29,209 a 1,1 0 1 1 -2,0 1,1 0 1 1 2,0 z' id='path4957-3' sodipodi:rx='1' sodipodi:ry='1' style='fill:#bebebe;fill-opacity:1;stroke:none;display:inline' transform='matrix(1.5,0,0,1.5,106.5,-46.999999)' sodipodi:type='arc'/>
+ <path sodipodi:cx='28' sodipodi:cy='209' d='m 29,209 a 1,1 0 1 1 -2,0 1,1 0 1 1 2,0 z' id='path4959-7' sodipodi:rx='1' sodipodi:ry='1' style='fill:#bebebe;fill-opacity:1;stroke:none;display:inline' transform='matrix(1.5,0,0,1.5,110.49995,-46.999999)' sodipodi:type='arc'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-141.0002,-257)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-141.0002,-257)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-141.0002,-257)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-141.0002,-257)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-141.0002,-257)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-141.0002,-257)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-141.0002,-257)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-141.0002,-257)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-cellular-connected-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/network-cellular-connected-symbolic-ref.png
new file mode 100644
index 00000000..9e11cae4
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-cellular-connected-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-cellular-connected-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/network-cellular-connected-symbolic.svg
new file mode 100644
index 00000000..68b89d37
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-cellular-connected-symbolic.svg
@@ -0,0 +1,34 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='network-cellular-connected-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.4 r9939' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='444.57332' inkscape:cy='-211.42645' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='702' inkscape:window-maximized='1' inkscape:window-width='1366' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='80px' originy='41px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ <inkscape:grid color='#000000' empcolor='#000000' empopacity='0' empspacing='4' enabled='true' id='grid5968' opacity='0.1254902' originx='80px' originy='41px' snapvisiblegridlinesonly='true' spacingx='0.5px' spacingy='0.5px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-161.0002,-258)'>
+
+ <path inkscape:connector-curvature='0' d='m 167.0002,259 c -1.00916,0.005 -1,1 -1,1 l 0,11 c 0,1 1,1 1,1 l 4,0 c 1,0 1,-1 1,-1 l 0,-8 c 9e-4,-0.554 -0.446,-1 -1,-1 l -3,0 0,-2 c 0,0 -0.009,-0.99447 -1,-1 z m 0,4 4,0 0,3.03125 -4,-0.0312 z m 0,4 1,0 0,1 1,0 0,-1 1,0 0,1 1,0 0,1 -1,0 0,1 1,0 0,1 -1,0 0,-1 -1,0 0,1 -1,0 0,-1 -1,0 0,-1 1,0 0,-1 -1,0 z m 1,2 0,1 1,0 0,-1 z m 1,0 1,0 0,-1 -1,0 z' id='rect5222-6' sodipodi:nodetypes='ccscsccsccccccccccccccccccccccccccccccccccccccccccc' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 177.0002,263 0,1 c 0,0.25689 -0.12983,0.52846 -0.3125,0.71875 L 175.40645,266 l 1.28125,1.28125 c 0.18267,0.19029 0.3125,0.46186 0.3125,0.71875 l 0,1 -1,0 c -0.30945,0 -0.55232,-0.0903 -0.75,-0.28125 L 172.59395,266 175.2502,263.28125 C 175.44788,263.0903 175.69075,263 176.0002,263 l 1,0 z' id='rect3217-6-2-2-4-8-8' sodipodi:nodetypes='ccccccccccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/>
+ <path inkscape:connector-curvature='0' d='m 161.0002,263 0,1 c 0,0.25689 0.12983,0.52846 0.3125,0.71875 l 1.28125,1.28125 -1.28125,1.28125 c -0.18267,0.19029 -0.3125,0.46186 -0.3125,0.71875 l 0,1 1,0 c 0.30945,0 0.55232,-0.0903 0.75,-0.28125 L 165.40645,266 162.7502,263.28125 C 162.55252,263.0903 162.30965,263 162.0002,263 l -1,0 z' id='path5302' sodipodi:nodetypes='ccccccccccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-161.0002,-258)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-161.0002,-258)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-161.0002,-258)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-161.0002,-258)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-161.0002,-258)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-161.0002,-258)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-161.0002,-258)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-161.0002,-258)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-cellular-edge-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/network-cellular-edge-symbolic-ref.png
new file mode 100644
index 00000000..dc7f1f1f
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-cellular-edge-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-cellular-edge-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/network-cellular-edge-symbolic.svg
new file mode 100644
index 00000000..2f647000
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-cellular-edge-symbolic.svg
@@ -0,0 +1,26 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:svg='http://www.w3.org/2000/svg' id='svg7384' version='1.1' height='16' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16.000299'>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs id='defs7386'/>
+ <g transform='translate(-100.9999,-237)' id='layer9' style='display:inline'>
+
+ <path inkscape:connector-curvature='0' d='m 103.0624,237 c -1.15073,0 -2.0625,0.91177 -2.0625,2.0625 l 0,11.875 c 0,1.15073 0.91177,2.0625 2.0625,2.0625 l 11.875,0 c 1.15073,0 2.0625,-0.91177 2.0625,-2.0625 l 0,-11.875 c 0,-1.15073 -0.91177,-2.0625 -2.0625,-2.0625 l -11.875,0 z m 3.9375,3 0.0937,0 5.90625,0 0,2 -6,0 0,2 6,0 0,2 -6,0 0,2 c -3.6e-4,-4.5e-4 0.0315,1e-4 0.0313,0 l 5.96875,0 0,2 -6,0 c -0.6248,0 -0.99413,-0.24118 -1.34375,-0.5625 -0.33108,-0.30424 -0.64399,-0.78976 -0.625,-1.4375 l -0.0313,0 0,-0.0937 0,-5.84375 0,-0.0625 0.0313,0 c -0.013,-0.4751 0.11013,-0.99964 0.46875,-1.40625 0.35357,-0.40089 0.93419,-0.583 1.5,-0.5625 l 0,-0.0313 z' id='rect7047' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible'/>
+ </g>
+ <g transform='translate(-100.9999,-237)' id='layer10'/>
+ <g transform='translate(-100.9999,-237)' id='layer11'/>
+ <g transform='translate(-100.9999,-237)' id='layer12'/>
+ <g transform='translate(-100.9999,-237)' id='layer13'/>
+ <g transform='translate(-100.9999,-237)' id='layer14'/>
+ <g transform='translate(-100.9999,-237)' id='layer15'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-cellular-gprs-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/network-cellular-gprs-symbolic-ref.png
new file mode 100644
index 00000000..a190542b
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-cellular-gprs-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-cellular-gprs-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/network-cellular-gprs-symbolic.svg
new file mode 100644
index 00000000..0dbb7935
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-cellular-gprs-symbolic.svg
@@ -0,0 +1,26 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:svg='http://www.w3.org/2000/svg' id='svg7384' version='1.1' height='16' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16.00025'>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs id='defs7386'/>
+ <g transform='translate(-60.99995,-237)' id='layer9' style='display:inline'>
+
+ <path inkscape:connector-curvature='0' d='m 63.06245,237 c -1.150728,0 -2.0625,0.91177 -2.0625,2.0625 l 0,11.875 c 0,1.15073 0.911772,2.0625 2.0625,2.0625 l 11.875,0 c 1.150728,0 2.0625,-0.91177 2.0625,-2.0625 l 0,-11.875 c 0,-1.15073 -0.911772,-2.0625 -2.0625,-2.0625 l -11.875,0 z m 4.0625,3.03125 3.78125,0 0.0625,0 c 0.0032,-1e-4 -0.0032,0.0314 0,0.0312 0.527306,-0.0204 1.072537,0.076 1.5,0.46875 0.414747,0.38112 0.59343,1.00751 0.5625,1.59375 l 0.03125,0 0,0.125 0,0.75 -2,0 0,-0.875 0,-0.0625 0,-0.0312 c -0.01759,-0.002 0.0033,-0.002 -0.03125,0 l -0.03125,0 -0.03125,0 -3.84375,0 c -0.02762,0 -0.02197,0.002 -0.03125,0 -0.0064,0.004 -0.02919,-0.003 -0.03125,0 -0.0073,0.0224 0.0068,0.0466 0,0.0625 l 0,0.0312 0,5.8125 c -0.02367,-0.0217 -0.0031,0.0605 0,0.0625 l 3.90625,0 c 0.0068,-0.0193 0.02945,-0.016 0.03125,0 8.77e-4,0.008 0,-0.0554 0,-0.0312 l 0,-1.9375 -2,0 0,-2 3,0 1,0 0,1 0,2.9375 c 0,0.56264 -0.227078,0.99952 -0.5625,1.375 -0.31592,0.35364 -0.851921,0.632 -1.46875,0.625 l 0,0.0312 -0.09375,0 -3.8125,0 c -0.624797,0 -0.994128,-0.24123 -1.34375,-0.5625 -0.331051,-0.30421 -0.64392,-0.78987 -0.625,-1.4375 6e-5,-0.002 -0.03131,0.002 -0.03125,0 l 0,-0.0937 0,-5.8125 0,-0.0937 0,-0.0625 c 0.06247,-0.43728 0.205355,-0.88912 0.5625,-1.28125 0.357145,-0.39213 0.946079,-0.625 1.5,-0.625 z' id='rect7011' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible'/>
+ </g>
+ <g transform='translate(-60.99995,-237)' id='layer10'/>
+ <g transform='translate(-60.99995,-237)' id='layer11'/>
+ <g transform='translate(-60.99995,-237)' id='layer12'/>
+ <g transform='translate(-60.99995,-237)' id='layer13'/>
+ <g transform='translate(-60.99995,-237)' id='layer14'/>
+ <g transform='translate(-60.99995,-237)' id='layer15'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-cellular-hspa-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/network-cellular-hspa-symbolic-ref.png
new file mode 100644
index 00000000..db5c0d07
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-cellular-hspa-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-cellular-hspa-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/network-cellular-hspa-symbolic.svg
new file mode 100644
index 00000000..98648fe5
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-cellular-hspa-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='network-cellular-hspa-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='10.53624' inkscape:cy='3.597332' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1402' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='2560' inkscape:window-y='0' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='160px' originy='20.000001px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-81.0002,-237)'>
+
+ <path inkscape:connector-curvature='0' d='m 83.0627,237 c -1.15073,0 -2.0625,0.91177 -2.0625,2.0625 l 0,11.875 c 0,1.15073 0.91177,2.0625 2.0625,2.0625 l 11.875,0 c 1.15073,0 2.0625,-0.91177 2.0625,-2.0625 l 0,-11.875 C 97.0002,237.91177 96.08843,237 94.9377,237 l -11.875,0 z m 2,3 2,0 0,4 3.9375,0 0,-4 2,0 0,10 -2,0 0,-4 -3.9375,0 0,4 -2,0 0,-10 z' id='path8649' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-81.0002,-237)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-81.0002,-237)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-81.0002,-237)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-81.0002,-237)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-81.0002,-237)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-81.0002,-237)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-81.0002,-237)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-81.0002,-237)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-cellular-no-route-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/network-cellular-no-route-symbolic-ref.png
new file mode 100644
index 00000000..6e4ec806
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-cellular-no-route-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-cellular-no-route-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/network-cellular-no-route-symbolic.svg
new file mode 100644
index 00000000..d79a0de9
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-cellular-no-route-symbolic.svg
@@ -0,0 +1,34 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='network-cellular-no-route-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='-55.351093' inkscape:cy='-14.012087' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1374' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='2.8284271'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='60px' originy='40.000001px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-181.0002,-257)'>
+ <path inkscape:connector-curvature='0' d='m 181,266 0,1.5 0,3 0,1.5 3,0 0,-1.5 0,-3 0,-1.5 -3,0 z' id='path9349' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.35;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 193,257 0,1.5 0,12 0,1.5 3,0 0,-1.5 0,-12 0,-1.5 -3,0 z' id='path9283' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.35;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+
+ <path inkscape:connector-curvature='0' d='m 188.84821,261.96875 c 1.64243,-0.092 3.0955,1.17008 3.1875,2.8125 -1e-4,1.40136 -0.37771,1.92177 -1.59375,2.84375 -0.19093,0.14364 -0.3256,0.2506 -0.375,0.3125 -0.0494,0.0621 -0.0312,0.0332 -0.0312,0.0312 0.007,0.52831 -0.47163,1 -1,1 -0.52837,0 -1.007,-0.47169 -1,-1 0,-0.50239 0.22424,-0.94342 0.46875,-1.25 0.24451,-0.30663 0.4913,-0.51638 0.71875,-0.6875 0.20405,-0.16056 0.46083,-0.38454 0.6875,-0.65625 0.0935,-0.1121 0.129,-0.30766 0.125,-0.4375 l 0,-0.0312 c -0.0316,-0.56324 -0.49926,-0.9691 -1.0625,-0.9375 -0.56324,0.0316 -0.9691,0.43676 -0.9375,1 l -2,0 c -0.092,-1.64243 1.17007,-2.9079 2.8125,-3 z m 0.1875,8 c 0.55228,0 1,0.44772 1,1 0,0.55228 -0.44772,1 -1,1 -0.55228,0 -1,-0.44772 -1,-1 0,-0.55228 0.44772,-1 1,-1 z' id='path19592-2-4-0' sodipodi:nodetypes='cccccsccccccsccccsssss' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible'/>
+ <path inkscape:connector-curvature='0' d='m 189.0002,260 0,1.03125 c 1.18009,6.5e-4 2.26171,0.53152 3,1.375 l 0,-0.90625 0,-1.5 -3,0 z m -4,3 0,1.5 0,6 0,1.5 2.40625,0 c -0.18795,-0.29798 -0.3125,-0.65775 -0.3125,-1.03125 0,-0.64943 0.37518,-1.1473 0.875,-1.5 -0.50106,-0.34778 -0.88395,-0.82431 -0.875,-1.5 0,-0.78136 0.34393,-1.41296 0.6875,-1.84375 0.0779,-0.0977 0.14017,-0.13497 0.21875,-0.21875 l -1.96875,0 a 0.93759375,0.93759375 0 0 1 -0.9375,-0.875 c -0.0416,-0.74179 0.13259,-1.43751 0.46875,-2.03125 l -0.5625,0 z m 7,4.5 c -0.28537,0.30743 -0.61426,0.58254 -1,0.875 -0.0908,0.0683 -0.16921,0.14353 -0.21875,0.1875 -0.001,0.004 -0.0299,-0.004 -0.0312,0 -0.008,0.0112 -0.0311,0.0291 -0.0312,0.0312 -0.0111,0.0116 -0.005,0.0372 -0.0312,0.0625 -0.13961,0.34068 -0.29695,0.60649 -0.59375,0.8125 0.49982,0.3527 0.875,0.85057 0.875,1.5 0,0.3735 -0.12455,0.73327 -0.3125,1.03125 l 1.34375,0 0,-1.5 0,-3 z' id='path9345' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.35;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-181.0002,-257)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-181.0002,-257)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-181.0002,-257)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-181.0002,-257)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-181.0002,-257)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-181.0002,-257)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-181.0002,-257)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-181.0002,-257)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-cellular-offline-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/network-cellular-offline-symbolic-ref.png
new file mode 100644
index 00000000..4ca107c3
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-cellular-offline-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-cellular-offline-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/network-cellular-offline-symbolic.svg
new file mode 100644
index 00000000..4bf26e27
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-cellular-offline-symbolic.svg
@@ -0,0 +1,35 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='network-cellular-offline-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='-93.44997' inkscape:cy='20.943634' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1401' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='3744' inkscape:window-y='334' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='40px' originy='40.000001px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-201.0002,-257)'>
+ <path inkscape:connector-curvature='0' d='m 213,257 0,1.5 0,6.9375 0,1.5 3,0 0,-1.5 0,-6.9375 0,-1.5 -3,0 z' id='path9289' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.35;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 209.0002,260 0,12 2,0 0.0143,-5.0625 0.98575,0 0,-6.9375 z' id='path9291' sodipodi:nodetypes='ccccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.35;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 205,263 0,1.5 0,6 0,1.5 3,0 0,-1.5 0,-6 0,-1.5 -3,0 z' id='path9293' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.35;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 201,266 0,1.5 0,3 0,1.5 3,0 0,-1.5 0,-3 0,-1.5 -3,0 z' id='path9295' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.35;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+
+ <path inkscape:connector-curvature='0' d='m 212.0002,268 1.375,0 1.125,1.09375 1.09375,-1.09375 1.40625,0 0,1.46875 -1.09375,1.0625 1.09375,1.0625 0,1.40625 -1.4375,0 -1.0625,-1.0625 -1.0625,1.0625 -1.4375,0 0,-1.40625 1.0625,-1.0625 -1.0625,-1.0625 0,-1.46875 z' id='path3761-2-3-5-4-8-9-8-0-1-7-8-3' sodipodi:nodetypes='ccccccccccccccccc' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-201.0002,-257)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-201.0002,-257)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-201.0002,-257)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-201.0002,-257)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-201.0002,-257)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-201.0002,-257)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-201.0002,-257)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-201.0002,-257)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-cellular-signal-excellent-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/network-cellular-signal-excellent-symbolic-ref.png
new file mode 100644
index 00000000..9e4df2a7
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-cellular-signal-excellent-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-cellular-signal-excellent-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/network-cellular-signal-excellent-symbolic.svg
new file mode 100644
index 00000000..b61da52c
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-cellular-signal-excellent-symbolic.svg
@@ -0,0 +1,35 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='network-cellular-signal-excellent-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.4 r9939' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='231.28381' inkscape:cy='-381.9103' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='702' inkscape:window-maximized='1' inkscape:window-width='1366' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='200px' originy='40.000001px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ <inkscape:grid color='#000000' empcolor='#000000' empopacity='0' empspacing='4' enabled='true' id='grid5968' opacity='0.1254902' originx='200px' originy='40.000001px' snapvisiblegridlinesonly='true' spacingx='0.5px' spacingy='0.5px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-41.0002,-257)'>
+ <path inkscape:connector-curvature='0' d='m 53,257 0,1.5 0,12 0,1.5 3,0 0,-1.5 0,-12 0,-1.5 -3,0 z' id='path11924' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 49,260 0,1.5 0,9 0,1.5 3,0 0,-1.5 0,-9 0,-1.5 -3,0 z' id='path11926' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 45,263 0,1.5 0,6 0,1.5 3,0 0,-1.5 0,-6 0,-1.5 -3,0 z' id='path11928' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 41,266 0,1.5 0,3 0,1.5 3,0 0,-1.5 0,-3 0,-1.5 -3,0 z' id='path11930' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-41.0002,-257)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-41.0002,-257)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-41.0002,-257)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-41.0002,-257)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-41.0002,-257)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-41.0002,-257)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-41.0002,-257)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-41.0002,-257)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-cellular-signal-good-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/network-cellular-signal-good-symbolic-ref.png
new file mode 100644
index 00000000..c33be611
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-cellular-signal-good-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-cellular-signal-good-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/network-cellular-signal-good-symbolic.svg
new file mode 100644
index 00000000..fa6ace5a
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-cellular-signal-good-symbolic.svg
@@ -0,0 +1,35 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='network-cellular-signal-good-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.4 r9939' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='211.28381' inkscape:cy='-381.9103' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='702' inkscape:window-maximized='1' inkscape:window-width='1366' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='180px' originy='40.000001px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ <inkscape:grid color='#000000' empcolor='#000000' empopacity='0' empspacing='4' enabled='true' id='grid5968' opacity='0.1254902' originx='180px' originy='40.000001px' snapvisiblegridlinesonly='true' spacingx='0.5px' spacingy='0.5px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-61.0002,-257)'>
+ <path inkscape:connector-curvature='0' d='m 73,257 0,1.5 0,12 0,1.5 3,0 0,-1.5 0,-12 0,-1.5 -3,0 z' id='path3290' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.35;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 69,260 0,1.5 0,9 0,1.5 3,0 0,-1.5 0,-9 0,-1.5 -3,0 z' id='path3292' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 65,263 0,1.5 0,6 0,1.5 3,0 0,-1.5 0,-6 0,-1.5 -3,0 z' id='path3294' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 61,266 0,1.5 0,3 0,1.5 3,0 0,-1.5 0,-3 0,-1.5 -3,0 z' id='path3296' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-61.0002,-257)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-61.0002,-257)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-61.0002,-257)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-61.0002,-257)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-61.0002,-257)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-61.0002,-257)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-61.0002,-257)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-61.0002,-257)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-cellular-signal-none-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/network-cellular-signal-none-symbolic-ref.png
new file mode 100644
index 00000000..c1fe379c
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-cellular-signal-none-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-cellular-signal-none-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/network-cellular-signal-none-symbolic.svg
new file mode 100644
index 00000000..6ae87dec
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-cellular-signal-none-symbolic.svg
@@ -0,0 +1,34 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='network-cellular-signal-none-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='-13.44997' inkscape:cy='20.943634' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1374' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='120px' originy='40.000001px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-121.0002,-257)'>
+ <path inkscape:connector-curvature='0' d='m 133,257 0,1.5 0,12 0,1.5 3,0 0,-1.5 0,-12 0,-1.5 -3,0 z' id='path4064' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.35;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 129,260 2e-4,12 3,0 -2e-4,-12 z' id='path4066' sodipodi:nodetypes='ccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:0.35;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/>
+ <path inkscape:connector-curvature='0' d='m 125,263 0,1.5 0,6 0,1.5 3,0 0,-1.5 0,-6 0,-1.5 -3,0 z' id='path4068' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.35;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 121,266 0,1.5 0,3 0,1.5 3,0 0,-1.5 0,-3 0,-1.5 -3,0 z' id='path4070' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.35;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-121.0002,-257)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-121.0002,-257)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-121.0002,-257)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-121.0002,-257)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-121.0002,-257)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-121.0002,-257)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-121.0002,-257)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-121.0002,-257)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-cellular-signal-ok-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/network-cellular-signal-ok-symbolic-ref.png
new file mode 100644
index 00000000..62a0cbb3
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-cellular-signal-ok-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-cellular-signal-ok-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/network-cellular-signal-ok-symbolic.svg
new file mode 100644
index 00000000..3798f8bc
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-cellular-signal-ok-symbolic.svg
@@ -0,0 +1,35 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='network-cellular-signal-ok-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.4 r9939' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='191.28381' inkscape:cy='-381.9103' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='702' inkscape:window-maximized='1' inkscape:window-width='1366' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='160px' originy='40.000001px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ <inkscape:grid color='#000000' empcolor='#000000' empopacity='0' empspacing='4' enabled='true' id='grid5968' opacity='0.1254902' originx='160px' originy='40.000001px' snapvisiblegridlinesonly='true' spacingx='0.5px' spacingy='0.5px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-81.0002,-257)'>
+ <path inkscape:connector-curvature='0' d='m 93,257 0,1.5 0,12 0,1.5 3,0 0,-1.5 0,-12 0,-1.5 -3,0 z' id='path4074' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.35;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 89,260 0,1.5 0,9 0,1.5 3,0 0,-1.5 0,-9 0,-1.5 -3,0 z' id='path4076' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.35;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 85,263 0,1.5 0,6 0,1.5 3,0 0,-1.5 0,-6 0,-1.5 -3,0 z' id='path4078' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 81,266 0,1.5 0,3 0,1.5 3,0 0,-1.5 0,-3 0,-1.5 -3,0 z' id='path4080' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-81.0002,-257)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-81.0002,-257)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-81.0002,-257)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-81.0002,-257)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-81.0002,-257)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-81.0002,-257)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-81.0002,-257)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-81.0002,-257)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-cellular-signal-weak-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/network-cellular-signal-weak-symbolic-ref.png
new file mode 100644
index 00000000..2e00a48a
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-cellular-signal-weak-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-cellular-signal-weak-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/network-cellular-signal-weak-symbolic.svg
new file mode 100644
index 00000000..19ceedcb
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-cellular-signal-weak-symbolic.svg
@@ -0,0 +1,35 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='network-cellular-signal-weak-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.4 r9939' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='171.28381' inkscape:cy='-381.9103' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='702' inkscape:window-maximized='1' inkscape:window-width='1366' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='140px' originy='40.000001px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ <inkscape:grid color='#000000' empcolor='#000000' empopacity='0' empspacing='4' enabled='true' id='grid5968' opacity='0.1254902' originx='140px' originy='40.000001px' snapvisiblegridlinesonly='true' spacingx='0.5px' spacingy='0.5px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-101.0002,-257)'>
+ <path inkscape:connector-curvature='0' d='m 113,257 0,1.5 0,12 0,1.5 3,0 0,-1.5 0,-12 0,-1.5 -3,0 z' id='path4086' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.35;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 109,260 0,1.5 0,9 0,1.5 3,0 0,-1.5 0,-9 0,-1.5 -3,0 z' id='path4088' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.35;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 105,263 0,1.5 0,6 0,1.5 3,0 0,-1.5 0,-6 0,-1.5 -3,0 z' id='path4090' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.35;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 101,266 0,1.5 0,3 0,1.5 3,0 0,-1.5 0,-3 0,-1.5 -3,0 z' id='path4092' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-101.0002,-257)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-101.0002,-257)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-101.0002,-257)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-101.0002,-257)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-101.0002,-257)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-101.0002,-257)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-101.0002,-257)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-101.0002,-257)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-error-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/network-error-symbolic-ref.png
new file mode 100644
index 00000000..db48cdf8
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-error-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-error-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/network-error-symbolic.svg
new file mode 100644
index 00000000..16eb57f3
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-error-symbolic.svg
@@ -0,0 +1,33 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='network-error-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16.000017' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='-125.06683' inkscape:cy='7.571767' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='702' inkscape:window-maximized='1' inkscape:window-width='1366' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-119.99998px' originy='-40.000003px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-361.00018,-177)'>
+
+ <path inkscape:connector-curvature='0' d='m 366.0002,184 c -0.30943,4e-5 -0.61463,0.0905 -0.8125,0.28125 L 361.59395,188 l 3.65625,3.71875 c 0.19771,0.19101 0.44055,0.28124 0.75,0.28125 l 1,0 0,-1 c -5e-5,-0.25688 -0.12958,-0.52871 -0.3125,-0.71875 L 365.40645,189 l 3.62501,0 c 0.0217,-0.27718 0.11278,-1 0.72266,-2 l -4.37892,0 1.21875,-1.28125 c 0.18273,-0.19024 0.40624,-0.46185 0.40625,-0.71875 l 0,-1 z' id='path16213' sodipodi:nodetypes='cccccccccccccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.5;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.99999976;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path class='error' inkscape:connector-curvature='0' d='m 373.5002,186 c -1.93299,0 -3.5,1.56701 -3.5,3.5 0,1.93299 1.56701,3.5 3.5,3.5 1.93299,0 3.5,-1.56701 3.5,-3.5 0,-1.93299 -1.56701,-3.5 -3.5,-3.5 z m -2.5,2.96875 5,0 0,1.03125 -5,0 0,-1.03125 z' id='path16215' style='color:#bebebe;fill:#ef2929;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.90939796;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='M 373.48067,185.03125 376.40645,182 372.7502,178.28125 c -0.19771,-0.19101 -0.44055,-0.28124 -0.75,-0.28125 l -1,0 0,1 c 5e-5,0.25688 0.12958,0.52871 0.3125,0.71875 l 1.28125,1.28125 -4.59374,0 c -0.52831,-0.007 -1,0.47164 -1,1 0,0.52836 0.47169,1.00747 1,1 l 4.62499,0 -1.21875,1.28125 c -0.18273,0.19024 -0.40624,0.46185 -0.40625,0.71875 l 0,0.42578 c 0.62016,-0.37715 1.90848,-0.50701 2.48047,-0.39453 z' id='path16217' sodipodi:nodetypes='cccccccccscccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.5;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.99999976;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-361.00018,-177)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-361.00018,-177)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-361.00018,-177)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-361.00018,-177)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-361.00018,-177)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-361.00018,-177)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-361.00018,-177)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-361.00018,-177)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-idle-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/network-idle-symbolic-ref.png
new file mode 100644
index 00000000..4caa1a14
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-idle-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-idle-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/network-idle-symbolic.svg
new file mode 100644
index 00000000..c30bf68e
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-idle-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='network-idle-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='-105.06683' inkscape:cy='7.571767' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='702' inkscape:window-maximized='1' inkscape:window-width='1366' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-99.999983px' originy='-40.000003px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-341.00018,-177)'>
+
+ <path inkscape:connector-curvature='0' d='m 352.0002,186 c 0.30943,-4e-5 0.61463,-0.0905 0.8125,-0.28125 L 356.40645,182 352.7502,178.28125 c -0.19771,-0.19101 -0.44055,-0.28124 -0.75,-0.28125 l -1,0 0,1 c 5e-5,0.25688 0.12958,0.52871 0.3125,0.71875 l 1.28125,1.28125 -4.59374,0 c -0.52831,-0.007 -1,0.47164 -1,1 0,0.52836 0.47169,1.00747 1,1 l 4.62499,0 -1.21875,1.28125 c -0.18273,0.19024 -0.40624,0.46185 -0.40625,0.71875 l 0,1 z' id='path16205' sodipodi:nodetypes='ccccccccccscccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.5;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.99999976;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 346.0002,184 c -0.30943,4e-5 -0.61463,0.0905 -0.8125,0.28125 L 341.59395,188 l 3.65625,3.71875 c 0.19771,0.19101 0.44055,0.28124 0.75,0.28125 l 1,0 0,-1 c -5e-5,-0.25688 -0.12958,-0.52871 -0.3125,-0.71875 L 345.40645,189 l 4.59376,0 c 0.52831,0.007 1,-0.47164 1,-1 0,-0.52836 -0.47169,-1.00747 -1,-1 l -4.62501,0 1.21875,-1.28125 c 0.18273,-0.19024 0.40624,-0.46185 0.40625,-0.71875 l 0,-1 z' id='path16207' sodipodi:nodetypes='ccccccccccscccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.5;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.99999976;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-341.00018,-177)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-341.00018,-177)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-341.00018,-177)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-341.00018,-177)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-341.00018,-177)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-341.00018,-177)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-341.00018,-177)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-341.00018,-177)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-no-route-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/network-no-route-symbolic-ref.png
new file mode 100644
index 00000000..dd4a150a
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-no-route-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-no-route-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/network-no-route-symbolic.svg
new file mode 100644
index 00000000..05e8fbe5
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-no-route-symbolic.svg
@@ -0,0 +1,39 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='network-no-route-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='-173.72294' inkscape:cy='-12.068952' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1374' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='60.000002px' originy='-40px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <clipPath clipPathUnits='userSpaceOnUse' id='clipPath6254-6'>
+ <rect height='4.8783236' id='rect6256-6' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible' width='1.876245' x='26.998718' y='221.50153'/>
+ </clipPath>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-181.0002,-177)'>
+ <path inkscape:connector-curvature='0' d='m 188.84821,181.96875 c 1.64243,-0.092 3.0955,1.17008 3.1875,2.8125 -1e-4,1.40136 -0.37771,1.92177 -1.59375,2.84375 -0.19093,0.14364 -0.3256,0.2506 -0.375,0.3125 -0.0494,0.0621 -0.0312,0.0332 -0.0312,0.0312 0.007,0.52831 -0.47163,1 -1,1 -0.52837,0 -1.007,-0.47169 -1,-1 0,-0.50239 0.22424,-0.94342 0.46875,-1.25 0.24451,-0.30663 0.4913,-0.51638 0.71875,-0.6875 0.20405,-0.16056 0.46083,-0.38454 0.6875,-0.65625 0.0935,-0.1121 0.129,-0.30766 0.125,-0.4375 l 0,-0.0312 c -0.0316,-0.56324 -0.49926,-0.9691 -1.0625,-0.9375 -0.56324,0.0316 -0.9691,0.43676 -0.9375,1 l -2,0 c -0.092,-1.64243 1.17007,-2.9079 2.8125,-3 z m 0.1875,8 c 0.55228,0 1,0.44772 1,1 0,0.55228 -0.44772,1 -1,1 -0.55228,0 -1,-0.44772 -1,-1 0,-0.55228 0.44772,-1 1,-1 z' id='path19592-2' sodipodi:nodetypes='cccccsccccccsccccsssss' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible'/>
+
+ <path clip-path='url(#clipPath6254-6)' inkscape:connector-curvature='0' d='m 27.125,221.3125 a 0.36160181,0.36160181 0 0 0 -0.21875,0.59375 0.36160181,0.36160181 0 0 0 0.03125,0.0312 c 1.106624,1.10662 1.106624,2.89338 0,4 a 0.36160181,0.36160181 0 1 0 0.5,0.5 c 1.382968,-1.38297 1.382968,-3.61703 0,-5 a 0.36160181,0.36160181 0 0 0 -0.3125,-0.125 z' id='path14835' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.35;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:0.7231313;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans' transform='matrix(0,-2.66667,2.8685171,0,-453.37427,255)'/>
+ <path inkscape:connector-curvature='0' d='m 186.0002,187 1.01562,0 c 0.0239,-0.34343 0.13908,-0.71932 0.51425,-1 l -1.52988,0 z' id='path14861' sodipodi:nodetypes='ccccc' style='opacity:0.35;fill:#bebebe;fill-opacity:1;stroke:none'/>
+ <path inkscape:connector-curvature='0' d='m 184.0002,185 1.01562,0 c -0.0156,-0.68021 0.10253,-1.65205 0.66407,-2.18017 C 185.09617,183 184.43282,183.50337 184.0002,184 z' id='path15371' sodipodi:nodetypes='ccccc' style='opacity:0.35;fill:#bebebe;fill-opacity:1;stroke:none'/>
+ <path inkscape:connector-curvature='0' d='m 194.0002,185 -1.01563,0 c 0.0156,-0.68021 -0.10252,-1.65205 -0.66406,-2.18017 0.58372,0.18017 1.24706,0.68354 1.67969,1.18017 z' id='path15375' sodipodi:nodetypes='ccccc' style='opacity:0.35;fill:#bebebe;fill-opacity:1;stroke:none'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-181.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-181.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-181.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-181.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-181.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-181.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-181.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-181.0002,-177)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-offline-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/network-offline-symbolic-ref.png
new file mode 100644
index 00000000..058446cd
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-offline-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-offline-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/network-offline-symbolic.svg
new file mode 100644
index 00000000..13271cd5
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-offline-symbolic.svg
@@ -0,0 +1,34 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='network-offline-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16.000031' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='-293.44995' inkscape:cy='-59.05637' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1401' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='2560' inkscape:window-y='0' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-159.99998px' originy='-40.000003px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-401.00018,-177)'>
+
+
+ <path inkscape:connector-curvature='0' d='m 406.0002,184 c -0.30943,4e-5 -0.61463,0.0905 -0.8125,0.28125 L 401.59395,188 l 3.65625,3.71875 c 0.19771,0.19101 0.44055,0.28124 0.75,0.28125 l 1,0 0,-1 c -5e-5,-0.25688 -0.12958,-0.52871 -0.3125,-0.71875 L 405.40645,189 l 5.59375,0 0,-2 -5.625,0 1.21875,-1.28125 c 0.18273,-0.19024 0.40624,-0.46185 0.40625,-0.71875 l 0,-1 z' id='path16225' sodipodi:nodetypes='cccccccccccccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.5;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.99999976;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 412.00018,188 1.375,0 1.125,1.09375 1.09375,-1.09375 1.40625,0 0,1.46875 -1.09375,1.0625 1.09375,1.0625 0,1.40625 -1.4375,0 -1.0625,-1.0625 -1.0625,1.0625 -1.4375,0 0,-1.40625 1.0625,-1.0625 -1.0625,-1.0625 0,-1.46875 z' id='path3761-2-3-5-4-8-9-8-0-1-7-8-8' sodipodi:nodetypes='ccccccccccccccccc' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible'/>
+ <path inkscape:connector-curvature='0' d='m 412.0002,186 c 0.30943,-4e-5 0.61463,-0.0905 0.8125,-0.28125 L 416.40645,182 412.7502,178.28125 c -0.19771,-0.19101 -0.44055,-0.28124 -0.75,-0.28125 l -1,0 0,1 c 5e-5,0.25688 0.12958,0.52871 0.3125,0.71875 l 1.28125,1.28125 -4.59374,0 c -0.52831,-0.007 -1,0.47164 -1,1 0,0.52836 0.47169,1.00747 1,1 l 4.62499,0 -1.21875,1.28125 c -0.18273,0.19024 -0.40624,0.46185 -0.40625,0.71875 l 0,1 z' id='path16205-6' sodipodi:nodetypes='ccccccccccscccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.5;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.99999976;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-401.00018,-177)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-401.00018,-177)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-401.00018,-177)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-401.00018,-177)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-401.00018,-177)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-401.00018,-177)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-401.00018,-177)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-401.00018,-177)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-receive-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/network-receive-symbolic-ref.png
new file mode 100644
index 00000000..efbc271e
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-receive-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-receive-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/network-receive-symbolic.svg
new file mode 100644
index 00000000..7109d110
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-receive-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='network-receive-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='-85.066862' inkscape:cy='7.571767' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='702' inkscape:window-maximized='1' inkscape:window-width='1366' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-80.000014px' originy='-40.000003px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-321.00021,-177)'>
+
+ <path inkscape:connector-curvature='0' d='m 326.0002,184 c -0.30943,4e-5 -0.61463,0.0905 -0.8125,0.28125 L 321.59395,188 l 3.65625,3.71875 c 0.19771,0.19101 0.44055,0.28124 0.75,0.28125 l 1,0 0,-1 c -5e-5,-0.25688 -0.12958,-0.52871 -0.3125,-0.71875 L 325.40645,189 l 4.59374,0 c 0.52831,0.007 1,-0.47164 1,-1 0,-0.52836 -0.47169,-1.00747 -1,-1 l -4.62499,0 1.21875,-1.28125 c 0.18273,-0.19024 0.40624,-0.46185 0.40625,-0.71875 l 0,-1 z' id='path16189' sodipodi:nodetypes='ccccccccccscccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.99999976;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 332.0002,186 c 0.30943,-4e-5 0.61463,-0.0905 0.8125,-0.28125 L 336.40645,182 332.7502,178.28125 c -0.19771,-0.19101 -0.44055,-0.28124 -0.75,-0.28125 l -1,0 0,1 c 5e-5,0.25688 0.12958,0.52871 0.3125,0.71875 l 1.28125,1.28125 -4.59376,0 c -0.52831,-0.007 -1,0.47164 -1,1 0,0.52836 0.47169,1.00747 1,1 l 4.62501,0 -1.21875,1.28125 c -0.18273,0.19024 -0.40624,0.46185 -0.40625,0.71875 l 0,1 z' id='path16191' sodipodi:nodetypes='ccccccccccscccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.5;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.99999976;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-321.00021,-177)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-321.00021,-177)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-321.00021,-177)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-321.00021,-177)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-321.00021,-177)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-321.00021,-177)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-321.00021,-177)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-321.00021,-177)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-server-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/network-server-symbolic-ref.png
new file mode 100644
index 00000000..807e7193
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-server-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-server-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/network-server-symbolic.svg
new file mode 100644
index 00000000..2a365585
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-server-symbolic.svg
@@ -0,0 +1,35 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='network-server-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.4 r9939' version='1.1' width='16.000002' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer13' inkscape:cx='-228.71619' inkscape:cy='-463.9103' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='702' inkscape:window-maximized='1' inkscape:window-width='1366' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='-260px' originy='-42px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ <inkscape:grid color='#000000' empcolor='#000000' empopacity='0' empspacing='4' enabled='true' id='grid5968' opacity='0.1254902' originx='-260px' originy='-42px' snapvisiblegridlinesonly='true' spacingx='0.5px' spacingy='0.5px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-501.0002,-175)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-501.0002,-175)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-501.0002,-175)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-501.0002,-175)'>
+ <path inkscape:connector-curvature='0' d='m 507.0002,187 0,2 -5.53125,0 c -0.26299,0 -0.46875,0.2057 -0.46875,0.4688 l 0,1.0624 c 0,0.263 0.20576,0.4688 0.46875,0.4688 4.35417,0 8.70833,0 13.0625,0 0.26299,0 0.46875,-0.2058 0.46875,-0.4688 l 0,-1.0624 c 0,-0.263 -0.20575,-0.4688 -0.46875,-0.4688 l -5.53125,0 0,-2 z' id='path11106' sodipodi:nodetypes='ccsssccsssccc' style='fill:#bebebe;fill-opacity:1;stroke:none;display:inline'/>
+
+ <path inkscape:connector-curvature='0' d='m 505,175 c -1.0907,0 -2,0.9093 -2,2 l 0,8 c 0,1.0907 0.9093,2 2,2 l 6,0 c 1.0907,0 2,-0.9093 2,-2 l 0,-8 c 0,-1.0907 -0.9093,-2 -2,-2 l -6,0 z m 0,2 6,0 0,8 -6,0 0,-8 z' id='rect11110' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <rect height='1' id='rect11880' style='color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' width='4.0000014' x='506.00021' y='178'/>
+ <rect height='1' id='rect11882' style='color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' width='0.99999839' x='509.00021' y='180'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-501.0002,-175)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-501.0002,-175)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-501.0002,-175)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-501.0002,-175)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-501.0002,-175)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-transmit-receive-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/network-transmit-receive-symbolic-ref.png
new file mode 100644
index 00000000..6125efb7
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-transmit-receive-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-transmit-receive-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/network-transmit-receive-symbolic.svg
new file mode 100644
index 00000000..05cce2a1
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-transmit-receive-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='network-transmit-receive-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='-45.066862' inkscape:cy='7.571767' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='702' inkscape:window-maximized='1' inkscape:window-width='1366' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-40.000014px' originy='-40.000003px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-281.00021,-177)'>
+
+ <path inkscape:connector-curvature='0' d='m 286.0002,184 c -0.30943,4e-5 -0.61463,0.0905 -0.8125,0.28125 L 281.59395,188 l 3.65625,3.71875 c 0.19771,0.19101 0.44055,0.28124 0.75,0.28125 l 1,0 0,-1 c -5e-5,-0.25688 -0.12958,-0.52871 -0.3125,-0.71875 L 285.40645,189 l 4.59374,0 c 0.52831,0.007 1,-0.47164 1,-1 0,-0.52836 -0.47169,-1.00747 -1,-1 l -4.62499,0 1.21875,-1.28125 c 0.18273,-0.19024 0.40624,-0.46185 0.40625,-0.71875 l 0,-1 z' id='path16181' sodipodi:nodetypes='ccccccccccscccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.99999976;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 292.59394,186 c 0.30943,-4e-5 0.61463,-0.0905 0.8125,-0.28125 L 297.00019,182 l -3.65625,-3.71875 c -0.19771,-0.19101 -0.44055,-0.28124 -0.75,-0.28125 l -1,0 0,1 c 5e-5,0.25688 0.12958,0.52871 0.3125,0.71875 l 1.28125,1.28125 -5.1875,0 c -0.52831,-0.007 -1,0.47164 -1,1 0,0.52836 0.47169,1.00747 1,1 l 5.21875,0 -1.21875,1.28125 c -0.18273,0.19024 -0.40624,0.46185 -0.40625,0.71875 l 0,1 z' id='path16183' sodipodi:nodetypes='ccccccccccscccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.99999976;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-281.00021,-177)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-281.00021,-177)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-281.00021,-177)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-281.00021,-177)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-281.00021,-177)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-281.00021,-177)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-281.00021,-177)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-281.00021,-177)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-transmit-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/network-transmit-symbolic-ref.png
new file mode 100644
index 00000000..599fc121
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-transmit-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-transmit-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/network-transmit-symbolic.svg
new file mode 100644
index 00000000..8a6c05e1
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-transmit-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='network-transmit-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='-65.066831' inkscape:cy='7.571767' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='702' inkscape:window-maximized='1' inkscape:window-width='1366' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-59.999983px' originy='-40.000003px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-301.00018,-177)'>
+
+ <path inkscape:connector-curvature='0' d='m 312.0002,186 c 0.30943,-4e-5 0.61463,-0.0905 0.8125,-0.28125 L 316.40645,182 312.7502,178.28125 c -0.19771,-0.19101 -0.44055,-0.28124 -0.75,-0.28125 l -1,0 0,1 c 5e-5,0.25688 0.12958,0.52871 0.3125,0.71875 l 1.28125,1.28125 -4.59374,0 c -0.52831,-0.007 -1,0.47164 -1,1 0,0.52836 0.47169,1.00747 1,1 l 4.62499,0 -1.21875,1.28125 c -0.18273,0.19024 -0.40624,0.46185 -0.40625,0.71875 l 0,1 z' id='path16197' sodipodi:nodetypes='ccccccccccscccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.99999976;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 306.0002,184 c -0.30943,4e-5 -0.61463,0.0905 -0.8125,0.28125 L 301.59395,188 l 3.65625,3.71875 c 0.19771,0.19101 0.44055,0.28124 0.75,0.28125 l 1,0 0,-1 c -5e-5,-0.25688 -0.12958,-0.52871 -0.3125,-0.71875 L 305.40645,189 l 4.59376,0 c 0.52831,0.007 1,-0.47164 1,-1 0,-0.52836 -0.47169,-1.00747 -1,-1 l -4.62501,0 1.21875,-1.28125 c 0.18273,-0.19024 0.40624,-0.46185 0.40625,-0.71875 l 0,-1 z' id='path16199' sodipodi:nodetypes='ccccccccccscccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.5;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.99999976;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-301.00018,-177)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-301.00018,-177)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-301.00018,-177)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-301.00018,-177)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-301.00018,-177)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-301.00018,-177)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-301.00018,-177)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-301.00018,-177)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-vpn-acquiring-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/network-vpn-acquiring-symbolic-ref.png
new file mode 100644
index 00000000..f0a506b4
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-vpn-acquiring-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-vpn-acquiring-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/network-vpn-acquiring-symbolic.svg
new file mode 100644
index 00000000..1f4690d6
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-vpn-acquiring-symbolic.svg
@@ -0,0 +1,39 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='network-vpn-acquiring-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.91 r13725' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='42.167504' inkscape:cy='11.792804' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='false' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='8'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='0' originy='20' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-241.0002,-237)'>
+
+ <path inkscape:connector-curvature='0' d='m 245.0002,248 0,1.00977 3,0 0,0.99023 -5,0 0,2 12,0 0,-2 -5,0 0,-0.99023 3,0 0,-1.00977 -8,0 z' id='path4998' style='color:#bebebe;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.5;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 249.0002,238 c -1.64501,0 -3,1.355 -3,3 l 0,1 -1,0 0,1.00977 8,0 0,-1.00977 -1,0 0,-1 c 0,-1.645 -1.35499,-3 -3,-3 z m 0,2 c 0.56413,0 1,0.43588 1,1 l 0,1 -2,0 0,-1 c 0,-0.56412 0.43587,-1 1,-1 z' id='rect5002' style='color:#bebebe;display:inline;overflow:visible;visibility:visible;opacity:0.5;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none'/>
+ <circle cx='244.5002' cy='245.5' id='path4955-1-1' r='1.5' style='display:inline;fill:#bebebe;fill-opacity:1;stroke:none'/>
+ <circle cx='248.5002' cy='245.5' id='path4957-2-6' r='1.5' style='display:inline;fill:#bebebe;fill-opacity:1;stroke:none'/>
+ <circle cx='252.5002' cy='245.5' id='path4959-4-4' r='1.5' style='display:inline;fill:#bebebe;fill-opacity:1;stroke:none'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-241.0002,-237)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-241.0002,-237)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-241.0002,-237)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-241.0002,-237)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-241.0002,-237)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-241.0002,-237)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-241.0002,-237)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-241.0002,-237)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-vpn-no-route-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/network-vpn-no-route-symbolic-ref.png
new file mode 100644
index 00000000..ec24dbc4
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-vpn-no-route-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-vpn-no-route-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/network-vpn-no-route-symbolic.svg
new file mode 100644
index 00000000..2992a0c3
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-vpn-no-route-symbolic.svg
@@ -0,0 +1,36 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='network-vpn-no-route-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.92+devel unknown' viewBox='0 0 16 16' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='7.47826' inkscape:cy='37.763981' inkscape:document-rotation='0' inkscape:document-units='px' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:measure-end='0,0' inkscape:measure-start='-190.687,-191.14' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='3440' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-20' originy='20' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-261.0002,-237)'>
+
+ <path inkscape:connector-curvature='0' d='m 269.0002,238 c -1.64501,0 -3,1.355 -3,3 v 1 h -1 v 6 h 2.0625 c -1.7e-4,-0.0138 -0.006,-0.0251 -0.006,-0.0391 0.003,-0.78968 0.33297,-1.41878 0.67969,-1.85352 0.0567,-0.0711 0.10679,-0.0945 0.16406,-0.1582 h -1.86519 a 0.98075356,0.98075356 0 0 1 -0.97852,-0.92578 c -0.10596,-1.89176 1.20441,-3.45619 2.94336,-3.90625 V 241 c 0,-0.56412 0.43587,-1 1,-1 0.56413,0 1,0.43588 1,1 v 0.12695 c 1.60614,0.41185 2.86407,1.78473 3,3.51367 V 242 h -1 v -1 c 0,-1.645 -1.35499,-3 -3,-3 z m 4,7.16406 c -0.0357,0.63291 -0.16241,1.20872 -0.45898,1.71485 -0.25539,0.4358 -0.61577,0.7806 -1.02149,1.12109 h 1.48047 z m -3.85742,2.39844 c -0.006,0.0131 -0.0196,0.0471 -0.0195,0.0469 6e-5,-1.6e-4 -0.0293,0.0821 -0.0293,0.082 0.002,-0.004 0.007,-0.0134 0.01,-0.0215 0.0141,-0.0393 0.0335,-0.0953 0.0391,-0.10742 z M 263.0002,250 v 2 h 4.35742 c -0.18818,-0.30237 -0.30273,-0.65382 -0.30273,-1.03125 0,-0.37061 0.12851,-0.68994 0.32226,-0.96875 z m 7.69336,0 c 0.19375,0.27881 0.32226,0.59814 0.32226,0.96875 0,0.37743 -0.11455,0.72888 -0.30273,1.03125 h 4.28711 v -2 z' id='path5551' style='color:#bebebe;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.5;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 268.84821,241.96875 c 1.64243,-0.092 3.0955,1.17008 3.1875,2.8125 -10e-5,1.40136 -0.37771,1.92177 -1.59375,2.84375 -0.19093,0.14364 -0.3256,0.2506 -0.375,0.3125 -0.0494,0.0621 -0.0312,0.0332 -0.0312,0.0312 0.007,0.52831 -0.47163,1 -1,1 -0.52837,0 -1.007,-0.47169 -1,-1 0,-0.50239 0.22424,-0.94342 0.46875,-1.25 0.24451,-0.30663 0.4913,-0.51638 0.71875,-0.6875 0.20405,-0.16056 0.46083,-0.38454 0.6875,-0.65625 0.0935,-0.1121 0.129,-0.30766 0.125,-0.4375 v -0.0312 c -0.0316,-0.56324 -0.49926,-0.9691 -1.0625,-0.9375 -0.56324,0.0316 -0.9691,0.43676 -0.9375,1 h -2 c -0.092,-1.64243 1.17007,-2.9079 2.8125,-3 z m 0.1875,8 c 0.55228,0 1,0.44772 1,1 0,0.55228 -0.44772,1 -1,1 -0.55228,0 -1,-0.44772 -1,-1 0,-0.55228 0.44772,-1 1,-1 z' id='path19592-2-4-9-8' sodipodi:nodetypes='cccccsccccccsccccsssss' style='color:#bebebe;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-261.0002,-237)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-261.0002,-237)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-261.0002,-237)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-261.0002,-237)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-261.0002,-237)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-261.0002,-237)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-261.0002,-237)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-261.0002,-237)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-vpn-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/network-vpn-symbolic-ref.png
new file mode 100644
index 00000000..82e8da9b
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-vpn-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-vpn-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/network-vpn-symbolic.svg
new file mode 100644
index 00000000..a3be035a
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-vpn-symbolic.svg
@@ -0,0 +1,35 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:svg='http://www.w3.org/2000/svg' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' sodipodi:docname='network-vpn-symbolic.svg' version='1.1' inkscape:version='0.48.1 r9760' height='16' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:cy='9.416826' pagecolor='#555753' borderopacity='1' showborder='false' inkscape:bbox-paths='false' guidetolerance='10' inkscape:object-paths='true' inkscape:window-width='1296' showguides='true' inkscape:object-nodes='true' inkscape:snap-bbox='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:snap-nodes='false' bordercolor='#666666' objecttolerance='10' id='namedview88' showgrid='false' inkscape:window-maximized='0' inkscape:window-x='1941' inkscape:snap-global='true' inkscape:window-y='81' gridtolerance='10' inkscape:window-height='1013' inkscape:snap-to-guides='true' inkscape:current-layer='layer9' inkscape:snap-bbox-midpoints='false' inkscape:zoom='1' inkscape:cx='12.563336' inkscape:snap-grids='true' inkscape:pageopacity='1'>
+ <inkscape:grid spacingx='1px' spacingy='1px' id='grid4866' empspacing='2' enabled='true' type='xygrid' snapvisiblegridlinesonly='true' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:label='status' transform='translate(-221.0002,-237)' inkscape:groupmode='layer' id='layer9' style='display:inline'>
+ <g inkscape:label='lock' transform='translate(201.0002,-39)' id='g13201' style='fill:#bebebe;fill-opacity:1'>
+
+ </g>
+ <path inkscape:connector-curvature='0' d='m 228,247 0,3 2,0 0,-3 -2,0 z' id='path12679-6' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 223,250 0,2 12,0 0,-2 -12,0 z' id='path12681-3' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <rect x='224.99995' y='242' id='rect13312' height='6' ry='0' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible' width='8'/>
+ <path inkscape:connector-curvature='0' d='m 228.99997,238.00041 c -1.64501,0 -3,1.355 -3,3 l 0,2 0,1.00001 1,0 4,0 1,0 0,-1.00001 0,-2 c 0,-1.645 -1.35499,-3 -3,-3 z m 0,2 c 0.56413,0 1,0.43588 1,1 l 0,1 -2,0 0,-1 c 0,-0.56412 0.43587,-1 1,-1 z' id='path13314' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+ <g inkscape:label='devices' transform='translate(-221.0002,-237)' inkscape:groupmode='layer' id='layer10'/>
+ <g inkscape:label='apps' transform='translate(-221.0002,-237)' inkscape:groupmode='layer' id='layer11'/>
+ <g inkscape:label='actions' transform='translate(-221.0002,-237)' inkscape:groupmode='layer' id='layer12'/>
+ <g inkscape:label='places' transform='translate(-221.0002,-237)' inkscape:groupmode='layer' id='layer13'/>
+ <g inkscape:label='mimetypes' transform='translate(-221.0002,-237)' inkscape:groupmode='layer' id='layer14'/>
+ <g inkscape:label='emblems' transform='translate(-221.0002,-237)' inkscape:groupmode='layer' id='layer15' style='display:inline'/>
+ <g inkscape:label='categories' transform='translate(-221.0002,-237)' inkscape:groupmode='layer' id='g4953' style='display:inline'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-wired-acquiring-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/network-wired-acquiring-symbolic-ref.png
new file mode 100644
index 00000000..e1095e3f
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-wired-acquiring-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-wired-acquiring-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/network-wired-acquiring-symbolic.svg
new file mode 100644
index 00000000..ab5fec5c
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-wired-acquiring-symbolic.svg
@@ -0,0 +1,41 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='network-wired-acquiring-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.91 r13725' width='16.04027' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='18.825615' inkscape:cy='9.828952' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='false' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='16'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-19.975767' originy='-40' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-260.97597,-177)'>
+
+ <rect height='4.9718447' id='rect12733' style='color:#bebebe;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.35;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate' width='5.0160389' x='260.97595' y='187.98824'/>
+ <rect height='4.9718447' id='rect12735' style='color:#bebebe;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.35;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate' width='5.0160389' x='266.00018' y='178.02815'/>
+ <rect height='4.9718447' id='rect12737' style='color:#bebebe;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.35;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate' width='5.0160389' x='272.00018' y='188.02815'/>
+ <rect height='2.9971614' id='rect11487' rx='1.4961299' ry='1.4961299' style='color:#000000;clip-rule:nonzero;display:block;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new' width='2.9922597' x='263.02185' y='184.04089'/>
+ <rect height='2.9971614' id='rect11504' rx='1.4961299' ry='1.4961299' style='color:#000000;clip-rule:nonzero;display:block;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new' width='2.9922597' x='267.02185' y='184.04089'/>
+ <rect height='2.9971614' id='rect11506' rx='1.4961299' ry='1.4961299' style='color:#000000;clip-rule:nonzero;display:block;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new' width='2.9922597' x='267.02185' y='184.04089'/>
+ <rect height='2.9971614' id='rect11528' rx='1.4961299' ry='1.4961299' style='color:#000000;clip-rule:nonzero;display:block;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new' width='2.9922597' x='271.02185' y='184.04089'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-260.97597,-177)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-260.97597,-177)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-260.97597,-177)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-260.97597,-177)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-260.97597,-177)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-260.97597,-177)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-260.97597,-177)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-260.97597,-177)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-wired-disconnected-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/network-wired-disconnected-symbolic-ref.png
new file mode 100644
index 00000000..badfc350
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-wired-disconnected-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-wired-disconnected-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/network-wired-disconnected-symbolic.svg
new file mode 100644
index 00000000..79de685f
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-wired-disconnected-symbolic.svg
@@ -0,0 +1,36 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='network-wired-disconnected-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.91 r13725' width='16.000002' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='-325.91995' inkscape:cy='-109.25482' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='1.6357422e-06' originy='-40' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-241.0002,-177)'>
+
+ <path inkscape:connector-curvature='0' d='m 246.0002,178 0,5 2,0 0,2 -4.96875,0 0,3 -2.03125,0 0,4.9375 5,0 0,-4.9375 -1.96875,0 0,-2 8.96875,0 0,0.98353 1,0 0,-1.98353 -5,0 0,-2 2,0 0,-5 z' id='rect8421-6' sodipodi:nodetypes='ccccccccccccccccccccc' style='color:#bebebe;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.35;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 252.0002,188 1.375,0 1.125,1.09375 1.09375,-1.09375 1.40625,0 0,1.46875 -1.09375,1.0625 1.09375,1.0625 0,1.40625 -1.4375,0 -1.0625,-1.0625 -1.0625,1.0625 -1.4375,0 0,-1.40625 1.0625,-1.0625 -1.0625,-1.0625 0,-1.46875 z' id='path3761-2-3-5-4-8-9-8-0-1-7-8-7' sodipodi:nodetypes='ccccccccccccccccc' style='color:#bebebe;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-241.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-241.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-241.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-241.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-241.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-241.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-241.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-241.0002,-177)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-wired-no-route-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/network-wired-no-route-symbolic-ref.png
new file mode 100644
index 00000000..bad4e7e3
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-wired-no-route-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-wired-no-route-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/network-wired-no-route-symbolic.svg
new file mode 100644
index 00000000..41e75e7b
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-wired-no-route-symbolic.svg
@@ -0,0 +1,38 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='network-wired-no-route-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.91 r13725' width='16.04027' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='-365.89572' inkscape:cy='-109.25482' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-39.975767' originy='-40' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-280.97597,-177)'>
+
+ <rect height='4.9718447' id='rect12749' style='color:#bebebe;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.35;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate' width='5.0160389' x='280.97595' y='187.98824'/>
+ <path inkscape:connector-curvature='0' d='m 286.0002,178.02734 0,3.0293 c 0.77852,-0.59559 1.72768,-0.97653 2.73828,-1.0332 0.80765,-0.0452 1.57687,0.12717 2.27734,0.4375 l 0,-2.4336 -5.01562,0 z' id='rect12751' style='color:#bebebe;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.35;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ <rect height='4.9718447' id='rect12753' style='color:#bebebe;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.35;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate' width='5.0160389' x='292.00018' y='188.02815'/>
+ <path inkscape:connector-curvature='0' d='m 288.84821,181.96875 c 1.64243,-0.092 3.0955,1.17008 3.1875,2.8125 -10e-5,1.40136 -0.37771,1.92177 -1.59375,2.84375 -0.19093,0.14364 -0.3256,0.2506 -0.375,0.3125 -0.0494,0.0621 -0.0312,0.0332 -0.0312,0.0312 0.007,0.52831 -0.47163,1 -1,1 -0.52837,0 -1.007,-0.47169 -1,-1 0,-0.50239 0.22424,-0.94342 0.46875,-1.25 0.24451,-0.30663 0.4913,-0.51638 0.71875,-0.6875 0.20405,-0.16056 0.46083,-0.38454 0.6875,-0.65625 0.0935,-0.1121 0.129,-0.30766 0.125,-0.4375 l 0,-0.0312 c -0.0316,-0.56324 -0.49926,-0.9691 -1.0625,-0.9375 -0.56324,0.0316 -0.9691,0.43676 -0.9375,1 l -2,0 c -0.092,-1.64243 1.17007,-2.9079 2.8125,-3 z m 0.1875,8 c 0.55228,0 1,0.44772 1,1 0,0.55228 -0.44772,1 -1,1 -0.55228,0 -1,-0.44772 -1,-1 0,-0.55228 0.44772,-1 1,-1 z' id='path19592-2-4-9' sodipodi:nodetypes='cccccsccccccsccccsssss' style='color:#bebebe;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-280.97597,-177)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-280.97597,-177)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-280.97597,-177)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-280.97597,-177)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-280.97597,-177)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-280.97597,-177)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-280.97597,-177)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-280.97597,-177)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-wired-offline-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/network-wired-offline-symbolic-ref.png
new file mode 100644
index 00000000..badfc350
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-wired-offline-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-wired-offline-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/network-wired-offline-symbolic.svg
new file mode 100644
index 00000000..25011199
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-wired-offline-symbolic.svg
@@ -0,0 +1,36 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='network-wired-offline-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.91 r13725' width='16.000002' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='45.969211' inkscape:cy='-386.94948' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='1.6357422e-06' originy='-40' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-241.0002,-177)'>
+
+ <path inkscape:connector-curvature='0' d='m 246.0002,178 0,5 2,0 0,2 -4.96875,0 0,3 -2.03125,0 0,4.9375 5,0 0,-4.9375 -1.96875,0 0,-2 8.96875,0 0,0.98353 1,0 0,-1.98353 -5,0 0,-2 2,0 0,-5 z' id='rect8421-6' sodipodi:nodetypes='ccccccccccccccccccccc' style='color:#bebebe;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.35;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 252.0002,188 1.375,0 1.125,1.09375 1.09375,-1.09375 1.40625,0 0,1.46875 -1.09375,1.0625 1.09375,1.0625 0,1.40625 -1.4375,0 -1.0625,-1.0625 -1.0625,1.0625 -1.4375,0 0,-1.40625 1.0625,-1.0625 -1.0625,-1.0625 0,-1.46875 z' id='path3761-2-3-5-4-8-9-8-0-1-7-8-7' sodipodi:nodetypes='ccccccccccccccccc' style='color:#bebebe;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-241.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-241.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-241.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-241.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-241.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-241.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-241.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-241.0002,-177)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-wired-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/network-wired-symbolic-ref.png
new file mode 100644
index 00000000..5f37d058
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-wired-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-wired-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/network-wired-symbolic.svg
new file mode 100644
index 00000000..dbac39ff
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-wired-symbolic.svg
@@ -0,0 +1,39 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='network-wired-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16.000002' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.91 r13725' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer10' inkscape:cx='225.96921' inkscape:cy='3.0505224' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='180' originy='350' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-61.000198,-567)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-61.000198,-567)'>
+
+ <rect height='4.9375' id='rect8421' ry='0' style='color:#bebebe;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0;marker:none;enable-background:accumulate' width='5.0000014' x='61.000198' y='578'/>
+ <rect height='5.0000024' id='rect8425' ry='0' style='color:#bebebe;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0;marker:none;enable-background:accumulate' width='5.0000014' x='71.000198' y='578'/>
+ <path inkscape:connector-curvature='0' d='m 63.03125,575 0,3.53125 1,0 0,-2.53125 8.96875,0 0,2.53125 1,0 L 74,575 63.03125,575 Z' id='path8427' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 68,572 0,3.5 1,0 0,-3.5 -1,0 z' id='path9198' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ <rect height='5.0000024' id='rect9200' ry='0' style='color:#bebebe;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0;marker:none;enable-background:accumulate' width='5.0000014' x='66.000198' y='568'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-61.000198,-567)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-61.000198,-567)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-61.000198,-567)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-61.000198,-567)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-61.000198,-567)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-61.000198,-567)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-61.000198,-567)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-wireless-acquiring-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/network-wireless-acquiring-symbolic-ref.png
new file mode 100644
index 00000000..62d0678f
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-wireless-acquiring-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-wireless-acquiring-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/network-wireless-acquiring-symbolic.svg
new file mode 100644
index 00000000..1a0eea2a
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-wireless-acquiring-symbolic.svg
@@ -0,0 +1,40 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='network-wireless-acquiring-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.91 r13725' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='118.80138' inkscape:cy='9.828952' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='false' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='16'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='80.000002' originy='-40' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-161.0002,-177)'>
+
+ <circle cx='169.0002' cy='190' id='path6125' r='1.9999995' style='color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.32000002;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.50000012;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ <path clip-path='none' inkscape:connector-curvature='0' d='m 169.00019,179.0002 c -2.81422,0 -5.17173,1 -7,2.58557 l 0,1.41443 1.48072,0 c 1.51928,-1.26466 3.21936,-2 5.51928,-2 2.29992,0 4,0.77953 5.51928,2 l 1.48072,0 0,-1.38128 c -1.64044,-1.46575 -4.18578,-2.61872 -7,-2.61872 z' id='rect11714-6' sodipodi:nodetypes='scccscccs' style='color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.32000002;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0;marker:none;enable-background:accumulate'/>
+ <path clip-path='none' inkscape:connector-curvature='0' d='m 169.0002,182 c -1.50387,0 -2.86028,0.36049 -3.875,1 l 7.6875,0 c -1.021,-0.62695 -2.35046,-1 -3.8125,-1 z' id='rect11703-65' style='color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.32000002;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0;marker:none;enable-background:accumulate'/>
+ <rect height='3.0078125' id='rect11508' rx='1.49613' ry='1.49613' style='color:#000000;clip-rule:nonzero;display:block;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new' width='3.0078125' x='163.49239' y='184'/>
+ <rect height='3.0078125' id='rect11510' rx='1.49613' ry='1.49613' style='color:#000000;clip-rule:nonzero;display:block;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new' width='3.0078125' x='167.49239' y='184'/>
+ <rect height='3.0078125' id='rect11512' rx='1.49613' ry='1.49613' style='color:#000000;clip-rule:nonzero;display:block;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new' width='3.0078125' x='171.49239' y='184'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-161.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-161.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-161.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-161.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-161.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-161.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-161.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-161.0002,-177)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-wireless-connected-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/network-wireless-connected-symbolic-ref.png
new file mode 100644
index 00000000..55fc677e
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-wireless-connected-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-wireless-connected-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/network-wireless-connected-symbolic.svg
new file mode 100644
index 00000000..dceb1ec9
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-wireless-connected-symbolic.svg
@@ -0,0 +1,39 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='network-wireless-connected-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.91 r13725' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='10.135991' inkscape:cy='1.793689' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1403' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='2560' inkscape:window-y='0' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='60' originy='-40' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <clipPath clipPathUnits='userSpaceOnUse' id='clipPath8028'>
+ <path inkscape:connector-curvature='0' d='m -73,-30 -7,-7 0,-4.5 16.5,0 0,4.5 -7.5,7 z' id='path8030' sodipodi:nodetypes='ccccccc' style='fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1'/>
+ </clipPath>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-181.0002,-177)'>
+ <path clip-path='url(#clipPath8028)' inkscape:connector-curvature='0' d='m -72,-38 0,1 1,0 0,-0.96875 C -71.323493,-37.99603 -71.659974,-38 -72,-38 Z m 1,1 0,1 1,0 0,-1 z m 1,0 1,0 0,-0.59375 c -0.325389,-0.09548 -0.651632,-0.155871 -1,-0.21875 z m 1,0 0,1 1,0 0,-1 z m 1,0 0.5,0 c -0.165334,-0.08409 -0.326508,-0.144584 -0.5,-0.21875 z m 0,1 0,1 1,0 0,-1 z m 1,0 1,0 0,1 1,0 c -0.558128,-0.671658 -1.230995,-1.257248 -2,-1.71875 z m 2,1 0,1 -1,0 0,1 -1,0 0,1 -1,0 0,1 -1,0 0,1 -1,0 0,-1 -1,0 0,1 -1,0 0,-1 -1,0 0,1 -1,0 0,-1 -1,0 0,-1 -1,0 0,-1 -1,0 0,-1 -1,0 0,-1 -0.5625,0 c -1.565675,1.851407 -0.4375,4.375987 -0.4375,7 0,5.2155 1.38973,6 7,6 5.61027,0 7,-0.7845 7,-6 0,-2.373824 1.295521,-5.440954 0,-7 z m -13,0 1,0 0,-1 -0.5625,0 c -0.144921,0.123613 -0.301098,0.242063 -0.4375,0.375 z m 1,-1 1,0 0,-1 -0.0625,0 c -0.328078,0.173814 -0.639372,0.348926 -0.9375,0.5625 z m 1,-1 1,0 0,-0.5 c -0.346235,0.124586 -0.680795,0.303191 -1,0.46875 z m 1,0 0,1 1,0 0,-1 z m 1,0 1,0 0,-0.9375 c -0.343576,0.03632 -0.675775,0.08361 -1,0.15625 z m 1,0 0,1 1,0 0,-1 z m 1,1 0,1 1,0 0,-1 z m 1,1 0,1 1,0 0,-1 z m 1,0 1,0 0,-1 -1,0 z m 1,0 0,1 1,0 0,-1 z m 1,1 0,1 1,0 0,-1 z m 1,0 1,0 0,-1 -1,0 z m -1,1 -1,0 0,1 1,0 z m -1,1 -1,0 0,1 1,0 z m -1,0 0,-1 -1,0 0,1 z m -1,0 -1,0 0,1 1,0 z m -1,0 0,-1 -1,0 0,1 z m -1,0 -1,0 0,1 1,0 z m -1,0 0,-1 -1,0 0,1 z m -1,-1 0,-1 -1,0 0,1 z m -1,-1 0,-1 -1,0 0,1 z m 0,-1 1,0 0,-1 -1,0 z m 1,0 0,1 1,0 0,-1 z m 1,0 1,0 0,-1 -1,0 z m 1,0 0,1 1,0 0,-1 z m 1,1 0,1 1,0 0,-1 z m -1,0 -1,0 0,1 1,0 z m 3,1 1,0 0,-1 -1,0 z' id='path6438' sodipodi:nodetypes='ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccsssccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:Sans;-inkscape-font-specification:Sans;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;display:inline;overflow:visible;visibility:visible;opacity:0.35;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.7231313;marker:none;enable-background:accumulate' transform='translate(261.0002,217)'/>
+ <path clip-path='none' inkscape:connector-curvature='0' d='m 181.0002,193 0,-16 16,0 0,16 z' id='rect6440' style='color:#bebebe;display:inline;overflow:visible;visibility:visible;fill:none;stroke:none;stroke-width:1;marker:none'/>
+ <path clip-path='none' inkscape:connector-curvature='0' d='m 191.0002,190 c 0,1.10456 -0.89543,1.99999 -2,1.99999 -1.10457,0 -2,-0.89543 -2,-1.99999 0,-1.10456 0.89543,-2 2,-2 1.10457,0 2,0.89544 2,2 z' id='path6442' style='display:inline;fill:#bebebe;fill-opacity:1;stroke:none'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-181.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-181.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-181.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-181.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-181.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-181.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-181.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-181.0002,-177)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-wireless-encrypted-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/network-wireless-encrypted-symbolic-ref.png
new file mode 100644
index 00000000..ec0ee22d
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-wireless-encrypted-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-wireless-encrypted-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/network-wireless-encrypted-symbolic.svg
new file mode 100644
index 00000000..eb7773ec
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-wireless-encrypted-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='network-wireless-encrypted-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='-77.288247' inkscape:cy='-49.683222' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='true' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1401' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='2560' inkscape:window-y='0' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-160px' originy='-60px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-401.0002,-157)'>
+
+ <path inkscape:connector-curvature='0' d='m 408.0002,158 c -1.6447,0 -3,1.3553 -3,3 l 0,3 -1,0 c -0.554,0 -1,0.446 -1,1 l 0,0.53125 0,5.46875 5,0 2,0 5,0 0,-5.46875 0,-0.53125 c 0,-0.554 -0.446,-1 -1,-1 l -1,0 0,-3 c 0,-1.6447 -1.3553,-3 -3,-3 l -2,0 z m 0,2 2,0 c 0.5713,0 1,0.4287 1,1 l 0,3 -4,0 0,-3 c 0,-0.5713 0.4287,-1 1,-1 z' id='path4215' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-401.0002,-157)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-401.0002,-157)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-401.0002,-157)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-401.0002,-157)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-401.0002,-157)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-401.0002,-157)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-401.0002,-157)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-401.0002,-157)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-wireless-hotspot-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/network-wireless-hotspot-symbolic-ref.png
new file mode 100644
index 00000000..909d594d
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-wireless-hotspot-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-wireless-hotspot-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/network-wireless-hotspot-symbolic.svg
new file mode 100644
index 00000000..0e3b5dfb
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-wireless-hotspot-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='network-wireless-hotspot-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.4 r9939' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='464.57332' inkscape:cy='-232.42645' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='702' inkscape:window-maximized='1' inkscape:window-width='1366' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='100px' originy='20px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ <inkscape:grid color='#000000' empcolor='#000000' empopacity='0' empspacing='4' enabled='true' id='grid5968' opacity='0.1254902' originx='100px' originy='20px' snapvisiblegridlinesonly='true' spacingx='0.5px' spacingy='0.5px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-141.0002,-237)'>
+ <path class='warning' inkscape:connector-curvature='0' d='m 144.0002,238 c -2.00009,0 -2,2 -2,2 l 0,10 c 0,2 2,2 2,2 l 10,-0.0937 c 1.99991,-0.0187 2,-1.90625 2,-1.90625 l 0,-10 c 0,-2 -2,-2 -2,-2 l -10,0 z m 5,2.03125 c 1.81426,0 3.62896,0.61811 5,1.875 l 0,1.09375 -1.8125,0 c -1.84307,-1.41031 -4.53193,-1.41031 -6.375,0 l -1.8125,0 0,-1.09375 c 1.37103,-1.25689 3.18574,-1.875 5,-1.875 z m 0,3.0625 c 1.04363,0 2.0799,0.33741 2.875,1 0.0433,0.0185 0.0851,0.0394 0.125,0.0625 l 0,0.84375 -6,0 0,-0.8125 c 0.0387,-0.0339 0.0805,-0.0652 0.125,-0.0937 0.79509,-0.66259 1.83137,-1 2.875,-1 z m 0,2.90625 c 1.10457,0 2,0.89543 2,2 0,1.10457 -0.89543,2 -2,2 -1.10457,0 -2,-0.89543 -2,-2 0,-1.10457 0.89543,-2 2,-2 z' id='rect12924' style='color:#000000;fill:#f57900;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-141.0002,-237)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-141.0002,-237)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-141.0002,-237)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-141.0002,-237)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-141.0002,-237)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-141.0002,-237)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-141.0002,-237)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-141.0002,-237)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-wireless-no-route-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/network-wireless-no-route-symbolic-ref.png
new file mode 100644
index 00000000..c9e6cc81
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-wireless-no-route-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-wireless-no-route-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/network-wireless-no-route-symbolic.svg
new file mode 100644
index 00000000..6bc87583
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-wireless-no-route-symbolic.svg
@@ -0,0 +1,35 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='network-wireless-no-route-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='-37.066785' inkscape:cy='-1.062362' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1374' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='40.000002px' originy='-40px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-201.0002,-177)'>
+ <path inkscape:connector-curvature='0' d='m 208.84821,181.96875 c 1.64243,-0.092 3.0955,1.17008 3.1875,2.8125 -1e-4,1.40136 -0.37771,1.92177 -1.59375,2.84375 -0.19093,0.14364 -0.3256,0.2506 -0.375,0.3125 -0.0494,0.0621 -0.0312,0.0332 -0.0312,0.0312 0.007,0.52831 -0.47163,1 -1,1 -0.52837,0 -1.007,-0.47169 -1,-1 0,-0.50239 0.22424,-0.94342 0.46875,-1.25 0.24451,-0.30663 0.4913,-0.51638 0.71875,-0.6875 0.20405,-0.16056 0.46083,-0.38454 0.6875,-0.65625 0.0935,-0.1121 0.129,-0.30766 0.125,-0.4375 l 0,-0.0312 c -0.0316,-0.56324 -0.49926,-0.9691 -1.0625,-0.9375 -0.56324,0.0316 -0.9691,0.43676 -0.9375,1 l -2,0 c -0.092,-1.64243 1.17007,-2.9079 2.8125,-3 z m 0.1875,8 c 0.55228,0 1,0.44772 1,1 0,0.55228 -0.44772,1 -1,1 -0.55228,0 -1,-0.44772 -1,-1 0,-0.55228 0.44772,-1 1,-1 z' id='path19592-2' sodipodi:nodetypes='cccccsccccccsccccsssss' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible'/>
+
+ <path inkscape:connector-curvature='0' d='m 206.0002,187 1.01562,0 c 0.0239,-0.34343 0.13908,-0.71932 0.51425,-1 l -1.52988,0 z' id='path14861' sodipodi:nodetypes='ccccc' style='opacity:0.35;fill:#bebebe;fill-opacity:1;stroke:none'/>
+ <path inkscape:connector-curvature='0' d='m 204.0002,185 1.01562,0 c -0.0156,-0.68021 0.10253,-1.65205 0.66407,-2.18017 C 205.09617,183 204.43282,183.50337 204.0002,184 z' id='path15371' sodipodi:nodetypes='ccccc' style='opacity:0.35;fill:#bebebe;fill-opacity:1;stroke:none'/>
+ <path inkscape:connector-curvature='0' d='m 214.0002,185 -1.01563,0 c 0.0156,-0.68021 -0.10252,-1.65205 -0.66406,-2.18017 0.58372,0.18017 1.24706,0.68354 1.67969,1.18017 z' id='path15375' sodipodi:nodetypes='ccccc' style='opacity:0.35;fill:#bebebe;fill-opacity:1;stroke:none'/>
+ <path inkscape:connector-curvature='0' d='m 209,178.5 c -2.93267,0 -5.40212,1.06197 -7.3125,2.71875 a 0.50005,0.50005 0 0 0 -0.1875,0.375 l 0,1.40625 a 0.50005,0.50005 0 0 0 0.5,0.5 l 1.46875,0 a 0.50005,0.50005 0 0 0 0.34375,-0.125 c 1.45156,-1.20829 2.99415,-1.875 5.1875,-1.875 2.18694,0 3.76041,0.70348 5.21875,1.875 a 0.50005,0.50005 0 0 0 0.3125,0.125 l 1.46875,0 a 0.50005,0.50005 0 0 0 0.5,-0.5 l 0,-1.375 a 0.50005,0.50005 0 0 0 -0.15625,-0.375 C 214.60883,179.69983 211.95078,178.5 209,178.5 z m 0,1 c 2.60609,0 4.94914,1.07652 6.5,2.40625 l 0,0.59375 -0.875,0 c -1.53582,-1.18206 -3.31212,-2 -5.625,-2 -2.30727,0 -4.08249,0.77549 -5.625,2 l -0.875,0 0,-0.65625 C 204.22017,180.41356 206.3908,179.5 209,179.5 z' id='rect11714-6-6' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.32000002;color:#000000;fill:#000000;fill-opacity:0;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-201.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-201.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-201.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-201.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-201.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-201.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-201.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-201.0002,-177)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-wireless-offline-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/network-wireless-offline-symbolic-ref.png
new file mode 100644
index 00000000..bcae7bc7
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-wireless-offline-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-wireless-offline-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/network-wireless-offline-symbolic.svg
new file mode 100644
index 00000000..4f342c7a
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-wireless-offline-symbolic.svg
@@ -0,0 +1,35 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='network-wireless-offline-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='-35.838628' inkscape:cy='3.01883' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1401' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='2560' inkscape:window-y='0' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='100px' originy='-40px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-141.0002,-177)'>
+
+ <path inkscape:connector-curvature='0' d='m 152,188 1.375,0 1.125,1.09375 L 155.59375,188 157,188 l 0,1.46875 -1.09375,1.0625 L 157,191.59375 157,193 155.5625,193 154.5,191.9375 153.4375,193 152,193 l 0,-1.40625 1.0625,-1.0625 L 152,189.46875 152,188 z' id='path20031' sodipodi:nodetypes='ccccccccccccccccc' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible'/>
+ <path clip-path='none' sodipodi:cx='28' sodipodi:cy='209' d='m 29,209 a 1,1 0 1 1 -2,0 1,1 0 1 1 2,0 z' id='path6305-9' sodipodi:rx='1' sodipodi:ry='1' style='opacity:0.35;fill:#bebebe;fill-opacity:1;stroke:none;display:inline' transform='matrix(1.9999995,0,0,1.9999995,93.00022,-227.9999)' sodipodi:type='arc'/>
+ <path inkscape:connector-curvature='0' d='m 149.00019,179.0002 c -2.81422,0 -5.17173,1 -7,2.58557 l 0,1.41443 1.48072,0 c 1.51928,-1.26466 3.21936,-2 5.51928,-2 2.29992,0 4,0.77953 5.51928,2 l 1.48072,0 0,-1.38128 c -1.64044,-1.46575 -4.18578,-2.61872 -7,-2.61872 z' id='rect11714-0' sodipodi:nodetypes='scccscccs' style='opacity:0.35;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 149.00019,182.0002 c -2.16664,0 -4.01982,0.73878 -5,2 l 0,1 2,0 c 0.78878,-0.60652 1.75887,-1 3,-1 1.24113,0 2.21938,0.39348 3,1 l 2,0 0,-1 c -0.99478,-1.2229 -2.8734,-2 -5,-2 z' id='rect11703-7' sodipodi:nodetypes='scccscccs' style='opacity:0.35;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ <path clip-path='none' inkscape:connector-curvature='0' d='m 149.00019,185.0002 c -1.25733,0 -2.21571,0.31165 -3,1 l 0,1 3,0 0.375,0 2.625,0 0,-1 c -0.8369,-0.67206 -1.74267,-1 -3,-1 z' id='path6297-3' mask='none' sodipodi:nodetypes='zccccccz' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.35;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2.32782054;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-141.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-141.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-141.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-141.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-141.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-141.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-141.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-141.0002,-177)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-wireless-signal-excellent-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/network-wireless-signal-excellent-symbolic-ref.png
new file mode 100644
index 00000000..db544356
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-wireless-signal-excellent-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-wireless-signal-excellent-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/network-wireless-signal-excellent-symbolic.svg
new file mode 100644
index 00000000..1cb07638
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-wireless-signal-excellent-symbolic.svg
@@ -0,0 +1,34 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='network-wireless-signal-excellent-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='122.93321' inkscape:cy='-1.062362' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1374' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='200px' originy='-40px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-41.0002,-177)'>
+
+ <path clip-path='none' sodipodi:cx='28' sodipodi:cy='209' d='m 29,209 a 1,1 0 1 1 -2,0 1,1 0 1 1 2,0 z' id='path6305' sodipodi:rx='1' sodipodi:ry='1' style='fill:#bebebe;fill-opacity:1;stroke:none;display:inline' transform='matrix(1.9999995,0,0,1.9999995,-6.999785,-227.9999)' sodipodi:type='arc'/>
+ <path inkscape:connector-curvature='0' d='m 49.00019,179.0002 c -2.81422,0 -5.17173,1 -7,2.58557 l 0,1.41443 1.48072,0 c 1.51928,-1.26466 3.21936,-2 5.51928,-2 2.29992,0 4,0.77953 5.51928,2 l 1.48072,0 0,-1.38128 c -1.64044,-1.46575 -4.18578,-2.61872 -7,-2.61872 z' id='rect11714' sodipodi:nodetypes='scccscccs' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 49.00019,182.0002 c -2.16664,0 -4.01982,0.73878 -5,2 l 0,1 2,0 c 0.78878,-0.60652 1.75887,-1 3,-1 1.24113,0 2.21938,0.39348 3,1 l 2,0 0,-1 c -0.99478,-1.2229 -2.8734,-2 -5,-2 z' id='rect11703' sodipodi:nodetypes='scccscccs' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ <path clip-path='none' inkscape:connector-curvature='0' d='m 49.00019,185.0002 c -1.25733,0 -2.21571,0.31165 -3,1 l 0,1 3,0 0.375,0 2.625,0 0,-1 c -0.8369,-0.67206 -1.74267,-1 -3,-1 z' id='path6297' mask='none' sodipodi:nodetypes='zccccccz' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2.32782054;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-41.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-41.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-41.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-41.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-41.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-41.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-41.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-41.0002,-177)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-wireless-signal-good-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/network-wireless-signal-good-symbolic-ref.png
new file mode 100644
index 00000000..4b7ed522
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-wireless-signal-good-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-wireless-signal-good-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/network-wireless-signal-good-symbolic.svg
new file mode 100644
index 00000000..83752f97
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-wireless-signal-good-symbolic.svg
@@ -0,0 +1,34 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='network-wireless-signal-good-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='102.93321' inkscape:cy='-1.062362' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1374' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='180px' originy='-40px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-61.0002,-177)'>
+
+ <path clip-path='none' sodipodi:cx='28' sodipodi:cy='209' d='m 29,209 a 1,1 0 1 1 -2,0 1,1 0 1 1 2,0 z' id='path6305-5' sodipodi:rx='1' sodipodi:ry='1' style='fill:#bebebe;fill-opacity:1;stroke:none;display:inline' transform='matrix(1.9999995,0,0,1.9999995,13.00022,-227.9999)' sodipodi:type='arc'/>
+ <path inkscape:connector-curvature='0' d='m 69.00019,179.0002 c -2.81422,0 -5.17173,1 -7,2.58557 l 0,1.41443 1.48072,0 c 1.51928,-1.26466 3.21936,-2 5.51928,-2 2.29992,0 4,0.77953 5.51928,2 l 1.48072,0 0,-1.38128 c -1.64044,-1.46575 -4.18578,-2.61872 -7,-2.61872 z' id='rect11714-9' sodipodi:nodetypes='scccscccs' style='opacity:0.35;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 69.00019,182.0002 c -2.16664,0 -4.01982,0.73878 -5,2 l 0,1 2,0 c 0.78878,-0.60652 1.75887,-1 3,-1 1.24113,0 2.21938,0.39348 3,1 l 2,0 0,-1 c -0.99478,-1.2229 -2.8734,-2 -5,-2 z' id='rect11703-2' sodipodi:nodetypes='scccscccs' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ <path clip-path='none' inkscape:connector-curvature='0' d='m 69.00019,185.0002 c -1.25733,0 -2.21571,0.31165 -3,1 l 0,1 3,0 0.375,0 2.625,0 0,-1 c -0.8369,-0.67206 -1.74267,-1 -3,-1 z' id='path6297-8' mask='none' sodipodi:nodetypes='zccccccz' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2.32782054;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-61.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-61.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-61.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-61.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-61.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-61.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-61.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-61.0002,-177)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-wireless-signal-none-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/network-wireless-signal-none-symbolic-ref.png
new file mode 100644
index 00000000..7248c73d
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-wireless-signal-none-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-wireless-signal-none-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/network-wireless-signal-none-symbolic.svg
new file mode 100644
index 00000000..c61ef054
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-wireless-signal-none-symbolic.svg
@@ -0,0 +1,34 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='network-wireless-signal-none-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='-15.838628' inkscape:cy='3.01883' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1401' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='2560' inkscape:window-y='0' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='120px' originy='-40px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-121.0002,-177)'>
+
+ <path clip-path='none' sodipodi:cx='28' sodipodi:cy='209' d='m 29,209 a 1,1 0 1 1 -2,0 1,1 0 1 1 2,0 z' id='path6305-6' sodipodi:rx='1' sodipodi:ry='1' style='opacity:0.35;fill:#bebebe;fill-opacity:1;stroke:none;display:inline' transform='matrix(1.9999995,0,0,1.9999995,73.00022,-227.9999)' sodipodi:type='arc'/>
+ <path inkscape:connector-curvature='0' d='m 129.00019,179.0002 c -2.81422,0 -5.17173,1 -7,2.58557 l 0,1.41443 1.48072,0 c 1.51928,-1.26466 3.21936,-2 5.51928,-2 2.29992,0 4,0.77953 5.51928,2 l 1.48072,0 0,-1.38128 c -1.64044,-1.46575 -4.18578,-2.61872 -7,-2.61872 z' id='rect11714-5' sodipodi:nodetypes='scccscccs' style='opacity:0.35;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 129.00019,182.0002 c -2.16664,0 -4.01982,0.73878 -5,2 l 0,1 2,0 c 0.78878,-0.60652 1.75887,-1 3,-1 1.24113,0 2.21938,0.39348 3,1 l 2,0 0,-1 c -0.99478,-1.2229 -2.8734,-2 -5,-2 z' id='rect11703-8' sodipodi:nodetypes='scccscccs' style='opacity:0.35;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ <path clip-path='none' inkscape:connector-curvature='0' d='m 129.00019,185.0002 c -1.25733,0 -2.21571,0.31165 -3,1 l 0,1 3,0 0.375,0 2.625,0 0,-1 c -0.8369,-0.67206 -1.74267,-1 -3,-1 z' id='path6297-5' mask='none' sodipodi:nodetypes='zccccccz' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.35;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2.32782054;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-121.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-121.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-121.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-121.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-121.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-121.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-121.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-121.0002,-177)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-wireless-signal-ok-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/network-wireless-signal-ok-symbolic-ref.png
new file mode 100644
index 00000000..a5c410e7
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-wireless-signal-ok-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-wireless-signal-ok-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/network-wireless-signal-ok-symbolic.svg
new file mode 100644
index 00000000..9fa798c6
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-wireless-signal-ok-symbolic.svg
@@ -0,0 +1,34 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='network-wireless-signal-ok-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='82.933213' inkscape:cy='-1.062362' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1374' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='160px' originy='-40px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-81.0002,-177)'>
+
+ <path clip-path='none' sodipodi:cx='28' sodipodi:cy='209' d='m 29,209 a 1,1 0 1 1 -2,0 1,1 0 1 1 2,0 z' id='path6305-3' sodipodi:rx='1' sodipodi:ry='1' style='fill:#bebebe;fill-opacity:1;stroke:none;display:inline' transform='matrix(1.9999995,0,0,1.9999995,33.00022,-227.9999)' sodipodi:type='arc'/>
+ <path inkscape:connector-curvature='0' d='m 89.00019,179.0002 c -2.81422,0 -5.17173,1 -7,2.58557 l 0,1.41443 1.48072,0 c 1.51928,-1.26466 3.21936,-2 5.51928,-2 2.29992,0 4,0.77953 5.51928,2 l 1.48072,0 0,-1.38128 c -1.64044,-1.46575 -4.18578,-2.61872 -7,-2.61872 z' id='rect11714-2' sodipodi:nodetypes='scccscccs' style='opacity:0.35;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 89.00019,182.0002 c -2.16664,0 -4.01982,0.73878 -5,2 l 0,1 2,0 c 0.78878,-0.60652 1.75887,-1 3,-1 1.24113,0 2.21938,0.39348 3,1 l 2,0 0,-1 c -0.99478,-1.2229 -2.8734,-2 -5,-2 z' id='rect11703-9' sodipodi:nodetypes='scccscccs' style='opacity:0.35;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ <path clip-path='none' inkscape:connector-curvature='0' d='m 89.00019,185.0002 c -1.25733,0 -2.21571,0.31165 -3,1 l 0,1 3,0 0.375,0 2.625,0 0,-1 c -0.8369,-0.67206 -1.74267,-1 -3,-1 z' id='path6297-0' mask='none' sodipodi:nodetypes='zccccccz' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2.32782054;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-81.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-81.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-81.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-81.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-81.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-81.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-81.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-81.0002,-177)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-wireless-signal-weak-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/network-wireless-signal-weak-symbolic-ref.png
new file mode 100644
index 00000000..5d7622eb
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-wireless-signal-weak-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-wireless-signal-weak-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/network-wireless-signal-weak-symbolic.svg
new file mode 100644
index 00000000..a31c0af0
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-wireless-signal-weak-symbolic.svg
@@ -0,0 +1,34 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='network-wireless-signal-weak-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='4.1613696' inkscape:cy='3.01883' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1401' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='2560' inkscape:window-y='0' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='140px' originy='-40px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-101.0002,-177)'>
+
+ <path clip-path='none' sodipodi:cx='28' sodipodi:cy='209' d='m 29,209 a 1,1 0 1 1 -2,0 1,1 0 1 1 2,0 z' id='path6305-8' sodipodi:rx='1' sodipodi:ry='1' style='fill:#bebebe;fill-opacity:1;stroke:none;display:inline' transform='matrix(1.9999995,0,0,1.9999995,53.00022,-227.9999)' sodipodi:type='arc'/>
+ <path inkscape:connector-curvature='0' d='m 109.00019,179.0002 c -2.81422,0 -5.17173,1 -7,2.58557 l 0,1.41443 1.48072,0 c 1.51928,-1.26466 3.21936,-2 5.51928,-2 2.29992,0 4,0.77953 5.51928,2 l 1.48072,0 0,-1.38128 c -1.64044,-1.46575 -4.18578,-2.61872 -7,-2.61872 z' id='rect11714-96' sodipodi:nodetypes='scccscccs' style='opacity:0.35;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 109.00019,182.0002 c -2.16664,0 -4.01982,0.73878 -5,2 l 0,1 2,0 c 0.78878,-0.60652 1.75887,-1 3,-1 1.24113,0 2.21938,0.39348 3,1 l 2,0 0,-1 c -0.99478,-1.2229 -2.8734,-2 -5,-2 z' id='rect11703-6' sodipodi:nodetypes='scccscccs' style='opacity:0.35;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ <path clip-path='none' inkscape:connector-curvature='0' d='m 109.00019,185.0002 c -1.25733,0 -2.21571,0.31165 -3,1 l 0,1 3,0 0.375,0 2.625,0 0,-1 c -0.8369,-0.67206 -1.74267,-1 -3,-1 z' id='path6297-21' mask='none' sodipodi:nodetypes='zccccccz' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.35;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2.32782054;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-101.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-101.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-101.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-101.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-101.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-101.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-101.0002,-177)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-101.0002,-177)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-wireless-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/network-wireless-symbolic-ref.png
new file mode 100644
index 00000000..56432569
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-wireless-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-wireless-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/network-wireless-symbolic.svg
new file mode 100644
index 00000000..6d8cf58c
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-wireless-symbolic.svg
@@ -0,0 +1,45 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='network-wireless-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.4 r9939' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer10' inkscape:cx='231.28381' inkscape:cy='-150.9103' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='702' inkscape:window-maximized='1' inkscape:window-width='1366' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='200px' originy='271px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ <inkscape:grid color='#000000' empcolor='#000000' empopacity='0' empspacing='4' enabled='true' id='grid5968' opacity='0.1254902' originx='200px' originy='271px' snapvisiblegridlinesonly='true' spacingx='0.5px' spacingy='0.5px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <clipPath clipPathUnits='userSpaceOnUse' id='clipPath6254'>
+ <rect height='4.8783236' id='rect6256' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible' width='1.876245' x='26.998718' y='221.50153'/>
+ </clipPath>
+ <clipPath clipPathUnits='userSpaceOnUse' id='clipPath6258'>
+ <rect height='5.3129687' id='rect6260' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible' width='2.8977275' x='26.965673' y='221.28162'/>
+ </clipPath>
+ <clipPath clipPathUnits='userSpaceOnUse' id='clipPath6262'>
+ <rect height='6.3750005' id='rect6264' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible' width='3.8250003' x='26.849981' y='220.75'/>
+ </clipPath>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-41.0002,-488)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-41.0002,-488)'>
+ <path clip-path='url(#clipPath6262)' inkscape:connector-curvature='0' d='m 27.0625,220.5 a 1.1640267,1.1640267 0 0 0 -0.6875,2 c 0.800009,0.80001 0.800009,2.07499 0,2.875 A 1.1640267,1.1640267 0 1 0 28,227 c 1.689583,-1.68958 1.689583,-4.43542 0,-6.125 A 1.1640267,1.1640267 0 0 0 27.0625,220.5 z' id='path6233' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2.32782054;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans' transform='matrix(0,-0.784314,0.94117704,0,-161.76464,519.059)'/>
+ <path clip-path='url(#clipPath6258)' inkscape:connector-curvature='0' d='m 27.0625,221.125 a 0.55495196,0.55495196 0 0 0 -0.25,0.9375 c 1.032743,1.03274 1.032743,2.71726 0,3.75 a 0.55495196,0.55495196 0 1 0 0.78125,0.78125 c 1.456849,-1.45685 1.456849,-3.85565 0,-5.3125 A 0.55495196,0.55495196 0 0 0 27.0625,221.125 z' id='path6235' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.10979295;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans' transform='matrix(0,-1.72549,1.8821873,0,-372.49324,542.529)'/>
+ <path clip-path='url(#clipPath6254)' inkscape:connector-curvature='0' d='m 27.125,221.3125 a 0.36160181,0.36160181 0 0 0 -0.21875,0.59375 0.36160181,0.36160181 0 0 0 0.03125,0.0312 c 1.106624,1.10662 1.106624,2.89338 0,4 a 0.36160181,0.36160181 0 1 0 0.5,0.5 c 1.382968,-1.38297 1.382968,-3.61703 0,-5 a 0.36160181,0.36160181 0 0 0 -0.3125,-0.125 z' id='path6237' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:0.7231313;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans' transform='matrix(0,-2.66667,2.8685171,0,-593.37427,566)'/>
+
+ <path clip-path='none' sodipodi:cx='28' sodipodi:cy='209' d='m 29,209 a 1,1 0 1 1 -2,0 1,1 0 1 1 2,0 z' id='path6241' sodipodi:rx='1' sodipodi:ry='1' style='fill:#bebebe;fill-opacity:1;stroke:none;display:inline' transform='matrix(1.9999995,0,0,1.9999995,-6.999785,83.0001)' sodipodi:type='arc'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-41.0002,-488)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-41.0002,-488)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-41.0002,-488)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-41.0002,-488)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-41.0002,-488)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-41.0002,-488)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-41.0002,-488)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-workgroup-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/network-workgroup-symbolic-ref.png
new file mode 100644
index 00000000..93a8e4bd
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-workgroup-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/network-workgroup-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/network-workgroup-symbolic.svg
new file mode 100644
index 00000000..fd00cdf3
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/network-workgroup-symbolic.svg
@@ -0,0 +1,36 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:svg='http://www.w3.org/2000/svg' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' sodipodi:docname='network-workgroup-symbolic.svg' version='1.1' inkscape:version='0.48.1 r9760' height='16' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16.000259'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:cy='-39.882949' pagecolor='#555753' borderopacity='1' showborder='false' inkscape:bbox-paths='false' guidetolerance='10' inkscape:object-paths='true' inkscape:window-width='1296' showguides='true' inkscape:object-nodes='true' inkscape:snap-bbox='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:snap-nodes='false' bordercolor='#666666' objecttolerance='10' id='namedview88' showgrid='false' inkscape:window-maximized='0' inkscape:window-x='2126' inkscape:snap-global='true' inkscape:window-y='126' gridtolerance='10' inkscape:window-height='1013' inkscape:snap-to-guides='true' inkscape:current-layer='layer13' inkscape:snap-bbox-midpoints='false' inkscape:zoom='4' inkscape:cx='105.85479' inkscape:snap-grids='true' inkscape:pageopacity='1'>
+ <inkscape:grid spacingx='1px' spacingy='1px' id='grid4866' empspacing='2' enabled='true' type='xygrid' snapvisiblegridlinesonly='true' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:label='status' transform='translate(-442.0002,-216)' inkscape:groupmode='layer' id='layer9' style='display:inline'/>
+ <g inkscape:label='devices' transform='translate(-442.0002,-216)' inkscape:groupmode='layer' id='layer10'/>
+ <g inkscape:label='apps' transform='translate(-442.0002,-216)' inkscape:groupmode='layer' id='layer11'/>
+ <g inkscape:label='actions' transform='translate(-442.0002,-216)' inkscape:groupmode='layer' id='layer12'/>
+ <g inkscape:label='places' transform='translate(-442.0002,-216)' inkscape:groupmode='layer' id='layer13'>
+
+
+ <g transform='translate(422.00046,-1)' id='g4172-9'>
+ <g id='g4166-3'>
+ <path transform='translate(-181.00026,218)' inkscape:connector-curvature='0' d='M 202.75,3 C 201.7978,3 201,3.7978 201,4.75 l 0,4.5 c 0,0.9522 0.7978,1.75 1.75,1.75 l 0.125,0 -0.78125,1.5625 L 201.375,14 203,14 l 6,0 1.625,0 -0.71875,-1.4375 L 209.125,11 l 0.125,0 c 0.9522,0 1.75,-0.7978 1.75,-1.75 l 0,-4.5 C 211,3.7978 210.2022,3 209.25,3 l -6.5,0 z m 0.25,2 6,0 0,4 -6,0 0,-4 z' id='rect12675-3-8-0' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+ <path inkscape:connector-curvature='0' d='m 27.74975,218 c -0.9522,0 -1.75,0.7978 -1.75,1.75 l 0,0.25 2,0 0.25,0 5.75,0 0,4 -3,0 0,3.25 c 0,0.6591 -0.25164,1.26982 -0.65625,1.75 l 5.28125,0 -1.5,-3 0.125,0 c 0.9522,0 1.75,-0.7978 1.75,-1.75 l 0,-4.5 c 0,-0.9522 -0.7978,-1.75 -1.75,-1.75 l -6.5,0 z' id='rect12675-3-8-5-26' sodipodi:nodetypes='ccccccccccccccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0pt;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;font-family:Andale Mono'/>
+ </g>
+ </g>
+ <g inkscape:label='mimetypes' transform='translate(-442.0002,-216)' inkscape:groupmode='layer' id='layer14'/>
+ <g inkscape:label='emblems' transform='translate(-442.0002,-216)' inkscape:groupmode='layer' id='layer15' style='display:inline'/>
+ <g inkscape:label='categories' transform='translate(-442.0002,-216)' inkscape:groupmode='layer' id='g4953' style='display:inline'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/night-light-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/night-light-symbolic-ref.png
new file mode 100644
index 00000000..0fea29ae
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/night-light-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/night-light-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/night-light-symbolic.svg
new file mode 100644
index 00000000..b9f81b67
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/night-light-symbolic.svg
@@ -0,0 +1,35 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='natural-light-filter-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.92.0 r' viewBox='0 0 16 16' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='15.616928' inkscape:cy='4.069286' inkscape:document-units='px' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:measure-end='0,0' inkscape:measure-start='0,0' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='4'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='40.0002' originy='80' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-201,-297)'>
+
+ <path inkscape:connector-curvature='0' d='M 207.81075,298.10156 A 7,7 0 0 0 202.0002,305 a 7,7 0 0 0 7,7 7,7 0 0 0 4.59375,-1.72852 8.796875,8.796875 0 0 1 -6.59375,-8.50586 8.796875,8.796875 0 0 1 0.81055,-3.66406 z' id='path17621' style='color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-201,-297)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-201,-297)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-201,-297)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-201,-297)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-201,-297)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-201,-297)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-201,-297)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-201,-297)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/non-starred-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/non-starred-symbolic-ref.png
new file mode 100644
index 00000000..9ee51583
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/non-starred-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/non-starred-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/non-starred-symbolic.svg
new file mode 100644
index 00000000..5f80f8e6
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/non-starred-symbolic.svg
@@ -0,0 +1,35 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='non-starred-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.92pre2 r' viewBox='0 0 16 16' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='25.657918' inkscape:cy='9.92638' inkscape:document-units='px' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='false' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='836' inkscape:window-maximized='1' inkscape:window-width='1440' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='180' originy='160' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-61.000202,-377)'>
+
+ <path inkscape:connector-curvature='0' d='m 69.010521,377.99956 c -0.265901,-9.9e-4 -0.49844,0.11705 -0.66456,0.25574 -0.166111,0.1387 -0.288939,0.30319 -0.401207,0.4821 -0.224525,0.35782 -0.4039,0.7871 -0.57667,1.22193 -0.17276,0.43484 -0.335891,0.87296 -0.493359,1.21761 -0.157458,0.34465 -0.349309,0.58789 -0.362324,0.59694 -0.01287,0.009 -0.311087,0.10788 -0.699635,0.1427 -0.388548,0.0348 -0.871792,0.0437 -1.353813,0.0639 -0.482031,0.0202 -0.96072,0.0489 -1.383466,0.14089 -0.211368,0.046 -0.411561,0.10694 -0.600504,0.21502 -0.188944,0.10807 -0.378292,0.28274 -0.461439,0.52645 -0.08315,0.24371 -0.03776,0.49339 0.04761,0.68869 0.08537,0.19531 0.207566,0.3598 0.349219,0.51811 0.283296,0.31662 0.651703,0.61272 1.026901,0.90564 0.375198,0.29293 0.757945,0.57953 1.048987,0.83053 0.291042,0.251 0.469317,0.50053 0.474207,0.51528 0.0048,0.0146 0.01022,0.3187 -0.07553,0.68602 -0.08576,0.36734 -0.223769,0.8154 -0.352787,1.26401 -0.129019,0.4486 -0.249932,0.89463 -0.289877,1.31102 -0.01997,0.20819 -0.02197,0.41078 0.02617,0.61757 0.04813,0.20679 0.161814,0.43574 0.376331,0.58735 0.214508,0.15161 0.473982,0.1879 0.692856,0.1699 0.218874,-0.018 0.418204,-0.0811 0.61801,-0.16214 0.399612,-0.16214 0.805738,-0.40662 1.210398,-0.66042 0.404649,-0.2538 0.804458,-0.51786 1.141793,-0.70738 0.337334,-0.18951 0.640761,-0.27585 0.656812,-0.27578 0.01586,6e-5 0.316592,0.0895 0.652147,0.28172 0.335554,0.1922 0.732831,0.45766 1.135118,0.71468 0.402295,0.25703 0.806779,0.50676 1.204841,0.67209 0.199026,0.0827 0.39837,0.14713 0.617065,0.16685 0.218695,0.0197 0.47801,-0.0164 0.693737,-0.16641 0.215728,-0.15 0.331497,-0.37605 0.3814,-0.58247 0.0499,-0.20642 0.05071,-0.40964 0.03255,-0.61805 -0.03632,-0.41683 -0.153307,-0.86399 -0.278417,-1.31377 -0.1251,-0.44977 -0.259868,-0.89942 -0.342415,-1.26755 -0.08256,-0.36814 -0.07535,-0.67197 -0.07033,-0.68668 0.005,-0.0145 0.185479,-0.26343 0.478613,-0.51196 0.293135,-0.24855 0.679818,-0.53211 1.057458,-0.82186 0.377649,-0.28976 0.746235,-0.58238 1.032198,-0.89659 0.142977,-0.15711 0.268437,-0.32004 0.35546,-0.51464 0.08702,-0.1946 0.133981,-0.44333 0.05279,-0.68766 -0.08119,-0.24433 -0.269272,-0.42229 -0.457309,-0.53187 -0.188038,-0.10958 -0.387541,-0.17227 -0.598573,-0.22001 -0.422065,-0.0955 -0.900204,-0.12556 -1.382181,-0.14975 -0.481978,-0.0242 -0.966676,-0.0389 -1.355037,-0.0769 -0.388352,-0.038 -0.685401,-0.13877 -0.69834,-0.14792 -0.01279,-0.009 -0.203111,-0.25266 -0.357496,-0.59847 -0.154384,-0.34581 -0.313311,-0.78647 -0.482198,-1.22257 -0.168896,-0.43609 -0.344257,-0.86603 -0.565582,-1.22555 -0.110667,-0.17976 -0.231372,-0.34484 -0.396289,-0.48483 -0.164907,-0.13999 -0.397428,-0.26054 -0.663338,-0.26153 z m -0.0046,1.00531 c 0.04279,0.0377 0.114493,0.11955 0.189612,0.24158 0.154774,0.25141 0.323275,0.64736 0.486567,1.06899 0.163283,0.42164 0.324584,0.86996 0.501526,1.26628 0.176933,0.39632 0.329839,0.74829 0.69057,1.00339 0.360731,0.25509 0.751168,0.28864 1.196226,0.33219 0.445058,0.0435 0.938326,0.0567 1.404313,0.0801 0.465988,0.0234 0.908683,0.0606 1.203926,0.12741 0.142952,0.0323 0.244079,0.0719 0.294462,0.1 -0.02391,0.0509 -0.08264,0.14154 -0.179704,0.24819 -0.199968,0.21973 -0.535511,0.49659 -0.900626,0.77672 -0.365115,0.28014 -0.759144,0.56656 -1.095094,0.8514 -0.33595,0.28485 -0.634235,0.53217 -0.774188,0.94204 -0.139952,0.40988 -0.05392,0.78231 0.04069,1.20418 0.09461,0.42189 0.23512,0.87829 0.356076,1.31314 0.120957,0.43486 0.221217,0.85063 0.24663,1.14222 0.01233,0.14151 0.0034,0.24686 -0.0088,0.30165 -0.05767,-0.006 -0.165229,-0.0312 -0.300035,-0.0872 -0.278362,-0.11562 -0.654179,-0.34082 -1.043124,-0.58931 -0.388935,-0.24849 -0.79433,-0.51964 -1.178901,-0.73992 -0.38457,-0.22028 -0.719448,-0.41837 -1.166677,-0.42016 -0.447219,-0.002 -0.78619,0.19251 -1.172777,0.40971 -0.386587,0.21719 -0.793928,0.4861 -1.18516,0.73148 -0.391232,0.24538 -0.770525,0.46711 -1.050074,0.58053 -0.135604,0.055 -0.242656,0.0807 -0.300428,0.0865 -0.01166,-0.0548 -0.01997,-0.16203 -0.0064,-0.30336 0.02793,-0.29118 0.132527,-0.70524 0.257261,-1.13895 0.124734,-0.43372 0.269272,-0.88883 0.367551,-1.30981 0.09827,-0.42099 0.188571,-0.79213 0.05213,-1.2031 -0.136442,-0.41097 -0.434229,-0.66029 -0.767756,-0.94794 -0.333536,-0.28765 -0.724385,-0.57809 -1.087144,-0.86129 -0.362748,-0.28321 -0.696971,-0.56275 -0.895148,-0.78424 -0.09619,-0.1075 -0.152901,-0.1996 -0.176435,-0.25081 0.05051,-0.0276 0.151529,-0.0663 0.294661,-0.0974 0.295625,-0.0644 0.73768,-0.098 1.203714,-0.11751 0.466024,-0.0196 0.957719,-0.028 1.403027,-0.0679 0.445307,-0.0399 0.83903,-0.0718 1.201932,-0.32403 0.362892,-0.25221 0.5175,-0.60129 0.697946,-0.99627 0.180456,-0.39496 0.346769,-0.84305 0.513805,-1.26346 0.167037,-0.42041 0.337624,-0.81378 0.494684,-1.06408 0.07659,-0.12206 0.148005,-0.20382 0.191133,-0.24098 z' id='path14179-1' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-61.000202,-377)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-61.000202,-377)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-61.000202,-377)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-61.000202,-377)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-61.000202,-377)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-61.000202,-377)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-61.000202,-377)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-61.000202,-377)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/object-flip-horizontal-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/object-flip-horizontal-symbolic-ref.png
new file mode 100644
index 00000000..c64f9add
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/object-flip-horizontal-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/object-flip-horizontal-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/object-flip-horizontal-symbolic.svg
new file mode 100644
index 00000000..ee17a6bb
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/object-flip-horizontal-symbolic.svg
@@ -0,0 +1,34 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:svg='http://www.w3.org/2000/svg' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' sodipodi:docname='object-flip-horizontal-symbolic.svg' version='1.1' inkscape:version='0.48.1 r9760' height='16' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:cy='12.43419' pagecolor='#555753' borderopacity='1' showborder='false' inkscape:bbox-paths='false' guidetolerance='10' inkscape:object-paths='true' inkscape:window-width='1920' showguides='true' inkscape:object-nodes='true' inkscape:snap-bbox='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:snap-nodes='true' bordercolor='#666666' objecttolerance='10' id='namedview88' showgrid='false' inkscape:window-maximized='1' inkscape:window-x='-10' inkscape:snap-global='true' inkscape:window-y='18' gridtolerance='10' inkscape:window-height='1022' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:current-layer='layer12' inkscape:snap-bbox-midpoints='false' inkscape:zoom='1' inkscape:cx='10.865237' inkscape:snap-grids='true' inkscape:pageopacity='1'>
+ <inkscape:grid spacingx='1px' spacingy='1px' id='grid4866' empspacing='2' enabled='true' type='xygrid' snapvisiblegridlinesonly='true' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:label='status' transform='translate(-241.00015,-667)' inkscape:groupmode='layer' id='layer9' style='display:inline'/>
+ <g inkscape:label='devices' transform='translate(-241.00015,-667)' inkscape:groupmode='layer' id='layer10'/>
+ <g inkscape:label='apps' transform='translate(-241.00015,-667)' inkscape:groupmode='layer' id='layer11'/>
+ <g inkscape:label='places' transform='translate(-241.00015,-667)' inkscape:groupmode='layer' id='layer13'/>
+ <g inkscape:label='mimetypes' transform='translate(-241.00015,-667)' inkscape:groupmode='layer' id='layer14'/>
+ <g inkscape:label='emblems' transform='translate(-241.00015,-667)' inkscape:groupmode='layer' id='layer15' style='display:inline'/>
+ <g inkscape:label='emotes' transform='translate(-241.00015,-667)' inkscape:groupmode='layer' id='g71291' style='display:inline'/>
+ <g inkscape:label='categories' transform='translate(-241.00015,-667)' inkscape:groupmode='layer' id='g4953' style='display:inline'/>
+ <g inkscape:label='actions' transform='translate(-241.00015,-667)' inkscape:groupmode='layer' id='layer12' style='display:inline'>
+
+ <g transform='matrix(-1,0,0,-1,276.9999,979)' id='g15401' style='opacity:0.25'/>
+ <path inkscape:connector-curvature='0' d='m 244,674 0,2 10,0 0,-2 -10,0 z' id='path15405' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 251.0002,671 0,1 c 0,0.25689 0.12983,0.52846 0.3125,0.71875 l 2.28125,2.28125 -2.28125,2.28125 c -0.18267,0.19029 -0.3125,0.46186 -0.3125,0.71875 l 0,1 1,0 c 0.30945,0 0.55232,-0.0903 0.75,-0.28125 L 256.40645,675 252.7502,671.28125 C 252.55252,671.0903 252.30965,671 252.0002,671 z' id='rect3217-6-2-2-4-85-5' sodipodi:nodetypes='ccccccccccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/>
+ <path inkscape:connector-curvature='0' d='m 247.0002,671 0,1 c 0,0.25689 -0.12983,0.52846 -0.3125,0.71875 L 244.40645,675 l 2.28125,2.28125 c 0.18267,0.19029 0.3125,0.46186 0.3125,0.71875 l 0,1 -1,0 c -0.30945,0 -0.55232,-0.0903 -0.75,-0.28125 L 241.59395,675 245.2502,671.28125 C 245.44788,671.0903 245.69075,671 246.0002,671 z' id='rect3217-6-2-2-4-85-5-2' sodipodi:nodetypes='ccccccccccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/object-flip-vertical-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/object-flip-vertical-symbolic-ref.png
new file mode 100644
index 00000000..57edd427
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/object-flip-vertical-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/object-flip-vertical-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/object-flip-vertical-symbolic.svg
new file mode 100644
index 00000000..b4956cc9
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/object-flip-vertical-symbolic.svg
@@ -0,0 +1,34 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:svg='http://www.w3.org/2000/svg' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' sodipodi:docname='object-flip-vertical-symbolic.svg' version='1.1' inkscape:version='0.48.1 r9760' height='16' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:cy='12.43419' pagecolor='#555753' borderopacity='1' showborder='false' inkscape:bbox-paths='false' guidetolerance='10' inkscape:object-paths='true' inkscape:window-width='1920' showguides='true' inkscape:object-nodes='true' inkscape:snap-bbox='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:snap-nodes='true' bordercolor='#666666' objecttolerance='10' id='namedview88' showgrid='false' inkscape:window-maximized='1' inkscape:window-x='-10' inkscape:snap-global='true' inkscape:window-y='18' gridtolerance='10' inkscape:window-height='1022' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:current-layer='layer12' inkscape:snap-bbox-midpoints='false' inkscape:zoom='1' inkscape:cx='-9.1347628' inkscape:snap-grids='true' inkscape:pageopacity='1'>
+ <inkscape:grid spacingx='1px' spacingy='1px' id='grid4866' empspacing='2' enabled='true' type='xygrid' snapvisiblegridlinesonly='true' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:label='status' transform='translate(-261.00015,-667)' inkscape:groupmode='layer' id='layer9' style='display:inline'/>
+ <g inkscape:label='devices' transform='translate(-261.00015,-667)' inkscape:groupmode='layer' id='layer10'/>
+ <g inkscape:label='apps' transform='translate(-261.00015,-667)' inkscape:groupmode='layer' id='layer11'/>
+ <g inkscape:label='places' transform='translate(-261.00015,-667)' inkscape:groupmode='layer' id='layer13'/>
+ <g inkscape:label='mimetypes' transform='translate(-261.00015,-667)' inkscape:groupmode='layer' id='layer14'/>
+ <g inkscape:label='emblems' transform='translate(-261.00015,-667)' inkscape:groupmode='layer' id='layer15' style='display:inline'/>
+ <g inkscape:label='emotes' transform='translate(-261.00015,-667)' inkscape:groupmode='layer' id='g71291' style='display:inline'/>
+ <g inkscape:label='categories' transform='translate(-261.00015,-667)' inkscape:groupmode='layer' id='g4953' style='display:inline'/>
+ <g inkscape:label='actions' transform='translate(-261.00015,-667)' inkscape:groupmode='layer' id='layer12' style='display:inline'>
+
+ <g transform='matrix(-1,0,0,-1,296.9999,979)' id='g15413' style='opacity:0.25'/>
+ <path inkscape:connector-curvature='0' d='m 268,670 0,10 2,0 0,-10 -2,0 z' id='path15417' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 265.0002,677 0,1 c 0,0.26528 0.093,0.53057 0.28125,0.71875 l 3.71875,3.71875 c 0,0 2.47917,-2.47917 3.71875,-3.71875 0.18814,-0.18817 0.28122,-0.45344 0.28125,-0.71875 l 0,-1 -1,0 c -0.2653,0 -0.53058,0.0931 -0.71875,0.28125 l -2.28125,2.28125 -2.28125,-2.28125 C 266.53077,677.09314 266.26551,676.99996 266.0002,677 z' id='path3613-6-6-5-4' sodipodi:nodetypes='cscccccsccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/>
+ <path inkscape:connector-curvature='0' d='m 265.00041,672.99999 0,-1 c 0,-0.26528 0.093,-0.53057 0.28125,-0.71875 l 3.71875,-3.71875 c 0,0 2.47917,2.47917 3.71875,3.71875 0.18814,0.18817 0.28122,0.45344 0.28125,0.71875 l 0,1 -1,0 c -0.2653,0 -0.53058,-0.0931 -0.71875,-0.28125 l -2.28125,-2.28125 -2.28125,2.28125 c -0.18818,0.18811 -0.45344,0.28129 -0.71875,0.28125 z' id='path3613-6-6-5-4-5' sodipodi:nodetypes='cscccccsccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/object-rotate-left-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/object-rotate-left-symbolic-ref.png
new file mode 100644
index 00000000..d0251cb3
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/object-rotate-left-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/object-rotate-left-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/object-rotate-left-symbolic.svg
new file mode 100644
index 00000000..9eec00dc
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/object-rotate-left-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg height='16' version='1.1' inkscape:version='0.48.1 r9760' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='object-rotate-left-symbolic.svg' xmlns='http://www.w3.org/2000/svg' id='svg7384' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:cc='http://creativecommons.org/ns#' xmlns:svg='http://www.w3.org/2000/svg' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' width='16' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview objecttolerance='10' inkscape:zoom='4' inkscape:snap-bbox='true' inkscape:object-nodes='false' inkscape:object-paths='false' inkscape:snap-global='true' inkscape:snap-grids='true' showgrid='false' showborder='false' inkscape:window-x='2684' inkscape:window-y='355' inkscape:snap-others='false' inkscape:guide-bbox='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' guidetolerance='10' id='namedview88' inkscape:pageshadow='2' inkscape:cx='106.07513' inkscape:cy='49.4033' inkscape:pageopacity='1' inkscape:snap-nodes='true' pagecolor='#555753' inkscape:window-height='967' gridtolerance='10' showguides='true' inkscape:bbox-paths='false' inkscape:snap-bbox-midpoints='false' inkscape:snap-to-guides='true' inkscape:window-width='1226' inkscape:window-maximized='0'>
+ <inkscape:grid snapvisiblegridlinesonly='true' visible='true' type='xygrid' id='grid4866' empspacing='2' enabled='true' spacingx='1px' spacingy='1px'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' transform='translate(-281.00015,-667)' id='layer9' inkscape:label='status' style='display:inline'/>
+ <g inkscape:groupmode='layer' transform='translate(-281.00015,-667)' id='layer10' inkscape:label='devices'/>
+ <g inkscape:groupmode='layer' transform='translate(-281.00015,-667)' id='layer11' inkscape:label='apps'/>
+ <g inkscape:groupmode='layer' transform='translate(-281.00015,-667)' id='layer13' inkscape:label='places'/>
+ <g inkscape:groupmode='layer' transform='translate(-281.00015,-667)' id='layer14' inkscape:label='mimetypes'/>
+ <g inkscape:groupmode='layer' transform='translate(-281.00015,-667)' id='layer15' inkscape:label='emblems' style='display:inline'/>
+ <g inkscape:groupmode='layer' transform='translate(-281.00015,-667)' id='g71291' inkscape:label='emotes' style='display:inline'/>
+ <g inkscape:groupmode='layer' transform='translate(-281.00015,-667)' id='g4953' inkscape:label='categories' style='display:inline'/>
+ <g inkscape:groupmode='layer' transform='translate(-281.00015,-667)' id='layer12' inkscape:label='actions' style='display:inline'>
+
+ <path sodipodi:nodetypes='cscccccsccccc' d='m 283.0002,676 0,1 c 0,0.26528 0.093,0.53057 0.28125,0.71875 l 3.71875,3.71875 c 0,0 2.47917,-2.47917 3.71875,-3.71875 0.18814,-0.18817 0.28122,-0.45344 0.28125,-0.71875 l 0,-1 -1,0 c -0.2653,0 -0.53058,0.0931 -0.71875,0.28125 l -2.28125,2.28125 -2.28125,-2.28125 C 284.53077,676.09314 284.26551,675.99996 284.0002,676 z' id='path3613-6-6-5' inkscape:connector-curvature='0' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/>
+ <path d='m 289.5,670 c -1.92115,0 -3.5,1.57885 -3.5,3.5 l 0,5.5 2,0 0,-5.5 c 0,-0.84027 0.65973,-1.5 1.5,-1.5 l 4.5,0 0,-2 -4.5,0 z' id='path35770-9' inkscape:connector-curvature='0' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/object-rotate-right-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/object-rotate-right-symbolic-ref.png
new file mode 100644
index 00000000..65877b4f
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/object-rotate-right-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/object-rotate-right-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/object-rotate-right-symbolic.svg
new file mode 100644
index 00000000..ac5b0b8a
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/object-rotate-right-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg height='16' version='1.1' inkscape:version='0.48.1 r9760' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='object-rotate-right-symbolic.svg' xmlns='http://www.w3.org/2000/svg' id='svg7384' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:cc='http://creativecommons.org/ns#' xmlns:svg='http://www.w3.org/2000/svg' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' width='16' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview objecttolerance='10' inkscape:zoom='4' inkscape:snap-bbox='true' inkscape:object-nodes='false' inkscape:object-paths='false' inkscape:snap-global='true' inkscape:snap-grids='true' showgrid='false' showborder='false' inkscape:window-x='2684' inkscape:window-y='355' inkscape:snap-others='false' inkscape:guide-bbox='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' guidetolerance='10' id='namedview88' inkscape:pageshadow='2' inkscape:cx='86.07513' inkscape:cy='49.4033' inkscape:pageopacity='1' inkscape:snap-nodes='true' pagecolor='#555753' inkscape:window-height='967' gridtolerance='10' showguides='true' inkscape:bbox-paths='false' inkscape:snap-bbox-midpoints='false' inkscape:snap-to-guides='true' inkscape:window-width='1226' inkscape:window-maximized='0'>
+ <inkscape:grid snapvisiblegridlinesonly='true' visible='true' type='xygrid' id='grid4866' empspacing='2' enabled='true' spacingx='1px' spacingy='1px'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' transform='translate(-301.00015,-667)' id='layer9' inkscape:label='status' style='display:inline'/>
+ <g inkscape:groupmode='layer' transform='translate(-301.00015,-667)' id='layer10' inkscape:label='devices'/>
+ <g inkscape:groupmode='layer' transform='translate(-301.00015,-667)' id='layer11' inkscape:label='apps'/>
+ <g inkscape:groupmode='layer' transform='translate(-301.00015,-667)' id='layer13' inkscape:label='places'/>
+ <g inkscape:groupmode='layer' transform='translate(-301.00015,-667)' id='layer14' inkscape:label='mimetypes'/>
+ <g inkscape:groupmode='layer' transform='translate(-301.00015,-667)' id='layer15' inkscape:label='emblems' style='display:inline'/>
+ <g inkscape:groupmode='layer' transform='translate(-301.00015,-667)' id='g71291' inkscape:label='emotes' style='display:inline'/>
+ <g inkscape:groupmode='layer' transform='translate(-301.00015,-667)' id='g4953' inkscape:label='categories' style='display:inline'/>
+ <g inkscape:groupmode='layer' transform='translate(-301.00015,-667)' id='layer12' inkscape:label='actions' style='display:inline'>
+
+ <path d='m 304,670 0,2 4.5,0 c 0.84027,0 1.5,0.65973 1.5,1.5 l 0,5.5 2,0 0,-5.5 c 0,-1.92115 -1.57885,-3.5 -3.5,-3.5 l -4.5,0 z' id='path35770-9-1' inkscape:connector-curvature='0' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path sodipodi:nodetypes='ccccccccccccc' d='m 307.0002,676 1,0 c 0.25689,0 0.52846,0.12983 0.71875,0.3125 l 2.28125,2.28125 2.28125,-2.28125 C 313.47174,676.12983 313.74331,676 314.0002,676 l 1,0 0,1 c 0,0.30945 -0.0903,0.55232 -0.28125,0.75 l -3.71875,3.65625 -3.71875,-3.65625 c -0.19095,-0.19768 -0.28125,-0.44055 -0.28125,-0.75 z' id='rect3217-6-2-2-4-85-2-1' inkscape:connector-curvature='0' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/object-select-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/object-select-symbolic-ref.png
new file mode 100644
index 00000000..d782f994
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/object-select-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/object-select-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/object-select-symbolic.svg
new file mode 100644
index 00000000..a19dbc07
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/object-select-symbolic.svg
@@ -0,0 +1,30 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:svg='http://www.w3.org/2000/svg' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' sodipodi:docname='object-select-symbolic.svg' version='1.1' inkscape:version='0.48.1 r9760' height='15.993952' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='15.999536'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:cy='216.52697' pagecolor='#555753' borderopacity='1' showborder='false' inkscape:bbox-paths='false' guidetolerance='10' inkscape:object-paths='true' inkscape:window-width='1598' showguides='true' inkscape:object-nodes='true' inkscape:snap-bbox='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:snap-nodes='true' bordercolor='#666666' objecttolerance='10' id='namedview88' showgrid='false' inkscape:window-maximized='0' inkscape:window-x='2124' inkscape:snap-global='true' inkscape:window-y='31' gridtolerance='10' inkscape:window-height='1162' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:current-layer='layer12' inkscape:snap-bbox-midpoints='false' inkscape:zoom='2.5381589' inkscape:cx='210.67214' inkscape:snap-grids='true' inkscape:pageopacity='1'>
+ <inkscape:grid spacingx='1px' spacingy='1px' id='grid4866' empspacing='2' enabled='true' type='xygrid' snapvisiblegridlinesonly='true' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:label='status' transform='translate(-61.000665,-787)' inkscape:groupmode='layer' id='layer9' style='display:inline'/>
+ <g inkscape:label='devices' transform='translate(-61.000665,-787)' inkscape:groupmode='layer' id='layer10'/>
+ <g inkscape:label='apps' transform='translate(-61.000665,-787)' inkscape:groupmode='layer' id='layer11'/>
+ <g inkscape:label='places' transform='translate(-61.000665,-787)' inkscape:groupmode='layer' id='layer13'/>
+ <g inkscape:label='mimetypes' transform='translate(-61.000665,-787)' inkscape:groupmode='layer' id='layer14'/>
+ <g inkscape:label='emblems' transform='translate(-61.000665,-787)' inkscape:groupmode='layer' id='layer15' style='display:inline'/>
+ <g inkscape:label='emotes' transform='translate(-61.000665,-787)' inkscape:groupmode='layer' id='g71291' style='display:inline'/>
+ <g inkscape:label='categories' transform='translate(-61.000665,-787)' inkscape:groupmode='layer' id='g4953' style='display:inline'/>
+ <g inkscape:label='actions' transform='translate(-61.000665,-787)' inkscape:groupmode='layer' id='layer12' style='display:inline'>
+ <path inkscape:connector-curvature='0' d='M 72.9375,790.9375 68,795.875 l -1.9375,-1.9375 -2.125,2.125 3,3 1.0625,1.0625 1.0625,-1.0625 6,-6 -2.125,-2.125 z' id='path8913-6-7-1-5' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/open-menu-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/open-menu-symbolic-ref.png
new file mode 100644
index 00000000..9e6aba6b
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/open-menu-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/open-menu-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/open-menu-symbolic.svg
new file mode 100644
index 00000000..35f8ee54
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/open-menu-symbolic.svg
@@ -0,0 +1,33 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='open-menu-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='584.66783' inkscape:cy='457.29496' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1374' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='180px' originy='732.00001px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-61.0002,-949.00001)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-61.0002,-949.00001)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-61.0002,-949.00001)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-61.0002,-949.00001)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-61.0002,-949.00001)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-61.0002,-949.00001)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-61.0002,-949.00001)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-61.0002,-949.00001)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-61.0002,-949.00001)'>
+
+ <rect height='2.0002136' id='rect7356' inkscape:label='a' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible' width='9.9996014' x='64.000397' y='951.99982'/>
+ <rect height='2.0002136' id='rect7358' inkscape:label='a' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible' width='9.9996014' x='64.000397' y='955.99982'/>
+ <rect height='2.0002136' id='rect7360' inkscape:label='a' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible' width='9.9996014' x='64.000397' y='959.99982'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/orientation-landscape-inverse-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/orientation-landscape-inverse-symbolic-ref.png
new file mode 100644
index 00000000..04d47d87
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/orientation-landscape-inverse-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/orientation-landscape-inverse-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/orientation-landscape-inverse-symbolic.svg
new file mode 100644
index 00000000..aa174a40
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/orientation-landscape-inverse-symbolic.svg
@@ -0,0 +1,35 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='orientation-landscape-inverse-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.92+devel unknown' viewBox='0 0 16 16' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='-95.083621' inkscape:cy='-33.267434' inkscape:document-rotation='0' inkscape:document-units='px' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:measure-end='0,0' inkscape:measure-start='-190.687,-191.14' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='3440' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='5.6568542'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='179.96872' originy='199.9603' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-61.031481,-416.9603)'>
+
+ <path inkscape:connector-curvature='0' d='m 63.1584,430.04102 c -0.61671,0 -1.11328,-0.49657 -1.11328,-1.11328 v -7.8457 c 0,-0.61672 0.49657,-1.11329 1.11328,-1.11329 h 11.73828 c 0.61672,0 1.11329,0.49657 1.11329,1.11329 v 7.8457 c 0,0.61671 -0.49657,1.11328 -1.11329,1.11328 z m 5.8418,-3 4,-4.04102 h -8 z' id='rect5915-6' sodipodi:nodetypes='ssssssssscccc' style='display:inline;opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:normal;enable-background:new'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-61.031481,-416.9603)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-61.031481,-416.9603)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-61.031481,-416.9603)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-61.031481,-416.9603)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-61.031481,-416.9603)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-61.031481,-416.9603)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-61.031481,-416.9603)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-61.031481,-416.9603)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/orientation-landscape-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/orientation-landscape-symbolic-ref.png
new file mode 100644
index 00000000..25c39e1f
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/orientation-landscape-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/orientation-landscape-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/orientation-landscape-symbolic.svg
new file mode 100644
index 00000000..bd41ab26
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/orientation-landscape-symbolic.svg
@@ -0,0 +1,35 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='orientation-landscape-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.92+devel unknown' viewBox='0 0 16 16' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='-75.083621' inkscape:cy='-33.267434' inkscape:document-rotation='0' inkscape:document-units='px' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:measure-end='0,0' inkscape:measure-start='-190.687,-191.14' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='3440' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='5.6568542'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='199.96872' originy='199.9603' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-41.031481,-416.9603)'>
+
+ <path inkscape:connector-curvature='0' d='m 43.1584,420 c -0.61671,0 -1.11328,0.49657 -1.11328,1.11328 v 7.8457 c 0,0.61672 0.49657,1.11329 1.11328,1.11329 h 11.73828 c 0.61672,0 1.11329,-0.49657 1.11329,-1.11329 v -7.8457 C 56.00997,420.49657 55.5134,420 54.89668,420 Z m 5.8418,3 4,4 h -8 z' id='rect5915' sodipodi:nodetypes='ssssssssscccc' style='opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:normal'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-41.031481,-416.9603)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-41.031481,-416.9603)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-41.031481,-416.9603)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-41.031481,-416.9603)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-41.031481,-416.9603)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-41.031481,-416.9603)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-41.031481,-416.9603)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-41.031481,-416.9603)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/orientation-portrait-inverse-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/orientation-portrait-inverse-symbolic-ref.png
new file mode 100644
index 00000000..247461bb
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/orientation-portrait-inverse-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/orientation-portrait-inverse-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/orientation-portrait-inverse-symbolic.svg
new file mode 100644
index 00000000..83f25b57
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/orientation-portrait-inverse-symbolic.svg
@@ -0,0 +1,35 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='orientation-portrait-inverse-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='15.959156' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.92+devel unknown' viewBox='0 0 16 15.959156' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='-135.08362' inkscape:cy='-33.267414' inkscape:document-rotation='0' inkscape:document-units='px' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:measure-end='0,0' inkscape:measure-start='-190.687,-191.14' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='3440' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='5.6568542'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='139.96872' originy='199.96032' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-101.03148,-417.00116)'>
+
+ <path inkscape:connector-curvature='0' d='m 103.9914,419.16699 c 0,-0.61671 0.49658,-1.11328 1.11328,-1.11328 l 7.84569,-1e-5 c 0.61674,1e-5 1.1133,0.49658 1.11331,1.11329 v 11.73829 c 0,0.61671 -0.49658,1.11328 -1.1133,1.11327 l -7.84569,2e-5 c -0.61673,-1e-5 -1.11329,-0.49657 -1.11329,-1.1133 z m 3,5.8418 4.0088,3.99121 v -8 z' id='rect5915-1-8' sodipodi:nodetypes='scccsccsscccc' style='display:inline;opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:normal;enable-background:new'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-101.03148,-417.00116)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-101.03148,-417.00116)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-101.03148,-417.00116)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-101.03148,-417.00116)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-101.03148,-417.00116)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-101.03148,-417.00116)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-101.03148,-417.00116)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-101.03148,-417.00116)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/orientation-portrait-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/orientation-portrait-symbolic-ref.png
new file mode 100644
index 00000000..158607d1
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/orientation-portrait-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/orientation-portrait-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/orientation-portrait-symbolic.svg
new file mode 100644
index 00000000..b76fe55e
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/orientation-portrait-symbolic.svg
@@ -0,0 +1,35 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='orientation-portrait-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='15.959156' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.92+devel unknown' viewBox='0 0 16 15.959156' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='-115.08362' inkscape:cy='-33.267431' inkscape:document-rotation='0' inkscape:document-units='px' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:measure-end='0,0' inkscape:measure-start='-190.687,-191.14' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='3440' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='5.6568542'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='159.96872' originy='199.9603' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-81.031481,-417.00114)'>
+
+ <path inkscape:connector-curvature='0' d='m 94.06368,419.16699 c 0,-0.61671 -0.49658,-1.11328 -1.11328,-1.11328 l -7.84569,-1e-5 c -0.61674,1e-5 -1.1133,0.49658 -1.11331,1.11329 v 11.73829 c 0,0.61671 0.49658,1.11328 1.1133,1.11327 l 7.84569,2e-5 c 0.61673,-1e-5 1.11329,-0.49657 1.11329,-1.1133 z m -3,5.8418 L 87.0002,429 v -8 z' id='rect5915-1' sodipodi:nodetypes='scccsccsscccc' style='display:inline;opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:normal;enable-background:new'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-81.031481,-417.00114)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-81.031481,-417.00114)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-81.031481,-417.00114)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-81.031481,-417.00114)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-81.031481,-417.00114)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-81.031481,-417.00114)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-81.031481,-417.00114)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-81.031481,-417.00114)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/package-x-generic-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/package-x-generic-symbolic-ref.png
new file mode 100644
index 00000000..2dfd0b29
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/package-x-generic-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/package-x-generic-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/package-x-generic-symbolic.svg
new file mode 100644
index 00000000..5e8e48b7
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/package-x-generic-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:svg='http://www.w3.org/2000/svg' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' sodipodi:docname='package-x-generic-symbolic.svg' version='1.1' inkscape:version='0.48+devel r10008 custom' height='16' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:cy='-72.82385' pagecolor='#555753' borderopacity='1' showborder='false' inkscape:bbox-paths='false' guidetolerance='10' inkscape:object-paths='true' inkscape:window-width='1296' showguides='true' inkscape:object-nodes='true' inkscape:snap-bbox='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:snap-nodes='false' bordercolor='#666666' objecttolerance='10' id='namedview88' showgrid='false' inkscape:window-maximized='0' inkscape:window-x='201' inkscape:snap-global='true' inkscape:window-y='17' gridtolerance='10' inkscape:window-height='1118' inkscape:snap-to-guides='true' inkscape:current-layer='layer14' inkscape:snap-bbox-midpoints='false' inkscape:zoom='1' inkscape:cx='17.54882' inkscape:snap-grids='true' inkscape:pageopacity='1'>
+ <inkscape:grid spacingx='1px' spacingy='1px' id='grid4866' empspacing='2' enabled='true' type='xygrid' snapvisiblegridlinesonly='true' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:label='status' transform='translate(-482,-300)' inkscape:groupmode='layer' id='layer9' style='display:inline'/>
+ <g inkscape:label='devices' transform='translate(-482,-300)' inkscape:groupmode='layer' id='layer10'/>
+ <g inkscape:label='apps' transform='translate(-482,-300)' inkscape:groupmode='layer' id='layer11'/>
+ <g inkscape:label='actions' transform='translate(-482,-300)' inkscape:groupmode='layer' id='layer12'/>
+ <g inkscape:label='places' transform='translate(-482,-300)' inkscape:groupmode='layer' id='layer13'/>
+ <g inkscape:label='mimetypes' transform='translate(-482,-300)' inkscape:groupmode='layer' id='layer14'>
+
+ <path inkscape:connector-curvature='0' d='m 485.0002,308 10,0 0,7.05898 c 0,0.4922 -0.47266,0.9375 -0.99609,0.9375 l -8.00391,0 c -0.53906,0 -1,-0.42964 -1,-1 z' id='rect7268' sodipodi:nodetypes='ccccccc' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 488.6875,302.96875 a 1.0001,1.0001 0 0 0 -0.65625,0.375 l -2.8125,3.46875 A 1.0001,1.0001 0 0 0 485,307.4375 l 0,1 a 1.0001,1.0001 0 1 0 2,0 l 0,-0.65625 2.59375,-3.15625 a 1.0001,1.0001 0 0 0 -0.90625,-1.65625 z' id='path7270' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 490.90625,305.96875 a 1.0001221,1.0001221 0 1 0 -0.0312,2 l 2.15625,0.375 0,0.15625 a 1.0001,1.0001 0 1 0 2,0 l 0,-1 a 1.0001,1.0001 0 0 0 -0.8125,-1 l -3,-0.5 a 1.0001,1.0001 0 0 0 -0.3125,-0.0312 z' id='path7272' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+ <g inkscape:label='emblems' transform='translate(-482,-300)' inkscape:groupmode='layer' id='layer15' style='display:inline'/>
+ <g inkscape:label='categories' transform='translate(-482,-300)' inkscape:groupmode='layer' id='g4953' style='display:inline'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/pan-down-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/pan-down-symbolic-ref.png
new file mode 100644
index 00000000..09c420a1
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/pan-down-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/pan-down-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/pan-down-symbolic.svg
new file mode 100644
index 00000000..5b30f102
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/pan-down-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='pan-down-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.5 r10040' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='false' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='56.96276' inkscape:cy='7.0403516' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1014' inkscape:window-maximized='1' inkscape:window-width='1920' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-100px' originy='590.00001px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-341.0002,-807.00001)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-341.0002,-807.00001)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-341.0002,-807.00001)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-341.0002,-807.00001)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-341.0002,-807.00001)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-341.0002,-807.00001)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-341.0002,-807.00001)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-341.0002,-807.00001)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-341.0002,-807.00001)'>
+ <path inkscape:connector-curvature='0' d='m 354.0002,813 -5,5 -5,-5 z' id='path6424' sodipodi:nodetypes='cccc' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/pan-end-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/pan-end-symbolic-ref.png
new file mode 100644
index 00000000..ecf4cb6f
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/pan-end-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/pan-end-symbolic-rtl-ref.png b/rsvg/tests/fixtures/reftests/adwaita/pan-end-symbolic-rtl-ref.png
new file mode 100644
index 00000000..d429f33e
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/pan-end-symbolic-rtl-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/pan-end-symbolic-rtl.svg b/rsvg/tests/fixtures/reftests/adwaita/pan-end-symbolic-rtl.svg
new file mode 100644
index 00000000..f1e51b2d
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/pan-end-symbolic-rtl.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='pan-start-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.5 r10040' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='false' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='116.96276' inkscape:cy='7.04034' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1014' inkscape:window-maximized='1' inkscape:window-width='1920' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-39.999998px' originy='590px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-281.0002,-807)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-281.0002,-807)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-281.0002,-807)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-281.0002,-807)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-281.0002,-807)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-281.0002,-807)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-281.0002,-807)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-281.0002,-807)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-281.0002,-807)'>
+ <path inkscape:connector-curvature='0' d='m 291.0002,820 -5,-5 5,-5 z' id='path6400' sodipodi:nodetypes='cccc' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/pan-end-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/pan-end-symbolic.svg
new file mode 100644
index 00000000..995f5dac
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/pan-end-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='pan-end-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.5 r10040' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='false' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='96.962758' inkscape:cy='7.04034' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1014' inkscape:window-maximized='1' inkscape:window-width='1920' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-60.000002px' originy='590px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-301.0002,-807)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-301.0002,-807)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-301.0002,-807)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-301.0002,-807)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-301.0002,-807)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-301.0002,-807)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-301.0002,-807)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-301.0002,-807)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-301.0002,-807)'>
+ <path inkscape:connector-curvature='0' d='m 307.0002,820 5,-5 -5,-5 z' id='path6412' sodipodi:nodetypes='cccc' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/pan-start-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/pan-start-symbolic-ref.png
new file mode 100644
index 00000000..d429f33e
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/pan-start-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/pan-start-symbolic-rtl-ref.png b/rsvg/tests/fixtures/reftests/adwaita/pan-start-symbolic-rtl-ref.png
new file mode 100644
index 00000000..ecf4cb6f
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/pan-start-symbolic-rtl-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/pan-start-symbolic-rtl.svg b/rsvg/tests/fixtures/reftests/adwaita/pan-start-symbolic-rtl.svg
new file mode 100644
index 00000000..995f5dac
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/pan-start-symbolic-rtl.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='pan-end-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.5 r10040' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='false' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='96.962758' inkscape:cy='7.04034' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1014' inkscape:window-maximized='1' inkscape:window-width='1920' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-60.000002px' originy='590px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-301.0002,-807)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-301.0002,-807)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-301.0002,-807)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-301.0002,-807)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-301.0002,-807)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-301.0002,-807)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-301.0002,-807)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-301.0002,-807)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-301.0002,-807)'>
+ <path inkscape:connector-curvature='0' d='m 307.0002,820 5,-5 -5,-5 z' id='path6412' sodipodi:nodetypes='cccc' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/pan-start-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/pan-start-symbolic.svg
new file mode 100644
index 00000000..f1e51b2d
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/pan-start-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='pan-start-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.5 r10040' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='false' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='116.96276' inkscape:cy='7.04034' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1014' inkscape:window-maximized='1' inkscape:window-width='1920' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-39.999998px' originy='590px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-281.0002,-807)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-281.0002,-807)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-281.0002,-807)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-281.0002,-807)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-281.0002,-807)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-281.0002,-807)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-281.0002,-807)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-281.0002,-807)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-281.0002,-807)'>
+ <path inkscape:connector-curvature='0' d='m 291.0002,820 -5,-5 5,-5 z' id='path6400' sodipodi:nodetypes='cccc' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/pan-up-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/pan-up-symbolic-ref.png
new file mode 100644
index 00000000..d34c8adf
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/pan-up-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/pan-up-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/pan-up-symbolic.svg
new file mode 100644
index 00000000..9bc9991a
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/pan-up-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='pan-up-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.5 r10040' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='false' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='76.96276' inkscape:cy='7.0403484' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1014' inkscape:window-maximized='1' inkscape:window-width='1920' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-80px' originy='590.00001px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-321.0002,-807.00001)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-321.0002,-807.00001)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-321.0002,-807.00001)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-321.0002,-807.00001)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-321.0002,-807.00001)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-321.0002,-807.00001)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-321.0002,-807.00001)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-321.0002,-807.00001)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-321.0002,-807.00001)'>
+ <path inkscape:connector-curvature='0' d='m 334.0002,817 -5,-5 -5,5 z' id='path6418' sodipodi:nodetypes='cccc' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/pda-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/pda-symbolic-ref.png
new file mode 100644
index 00000000..87e78be1
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/pda-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/pda-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/pda-symbolic.svg
new file mode 100644
index 00000000..5f0588a8
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/pda-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='pda-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.5 r10040' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer10' inkscape:cx='14.000344' inkscape:cy='6.49502' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1375' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='80px' originy='350px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-161.0002,-567)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-161.0002,-567)'>
+
+ <path inkscape:connector-curvature='0' d='m 165.18289,567 c -1.79783,10e-6 -3.15144,1.33801 -3.15144,3 l 0,10 c 0,1.662 1.3536,3 3.15144,3 l 7.57212,0 c 1.79783,-10e-6 3.24519,-1.33801 3.24519,-3 l 0,-6.58931 -1.97596,2.87722 0,3.71209 c 1e-5,0.554 -0.48245,1 -1.08173,1 l -7.91587,0 c -0.59928,-10e-6 -1.01924,-0.44601 -1.01923,-1 l 0,-10 c -1e-5,-0.554 0.41995,-0.99999 1.01923,-1 l 7.66076,0 1.31836,-1.75 c -0.38069,-0.14431 -0.81253,-0.25 -1.25075,-0.25 z' id='path26990' sodipodi:nodetypes='sssssscccsccccccss' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+ <path inkscape:connector-curvature='0' d='m 175.04053,568.03103 c 0,0 -2.51922,3.50643 -4.04033,5.96897 l -1.40567,1.1673 0.0373,1.57392 -0.76313,1.24524 0.69536,-10e-4 0.74028,-0.58334 1.67496,-0.4626 0.5949,-1.48097 4.18505,-6.36462 z' id='path8552-8' sodipodi:nodetypes='ccccccccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-161.0002,-567)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-161.0002,-567)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-161.0002,-567)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-161.0002,-567)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-161.0002,-567)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-161.0002,-567)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-161.0002,-567)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/phone-apple-iphone-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/phone-apple-iphone-symbolic-ref.png
new file mode 100644
index 00000000..beb0ec4e
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/phone-apple-iphone-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/phone-apple-iphone-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/phone-apple-iphone-symbolic.svg
new file mode 100644
index 00000000..4985aae3
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/phone-apple-iphone-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='phone-apple-iphone-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.2 r9819' version='1.1' width='16.000002' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-paths='false' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer10' inkscape:cx='-12.474958' inkscape:cy='3.05352' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#555753' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='419' inkscape:window-maximized='0' inkscape:window-width='511' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(198.9998,-447)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(198.9998,-447)'>
+
+ <path inkscape:connector-curvature='0' d='m -193.53105,448 c -0.82099,0 -1.46875,0.64776 -1.46875,1.46875 l 0,11.0625 c 0,0.82099 0.64776,1.46875 1.46875,1.46875 l 5.125,0 c 0.82099,0 1.46875,-0.64776 1.46875,-1.46875 l 0,-11.0625 c 0,-0.82099 -0.64776,-1.46875 -1.46875,-1.46875 z m -0.46875,1 6.0625,0 0,11 -6.0625,0 z' id='path5068' sodipodi:nodetypes='sssssssssccccc' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(198.9998,-447)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(198.9998,-447)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(198.9998,-447)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(198.9998,-447)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(198.9998,-447)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(198.9998,-447)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(198.9998,-447)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/phone-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/phone-symbolic-ref.png
new file mode 100644
index 00000000..6d6392b1
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/phone-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/phone-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/phone-symbolic.svg
new file mode 100644
index 00000000..273b6ac2
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/phone-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='phone-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.4 r9939' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer10' inkscape:cx='51.284009' inkscape:cy='-191.9103' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='702' inkscape:window-maximized='1' inkscape:window-width='1366' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='20.0002px' originy='230px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ <inkscape:grid color='#000000' empcolor='#000000' empopacity='0' empspacing='4' enabled='true' id='grid5968' opacity='0.1254902' originx='20.0002px' originy='230px' snapvisiblegridlinesonly='true' spacingx='0.5px' spacingy='0.5px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-221,-447)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-221,-447)'>
+ <path inkscape:connector-curvature='0' d='m 227.0002,448 c -1.00916,0.005 -1,1 -1,1 l 0,11 c 0,1 1,1 1,1 l 4,0 c 1,0 1,-1 1,-1 l 0,-8 c 9e-4,-0.554 -0.446,-1 -1,-1 l -3,0 0,-2 c 0,0 -0.009,-0.99447 -1,-1 z m 0,4 4,0 0,3.03125 -4,-0.0312 z m 0,4 1,0 0,1 1,0 0,-1 1,0 0,1 1,0 0,1 -1,0 0,1 1,0 0,1 -1,0 0,-1 -1,0 0,1 -1,0 0,-1 -1,0 0,-1 1,0 0,-1 -1,0 z m 1,2 0,1 1,0 0,-1 z m 1,0 1,0 0,-1 -1,0 z' id='rect5222-6-8' sodipodi:nodetypes='ccscsccsccccccccccccccccccccccccccccccccccccccccccc' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+
+ </g>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-221,-447)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-221,-447)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-221,-447)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-221,-447)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-221,-447)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-221,-447)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-221,-447)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/preferences-color-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/preferences-color-symbolic-ref.png
new file mode 100644
index 00000000..87a312d6
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/preferences-color-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/preferences-color-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/preferences-color-symbolic.svg
new file mode 100644
index 00000000..65900bab
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/preferences-color-symbolic.svg
@@ -0,0 +1,34 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='preferences-color-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.2 r9819' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-paths='false' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer11' inkscape:cx='11.52612' inkscape:cy='1.67408' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#555753' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='true' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1381' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='1600' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-283,-649)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-283,-649)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-283,-649)'>
+
+ <path inkscape:connector-curvature='0' d='m 291.0002,650.00714 c -2.20283,0 -3.99286,1.79004 -3.99286,3.99286 0,2.20282 1.79003,3.99286 3.99286,3.99286 2.20282,0 3.99285,-1.79004 3.99285,-3.99286 0,-2.20282 -1.79003,-3.99286 -3.99285,-3.99286 z m 0,1.05238 c 1.62635,0 2.94047,1.31413 2.94047,2.94048 0,1.62635 -1.31412,2.94048 -2.94047,2.94048 -1.62636,0 -2.94048,-1.31413 -2.94048,-2.94048 0,-1.62635 1.31412,-2.94048 2.94048,-2.94048 z' id='path8587' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2.15384626;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 287.0002,657.00714 c -2.20283,0 -3.99286,1.79004 -3.99286,3.99286 0,2.20282 1.79003,3.99286 3.99286,3.99286 2.20282,0 3.99285,-1.79004 3.99285,-3.99286 0,-2.20282 -1.79003,-3.99286 -3.99285,-3.99286 z m 0,1.05238 c 1.62635,0 2.94047,1.31413 2.94047,2.94048 0,1.62635 -1.31412,2.94048 -2.94047,2.94048 -1.62636,0 -2.94048,-1.31413 -2.94048,-2.94048 0,-1.62635 1.31412,-2.94048 2.94048,-2.94048 z' id='path8591' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2.15384626;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path sodipodi:cx='-9' sodipodi:cy='321' d='m -2,321 a 7,7 0 1 1 -14,0 7,7 0 1 1 14,0 z' id='path8593' sodipodi:rx='7' sodipodi:ry='7' style='color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2.15384626;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' transform='matrix(0.57130665,0,0,0.57130665,300.14111,477.61056)' sodipodi:type='arc'/>
+ <path sodipodi:cx='-9' sodipodi:cy='321' d='m -2,321 a 7,7 0 1 1 -14,0 7,7 0 1 1 14,0 z' id='path8595' sodipodi:rx='7' sodipodi:ry='7' style='color:#000000;fill:#bebebe;fill-opacity:0.36403509;stroke:none;stroke-width:2.15384626;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' transform='matrix(0.49523816,0,0,0.49523816,291.45734,502.02855)' sodipodi:type='arc'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-283,-649)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-283,-649)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-283,-649)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-283,-649)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-283,-649)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-283,-649)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/preferences-desktop-accessibility-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/preferences-desktop-accessibility-symbolic-ref.png
new file mode 100644
index 00000000..dd17a8ec
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/preferences-desktop-accessibility-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/preferences-desktop-accessibility-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/preferences-desktop-accessibility-symbolic.svg
new file mode 100644
index 00000000..1cf76c8a
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/preferences-desktop-accessibility-symbolic.svg
@@ -0,0 +1,26 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:svg='http://www.w3.org/2000/svg' id='svg7384' version='1.1' height='16' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs id='defs7386'/>
+ <g transform='translate(-41.982553,-381.00459)' id='layer9' style='display:inline'/>
+ <g transform='translate(-41.982553,-381.00459)' id='layer10'/>
+ <g transform='translate(-41.982553,-381.00459)' id='layer11'>
+ <path inkscape:connector-curvature='0' d='m 49.982553,381.00459 c -4.418276,0 -8,3.58172 -8,8 0,4.41828 3.581724,8 8,8 4.418276,0 8,-3.58172 8,-8 0,-4.41828 -3.581724,-8 -8,-8 z m 0,1.94321 c 1.121291,0 2.030093,0.9088 2.030093,2.03009 0,1.12128 -0.908802,2.03008 -2.030093,2.03008 -1.121291,0 -2.030093,-0.9088 -2.030093,-2.03008 0,-1.12129 0.908802,-2.03009 2.030093,-2.03009 z m -4.797388,4.12017 c 3.206661,-0.0458 6.412936,-0.0154 9.619527,0.0113 0,0 0.430917,-0.008 0.430917,0.42408 l 0,0.20861 C 55.235609,387.93778 55,388 55,388 l -2.985178,0.57817 0,2.1109 1.354691,3.90641 c 0.136799,0.22572 -0.158388,0.2902 -0.158388,0.2902 l -0.526496,0.005 c -0.253171,0 -0.348086,-0.21303 -0.348086,-0.21303 l -2.071779,-3.59156 c -0.222279,-0.5041 -0.236169,-0.43981 -0.44654,7.7e-4 l -2.168947,3.58622 c -0.07254,0.21764 -0.355596,0.22239 -0.355596,0.22239 l -0.570299,-0.009 c 0,0 -0.208476,-0.006 -0.160647,-0.20918 l 1.387549,-3.9888 0,-2.1109 -2.891946,-0.5548 c -0.232448,-0.0787 -0.328841,-0.29434 -0.328841,-0.29434 l 0,-0.21764 c 0,0 -0.0097,-0.44343 0.455668,-0.44343 z' id='path3850' style='fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible'/>
+
+ </g>
+ <g transform='translate(-41.982553,-381.00459)' id='layer12'/>
+ <g transform='translate(-41.982553,-381.00459)' id='layer13'/>
+ <g transform='translate(-41.982553,-381.00459)' id='layer14'/>
+ <g transform='translate(-41.982553,-381.00459)' id='layer15'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/preferences-desktop-display-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/preferences-desktop-display-symbolic-ref.png
new file mode 100644
index 00000000..1edf4fe9
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/preferences-desktop-display-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/preferences-desktop-display-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/preferences-desktop-display-symbolic.svg
new file mode 100644
index 00000000..7423827d
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/preferences-desktop-display-symbolic.svg
@@ -0,0 +1,33 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='preferences-desktop-display-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer11' inkscape:cx='117.77077' inkscape:cy='23.59389' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='702' inkscape:window-maximized='1' inkscape:window-width='1366' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='138px' originy='410px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-103.0002,-627)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-103.0002,-627)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-103.0002,-627)'>
+
+ <path inkscape:connector-curvature='0' d='m 115.0002,628 c 1.662,0 3,1.338 3,3 l 0,6 c 0,1.662 -1.338,3 -3,3 l -8,0 c -1.662,0 -3,-1.338 -3,-3 l 0,-6 c 0,-1.662 1.338,-3 3,-3 l 8,0 z m 0,2 -8,0 c -0.554,0 -1,0.446 -1,1 l 0,6 c 0,0.554 0.446,1 1,1 l 8,0 c 0.554,0 1,-0.446 1,-1 l 0,-6 c 0,-0.554 -0.446,-1 -1,-1 z' id='rect3773-9' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 111.0002,641 c -5,0 -5,1 -5,1 0,1 1,1 1,1 l 8,0 c 1,0 1,-1 1,-1 0,0 0,-1 -5,-1 z' id='rect3778-4' sodipodi:nodetypes='sscccs' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 106.0002,629 -1,9.52459 12,-0.52459 z m 1.01829,3.99621 4.98171,4.00379 -4.96497,0.0256 z' id='path11753-4' sodipodi:nodetypes='cccccccc' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-103.0002,-627)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-103.0002,-627)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-103.0002,-627)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-103.0002,-627)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-103.0002,-627)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-103.0002,-627)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/preferences-desktop-font-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/preferences-desktop-font-symbolic-ref.png
new file mode 100644
index 00000000..466fd8a4
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/preferences-desktop-font-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/preferences-desktop-font-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/preferences-desktop-font-symbolic.svg
new file mode 100644
index 00000000..a82bbc73
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/preferences-desktop-font-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='preferences-desktop-font-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.91 r13725' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer11' inkscape:cx='-37.829512' inkscape:cy='-6.67006' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='11.313708'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='98.000002' originy='452' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-143.0002,-669)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-143.0002,-669)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-143.0002,-669)'>
+
+ <path inkscape:connector-curvature='0' d='m 146,674.01172 0,2 1.91992,0 c -0.0552,0 0.084,0.15932 0.084,0.082 l 0,0.92383 -1.00391,0 c -1.71588,0 -3.03006,1.12548 -3.05469,2.48437 -0.0123,0.67945 0.30583,1.363 0.86133,1.82227 0.5555,0.45927 1.31545,0.69922 2.19336,0.69922 l 3.00391,0 0,-5.92969 c 0,-1.17119 -0.88715,-2.08203 -2.08399,-2.08203 l -1.91992,0 z m 1,5.00586 1.00391,0 0,1.00586 -1.00391,0 c -0.51941,0 -0.79379,-0.1379 -0.91992,-0.24219 -0.12614,-0.10429 -0.13607,-0.17218 -0.13477,-0.24414 0.003,-0.14393 0.0849,-0.51953 1.05469,-0.51953 z' id='path28099-5' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 150.99805,673 0,9.02344 3.00195,0 c 0.93855,0 1.76882,-0.37254 2.29883,-0.95899 0.53,-0.58644 0.76574,-1.33658 0.75586,-2.0664 -0.01,-0.72982 -0.26223,-1.46579 -0.78907,-2.04297 C 155.73879,676.3779 154.92105,676 154,676 l -1.00195,0 0,-3 -2,0 z m 2,5 1.00195,0 c 0.42179,0 0.62551,0.12569 0.78711,0.30273 0.1616,0.17705 0.26384,0.44685 0.26758,0.72266 0.004,0.27581 -0.0886,0.52949 -0.24024,0.69727 -0.15162,0.16777 -0.35569,0.30078 -0.81445,0.30078 l -1.00195,0 0,-2.02344 z' id='path28101-6' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-143.0002,-669)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-143.0002,-669)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-143.0002,-669)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-143.0002,-669)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-143.0002,-669)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-143.0002,-669)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/preferences-desktop-keyboard-shortcuts-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/preferences-desktop-keyboard-shortcuts-symbolic-ref.png
new file mode 100644
index 00000000..89405938
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/preferences-desktop-keyboard-shortcuts-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/preferences-desktop-keyboard-shortcuts-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/preferences-desktop-keyboard-shortcuts-symbolic.svg
new file mode 100644
index 00000000..90df7be8
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/preferences-desktop-keyboard-shortcuts-symbolic.svg
@@ -0,0 +1,33 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='preferences-desktop-keyboard-shortcuts-symbolic.svg' width='15.999999' inkscape:version='0.48.1 r9760' version='1.1' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' height='16' id='svg7384' xmlns:svg='http://www.w3.org/2000/svg' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:cc='http://creativecommons.org/ns#' xmlns='http://www.w3.org/2000/svg' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:pageopacity='1' inkscape:snap-to-guides='true' borderopacity='1' inkscape:window-maximized='0' inkscape:snap-bbox='true' inkscape:object-nodes='false' inkscape:object-paths='false' inkscape:window-width='1226' pagecolor='#555753' gridtolerance='10' inkscape:pageshadow='2' bordercolor='#666666' inkscape:current-layer='layer11' showguides='true' id='namedview88' showborder='false' inkscape:bbox-paths='false' inkscape:snap-global='true' inkscape:window-x='2804' inkscape:window-y='77' inkscape:snap-nodes='true' inkscape:guide-bbox='true' inkscape:snap-grids='true' objecttolerance='10' inkscape:cx='-187.32058' inkscape:cy='-261.01275' inkscape:snap-others='false' showgrid='false' inkscape:snap-bbox-midpoints='false' guidetolerance='10' inkscape:zoom='1' inkscape:window-height='967'>
+ <inkscape:grid enabled='true' type='xygrid' id='grid4866' snapvisiblegridlinesonly='true' visible='true' empspacing='2' spacingx='1px' spacingy='1px'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:label='status' id='layer9' style='display:inline' inkscape:groupmode='layer' transform='translate(-243.0002,-509)'/>
+ <g inkscape:label='devices' id='layer10' inkscape:groupmode='layer' transform='translate(-243.0002,-509)'/>
+ <g inkscape:label='apps' id='layer11' inkscape:groupmode='layer' transform='translate(-243.0002,-509)'>
+
+ <path sodipodi:nodetypes='ssssssssssssssssss' d='m 244.5019,517 c -0.83194,0 -1.5017,0.669 -1.5017,1.5 l 0,4 c 0,0.831 0.66976,1.5 1.5017,1.5 l 9.01024,0 c 0.83194,0 1.5017,-0.669 1.5017,-1.5 l 0,-4 c 0,-0.831 -0.66976,-1.5 -1.5017,-1.5 z m 0.0626,1 c 3.18558,0.26867 6.11566,0.23073 8.88509,0 0.30226,-0.0252 0.56314,0.25953 0.56314,0.5625 l 0,2.875 c 0,0.30297 -0.26175,0.52842 -0.56314,0.5625 -3.00415,0.33966 -5.96427,0.32696 -8.88509,0 -0.30144,-0.0337 -0.56314,-0.25953 -0.56314,-0.5625 l 0,-2.875 c 0,-0.30297 0.26089,-0.58799 0.56314,-0.5625 z' id='rect5333-9' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' inkscape:connector-curvature='0'/>
+ <path sodipodi:nodetypes='ssssssssssssssssss' d='m 252.511,509 c -0.83194,0 -1.5017,0.669 -1.5017,1.5 l 0,4 c 0,0.831 0.66976,1.5 1.5017,1.5 l 4.00455,0 c 0.83195,0 1.50171,-0.669 1.50171,-1.5 l 0,-4 c 0,-0.831 -0.66976,-1.5 -1.50171,-1.5 z m 0.0626,1 c 1.29314,0.1279 2.58627,0.12207 3.87941,0 0.30197,-0.0285 0.56314,0.25953 0.56314,0.5625 l 0,2.875 c 0,0.30297 -0.26208,0.52562 -0.56314,0.5625 -1.25472,0.1537 -2.54147,0.17922 -3.87941,0 -0.30063,-0.0403 -0.56314,-0.25953 -0.56314,-0.5625 l 0,-2.875 c 0,-0.30297 0.2613,-0.59235 0.56314,-0.5625 z' id='rect5333-9-8' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' inkscape:connector-curvature='0'/>
+ <path sodipodi:nodetypes='ssssssssssssssssss' d='m 244.5019,510 c -0.83194,0 -1.5017,0.669 -1.5017,1.5 l 0,3 c 0,0.831 0.66976,1.5 1.5017,1.5 l 4.00455,0 c 0.83195,0 1.50171,-0.669 1.50171,-1.5 l 0,-3 c 0,-0.831 -0.66976,-1.5 -1.50171,-1.5 z m 0.0626,1 c 1.69195,0.19941 2.84796,0.13085 3.8794,0 0.3009,-0.0382 0.56314,0.25953 0.56314,0.5625 l 0,2.875 c 0,0.30297 -0.26231,0.5238 -0.56314,0.5625 -1.21498,0.1563 -2.49789,0.17677 -3.8794,0 -0.30087,-0.0385 -0.56314,-0.25953 -0.56314,-0.5625 l 0,-2.875 c 0,-0.30297 0.2619,-0.598 0.56314,-0.5625 z' id='path11636' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' inkscape:connector-curvature='0'/>
+ </g>
+ <g inkscape:label='places' id='layer13' inkscape:groupmode='layer' transform='translate(-243.0002,-509)'/>
+ <g inkscape:label='mimetypes' id='layer14' inkscape:groupmode='layer' transform='translate(-243.0002,-509)'/>
+ <g inkscape:label='emblems' id='layer15' style='display:inline' inkscape:groupmode='layer' transform='translate(-243.0002,-509)'/>
+ <g inkscape:label='emotes' id='g71291' style='display:inline' inkscape:groupmode='layer' transform='translate(-243.0002,-509)'/>
+ <g inkscape:label='categories' id='g4953' style='display:inline' inkscape:groupmode='layer' transform='translate(-243.0002,-509)'/>
+ <g inkscape:label='actions' id='layer12' style='display:inline' inkscape:groupmode='layer' transform='translate(-243.0002,-509)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/preferences-desktop-keyboard-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/preferences-desktop-keyboard-symbolic-ref.png
new file mode 100644
index 00000000..27a3b2cf
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/preferences-desktop-keyboard-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/preferences-desktop-keyboard-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/preferences-desktop-keyboard-symbolic.svg
new file mode 100644
index 00000000..47187873
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/preferences-desktop-keyboard-symbolic.svg
@@ -0,0 +1,35 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='preferences-desktop-keyboard-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.92pre3 r' viewBox='0 0 16.000002 16' width='16.000002' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer11' inkscape:cx='15.391062' inkscape:cy='10.06487' inkscape:document-units='px' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:measure-end='0,0' inkscape:measure-start='0,0' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='true' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1016' inkscape:window-maximized='1' inkscape:window-width='1920' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='158' originy='412' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-83.000198,-629)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-83.000198,-629)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-83.000198,-629)'>
+ <path inkscape:connector-curvature='0' d='m 84.0002,631 c -0.554,0 -1,0.446 -1,1 v 10 c 0,0.554 0.446,1 1,1 h 14 c 0.554,0 1,-0.446 1,-1 v -10 c 0,-0.554 -0.446,-1 -1,-1 z m 1.25,2 h 1.5 c 0.1385,0 0.25,0.1115 0.25,0.25 v 1.5 c 0,0.1385 -0.1115,0.25 -0.25,0.25 h -1.5 c -0.1385,0 -0.25,-0.1115 -0.25,-0.25 v -1.5 c 0,-0.1385 0.1115,-0.25 0.25,-0.25 z m 3,0 h 1.5 c 0.1385,0 0.25,0.1115 0.25,0.25 v 1.5 c 0,0.1385 -0.1115,0.25 -0.25,0.25 h -1.5 c -0.1385,0 -0.25,-0.1115 -0.25,-0.25 v -1.5 c 0,-0.1385 0.1115,-0.25 0.25,-0.25 z m 3,0 h 1.5 c 0.1385,0 0.25,0.1115 0.25,0.25 v 1.5 c 0,0.1385 -0.1115,0.25 -0.25,0.25 h -1.5 c -0.1385,0 -0.25,-0.1115 -0.25,-0.25 v -1.5 c 0,-0.1385 0.1115,-0.25 0.25,-0.25 z m 3,0 h 1.5 c 0.1385,0 0.25,0.1115 0.25,0.25 v 1.5 c 0,0.1385 -0.1115,0.25 -0.25,0.25 h -1.5 c -0.1385,0 -0.25,-0.1115 -0.25,-0.25 v -1.5 c 0,-0.1385 0.1115,-0.25 0.25,-0.25 z m -8,3 h 1.5 c 0.1385,0 0.25,0.1115 0.25,0.25 v 1.5 c 0,0.1385 -0.1115,0.25 -0.25,0.25 h -1.5 c -0.1385,0 -0.25,-0.1115 -0.25,-0.25 v -1.5 c 0,-0.1385 0.1115,-0.25 0.25,-0.25 z m 3,0 h 1.5 c 0.1385,0 0.25,0.1115 0.25,0.25 v 1.5 c 0,0.1385 -0.1115,0.25 -0.25,0.25 h -1.5 c -0.1385,0 -0.25,-0.1115 -0.25,-0.25 v -1.5 c 0,-0.1385 0.1115,-0.25 0.25,-0.25 z m 3,0 h 1.5 c 0.1385,0 0.25,0.1115 0.25,0.25 v 1.5 c 0,0.1385 -0.1115,0.25 -0.25,0.25 h -1.5 c -0.1385,0 -0.25,-0.1115 -0.25,-0.25 v -1.5 c 0,-0.1385 0.1115,-0.25 0.25,-0.25 z m 3,0 h 1.5 c 0.1385,0 0.25,0.1115 0.25,0.25 v 1.5 c 0,0.1385 -0.1115,0.25 -0.25,0.25 h -1.5 c -0.1385,0 -0.25,-0.1115 -0.25,-0.25 v -1.5 c 0,-0.1385 0.1115,-0.25 0.25,-0.25 z m -10,3 h 1.5 c 0.1385,0 0.25,0.1115 0.25,0.25 v 1.5 c 0,0.1385 -0.1115,0.25 -0.25,0.25 h -1.5 c -0.1385,0 -0.25,-0.1115 -0.25,-0.25 v -1.5 c 0,-0.1385 0.1115,-0.25 0.25,-0.25 z m 3,0 h 5.5 c 0.1385,0 0.25,0.1115 0.25,0.25 v 1.5 c 0,0.1385 -0.1115,0.25 -0.25,0.25 h -5.5 c -0.1385,0 -0.25,-0.1115 -0.25,-0.25 v -1.5 c 0,-0.1385 0.1115,-0.25 0.25,-0.25 z m 7,0 h 2.5 c 0.1385,0 0.25,0.1115 0.25,0.25 v 1.5 c 0,0.1385 -0.1115,0.25 -0.25,0.25 h -2.5 c -0.1385,0 -0.25,-0.1115 -0.25,-0.25 v -1.5 c 0,-0.1385 0.1115,-0.25 0.25,-0.25 z' id='use9530' style='color:#bebebe;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;marker:none;enable-background:accumulate'/>
+
+ </g>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-83.000198,-629)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-83.000198,-629)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-83.000198,-629)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-83.000198,-629)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-83.000198,-629)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-83.000198,-629)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/preferences-desktop-locale-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/preferences-desktop-locale-symbolic-ref.png
new file mode 100644
index 00000000..22a3cfb1
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/preferences-desktop-locale-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/preferences-desktop-locale-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/preferences-desktop-locale-symbolic.svg
new file mode 100644
index 00000000..20b36a8d
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/preferences-desktop-locale-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='preferences-desktop-locale-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.4 r9939' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer11' inkscape:cx='13.593311' inkscape:cy='7.90316' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='1600' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='-62.02888px' originy='432.02581px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-303.02908,-649.02581)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-303.02908,-649.02581)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-303.02908,-649.02581)'>
+
+ <path inkscape:connector-curvature='0' d='m 307.725,651.25977 c -3.58218,0 -4.66582,1.39975 -4.66582,1.39975 l 0,10.04946 c 0,0 1.08364,-1.07673 4.66582,-1.07673 2.9161,0 4.47225,1.07673 7.17818,1.07673 2.08923,0 3.19429,-1.39975 3.19429,-1.39975 l 0,-10.04946 c 0,0 -1.14095,1.04084 -3.23018,1.04084 -3.3734,0 -3.97619,-1.04084 -7.14229,-1.04084 z m 2.93145,2.77148 c 1.32876,0 2.375,1.08037 2.375,2.4375 0,1.35713 -1.04624,2.46875 -2.375,2.46875 -1.32876,0 -2.40625,-1.11162 -2.40625,-2.46875 0,-1.35713 1.07749,-2.4375 2.40625,-2.4375 z m -4.5625,0.96875 0.96875,1.03125 -0.9375,-0.0312 0.9375,1 -0.96875,-0.0312 0.96875,1.03125 -1,-0.0312 0.0312,-1 -0.0312,0 0.0312,-0.9688 -0.0312,0 z m 4.5625,0 c -0.794,0 -1.46875,0.6578 -1.46875,1.46875 0,0.81095 0.67475,1.46875 1.46875,1.46875 0.79399,0 1.4375,-0.6578 1.4375,-1.46875 0,-0.81095 -0.64351,-1.46875 -1.4375,-1.46875 z m 4.375,0 0,1 0.0312,0.96875 -0.0312,0 0.0312,1 -1,0.0312 0.96875,-1.03125 -0.96875,0.0312 0.9375,-1 -0.9375,0.0312 z m -7.9375,2.96875 0.96875,1.03125 -1,-0.0312 z m 6.9375,0 0.0312,1 -1,0.0312 z m -5.9375,1 0.96875,1.03125 -1,-0.0312 z m 4.9375,0 0.0312,1 -1,0.0312 z' id='rect7213' sodipodi:nodetypes='sccssccsssssssccccccccccccsssssccccccccccccccccccccccccccc' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-303.02908,-649.02581)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-303.02908,-649.02581)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-303.02908,-649.02581)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-303.02908,-649.02581)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-303.02908,-649.02581)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-303.02908,-649.02581)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/preferences-desktop-remote-desktop-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/preferences-desktop-remote-desktop-symbolic-ref.png
new file mode 100644
index 00000000..5d090277
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/preferences-desktop-remote-desktop-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/preferences-desktop-remote-desktop-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/preferences-desktop-remote-desktop-symbolic.svg
new file mode 100644
index 00000000..e26bff78
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/preferences-desktop-remote-desktop-symbolic.svg
@@ -0,0 +1,34 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='preferences-desktop-remote-desktop-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer11' inkscape:cx='137.77077' inkscape:cy='45.59389' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='702' inkscape:window-maximized='1' inkscape:window-width='1366' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='158px' originy='432px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-83.0002,-649)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-83.0002,-649)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-83.0002,-649)'>
+
+ <path inkscape:connector-curvature='0' d='m 95.000206,650 c 1.662,0 3,1.338 3,3 l 0,6 c 0,1.662 -1.338,3 -3,3 l -8,0 c -1.662,0 -3,-1.338 -3,-3 l 0,-6 c 0,-1.662 1.338,-3 3,-3 l 8,0 z m 0,2 -8,0 c -0.554,0 -1,0.446 -1,1 l 0,6 c 0,0.554 0.446,1 1,1 l 8,0 c 0.554,0 1,-0.446 1,-1 l 0,-6 c 0,-0.554 -0.446,-1 -1,-1 z' id='path5341' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 91.000206,663 c -5,0 -5,1 -5,1 0,1 1,1 1,1 l 8,0 c 1,0 1,-1 1,-1 0,0 0,-1 -5,-1 z' id='path5343' sodipodi:nodetypes='sscccs' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 87.500202,654 c 0,0 -0.5,0 -0.5,0.5 l 0,4 c 0,0.5 0.5,0.5 0.5,0.5 l 4,0 c 0.5,0 0.5,-0.5 0.5,-0.5 l 0,-4 c 0,-0.5 -0.4373,-0.5 -0.5,-0.5 z m 0.5002,1.99849 3,0 0,1.99986 -3,0 z' id='rect5771-9' sodipodi:nodetypes='csscscsscccccc' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 93.500402,653 c 0,0 -0.499898,0 -0.5,0.5 l -2e-4,0.98437 c 0,0 0,0.4995 0.5,0.5 l 0.9998,10e-4 c 0,0 0.499898,0 0.5,-0.5 l 2e-4,-0.98437 c 0,0 0,-0.49931 -0.5,-0.5 z' id='rect7987-0' sodipodi:nodetypes='cscscscsc' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-83.0002,-649)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-83.0002,-649)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-83.0002,-649)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-83.0002,-649)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-83.0002,-649)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-83.0002,-649)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/preferences-desktop-screensaver-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/preferences-desktop-screensaver-symbolic-ref.png
new file mode 100644
index 00000000..8fa91ab3
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/preferences-desktop-screensaver-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/preferences-desktop-screensaver-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/preferences-desktop-screensaver-symbolic.svg
new file mode 100644
index 00000000..976a90ca
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/preferences-desktop-screensaver-symbolic.svg
@@ -0,0 +1,35 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:svg='http://www.w3.org/2000/svg' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' sodipodi:docname='preferences-desktop-screensaver-symbolic.svg' version='1.1' inkscape:version='0.47+devel r9385 custom' height='16' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:cy='-170.89343' pagecolor='#555753' borderopacity='1' showborder='false' inkscape:bbox-paths='false' guidetolerance='10' inkscape:window-width='1310' showguides='true' inkscape:snap-bbox='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:snap-nodes='false' bordercolor='#666666' objecttolerance='10' id='namedview88' showgrid='false' inkscape:window-maximized='0' inkscape:window-x='2152' inkscape:window-y='452' gridtolerance='10' inkscape:window-height='859' inkscape:current-layer='layer11' inkscape:zoom='0.70710678' inkscape:cx='-158.43414' inkscape:pageopacity='1'>
+ <inkscape:grid spacingx='1px' spacingy='1px' id='grid4866' empspacing='2' enabled='true' type='xygrid' snapvisiblegridlinesonly='true' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:label='status' transform='translate(-262,-381)' inkscape:groupmode='layer' id='layer9' style='display:inline'/>
+ <g inkscape:label='devices' transform='translate(-262,-381)' inkscape:groupmode='layer' id='layer10'/>
+ <g inkscape:label='apps' transform='translate(-262,-381)' inkscape:groupmode='layer' id='layer11'>
+ <g inkscape:label='accessories-calculator' transform='translate(214,-17)' id='g11722-3-5'>
+
+ </g>
+ <path inkscape:connector-curvature='0' d='m 274.1086,387 c 0.61968,0.75088 0.99548,1.7106 0.99548,2.76018 0,2.39905 -1.94483,4.34389 -4.3439,4.34389 -1.04958,0 -2.00928,-0.37579 -2.76018,-0.99547 0.52525,2.23887 2.53308,3.8914 4.93213,3.8914 2.79892,0 5.06787,-2.26897 5.06787,-5.06787 0,-2.39908 -1.65253,-4.40688 -3.8914,-4.93213 z' id='path5549' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ <rect x='267.79041' y='383.79041' id='rect5595' rx='0.72097087' ry='0.72097087' height='1.4419417' width='1.4419417' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ <rect x='271.8125' y='384.8125' id='rect5597' rx='0.69887376' ry='0.69887376' height='1.3977475' width='1.3977475' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ <rect x='268.79041' y='386.79041' id='rect5599' rx='0.72097087' ry='0.72097087' height='1.4419417' width='1.4419417' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ <path sodipodi:cy='390' sodipodi:r2='1.0537004' transform='translate(0.50492,-3.495079)' inkscape:rounded='0' inkscape:flatsided='false' inkscape:transform-center-x='-0.18138477' inkscape:transform-center-y='-0.067100233' d='M 265,393 264.25492,390.74508 262,390 264.25492,389.25492 265,387 265.74508,389.25492 268,390 l -2.25492,0.74508 z' id='path11638' sodipodi:type='star' sodipodi:arg1='1.5707963' sodipodi:r1='3' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' sodipodi:arg2='2.3561945' inkscape:randomized='0' sodipodi:cx='265' sodipodi:sides='4'/>
+ </g>
+ <g inkscape:label='actions' transform='translate(-262,-381)' inkscape:groupmode='layer' id='layer12'/>
+ <g inkscape:label='places' transform='translate(-262,-381)' inkscape:groupmode='layer' id='layer13'/>
+ <g inkscape:label='mimetypes' transform='translate(-262,-381)' inkscape:groupmode='layer' id='layer14'/>
+ <g inkscape:label='emblems' transform='translate(-262,-381)' inkscape:groupmode='layer' id='layer15'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/preferences-desktop-wallpaper-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/preferences-desktop-wallpaper-symbolic-ref.png
new file mode 100644
index 00000000..3b5e421e
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/preferences-desktop-wallpaper-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/preferences-desktop-wallpaper-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/preferences-desktop-wallpaper-symbolic.svg
new file mode 100644
index 00000000..810a532a
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/preferences-desktop-wallpaper-symbolic.svg
@@ -0,0 +1,34 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='preferences-desktop-wallpaper-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer11' inkscape:cx='157.77077' inkscape:cy='45.59389' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='702' inkscape:window-maximized='1' inkscape:window-width='1366' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='178px' originy='432px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-63.0002,-649)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-63.0002,-649)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-63.0002,-649)'>
+
+ <path inkscape:connector-curvature='0' d='m 75.000204,650 c 1.662,0 3,1.338 3,3 l 0,6 c 0,1.662 -1.338,3 -3,3 l -8,0 c -1.662,0 -3,-1.338 -3,-3 l 0,-6 c 0,-1.662 1.338,-3 3,-3 l 8,0 z m 0,2 -8,0 c -0.554,0 -1,0.446 -1,1 l 0,6 c 0,0.554 0.446,1 1,1 l 8,0 c 0.554,0 1,-0.446 1,-1 l 0,-6 c 0,-0.554 -0.446,-1 -1,-1 z' id='path5299' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 71.000204,663 c -5,0 -5,1 -5,1 0,1 1,1 1,1 l 8,0 c 1,0 1,-1 1,-1 0,0 0,-1 -5,-1 z' id='path5301' sodipodi:nodetypes='sscccs' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 71.000202,652.99993 0,5.00007 -4,7e-5 0,0.99993 8,0 0,-6 z' id='rect4262-0' sodipodi:nodetypes='ccccccc' style='opacity:0.35;color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 70.000202,653 -3,4 3,0 z' id='rect4262-6-8' sodipodi:nodetypes='cccc' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.000103;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-63.0002,-649)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-63.0002,-649)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-63.0002,-649)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-63.0002,-649)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-63.0002,-649)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-63.0002,-649)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/preferences-other-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/preferences-other-symbolic-ref.png
new file mode 100644
index 00000000..719499d8
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/preferences-other-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/preferences-other-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/preferences-other-symbolic.svg
new file mode 100644
index 00000000..eb58970b
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/preferences-other-symbolic.svg
@@ -0,0 +1,35 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg inkscape:version='0.48.1 r9760' version='1.1' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns='http://www.w3.org/2000/svg' width='16' height='16' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='preferences-other-symbolic.svg' id='svg7384' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:svg='http://www.w3.org/2000/svg' xmlns:cc='http://creativecommons.org/ns#'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:window-x='0' inkscape:window-y='26' inkscape:window-maximized='0' pagecolor='#555753' showborder='false' inkscape:pageshadow='2' bordercolor='#666666' inkscape:snap-bbox='true' inkscape:current-layer='g4953' inkscape:snap-grids='true' inkscape:bbox-paths='false' inkscape:snap-others='false' inkscape:window-height='1020' inkscape:snap-nodes='true' borderopacity='1' showguides='true' inkscape:snap-global='true' inkscape:pageopacity='1' inkscape:object-paths='false' objecttolerance='10' gridtolerance='10' showgrid='false' inkscape:zoom='1' inkscape:snap-to-guides='true' inkscape:object-nodes='false' id='namedview88' inkscape:snap-bbox-midpoints='false' inkscape:guide-bbox='true' inkscape:window-width='1598' inkscape:cx='-153.94051' inkscape:cy='-144.55779' guidetolerance='10'>
+ <inkscape:grid visible='true' spacingx='1px' spacingy='1px' empspacing='2' enabled='true' id='grid4866' snapvisiblegridlinesonly='true' type='xygrid'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:label='status' style='display:inline' inkscape:groupmode='layer' id='layer9' transform='translate(-541.99672,-462)'/>
+ <g inkscape:label='devices' inkscape:groupmode='layer' id='layer10' transform='translate(-541.99672,-462)'/>
+ <g inkscape:label='apps' inkscape:groupmode='layer' id='layer11' transform='translate(-541.99672,-462)'/>
+ <g inkscape:label='places' inkscape:groupmode='layer' id='layer13' transform='translate(-541.99672,-462)'/>
+ <g inkscape:label='mimetypes' inkscape:groupmode='layer' id='layer14' transform='translate(-541.99672,-462)'/>
+ <g inkscape:label='emblems' style='display:inline' inkscape:groupmode='layer' id='layer15' transform='translate(-541.99672,-462)'/>
+ <g inkscape:label='emotes' style='display:inline' inkscape:groupmode='layer' transform='translate(-541.99672,-462)' id='g71291'/>
+ <g inkscape:label='categories' style='display:inline' inkscape:groupmode='layer' id='g4953' transform='translate(-541.99672,-462)'>
+ <path d='m 541.99865,473.99996 c 0.004,-0.22414 0.11244,-0.53067 0.30379,-0.70429 l 2.16171,-2.11644 c 0.23264,-0.24354 0.78664,-0.29256 1.01104,-0.15675 0.0805,0.002 1.13546,0.63126 1.28813,0.86541 0.61665,0.94579 -0.34406,1.82732 -1.17392,1.54685 l -0.34957,-0.2117 -1.60232,1.57174 c -0.63718,0.52635 -1.69148,0.0922 -1.6389,-0.79478 z' inkscape:connector-curvature='0' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans' sodipodi:nodetypes='ccccsccccc' id='path7270-2'/>
+ <path d='m 553.61583,462.11832 c 0.38966,-0.10147 0.79073,-0.11077 1.17065,-0.0809 l -1.3597,2.3059 c -0.27942,0.47386 -0.12275,1.07071 0.35378,1.34773 l 0.8743,0.50825 c 0.47652,0.277 1.07741,0.12052 1.35684,-0.35334 l 1.35969,-2.3059 c 0.21223,0.3143 0.40035,0.66611 0.50195,1.05317 0.48628,1.85256 -0.63144,3.74808 -2.4965,4.23377 -0.38967,0.10147 -0.79073,0.11077 -1.17065,0.0809 l -0.80213,1.1146 L 549.99434,470 c 0,0 1.5186,-2.57735 1.62694,-2.59472 -0.21223,-0.3143 -0.40034,-0.66611 -0.50194,-1.05317 -0.48629,-1.85256 0.63143,-3.7481 2.49649,-4.23379 z' inkscape:connector-curvature='0' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans' sodipodi:nodetypes='sccccccssccccss' id='path3908-63'/>
+ <path d='m 545.59553,462.7188 c -0.2298,0.0471 -0.44326,0.13096 -0.65529,0.21875 -0.0167,0.62433 0.0868,1.44177 -0.15602,1.65625 -0.23862,0.21077 -1.03684,0.0343 -1.65382,-0.0313 -0.1312,0.23649 -0.23492,0.48523 -0.31205,0.75 0.4774,0.39586 1.13884,0.83901 1.15456,1.15625 0.0159,0.32119 -0.6255,0.80489 -1.06094,1.25 0.10323,0.25783 0.24977,0.49354 0.40565,0.71875 0.60743,-0.12641 1.36439,-0.37354 1.62262,-0.1875 0.26292,0.18942 0.26482,1.00535 0.34325,1.625 0.24918,0.075 0.51175,0.1045 0.7801,0.125 0.28094,-0.55462 0.56658,-1.3198 0.87372,-1.40625 0.31529,-0.0887 0.96213,0.45813 1.4978,0.78125 0.21839,-0.1516 0.41233,-0.33706 0.59288,-0.53125 -0.25347,-0.57232 -0.72003,-1.29192 -0.59288,-1.59375 0.12727,-0.30211 0.97398,-0.46963 1.56021,-0.6875 0.004,-0.0735 0.0312,-0.14414 0.0312,-0.21875 0,-0.19137 -0.0344,-0.37899 -0.0624,-0.5625 -0.60521,-0.16082 -1.46506,-0.2413 -1.62262,-0.53125 -0.15651,-0.28801 0.24143,-1.0614 0.43686,-1.65625 -0.20087,-0.17858 -0.4188,-0.33716 -0.65529,-0.46875 -0.50016,0.37513 -1.08274,0.99436 -1.40419,0.9375 -0.31642,-0.056 -0.66192,-0.81955 -0.99853,-1.34375 -0.0401,0.007 -0.0851,-0.008 -0.12482,0 z m 0.62408,1.875 c 0.93062,0 1.68503,0.75552 1.68503,1.6875 0,0.93198 -0.75441,1.6875 -1.68503,1.6875 -0.93061,0 -1.68502,-0.75552 -1.68502,-1.6875 0,-0.93198 0.75441,-1.6875 1.68502,-1.6875 z' inkscape:connector-curvature='0' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' id='path42972-6'/>
+ <path d='m 544.99379,471 9.98535,0 0.008,6.0625 c 0,0.4922 -0.47197,0.9375 -0.99463,0.9375 l -7.99221,0 c -0.53827,0 -0.99853,-0.42964 -0.99853,-1 z' inkscape:connector-curvature='0' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' sodipodi:nodetypes='ccccccc' id='rect7268-7'/>
+ <path d='m 557.95755,473.97707 c -0.004,-0.22414 -0.11244,-0.53067 -0.30379,-0.70429 l -2.16171,-2.11644 c -0.23264,-0.24354 -0.78664,-0.29256 -1.01103,-0.15675 -0.0805,0.002 -1.13547,0.63126 -1.28813,0.86541 -0.61666,0.94579 0.34405,1.82732 1.17391,1.54685 l 0.34957,-0.2117 1.60232,1.57174 c 0.63718,0.52635 1.69148,0.0923 1.6389,-0.79478 z' inkscape:connector-curvature='0' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans' sodipodi:nodetypes='ccccsccccc' id='path6196'/>
+
+ </g>
+ <g inkscape:label='actions' style='display:inline' inkscape:groupmode='layer' id='layer12' transform='translate(-541.99672,-462)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/preferences-system-details-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/preferences-system-details-symbolic-ref.png
new file mode 100644
index 00000000..83dad491
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/preferences-system-details-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/preferences-system-details-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/preferences-system-details-symbolic.svg
new file mode 100644
index 00000000..46cef6c0
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/preferences-system-details-symbolic.svg
@@ -0,0 +1,35 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='preferences-system-details-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.92+devel unknown' viewBox='0 0 16 16' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer11' inkscape:cx='27.202729' inkscape:cy='10.2361' inkscape:document-rotation='0' inkscape:document-units='px' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:measure-end='0,0' inkscape:measure-start='-190.687,-191.14' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='3440' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='77.999999' originy='452' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-163.0002,-669)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-163.0002,-669)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-163.0002,-669)'>
+
+ <path inkscape:connector-curvature='0' d='m 166.28829,670.96875 c -0.74253,0 -1.31934,0.57683 -1.31934,1.31934 v 9.42382 c 0,0.74251 0.57681,1.31934 1.31934,1.31934 h 9.42382 c 0.74253,0 1.31934,-0.57683 1.31934,-1.31934 v -9.42382 c 0,-0.74251 -0.57681,-1.31934 -1.31934,-1.31934 z M 170.0002,673 h 2 v 2 h -2 z m 0,3 h 2 v 5 h -2 z' id='path7479' sodipodi:nodetypes='ccccccccccccccccccc' style='color:#bebebe;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;enable-background:accumulate'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-163.0002,-669)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-163.0002,-669)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-163.0002,-669)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-163.0002,-669)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-163.0002,-669)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-163.0002,-669)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/preferences-system-devices-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/preferences-system-devices-symbolic-ref.png
new file mode 100644
index 00000000..cd79b5eb
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/preferences-system-devices-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/preferences-system-devices-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/preferences-system-devices-symbolic.svg
new file mode 100644
index 00000000..bffa4b89
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/preferences-system-devices-symbolic.svg
@@ -0,0 +1,37 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='preferences-system-devices-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.92.2 (5c3e80d, 2017-08-06)' viewBox='0 0 16 16' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer11' inkscape:cx='155.34505' inkscape:cy='101.35387' inkscape:document-rotation='0' inkscape:document-units='px' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:measure-end='0,0' inkscape:measure-start='-190.687,-191.14' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1016' inkscape:window-maximized='1' inkscape:window-width='1920' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='57.999986' originy='452' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-183.00021,-669)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-183.00021,-669)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-183.00021,-669)'>
+
+ <path inkscape:connector-curvature='0' d='m 192,675 c -1.0907,0 -2,0.9093 -2,2 v 3 c 0,1.0907 0.9093,2 2,2 h 5 c 1.0907,0 2,-0.9093 2,-2 v -3 c 0,-1.0907 -0.9093,-2 -2,-2 z m 0,2 h 5 v 3 h -5 z' id='rect3239' style='color:#bebebe;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 194.5002,684 c -2.5,0 -2.5,-0.5 -2.5,-0.5 0,-0.5 0.5,-0.5 0.5,-0.5 h 4 c 0.5,0 0.5,0.5 0.5,0.5 0,0 0,0.5 -2.5,0.5 z' id='path3243' sodipodi:nodetypes='sscccs' style='display:inline;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:0.5;enable-background:new'/>
+ <path inkscape:connector-curvature='0' d='m 186.0002,670 v 1 h 5 v -1 z m -1,2 c -0.554,0 -1,0.446 -1,1 v 2 c 0,0.554 0.446,1 1,1 v -1 h 4.77539 c 0.54839,-0.6101 1.33591,-1 2.22461,-1 h 0.5 0.5 v -1 c 0,-0.554 -0.446,-1 -1,-1 h -1 -5 z m 1,4 v 3 h 3 v -1.5 -0.5 c 0,-0.35292 0.0707,-0.68601 0.18164,-1 z' id='rect3788' style='opacity:1;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-183.00021,-669)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-183.00021,-669)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-183.00021,-669)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-183.00021,-669)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-183.00021,-669)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-183.00021,-669)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/preferences-system-network-proxy-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/preferences-system-network-proxy-symbolic-ref.png
new file mode 100644
index 00000000..af0e130c
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/preferences-system-network-proxy-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/preferences-system-network-proxy-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/preferences-system-network-proxy-symbolic.svg
new file mode 100644
index 00000000..a6c8a01c
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/preferences-system-network-proxy-symbolic.svg
@@ -0,0 +1,37 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='preferences-system-network-proxy-symbolic.svg' width='16' inkscape:version='0.48.1 r9760' version='1.1' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' height='16' id='svg7384' xmlns:svg='http://www.w3.org/2000/svg' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:cc='http://creativecommons.org/ns#' xmlns='http://www.w3.org/2000/svg' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:pageopacity='1' inkscape:snap-to-guides='true' borderopacity='1' inkscape:window-maximized='0' inkscape:snap-bbox='true' inkscape:object-nodes='false' inkscape:object-paths='false' inkscape:window-width='1226' pagecolor='#555753' gridtolerance='10' inkscape:pageshadow='2' bordercolor='#666666' inkscape:current-layer='layer11' showguides='true' id='namedview88' showborder='false' inkscape:bbox-paths='false' inkscape:snap-global='true' inkscape:window-x='2804' inkscape:window-y='77' inkscape:snap-nodes='true' inkscape:guide-bbox='true' inkscape:snap-grids='true' objecttolerance='10' inkscape:cx='-67.32077' inkscape:cy='-240.98635' inkscape:snap-others='false' showgrid='false' inkscape:snap-bbox-midpoints='false' guidetolerance='10' inkscape:zoom='1' inkscape:window-height='967'>
+ <inkscape:grid enabled='true' type='xygrid' id='grid4866' snapvisiblegridlinesonly='true' visible='true' empspacing='2' spacingx='1px' spacingy='1px'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:label='status' id='layer9' style='display:inline' inkscape:groupmode='layer' transform='translate(-123.00039,-529.0264)'/>
+ <g inkscape:label='devices' id='layer10' inkscape:groupmode='layer' transform='translate(-123.00039,-529.0264)'/>
+ <g inkscape:label='apps' id='layer11' inkscape:groupmode='layer' transform='translate(-123.00039,-529.0264)'>
+ <path sodipodi:nodetypes='ccssssssssccc' d='m 127.95963,537.66101 0,2.36614 -3.59094,0 c -0.20663,0 -0.3683,0.20498 -0.3683,0.46705 l 0,1.05849 c 0,0.26197 0.16167,0.46705 0.3683,0.46705 3.42113,0 6.84225,0 10.26339,0 0.20664,0 0.36831,-0.20508 0.36831,-0.46705 l 0,-1.05849 c 0,-0.26197 -0.16167,-0.46705 -0.36831,-0.46705 l -3.65498,0 0,-2.36614 z' id='path11106-5' style='fill:#bebebe;fill-opacity:1;stroke:none;display:inline' inkscape:connector-curvature='0'/>
+ <path sodipodi:nodetypes='sssssssssccscccsscc' d='m 126.80038,529.0264 c -0.95124,0 -1.79999,0.79333 -1.79999,1.74593 l 0,6.61339 c 0,0.95261 0.84875,1.74594 1.86792,1.74594 l 5.26416,0 c 1.01917,0 1.86792,-0.79333 1.86792,-1.74594 l 0,-6.61339 c 0,-0.9526 -0.84875,-1.74593 -1.86792,-1.74593 z m 0.20001,2 5,0 c 1e-5,0.31661 0,-0.31595 0,0 l 0,6 0,0 -5,0 c 0,0 0,0.044 0,0 l 0,-6 c 0,-0.0439 0,0 0,0 z' id='rect11110-4' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans' inkscape:connector-curvature='0'/>
+ <rect y='531.9978' x='128.0004' width='2.9999893' id='rect11880-7' height='1.0021935' style='color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ <rect y='534.0022' x='130.00038' width='1.0000019' id='rect11882-6' height='1.0021935' style='color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ <path d='m 132.22933,532.0264 c 0.0701,0 0,0.20877 0,0.47581 l 0,1.07827 c 0,0.26693 0.0701,0.47581 0.15975,0.47581 1.48385,0 2.96771,0 4.45157,0 0.0896,0 0.15974,-0.20888 0.15974,-0.47581 l 0,-1.07827 c 0,-0.26693 -0.0701,-0.47581 -0.15974,-0.47581 -0.15976,0 -4.5857,0.0631 -4.61132,0 z' id='path11106-9' style='fill:#bebebe;fill-opacity:1;stroke:none;display:inline' inkscape:connector-curvature='0'/>
+ <path d='m 128.97378,540.6506 c 0.0792,-0.0594 0.25217,0.0384 0.39407,0.22323 l 0.57302,0.74611 c 0.14184,0.18469 0.19083,0.37577 0.11162,0.43522 -1.31185,0.9846 -2.62371,1.96921 -3.93557,2.95382 -0.0792,0.0594 -0.25222,-0.0385 -0.39407,-0.22323 l -0.57302,-0.74611 c -0.14184,-0.18469 -0.19083,-0.37577 -0.11162,-0.43522 0,0 3.94648,-2.89315 3.93557,-2.95382 z' id='path11106-9-7-0' style='fill:#bebebe;fill-opacity:1;stroke:none;display:inline' inkscape:connector-curvature='0'/>
+
+ <path d='m 130.027,540.6506 c -0.0792,-0.0594 -0.25217,0.0384 -0.39407,0.22323 l -0.57302,0.74611 c -0.14184,0.18469 -0.19083,0.37577 -0.11162,0.43522 1.31185,0.9846 2.62371,1.96921 3.93557,2.95382 0.0792,0.0594 0.25222,-0.0385 0.39407,-0.22323 l 0.57302,-0.74611 c 0.14184,-0.18469 0.19083,-0.37577 0.11162,-0.43522 0,0 -3.94648,-2.89315 -3.93557,-2.95382 z' id='path3761-5' style='fill:#bebebe;fill-opacity:1;stroke:none;display:inline' inkscape:connector-curvature='0'/>
+ </g>
+ <g inkscape:label='places' id='layer13' inkscape:groupmode='layer' transform='translate(-123.00039,-529.0264)'/>
+ <g inkscape:label='mimetypes' id='layer14' inkscape:groupmode='layer' transform='translate(-123.00039,-529.0264)'/>
+ <g inkscape:label='emblems' id='layer15' style='display:inline' inkscape:groupmode='layer' transform='translate(-123.00039,-529.0264)'/>
+ <g inkscape:label='emotes' id='g71291' style='display:inline' inkscape:groupmode='layer' transform='translate(-123.00039,-529.0264)'/>
+ <g inkscape:label='categories' id='g4953' style='display:inline' inkscape:groupmode='layer' transform='translate(-123.00039,-529.0264)'/>
+ <g inkscape:label='actions' id='layer12' style='display:inline' inkscape:groupmode='layer' transform='translate(-123.00039,-529.0264)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/preferences-system-network-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/preferences-system-network-symbolic-ref.png
new file mode 100644
index 00000000..93a8e4bd
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/preferences-system-network-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/preferences-system-network-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/preferences-system-network-symbolic.svg
new file mode 100644
index 00000000..af61e60e
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/preferences-system-network-symbolic.svg
@@ -0,0 +1,35 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='preferences-system-network-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.2 r9819' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-paths='false' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer11' inkscape:cx='107.26509' inkscape:cy='25.857001' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#555753' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1021' inkscape:window-maximized='1' inkscape:window-width='1920' inkscape:window-x='1600' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-203.00045,-529)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-203.00045,-529)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-203.00045,-529)'>
+
+
+ <g id='g4649' transform='translate(183.00045,312)'>
+ <path inkscape:connector-curvature='0' d='M 1.75,-36 C 0.797797,-36 0,-35.2022 0,-34.25 l 0,4.5 c 0,0.9522 0.797797,1.75 1.75,1.75 l 0.125,0 -0.78125,1.5625 L 0.375,-25 2,-25 8,-25 9.625,-25 8.90625,-26.4375 8.125,-28 8.25,-28 c 0.952203,0 1.75,-0.7978 1.75,-1.75 l 0,-4.5 C 10,-35.2022 9.202203,-36 8.25,-36 l -6.5,0 z m 0.25,2 6,0 0,4 -6,0 0,-4 z' id='path4651' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans' transform='translate(20,257)'/>
+ </g>
+ <path inkscape:connector-curvature='0' d='m 210.7502,530 c -0.9522,0 -1.75,0.7978 -1.75,1.75 l 0,0.25 2,0 0.25,0 5.75,0 0,4 -3,0 0,3.25 c 0,0.6591 -0.25164,1.26982 -0.65625,1.75 l 5.28125,0 -1.5,-3 0.125,0 c 0.9522,0 1.75,-0.7978 1.75,-1.75 l 0,-4.5 c 0,-0.9522 -0.7978,-1.75 -1.75,-1.75 l -6.5,0 z' id='path4653' sodipodi:nodetypes='ccccccccccccccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0pt;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;font-family:Andale Mono'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-203.00045,-529)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-203.00045,-529)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-203.00045,-529)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-203.00045,-529)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-203.00045,-529)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-203.00045,-529)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/preferences-system-notifications-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/preferences-system-notifications-symbolic-ref.png
new file mode 100644
index 00000000..8831767e
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/preferences-system-notifications-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/preferences-system-notifications-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/preferences-system-notifications-symbolic.svg
new file mode 100644
index 00000000..ac7a9d71
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/preferences-system-notifications-symbolic.svg
@@ -0,0 +1,36 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='preferences-system-notifications-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.92.2 5c3e80d, 2017-08-06' viewBox='0 0 16 16' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer11' inkscape:cx='-0.56755' inkscape:cy='19.68866' inkscape:document-rotation='0' inkscape:document-units='px' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:measure-end='0,0' inkscape:measure-start='-190.687,-191.14' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='3440' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-82.02888' originy='432.02581' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-323.02908,-649.02581)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-323.02908,-649.02581)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-323.02908,-649.02581)'>
+
+ <path inkscape:connector-curvature='0' d='m 330.97132,650.97419 c -2.20914,0 -3.33013,1.5 -4,4 l -1,5 c -0.10831,0.54156 -0.44772,1 -1,1 v 1 h 12 v -1 c -0.55229,0 -0.89169,-0.45844 -1,-1 l -1,-5 c -0.53033,-2.5 -1.79086,-4 -4,-4 z' id='path40220' sodipodi:nodetypes='ccsccccscc' style='opacity:1;fill:#babdb6;fill-opacity:1;stroke:none;stroke-width:0.9999997;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:normal'/>
+ <path inkscape:connector-curvature='0' d='m 331.1471,662.97419 a 1.5,1.5 0 0 0 1.41211,1 1.5,1.5 0 0 0 1.41211,-1 z' id='path40774' style='opacity:1;fill:#babdb6;fill-opacity:1;stroke:none;stroke-width:0.99999976;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:normal'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-323.02908,-649.02581)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-323.02908,-649.02581)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-323.02908,-649.02581)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-323.02908,-649.02581)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-323.02908,-649.02581)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-323.02908,-649.02581)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/preferences-system-privacy-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/preferences-system-privacy-symbolic-ref.png
new file mode 100644
index 00000000..8514581f
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/preferences-system-privacy-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/preferences-system-privacy-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/preferences-system-privacy-symbolic.svg
new file mode 100644
index 00000000..484ca147
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/preferences-system-privacy-symbolic.svg
@@ -0,0 +1,35 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='preferences-system-privacy-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.92.2 5c3e80d, 2017-08-06' viewBox='0 0 16 16' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer11' inkscape:cx='19.43245' inkscape:cy='-0.31134' inkscape:document-rotation='0' inkscape:document-units='px' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:measure-end='0,0' inkscape:measure-start='-190.687,-191.14' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='3440' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-62.02888' originy='412.02581' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-303.02908,-629.02581)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-303.02908,-629.02581)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-303.02908,-629.02581)'>
+
+ <path inkscape:connector-curvature='0' d='m 309.9377,630 0.0625,7 h -1 l 0.0625,-6 h -2.0625 v 6 h -1 l 0.0312,-4 h -2.03125 v 8.625 c 0,1.86975 1.50525,3.375 3.375,3.375 h 3.6875 0.5625 4.4375 c 1.06296,0 2,-1.03075 2,-2 V 641 637.96875 635 h -2 V 638.03125 639 h -1.0625 v -9 h -2 v 7 h -1 l -0.0625,-7 z' id='rect14061' style='opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:normal'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-303.02908,-629.02581)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-303.02908,-629.02581)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-303.02908,-629.02581)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-303.02908,-629.02581)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-303.02908,-629.02581)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-303.02908,-629.02581)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/preferences-system-search-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/preferences-system-search-symbolic-ref.png
new file mode 100644
index 00000000..e35933f8
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/preferences-system-search-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/preferences-system-search-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/preferences-system-search-symbolic.svg
new file mode 100644
index 00000000..532bafaa
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/preferences-system-search-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='preferences-system-search-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.4 r9939' version='1.1' width='16.000002' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer11' inkscape:cx='132.77181' inkscape:cy='-26.19885' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='741' inkscape:window-maximized='1' inkscape:window-width='1280' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='199.9998px' originy='450px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-41.000398,-667)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-41.000398,-667)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-41.000398,-667)'>
+ <path inkscape:connector-curvature='0' d='m 47.507806,667.99554 c -3.028856,0 -5.510726,2.47905 -5.510726,5.50447 0,3.02541 2.48187,5.50446 5.510726,5.50446 3.028856,0 5.510726,-2.47905 5.510726,-5.50446 0,-3.02542 -2.48187,-5.50447 -5.510726,-5.50447 z m 0,2.00893 c 1.947357,0 3.499512,1.55039 3.499512,3.49554 0,1.94514 -1.552155,3.49553 -3.499512,3.49553 -1.947357,0 -3.499512,-1.55039 -3.499512,-3.49553 0,-1.94515 1.552155,-3.49554 3.499512,-3.49554 z' id='path5254' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.55467153;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 50.8125,676 a 1.0001,1.0001 0 0 0 -0.5,1.71875 l 4,4 a 1.0054782,1.0054782 0 1 0 1.40625,-1.4375 l -4,-4 A 1.0001,1.0001 0 0 0 50.8125,676 z' id='path5256' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Sans;-inkscape-font-specification:Sans'/>
+
+ </g>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-41.000398,-667)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-41.000398,-667)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-41.000398,-667)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-41.000398,-667)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-41.000398,-667)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-41.000398,-667)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/preferences-system-sharing-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/preferences-system-sharing-symbolic-ref.png
new file mode 100644
index 00000000..0f6c0bdc
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/preferences-system-sharing-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/preferences-system-sharing-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/preferences-system-sharing-symbolic.svg
new file mode 100644
index 00000000..642205e8
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/preferences-system-sharing-symbolic.svg
@@ -0,0 +1,34 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='preferences-system-sharing-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.4 r9939' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer11' inkscape:cx='0.91993565' inkscape:cy='13.174001' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='true' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='741' inkscape:window-maximized='1' inkscape:window-width='1280' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='178px' originy='450px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-63.000204,-667)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-63.000204,-667)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-63.000204,-667)'>
+
+ <path sodipodi:cx='289.03125' sodipodi:cy='178.03125' d='m 291,178.03125 a 1.96875,1.96875 0 1 1 -3.9375,0 1.96875,1.96875 0 1 1 3.9375,0 z' id='path5182' sodipodi:rx='1.96875' sodipodi:ry='1.96875' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999994;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' transform='matrix(1.5079365,0,0,1.5079365,-369.84037,406.50893)' sodipodi:type='arc'/>
+ <path sodipodi:cx='289.03125' sodipodi:cy='178.03125' d='m 291,178.03125 a 1.96875,1.96875 0 1 1 -3.9375,0 1.96875,1.96875 0 1 1 3.9375,0 z' id='path5184' sodipodi:rx='1.96875' sodipodi:ry='1.96875' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999994;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' transform='matrix(1.5079365,0,0,1.5079365,-359.87182,411.50893)' sodipodi:type='arc'/>
+ <path sodipodi:cx='289.03125' sodipodi:cy='178.03125' d='m 291,178.03125 a 1.96875,1.96875 0 1 1 -3.9375,0 1.96875,1.96875 0 1 1 3.9375,0 z' id='path5186' sodipodi:rx='1.96875' sodipodi:ry='1.96875' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999994;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' transform='matrix(1.5079365,0,0,1.5079365,-359.87182,401.50893)' sodipodi:type='arc'/>
+ <path inkscape:connector-curvature='0' d='m 75.625,669.15625 -10.0625,4.875 -1.8125,0.90625 1.8125,0.90625 10.03125,5.0625 0.90625,-1.8125 -8.21875,-4.15625 8.21875,-4 -0.875,-1.78125 z' id='path5188' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-63.000204,-667)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-63.000204,-667)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-63.000204,-667)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-63.000204,-667)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-63.000204,-667)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-63.000204,-667)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/preferences-system-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/preferences-system-symbolic-ref.png
new file mode 100644
index 00000000..942b5c12
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/preferences-system-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/preferences-system-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/preferences-system-symbolic.svg
new file mode 100644
index 00000000..d49ea790
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/preferences-system-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:svg='http://www.w3.org/2000/svg' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' sodipodi:docname='preferences-system-symbolic.svg' version='1.1' inkscape:version='0.48.1 r9760' height='16.000008' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:cy='7.8662795' pagecolor='#555753' borderopacity='1' showborder='false' inkscape:bbox-paths='false' guidetolerance='10' inkscape:object-paths='true' inkscape:window-width='1600' showguides='true' inkscape:object-nodes='true' inkscape:snap-bbox='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:snap-nodes='true' bordercolor='#666666' objecttolerance='10' id='namedview88' showgrid='false' inkscape:window-maximized='1' inkscape:window-x='0' inkscape:snap-global='true' inkscape:window-y='0' gridtolerance='10' inkscape:window-height='1168' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:current-layer='g4953' inkscape:snap-bbox-midpoints='false' inkscape:zoom='1' inkscape:cx='13.631831' inkscape:snap-grids='true' inkscape:pageopacity='1'>
+ <inkscape:grid spacingx='1px' spacingy='1px' id='grid4866' empspacing='2' enabled='true' type='xygrid' snapvisiblegridlinesonly='true' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:label='status' transform='translate(-442.0002,-462)' inkscape:groupmode='layer' id='layer9' style='display:inline'/>
+ <g inkscape:label='devices' transform='translate(-442.0002,-462)' inkscape:groupmode='layer' id='layer10'/>
+ <g inkscape:label='apps' transform='translate(-442.0002,-462)' inkscape:groupmode='layer' id='layer11'/>
+ <g inkscape:label='places' transform='translate(-442.0002,-462)' inkscape:groupmode='layer' id='layer13'/>
+ <g inkscape:label='mimetypes' transform='translate(-442.0002,-462)' inkscape:groupmode='layer' id='layer14'/>
+ <g inkscape:label='emblems' transform='translate(-442.0002,-462)' inkscape:groupmode='layer' id='layer15' style='display:inline'/>
+ <g inkscape:label='emotes' transform='translate(-442.0002,-462)' inkscape:groupmode='layer' id='g71291' style='display:inline'/>
+ <g inkscape:label='categories' transform='translate(-442.0002,-462)' inkscape:groupmode='layer' id='g4953' style='display:inline'>
+ <path inkscape:connector-curvature='0' d='m 445.54914,462.09056 c -0.39933,0 -0.78638,0.0916 -1.14329,0.21572 l 1.88488,1.87971 c 0.38735,0.38627 0.38735,1.00037 0,1.38667 l -0.71069,0.70874 c -0.38735,0.38628 -1.00314,0.38628 -1.39049,0 l -1.88488,-1.87971 c -0.12444,0.35591 -0.2163,0.74191 -0.2163,1.14015 0,1.90608 1.54944,3.45126 3.46077,3.45126 0.39933,0 0.78638,-0.0916 1.14329,-0.2157 l 1.17419,1.17097 a 2.4722239,2.4654407 0 0 1 0.0618,0 l 2.07028,-2.0646 -1.20509,-1.20178 c 0.12444,-0.35592 0.2163,-0.74191 0.2163,-1.14015 0,-1.90609 -1.54944,-3.45128 -3.46077,-3.45128 z m 6.55074,7.88863 -2.07029,2.06459 a 2.4722239,2.4654407 0 0 1 0.0309,0.0924 l 1.14329,1.14015 c -0.12444,0.35596 -0.2163,0.74196 -0.2163,1.14019 0,1.90609 1.54944,3.45129 3.46077,3.45129 0.43346,0 0.8536,-0.10141 1.23599,-0.24653 l -2.00848,-2.00297 c -0.38735,-0.38629 -0.38735,-1.03119 0,-1.41749 l 0.67979,-0.67792 c 0.19367,-0.19315 0.45794,-0.30816 0.71069,-0.30816 0.25276,0 0.51702,0.11501 0.7107,0.30816 l 1.94668,1.94133 c 0.10485,-0.32958 0.1854,-0.68351 0.1854,-1.04771 0,-1.90608 -1.54944,-3.45126 -3.46077,-3.45126 -0.39933,0 -0.78639,0.0916 -1.14329,0.2157 l -1.20509,-1.20179 z' id='path3908' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 455.85825,462 -1.54246,1.43753 c -0.45151,0.42079 -0.5292,1.14883 -0.2663,1.70647 l -5.88822,5.99575 a 1.4916729,1.4875773 0 0 0 -0.0311,2.5e-4 1.4916729,1.4875773 0 0 0 -0.84016,-0.1484 1.4916729,1.4875773 0 0 0 -0.86663,0.44059 l -3.9462,3.99734 a 1.4941171,1.4900149 0 1 0 2.12943,2.09068 l 3.9462,-3.99734 a 1.4916729,1.4875773 0 0 0 0.29713,-1.73771 l 5.88846,-5.96477 c 0.55782,0.24837 1.27325,0.14697 1.70681,-0.2922 L 457.86242,463.9677 455.85824,462 z' id='path3910' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+
+ </g>
+ <g inkscape:label='actions' transform='translate(-442.0002,-462)' inkscape:groupmode='layer' id='layer12' style='display:inline'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/preferences-system-time-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/preferences-system-time-symbolic-ref.png
new file mode 100644
index 00000000..3a1bb613
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/preferences-system-time-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/preferences-system-time-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/preferences-system-time-symbolic.svg
new file mode 100644
index 00000000..9e8601ba
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/preferences-system-time-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='preferences-system-time-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.2 r9819' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-paths='false' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer11' inkscape:cx='51.411918' inkscape:cy='9.36707' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#555753' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1381' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='1600' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-223,-649)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-223,-649)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-223,-649)'>
+
+ <path inkscape:connector-curvature='0' d='m 230.5002,649.01339 c -4.13029,0 -7.48661,3.35631 -7.48661,7.48661 0,4.13029 3.35632,7.48661 7.48661,7.48661 4.13029,0 7.4866,-3.35632 7.4866,-7.48661 0,-4.1303 -3.35631,-7.48661 -7.4866,-7.48661 z m 0,1.97322 c 3.04941,0 5.51339,2.46398 5.51339,5.51339 0,3.04941 -2.46398,5.51339 -5.51339,5.51339 -3.04941,0 -5.5134,-2.46398 -5.5134,-5.51339 0,-3.04941 2.46399,-5.51339 5.5134,-5.51339 z' id='path24839' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2.15384626;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 227.3125,652.96875 a 0.50005,0.50005 0 0 0 -0.21875,0.84375 l 3.09375,3.0625 a 0.50005,0.50005 0 0 0 0.0625,0.0312 0.50005,0.50005 0 0 0 0.0625,0.0312 0.50005,0.50005 0 0 0 0.0625,0.0312 0.50005,0.50005 0 0 0 0.0312,0 0.50005,0.50005 0 0 0 0.0625,0.0312 0.50005,0.50005 0 0 0 0.0937,0 l 0.15625,0 2.78125,0 a 0.50005,0.50005 0 1 0 0,-1 l -2.75,0 -2.96875,-2.875 a 0.50005,0.50005 0 0 0 -0.46875,-0.15625 z' id='path25609' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-223,-649)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-223,-649)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-223,-649)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-223,-649)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-223,-649)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-223,-649)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/printer-error-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/printer-error-symbolic-ref.png
new file mode 100644
index 00000000..55e3d89b
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/printer-error-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/printer-error-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/printer-error-symbolic.svg
new file mode 100644
index 00000000..6c9d4cfb
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/printer-error-symbolic.svg
@@ -0,0 +1,34 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:svg='http://www.w3.org/2000/svg' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' sodipodi:docname='printer-error-symbolic.svg' version='1.1' inkscape:version='0.47+devel r9385 custom' height='16' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:cy='-114.96208' pagecolor='#555753' borderopacity='1' showborder='false' inkscape:bbox-paths='false' guidetolerance='10' inkscape:window-width='1310' showguides='true' inkscape:snap-bbox='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:snap-nodes='false' bordercolor='#666666' objecttolerance='10' id='namedview88' showgrid='false' inkscape:window-maximized='0' inkscape:window-x='1960' inkscape:snap-global='true' inkscape:window-y='98' gridtolerance='10' inkscape:window-height='859' inkscape:snap-to-guides='true' inkscape:current-layer='layer9' inkscape:zoom='1' inkscape:cx='-9.29244' inkscape:snap-grids='true' inkscape:pageopacity='1'>
+ <inkscape:grid spacingx='1px' spacingy='1px' id='grid4866' empspacing='2' enabled='true' type='xygrid' snapvisiblegridlinesonly='true' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:label='status' transform='translate(-241,-257)' inkscape:groupmode='layer' id='layer9' style='display:inline'>
+ <g inkscape:label='accessories-calculator' transform='translate(193,-141)' id='g10938'>
+
+ </g>
+ <path inkscape:connector-curvature='0' d='m 243,261 c -0.5,0 -1,0.5 -1,1 l 0,4 c 0,0.5 0.5,1 1,1 l 1,0 0,-2 12,0.004 c 0,0 0,-1.38374 0,-3.00391 0,-0.5 -0.5,-1 -1,-1 z' id='path10944' sodipodi:nodetypes='ssssccccss' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+ <path inkscape:connector-curvature='0' d='m 245,258 0,2 8,0 0,-2 -8,0 z' id='path10946' sodipodi:nodetypes='ccccc' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+ <path inkscape:connector-curvature='0' d='m 245,266 0,5 4,0 -0.006,-5 z' id='path10948' sodipodi:nodetypes='ccccc' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+ <path inkscape:connector-curvature='0' class='error' d='m 253.5,266 c -1.93299,0 -3.5,1.56701 -3.5,3.5 0,1.93299 1.56701,3.5 3.5,3.5 1.93299,0 3.5,-1.56701 3.5,-3.5 0,-1.93299 -1.56701,-3.5 -3.5,-3.5 z m -2.5,2.96875 5,0 0,1.03125 -5,0 0,-1.03125 z' id='path3482-5' style='color:#bebebe;fill:#ef2929;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.90939796;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ </g>
+ <g inkscape:label='devices' transform='translate(-241,-257)' inkscape:groupmode='layer' id='layer10'/>
+ <g inkscape:label='apps' transform='translate(-241,-257)' inkscape:groupmode='layer' id='layer11'/>
+ <g inkscape:label='actions' transform='translate(-241,-257)' inkscape:groupmode='layer' id='layer12'/>
+ <g inkscape:label='places' transform='translate(-241,-257)' inkscape:groupmode='layer' id='layer13'/>
+ <g inkscape:label='mimetypes' transform='translate(-241,-257)' inkscape:groupmode='layer' id='layer14'/>
+ <g inkscape:label='emblems' transform='translate(-241,-257)' inkscape:groupmode='layer' id='layer15'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/printer-network-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/printer-network-symbolic-ref.png
new file mode 100644
index 00000000..ecdf3e85
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/printer-network-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/printer-network-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/printer-network-symbolic.svg
new file mode 100644
index 00000000..5c1bb004
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/printer-network-symbolic.svg
@@ -0,0 +1,36 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='printer-network-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.92pre3 r' viewBox='0 0 16.000002 16' width='16.000002' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer10' inkscape:cx='9.625515' inkscape:cy='-2.21714' inkscape:document-units='px' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:measure-end='0,0' inkscape:measure-start='0,0' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='100' originy='330' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-141.0002,-547)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-141.0002,-547)'>
+ <path inkscape:connector-curvature='0' d='M 147.0002,558.9531 V 561 h -5.53125 c -0.26299,0 -0.46875,0.2057 -0.46875,0.4688 v 1.0624 c 0,0.263 0.20576,0.4688 0.46875,0.4688 h 13.0625 c 0.26299,0 0.46875,-0.2058 0.46875,-0.4688 v -1.0624 c 0,-0.263 -0.20575,-0.4688 -0.46875,-0.4688 h -5.53125 v -2.0469 z' id='path11106-2' sodipodi:nodetypes='ccsssccsssccc' style='display:inline;fill:#bebebe;fill-opacity:1;stroke:none'/>
+
+ <path inkscape:connector-curvature='0' d='m 145.00801,549.27344 v 5.72265 h 5.99219 v -4.05078 l -2,-1.9375 h -3.72656 c -0.17216,0 -0.26563,0.0937 -0.26563,0.26563 z m -1.02344,5.73633 c -0.56272,0 -0.98437,0.34963 -0.98437,0.99023 v 2.96875 h 9.96875 V 556 c 0,-0.6414 -0.40603,-0.98828 -0.95313,-0.98828 l -0.002,0.97851 -8.02929,0.0352 z' id='rect8035' sodipodi:nodetypes='ccccccccsccscccc' style='color:#000000;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:new'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-141.0002,-547)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-141.0002,-547)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-141.0002,-547)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-141.0002,-547)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-141.0002,-547)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-141.0002,-547)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-141.0002,-547)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/printer-printing-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/printer-printing-symbolic-ref.png
new file mode 100644
index 00000000..24083970
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/printer-printing-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/printer-printing-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/printer-printing-symbolic.svg
new file mode 100644
index 00000000..ceb99aa7
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/printer-printing-symbolic.svg
@@ -0,0 +1,35 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:svg='http://www.w3.org/2000/svg' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' sodipodi:docname='printer-printing-symbolic.svg' version='1.1' inkscape:version='0.47+devel r9385 custom' height='16' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:cy='-114.96208' pagecolor='#555753' borderopacity='1' showborder='false' inkscape:bbox-paths='false' guidetolerance='10' inkscape:window-width='1310' showguides='true' inkscape:snap-bbox='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:snap-nodes='false' bordercolor='#666666' objecttolerance='10' id='namedview88' showgrid='false' inkscape:window-maximized='0' inkscape:window-x='1960' inkscape:snap-global='true' inkscape:window-y='98' gridtolerance='10' inkscape:window-height='859' inkscape:snap-to-guides='true' inkscape:current-layer='layer9' inkscape:zoom='1' inkscape:cx='30.70756' inkscape:snap-grids='true' inkscape:pageopacity='1'>
+ <inkscape:grid spacingx='1px' spacingy='1px' id='grid4866' empspacing='2' enabled='true' type='xygrid' snapvisiblegridlinesonly='true' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:label='status' transform='translate(-201,-257)' inkscape:groupmode='layer' id='layer9' style='display:inline'>
+ <g inkscape:label='accessories-calculator' transform='translate(153,-141)' id='g10819-1'>
+
+ </g>
+ <g inkscape:label='Layer 1' transform='translate(201,257)' id='layer1-6-9'>
+ <path inkscape:connector-curvature='0' d='M 2,4 C 1.5,4 1,4.5 1,5 l 0,4 c 0,0.5 0.5,1 1,1 l 1,0 0,-2 10,0 0,2 1,0 c 0.5,0 1,-0.5 1,-1 L 15,5 C 15,4.5 14.5,4 14,4 L 2,4 z' id='path3520-7' sodipodi:nodetypes='ccccccccccccc' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+ <path inkscape:connector-curvature='0' d='M 4,1 4,3 12,3 12,1 4,1 z' id='path4804-7' sodipodi:nodetypes='ccccc' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+ <path transform='translate(-201,-257)' inkscape:connector-curvature='0' class='success' d='m 205,266 0,5 8,0 0,-5 z m 2.99085,0.9981 2.02935,0.011 -0.011,1 2.00352,-0.011 L 209.03125,270 206,268 l 2.0019,0.0111 z' id='path4806-9' sodipodi:nodetypes='ccccccccccccc' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+ </g>
+ </g>
+ <g inkscape:label='devices' transform='translate(-201,-257)' inkscape:groupmode='layer' id='layer10'/>
+ <g inkscape:label='apps' transform='translate(-201,-257)' inkscape:groupmode='layer' id='layer11'/>
+ <g inkscape:label='actions' transform='translate(-201,-257)' inkscape:groupmode='layer' id='layer12'/>
+ <g inkscape:label='places' transform='translate(-201,-257)' inkscape:groupmode='layer' id='layer13'/>
+ <g inkscape:label='mimetypes' transform='translate(-201,-257)' inkscape:groupmode='layer' id='layer14'/>
+ <g inkscape:label='emblems' transform='translate(-201,-257)' inkscape:groupmode='layer' id='layer15'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/printer-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/printer-symbolic-ref.png
new file mode 100644
index 00000000..6b1d0be3
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/printer-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/printer-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/printer-symbolic.svg
new file mode 100644
index 00000000..0960342d
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/printer-symbolic.svg
@@ -0,0 +1,35 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:svg='http://www.w3.org/2000/svg' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' sodipodi:docname='printer-symbolic.svg' version='1.1' inkscape:version='0.47+devel r9385 custom' height='16' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:cy='72.4546' pagecolor='#555753' borderopacity='1' showborder='false' inkscape:bbox-paths='false' guidetolerance='10' inkscape:window-width='1310' showguides='true' inkscape:snap-bbox='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:snap-nodes='true' bordercolor='#666666' objecttolerance='10' id='namedview88' showgrid='false' inkscape:window-maximized='0' inkscape:window-x='1700' inkscape:window-y='68' gridtolerance='10' inkscape:window-height='920' inkscape:current-layer='layer10' inkscape:zoom='1' inkscape:cx='66.65058' inkscape:pageopacity='1'>
+ <inkscape:grid spacingx='1px' spacingy='1px' id='grid4866' empspacing='2' enabled='true' type='xygrid' snapvisiblegridlinesonly='true' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:label='status' transform='translate(-142,-338)' inkscape:groupmode='layer' id='layer9' style='display:inline'/>
+ <g inkscape:label='devices' transform='translate(-142,-338)' inkscape:groupmode='layer' id='layer10'>
+ <g inkscape:label='accessories-calculator' transform='translate(94,-60)' id='g10819'>
+
+ </g>
+ <g inkscape:label='Layer 1' transform='translate(142,338)' id='layer1-6'>
+ <path inkscape:connector-curvature='0' d='M 2,4 C 1.5,4 1,4.5 1,5 l 0,4 c 0,0.5 0.5,1 1,1 l 1,0 0,-2 10,0 0,2 1,0 c 0.5,0 1,-0.5 1,-1 L 15,5 C 15,4.5 14.5,4 14,4 L 2,4 z' id='path3520' sodipodi:nodetypes='ccccccccccccc' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+ <path inkscape:connector-curvature='0' d='M 4,1 4,3 12,3 12,1 4,1 z' id='path4804' sodipodi:nodetypes='ccccc' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+ <path inkscape:connector-curvature='0' d='M 4,9.0000001 4,14 l 8,0 0,-5 -8,10e-8 z M 5,10 l 6,0 0,1 -6,0 0,-1 z m 0,2 5,0 0,1 -5,0 0,-1 z' id='path4806' sodipodi:nodetypes='ccccccccccccccc' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+ </g>
+ </g>
+ <g inkscape:label='apps' transform='translate(-142,-338)' inkscape:groupmode='layer' id='layer11'/>
+ <g inkscape:label='actions' transform='translate(-142,-338)' inkscape:groupmode='layer' id='layer12'/>
+ <g inkscape:label='places' transform='translate(-142,-338)' inkscape:groupmode='layer' id='layer13'/>
+ <g inkscape:label='mimetypes' transform='translate(-142,-338)' inkscape:groupmode='layer' id='layer14'/>
+ <g inkscape:label='emblems' transform='translate(-142,-338)' inkscape:groupmode='layer' id='layer15'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/printer-warning-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/printer-warning-symbolic-ref.png
new file mode 100644
index 00000000..1a28a3fd
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/printer-warning-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/printer-warning-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/printer-warning-symbolic.svg
new file mode 100644
index 00000000..87213899
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/printer-warning-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:svg='http://www.w3.org/2000/svg' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' sodipodi:docname='printer-warning-symbolic.svg' version='1.1' inkscape:version='0.47+devel r9385 custom' height='16' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:cy='-114.96208' pagecolor='#555753' borderopacity='1' showborder='false' inkscape:bbox-paths='false' guidetolerance='10' inkscape:window-width='1310' showguides='true' inkscape:snap-bbox='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:snap-nodes='false' bordercolor='#666666' objecttolerance='10' id='namedview88' showgrid='false' inkscape:window-maximized='0' inkscape:window-x='1960' inkscape:snap-global='true' inkscape:window-y='98' gridtolerance='10' inkscape:window-height='859' inkscape:snap-to-guides='true' inkscape:current-layer='layer9' inkscape:zoom='1' inkscape:cx='10.70736' inkscape:snap-grids='true' inkscape:pageopacity='1'>
+ <inkscape:grid spacingx='1px' spacingy='1px' id='grid4866' empspacing='2' enabled='true' type='xygrid' snapvisiblegridlinesonly='true' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:label='status' transform='translate(-221.0002,-257)' inkscape:groupmode='layer' id='layer9' style='display:inline'>
+
+ <path inkscape:connector-curvature='0' class='warning' d='m 229.875,265 c -0.49245,0 -0.875,0.38256 -0.875,0.875 l 0,6.25 c 0,0.49244 0.38255,0.875 0.875,0.875 l 6.25,0 c 0.49245,0 0.875,-0.38256 0.875,-0.875 l 0,-6.25 C 237,265.38256 236.61745,265 236.125,265 l -6.25,0 z m 2.125,1 2,0 0,4 -2,0 0,-4 z m 0,5 2,0 0,1 -2,0 0,-1 z' id='path10898' sodipodi:nodetypes='ccccccccccccccccccc' style='color:#bebebe;fill:#f57900;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible'/>
+ <path inkscape:connector-curvature='0' d='m 223,261 c -0.5,0 -1,0.5 -1,1 l 0,4 c 0,0.5 0.5,1 1,1 l 1,0 0,-2 4,0 c 0.11796,-0.53925 0.55151,-0.9375 1.125,-0.9375 l 6.875,0 0,-2.0625 c 0,-0.5 -0.5,-1 -1,-1 l -12,0 z' id='path3520-7-4' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+ <path inkscape:connector-curvature='0' d='m 225,258 0,2 8,0 0,-2 -8,0 z' id='path4804-7-9' sodipodi:nodetypes='ccccc' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+ <path inkscape:connector-curvature='0' d='m 225,266 0,5 3,0 0,-5 z' id='path4806-9-7' sodipodi:nodetypes='ccccc' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+ </g>
+ <g inkscape:label='devices' transform='translate(-221.0002,-257)' inkscape:groupmode='layer' id='layer10'/>
+ <g inkscape:label='apps' transform='translate(-221.0002,-257)' inkscape:groupmode='layer' id='layer11'/>
+ <g inkscape:label='actions' transform='translate(-221.0002,-257)' inkscape:groupmode='layer' id='layer12'/>
+ <g inkscape:label='places' transform='translate(-221.0002,-257)' inkscape:groupmode='layer' id='layer13'/>
+ <g inkscape:label='mimetypes' transform='translate(-221.0002,-257)' inkscape:groupmode='layer' id='layer14'/>
+ <g inkscape:label='emblems' transform='translate(-221.0002,-257)' inkscape:groupmode='layer' id='layer15'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/process-stop-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/process-stop-symbolic-ref.png
new file mode 100644
index 00000000..47f16a3a
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/process-stop-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/process-stop-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/process-stop-symbolic.svg
new file mode 100644
index 00000000..e874c760
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/process-stop-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='process-stop-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.4 r9939' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='14.85954' inkscape:cy='4.8259' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='true' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1374' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='-20px' originy='530px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-261.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-261.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-261.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-261.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-261.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-261.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-261.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-261.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-261.0002,-747)'>
+
+ <path inkscape:connector-curvature='0' d='m 266.6875,749 -0.3125,0.28125 -3.09375,3.0625 -0.28125,0.3125 0,0.40625 0,3.8125 0,0.40625 0.28125,0.3125 3.09375,3.125 0.3125,0.28125 0.40625,0 3.8125,0 0.40625,0 0.3125,-0.28125 3.09375,-3.125 0.28125,-0.3125 0,-0.40625 0,-3.8125 0,-0.40625 -0.28125,-0.3125 -3.09375,-3.0625 -0.3125,-0.28125 -0.40625,0 -3.8125,0 -0.40625,0 z m 0.84375,2 2.96875,0 2.5,2.5 0,2.96875 -2.53125,2.53125 -2.9375,0 L 265,756.46875 265,753.5 267.53125,751 z' id='rect4631' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 267.85645,752 -1.85625,1.83921 0,2.2892 1.85625,1.87159 2.28921,0 1.85454,-1.87159 0,-2.2892 -1.85454,-1.83921 -2.28921,0 z' id='rect4631-4' sodipodi:nodetypes='ccccccccc' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/radio-checked-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/radio-checked-symbolic-ref.png
new file mode 100644
index 00000000..5269453f
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/radio-checked-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/radio-checked-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/radio-checked-symbolic.svg
new file mode 100644
index 00000000..74934e00
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/radio-checked-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='radio-checked-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='26.52031' inkscape:cy='7.7686' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1375' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-139.99995px' originy='120px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-381.00015,-337)'>
+
+ <path inkscape:connector-curvature='0' d='m 389.00015,342.01754 c -1.64587,0 -2.98246,1.33658 -2.98246,2.98246 0,1.64587 1.33659,2.98246 2.98246,2.98246 1.64587,0 2.98246,-1.33659 2.98246,-2.98246 0,-1.64588 -1.33659,-2.98246 -2.98246,-2.98246 z' id='path9555' sodipodi:nodetypes='csssc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0pt;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.78125;marker:none;visibility:visible;display:inline;overflow:visible;font-family:Andale Mono'/>
+ <path inkscape:connector-curvature='0' d='m 388.96875,338.0625 c -3.85777,0 -7,3.14223 -7,7 0,3.85777 3.14223,7 7,7 3.85776,0 7,-3.14223 7,-7 0,-3.85777 -3.14224,-7 -7,-7 z m 0,1 c 3.32116,0 6.03125,2.67883 6.03125,6 0,3.32117 -2.71009,6 -6.03125,6 -3.32117,0 -6,-2.67883 -6,-6 0,-3.32117 2.67883,-6 6,-6 z' id='path9557' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0pt;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:0.99115044;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Andale Mono;-inkscape-font-specification:Sans'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-381.00015,-337)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-381.00015,-337)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-381.00015,-337)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-381.00015,-337)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-381.00015,-337)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-381.00015,-337)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-381.00015,-337)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-381.00015,-337)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/radio-mixed-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/radio-mixed-symbolic-ref.png
new file mode 100644
index 00000000..c71e023b
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/radio-mixed-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/radio-mixed-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/radio-mixed-symbolic.svg
new file mode 100644
index 00000000..4daa89d1
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/radio-mixed-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='radio-mixed-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='26.52031' inkscape:cy='27.7686' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1375' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-139.99995px' originy='140px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-381.00015,-357)'>
+
+ <path inkscape:connector-curvature='0' d='m 388.96875,358.0625 c -3.85777,0 -7,3.14223 -7,7 0,3.85777 3.14223,7 7,7 3.85776,0 7,-3.14223 7,-7 0,-3.85777 -3.14224,-7 -7,-7 z m 0,1 c 3.32116,0 6.03125,2.67883 6.03125,6 0,3.32117 -2.71009,6 -6.03125,6 -3.32117,0 -6,-2.67883 -6,-6 0,-3.32117 2.67883,-6 6,-6 z' id='path9587' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0pt;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:0.99115044;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Andale Mono;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 385.6875,363.0625 a 2.0029885,2.0029885 0 1 0 0.21875,4 l 6.125,0 a 2.0002,2.0002 0 1 0 0,-4 l -6.125,0 a 2.0002,2.0002 0 0 0 -0.21875,0 z' id='path16544-6' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-381.00015,-357)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-381.00015,-357)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-381.00015,-357)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-381.00015,-357)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-381.00015,-357)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-381.00015,-357)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-381.00015,-357)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-381.00015,-357)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/radio-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/radio-symbolic-ref.png
new file mode 100644
index 00000000..d38b5559
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/radio-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/radio-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/radio-symbolic.svg
new file mode 100644
index 00000000..c7ef2d0a
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/radio-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='radio-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='26.52031' inkscape:cy='-12.2314' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1375' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-139.99995px' originy='100px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-381.00015,-317)'>
+
+ <path inkscape:connector-curvature='0' d='m 389,318 c -3.85775,0 -7,3.14224 -7,7 0,3.85771 3.14225,7 7,7 3.85771,0 7,-3.14229 7,-7 0,-3.85776 -3.14229,-7 -7,-7 z m 0,1 c 3.31731,0 6,2.68264 6,6 0,3.31731 -2.68269,6 -6,6 -3.31735,0 -6,-2.68269 -6,-6 0,-3.31736 2.68265,-6 6,-6 z' id='path8781' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0pt;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:0.99817187;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Andale Mono;-inkscape-font-specification:Sans'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-381.00015,-317)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-381.00015,-317)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-381.00015,-317)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-381.00015,-317)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-381.00015,-317)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-381.00015,-317)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-381.00015,-317)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-381.00015,-317)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/rotation-allowed-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/rotation-allowed-symbolic-ref.png
new file mode 100644
index 00000000..0ce9d6f1
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/rotation-allowed-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/rotation-allowed-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/rotation-allowed-symbolic.svg
new file mode 100644
index 00000000..7c61689f
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/rotation-allowed-symbolic.svg
@@ -0,0 +1,33 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='rotation-allowed-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16.047182' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.91 r13725' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='27.124016' inkscape:cy='-34.04258' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='11.313708'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='60' originy='140.03876' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-181.0002,-356.99158)'>
+
+ <path inkscape:connector-curvature='0' d='m 187.23452,356.99168 c -0.51426,6.7e-4 -1.02062,0.17688 -1.40625,0.5625 l -4.25,4.25 c -0.77127,0.77127 -0.75662,2.07334 0,2.84375 l 0.47197,0.37332 2.84375,0 -1.90947,-1.81082 4.25,-4.21875 7.71875,7.78125 c 0.0152,0.0154 0.0435,0.0191 0.0312,0.0312 l -4.25,4.25 -1.73537,-1.89921 0,2.8125 0.29787,0.46171 0.0312,0.0312 c 0.77124,0.77124 2.04126,0.77124 2.8125,0 l 4.25,-4.25 c 0.77125,-0.77125 0.76539,-2.04156 0,-2.8125 l -7.75,-7.84375 c -0.38574,-0.38831 -0.89198,-0.56317 -1.40625,-0.5625 z' id='rect20667-6' sodipodi:nodetypes='csscccccccccccssscccc' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:Sans;-inkscape-font-specification:Sans;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;enable-background:new'/>
+ <path inkscape:connector-curvature='0' d='m 182.72942,370.00616 2.80909,2.80908 2.81047,-2.81048 z' id='rect15033' sodipodi:nodetypes='cccc' style='color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 182.01562,366.01562 0,1 1.42188,0 c 0.47201,0 0.87449,0.14019 1.14648,0.37305 0.272,0.23287 0.43946,0.55123 0.43946,1.04102 l 0,2.24219 1,0 0,-2.24219 c 0,-0.7446 -0.30367,-1.38326 -0.78906,-1.79883 -0.4854,-0.41557 -1.12655,-0.61524 -1.79688,-0.61524 l -1.42188,0 z' id='path15040' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-181.0002,-356.99158)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-181.0002,-356.99158)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-181.0002,-356.99158)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-181.0002,-356.99158)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-181.0002,-356.99158)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-181.0002,-356.99158)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-181.0002,-356.99158)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-181.0002,-356.99158)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/rotation-locked-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/rotation-locked-symbolic-ref.png
new file mode 100644
index 00000000..99876772
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/rotation-locked-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/rotation-locked-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/rotation-locked-symbolic.svg
new file mode 100644
index 00000000..8de7f551
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/rotation-locked-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='rotation-locked-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16.064297' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.91 r13725' width='16.042253' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='-98.20728' inkscape:cy='1.042' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='4'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='40' originy='140' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-201.0002,-356.9357)'>
+
+ <path inkscape:connector-curvature='0' d='m 207.03145,361.9375 c -1.08877,0 -2,0.87892 -2,1.96875 l 0,1.09375 -0.96875,0 0,4.0625 5.96875,0 0,-4.0625 -1.03125,0 0,-1.09375 c 0,-1.08983 -0.87998,-1.96875 -1.96875,-1.96875 z m 0,1 c 0.54629,0 0.96875,0.41732 0.96875,0.96875 l 0,1.09375 -1.96875,0 0,-1.09375 c 0,-0.55143 0.45371,-0.96875 1,-0.96875 z' id='path20685' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:Sans;-inkscape-font-specification:Sans;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 207.30859,356.93555 c -0.51485,8e-5 -1.02844,0.19445 -1.41406,0.58007 l -4.24414,4.24219 c -0.77125,0.77125 -0.77612,2.06041 0.004,2.83203 l 0.38476,0.37891 1.40625,-1.42187 -0.38086,-0.375 4.24414,-4.24219 7.74024,7.79101 c 0,0 0.002,0.002 0.002,0.002 l -4.24219,4.24414 -1.21093,-1.26368 -1.44532,1.38282 1.23438,1.28711 0.008,0.008 c 0.77124,0.77124 2.05689,0.77124 2.82813,0 l 4.24218,-4.24219 c 0.77127,-0.77125 0.76737,-2.05523 0.002,-2.82617 l -7.74219,-7.79492 c -0.38575,-0.38832 -0.90116,-0.58212 -1.41602,-0.58203 z' id='path20687' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-201.0002,-356.9357)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-201.0002,-356.9357)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-201.0002,-356.9357)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-201.0002,-356.9357)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-201.0002,-356.9357)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-201.0002,-356.9357)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-201.0002,-356.9357)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-201.0002,-356.9357)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/scanner-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/scanner-symbolic-ref.png
new file mode 100644
index 00000000..5c8cf6d2
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/scanner-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/scanner-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/scanner-symbolic.svg
new file mode 100644
index 00000000..9f6951eb
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/scanner-symbolic.svg
@@ -0,0 +1,35 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg inkscape:version='0.48.1 r9760' version='1.1' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns='http://www.w3.org/2000/svg' width='16' height='16' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='scanner-symbolic.svg' id='svg7384' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:svg='http://www.w3.org/2000/svg' xmlns:cc='http://creativecommons.org/ns#'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:window-x='0' inkscape:window-y='26' inkscape:window-maximized='0' pagecolor='#555753' showborder='false' inkscape:pageshadow='2' bordercolor='#666666' inkscape:snap-bbox='true' inkscape:current-layer='layer10' inkscape:snap-grids='true' inkscape:bbox-paths='false' inkscape:snap-others='false' inkscape:window-height='1020' inkscape:snap-nodes='true' borderopacity='1' showguides='true' inkscape:snap-global='true' inkscape:pageopacity='1' inkscape:object-paths='false' objecttolerance='10' gridtolerance='10' showgrid='false' inkscape:zoom='1' inkscape:snap-to-guides='true' inkscape:object-nodes='false' id='namedview88' inkscape:snap-bbox-midpoints='false' inkscape:guide-bbox='true' inkscape:window-width='1598' inkscape:cx='107.05598' inkscape:cy='-159.55779' guidetolerance='10'>
+ <inkscape:grid visible='true' spacingx='1px' spacingy='1px' empspacing='2' enabled='true' id='grid4866' snapvisiblegridlinesonly='true' type='xygrid'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:label='status' style='display:inline' inkscape:groupmode='layer' id='layer9' transform='translate(-281.00023,-447)'/>
+ <g inkscape:label='devices' inkscape:groupmode='layer' id='layer10' transform='translate(-281.00023,-447)'>
+
+ <path d='m 284.0002,447 c -0.57847,0 -1.0598,0.19914 -1.46875,0.5625 -0.20447,0.18168 -0.38952,0.41779 -0.5,0.75 -0.11048,0.33221 -0.11181,0.77424 0.0625,1.125 l 1,2 c 0.0882,0.17755 0.20315,0.42726 0.375,0.6875 0.24004,-0.0728 0.4938,-0.125 0.75,-0.125 l 9.5625,0 c 0.2562,0 0.50996,0.0522 0.75,0.125 0.17185,-0.26025 0.28676,-0.50995 0.375,-0.6875 l 1,-2 c 0.17431,-0.35076 0.17298,-0.79279 0.0625,-1.125 -0.11048,-0.33221 -0.29553,-0.56832 -0.5,-0.75 C 295.06,447.19914 294.57867,447 294.0002,447 l -10,0 z m 0.125,2 9.75,0 -0.78125,1.5625 c -0.1179,0.23724 -0.17682,0.37121 -0.21875,0.4375 l -7.75,0 c -0.0419,-0.0663 -0.10085,-0.20026 -0.21875,-0.4375 L 284.1252,449 z' inkscape:connector-curvature='0' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans' id='rect4640-8'/>
+ <path d='m 285.0002,453 c -0.4875,0 -0.93518,0.14403 -1.3125,0.4375 -0.37732,0.29347 -0.6875,0.78189 -0.6875,1.34375 l 0,8.21875 12,0 0,-8.21875 c 0,-0.56186 -0.31018,-1.05028 -0.6875,-1.34375 C 293.93538,453.14403 293.4877,453 293.0002,453 z m 0,1 8,0 0,6 -8,0 z m 7,7 1,0 0,1 -1,0 z' inkscape:connector-curvature='0' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans' sodipodi:nodetypes='sssccsssscccccccccc' id='rect4640'/>
+ <rect width='10.000013' height='2' x='284.00021' y='-451' style='opacity:0.35;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' rx='0' ry='0' id='rect5505' transform='scale(1,-1)'/>
+ <rect width='5.9999862' height='1' x='286.00021' y='458.03125' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' rx='0' ry='0' id='rect5431'/>
+ <path d='m 286.00021,455.03125 5.99999,0 0,0.96875 -5.99999,1 z' inkscape:connector-curvature='0' style='opacity:0.35;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' sodipodi:nodetypes='ccccc' id='rect5431-4'/>
+ </g>
+ <g inkscape:label='apps' inkscape:groupmode='layer' id='layer11' transform='translate(-281.00023,-447)'/>
+ <g inkscape:label='places' inkscape:groupmode='layer' id='layer13' transform='translate(-281.00023,-447)'/>
+ <g inkscape:label='mimetypes' inkscape:groupmode='layer' id='layer14' transform='translate(-281.00023,-447)'/>
+ <g inkscape:label='emblems' style='display:inline' inkscape:groupmode='layer' id='layer15' transform='translate(-281.00023,-447)'/>
+ <g inkscape:label='emotes' style='display:inline' inkscape:groupmode='layer' transform='translate(-281.00023,-447)' id='g71291'/>
+ <g inkscape:label='categories' style='display:inline' inkscape:groupmode='layer' id='g4953' transform='translate(-281.00023,-447)'/>
+ <g inkscape:label='actions' style='display:inline' inkscape:groupmode='layer' id='layer12' transform='translate(-281.00023,-447)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/security-high-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/security-high-symbolic-ref.png
new file mode 100644
index 00000000..0459a2d2
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/security-high-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/security-high-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/security-high-symbolic.svg
new file mode 100644
index 00000000..c16a3f37
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/security-high-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg sodipodi:docname='security-high-symbolic.svg' xmlns:dc='http://purl.org/dc/elements/1.1/' version='1.1' inkscape:version='0.48.1 r9760' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' height='16' id='svg7384' xmlns:cc='http://creativecommons.org/ns#' width='16' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:svg='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:object-paths='false' inkscape:snap-bbox-midpoints='false' inkscape:zoom='1' bordercolor='#666666' gridtolerance='10' guidetolerance='10' inkscape:guide-bbox='true' inkscape:window-maximized='0' inkscape:snap-nodes='true' pagecolor='#555753' objecttolerance='10' inkscape:snap-to-guides='true' inkscape:snap-grids='true' inkscape:current-layer='layer9' inkscape:pageshadow='2' id='namedview88' showgrid='false' inkscape:window-width='1226' inkscape:bbox-paths='false' inkscape:cx='-2.1983492' inkscape:cy='4.934493' inkscape:pageopacity='1' inkscape:window-height='967' inkscape:snap-others='false' inkscape:snap-bbox='true' inkscape:object-nodes='false' showguides='true' showborder='false' inkscape:window-x='2259' inkscape:window-y='356' borderopacity='1' inkscape:snap-global='true'>
+ <inkscape:grid snapvisiblegridlinesonly='true' type='xygrid' visible='true' id='grid4866' enabled='true' empspacing='2' spacingx='1px' spacingy='1px'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g id='layer9' transform='translate(-320.99995,-217)' inkscape:groupmode='layer' inkscape:label='status' style='display:inline'>
+
+ <path d='m 323,218 0,1 0,6 c 0,2.07167 1.5096,3.68102 2.84375,4.875 1.33415,1.19398 2.65625,2 2.65625,2 l 0.5,0.28125 0.53125,-0.3125 c 0,0 1.29429,-0.79757 2.625,-2 C 333.48696,228.64132 335,227.0443 335,225 l 0,-6 0,-1 -1,0 -10,0 -1,0 z m 2,2 8,0 0,5 c 0,0.91968 -0.98696,2.31843 -2.15625,3.375 -0.90589,0.81857 -1.47889,1.139 -1.84375,1.375 -0.35377,-0.22243 -0.92859,-0.52475 -1.84375,-1.34375 C 325.9904,227.3629 325,225.97901 325,225 l 0,-5 z' id='rect3259-2-8-6' inkscape:connector-curvature='0' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path sodipodi:nodetypes='ccscsccc' id='rect4034-7-1-6' d='m 326.0002,221 0,4 c 0,0.35738 0.75517,1.64136 1.84375,2.625 0.57529,0.51983 0.73637,0.58052 1.15625,0.875 0.41988,-0.29448 0.58096,-0.35517 1.15625,-0.875 1.08858,-0.98364 1.84375,-2.26762 1.84375,-2.625 l 0,-4 -6,0 z' inkscape:connector-curvature='0' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible'/>
+ </g>
+ <g id='layer10' transform='translate(-320.99995,-217)' inkscape:groupmode='layer' inkscape:label='devices'/>
+ <g id='layer11' transform='translate(-320.99995,-217)' inkscape:groupmode='layer' inkscape:label='apps'/>
+ <g id='layer13' transform='translate(-320.99995,-217)' inkscape:groupmode='layer' inkscape:label='places'/>
+ <g id='layer14' transform='translate(-320.99995,-217)' inkscape:groupmode='layer' inkscape:label='mimetypes'/>
+ <g id='layer15' transform='translate(-320.99995,-217)' inkscape:groupmode='layer' inkscape:label='emblems' style='display:inline'/>
+ <g transform='translate(-320.99995,-217)' id='g71291' inkscape:groupmode='layer' inkscape:label='emotes' style='display:inline'/>
+ <g id='g4953' transform='translate(-320.99995,-217)' inkscape:groupmode='layer' inkscape:label='categories' style='display:inline'/>
+ <g id='layer12' transform='translate(-320.99995,-217)' inkscape:groupmode='layer' inkscape:label='actions' style='display:inline'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/security-low-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/security-low-symbolic-ref.png
new file mode 100644
index 00000000..3fd069b2
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/security-low-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/security-low-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/security-low-symbolic.svg
new file mode 100644
index 00000000..cecf9855
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/security-low-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg sodipodi:docname='security-low-symbolic.svg' xmlns:dc='http://purl.org/dc/elements/1.1/' version='1.1' inkscape:version='0.48.1 r9760' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' height='16' id='svg7384' xmlns:cc='http://creativecommons.org/ns#' width='16' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:svg='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:object-paths='false' inkscape:snap-bbox-midpoints='false' inkscape:zoom='1' bordercolor='#666666' gridtolerance='10' guidetolerance='10' inkscape:guide-bbox='true' inkscape:window-maximized='0' inkscape:snap-nodes='true' pagecolor='#555753' objecttolerance='10' inkscape:snap-to-guides='true' inkscape:snap-grids='true' inkscape:current-layer='layer9' inkscape:pageshadow='2' id='namedview88' showgrid='false' inkscape:window-width='1226' inkscape:bbox-paths='false' inkscape:cx='37.801651' inkscape:cy='4.934493' inkscape:pageopacity='1' inkscape:window-height='967' inkscape:snap-others='false' inkscape:snap-bbox='true' inkscape:object-nodes='false' showguides='true' showborder='false' inkscape:window-x='2259' inkscape:window-y='356' borderopacity='1' inkscape:snap-global='true'>
+ <inkscape:grid snapvisiblegridlinesonly='true' type='xygrid' visible='true' id='grid4866' enabled='true' empspacing='2' spacingx='1px' spacingy='1px'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g id='layer9' transform='translate(-280.99995,-217)' inkscape:groupmode='layer' inkscape:label='status' style='display:inline'>
+
+ <path d='m 283,218 0,1 0,6 c 0,2.07167 1.5096,3.68102 2.84375,4.875 1.33415,1.19398 2.65625,2 2.65625,2 l 0.5,0.28125 0.53125,-0.3125 c 0,0 1.29429,-0.79757 2.625,-2 C 293.48696,228.64132 295,227.0443 295,225 l 0,-6 0,-1 -1,0 -10,0 -1,0 z m 2,2 8,0 0,5 c 0,0.91968 -0.98696,2.31843 -2.15625,3.375 -0.90589,0.81857 -1.47889,1.139 -1.84375,1.375 -0.35377,-0.22243 -0.92859,-0.52475 -1.84375,-1.34375 C 285.9904,227.3629 285,225.97901 285,225 l 0,-5 z' id='path339' inkscape:connector-curvature='0' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+ <g id='layer10' transform='translate(-280.99995,-217)' inkscape:groupmode='layer' inkscape:label='devices'/>
+ <g id='layer11' transform='translate(-280.99995,-217)' inkscape:groupmode='layer' inkscape:label='apps'/>
+ <g id='layer13' transform='translate(-280.99995,-217)' inkscape:groupmode='layer' inkscape:label='places'/>
+ <g id='layer14' transform='translate(-280.99995,-217)' inkscape:groupmode='layer' inkscape:label='mimetypes'/>
+ <g id='layer15' transform='translate(-280.99995,-217)' inkscape:groupmode='layer' inkscape:label='emblems' style='display:inline'/>
+ <g transform='translate(-280.99995,-217)' id='g71291' inkscape:groupmode='layer' inkscape:label='emotes' style='display:inline'/>
+ <g id='g4953' transform='translate(-280.99995,-217)' inkscape:groupmode='layer' inkscape:label='categories' style='display:inline'/>
+ <g id='layer12' transform='translate(-280.99995,-217)' inkscape:groupmode='layer' inkscape:label='actions' style='display:inline'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/security-medium-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/security-medium-symbolic-ref.png
new file mode 100644
index 00000000..a9c44d00
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/security-medium-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/security-medium-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/security-medium-symbolic.svg
new file mode 100644
index 00000000..f282c5b5
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/security-medium-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg sodipodi:docname='security-medium-symbolic.svg' xmlns:dc='http://purl.org/dc/elements/1.1/' version='1.1' inkscape:version='0.48.1 r9760' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' height='16' id='svg7384' xmlns:cc='http://creativecommons.org/ns#' width='16' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:svg='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:object-paths='false' inkscape:snap-bbox-midpoints='false' inkscape:zoom='1' bordercolor='#666666' gridtolerance='10' guidetolerance='10' inkscape:guide-bbox='true' inkscape:window-maximized='0' inkscape:snap-nodes='true' pagecolor='#555753' objecttolerance='10' inkscape:snap-to-guides='true' inkscape:snap-grids='true' inkscape:current-layer='layer9' inkscape:pageshadow='2' id='namedview88' showgrid='false' inkscape:window-width='1226' inkscape:bbox-paths='false' inkscape:cx='17.801651' inkscape:cy='4.934493' inkscape:pageopacity='1' inkscape:window-height='967' inkscape:snap-others='false' inkscape:snap-bbox='true' inkscape:object-nodes='false' showguides='true' showborder='false' inkscape:window-x='2259' inkscape:window-y='356' borderopacity='1' inkscape:snap-global='true'>
+ <inkscape:grid snapvisiblegridlinesonly='true' type='xygrid' visible='true' id='grid4866' enabled='true' empspacing='2' spacingx='1px' spacingy='1px'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g id='layer9' transform='translate(-300.99995,-217)' inkscape:groupmode='layer' inkscape:label='status' style='display:inline'>
+
+ <path d='m 303,218 0,1 0,6 c 0,2.07167 1.5096,3.68102 2.84375,4.875 1.33415,1.19398 2.65625,2 2.65625,2 l 0.5,0.28125 0.53125,-0.3125 c 0,0 1.29429,-0.79757 2.625,-2 C 313.48696,228.64132 315,227.0443 315,225 l 0,-6 0,-1 -1,0 -10,0 -1,0 z m 2,2 8,0 0,5 c 0,0.91968 -0.98696,2.31843 -2.15625,3.375 -0.90589,0.81857 -1.47889,1.139 -1.84375,1.375 -0.35377,-0.22243 -0.92859,-0.52475 -1.84375,-1.34375 C 305.9904,227.3629 305,225.97901 305,225 l 0,-5 z' id='rect3259-2-8' inkscape:connector-curvature='0' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path sodipodi:nodetypes='ccsccc' d='m 308.99995,221 0,7.5 c -0.41988,-0.29448 -0.58096,-0.35517 -1.15625,-0.875 -1.08858,-0.98364 -1.84375,-2.26762 -1.84375,-2.625 l 0,-4 3,0 z' id='rect4034-7-1' inkscape:connector-curvature='0' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible'/>
+ </g>
+ <g id='layer10' transform='translate(-300.99995,-217)' inkscape:groupmode='layer' inkscape:label='devices'/>
+ <g id='layer11' transform='translate(-300.99995,-217)' inkscape:groupmode='layer' inkscape:label='apps'/>
+ <g id='layer13' transform='translate(-300.99995,-217)' inkscape:groupmode='layer' inkscape:label='places'/>
+ <g id='layer14' transform='translate(-300.99995,-217)' inkscape:groupmode='layer' inkscape:label='mimetypes'/>
+ <g id='layer15' transform='translate(-300.99995,-217)' inkscape:groupmode='layer' inkscape:label='emblems' style='display:inline'/>
+ <g transform='translate(-300.99995,-217)' id='g71291' inkscape:groupmode='layer' inkscape:label='emotes' style='display:inline'/>
+ <g id='g4953' transform='translate(-300.99995,-217)' inkscape:groupmode='layer' inkscape:label='categories' style='display:inline'/>
+ <g id='layer12' transform='translate(-300.99995,-217)' inkscape:groupmode='layer' inkscape:label='actions' style='display:inline'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/selection-end-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/selection-end-symbolic-ref.png
new file mode 100644
index 00000000..77669176
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/selection-end-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/selection-end-symbolic-rtl-ref.png b/rsvg/tests/fixtures/reftests/adwaita/selection-end-symbolic-rtl-ref.png
new file mode 100644
index 00000000..d271abae
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/selection-end-symbolic-rtl-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/selection-end-symbolic-rtl.svg b/rsvg/tests/fixtures/reftests/adwaita/selection-end-symbolic-rtl.svg
new file mode 100644
index 00000000..dc819e6a
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/selection-end-symbolic-rtl.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='selection-start-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='75.259442' inkscape:cy='298.8702' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1280' inkscape:window-maximized='0' inkscape:window-width='1351' inkscape:window-x='3670' inkscape:window-y='76' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-39.999998px' originy='610px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-281.0002,-827)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-281.0002,-827)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-281.0002,-827)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-281.0002,-827)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-281.0002,-827)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-281.0002,-827)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-281.0002,-827)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-281.0002,-827)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-281.0002,-827)'>
+
+ <path inkscape:connector-curvature='0' d='m 292.0002,841 -6,-6 0,-6 6,0 0,6 0,6 z' id='rect10903' style='color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/selection-end-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/selection-end-symbolic.svg
new file mode 100644
index 00000000..6a1a911a
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/selection-end-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='selection-end-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='-195.74056' inkscape:cy='83.8702' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1401' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='2560' inkscape:window-y='0' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-59.999998px' originy='610px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-301.0002,-827)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-301.0002,-827)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-301.0002,-827)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-301.0002,-827)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-301.0002,-827)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-301.0002,-827)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-301.0002,-827)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-301.0002,-827)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-301.0002,-827)'>
+
+ <path inkscape:connector-curvature='0' d='m 306.0002,829 6,6 0,6 -6,0 0,-6 0,-6 z' id='path11680' style='color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/selection-start-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/selection-start-symbolic-ref.png
new file mode 100644
index 00000000..d271abae
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/selection-start-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/selection-start-symbolic-rtl-ref.png b/rsvg/tests/fixtures/reftests/adwaita/selection-start-symbolic-rtl-ref.png
new file mode 100644
index 00000000..77669176
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/selection-start-symbolic-rtl-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/selection-start-symbolic-rtl.svg b/rsvg/tests/fixtures/reftests/adwaita/selection-start-symbolic-rtl.svg
new file mode 100644
index 00000000..6a1a911a
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/selection-start-symbolic-rtl.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='selection-end-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='-195.74056' inkscape:cy='83.8702' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1401' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='2560' inkscape:window-y='0' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-59.999998px' originy='610px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-301.0002,-827)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-301.0002,-827)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-301.0002,-827)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-301.0002,-827)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-301.0002,-827)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-301.0002,-827)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-301.0002,-827)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-301.0002,-827)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-301.0002,-827)'>
+
+ <path inkscape:connector-curvature='0' d='m 306.0002,829 6,6 0,6 -6,0 0,-6 0,-6 z' id='path11680' style='color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/selection-start-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/selection-start-symbolic.svg
new file mode 100644
index 00000000..dc819e6a
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/selection-start-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='selection-start-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='75.259442' inkscape:cy='298.8702' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1280' inkscape:window-maximized='0' inkscape:window-width='1351' inkscape:window-x='3670' inkscape:window-y='76' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-39.999998px' originy='610px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-281.0002,-827)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-281.0002,-827)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-281.0002,-827)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-281.0002,-827)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-281.0002,-827)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-281.0002,-827)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-281.0002,-827)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-281.0002,-827)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-281.0002,-827)'>
+
+ <path inkscape:connector-curvature='0' d='m 292.0002,841 -6,-6 0,-6 6,0 0,6 0,6 z' id='rect10903' style='color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/semi-starred-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/semi-starred-symbolic-ref.png
new file mode 100644
index 00000000..49e9e114
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/semi-starred-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/semi-starred-symbolic-rtl-ref.png b/rsvg/tests/fixtures/reftests/adwaita/semi-starred-symbolic-rtl-ref.png
new file mode 100644
index 00000000..504b3f36
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/semi-starred-symbolic-rtl-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/semi-starred-symbolic-rtl.svg b/rsvg/tests/fixtures/reftests/adwaita/semi-starred-symbolic-rtl.svg
new file mode 100644
index 00000000..0042bf99
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/semi-starred-symbolic-rtl.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='semi-starred-rtl-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.4 r9939' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='-5.1397284' inkscape:cy='-3.11893' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1408' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='0' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='140px' originy='180px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-101.0002,-397)'>
+
+ <path inkscape:connector-curvature='0' d='m 108.99741,398.0051 c 0.2659,-9.9e-4 0.49859,0.1006 0.6647,0.2393 0.16611,0.13869 0.27741,0.32137 0.38968,0.50028 0.22453,0.35782 0.39269,0.76873 0.56546,1.20357 0.17277,0.43483 0.34713,0.88766 0.5046,1.23232 0.15747,0.34465 0.3456,0.57871 0.35862,0.58776 0.0129,0.009 0.30722,0.117 0.69577,0.15181 0.38854,0.0348 0.88122,0.0492 1.36324,0.0694 0.48202,0.0202 0.97029,0.0362 1.39304,0.12817 0.21138,0.046 0.4154,0.10148 0.60434,0.20956 0.18895,0.10808 0.3669,0.28631 0.45004,0.53002 0.0831,0.24371 0.049,0.50627 -0.0364,0.70157 -0.0854,0.19531 -0.22656,0.36514 -0.3682,0.52344 -0.2833,0.31663 -0.6327,0.60557 -1.0079,0.89849 -0.3752,0.29292 -0.77671,0.55926 -1.06775,0.81027 -0.29104,0.25101 -0.45423,0.50796 -0.45912,0.52271 -0.005,0.0146 -0.0312,0.33498 0.0546,0.70231 0.0858,0.36732 0.2238,0.81174 0.35282,1.26034 0.12902,0.44861 0.25176,0.90196 0.29171,1.31835 0.02,0.20819 0.0428,0.40729 -0.005,0.61409 -0.0481,0.20679 -0.1845,0.43007 -0.39902,0.58168 -0.2145,0.15161 -0.44936,0.1881 -0.66823,0.1701 -0.21887,-0.018 -0.43535,-0.0703 -0.63515,-0.15132 -0.39961,-0.16214 -0.80177,-0.42851 -1.20642,-0.68231 -0.40465,-0.2538 -0.80822,-0.52155 -1.14555,-0.71107 -0.33734,-0.18952 -0.6484,-0.2686 -0.66445,-0.26854 -0.0159,6e-5 -0.30338,0.0951 -0.63894,0.28732 -0.33555,0.19221 -0.72532,0.46503 -1.12761,0.72205 -0.40228,0.25702 -0.81995,0.49752 -1.21801,0.66284 -0.19903,0.0827 -0.38893,0.15086 -0.60763,0.17059 -0.21869,0.0197 -0.47978,-0.031 -0.69551,-0.18105 -0.21572,-0.15001 -0.33927,-0.35235 -0.38918,-0.55877 -0.0499,-0.20642 -0.0429,-0.43517 -0.0248,-0.64358 0.0363,-0.41683 0.15899,-0.86394 0.2841,-1.31372 0.12511,-0.44978 0.26164,-0.88661 0.3442,-1.25475 0.0826,-0.36813 0.0717,-0.68662 0.0667,-0.70133 -0.005,-0.0145 -0.18747,-0.25247 -0.4806,-0.50101 -0.29314,-0.24854 -0.67599,-0.53755 -1.05363,-0.82731 -0.37764,-0.28976 -0.76716,-0.57158 -1.05312,-0.88579 -0.14298,-0.1571 -0.2418,-0.33444 -0.32882,-0.52904 -0.087,-0.1946 -0.136,-0.42874 -0.0548,-0.67306 0.0812,-0.24432 0.27108,-0.41314 0.45912,-0.52272 0.18803,-0.10958 0.36679,-0.18158 0.57782,-0.22931 0.42206,-0.0955 0.91359,-0.14009 1.39556,-0.16426 0.48198,-0.0242 0.94584,-0.039 1.3342,-0.077 0.38836,-0.038 0.71565,-0.13122 0.72859,-0.14037 0.0128,-0.009 0.18402,-0.23636 0.33841,-0.58217 0.15438,-0.34581 0.32658,-0.78819 0.49548,-1.22429 0.16889,-0.4361 0.33476,-0.86429 0.55609,-1.2238 0.11066,-0.17977 0.23335,-0.35397 0.39826,-0.49396 0.1649,-0.13999 0.40309,-0.25684 0.66899,-0.25783 z m -0.009,0.99424 c -0.0422,0.0358 -0.10671,0.13602 -0.1841,0.26173 -0.15478,0.25141 -0.33068,0.6272 -0.49397,1.04883 -0.16329,0.42163 -0.31905,0.88645 -0.49599,1.28277 -0.17693,0.39633 -0.31456,0.73379 -0.67529,0.98889 -0.36072,0.25509 -0.77019,0.29763 -1.21525,0.34118 -0.44505,0.0435 -0.92881,0.0532 -1.3948,0.0765 -0.46599,0.0234 -0.91824,0.0697 -1.21348,0.13647 -0.14763,0.0334 -0.25558,0.0572 -0.30381,0.0853 0.0223,0.0498 0.0796,0.15478 0.17956,0.26464 0.19997,0.21973 0.53749,0.48746 0.90261,0.7676 0.36511,0.28015 0.77803,0.57219 1.11398,0.85704 0.33595,0.28485 0.63992,0.53221 0.77987,0.94209 0.13996,0.40986 0.054,0.77681 -0.0406,1.19869 -0.0946,0.42189 -0.25406,0.87813 -0.37502,1.31299 -0.12096,0.43486 -0.22688,0.84692 -0.25228,1.13851 -0.0116,0.13264 0.017,0.23485 0.0278,0.29267 0.0599,-0.008 0.17641,-0.0324 0.30381,-0.0853 0.27837,-0.11561 0.6465,-0.32808 1.03543,-0.57657 0.38894,-0.24849 0.8039,-0.53053 1.18847,-0.75081 0.38457,-0.22028 0.70791,-0.39837 1.15514,-0.40015 0.44722,-0.002 0.79205,0.17245 1.17864,0.38965 0.38658,0.21719 0.78437,0.49517 1.1756,0.74055 0.39123,0.24538 0.77636,0.4507 1.0559,0.56412 0.13977,0.0567 0.24615,0.0856 0.3023,0.0902 0.0102,-0.0578 0.0152,-0.16008 0.003,-0.29243 -0.0279,-0.29118 -0.13818,-0.70893 -0.26291,-1.14264 -0.12474,-0.43372 -0.25404,-0.89785 -0.35232,-1.31883 -0.0983,-0.42099 -0.18672,-0.78846 -0.0503,-1.19943 0.13645,-0.41097 0.43218,-0.64202 0.76571,-0.92967 0.33353,-0.28766 0.70551,-0.58555 1.06826,-0.86876 0.36275,-0.2832 0.71779,-0.56075 0.91597,-0.78224 0.0991,-0.11075 0.16221,-0.21163 0.1841,-0.26173 -0.0483,-0.0276 -0.15448,-0.058 -0.30229,-0.0902 -0.29563,-0.0643 -0.74518,-0.10714 -1.21121,-0.1267 -0.46604,-0.0196 -0.94824,-0.0298 -1.39355,-0.0697 -0.44531,-0.0399 -0.84679,-0.0499 -1.20969,-0.30216 -0.3629,-0.25221 -0.5383,-0.60511 -0.71876,-1.00009 -0.18045,-0.39497 -0.33731,-0.84115 -0.50434,-1.26156 -0.16704,-0.42041 -0.31849,-0.83556 -0.47556,-1.08586 -0.0785,-0.12515 -0.16751,-0.20007 -0.21012,-0.23565 z' id='path5284' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.04970646;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 109.0002,398.5 c 0.92654,-0.003 1.43567,3.13373 2.1875,3.65625 0.75154,0.52231 4.02289,0.0261 4.3125,0.875 0.28973,0.84921 -2.65482,2.27358 -2.9375,3.125 -0.28257,0.85109 1.24718,3.69066 0.5,4.21875 -0.74748,0.5283 -3.10471,-1.72244 -4.03125,-1.71875 -0.008,3e-5 -0.0226,-4.1e-4 -0.0312,0 L 109.0002,398.5 z' id='path5286' style='color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.04970646;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-101.0002,-397)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-101.0002,-397)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-101.0002,-397)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-101.0002,-397)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-101.0002,-397)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-101.0002,-397)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-101.0002,-397)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-101.0002,-397)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/semi-starred-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/semi-starred-symbolic.svg
new file mode 100644
index 00000000..e4858229
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/semi-starred-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='semi-starred-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.4 r9939' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='14.860268' inkscape:cy='-3.11893' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1408' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='0' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='160px' originy='180px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-81.000202,-397)'>
+
+ <path inkscape:connector-curvature='0' d='m 89.002994,398.0051 c -0.2659,-9.9e-4 -0.498591,0.1006 -0.664702,0.2393 -0.166111,0.13869 -0.277415,0.32137 -0.389683,0.50028 -0.224526,0.35782 -0.392692,0.76873 -0.565462,1.20357 -0.17277,0.43483 -0.347131,0.88766 -0.504599,1.23232 -0.157468,0.34465 -0.345596,0.57871 -0.35862,0.58776 -0.01287,0.009 -0.307217,0.117 -0.695765,0.15181 -0.388547,0.0348 -0.881219,0.0492 -1.36324,0.0694 -0.482021,0.0202 -0.970296,0.0362 -1.393042,0.12817 -0.211377,0.046 -0.4154,0.10148 -0.604343,0.20956 -0.188943,0.10808 -0.366894,0.28631 -0.450041,0.53002 -0.08315,0.24371 -0.04901,0.50627 0.03636,0.70157 0.08537,0.19531 0.226562,0.36514 0.368205,0.52344 0.283296,0.31663 0.632701,0.60557 1.007899,0.89849 0.375198,0.29292 0.776711,0.55926 1.067753,0.81027 0.291042,0.25101 0.454223,0.50796 0.459122,0.52271 0.0048,0.0146 0.03119,0.33498 -0.05456,0.70231 -0.08575,0.36732 -0.223801,0.81174 -0.352819,1.26034 -0.129019,0.44861 -0.25176,0.90196 -0.291704,1.31835 -0.01997,0.20819 -0.04285,0.40729 0.0053,0.61409 0.04814,0.20679 0.184498,0.43007 0.399016,0.58168 0.214508,0.15161 0.449359,0.1881 0.668233,0.1701 0.218874,-0.018 0.435347,-0.0703 0.635153,-0.15132 0.399612,-0.16214 0.801767,-0.42851 1.206417,-0.68231 0.404649,-0.2538 0.808218,-0.52155 1.145553,-0.71107 0.337335,-0.18952 0.648398,-0.2686 0.66445,-0.26854 0.01586,6e-5 0.303381,0.0951 0.638936,0.28732 0.335555,0.19221 0.725321,0.46503 1.127607,0.72205 0.402287,0.25702 0.819957,0.49752 1.218019,0.66284 0.199027,0.0827 0.388928,0.15086 0.607623,0.17059 0.218695,0.0197 0.479784,-0.031 0.695512,-0.18105 0.215717,-0.15001 0.339276,-0.35235 0.389178,-0.55877 0.0499,-0.20642 0.04291,-0.43517 0.02476,-0.64358 -0.03632,-0.41683 -0.158989,-0.86394 -0.284099,-1.31372 -0.12511,-0.44978 -0.261649,-0.88661 -0.344206,-1.25475 -0.08256,-0.36813 -0.07169,-0.68662 -0.06666,-0.70133 0.005,-0.0145 0.187465,-0.25247 0.480599,-0.50101 0.293134,-0.24854 0.675989,-0.53755 1.053628,-0.82731 0.37764,-0.28976 0.767161,-0.57158 1.053124,-0.88579 0.142977,-0.1571 0.241796,-0.33444 0.32882,-0.52904 0.08702,-0.1946 0.135998,-0.42874 0.05481,-0.67306 -0.08119,-0.24432 -0.271084,-0.41314 -0.459122,-0.52272 -0.188037,-0.10958 -0.366789,-0.18158 -0.577821,-0.22931 -0.422064,-0.0955 -0.913586,-0.14009 -1.395564,-0.16426 -0.481977,-0.0242 -0.945835,-0.039 -1.334196,-0.077 -0.388361,-0.038 -0.715653,-0.13122 -0.728592,-0.14037 -0.01279,-0.009 -0.184019,-0.23636 -0.338404,-0.58217 -0.154385,-0.34581 -0.326584,-0.78819 -0.495481,-1.22429 -0.168896,-0.4361 -0.334766,-0.86429 -0.556091,-1.2238 -0.110668,-0.17977 -0.233352,-0.35397 -0.398259,-0.49396 -0.164907,-0.13999 -0.40309,-0.25684 -0.66899,-0.25783 z m 0.0086,0.99424 c 0.0422,0.0358 0.106711,0.13602 0.184103,0.26173 0.154773,0.25141 0.330675,0.6272 0.493967,1.04883 0.163292,0.42163 0.319052,0.88645 0.495985,1.28277 0.176933,0.39633 0.314564,0.73379 0.675296,0.98889 0.360721,0.25509 0.770187,0.29763 1.215244,0.34118 0.445058,0.0435 0.92882,0.0532 1.394807,0.0765 0.465988,0.0234 0.918236,0.0697 1.213479,0.13647 0.147627,0.0334 0.255581,0.0572 0.303811,0.0853 -0.02227,0.0498 -0.07958,0.15478 -0.179562,0.26464 -0.199968,0.21973 -0.537491,0.48746 -0.902606,0.7676 -0.365114,0.28015 -0.778037,0.57219 -1.113986,0.85704 -0.33595,0.28485 -0.639918,0.53221 -0.779871,0.94209 -0.139952,0.40986 -0.05396,0.77681 0.04065,1.19869 0.09461,0.42189 0.25406,0.87813 0.375016,1.31299 0.120956,0.43486 0.226877,0.84692 0.25228,1.13851 0.01156,0.13264 -0.01699,0.23485 -0.02778,0.29267 -0.05993,-0.008 -0.176402,-0.0324 -0.303811,-0.0853 -0.278362,-0.11561 -0.646494,-0.32808 -1.03543,-0.57657 -0.388935,-0.24849 -0.803899,-0.53053 -1.18847,-0.75081 -0.38457,-0.22028 -0.707909,-0.39837 -1.155138,-0.40015 -0.447219,-0.002 -0.792046,0.17245 -1.178633,0.38965 -0.386587,0.21719 -0.784375,0.49517 -1.175607,0.74055 -0.391232,0.24538 -0.776359,0.4507 -1.055898,0.56412 -0.139769,0.0567 -0.246155,0.0856 -0.302298,0.0902 -0.01026,-0.0578 -0.01522,-0.16008 -0.0025,-0.29243 0.02793,-0.29118 0.138178,-0.70893 0.262912,-1.14264 0.124734,-0.43372 0.254035,-0.89785 0.352315,-1.31883 0.09828,-0.42099 0.186721,-0.78846 0.05027,-1.19943 -0.136442,-0.41097 -0.43218,-0.64202 -0.765707,-0.92967 -0.333527,-0.28766 -0.705509,-0.58555 -1.068257,-0.86876 -0.362749,-0.2832 -0.717797,-0.56075 -0.915974,-0.78224 -0.09908,-0.11075 -0.162208,-0.21163 -0.184103,-0.26173 0.04834,-0.0276 0.154481,-0.058 0.302298,-0.0902 0.295625,-0.0643 0.745175,-0.10714 1.211209,-0.1267 0.466034,-0.0196 0.948238,-0.0298 1.393546,-0.0697 0.445308,-0.0399 0.846793,-0.0499 1.209695,-0.30216 0.362893,-0.25221 0.5383,-0.60511 0.718755,-1.00009 0.180456,-0.39497 0.33731,-0.84115 0.504347,-1.26156 0.167037,-0.42041 0.318485,-0.83556 0.475555,-1.08586 0.07853,-0.12515 0.167511,-0.20007 0.21012,-0.23565 z' id='path14179' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.04970646;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 89.0002,398.5 c -0.92654,-0.003 -1.43567,3.13373 -2.1875,3.65625 -0.75154,0.52231 -4.02289,0.0261 -4.3125,0.875 -0.28973,0.84921 2.65482,2.27358 2.9375,3.125 0.28257,0.85109 -1.24718,3.69066 -0.5,4.21875 0.74748,0.5283 3.10471,-1.72244 4.03125,-1.71875 0.008,3e-5 0.0226,-4.1e-4 0.0312,0 L 89.0002,398.5 z' id='path14181' style='color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.04970646;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-81.000202,-397)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-81.000202,-397)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-81.000202,-397)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-81.000202,-397)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-81.000202,-397)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-81.000202,-397)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-81.000202,-397)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-81.000202,-397)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/send-to-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/send-to-symbolic-ref.png
new file mode 100644
index 00000000..cd516b02
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/send-to-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/send-to-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/send-to-symbolic.svg
new file mode 100644
index 00000000..b4e16d80
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/send-to-symbolic.svg
@@ -0,0 +1,36 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='send-to-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.92pre3 r' viewBox='0 0 16 16' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='271.682' inkscape:cy='441.06827' inkscape:document-units='px' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='200.0002' originy='690' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-41.000004,-907)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-41.000004,-907)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-41.000004,-907)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-41.000004,-907)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-41.000004,-907)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-41.000004,-907)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-41.000004,-907)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-41.000004,-907)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-41.000004,-907)'>
+
+ <path inkscape:connector-curvature='0' d='m 47.0002,907 -4.00436,2.60053 2.33814,0.36339 -2.00985,5.80655 c 2.24125,-0.43289 4.38456,0.75975 4.89844,3.25272 l 4.64422,-4.60121 1.13341,1.69492 1,-5.1169 -4.81381,0.19547 1.27128,1.56728 -4.45747,2.74488 0.60769,-4.98335 2.21537,0.45428 z' id='path24884-3' sodipodi:nodetypes='cccccccccccccc' style='color:#000000;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999994;marker:none;enable-background:new' inkscape:transform-center-x='-3.9656263' inkscape:transform-center-y='-5.5812618'/>
+ <rect height='4.9939418' id='rect11470' rx='2.4969709' ry='2.4969709' style='color:#000000;clip-rule:nonzero;display:block;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new' width='4.9939418' x='41.993839' y='917.01532'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/software-update-available-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/software-update-available-symbolic-ref.png
new file mode 100644
index 00000000..bf6763dd
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/software-update-available-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/software-update-available-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/software-update-available-symbolic.svg
new file mode 100644
index 00000000..b3806a0d
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/software-update-available-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='software-update-available-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.4 r9939' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='91.283809' inkscape:cy='-381.9103' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='702' inkscape:window-maximized='1' inkscape:window-width='1366' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='60px' originy='40.000001px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ <inkscape:grid color='#000000' empcolor='#000000' empopacity='0' empspacing='4' enabled='true' id='grid5968' opacity='0.1254902' originx='60px' originy='40.000001px' snapvisiblegridlinesonly='true' spacingx='0.5px' spacingy='0.5px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-181.0002,-257)'>
+
+ <path inkscape:connector-curvature='0' d='m 189.0002,257.0625 -2.25,3.40625 -3.4375,-1.15625 1.15625,3.4375 -3.40625,2.25 3.40625,2.25 -1.15625,3.4375 3.4375,-1.15625 2.25,3.40625 2.25,-3.40625 3.4375,1.15625 -1.15625,-3.4375 3.40625,-2.25 -3.40625,-2.25 1.15625,-3.4375 -3.4375,1.15625 z m 0,4.53125 0.71875,0.6875 2,2 c 0.2236,0.22597 0.33131,0.56107 0.28125,0.875 l 0,0.84375 -0.875,0 c -0.30421,0.0401 -0.62444,-0.0666 -0.84375,-0.28125 l -0.28125,-0.28125 0,2.5625 -2,0 0,-2.5625 -0.28125,0.28125 c -0.19084,0.18226 -0.45489,0.28559 -0.71875,0.28125 l -0.15625,0 -0.84375,0 0,-0.78125 c -0.001,-0.0312 -0.001,-0.0625 0,-0.0937 -0.0401,-0.30421 0.0666,-0.62444 0.28125,-0.84375 l 2,-2 z' id='rect7040' sodipodi:nodetypes='ccccccccccccccccccccccccccccccccccccc' style='fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;display:inline;enable-background:new'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-181.0002,-257)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-181.0002,-257)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-181.0002,-257)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-181.0002,-257)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-181.0002,-257)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-181.0002,-257)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-181.0002,-257)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-181.0002,-257)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/software-update-urgent-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/software-update-urgent-symbolic-ref.png
new file mode 100644
index 00000000..3066942b
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/software-update-urgent-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/software-update-urgent-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/software-update-urgent-symbolic.svg
new file mode 100644
index 00000000..d40a80c9
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/software-update-urgent-symbolic.svg
@@ -0,0 +1,30 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:svg='http://www.w3.org/2000/svg' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' version='1.1' inkscape:version='0.48+devel r9873 custom' height='16' sodipodi:docname='software-update-urgent-symbolic.svg' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:object-paths='true' inkscape:cy='8.000001' inkscape:current-layer='layer9' inkscape:window-width='1280' pagecolor='#555753' showborder='false' showguides='true' inkscape:snap-nodes='false' objecttolerance='10' showgrid='true' inkscape:object-nodes='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:window-x='0' inkscape:snap-bbox='true' bordercolor='#666666' id='namedview88' inkscape:window-maximized='1' inkscape:snap-global='false' inkscape:window-y='26' gridtolerance='10' inkscape:zoom='17.2' inkscape:window-height='743' borderopacity='1' guidetolerance='10' inkscape:snap-bbox-midpoints='false' inkscape:cx='-8' inkscape:bbox-paths='false' inkscape:snap-grids='true' inkscape:pageopacity='1' inkscape:snap-to-guides='true'>
+ <inkscape:grid visible='true' spacingx='1px' type='xygrid' spacingy='1px' id='grid4866' empspacing='2' enabled='true' snapvisiblegridlinesonly='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g transform='translate(-181.0002,-257)' inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline'>
+
+ <path inkscape:connector-curvature='0' class='warning' d='m 189,257.05814 -2.26467,3.41252 -3.41252,-1.14785 1.14785,3.41252 -3.41252,2.26467 3.41252,2.26467 -1.14785,3.41252 3.41252,-1.14785 2.26467,3.41252 2.26467,-3.41252 3.41252,1.14785 -1.14785,-3.41252 3.41252,-2.26467 -3.41252,-2.26467 1.14785,-3.41252 -3.41252,1.14785 z m -0.99273,4.03298 1.98546,0 0,4.93264 -1.98546,0 z m 1.02375,5.64616 c 0.70247,0 1.27194,0.56947 1.27194,1.27194 0,0.70247 -0.56947,1.27194 -1.27194,1.27194 -0.70247,0 -1.27194,-0.56947 -1.27194,-1.27194 0,-0.70247 0.56947,-1.27194 1.27194,-1.27194 z' id='path16909' sodipodi:nodetypes='ccccccccccccccccccccccsssss' style='fill:#f57900;fill-opacity:1;fill-rule:evenodd;stroke:none;display:inline;enable-background:new'/>
+ </g>
+ <g transform='translate(-181.0002,-257)' inkscape:groupmode='layer' id='layer10' inkscape:label='devices'/>
+ <g transform='translate(-181.0002,-257)' inkscape:groupmode='layer' id='layer11' inkscape:label='apps'/>
+ <g transform='translate(-181.0002,-257)' inkscape:groupmode='layer' id='layer12' inkscape:label='actions'/>
+ <g transform='translate(-181.0002,-257)' inkscape:groupmode='layer' id='layer13' inkscape:label='places'/>
+ <g transform='translate(-181.0002,-257)' inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes'/>
+ <g transform='translate(-181.0002,-257)' inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline'/>
+ <g transform='translate(-181.0002,-257)' inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/star-new-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/star-new-symbolic-ref.png
new file mode 100644
index 00000000..a1c799f6
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/star-new-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/star-new-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/star-new-symbolic.svg
new file mode 100644
index 00000000..2dd2b84c
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/star-new-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='star-new-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='35.25944' inkscape:cy='298.8702' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1373' inkscape:window-maximized='0' inkscape:window-width='1279' inkscape:window-x='1279' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-80px' originy='610px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-321.0002,-827)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-321.0002,-827)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-321.0002,-827)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-321.0002,-827)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-321.0002,-827)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-321.0002,-827)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-321.0002,-827)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-321.0002,-827)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-321.0002,-827)'>
+ <path inkscape:connector-curvature='0' d='m 329.0002,827.6875 c -1.00052,-0.004 -1.56313,3.54025 -2.375,4.125 -0.81155,0.58452 -4.34351,-0.0125 -4.65625,0.9375 -0.31286,0.95036 2.88225,2.57842 3.1875,3.53125 0.30513,0.95245 -1.3381,4.12776 -0.53125,4.71875 0.80717,0.59122 3.34323,-1.94163 4.34375,-1.9375 1.00013,0.004 3.5011,2.58473 4.3125,2 0.81172,-0.58496 -0.81311,-3.79972 -0.5,-4.75 0.31298,-0.9499 3.52413,-2.54763 3.21875,-3.5 -0.3055,-0.95275 -3.84924,-0.37732 -4.65625,-0.96875 -0.8067,-0.5912 -1.34362,-4.15238 -2.34375,-4.15625 z m -1,4.3125 2,0 0,2 2,0 0,2 -2,0 0,2 -2,0 0,-2 -2,0 0,-2 2,0 z' id='path11922-4' sodipodi:nodetypes='ssssscsssssccccccccccccc' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/starred-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/starred-symbolic-ref.png
new file mode 100644
index 00000000..f9a5e191
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/starred-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/starred-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/starred-symbolic.svg
new file mode 100644
index 00000000..0944a772
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/starred-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:svg='http://www.w3.org/2000/svg' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' sodipodi:docname='starred-symbolic.svg' version='1.1' inkscape:version='0.48.1 r9760' height='16' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:cy='0.50817' pagecolor='#555753' borderopacity='1' showborder='false' inkscape:bbox-paths='false' guidetolerance='10' inkscape:object-paths='true' inkscape:window-width='1457' showguides='true' inkscape:object-nodes='true' inkscape:snap-bbox='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:snap-nodes='false' bordercolor='#666666' objecttolerance='10' id='namedview88' showgrid='false' inkscape:window-maximized='0' inkscape:window-x='86' inkscape:snap-global='true' inkscape:window-y='51' gridtolerance='10' inkscape:window-height='1093' inkscape:snap-to-guides='true' inkscape:current-layer='layer9' inkscape:snap-bbox-midpoints='false' inkscape:zoom='1' inkscape:cx='19.029058' inkscape:snap-grids='true' inkscape:pageopacity='1'>
+ <inkscape:grid spacingx='1px' spacingy='1px' id='grid4866' empspacing='2' enabled='true' type='xygrid' snapvisiblegridlinesonly='true' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:label='status' transform='translate(-41.000202,-397)' inkscape:groupmode='layer' id='layer9' style='display:inline'>
+ <g inkscape:label='folder-remote' transform='translate(-186.9996,-599)' id='g11910-1'>
+
+ </g>
+ <path sodipodi:cy='180.96373' sodipodi:r2='3.8276224' transform='matrix(1.0472113,-0.00871584,0.00871584,1.0472113,-504.35434,220.15425)' inkscape:rounded='0.2104596' inkscape:flatsided='false' inkscape:transform-center-x='-0.0094346789' inkscape:transform-center-y='-0.69491065' d='m 530.9488,186.70897 c -0.77941,0.55189 -3.15759,-1.90601 -4.11253,-1.9179 -0.95532,-0.0119 -3.39494,2.38585 -4.16096,1.8149 -0.76573,-0.57072 0.83698,-3.59203 0.55319,-4.50391 -0.2839,-0.91223 -3.31818,-2.49151 -3.01189,-3.39647 0.30617,-0.90461 3.67487,-0.31399 4.45442,-0.86567 0.77986,-0.5519 1.3442,-3.92569 2.29952,-3.91404 0.95494,0.0116 1.43421,3.39798 2.19979,3.9689 0.76588,0.57114 4.14893,0.0653 4.43307,0.97746 0.28402,0.9118 -2.78848,2.41405 -3.09488,3.31858 -0.30652,0.90489 1.21999,3.96605 0.44027,4.51815 z' id='path11922-0' sodipodi:type='star' sodipodi:arg1='0.95492637' sodipodi:r1='7.0383992' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' sodipodi:arg2='1.5829876' inkscape:randomized='0' sodipodi:cx='526.88293' sodipodi:sides='5'/>
+ </g>
+ <g inkscape:label='devices' transform='translate(-41.000202,-397)' inkscape:groupmode='layer' id='layer10'/>
+ <g inkscape:label='apps' transform='translate(-41.000202,-397)' inkscape:groupmode='layer' id='layer11'/>
+ <g inkscape:label='actions' transform='translate(-41.000202,-397)' inkscape:groupmode='layer' id='layer12'/>
+ <g inkscape:label='places' transform='translate(-41.000202,-397)' inkscape:groupmode='layer' id='layer13'/>
+ <g inkscape:label='mimetypes' transform='translate(-41.000202,-397)' inkscape:groupmode='layer' id='layer14'/>
+ <g inkscape:label='emblems' transform='translate(-41.000202,-397)' inkscape:groupmode='layer' id='layer15' style='display:inline'/>
+ <g inkscape:label='categories' transform='translate(-41.000202,-397)' inkscape:groupmode='layer' id='g4953' style='display:inline'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/start-here-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/start-here-symbolic-ref.png
new file mode 100644
index 00000000..f3df06f5
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/start-here-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/start-here-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/start-here-symbolic.svg
new file mode 100644
index 00000000..ab79ac38
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/start-here-symbolic.svg
@@ -0,0 +1,38 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:svg='http://www.w3.org/2000/svg' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' version='1.1' inkscape:version='0.47 r22583' height='16.000008' sodipodi:docname='start-here-symbolic.svg' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:cy='10.311093' inkscape:current-layer='layer13' inkscape:window-width='1310' pagecolor='#555753' showborder='false' showguides='true' inkscape:snap-nodes='false' objecttolerance='10' showgrid='false' inkscape:object-nodes='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:window-x='52' inkscape:snap-bbox='true' bordercolor='#666666' id='namedview88' inkscape:window-maximized='0' inkscape:snap-global='true' inkscape:window-y='24' gridtolerance='10' inkscape:zoom='1' inkscape:window-height='690' borderopacity='1' guidetolerance='10' inkscape:cx='-0.30176164' inkscape:bbox-paths='false' inkscape:snap-grids='true' inkscape:pageopacity='1' inkscape:snap-to-guides='true'>
+ <inkscape:grid visible='true' spacingx='1px' type='xygrid' spacingy='1px' id='grid4866' empspacing='2' enabled='true' snapvisiblegridlinesonly='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g transform='translate(-542,-175.99999)' inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline'/>
+ <g transform='translate(-542,-175.99999)' inkscape:groupmode='layer' id='layer10' inkscape:label='devices'/>
+ <g transform='translate(-542,-175.99999)' inkscape:groupmode='layer' id='layer11' inkscape:label='apps'/>
+ <g transform='translate(-542,-175.99999)' inkscape:groupmode='layer' id='layer12' inkscape:label='actions'/>
+ <g transform='translate(-542,-175.99999)' inkscape:groupmode='layer' id='layer13' inkscape:label='places'>
+ <g transform='translate(314.0002,-820)' id='g12878' inkscape:label='folder-remote'>
+
+ </g>
+ <g transform='matrix(0.14909103,0,0,0.14909103,565.15384,193.1857)' id='g6230' style='fill:#bebebe;fill-opacity:1'>
+ <path inkscape:connector-curvature='0' d='m -63.883826,-115.2699 c -22.295562,0 -26.477906,31.755906 -13.935406,31.755906 12.540687,0 36.231872,-31.755906 13.935406,-31.755906 z' id='path9' style='fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none'/>
+ <path inkscape:connector-curvature='0' d='m -100.90505,-87.448931 c 6.678161,0.407812 14.005193,-25.485559 1.45363,-23.857029 -12.54703,1.62853 -8.1345,23.449216 -1.45363,23.857029 z' id='path11' style='fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none'/>
+ <path inkscape:connector-curvature='0' d='m -131.51092,-71.359369 c 4.74966,-2.090718 0.61172,-22.54025 -7.46478,-16.963187 -8.07288,5.577969 2.71512,19.053 7.46478,16.963187 z' id='path13' style='fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none'/>
+ <path inkscape:connector-curvature='0' d='m -118.12833,-82.063087 c 5.6541,-1.152751 5.96404,-24.345503 -4.1189,-20.184903 -10.08475,4.161496 -1.53066,21.339465 4.1189,20.184903 l 0,0 z' id='path15' style='fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none'/>
+ <path inkscape:connector-curvature='0' d='m -88.603607,-30.161244 c 1.003219,7.661438 -5.620563,11.445031 -12.107503,6.505969 -20.65072,-15.722531 34.191909,-23.565219 30.576878,-45.046062 -3.000594,-17.829563 -57.706378,-12.340407 -63.935938,15.556687 -4.21678,18.869937 17.35741,45.04788 39.868657,45.04788 11.074375,0 23.847968,-9.999568 26.23775,-22.66713 1.825187,-9.659719 -21.477219,-5.789125 -20.639844,0.602656 l 0,0 z' id='newshape' style='fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none'/>
+ </g>
+ </g>
+ <g transform='translate(-542,-175.99999)' inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes'/>
+ <g transform='translate(-542,-175.99999)' inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline'/>
+ <g transform='translate(-542,-175.99999)' inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/system-file-manager-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/system-file-manager-symbolic-ref.png
new file mode 100644
index 00000000..f27dff9f
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/system-file-manager-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/system-file-manager-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/system-file-manager-symbolic.svg
new file mode 100644
index 00000000..2281d98f
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/system-file-manager-symbolic.svg
@@ -0,0 +1,30 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:svg='http://www.w3.org/2000/svg' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' version='1.1' inkscape:version='0.47 r22583' height='16' sodipodi:docname='system-file-manager-symbolic.svg' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:object-paths='true' inkscape:cy='-218.16054' inkscape:current-layer='layer11' inkscape:window-width='1920' pagecolor='#555753' showborder='false' showguides='true' inkscape:snap-nodes='false' objecttolerance='10' showgrid='true' inkscape:object-nodes='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:window-x='0' inkscape:snap-bbox='true' bordercolor='#666666' id='namedview88' inkscape:window-maximized='1' inkscape:snap-global='true' inkscape:window-y='26' gridtolerance='10' inkscape:zoom='1' inkscape:window-height='1021' borderopacity='1' guidetolerance='10' inkscape:snap-bbox-midpoints='false' inkscape:cx='-144.56708' inkscape:bbox-paths='false' inkscape:snap-grids='true' inkscape:pageopacity='1' inkscape:snap-to-guides='true'>
+ <inkscape:grid visible='true' spacingx='1px' type='xygrid' spacingy='1px' id='grid4866' empspacing='2' enabled='true' snapvisiblegridlinesonly='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g transform='translate(-202.0002,-490)' inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline'/>
+ <g transform='translate(-202.0002,-490)' inkscape:groupmode='layer' id='layer10' inkscape:label='devices'/>
+ <g transform='translate(-202.0002,-490)' inkscape:groupmode='layer' id='layer11' inkscape:label='apps'>
+
+ <path inkscape:connector-curvature='0' d='M 205.1875,490 C 203.98238,490 203,491.01795 203,492.21875 l 0,11.5625 c 0,1.2008 0.98238,2.21875 2.1875,2.21875 l 9.625,0 c 1.20512,0 2.1875,-1.01795 2.1875,-2.21875 l 0,-11.5625 C 217,491.01795 216.01762,490 214.8125,490 l -9.625,0 z m -0.1875,3 10,0 0,11 -10,0 0,-11 z m 1,1 0,4 8.03125,0 0,-4 L 206,494 z m 2.34375,1.4375 a 0.50004997,0.50004997 0 0 1 0.0625,0 0.50004997,0.50004997 0 0 1 0.59375,0.5 l 0,0.0625 2,0 0,-0.0625 a 0.50004997,0.50004997 0 1 1 1,0 L 212,496 c 0,0.54535 -0.45465,1 -1,1 l -2,0 c -0.54535,0 -1,-0.45465 -1,-1 l 0,-0.0625 a 0.50004997,0.50004997 0 0 1 0.34375,-0.5 z m -2.3125,3.5625 0,4 8.03125,0 0,-4 -8.03125,0 z m 2.3125,1.4375 a 0.50004997,0.50004997 0 0 1 0.0625,0 0.50004997,0.50004997 0 0 1 0.59375,0.5 l 0,0.0625 2,0 0,-0.0625 a 0.50004997,0.50004997 0 1 1 1,0 L 212,501 c 0,0.54535 -0.45465,1 -1,1 l -2,0 c -0.54535,0 -1,-0.45465 -1,-1 l 0,-0.0625 a 0.50004997,0.50004997 0 0 1 0.34375,-0.5 z' id='rect11668-7' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ </g>
+ <g transform='translate(-202.0002,-490)' inkscape:groupmode='layer' id='layer12' inkscape:label='actions'/>
+ <g transform='translate(-202.0002,-490)' inkscape:groupmode='layer' id='layer13' inkscape:label='places'/>
+ <g transform='translate(-202.0002,-490)' inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes'/>
+ <g transform='translate(-202.0002,-490)' inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline'/>
+ <g transform='translate(-202.0002,-490)' inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/system-help-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/system-help-symbolic-ref.png
new file mode 100644
index 00000000..4273f9f7
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/system-help-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/system-help-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/system-help-symbolic.svg
new file mode 100644
index 00000000..cae1ccd5
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/system-help-symbolic.svg
@@ -0,0 +1,33 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns='http://www.w3.org/2000/svg' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:dc='http://purl.org/dc/elements/1.1/' version='1.1' inkscape:version='0.48.1 r9760' id='svg7384' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' width='16.000004' xmlns:cc='http://creativecommons.org/ns#' xmlns:svg='http://www.w3.org/2000/svg' height='16' sodipodi:docname='system-help-symbolic.svg' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:snap-others='false' inkscape:bbox-paths='false' inkscape:pageshadow='2' pagecolor='#555753' showguides='true' inkscape:snap-nodes='true' inkscape:snap-bbox-midpoints='false' bordercolor='#666666' inkscape:window-x='0' inkscape:window-y='26' inkscape:window-width='1364' inkscape:object-nodes='true' inkscape:object-paths='true' inkscape:pageopacity='1' gridtolerance='10' showborder='false' inkscape:window-height='708' showgrid='false' inkscape:zoom='1' id='namedview88' inkscape:snap-to-guides='true' inkscape:snap-global='true' inkscape:window-maximized='0' inkscape:guide-bbox='true' inkscape:current-layer='g4953' borderopacity='1' objecttolerance='10' inkscape:cx='-190.3274' inkscape:cy='-108.46698' inkscape:snap-grids='true' inkscape:snap-bbox='true' guidetolerance='10'>
+ <inkscape:grid snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' empspacing='2' visible='true' id='grid4866' enabled='true' type='xygrid'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g transform='translate(-462.0002,-462)' inkscape:groupmode='layer' inkscape:label='status' style='display:inline' id='layer9'/>
+ <g transform='translate(-462.0002,-462)' inkscape:groupmode='layer' inkscape:label='devices' id='layer10'/>
+ <g transform='translate(-462.0002,-462)' inkscape:groupmode='layer' inkscape:label='apps' id='layer11'/>
+ <g transform='translate(-462.0002,-462)' inkscape:groupmode='layer' inkscape:label='places' id='layer13'/>
+ <g transform='translate(-462.0002,-462)' inkscape:groupmode='layer' inkscape:label='mimetypes' id='layer14'/>
+ <g transform='translate(-462.0002,-462)' inkscape:groupmode='layer' inkscape:label='emblems' style='display:inline' id='layer15'/>
+ <g transform='translate(-462.0002,-462)' inkscape:groupmode='layer' style='display:inline' inkscape:label='emotes' id='g71291'/>
+ <g transform='translate(-462.0002,-462)' inkscape:groupmode='layer' style='display:inline' inkscape:label='categories' id='g4953'>
+
+ <path inkscape:connector-curvature='0' d='m 463.96895,462 c -1.0912,0 -1.96875,0.87755 -1.96875,1.96875 l 0,12.0625 c 0,1.0912 0.87755,1.96875 1.96875,1.96875 l 12.03125,0 c 0.554,0 1,-0.446 1,-1 l 0,-11 c 0,-0.554 -0.446,-1 -1,-1 l -12,0 c -0.554,0 -1,-0.446 -1,-1 0,-0.554 0.446,-1 1,-1 l 12,0 c 0,-0.55856 -0.44144,-1 -1,-1 z m 6.03125,4.0625 c 2.72669,0 4.9375,2.20786 4.9375,4.9375 0,2.72964 -2.21081,4.9375 -4.9375,4.9375 -2.72669,0 -4.9375,-2.20786 -4.9375,-4.9375 0,-2.72964 2.21081,-4.9375 4.9375,-4.9375 z m 0,1 c -0.63685,0 -1.21995,0.17421 -1.75,0.4375 l 0.71875,1.5 c 0.31325,-0.1625 0.65582,-0.28125 1.03125,-0.28125 0.37543,0 0.718,0.11875 1.03125,0.28125 l 0.71875,-1.5 c -0.53005,-0.26329 -1.11315,-0.4375 -1.75,-0.4375 z m -3.5,2.1875 c -0.26373,0.53017 -0.4375,1.11182 -0.4375,1.75 0,0.64816 0.16599,1.24503 0.4375,1.78125 l 1.5,-0.75 c -0.16256,-0.31326 -0.28125,-0.65563 -0.28125,-1.03125 0,-0.36123 0.0989,-0.69568 0.25,-1 z m 7.03125,0 -1.5,0.75 c 0.1511,0.30432 0.25,0.63877 0.25,1 0,0.37562 -0.11869,0.71799 -0.28125,1.03125 l 1.5,0.75 c 0.27151,-0.53622 0.4375,-1.13309 0.4375,-1.78125 0,-0.6332 -0.14638,-1.22289 -0.40625,-1.75 z m -3.53125,0.46875 c -0.71682,0 -1.28125,0.56221 -1.28125,1.28125 0,0.71904 0.56443,1.28125 1.28125,1.28125 0.71682,0 1.28125,-0.56221 1.28125,-1.28125 0,-0.71904 -0.56443,-1.28125 -1.28125,-1.28125 z M 471.03145,473 c -0.31325,0.1625 -0.65582,0.28125 -1.03125,0.28125 -0.36105,0 -0.6957,-0.099 -1,-0.25 l -0.75,1.5 c 0.52698,0.25944 1.11813,0.40625 1.75,0.40625 0.63685,0 1.21995,-0.17421 1.75,-0.4375 z' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' id='rect4665-8' sodipodi:nodetypes='cccccssccsccccssssssccsccscsccsccccsccscssssscsccscc'/>
+ <path inkscape:connector-curvature='0' d='m 470.00019,467.03125 c -0.64211,0 -1.24505,0.13662 -1.78125,0.40625 l 0.74229,1.53246 c 0.39027,-0.17861 0.54899,-0.21178 1.0422,-0.24611 0.54638,-0.002 0.71942,0.13487 1.02655,0.23344 l 0.72021,-1.51979 c -0.53621,-0.26958 -1.10789,-0.40625 -1.75,-0.40625 z m -3.5625,2.21875 c -0.26553,0.53901 -0.4375,1.13563 -0.4375,1.78125 0,0.65895 0.19284,1.26532 0.46875,1.8125 l 1.52678,-0.77591 c -0.15799,-0.27948 -0.23673,-0.49585 -0.27949,-1.05679 0.0432,-0.4966 0.0616,-0.47071 0.23058,-0.98785 z m 7.125,0 -1.49679,0.74459 c 0.15043,0.37094 0.19879,0.4814 0.22336,1.00931 -0.006,0.22936 0.0148,0.52961 -0.26718,1.08514 l 1.50931,0.75466 c 0.27592,-0.54718 0.4375,-1.15355 0.4375,-1.8125 0,-0.64562 -0.14071,-1.24223 -0.40625,-1.78125 z m -3.53488,4.03948 c -0.47463,-0.0401 -0.61731,-0.0296 -1.01202,-0.23332 l -0.79685,1.56879 c 0.5362,0.26963 1.13914,0.4375 1.78125,0.4375 0.64211,0 1.21381,-0.16787 1.75,-0.4375 l -0.74598,-1.56656 c -0.39575,0.19501 -0.43347,0.17321 -0.9764,0.23109 z' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible' id='rect11749-5-0-3-9-3-7-4' sodipodi:nodetypes='scccccscsccccccccccsccccscccc'/>
+ <path sodipodi:rx='3.5' sodipodi:ry='3.90625' transform='matrix(0.36662946,0,0,0.3275,386.55368,381.28364)' d='m 231.125,273.96875 a 3.5,3.90625 0 1 1 -7,0 3.5,3.90625 0 1 1 7,0 z' style='fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none' id='path5579' sodipodi:type='arc' sodipodi:cx='227.625' sodipodi:cy='273.96875'/>
+ </g>
+ <g transform='translate(-462.0002,-462)' inkscape:groupmode='layer' inkscape:label='actions' style='display:inline' id='layer12'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/system-lock-screen-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/system-lock-screen-symbolic-ref.png
new file mode 100644
index 00000000..ec0ee22d
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/system-lock-screen-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/system-lock-screen-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/system-lock-screen-symbolic.svg
new file mode 100644
index 00000000..6016ba5d
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/system-lock-screen-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='system-lock-screen-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.5 r10040' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='94.739995' inkscape:cy='-251.76016' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1375' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='60px' originy='20px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-181.0002,-237)'>
+
+ <path inkscape:connector-curvature='0' d='m 188.0002,238 c -1.6447,0 -3,1.3553 -3,3 l 0,3 -1,0 c -0.554,0 -1,0.446 -1,1 l 0,0.53125 0,5.46875 5,0 2,0 5,0 0,-5.46875 0,-0.53125 c 0,-0.554 -0.446,-1 -1,-1 l -1,0 0,-3 c 0,-1.6447 -1.3553,-3 -3,-3 l -2,0 z m 0,2 2,0 c 0.5713,0 1,0.4287 1,1 l 0,3 -4,0 0,-3 c 0,-0.5713 0.4287,-1 1,-1 z' id='path5721' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-181.0002,-237)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-181.0002,-237)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-181.0002,-237)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-181.0002,-237)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-181.0002,-237)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-181.0002,-237)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-181.0002,-237)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-181.0002,-237)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/system-run-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/system-run-symbolic-ref.png
new file mode 100644
index 00000000..0646645e
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/system-run-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/system-run-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/system-run-symbolic.svg
new file mode 100644
index 00000000..5d43cc78
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/system-run-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:svg='http://www.w3.org/2000/svg' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' version='1.1' inkscape:version='0.47 r22583' height='16' sodipodi:docname='system-run-symbolic.svg' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:cy='100.21811' inkscape:current-layer='layer12' inkscape:window-width='1310' pagecolor='#555753' showborder='false' showguides='true' inkscape:snap-nodes='true' objecttolerance='10' showgrid='false' inkscape:object-nodes='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:window-x='58' inkscape:snap-bbox='true' bordercolor='#666666' id='namedview88' inkscape:window-maximized='0' inkscape:snap-global='true' inkscape:window-y='353' gridtolerance='10' inkscape:zoom='1' inkscape:window-height='690' borderopacity='1' guidetolerance='10' inkscape:cx='124.39179' inkscape:bbox-paths='false' inkscape:snap-grids='true' inkscape:pageopacity='1' inkscape:snap-to-guides='true'>
+ <inkscape:grid visible='true' spacingx='1px' type='xygrid' spacingy='1px' id='grid4866' empspacing='2' enabled='true' snapvisiblegridlinesonly='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g transform='translate(-61.000198,-687)' inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline'/>
+ <g transform='translate(-61.000198,-687)' inkscape:groupmode='layer' id='layer10' inkscape:label='devices'/>
+ <g transform='translate(-61.000198,-687)' inkscape:groupmode='layer' id='layer11' inkscape:label='apps'/>
+ <g transform='translate(-61.000198,-687)' inkscape:groupmode='layer' id='layer12' inkscape:label='actions'>
+
+ <path inkscape:connector-curvature='0' d='m 72.375,687.25 c -0.239942,0.43525 -0.467624,1.00577 -0.71875,1.4375 -0.09387,-0.007 -0.185709,-0.0313 -0.28125,-0.0313 -0.332255,0 -0.660088,0.0487 -0.96875,0.125 -0.305025,-0.3828 -0.630342,-0.89813 -0.9375,-1.28125 -0.284596,0.10504 -0.552268,0.22648 -0.8125,0.375 0.09593,0.48262 0.276896,1.07105 0.375,1.5625 -0.343004,0.24882 -0.626184,0.532 -0.875,0.875 -0.491453,-0.0981 -1.079882,-0.27907 -1.5625,-0.375 -0.148521,0.26023 -0.269963,0.5279 -0.375,0.8125 0.383118,0.30716 0.898446,0.63248 1.28125,0.9375 -0.07635,0.30866 -0.125,0.6365 -0.125,0.96875 0,0.0955 0.02466,0.18738 0.03125,0.28125 -0.431735,0.25113 -1.00225,0.47881 -1.4375,0.71875 0.05124,0.27476 0.128303,0.55374 0.21875,0.8125 0.491399,-0.01 1.099493,-0.0946 1.59375,-0.0937 0.187125,0.39176 0.420532,0.75381 0.71875,1.0625 -0.172042,0.46783 -0.448123,1.0086 -0.625,1.46875 0.212898,0.1757 0.449497,0.32623 0.6875,0.46875 0.369206,-0.32011 0.775422,-0.77147 1.15625,-1.09375 0.378045,0.17256 0.788621,0.26529 1.21875,0.3125 0.164542,0.47676 0.304284,1.08808 0.46875,1.5625 0.30154,-0.002 0.586801,-0.0141 0.875,-0.0625 0.08055,-0.49291 0.110368,-1.11855 0.1875,-1.625 0.410087,-0.11684 0.811342,-0.26698 1.15625,-0.5 0.424331,0.26446 0.898868,0.62889 1.3125,0.875 0.223737,-0.19067 0.43433,-0.40126 0.625,-0.625 -0.246108,-0.41363 -0.610541,-0.88817 -0.875,-1.3125 0.233016,-0.34491 0.383162,-0.74616 0.5,-1.15625 0.506449,-0.0771 1.132085,-0.10695 1.625,-0.1875 0.04835,-0.2882 0.06081,-0.57346 0.0625,-0.875 -0.474423,-0.16447 -1.085738,-0.30421 -1.5625,-0.46875 C 75.265292,691.78862 75.172555,691.37805 75,691 c 0.32228,-0.38083 0.773639,-0.78704 1.09375,-1.15625 -0.142521,-0.238 -0.293051,-0.4746 -0.46875,-0.6875 -0.460149,0.17688 -1.000924,0.45296 -1.46875,0.625 -0.308689,-0.29822 -0.670736,-0.53162 -1.0625,-0.71875 -8.87e-4,-0.49426 0.08396,-1.10235 0.09375,-1.59375 -0.258762,-0.0904 -0.537737,-0.16751 -0.8125,-0.21875 z m -1,3.40625 c 1.104569,0 2,0.89543 2,2 0,1.10457 -0.895431,2 -2,2 -1.104569,0 -2,-0.89543 -2,-2 0,-1.10457 0.895431,-2 2,-2 z' id='path42961' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 64.6875,694.75 c -0.230139,0.0471 -0.443908,0.13096 -0.65625,0.21875 -0.01671,0.62433 0.08693,1.44177 -0.15625,1.65625 -0.238965,0.21077 -1.038358,0.0343 -1.65625,-0.0313 -0.131388,0.23649 -0.235259,0.48523 -0.3125,0.75 0.478093,0.39586 1.140508,0.83901 1.15625,1.15625 0.01594,0.32119 -0.626418,0.80489 -1.0625,1.25 0.103387,0.25783 0.250144,0.49354 0.40625,0.71875 0.608323,-0.12641 1.366392,-0.37354 1.625,-0.1875 0.263308,0.18942 0.265212,1.00535 0.34375,1.625 0.249548,0.075 0.512509,0.1045 0.78125,0.125 0.281352,-0.55462 0.567413,-1.3198 0.875,-1.40625 0.315752,-0.0887 0.963545,0.45813 1.5,0.78125 0.21871,-0.1516 0.412931,-0.33706 0.59375,-0.53125 -0.253838,-0.57232 -0.721084,-1.29192 -0.59375,-1.59375 0.127453,-0.30211 0.975404,-0.46963 1.5625,-0.6875 0.0044,-0.0735 0.03125,-0.14414 0.03125,-0.21875 0,-0.19137 -0.0344,-0.37899 -0.0625,-0.5625 -0.606097,-0.16082 -1.467207,-0.2413 -1.625,-0.53125 -0.156736,-0.28801 0.241786,-1.0614 0.4375,-1.65625 -0.201161,-0.17858 -0.419409,-0.33716 -0.65625,-0.46875 -0.500893,0.37513 -1.084329,0.99436 -1.40625,0.9375 -0.316887,-0.056 -0.662888,-0.81955 -1,-1.34375 -0.04019,0.007 -0.08527,-0.008 -0.125,0 z m 0.625,1.875 c 0.931981,0 1.6875,0.75552 1.6875,1.6875 0,0.93198 -0.755519,1.6875 -1.6875,1.6875 -0.931981,0 -1.6875,-0.75552 -1.6875,-1.6875 0,-0.93198 0.755519,-1.6875 1.6875,-1.6875 z' id='path42972' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ </g>
+ <g transform='translate(-61.000198,-687)' inkscape:groupmode='layer' id='layer13' inkscape:label='places'/>
+ <g transform='translate(-61.000198,-687)' inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes'/>
+ <g transform='translate(-61.000198,-687)' inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline'/>
+ <g transform='translate(-61.000198,-687)' inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/system-search-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/system-search-symbolic-ref.png
new file mode 100644
index 00000000..e35933f8
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/system-search-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/system-search-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/system-search-symbolic.svg
new file mode 100644
index 00000000..ace2c2fd
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/system-search-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='system-search-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.5 r10040' width='16.000002' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='226.85531' inkscape:cy='256.56615' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1375' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='139.9998px' originy='630px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-101.0004,-847)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-101.0004,-847)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-101.0004,-847)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-101.0004,-847)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-101.0004,-847)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-101.0004,-847)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-101.0004,-847)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-101.0004,-847)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-101.0004,-847)'>
+ <path inkscape:connector-curvature='0' d='m 107.50781,847.99554 c -3.02886,0 -5.51073,2.47905 -5.51073,5.50447 0,3.02541 2.48187,5.50446 5.51073,5.50446 3.02885,0 5.51072,-2.47905 5.51072,-5.50446 0,-3.02542 -2.48187,-5.50447 -5.51072,-5.50447 z m 0,2.00893 c 1.94735,0 3.49951,1.55039 3.49951,3.49554 0,1.94514 -1.55216,3.49553 -3.49951,3.49553 -1.94736,0 -3.49952,-1.55039 -3.49952,-3.49553 0,-1.94515 1.55216,-3.49554 3.49952,-3.49554 z' id='path5901' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.55467153;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 110.8125,856 a 1.0001,1.0001 0 0 0 -0.5,1.71875 l 4,4 a 1.0054782,1.0054782 0 1 0 1.40625,-1.4375 l -4,-4 A 1.0001,1.0001 0 0 0 110.8125,856 z' id='path5903' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Sans;-inkscape-font-specification:Sans'/>
+
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/system-shutdown-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/system-shutdown-symbolic-ref.png
new file mode 100644
index 00000000..75fce287
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/system-shutdown-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/system-shutdown-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/system-shutdown-symbolic.svg
new file mode 100644
index 00000000..4ddd67e7
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/system-shutdown-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:svg='http://www.w3.org/2000/svg' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' sodipodi:docname='system-shutdown-symbolic.svg' version='1.1' inkscape:version='0.48.0 r9654' height='16.02426' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:cy='-1.3922' pagecolor='#555753' borderopacity='1' showborder='false' inkscape:bbox-paths='false' guidetolerance='10' inkscape:window-width='1310' showguides='true' inkscape:object-nodes='true' inkscape:snap-bbox='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:snap-nodes='false' bordercolor='#666666' objecttolerance='10' id='namedview88' showgrid='false' inkscape:window-maximized='0' inkscape:window-x='54' inkscape:snap-global='true' inkscape:window-y='26' gridtolerance='10' inkscape:window-height='690' inkscape:snap-to-guides='true' inkscape:current-layer='layer12' inkscape:zoom='5.6568542' inkscape:cx='37.47387' inkscape:snap-grids='true' inkscape:pageopacity='1'>
+ <inkscape:grid spacingx='1px' spacingy='1px' id='grid4866' empspacing='2' enabled='true' type='xygrid' snapvisiblegridlinesonly='true' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:label='status' transform='translate(-100,-685.97574)' inkscape:groupmode='layer' id='layer9' style='display:inline'/>
+ <g inkscape:label='devices' transform='translate(-100,-685.97574)' inkscape:groupmode='layer' id='layer10'/>
+ <g inkscape:label='apps' transform='translate(-100,-685.97574)' inkscape:groupmode='layer' id='layer11'/>
+ <g inkscape:label='actions' transform='translate(-100,-685.97574)' inkscape:groupmode='layer' id='layer12'>
+
+ <path inkscape:connector-curvature='0' d='m 104.84002,687.8125 a 0.99998337,1.0002168 0 0 0 -0.34813,0.13393 c -1.05343,0.60965 -1.93145,1.46598 -2.54405,2.51786 -1.93955,3.33036 -0.81232,7.64928 2.51727,9.58928 3.32959,1.94001 7.64749,0.8125 9.58705,-2.51786 1.93955,-3.33035 0.81232,-7.64927 -2.51727,-9.58928 a 1.0081498,1.0083851 0 1 0 -1.01762,1.74107 c 2.39572,1.39588 3.18978,4.43408 1.79422,6.83036 -1.39555,2.39628 -4.43303,3.19052 -6.82876,1.79464 -2.38544,-1.38989 -3.19179,-4.41207 -1.821,-6.80357 l 0.0268,-0.0268 c 0.43759,-0.75138 1.06851,-1.38594 1.821,-1.82142 a 0.99998337,1.0002168 0 0 0 -0.66949,-1.84822 z' id='path3869-2' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2.333606;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='M 107.78125,686 A 1.0001,1.0001 0 0 0 107,687 l 0,5 a 1.0001,1.0001 0 1 0 2,0 l 0,-5 a 1.0001,1.0001 0 0 0 -1.21875,-1 z' id='path4710' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+ <g inkscape:label='places' transform='translate(-100,-685.97574)' inkscape:groupmode='layer' id='layer13'/>
+ <g inkscape:label='mimetypes' transform='translate(-100,-685.97574)' inkscape:groupmode='layer' id='layer14'/>
+ <g inkscape:label='emblems' transform='translate(-100,-685.97574)' inkscape:groupmode='layer' id='layer15' style='display:inline'/>
+ <g inkscape:label='categories' transform='translate(-100,-685.97574)' inkscape:groupmode='layer' id='g4953' style='display:inline'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/system-software-install-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/system-software-install-symbolic-ref.png
new file mode 100644
index 00000000..2dfd0b29
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/system-software-install-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/system-software-install-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/system-software-install-symbolic.svg
new file mode 100644
index 00000000..0e6b0fe5
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/system-software-install-symbolic.svg
@@ -0,0 +1,33 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='system-software-install-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.4 r9939' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer11' inkscape:cx='11.988518' inkscape:cy='15.94723' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1408' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='0' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='-81.9998px' originy='432.00012px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-323,-649.00012)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-323,-649.00012)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-323,-649.00012)'>
+
+ <path inkscape:connector-curvature='0' d='m 326.0002,657.00012 10,0 0,7.05898 c 0,0.4922 -0.47266,0.9375 -0.99609,0.9375 l -8.00391,0 c -0.53906,0 -1,-0.42964 -1,-1 z' id='path5354' sodipodi:nodetypes='ccccccc' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 329.6875,651.96875 a 1.0001,1.0001 0 0 0 -0.65625,0.375 l -2.8125,3.46875 A 1.0001,1.0001 0 0 0 326,656.4375 l 0,1 a 1.0001,1.0001 0 1 0 2,0 l 0,-0.65625 2.59375,-3.15625 a 1.0001,1.0001 0 0 0 -0.90625,-1.65625 z' id='path5356' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 331.90625,654.96875 a 1.0001221,1.0001221 0 1 0 -0.0312,2 l 2.15625,0.375 0,0.15625 a 1.0001,1.0001 0 1 0 2,0 l 0,-1 a 1.0001,1.0001 0 0 0 -0.8125,-1 l -3,-0.5 a 1.0001,1.0001 0 0 0 -0.3125,-0.0312 z' id='path5358' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-323,-649.00012)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-323,-649.00012)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-323,-649.00012)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-323,-649.00012)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-323,-649.00012)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-323,-649.00012)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/system-switch-user-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/system-switch-user-symbolic-ref.png
new file mode 100644
index 00000000..27f847b1
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/system-switch-user-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/system-switch-user-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/system-switch-user-symbolic.svg
new file mode 100644
index 00000000..a07f4abb
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/system-switch-user-symbolic.svg
@@ -0,0 +1,39 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='system-switch-user-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.92+devel unknown' viewBox='0 0 16 16' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='-21.858905' inkscape:cy='-6.42725' inkscape:document-rotation='0' inkscape:document-units='px' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:measure-end='0,0' inkscape:measure-start='-190.687,-191.14' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='true' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='3440' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='40.000003' originy='590' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-201.0002,-807)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-201.0002,-807)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-201.0002,-807)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-201.0002,-807)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-201.0002,-807)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-201.0002,-807)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-201.0002,-807)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-201.0002,-807)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-201.0002,-807)'>
+ <path inkscape:connector-curvature='0' d='m 203.71192,816.6875 c 0.49379,0.47964 1.07743,0.69712 1.78829,0.69712 0.71086,0 1.29723,-0.22349 1.79102,-0.70313 0.77657,0.27945 1.70523,0.99058 1.70626,2.23257 l 0.003,2.3167 C 209.0007,821.65691 208.688,822 208.3002,822 h -5.60003 c -0.3878,0 -0.7,-0.34309 -0.7,-0.76924 v -2.30769 c 0,-1.0667 0.77162,-1.96599 1.71173,-2.23557 z' id='path9137-6' sodipodi:nodetypes='csccsssscc' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+ <circle cx='-205.50018' cy='814.30768' id='path9139-7' r='2.307687' style='color:#bebebe;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.84614956;marker:none;enable-background:accumulate' transform='scale(-1,1)'/>
+ <path inkscape:connector-curvature='0' d='m 210.71194,812.6875 c 0.49379,0.47964 1.07743,0.69712 1.78829,0.69712 0.71086,0 1.29724,-0.22349 1.79102,-0.70313 0.77657,0.27945 1.70523,0.99058 1.70626,2.23257 l -6.99732,0.009 c 0,-1.0667 0.77162,-1.96599 1.71173,-2.23557 z' id='path9178-5' sodipodi:nodetypes='csccccc' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+ <circle cx='-212.5002' cy='810.30768' id='path9180-3' r='2.307687' style='color:#bebebe;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.84614956;marker:none;enable-background:accumulate' transform='scale(-1,1)'/>
+
+ <path inkscape:connector-curvature='0' d='m 215.15845,821.93937 h 0.83984 v -1 c 0.008,-1.67271 0,-5 0,-5 0,0 -3.98614,0 -6,0 v 0.8457 c -0.0954,0.61124 0.3814,1.16164 1,1.1543 h 1.58594 l -1.64298,1.64299 -0.64999,0.64998 c -0.65409,0.63582 -0.18523,1.74367 0.72657,1.71679 0.25979,-0.008 0.50637,-0.11632 0.6875,-0.30273 l 0.62788,-0.62789 1.66508,-1.66508 v 1.58594 c 0,0.68107 0.4492,1 1.16016,1 z' id='path12113-8-6' sodipodi:nodetypes='cccccccccccccccc' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/system-users-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/system-users-symbolic-ref.png
new file mode 100644
index 00000000..4fc42536
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/system-users-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/system-users-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/system-users-symbolic.svg
new file mode 100644
index 00000000..3fcb5e00
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/system-users-symbolic.svg
@@ -0,0 +1,34 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='system-users-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer11' inkscape:cx='211.96737' inkscape:cy='71.90811' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='702' inkscape:window-maximized='1' inkscape:window-width='1366' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='197.9998px' originy='432px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-43.000399,-649)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-43.000399,-649)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-43.000399,-649)'>
+ <path inkscape:connector-curvature='0' d='m 56.288664,658.6875 c -0.493789,0.47964 -1.077431,0.69712 -1.788291,0.69712 -0.71086,0 -1.297231,-0.22349 -1.79102,-0.70313 -0.77657,0.27945 -1.705229,0.99058 -1.706257,2.23257 l -0.0027,2.3167 C 50.999881,663.65691 51.312586,664 51.700387,664 l 5.600024,0 c 0.387802,0 0.700003,-0.34309 0.700003,-0.76924 l 0,-2.30769 c 0,-1.0667 -0.77162,-1.96599 -1.711724,-2.23557 z' id='path9137' sodipodi:nodetypes='csccsssscc' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+ <path sodipodi:cx='49.5' sodipodi:cy='342.5' d='m 52,342.5 a 2.5,2.5 0 1 1 -5,0 2.5,2.5 0 1 1 5,0 z' id='path9139' sodipodi:rx='2.5' sodipodi:ry='2.5' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' transform='matrix(0.92307481,0,0,0.92307481,8.808202,340.15457)' sodipodi:type='arc'/>
+ <path inkscape:connector-curvature='0' d='m 49.288642,654.6875 c -0.493789,0.47964 -1.077431,0.69712 -1.788291,0.69712 -0.71086,0 -1.297231,-0.22349 -1.79102,-0.70313 -0.77657,0.27945 -1.705229,0.99058 -1.706257,2.23257 l -0.0027,2.3167 C 43.999859,659.65691 44.312564,660 44.700365,660 l 5.735381,0 c 0.06219,-0.3952 0.261624,-0.72266 0.564646,-1 l 0,-2.07693 c 0,-1.0667 -0.77162,-1.96599 -1.711724,-2.23557 z' id='path9178' sodipodi:nodetypes='csccssccccc' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+ <path sodipodi:cx='49.5' sodipodi:cy='342.5' d='m 52,342.5 a 2.5,2.5 0 1 1 -5,0 2.5,2.5 0 1 1 5,0 z' id='path9180' sodipodi:rx='2.5' sodipodi:ry='2.5' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' transform='matrix(0.92307481,0,0,0.92307481,1.80818,336.15457)' sodipodi:type='arc'/>
+
+ </g>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-43.000399,-649)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-43.000399,-649)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-43.000399,-649)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-43.000399,-649)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-43.000399,-649)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-43.000399,-649)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/tab-new-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/tab-new-symbolic-ref.png
new file mode 100644
index 00000000..49a58704
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/tab-new-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/tab-new-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/tab-new-symbolic.svg
new file mode 100644
index 00000000..f76bced4
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/tab-new-symbolic.svg
@@ -0,0 +1,36 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='tab-new-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.92+devel unknown' viewBox='0 0 16.03126 16' width='16.03126' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='11.253278' inkscape:cy='9.60137' inkscape:document-rotation='0' inkscape:document-units='px' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:measure-end='0,0' inkscape:measure-start='-190.687,-191.14' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='3440' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='121.03126' originy='589' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-119.96894,-806)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-119.96894,-806)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-119.96894,-806)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-119.96894,-806)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-119.96894,-806)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-119.96894,-806)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-119.96894,-806)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-119.96894,-806)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-119.96894,-806)'>
+
+ <path d='M 124.96875 808 C 124.96875 808 124.26 807.98621 123.52148 808.35547 C 122.78297 808.72472 121.96875 809.66666 121.96875 811 L 121.96875 816.01172 L 121.9668 816.01172 L 119.96875 816.01172 L 119.96875 822 L 136 822 L 136 816.01172 L 134.00586 816.01172 L 134 816.01172 L 134 811 C 134 811 134.01379 810.29125 133.64453 809.55273 C 133.27527 808.81422 132.33333 808 131 808 L 124.96875 808 z M 124.96875 810 L 131 810 C 131.66667 810 131.72473 810.18578 131.85547 810.44727 C 131.98621 810.70875 132 811 132 811 L 132 817.98828 L 133.99414 818.01172 L 134 818.01172 L 134 820 L 121.96875 820 L 121.96875 818.01172 L 121.97266 818.01172 L 123.96875 818 L 123.96875 811 C 123.96875 810.33334 124.15453 810.27528 124.41602 810.14453 C 124.6775 810.01379 124.96875 810 124.96875 810 z ' id='path3239' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter-blend-mode:normal;filter-gaussianBlur-deviation:0;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new;opacity:1'/>
+ <path inkscape:connector-curvature='0' d='m 127.0002,811 v 2 h -2 v 2 h 2 v 2 h 2 v -2 h 2 v -2 h -2 v -2 z' id='rect12294-2-3' sodipodi:nodetypes='ccccccccccccc' style='display:inline;fill:#bebebe;fill-opacity:1;stroke:none'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/task-due-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/task-due-symbolic-ref.png
new file mode 100644
index 00000000..c9e1d5ae
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/task-due-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/task-due-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/task-due-symbolic.svg
new file mode 100644
index 00000000..fbaadb2d
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/task-due-symbolic.svg
@@ -0,0 +1,34 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='task-due-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.4 r9939' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='444.54227' inkscape:cy='-72.4264' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='702' inkscape:window-maximized='1' inkscape:window-width='1366' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='79.96895px' originy='180.00005px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ <inkscape:grid color='#000000' empcolor='#000000' empopacity='0' empspacing='4' enabled='true' id='grid5968' opacity='0.1254902' originx='79.96895px' originy='180.00005px' snapvisiblegridlinesonly='true' spacingx='0.5px' spacingy='0.5px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-161.03125,-397.00005)'>
+
+ <path inkscape:connector-curvature='0' d='m 162.0002,399.5 0,11.9688 c 0,1.5312 1.5,1.5312 1.5,1.5312 l 4.5,0 0,-2 -4,0 0,-11 1,0 0,-2 -1.5,0 c 0,0 -1.5,0 -1.5,1.5 z m 10,-1.49995 0,2 1.03125,0 0,4.03125 1.96875,-0.0313 0,-4.5 c 0,-1.50004 -1.5,-1.5 -1.5,-1.5 z m -6.9375,4.03125 0,6.96875 2.9375,-5e-5 0,-3.00191 c 0,0 0,-1.99809 2,-1.99809 l 2,0 0,-2 z' id='rect4897-9' sodipodi:nodetypes='ccccccccccccccccscccccccccc' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+ <rect height='3.9999499' id='rect4899-7' rx='0.49999836' ry='0.49994999' style='fill:#bebebe;fill-opacity:1;stroke:none' width='4.9689574' x='166.03125' y='397.00006'/>
+ <path class='warning' inkscape:connector-curvature='0' d='m 170.0002,405 c -1,0 -1,1 -1,1 l 0,6 c 0,0 0,1 1,1 l 6,0 c 1,0 1,-1 1,-1 l 0,-6 c 0,-1 -1,-1 -1,-1 z m 2,1 2.03125,5e-5 0,4 -2.03125,-5e-5 z m 0,5 2.03125,5e-5 -0.0312,0.99995 -2,0 z' id='path10898-3-1-1-6' sodipodi:nodetypes='ccccccccccccccccccc' style='color:#bebebe;fill:#f57900;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-161.03125,-397.00005)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-161.03125,-397.00005)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-161.03125,-397.00005)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-161.03125,-397.00005)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-161.03125,-397.00005)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-161.03125,-397.00005)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-161.03125,-397.00005)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-161.03125,-397.00005)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/task-past-due-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/task-past-due-symbolic-ref.png
new file mode 100644
index 00000000..c867bff8
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/task-past-due-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/task-past-due-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/task-past-due-symbolic.svg
new file mode 100644
index 00000000..5c654a37
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/task-past-due-symbolic.svg
@@ -0,0 +1,34 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='task-past-due-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.4 r9939' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='424.54227' inkscape:cy='-72.426389' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='702' inkscape:window-maximized='1' inkscape:window-width='1366' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='59.96895px' originy='180.00006px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ <inkscape:grid color='#000000' empcolor='#000000' empopacity='0' empspacing='4' enabled='true' id='grid5968' opacity='0.1254902' originx='59.96895px' originy='180.00006px' snapvisiblegridlinesonly='true' spacingx='0.5px' spacingy='0.5px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-181.03125,-397.00006)'>
+
+ <path inkscape:connector-curvature='0' d='m 183.5002,398 c 0,0 -1.5,0 -1.5,1.5 l 0,11.9688 c 0,0 0,1.5312 1.5,1.5312 l 7.5,0 0,-2 -7.00005,0 0,-11 1.00005,0 0,-2 z m 8.5,0 0,2 1,0 0,7 2,0 0,-7.5 c 0,-1.5 -1.5,-1.5 -1.5,-1.5 z' id='rect4897-9-4' sodipodi:nodetypes='csccccccccccccccscc' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+ <rect height='3.999939' id='rect4899-7-8' rx='0.49999836' ry='0.49993896' style='fill:#bebebe;fill-opacity:1;stroke:none' width='4.9689498' x='186.03125' y='397.00006'/>
+ <path inkscape:connector-curvature='0' d='m 192,408 1.375,0 1.125,1.09375 L 195.59375,408 197,408 l 0,1.46875 -1.09375,1.0625 L 197,411.59375 197,413 195.5625,413 194.5,411.9375 193.4375,413 192,413 l 0,-1.40625 1.0625,-1.0625 L 192,409.46875 192,408 z' id='path3761-2-3-5-4-8-9-8-9-9-0-6' sodipodi:nodetypes='ccccccccccccccccc' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-181.03125,-397.00006)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-181.03125,-397.00006)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-181.03125,-397.00006)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-181.03125,-397.00006)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-181.03125,-397.00006)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-181.03125,-397.00006)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-181.03125,-397.00006)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-181.03125,-397.00006)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/text-editor-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/text-editor-symbolic-ref.png
new file mode 100644
index 00000000..66958abc
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/text-editor-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/text-editor-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/text-editor-symbolic.svg
new file mode 100644
index 00000000..cf3416ed
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/text-editor-symbolic.svg
@@ -0,0 +1,37 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='text-editor-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.91 r13725' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer11' inkscape:cx='5.565235' inkscape:cy='-3.99409' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='false' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='4'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-42.02888' originy='412.02581' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-283.02908,-629.02581)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-283.02908,-629.02581)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-283.02908,-629.02581)'>
+ <path inkscape:connector-curvature='0' d='m 288.03089,639.02581 6.99819,-7 2,2 -7,7 -2,0 z' id='path2273-6-2' sodipodi:nodetypes='cccccc' style='fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none'/>
+
+ <path inkscape:connector-curvature='0' d='m 284.12283,629.02581 c -0.56869,5e-5 -1.0937,0.50285 -1.09375,1.0625 l 0,12.84375 0,0.25 0,0.78125 c 5e-5,0.55965 0.52506,1.06245 1.09375,1.0625 l 4.34375,0 1.125,0 5.34375,0 c 0.55754,-5e-5 1.07398,-0.48468 1.09375,-1.03125 3.9e-4,-0.0109 0,-0.0204 0,-0.0312 l 0,-6.93755 -2,2 0,4 -9,0 0,-12 5,0 2,2 1.53125,-1.53125 -2.1875,-2.125 c -0.20046,-0.20837 -0.48969,-0.3416 -0.78125,-0.34375 z' id='path6682-6' sodipodi:nodetypes='ccccccccccsccccccccccc' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:Sans;-inkscape-font-specification:Sans;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 297.21904,630.03711 c -0.13169,0 -0.26338,0.0504 -0.36429,0.15136 l -1.16217,1.16089 2.00493,2.00493 1.16217,-1.16217 c 0.20182,-0.20182 0.20182,-0.52678 0,-0.7286 l -1.27634,-1.27505 c -0.10087,-0.10088 -0.2326,-0.15136 -0.3643,-0.15136 z' id='rect9831-8' style='color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-283.02908,-629.02581)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-283.02908,-629.02581)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-283.02908,-629.02581)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-283.02908,-629.02581)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-283.02908,-629.02581)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-283.02908,-629.02581)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/text-x-generic-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/text-x-generic-symbolic-ref.png
new file mode 100644
index 00000000..191b4db3
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/text-x-generic-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/text-x-generic-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/text-x-generic-symbolic.svg
new file mode 100644
index 00000000..c7d3f8ac
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/text-x-generic-symbolic.svg
@@ -0,0 +1,30 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:svg='http://www.w3.org/2000/svg' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' sodipodi:docname='text-x-generic-symbolic.svg' version='1.1' inkscape:version='0.48.1 r9760' height='16' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:cy='-8.990098' pagecolor='#555753' borderopacity='1' showborder='false' inkscape:bbox-paths='false' guidetolerance='10' inkscape:object-paths='true' inkscape:window-width='1198' showguides='true' inkscape:object-nodes='true' inkscape:snap-bbox='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:snap-nodes='true' bordercolor='#666666' objecttolerance='10' id='namedview88' showgrid='true' inkscape:window-maximized='0' inkscape:window-x='1796' inkscape:snap-global='true' inkscape:window-y='96' gridtolerance='10' inkscape:window-height='1020' inkscape:snap-to-guides='true' inkscape:current-layer='layer14' inkscape:snap-bbox-midpoints='false' inkscape:zoom='1' inkscape:cx='5.75648' inkscape:snap-grids='true' inkscape:pageopacity='1'>
+ <inkscape:grid spacingx='1px' spacingy='1px' id='grid4866' empspacing='2' enabled='true' type='xygrid' snapvisiblegridlinesonly='true' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:label='status' transform='translate(-462,-300)' inkscape:groupmode='layer' id='layer9' style='display:inline'/>
+ <g inkscape:label='devices' transform='translate(-462,-300)' inkscape:groupmode='layer' id='layer10'/>
+ <g inkscape:label='apps' transform='translate(-462,-300)' inkscape:groupmode='layer' id='layer11'/>
+ <g inkscape:label='actions' transform='translate(-462,-300)' inkscape:groupmode='layer' id='layer12'/>
+ <g inkscape:label='places' transform='translate(-462,-300)' inkscape:groupmode='layer' id='layer13'/>
+ <g inkscape:label='mimetypes' transform='translate(-462,-300)' inkscape:groupmode='layer' id='layer14'>
+
+ <path inkscape:connector-curvature='0' d='m 464.8127,301 a 1.0000999,1.0000999 0 0 0 -0.8125,1 l 0,13 a 1.0000999,1.0000999 0 0 0 1,1 l 10,0 a 1.0000999,1.0000999 0 0 0 1,-1 l 0,-9.4375 a 1.0000999,1.0000999 0 0 0 -0.28125,-0.71875 l -3.5625,-3.5625 A 1.0000999,1.0000999 0 0 0 471.4377,301 l -6.4375,0 a 1.0000999,1.0000999 0 0 0 -0.0937,0 1.0000999,1.0000999 0 0 0 -0.0937,0 z m 1.1875,2 5,0 0,3 3,0 0,8 -8,0 0,-11 z' id='path1234' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.99999988;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+ <g inkscape:label='emblems' transform='translate(-462,-300)' inkscape:groupmode='layer' id='layer15' style='display:inline'/>
+ <g inkscape:label='categories' transform='translate(-462,-300)' inkscape:groupmode='layer' id='g4953' style='display:inline'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/thunderbolt-acquiring-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/thunderbolt-acquiring-symbolic-ref.png
new file mode 100644
index 00000000..9e2da634
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/thunderbolt-acquiring-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/thunderbolt-acquiring-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/thunderbolt-acquiring-symbolic.svg
new file mode 100644
index 00000000..2b9e9d4f
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/thunderbolt-acquiring-symbolic.svg
@@ -0,0 +1,38 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='thunderbolt-acquiring-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.92.2 (5c3e80d, 2017-08-06)' viewBox='0 0 16 16' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='-271.99999' inkscape:cy='0' inkscape:document-rotation='0' inkscape:document-units='px' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:measure-end='0,0' inkscape:measure-start='-190.687,-191.14' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1016' inkscape:window-maximized='1' inkscape:window-width='1920' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-20' originy='20' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-261.0002,-237)'>
+
+ <circle cx='265.50021' cy='245.5' id='circle4813' r='1.5' style='display:inline;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.5'/>
+ <circle cx='269.50021' cy='245.5' id='circle4815' r='1.5' style='display:inline;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.5'/>
+ <circle cx='273.50021' cy='245.5' id='circle4817' r='1.5' style='display:inline;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.5'/>
+ <path inkscape:connector-curvature='0' d='m 270.0002,237.99219 c -1.01299,0 -2.00781,0.83734 -2.00781,2.00781 v 3 h 1 v -3 c 0,-0.55469 0.59972,-1.00781 1.00781,-1.00781 0.40309,0 1.00781,0.46762 1.00781,1.00781 v 3 h 1 v -3 c 0,-1.16367 -0.98982,-2.00781 -2.00781,-2.00781 z m 5.50391,1.92677 c 0,0 -0.3572,-0.0148 -0.73047,0.16797 -0.37327,0.18274 -0.78125,0.65833 -0.78125,1.33203 V 243 h 1 v -1.58104 c 0,-0.34718 0.094,-0.37155 0.2207,-0.43359 0.12673,-0.062 0.26953,-0.0664 0.26953,-0.0664 z m -11.51172,1.64159 V 243 h 1 v -1.43945 z m 0,6.43945 v 2.46049 c 0,1.50573 1.27277,2.54909 2.51953,2.5 0.59161,-0.0233 1.19162,-0.2579 1.66601,-0.68164 0.4744,-0.42374 0.81446,-1.06045 0.81446,-1.81836 V 248 h -1 v 2.46049 c 0,0.46906 -0.18906,0.81393 -0.48047,1.07422 -0.29141,0.26029 -0.69391,0.41218 -1.03906,0.42578 -0.63741,0.0251 -1.48047,-0.57443 -1.48047,-1.5 V 248 Z m 7.01562,0 v 2 c 0,0.63648 0.26648,1.16874 0.6543,1.50391 0.38782,0.33516 0.87254,0.48828 1.33789,0.48828 0.98563,0 1.99219,-0.80165 1.99219,-1.99219 v -2 h -1 v 2 c 0,0.60442 -0.57048,0.99219 -0.99219,0.99219 -0.23832,0 -0.50097,-0.0863 -0.68359,-0.24414 -0.18262,-0.15783 -0.3086,-0.37109 -0.3086,-0.74805 v -2 z m -8.00781,-11 v 2 h -1 v 1 c 0,1.108 0.892,2 2,2 h 1 c 1.108,0 2,-0.892 2,-2 v -1 h -1 v -2 h -1 v 2 h -1 v -2 z' id='path4840' sodipodi:nodetypes='ssccsssccssccsccscccccccccsccsccsscscccscssccsscscccccsssscccccccc' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.5;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-261.0002,-237)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-261.0002,-237)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-261.0002,-237)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-261.0002,-237)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-261.0002,-237)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-261.0002,-237)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-261.0002,-237)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-261.0002,-237)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/thunderbolt-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/thunderbolt-symbolic-ref.png
new file mode 100644
index 00000000..33eae5b6
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/thunderbolt-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/thunderbolt-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/thunderbolt-symbolic.svg
new file mode 100644
index 00000000..dc2130ca
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/thunderbolt-symbolic.svg
@@ -0,0 +1,35 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='thunderbolt-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.92.2 (5c3e80d, 2017-08-06)' viewBox='0 0 16 16' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer10' inkscape:cx='-332' inkscape:cy='310' inkscape:document-rotation='0' inkscape:document-units='px' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:measure-end='0,0' inkscape:measure-start='-190.687,-191.14' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1016' inkscape:window-maximized='1' inkscape:window-width='1920' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-80.000014' originy='330' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-321.00021,-547)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-321.00021,-547)'>
+
+ <path inkscape:connector-curvature='0' d='m 328.85241,553 h 3.69316 l -4.33808,6.24149 1.67168,0.17395 -4.18435,3.57771 v 0 l 1.96393,-1.03623 c 0.31822,0.0382 1.01074,0.0637 1.33697,0.0637 v 0 c 3.86854,0 7.00448,-3.13594 7.00448,-7.00542 v 0 c -0.0155,-2.46839 -1.28088,-5.00751 -4.00337,-6.32939 v 0 l 0.16016,-1.67681 z m -6.85221,2.01513 c 0,2.62727 1.44116,4.91936 3.58097,6.11349 v 0 l 0.31868,-3.7191 1.01121,1.20544 1.80267,-3.61496 -3.71353,-5e-5 3.16015,-6.93418 c -3.47018,0.41296 -6.16015,3.3674 -6.16015,6.94931' id='path164' sodipodi:nodetypes='cccccccccccccccccccccccc' style='fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:0.47142798'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-321.00021,-547)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-321.00021,-547)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-321.00021,-547)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-321.00021,-547)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-321.00021,-547)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-321.00021,-547)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-321.00021,-547)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/tools-check-spelling-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/tools-check-spelling-symbolic-ref.png
new file mode 100644
index 00000000..1529b989
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/tools-check-spelling-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/tools-check-spelling-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/tools-check-spelling-symbolic.svg
new file mode 100644
index 00000000..1e722b59
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/tools-check-spelling-symbolic.svg
@@ -0,0 +1,33 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='tools-check-spelling-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.5 r10040' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='0.92910964' inkscape:cy='16.83964' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1402' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='2560' inkscape:window-y='0' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-19.999998px' originy='610px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-261.0002,-827)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-261.0002,-827)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-261.0002,-827)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-261.0002,-827)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-261.0002,-827)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-261.0002,-827)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-261.0002,-827)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-261.0002,-827)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-261.0002,-827)'>
+
+ <path inkscape:connector-curvature='0' d='m 264,830 0,2 1.90625,0 c -0.0552,0 0.0937,0.17104 0.0937,0.0937 l 0,0.9375 -1,0 c -1.71588,0 -3.03787,1.10986 -3.0625,2.46875 -0.0123,0.67944 0.3195,1.35323 0.875,1.8125 0.5555,0.45927 1.30959,0.71875 2.1875,0.71875 l 2,0 1,0 0,-1 0,-4.9375 C 268,830.92256 267.10309,830 265.90625,830 L 264,830 z m 1,5.03125 1,0 0,1 -1,0 c -0.51941,0 -0.78011,-0.14571 -0.90625,-0.25 -0.12614,-0.10429 -0.15755,-0.17804 -0.15625,-0.25 0.003,-0.14393 0.0927,-0.5 1.0625,-0.5 z' id='path28099' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 269,829 0,8.03125 0,1 1,0 2,0 c 0.93855,0 1.78249,-0.3823 2.3125,-0.96875 0.53001,-0.58645 0.75988,-1.33268 0.75,-2.0625 -0.01,-0.72982 -0.28566,-1.45407 -0.8125,-2.03125 C 273.72316,832.39157 272.92105,832 272,832 l -1,0 0,-3 -2,0 z m 2,5 1,0 c 0.42179,0 0.61965,0.13545 0.78125,0.3125 0.1616,0.17705 0.27751,0.44294 0.28125,0.71875 0.004,0.27581 -0.0984,0.51973 -0.25,0.6875 -0.15163,0.16777 -0.35374,0.3125 -0.8125,0.3125 l -1,0 L 271,834 z' id='path28101' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 264,838.28125 -0.34375,0.375 -2,2 a 0.50005,0.50005 0 1 0 0.6875,0.6875 L 264,839.6875 l 1.65625,1.65625 0.34375,0.375 0.34375,-0.375 1.65625,-1.65625 1.65625,1.65625 0.34375,0.375 0.34375,-0.375 1.65625,-1.65625 1.65625,1.65625 0.34375,0.375 0.34375,-0.375 2,-2 a 0.50005,0.50005 0 1 0 -0.6875,-0.6875 L 274,840.3125 l -1.65625,-1.65625 -0.34375,-0.375 -0.34375,0.375 -1.65625,1.65625 -1.65625,-1.65625 -0.34375,-0.375 -0.34375,0.375 L 266,840.3125 264.34375,838.65625 264,838.28125 z' id='path28103' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/touchpad-disabled-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/touchpad-disabled-symbolic-ref.png
new file mode 100644
index 00000000..06edfc9f
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/touchpad-disabled-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/touchpad-disabled-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/touchpad-disabled-symbolic.svg
new file mode 100644
index 00000000..082f1a14
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/touchpad-disabled-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='touchpad-disabled-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.4 r9939' version='1.1' width='16.0002' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='235.28533' inkscape:cy='-257.42182' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='2560' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='120.0002px' originy='100px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-121,-317)'>
+
+ <path inkscape:connector-curvature='0' d='m 124.03145,317 c -1.66919,0 -3.03125,1.36206 -3.03125,3.03125 l 0,7.9375 c 0,1.66919 1.36206,3.03125 3.03125,3.03125 l 6.96875,0 0,-2 -2,0 0,-2 7,0 0,-6.96875 c 0,-1.66919 -1.36206,-3.03125 -3.03125,-3.03125 z m 0,2 8.9375,0 c 0.59578,0 1.03125,0.43547 1.03125,1.03125 l 0,5.96875 -11,0 0,-5.96875 c 0,-0.59578 0.43547,-1.03125 1.03125,-1.03125 z m -1.03125,8 5,0 0,2 -3.96875,0 c -0.59578,0 -1.03125,-0.43547 -1.03125,-1.03125 z' id='rect5837-1' sodipodi:nodetypes='sssscccccssssssccsscccssc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.5;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 132.0002,328 1.375,0 1.125,1.09375 1.09375,-1.09375 1.40625,0 0,1.46875 -1.09375,1.0625 1.09375,1.0625 0,1.40625 -1.4375,0 -1.0625,-1.0625 -1.0625,1.0625 -1.4375,0 0,-1.40625 1.0625,-1.0625 -1.0625,-1.0625 0,-1.46875 z' id='path3761-2-3-5-4-8-9-8-0-9-3' sodipodi:nodetypes='ccccccccccccccccc' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-121,-317)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-121,-317)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-121,-317)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-121,-317)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-121,-317)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-121,-317)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-121,-317)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-121,-317)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/tv-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/tv-symbolic-ref.png
new file mode 100644
index 00000000..d915bc6b
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/tv-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/tv-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/tv-symbolic.svg
new file mode 100644
index 00000000..b0715604
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/tv-symbolic.svg
@@ -0,0 +1,34 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='tv-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.5 r10040' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer10' inkscape:cx='11.559236' inkscape:cy='0.90569' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1375' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='11.313708'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='0px' originy='330px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-241.0002,-547)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-241.0002,-547)'>
+
+ <path inkscape:connector-curvature='0' d='m 244.6252,550.00758 c -1.45425,0 -2.625,1.03817 -2.625,2.49242 l 0,7.875 c 0,1.45425 1.17075,2.625 2.625,2.625 l 8.75,0 c 1.45425,0 2.625,-1.17075 2.625,-2.625 l 0,-7.875 c 0,-1.45425 -1.17075,-2.49242 -2.625,-2.49242 z m 0.875,0.99242 7,0 c 2.00417,0.53702 1.9805,6.85657 0,8 l -7,0 c -2.31899,-1.57669 -1.58576,-7.08446 0,-8 z m 7.52285,11.04907 -1.0457,0 0,-1.04571 1.0457,0 z' id='path27207' sodipodi:nodetypes='ssssssssscccccccccc' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+ <path sodipodi:cx='5' sodipodi:cy='331' d='m 6,331 a 1,1 0 1 1 -2,0 1,1 0 1 1 2,0 z' id='path27232' sodipodi:rx='1' sodipodi:ry='1' style='color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' transform='translate(241.0002,217)' sodipodi:type='arc'/>
+ <path sodipodi:cx='5' sodipodi:cy='331' d='m 6,331 a 1,1 0 1 1 -2,0 1,1 0 1 1 2,0 z' id='path27234' sodipodi:rx='1' sodipodi:ry='1' style='color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' transform='translate(246.98851,217)' sodipodi:type='arc'/>
+ <path inkscape:connector-curvature='0' d='m 246.34375,547.65625 -0.6875,0.6875 2.46875,2.5 0.125,0.15625 0.21875,0 1.09375,0 0.21875,-0.0312 0.125,-0.125 2.4375,-2.5 -0.6875,-0.6875 -2.34375,2.34375 -0.65625,0 -2.3125,-2.34375 z' id='path27236' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-241.0002,-547)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-241.0002,-547)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-241.0002,-547)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-241.0002,-547)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-241.0002,-547)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-241.0002,-547)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-241.0002,-547)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/uninterruptible-power-supply-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/uninterruptible-power-supply-symbolic-ref.png
new file mode 100644
index 00000000..6903a7bd
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/uninterruptible-power-supply-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/uninterruptible-power-supply-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/uninterruptible-power-supply-symbolic.svg
new file mode 100644
index 00000000..6fe76f7f
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/uninterruptible-power-supply-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='uninterruptible-power-supply-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.5 r10040' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer10' inkscape:cx='11.246476' inkscape:cy='4.03393' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1375' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='0.0002px' originy='350px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-241,-567)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-241,-567)'>
+
+ <path inkscape:connector-curvature='0' d='M 245.1875,567 C 243.9859,567 243,567.98758 243,569.1875 l 0,11.625 c 0,1.19992 0.9859,2.1875 2.1875,2.1875 l 7.625,0 c 1.2016,0 2.1875,-0.98758 2.1875,-2.1875 l 0,-11.625 C 255,567.98758 254.0141,567 252.8125,567 l -7.625,0 z m 0,2 7.625,0 c 0.1238,0 0.1875,0.0566 0.1875,0.1875 l 0,11.625 c 0,0.1309 -0.0637,0.1875 -0.1875,0.1875 l -7.625,0 C 245.0637,581 245,580.9434 245,580.8125 l 0,-11.625 C 245,569.0566 245.0637,569 245.1875,569 z' id='rect27244' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.99999988;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 249.7795,572 c -0.17789,0.0489 -0.3419,0.14729 -0.46875,0.28125 l -3.03125,3 c -0.2353,0.23073 -0.34458,0.58284 -0.28125,0.90625 l 0,0.8125 0.8125,0 0.1875,0 1.4707,0 -1.1875,1.27358 c -0.21461,0.21931 -0.32135,0.53954 -0.28125,0.84375 -0.001,0.0312 -0.001,0.0625 0,0.0937 l 0,0.78125 0.84375,0 0.15625,0 c 0.26386,0.004 0.52791,-0.099 0.71875,-0.28125 l 3,-2.99233 c 0.18369,-0.18977 0.28735,-0.45465 0.28125,-0.7187 0.003,-0.0416 0.003,-0.0834 0,-0.125 l 0,-0.875 -0.84375,0 -0.15625,0 -1.56445,0 1.3125,-1.28125 c 0.21461,-0.21931 0.32135,-0.53954 0.28125,-0.84375 10e-4,-0.0312 10e-4,-0.0625 0,-0.0937 l 0,-0.7813 -0.84375,0 -0.0937,0 c -0.0208,-6.3e-4 -0.0417,-6.3e-4 -0.0625,0 -0.0829,-0.0103 -0.16709,-0.0103 -0.25,0 z' id='path10747-1' sodipodi:nodetypes='ccccccccccccccccccccccccccccccc' style='font-size:xx-small;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-241,-567)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-241,-567)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-241,-567)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-241,-567)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-241,-567)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-241,-567)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-241,-567)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/user-available-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/user-available-symbolic-ref.png
new file mode 100644
index 00000000..ba8c1838
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/user-available-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/user-available-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/user-available-symbolic.svg
new file mode 100644
index 00000000..73ace73a
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/user-available-symbolic.svg
@@ -0,0 +1,153 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ sodipodi:docname="user-available-symbolic.svg"
+ height="16"
+ id="svg7384"
+ inkscape:version="0.91 r13725"
+ version="1.1"
+ width="16">
+ <metadata
+ id="metadata90">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview
+ inkscape:bbox-nodes="false"
+ inkscape:bbox-paths="true"
+ bordercolor="#666666"
+ borderopacity="1"
+ inkscape:current-layer="layer9"
+ inkscape:cx="-69.21619"
+ inkscape:cy="-281.9103"
+ gridtolerance="10"
+ inkscape:guide-bbox="true"
+ guidetolerance="10"
+ id="namedview88"
+ inkscape:object-nodes="false"
+ inkscape:object-paths="false"
+ objecttolerance="10"
+ pagecolor="#3a3b39"
+ inkscape:pageopacity="1"
+ inkscape:pageshadow="2"
+ showborder="false"
+ showgrid="false"
+ showguides="true"
+ inkscape:snap-bbox="true"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-global="true"
+ inkscape:snap-grids="true"
+ inkscape:snap-nodes="true"
+ inkscape:snap-others="false"
+ inkscape:snap-to-guides="true"
+ inkscape:window-height="1376"
+ inkscape:window-maximized="1"
+ inkscape:window-width="2560"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:zoom="1">
+ <inkscape:grid
+ empspacing="2"
+ enabled="true"
+ id="grid4866"
+ originx="160px"
+ originy="140px"
+ snapvisiblegridlinesonly="true"
+ spacingx="1px"
+ spacingy="1px"
+ type="xygrid"
+ visible="true" />
+ <inkscape:grid
+ color="#000000"
+ empcolor="#000000"
+ empopacity="0"
+ empspacing="4"
+ enabled="true"
+ id="grid5968"
+ opacity="0.1254902"
+ originx="160px"
+ originy="140px"
+ snapvisiblegridlinesonly="true"
+ spacingx="0.5px"
+ spacingy="0.5px"
+ type="xygrid"
+ visible="true" />
+ </sodipodi:namedview>
+ <title
+ id="title9167">Gnome Symbolic Icon Theme</title>
+ <defs
+ id="defs7386" />
+ <g
+ inkscape:groupmode="layer"
+ id="layer9"
+ inkscape:label="status"
+ style="display:inline"
+ transform="translate(-81.0002,-357)">
+ <path
+ inkscape:connector-curvature="0"
+ d="m 84.5002,358 c -1.385,0 -2.5,1.115 -2.5,2.5 l 0,5 c 0,1.385 1.115,2.5 2.5,2.5 l 6.375,0 3.125,4 0,-4.0625 c 1.14126,-0.23235 2,-1.22563 2,-2.4375 l 0,-5 c 0,-1.385 -1.115,-2.5 -2.5,-2.5 l -9,0 z"
+ id="path8288"
+ style="opacity:1;fill:#bebebe;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer10"
+ inkscape:label="devices"
+ style="display:inline"
+ transform="translate(-81.0002,-357)" />
+ <g
+ inkscape:groupmode="layer"
+ id="layer11"
+ inkscape:label="apps"
+ transform="translate(-81.0002,-357)" />
+ <g
+ inkscape:groupmode="layer"
+ id="layer13"
+ inkscape:label="places"
+ style="display:inline"
+ transform="translate(-81.0002,-357)" />
+ <g
+ inkscape:groupmode="layer"
+ id="layer14"
+ inkscape:label="mimetypes"
+ transform="translate(-81.0002,-357)" />
+ <g
+ inkscape:groupmode="layer"
+ id="layer15"
+ inkscape:label="emblems"
+ style="display:inline"
+ transform="translate(-81.0002,-357)" />
+ <g
+ inkscape:groupmode="layer"
+ id="g71291"
+ inkscape:label="emotes"
+ style="display:inline"
+ transform="translate(-81.0002,-357)" />
+ <g
+ inkscape:groupmode="layer"
+ id="g4953"
+ inkscape:label="categories"
+ style="display:inline"
+ transform="translate(-81.0002,-357)" />
+ <g
+ inkscape:groupmode="layer"
+ id="layer12"
+ inkscape:label="actions"
+ style="display:inline"
+ transform="translate(-81.0002,-357)" />
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/user-away-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/user-away-symbolic-ref.png
new file mode 100644
index 00000000..3992111d
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/user-away-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/user-away-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/user-away-symbolic.svg
new file mode 100644
index 00000000..2b0da947
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/user-away-symbolic.svg
@@ -0,0 +1,33 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='user-away-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.4 r9939' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='131.28381' inkscape:cy='-281.9103' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='702' inkscape:window-maximized='1' inkscape:window-width='1366' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='100px' originy='140px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ <inkscape:grid color='#000000' empcolor='#000000' empopacity='0' empspacing='4' enabled='true' id='grid5968' opacity='0.1254902' originx='100px' originy='140px' snapvisiblegridlinesonly='true' spacingx='0.5px' spacingy='0.5px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-141.0002,-357)'>
+ <path inkscape:connector-curvature='0' d='m 154.0002,372 0,-4.5 -3.5,0 z' id='path8342' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+
+ <path inkscape:connector-curvature='0' d='m 144.5002,358 c -1.385,0 -2.5,1.115 -2.5,2.5 l 0,5 c 0,1.385 1.115,2.5 2.5,2.5 l 9,0 c 1.385,0 2.5,-1.115 2.5,-2.5 l 0,-5 c 0,-1.385 -1.115,-2.5 -2.5,-2.5 l -9,0 z m 4.5,2 1,0 c 0.27614,0 0.53779,0.10029 0.71875,0.28125 l 2,2 0.6875,0.71875 -0.6875,0.71875 -2,2 C 150.53799,365.89971 150.27634,366 150.0002,366 l -1,0 0,-1 c 0,-0.27614 0.10029,-0.53779 0.28125,-0.71875 L 149.5627,364 l -4.5625,0 0,-2 4.5625,0 -0.28125,-0.28125 C 149.10049,361.53779 149.0002,361.27614 149.0002,361 l 0,-1 z' id='rect8347' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-141.0002,-357)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-141.0002,-357)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-141.0002,-357)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-141.0002,-357)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-141.0002,-357)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-141.0002,-357)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-141.0002,-357)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-141.0002,-357)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/user-bookmarks-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/user-bookmarks-symbolic-ref.png
new file mode 100644
index 00000000..f9a5e191
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/user-bookmarks-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/user-bookmarks-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/user-bookmarks-symbolic.svg
new file mode 100644
index 00000000..afb7c6e2
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/user-bookmarks-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:svg='http://www.w3.org/2000/svg' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' version='1.1' inkscape:version='0.47 r22583' height='16' sodipodi:docname='user-bookmarks-symbolic.svg' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:cy='13.746071' inkscape:current-layer='layer13' inkscape:window-width='1310' pagecolor='#555753' showborder='false' showguides='true' inkscape:snap-nodes='false' objecttolerance='10' showgrid='false' inkscape:object-nodes='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:window-x='52' inkscape:snap-bbox='true' bordercolor='#666666' id='namedview88' inkscape:window-maximized='0' inkscape:snap-global='true' inkscape:window-y='24' gridtolerance='10' inkscape:zoom='1' inkscape:window-height='690' borderopacity='1' guidetolerance='10' inkscape:cx='34.716148' inkscape:bbox-paths='false' inkscape:snap-grids='true' inkscape:pageopacity='1' inkscape:snap-to-guides='true'>
+ <inkscape:grid visible='true' spacingx='1px' type='xygrid' spacingy='1px' id='grid4866' empspacing='2' enabled='true' snapvisiblegridlinesonly='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g transform='translate(-522,-176)' inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline'/>
+ <g transform='translate(-522,-176)' inkscape:groupmode='layer' id='layer10' inkscape:label='devices'/>
+ <g transform='translate(-522,-176)' inkscape:groupmode='layer' id='layer11' inkscape:label='apps'/>
+ <g transform='translate(-522,-176)' inkscape:groupmode='layer' id='layer12' inkscape:label='actions'/>
+ <g transform='translate(-522,-176)' inkscape:groupmode='layer' id='layer13' inkscape:label='places'>
+ <g transform='translate(294.0002,-820)' id='g11910' inkscape:label='folder-remote'>
+
+ </g>
+ <path sodipodi:r2='3.8276224' sodipodi:cy='180.96373' inkscape:randomized='0' transform='matrix(1.0472113,-0.00871584,0.00871584,1.0472113,-23.35454,-0.84575)' inkscape:flatsided='false' inkscape:rounded='0.2104596' sodipodi:type='star' d='m 530.9488,186.70897 c -0.77941,0.55189 -3.15759,-1.90601 -4.11253,-1.9179 -0.95532,-0.0119 -3.39494,2.38585 -4.16096,1.8149 -0.76573,-0.57072 0.83698,-3.59203 0.55319,-4.50391 -0.2839,-0.91223 -3.31818,-2.49151 -3.01189,-3.39647 0.30617,-0.90461 3.67487,-0.31399 4.45442,-0.86567 0.77986,-0.5519 1.3442,-3.92569 2.29952,-3.91404 0.95494,0.0116 1.43421,3.39798 2.19979,3.9689 0.76588,0.57114 4.14893,0.0653 4.43307,0.97746 0.28402,0.9118 -2.78848,2.41405 -3.09488,3.31858 -0.30652,0.90489 1.21999,3.96605 0.44027,4.51815 z' inkscape:transform-center-x='-0.0094346789' id='path11922' inkscape:transform-center-y='-0.69491065' sodipodi:r1='7.0383992' sodipodi:arg1='0.95492637' sodipodi:cx='526.88293' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' sodipodi:arg2='1.5829876' sodipodi:sides='5'/>
+ </g>
+ <g transform='translate(-522,-176)' inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes'/>
+ <g transform='translate(-522,-176)' inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline'/>
+ <g transform='translate(-522,-176)' inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/user-busy-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/user-busy-symbolic-ref.png
new file mode 100644
index 00000000..810fc4cf
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/user-busy-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/user-busy-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/user-busy-symbolic.svg
new file mode 100644
index 00000000..2e3800e3
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/user-busy-symbolic.svg
@@ -0,0 +1,33 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='user-busy-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.4 r9939' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='151.28381' inkscape:cy='-281.9103' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='702' inkscape:window-maximized='1' inkscape:window-width='1366' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='120px' originy='140px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ <inkscape:grid color='#000000' empcolor='#000000' empopacity='0' empspacing='4' enabled='true' id='grid5968' opacity='0.1254902' originx='120px' originy='140px' snapvisiblegridlinesonly='true' spacingx='0.5px' spacingy='0.5px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-121.0002,-357)'>
+ <path inkscape:connector-curvature='0' d='m 134.0002,372 0,-4.5 -3.5,0 z' id='path8331' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+
+ <path inkscape:connector-curvature='0' d='m 124.5002,358 c -1.385,0 -2.5,1.115 -2.5,2.5 l 0,5 c 0,1.385 1.115,2.5 2.5,2.5 l 9,0 c 1.385,0 2.5,-1.115 2.5,-2.5 l 0,-5 c 0,-1.385 -1.115,-2.5 -2.5,-2.5 l -9,0 z m 1.5,4 6,0 0,2 -6,0 0,-2 z' id='rect8335' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-121.0002,-357)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-121.0002,-357)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-121.0002,-357)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-121.0002,-357)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-121.0002,-357)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-121.0002,-357)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-121.0002,-357)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-121.0002,-357)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/user-desktop-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/user-desktop-symbolic-ref.png
new file mode 100644
index 00000000..b92bd7d1
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/user-desktop-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/user-desktop-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/user-desktop-symbolic.svg
new file mode 100644
index 00000000..e03959ad
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/user-desktop-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='user-desktop-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.4 r9939' version='1.1' width='16.000002' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer13' inkscape:cx='560.6001' inkscape:cy='193.11648' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='702' inkscape:window-maximized='1' inkscape:window-width='1366' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='620px' originy='298px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ <inkscape:grid color='#000000' empcolor='#000000' empopacity='0' empspacing='4' enabled='true' id='grid5968' opacity='0.1254902' originx='620px' originy='298px' snapvisiblegridlinesonly='true' spacingx='0.5px' spacingy='0.5px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(378.9998,-515)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(378.9998,-515)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(378.9998,-515)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(378.9998,-515)'>
+ <path inkscape:connector-curvature='0' d='m -378.46855,516 c -0.28913,0 -0.53125,0.24212 -0.53125,0.53125 l 0,13.93755 c 0,0.2985 0.23264,0.5312 0.53125,0.5312 l 14.9375,0 c 0.2986,0 0.53125,-0.2326 0.53125,-0.5312 l 0,-8.9376 c 0,-0.2891 -0.24212,-0.5312 -0.53125,-0.5312 l -12.46875,0 0,7.5 c 0,0.277 -0.223,0.5 -0.5,0.5 -0.277,0 -0.5,-0.223 -0.5,-0.5 l 0,-8 c 0,-0.277 0.223,-0.5 0.5,-0.5 l 2.96875,0 8.53125,0 0,-1.4062 c 0,-0.3272 -0.26666,-0.5938 -0.59375,-0.5938 l -7.40625,0 0,-1.46875 c 0,-0.28915 -0.24212,-0.53125 -0.53125,-0.53125 z' id='path5441' sodipodi:nodetypes='ccccccccccsccccccccccc' style='fill:#bebebe;fill-opacity:1;stroke:none;display:inline'/>
+
+ </g>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(378.9998,-515)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(378.9998,-515)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(378.9998,-515)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(378.9998,-515)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(378.9998,-515)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/user-home-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/user-home-symbolic-ref.png
new file mode 100644
index 00000000..8a96e7b5
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/user-home-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/user-home-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/user-home-symbolic.svg
new file mode 100644
index 00000000..3d01e859
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/user-home-symbolic.svg
@@ -0,0 +1,44 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='user-home-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='15.999979' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16.012655' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer13' inkscape:cx='-65.035072' inkscape:cy='-11.885145' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='702' inkscape:window-maximized='1' inkscape:window-width='1366' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='-321.99347px' originy='-41.999997px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-562.99367,-175.00002)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-562.99367,-175.00002)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-562.99367,-175.00002)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-562.99367,-175.00002)'>
+ <g id='g5388' transform='matrix(1,0,0,0.99999871,405.62018,-584.9021)'>
+ <title id='title5390'>go-home</title>
+ <g id='g5392' style='fill:#bebebe;fill-opacity:1' transform='matrix(0.02603569,0,0,0.02603569,345.96663,902.07624)'>
+ <g id='g5394' style='fill:#bebebe;fill-opacity:1'/>
+ <g id='g5396' style='fill:#bebebe;fill-opacity:1'/>
+ </g>
+ <g id='g5398' inkscape:label='go-down' transform='matrix(0,1,1,0,-360.61998,639.9031)'>
+
+ </g>
+ </g>
+ <path inkscape:connector-curvature='0' d='M 565.78125,180 A 1.0001,1.0001 0 0 0 565,181 l 0,7 a 1.0001,1.0001 0 0 0 1,1 l 10,0 a 1.0001,1.0001 0 0 0 1,-1 l 0,-7 a 1.0001,1.0001 0 1 0 -2,0 l 0,6 -8,0 0,-6 a 1.0001,1.0001 0 0 0 -1.21875,-1 z' id='path5414' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 570.90625,176 a 1.0001,1.0001 0 0 0 -0.5,0.1875 l -7,5 a 1.0063276,1.0063276 0 1 0 1.1875,1.625 L 571,178.25 l 6.40625,4.5625 a 1.0063276,1.0063276 0 1 0 1.1875,-1.625 l -7,-5 A 1.0001,1.0001 0 0 0 570.90625,176 z' id='path6184' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <rect height='6' id='rect6261' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' width='3' x='569.00024' y='182.99998'/>
+ <rect height='1' id='rect8452-7' rx='0' ry='1' style='fill:#bebebe;fill-opacity:1;stroke:none;display:inline' transform='scale(-1,1)' width='1' x='-579.00037' y='181.99998'/>
+ <rect height='1' id='rect8452-8' rx='0' ry='1' style='fill:#bebebe;fill-opacity:1;stroke:none;display:inline' transform='scale(-1,1)' width='1' x='-564.00037' y='181.99998'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-562.99367,-175.00002)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-562.99367,-175.00002)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-562.99367,-175.00002)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-562.99367,-175.00002)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-562.99367,-175.00002)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/user-idle-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/user-idle-symbolic-ref.png
new file mode 100644
index 00000000..b178954e
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/user-idle-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/user-idle-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/user-idle-symbolic.svg
new file mode 100644
index 00000000..f484d263
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/user-idle-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='user-idle-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='173.96756' inkscape:cy='-220.09189' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='702' inkscape:window-maximized='1' inkscape:window-width='1366' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='160px' originy='140px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-81.0002,-357)'>
+ <path inkscape:connector-curvature='0' d='m 84.5002,358 c -1.385,0 -2.5,1.115 -2.5,2.5 l 0,5 c 0,1.385 1.115,2.5 2.5,2.5 l 6.375,0 3.125,4 0,-4.0625 c 1.14126,-0.23235 2,-1.22563 2,-2.4375 l 0,-5 c 0,-1.385 -1.115,-2.5 -2.5,-2.5 l -9,0 z' id='path8288' style='opacity:0.5;fill:#bebebe;fill-opacity:1;stroke:none'/>
+
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-81.0002,-357)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-81.0002,-357)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-81.0002,-357)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-81.0002,-357)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-81.0002,-357)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-81.0002,-357)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-81.0002,-357)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-81.0002,-357)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/user-info-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/user-info-symbolic-ref.png
new file mode 100644
index 00000000..7a0b8a89
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/user-info-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/user-info-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/user-info-symbolic.svg
new file mode 100644
index 00000000..9f76a9d8
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/user-info-symbolic.svg
@@ -0,0 +1,34 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='user-info-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16.000031' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16.000202' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer11' inkscape:cx='152.96757' inkscape:cy='71.90811' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='702' inkscape:window-maximized='1' inkscape:window-width='1366' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='139px' originy='432px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-102.0002,-648.99997)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-102.0002,-648.99997)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-102.0002,-648.99997)'>
+ <path inkscape:connector-curvature='0' d='m 109.55489,655.09373 c -0.70541,0.62353 -1.53918,0.90625 -2.55469,0.90625 -1.01551,0 -1.85318,-0.29053 -2.55859,-0.91406 -1.10938,0.36328 -2.43603,1.28775 -2.4375,2.90234 l -0.004,3.01172 c -7.2e-4,0.554 0.446,1.00002 1,1.00002 l 6,0 0,-5 c -0.011,-0.32734 0.3599,-0.99776 1,-1 l 1.14063,-0.004 c -0.71485,-0.60547 -1.157,-0.79019 -1.58594,-0.90236 z' id='path9219' sodipodi:nodetypes='csccssccsccc' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+ <path sodipodi:cx='49.5' sodipodi:cy='342.5' d='m 52,342.5 a 2.5,2.5 0 1 1 -5,0 2.5,2.5 0 1 1 5,0 z' id='path9221' sodipodi:rx='2.5' sodipodi:ry='2.5' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' transform='matrix(1.2,0,0,1.2,47.6002,240.99997)' sodipodi:type='arc'/>
+
+ <path inkscape:connector-curvature='0' d='m 110.8754,657 c -0.49245,0 -0.875,0.38256 -0.875,0.875 l 0,6.25 c 0,0.49244 0.38255,0.875 0.875,0.875 l 6.25,0 c 0.49245,0 0.875,-0.38256 0.875,-0.875 l 0,-6.25 c 0,-0.49244 -0.38255,-0.875 -0.875,-0.875 z m 2.125,1 2,0 0,1 -2,0 z m 0,2 2,0 0,4 -2,0 z' id='path9233' sodipodi:nodetypes='ccccccccccccccccccc' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+
+ </g>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-102.0002,-648.99997)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-102.0002,-648.99997)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-102.0002,-648.99997)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-102.0002,-648.99997)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-102.0002,-648.99997)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-102.0002,-648.99997)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/user-invisible-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/user-invisible-symbolic-ref.png
new file mode 100644
index 00000000..471afcf7
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/user-invisible-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/user-invisible-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/user-invisible-symbolic.svg
new file mode 100644
index 00000000..f9e1fe45
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/user-invisible-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='user-invisible-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.4 r9939' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='171.28381' inkscape:cy='-281.9103' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='702' inkscape:window-maximized='1' inkscape:window-width='1366' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='140px' originy='140px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ <inkscape:grid color='#000000' empcolor='#000000' empopacity='0' empspacing='4' enabled='true' id='grid5968' opacity='0.1254902' originx='140px' originy='140px' snapvisiblegridlinesonly='true' spacingx='0.5px' spacingy='0.5px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-101.0002,-357)'>
+ <path inkscape:connector-curvature='0' d='m 104.5002,358 c -1.385,0 -2.5,1.115 -2.5,2.5 l 0,5 c 0,1.385 1.115,2.5 2.5,2.5 l 6.375,0 3.125,4 0,-4.0625 c 1.14126,-0.23235 2,-1.22563 2,-2.4375 l 0,-5 c 0,-1.385 -1.115,-2.5 -2.5,-2.5 l -9,0 z m 0,2 9,0 c 0.277,0 0.5,0.223 0.5,0.5 l 0,5 c 0,0.277 -0.223,0.5 -0.5,0.5 l -9,0 c -0.277,0 -0.5,-0.223 -0.5,-0.5 l 0,-5 c 0,-0.277 0.223,-0.5 0.5,-0.5 z' id='path8297' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-101.0002,-357)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-101.0002,-357)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-101.0002,-357)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-101.0002,-357)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-101.0002,-357)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-101.0002,-357)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-101.0002,-357)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-101.0002,-357)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/user-not-tracked-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/user-not-tracked-symbolic-ref.png
new file mode 100644
index 00000000..6a74419d
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/user-not-tracked-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/user-not-tracked-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/user-not-tracked-symbolic.svg
new file mode 100644
index 00000000..8fdf8fa6
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/user-not-tracked-symbolic.svg
@@ -0,0 +1,36 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='user-not-tracked-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16.000637' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.91 r13725' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='0.11524417' inkscape:cy='8.0029726' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='45.254834'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='140' originy='180' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-101.0002,-396.99936)'>
+ <path inkscape:connector-curvature='0' d='m 107.70528,397 c -0.31595,0.0265 -0.52774,0.33667 -0.4375,0.64062 l 0.42578,1.54297 c -0.42482,0.10963 -0.83882,0.26266 -1.23828,0.45703 l -1.02149,-1.76562 c -0.0919,-0.16463 -0.26863,-0.26356 -0.45703,-0.25586 -0.38079,0.0138 -0.60682,0.43144 -0.41015,0.75781 l 1.01757,1.75782 c -0.3383,0.21721 -0.66636,0.45108 -0.97656,0.70312 l -1.2539,-1.25391 c -0.0945,-0.0967 -0.22418,-0.1509 -0.35938,-0.15039 -0.44709,0.002 -0.6672,0.54472 -0.34766,0.85743 l 1.22071,1.2207 c -0.28147,0.26634 -0.54674,0.52461 -0.79297,0.79297 l -0.7207,-0.72071 c -0.0945,-0.0967 -0.22418,-0.1509 -0.35938,-0.15039 -0.44709,0.002 -0.6672,0.54472 -0.34766,0.85743 l 0.76368,0.76367 C 101.52489,404.13059 101.0002,405 101.0002,405 c 0,0 0.8718,1.45034 2.27539,2.92383 l 1.10742,-1.10742 C 103.48662,405.88257 103.0002,405 103.0002,405 c 0,0 2.13401,-4 6,-4 0.37919,0 0.73655,0.0478 1.08203,0.11719 l 1.4668,-1.4668 c -0.2562,-0.12492 -0.51595,-0.24003 -0.78321,-0.33203 l 0.57032,-1.64648 c 0.1182,-0.32287 -0.11717,-0.66594 -0.46094,-0.67188 -0.21868,-0.003 -0.41409,0.136 -0.48242,0.34375 l -0.59766,1.7207 C 109.53367,399.02291 109.26843,399 109.0002,399 c -0.10545,0 -0.20804,0.0187 -0.3125,0.0254 l -0.45508,-1.65039 c -0.0563,-0.21805 -0.25139,-0.37157 -0.47656,-0.375 -0.0169,-8.6e-4 -0.0339,-8.6e-4 -0.0508,0 z m 8.28515,4.43359 c -0.12976,0.004 -0.25303,0.0575 -0.34375,0.15039 l -0.7207,0.72071 c -0.0612,-0.0667 -0.13019,-0.13193 -0.19336,-0.19727 l -1.09765,1.0957 c 0.8841,0.92646 1.36523,1.79688 1.36523,1.79688 0,0 -2.13401,4 -6,4 -0.36779,0 -0.71469,-0.0458 -1.05078,-0.11133 l -1.47852,1.47852 c 0.79576,0.38497 1.64436,0.63281 2.5293,0.63281 4.41828,0 8,-6 8,-6 0,0 -0.52469,-0.86941 -1.41016,-1.94531 l 0.76368,-0.76367 c 0.32529,-0.31801 0.0914,-0.86992 -0.36329,-0.85743 z M 109.0002,402 c -1.65685,0 -3,1.34315 -3,3 0,0.0621 0.0139,0.12046 0.0176,0.18164 l 1.84375,-1.84375 c 0.0659,-0.23651 0.24478,-0.41384 0.47656,-0.47656 l 0.84375,-0.84375 C 109.12066,402.01386 109.06231,402 109.0002,402 Z m 2.98438,2.85352 -3.13282,3.13086 c 0.0502,0.002 0.0976,0.0156 0.14844,0.0156 1.65685,0 3,-1.34315 3,-3 0,-0.0501 -0.0132,-0.0969 -0.0156,-0.14648 z' id='path11920' sodipodi:nodetypes='ccccccccccccccccccccccscccccccsccccccccccsccsccccssccccsccssc' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+ <path inkscape:connector-curvature='0' d='m 115.02168,398.02734 0,0.004 a 1.0001,1.0001 0 0 0 -0.0605,-0.002 1.0001,1.0001 0 0 0 -0.6875,0.30273 L 102.3186,410.2852 a 1.0001,1.0001 0 0 0 -0.28711,0.92187 l 0,0.79297 0.88672,0 a 1.0001,1.0001 0 0 0 0.81445,-0.30078 l 11.95508,-11.95313 a 1.0001,1.0001 0 0 0 0.30273,-0.71875 l 0,-1 -0.96875,0 z' id='path16981' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-101.0002,-396.99936)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-101.0002,-396.99936)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-101.0002,-396.99936)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-101.0002,-396.99936)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-101.0002,-396.99936)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-101.0002,-396.99936)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-101.0002,-396.99936)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-101.0002,-396.99936)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/user-offline-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/user-offline-symbolic-ref.png
new file mode 100644
index 00000000..d0056ce0
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/user-offline-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/user-offline-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/user-offline-symbolic.svg
new file mode 100644
index 00000000..cc75cbba
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/user-offline-symbolic.svg
@@ -0,0 +1,33 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='user-offline-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.4 r9939' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='211.28381' inkscape:cy='-281.9103' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='702' inkscape:window-maximized='1' inkscape:window-width='1366' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='180px' originy='140px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ <inkscape:grid color='#000000' empcolor='#000000' empopacity='0' empspacing='4' enabled='true' id='grid5968' opacity='0.1254902' originx='180px' originy='140px' snapvisiblegridlinesonly='true' spacingx='0.5px' spacingy='0.5px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-61.0002,-357)'>
+ <path inkscape:connector-curvature='0' d='m 74.0002,372 0,-4.5 -3.5,0 z' id='path8279' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+
+ <path inkscape:connector-curvature='0' d='m 64.5002,358 c -1.385,0 -2.5,1.115 -2.5,2.5 l 0,5 c 0,1.385 1.115,2.5 2.5,2.5 l 9,0 c 1.385,0 2.5,-1.115 2.5,-2.5 l 0,-5 c 0,-1.385 -1.115,-2.5 -2.5,-2.5 l -9,0 z m 1.5,2 1,0 c 0.27614,0 0.53779,0.10029 0.71875,0.28125 l 1.28125,1.28125 1.28125,-1.28125 C 70.46241,360.10029 70.72406,360 71.0002,360 l 1,0 0,1 c 0,0.27614 -0.10029,0.53779 -0.28125,0.71875 L 70.4377,363 l 1.28125,1.28125 c 0.18096,0.18096 0.28125,0.44261 0.28125,0.71875 l 0,1 -1,0 c -0.27614,0 -0.53779,-0.10029 -0.71875,-0.28125 l -1.28125,-1.28125 -1.28125,1.28125 C 67.53799,365.89971 67.27634,366 67.0002,366 l -1,0 0,-1 c 0,-0.27614 0.10029,-0.53779 0.28125,-0.71875 L 67.5627,363 66.28145,361.71875 C 66.10049,361.53779 66.0002,361.27614 66.0002,361 l 0,-1 z' id='rect8283' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-61.0002,-357)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-61.0002,-357)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-61.0002,-357)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-61.0002,-357)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-61.0002,-357)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-61.0002,-357)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-61.0002,-357)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-61.0002,-357)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/user-status-pending-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/user-status-pending-symbolic-ref.png
new file mode 100644
index 00000000..eb64ae24
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/user-status-pending-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/user-status-pending-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/user-status-pending-symbolic.svg
new file mode 100644
index 00000000..c1667112
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/user-status-pending-symbolic.svg
@@ -0,0 +1,35 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='user-status-pending-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.4 r9939' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='444.57332' inkscape:cy='-112.42645' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='702' inkscape:window-maximized='1' inkscape:window-width='1366' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='80.000002px' originy='140px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ <inkscape:grid color='#000000' empcolor='#000000' empopacity='0' empspacing='4' enabled='true' id='grid5968' opacity='0.1254902' originx='80.000002px' originy='140px' snapvisiblegridlinesonly='true' spacingx='0.5px' spacingy='0.5px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-161.0002,-357)'>
+ <path inkscape:connector-curvature='0' d='m 164.5002,358 c -1.385,0 -2.5,1.115 -2.5,2.5 l 0,0.5 14,0 0,-0.5 c 0,-1.385 -1.115,-2.5 -2.5,-2.5 l -9,0 z m -2.4375,8 c 0.23235,1.14126 1.22562,2 2.4375,2 l 6.375,0 3.125,4 0,-4.0625 c 0.97406,-0.20133 1.73857,-0.96043 1.9375,-1.9375 l -13.875,0 z' id='path8354' style='opacity:0.5;fill:#bebebe;fill-opacity:1;stroke:none'/>
+
+ <path sodipodi:cx='28' sodipodi:cy='209' d='m 29,209 a 1,1 0 1 1 -2,0 1,1 0 1 1 2,0 z' id='path4955-6' sodipodi:rx='1' sodipodi:ry='1' style='fill:#bebebe;fill-opacity:1;stroke:none;display:inline' transform='matrix(1.5,0,0,1.5,122.4999,50)' sodipodi:type='arc'/>
+ <path sodipodi:cx='28' sodipodi:cy='209' d='m 29,209 a 1,1 0 1 1 -2,0 1,1 0 1 1 2,0 z' id='path4957-7' sodipodi:rx='1' sodipodi:ry='1' style='fill:#bebebe;fill-opacity:1;stroke:none;display:inline' transform='matrix(1.5,0,0,1.5,126.4999,50)' sodipodi:type='arc'/>
+ <path sodipodi:cx='28' sodipodi:cy='209' d='m 29,209 a 1,1 0 1 1 -2,0 1,1 0 1 1 2,0 z' id='path4959-1' sodipodi:rx='1' sodipodi:ry='1' style='fill:#bebebe;fill-opacity:1;stroke:none;display:inline' transform='matrix(1.5,0,0,1.5,130.4999,50)' sodipodi:type='arc'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-161.0002,-357)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-161.0002,-357)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-161.0002,-357)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-161.0002,-357)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-161.0002,-357)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-161.0002,-357)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-161.0002,-357)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-161.0002,-357)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/user-trash-full-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/user-trash-full-symbolic-ref.png
new file mode 100644
index 00000000..28485b34
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/user-trash-full-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/user-trash-full-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/user-trash-full-symbolic.svg
new file mode 100644
index 00000000..6be32fe5
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/user-trash-full-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='user-trash-full-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.2 r9819' version='1.1' width='16.001245' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-paths='false' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='235.02423' inkscape:cy='31.693073' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#555753' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1381' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='1600' inkscape:window-y='27' inkscape:zoom='11.313708'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-340.99896,-217)'>
+
+ <path inkscape:connector-curvature='0' d='m 345.0002,219 0,-0.96875 7,0 0,0.96875 z m -0.53125,-1.96875 c -0.49033,0 -0.79607,0.22845 -1.03125,0.46875 -0.23518,0.2403 -0.4375,0.55851 -0.4375,1.03125 l 0,0.46875 -2,0 0,2 15,0 0,-2 -2,0 0,-0.34375 0,-0.0313 c -0.0239,-0.4306 -0.17024,-0.75229 -0.40625,-1.03125 -0.22373,-0.26444 -0.62669,-0.52931 -1.15625,-0.53125 l 0,-0.0313 -0.0625,0 -7.90625,0 z M 353.0002,222 l 2,0 c 1.67365,2.92708 1.13767,5.85417 0,8.78125 C 354.56519,231.90048 354.01782,233 352.8127,233 l -8.625,0 c -1.20512,0 -1.77657,-1.09045 -2.1875,-2.21875 -1.04232,-2.86194 -1.59896,-5.75423 0,-8.78125 l 2,0 c -1.72127,2.94784 -0.98485,5.97016 0,9 l 9,0 c 1.09591,-3.03321 1.63141,-6.04944 0,-9 z m -4.96875,-0.0165 0,8.01647 0.96875,0 0,-8.01647 z m 1.96875,0 c 1.7622,2.2232 0.83031,5.63124 0,8.01647 l 1,0 c 0.82494,-2.30834 1.83942,-5.62739 0,-8.01647 z m -3.96875,0 c -1.81727,2.60868 -0.85626,5.81287 0,8.01647 l 0.96875,0 c -0.86519,-2.2217 -1.66269,-5.46859 0,-8.01647 z' id='path10937' sodipodi:nodetypes='ccccccssccccccccscccccccsssscccccccccccccccccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0pt;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;font-family:Bitstream Vera Sans'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-340.99896,-217)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-340.99896,-217)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-340.99896,-217)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-340.99896,-217)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-340.99896,-217)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-340.99896,-217)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-340.99896,-217)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-340.99896,-217)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/user-trash-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/user-trash-symbolic-ref.png
new file mode 100644
index 00000000..d811198b
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/user-trash-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/user-trash-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/user-trash-symbolic.svg
new file mode 100644
index 00000000..81b9d298
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/user-trash-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='user-trash-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.4 r9939' version='1.1' width='16.000002' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer13' inkscape:cx='45.46981' inkscape:cy='-0.872946' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='true' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1381' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='16'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='-240px' originy='-42px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-481.0002,-175)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-481.0002,-175)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-481.0002,-175)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-481.0002,-175)'>
+
+ <path inkscape:connector-curvature='0' d='m 484.0002,180 0,9 9,0 0,-9 2,0 0,9 c 0,2 -2,2 -2,2 l -9,0 c -2,0 -2,-2 -2,-2 l 0,-9 z m 4.00001,1 1.00002,0 0,6 -1.00002,0 z m 2,0 1.00002,0 0,6 -1.00002,0 z m -4,0 0.99999,0 0,6 -0.99999,0 z m -1.00001,-6 c -2,0 -2,2 -2,2 l -2,0 0,2 15,0 0,-2 -2,0 c 0,-2 -2,-2 -2,-2 l -7,0 z m 0,1 7,0 0,1 -7,0 0,-1 z' id='path3799' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-481.0002,-175)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-481.0002,-175)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-481.0002,-175)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-481.0002,-175)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-481.0002,-175)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/utilities-system-monitor-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/utilities-system-monitor-symbolic-ref.png
new file mode 100644
index 00000000..41aadaa3
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/utilities-system-monitor-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/utilities-system-monitor-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/utilities-system-monitor-symbolic.svg
new file mode 100644
index 00000000..408d9e67
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/utilities-system-monitor-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:svg='http://www.w3.org/2000/svg' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' version='1.1' inkscape:version='0.47 r22583' height='16' sodipodi:docname='utilities-system-monitor-symbolic.svg' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:object-paths='true' inkscape:cy='-218.16054' inkscape:current-layer='layer11' inkscape:window-width='1920' pagecolor='#555753' showborder='false' showguides='true' inkscape:snap-nodes='false' objecttolerance='10' showgrid='true' inkscape:object-nodes='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:window-x='0' inkscape:snap-bbox='true' bordercolor='#666666' id='namedview88' inkscape:window-maximized='1' inkscape:snap-global='true' inkscape:window-y='26' gridtolerance='10' inkscape:zoom='1' inkscape:window-height='1021' borderopacity='1' guidetolerance='10' inkscape:snap-bbox-midpoints='false' inkscape:cx='-84.56688' inkscape:bbox-paths='false' inkscape:snap-grids='true' inkscape:pageopacity='1' inkscape:snap-to-guides='true'>
+ <inkscape:grid visible='true' spacingx='1px' type='xygrid' spacingy='1px' id='grid4866' empspacing='2' enabled='true' snapvisiblegridlinesonly='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g transform='translate(-142,-490)' inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline'/>
+ <g transform='translate(-142,-490)' inkscape:groupmode='layer' id='layer10' inkscape:label='devices'/>
+ <g transform='translate(-142,-490)' inkscape:groupmode='layer' id='layer11' inkscape:label='apps'>
+ <path d='M 144.1875,490 C 142.98238,490 142,491.01794 142,492.21875 l 0,10.5625 c 0,1.20081 0.98238,2.21875 2.1875,2.21875 l 11.625,0 c 1.20512,0 2.1875,-1.01794 2.1875,-2.21875 l 0,-10.5625 C 158,491.01794 157.01762,490 155.8125,490 l -11.625,0 z m 0,2 11.625,0 c 0.12026,0 0.1875,0.08 0.1875,0.21875 l 0,10.5625 C 156,502.91996 155.93276,503 155.8125,503 l -11.625,0 c -0.12026,0 -0.1875,-0.08 -0.1875,-0.21875 l 0,-10.5625 C 144,492.08004 144.06724,492 144.1875,492 z' id='rect11749-5-0' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/>
+
+ <path d='m 151.3125,493.96875 a 0.50005,0.50005 0 0 0 -0.34375,0.34375 l -1.6875,6.09375 -0.875,-1.1875 A 0.50005,0.50005 0 0 0 148,499 l -2.5,0 -0.5,0 0,1 0.5,0 2.25,0 1.3125,1.78125 a 0.50005,0.50005 0 0 0 0.875,-0.15625 l 1.53125,-5.4375 1.0625,3.46875 A 0.50005,0.50005 0 0 0 153,500 l 1.5,0 0.5,0 0,-1 -0.5,0 -1.125,0 -1.4375,-4.6875 a 0.50005,0.50005 0 0 0 -0.625,-0.34375 z' id='path3643' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/>
+ </g>
+ <g transform='translate(-142,-490)' inkscape:groupmode='layer' id='layer12' inkscape:label='actions'/>
+ <g transform='translate(-142,-490)' inkscape:groupmode='layer' id='layer13' inkscape:label='places'/>
+ <g transform='translate(-142,-490)' inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes'/>
+ <g transform='translate(-142,-490)' inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline'/>
+ <g transform='translate(-142,-490)' inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/utilities-terminal-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/utilities-terminal-symbolic-ref.png
new file mode 100644
index 00000000..117c1c2d
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/utilities-terminal-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/utilities-terminal-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/utilities-terminal-symbolic.svg
new file mode 100644
index 00000000..13292c36
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/utilities-terminal-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:svg='http://www.w3.org/2000/svg' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' version='1.1' inkscape:version='0.47 r22583' height='16.000019' sodipodi:docname='utilities-terminal-symbolic.svg' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:object-paths='true' inkscape:cy='-218.16054' inkscape:current-layer='layer11' inkscape:window-width='1920' pagecolor='#555753' showborder='false' showguides='true' inkscape:snap-nodes='false' objecttolerance='10' showgrid='true' inkscape:object-nodes='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:window-x='0' inkscape:snap-bbox='true' bordercolor='#666666' id='namedview88' inkscape:window-maximized='1' inkscape:snap-global='true' inkscape:window-y='26' gridtolerance='10' inkscape:zoom='1' inkscape:window-height='1021' borderopacity='1' guidetolerance='10' inkscape:snap-bbox-midpoints='false' inkscape:cx='-64.56688' inkscape:bbox-paths='false' inkscape:snap-grids='true' inkscape:pageopacity='1' inkscape:snap-to-guides='true'>
+ <inkscape:grid visible='true' spacingx='1px' type='xygrid' spacingy='1px' id='grid4866' empspacing='2' enabled='true' snapvisiblegridlinesonly='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g transform='translate(-122,-489.99998)' inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline'/>
+ <g transform='translate(-122,-489.99998)' inkscape:groupmode='layer' id='layer10' inkscape:label='devices'/>
+ <g transform='translate(-122,-489.99998)' inkscape:groupmode='layer' id='layer11' inkscape:label='apps'>
+ <path d='M 124.1875,490 C 122.98196,490 122,491.01672 122,492.21875 l 0,10.5625 c 0,1.20203 0.98197,2.21875 2.1875,2.21875 l 11.625,0 c 1.20553,0 2.1875,-1.01671 2.1875,-2.21875 l 0,-10.5625 C 138,491.01671 137.01804,490 135.8125,490 l -11.625,0 z m 0,2 11.625,0 c 0.1228,0 0.1875,0.0809 0.1875,0.21875 l 0,10.5625 C 136,502.91909 135.93531,503 135.8125,503 l -11.625,0 C 124.06469,503 124,502.9191 124,502.78125 l 0,-10.5625 C 124,492.0809 124.0647,492 124.1875,492 z' id='rect11749-5-9' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/>
+
+ <path d='m 126.3125,495.90625 a 0.60006002,0.60006002 0 0 0 -0.25,1.03125 l 1.5625,1.5625 -1.5625,1.5625 a 0.61871843,0.61871843 0 1 0 0.875,0.875 l 2,-2 a 0.60006002,0.60006002 0 0 0 0,-0.875 l -2,-2 a 0.60006002,0.60006002 0 0 0 -0.625,-0.15625 z' id='path11751-2-3' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.20000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans'/>
+ <rect x='130' y='500' id='rect4987' height='1.00001' width='3' style='color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ </g>
+ <g transform='translate(-122,-489.99998)' inkscape:groupmode='layer' id='layer12' inkscape:label='actions'/>
+ <g transform='translate(-122,-489.99998)' inkscape:groupmode='layer' id='layer13' inkscape:label='places'/>
+ <g transform='translate(-122,-489.99998)' inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes'/>
+ <g transform='translate(-122,-489.99998)' inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline'/>
+ <g transform='translate(-122,-489.99998)' inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/video-display-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/video-display-symbolic-ref.png
new file mode 100644
index 00000000..133c2d03
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/video-display-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/video-display-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/video-display-symbolic.svg
new file mode 100644
index 00000000..42692878
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/video-display-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='video-display-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer10' inkscape:cx='93.967565' inkscape:cy='-130.09189' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='702' inkscape:window-maximized='1' inkscape:window-width='1366' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='80px' originy='230px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-161.0002,-447)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-161.0002,-447)'>
+
+ <path inkscape:connector-curvature='0' d='m 164.0002,448 c -1.662,0 -3,1.338 -3,3 l 0,7 c 0,1.662 1.338,3 3,3 l 10,0 c 1.662,0 3,-1.338 3,-3 l 0,-7 c 0,-1.662 -1.338,-3 -3,-3 z m 0,2 10,0 c 0.554,0 1,0.446 1,1 l 0,7 c 0,0.554 -0.446,1 -1,1 l -10,0 c -0.554,0 -1,-0.446 -1,-1 l 0,-7 c 0,-0.554 0.446,-1 1,-1 z' id='rect3773-3' sodipodi:nodetypes='ssssssssssssssssss' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+ <path inkscape:connector-curvature='0' d='m 169.0002,463 c 3,0 4,-1 4,-1 l -1,0 -6,0 -1,0 c 0,0 1,1 4,1 z' id='rect3778-2' sodipodi:nodetypes='sccccs' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-161.0002,-447)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-161.0002,-447)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-161.0002,-447)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-161.0002,-447)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-161.0002,-447)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-161.0002,-447)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-161.0002,-447)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/video-joined-displays-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/video-joined-displays-symbolic-ref.png
new file mode 100644
index 00000000..02a0de54
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/video-joined-displays-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/video-joined-displays-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/video-joined-displays-symbolic.svg
new file mode 100644
index 00000000..b432c0fe
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/video-joined-displays-symbolic.svg
@@ -0,0 +1,38 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='video-joined-displays-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.92+devel unknown' viewBox='0 0 16 16' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer10' inkscape:cx='30.867139' inkscape:cy='-9.38963' inkscape:document-rotation='0' inkscape:document-units='px' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:measure-end='0,0' inkscape:measure-start='0,0' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='3440' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-40' originy='330' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-281.0002,-547)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-281.0002,-547)'>
+
+ <path inkscape:connector-curvature='0' d='m 287.0002,553 c 1.662,0 3,1.338 3,3 v 1 c 0,1.662 -1.338,3 -3,3 h -3 c -1.662,0 -3,-1.338 -3,-3 v -1 c 0,-1.662 1.338,-3 3,-3 z m 0,2 h -3 c -0.554,0 -1,0.446 -1,1 v 1 c 0,0.554 0.446,1 1,1 h 3 c 0.554,0 1,-0.446 1,-1 v -1 c 0,-0.554 -0.446,-1 -1,-1 z' id='path5559' sodipodi:nodetypes='ssssssssssssssssss' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+ <path inkscape:connector-curvature='0' d='m 285.5002,561 c -2.5,0 -2.5,0.5 -2.5,0.5 0,0.5 0.5,0.5 0.5,0.5 h 4 c 0.5,0 0.5,-0.5 0.5,-0.5 0,0 0,-0.5 -2.5,-0.5 z' id='path5561' sodipodi:nodetypes='sscccs' style='fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:0.5'/>
+ <path inkscape:connector-curvature='0' d='m 294.0002,550.0625 c 1.662,0 3,1.338 3,3 V 557 c 0,1.662 -1.338,3 -3,3 h -3 c -1.662,0 -3,-1.338 -3,-3 v -3.9375 c 0,-1.662 1.338,-3 3,-3 z m 0,2 h -3 c -0.554,0 -1,0.446 -1,1 V 557 c 0,0.554 0.446,1 1,1 h 3 c 0.554,0 1,-0.446 1,-1 v -3.9375 c 0,-0.554 -0.446,-1 -1,-1 z' id='path5565' sodipodi:nodetypes='ssssssssssssssssss' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+ <path inkscape:connector-curvature='0' d='m 292.5002,561 c -2.5,0 -2.5,0.5 -2.5,0.5 0,0.5 0.5,0.5 0.5,0.5 h 4 c 0.5,0 0.5,-0.5 0.5,-0.5 0,0 0,-0.5 -2.5,-0.5 z' id='path5567' sodipodi:nodetypes='sscccs' style='fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:0.5'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-281.0002,-547)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-281.0002,-547)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-281.0002,-547)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-281.0002,-547)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-281.0002,-547)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-281.0002,-547)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-281.0002,-547)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/video-single-display-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/video-single-display-symbolic-ref.png
new file mode 100644
index 00000000..374b22a6
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/video-single-display-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/video-single-display-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/video-single-display-symbolic.svg
new file mode 100644
index 00000000..8fe4803e
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/video-single-display-symbolic.svg
@@ -0,0 +1,36 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='video-single-display-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.92+devel unknown' viewBox='0 0 16 16' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer10' inkscape:cx='39.289998' inkscape:cy='8.62313' inkscape:document-rotation='0' inkscape:document-units='px' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:measure-end='0,0' inkscape:measure-start='0,0' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='3440' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-60' originy='330' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-301.0002,-547)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-301.0002,-547)'>
+
+ <path inkscape:connector-curvature='0' d='m 304.0002,548 c -1.662,0 -3,1.338 -3,3 v 7 c 0,1.662 1.338,3 3,3 h 10 c 1.662,0 3,-1.338 3,-3 v -7 c 0,-1.662 -1.338,-3 -3,-3 z m 4,4 h 2 v 6 h -2 v -4 h -1 v -1 c 0.47533,-0.0777 0.81922,-0.39206 1,-1 z' id='path5572' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+ <path inkscape:connector-curvature='0' d='m 309.0002,563 c 3,0 4,-1 4,-1 h -1 -6 -1 c 0,0 1,1 4,1 z' id='path5574' sodipodi:nodetypes='sccccs' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-301.0002,-547)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-301.0002,-547)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-301.0002,-547)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-301.0002,-547)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-301.0002,-547)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-301.0002,-547)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-301.0002,-547)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/video-x-generic-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/video-x-generic-symbolic-ref.png
new file mode 100644
index 00000000..cbe62404
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/video-x-generic-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/video-x-generic-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/video-x-generic-symbolic.svg
new file mode 100644
index 00000000..4b3d7bbb
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/video-x-generic-symbolic.svg
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='video-x-generic-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer14' inkscape:cx='-419.78657' inkscape:cy='-121.21795' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1374' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-299.9998px' originy='84px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-541,-301)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-541,-301)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-541,-301)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-541,-301)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-541,-301)'>
+
+ <rect height='9' id='rect5552' rx='0.99980003' ry='1' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible' transform='scale(-1,1)' width='9.96875' x='-555.96875' y='305'/>
+ <path inkscape:connector-curvature='0' d='M 546,309.4693 542.5307,306 l -0.5309,0 0,7 0.5,0 z' id='path5554' sodipodi:nodetypes='cccccc' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-541,-301)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-541,-301)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-541,-301)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-541,-301)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/view-app-grid-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/view-app-grid-symbolic-ref.png
new file mode 100644
index 00000000..118444b8
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/view-app-grid-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/view-app-grid-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/view-app-grid-symbolic.svg
new file mode 100644
index 00000000..d3bc1386
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/view-app-grid-symbolic.svg
@@ -0,0 +1,43 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='view-app-grid-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.91 r13725' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='50.52314' inkscape:cy='3.49953' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1403' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='2560' inkscape:window-y='0' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='179.9998' originy='670' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-61.0004,-887)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-61.0004,-887)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-61.0004,-887)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-61.0004,-887)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-61.0004,-887)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-61.0004,-887)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-61.0004,-887)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-61.0004,-887)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-61.0004,-887)'>
+
+ <rect height='2.0000007' id='rect9843' rx='1.0000002' ry='1.0000002' style='color:#000000;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:new' width='2.0000005' x='64.000198' y='890'/>
+ <rect height='2.0000007' id='rect9833' rx='1.0000002' ry='1.0000002' style='color:#000000;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:new' width='2.0000005' x='68.000198' y='890'/>
+ <rect height='2.0000007' id='rect9835' rx='1.0000002' ry='1.0000002' style='color:#000000;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:new' width='2.0000005' x='72.000198' y='890'/>
+ <rect height='2.0000007' id='rect9837' rx='1.0000002' ry='1.0000002' style='color:#000000;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:new' width='2.0000005' x='64.000198' y='894'/>
+ <rect height='2.0000007' id='rect9839' rx='1.0000002' ry='1.0000002' style='color:#000000;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:new' width='2.0000005' x='68.000198' y='894'/>
+ <rect height='2.0000007' id='rect9841' rx='1.0000002' ry='1.0000002' style='color:#000000;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:new' width='2.0000005' x='72.000198' y='894'/>
+ <rect height='2.0000007' id='rect9845' rx='1.0000002' ry='1.0000002' style='color:#000000;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:new' width='2.0000005' x='64.000198' y='898'/>
+ <rect height='2.0000007' id='rect9847' rx='1.0000002' ry='1.0000002' style='color:#000000;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:new' width='2.0000005' x='68.000198' y='898'/>
+ <rect height='2.0000007' id='rect9849' rx='1.0000002' ry='1.0000002' style='color:#000000;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:new' width='2.0000005' x='72.000198' y='898'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/view-continuous-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/view-continuous-symbolic-ref.png
new file mode 100644
index 00000000..14b4b78e
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/view-continuous-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/view-continuous-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/view-continuous-symbolic.svg
new file mode 100644
index 00000000..a38952f2
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/view-continuous-symbolic.svg
@@ -0,0 +1,35 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='view-continuous-symbolic.svg' height='16.000336' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.3.1 r9886' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='48.341015' inkscape:cy='-17.299448' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='709' inkscape:window-maximized='1' inkscape:window-width='1366' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='100.0002px' originy='650.00012px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-141,-866.99979)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-141,-866.99979)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-141,-866.99979)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-141,-866.99979)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-141,-866.99979)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-141,-866.99979)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-141,-866.99979)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-141,-866.99979)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-141,-866.99979)'>
+
+ <rect height='2' id='rect42942-5-3-1-6-9-9' inkscape:label='a' rx='0.375' ry='0.375' style='opacity:0.35;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible' transform='scale(-1,1)' width='4.0000358' x='-151.0002' y='878'/>
+ <rect height='2.0002136' id='rect42944-7-5-3-5-0-8-8' inkscape:label='a' rx='0.375' ry='0.375' style='opacity:0.35;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible' transform='scale(-1,1)' width='4.0000348' x='-151.0002' y='866.99976'/>
+ <rect height='2' id='rect42944-7-5-3-5-1-5-8-7-4' inkscape:label='a' rx='0.375' ry='0.375' style='opacity:0.35;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible' transform='scale(-1,1)' width='4.0000348' x='-151.0002' y='881'/>
+ <rect height='2.0002136' id='rect42942-5-3-1-1-2-4-0-0' inkscape:label='a' rx='0.375' ry='0.375' style='opacity:0.35;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible' transform='scale(-1,1)' width='4.0000367' x='-151.0002' y='869.99976'/>
+ <rect height='2' id='rect42942-5-3-1-6-6-3-8' inkscape:label='a' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible' transform='scale(-1,1)' width='12.00001' x='-155.0002' y='874'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/view-dual-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/view-dual-symbolic-ref.png
new file mode 100644
index 00000000..df604b63
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/view-dual-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/view-dual-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/view-dual-symbolic.svg
new file mode 100644
index 00000000..f25f43d8
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/view-dual-symbolic.svg
@@ -0,0 +1,35 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='view-dual-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.3.1 r9886' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='8.341015' inkscape:cy='-17.299448' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='709' inkscape:window-maximized='1' inkscape:window-width='1366' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='60.0002px' originy='650.00012px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-181,-867.00012)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-181,-867.00012)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-181,-867.00012)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-181,-867.00012)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-181,-867.00012)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-181,-867.00012)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-181,-867.00012)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-181,-867.00012)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-181,-867.00012)'>
+
+ <path inkscape:connector-curvature='0' d='m 181,868 0,1 0,11 0,1 1,0 5,0 c 0.1754,0 0.52538,0.15166 0.8125,0.34375 0.28712,0.19209 0.46875,0.375 0.46875,0.375 L 189,882.4375 l 0.71875,-0.75 c 0,0 0.8963,-0.6875 1.28125,-0.6875 l 5,0 1,0 0,-1 0,-11 0,-1 -1,0 -5,0 c -0.87652,0 -1.56017,0.34756 -2.03125,0.6875 -0.0301,-0.0207 -0.031,-0.0105 -0.0625,-0.0312 C 188.44557,868.35254 187.82811,868 187,868 l -5,0 -1,0 z m 2,2 4,0 c 0.13821,0 0.51476,0.14746 0.8125,0.34375 0.29774,0.19629 0.5,0.375 0.5,0.375 l 0.71875,0.6875 0.6875,-0.71875 c 0,0 0.89975,-0.6875 1.28125,-0.6875 l 4,0 0,9 -4,0 c -0.87693,0 -1.56008,0.34735 -2.03125,0.6875 -0.0196,-0.0135 -0.011,-0.0177 -0.0312,-0.0312 C 188.47725,879.34834 187.83512,879 187,879 l -4,0 0,-9 z' id='rect7352-28-4-8' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <rect height='2' id='rect42942-5-3-1-4-4-5-9' inkscape:label='a' rx='0.375' ry='0.375' style='opacity:0.35;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible' transform='scale(-1,1)' width='3.0000136' x='-187.00021' y='871.99976'/>
+ <rect height='2.0002136' id='rect42944-7-5-3-5-1-5-0-2-62-5' inkscape:label='a' rx='0.375' ry='0.375' style='opacity:0.35;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible' transform='scale(-1,1)' width='3.0000129' x='-187.00021' y='874.99976'/>
+ <rect height='2.0002136' id='rect42942-5-3-1-4-4-6-0-1' inkscape:label='a' rx='0.375' ry='0.375' style='opacity:0.35;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible' transform='scale(-1,1)' width='3.0000136' x='-194.00021' y='871.99976'/>
+ <rect height='2.0002136' id='rect42944-7-5-3-5-1-5-0-2-6-4-6' inkscape:label='a' rx='0.375' ry='0.375' style='opacity:0.35;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible' transform='scale(-1,1)' width='3.0000129' x='-194.00021' y='874.99976'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/view-fullscreen-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/view-fullscreen-symbolic-ref.png
new file mode 100644
index 00000000..94515ab6
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/view-fullscreen-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/view-fullscreen-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/view-fullscreen-symbolic.svg
new file mode 100644
index 00000000..67f50edb
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/view-fullscreen-symbolic.svg
@@ -0,0 +1,40 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='view-fullscreen-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.3.1 r9886' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='12.30146' inkscape:cy='7.8042' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1563' inkscape:window-maximized='1' inkscape:window-width='1200' inkscape:window-x='0' inkscape:window-y='0' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='200px' originy='550px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-41.0002,-767)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-41.0002,-767)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-41.0002,-767)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-41.0002,-767)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-41.0002,-767)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-41.0002,-767)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-41.0002,-767)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-41.0002,-767)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-41.0002,-767)'>
+
+ <path inkscape:connector-curvature='0' d='M 42.78125,776 A 1.0001,1.0001 0 0 0 42,777 l 0,4 a 1.0001,1.0001 0 0 0 1,1 l 4,0 a 1.0001,1.0001 0 1 0 0,-2 l -3,0 0,-3 a 1.0001,1.0001 0 0 0 -1.21875,-1 z' id='path12113' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 47.375,775.5 a 1.0001,1.0001 0 0 0 -0.59375,0.28125 l -4.5,4.5 a 1.016466,1.016466 0 1 0 1.4375,1.4375 l 4.5,-4.5 A 1.0001,1.0001 0 0 0 47.375,775.5 z' id='path12147' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <rect height='1' id='rect12919' style='color:#000000;fill:#bdbdbd;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' width='1' x='42.000198' y='781'/>
+ <path inkscape:connector-curvature='0' d='M 50.90625,768 A 1.001098,1.001098 0 1 0 51,770 l 3,0 0,3 a 1.0001,1.0001 0 1 0 2,0 l 0,-4 a 1.0001,1.0001 0 0 0 -1,-1 l -4,0 a 1.0001,1.0001 0 0 0 -0.09375,0 z' id='path12111' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <rect height='1' id='rect12923' style='color:#000000;fill:#bdbdbd;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' width='1' x='55.000198' y='768'/>
+ <path inkscape:connector-curvature='0' d='m 54.78125,768 a 1.0001,1.0001 0 0 0 -0.5,0.28125 l -4.5,4.46875 a 1.016466,1.016466 0 1 0 1.4375,1.4375 l 4.5,-4.46875 A 1.0001,1.0001 0 0 0 54.78125,768 z' id='path12925' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <rect height='1' id='rect4479-2' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' width='1' x='42.000198' y='776'/>
+ <rect height='1' id='rect4479-2-9' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' width='1' x='47.000198' y='781'/>
+ <rect height='1' id='rect4479-2-9-9-0-8' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' width='1' x='55.000198' y='773'/>
+ <rect height='1' id='rect4479-2-9-9-0-8-1' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' width='1' x='50.000198' y='768'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/view-grid-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/view-grid-symbolic-ref.png
new file mode 100644
index 00000000..63161a82
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/view-grid-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/view-grid-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/view-grid-symbolic.svg
new file mode 100644
index 00000000..b0f64122
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/view-grid-symbolic.svg
@@ -0,0 +1,38 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='view-grid-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.91 r13725' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='285.88359' inkscape:cy='29.75119' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='836' inkscape:window-maximized='1' inkscape:window-width='1440' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='179.9998' originy='650' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-61.0004,-867)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-61.0004,-867)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-61.0004,-867)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-61.0004,-867)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-61.0004,-867)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-61.0004,-867)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-61.0004,-867)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-61.0004,-867)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-61.0004,-867)'>
+
+ <rect height='4' id='rect20592-9' rx='0.38461545' ry='0.50229359' style='color:#000000;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:new' width='4' x='64.000198' y='870'/>
+ <rect height='4' id='rect8399' rx='0.38461545' ry='0.50229359' style='color:#000000;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:new' width='4' x='70.000198' y='870'/>
+ <rect height='4' id='rect8401' rx='0.38461545' ry='0.50229359' style='color:#000000;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:new' width='4' x='64.000198' y='876'/>
+ <rect height='4' id='rect8403' rx='0.38461545' ry='0.50229359' style='color:#000000;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:new' width='4' x='70.000198' y='876'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/view-list-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/view-list-symbolic-ref.png
new file mode 100644
index 00000000..ce6f74b8
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/view-list-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/view-list-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/view-list-symbolic.svg
new file mode 100644
index 00000000..f5c84a63
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/view-list-symbolic.svg
@@ -0,0 +1,38 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='view-list-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.91 r13725' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='16.218189' inkscape:cy='6.50501' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='199.9998' originy='650' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-41.000401,-867)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-41.000401,-867)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-41.000401,-867)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-41.000401,-867)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-41.000401,-867)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-41.000401,-867)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-41.000401,-867)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-41.000401,-867)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-41.000401,-867)'>
+
+ <rect height='2' id='rect5356' inkscape:label='a' style='color:#bebebe;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none' width='5.999999' x='49.000198' y='871'/>
+ <rect height='2' id='rect5358' inkscape:label='a' style='color:#bebebe;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none' width='5.999999' x='49.000198' y='876.98438'/>
+ <rect height='4.0000033' id='rect5398' rx='0.38461545' ry='0.3787879' style='color:#000000;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:new' width='4.0000014' x='43.000198' y='870'/>
+ <rect height='3.9791701' id='rect5401' rx='0.38461545' ry='0.37878785' style='color:#000000;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:new' width='4.0000014' x='43.000198' y='876'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/view-mirror-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/view-mirror-symbolic-ref.png
new file mode 100644
index 00000000..87ab86e8
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/view-mirror-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/view-mirror-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/view-mirror-symbolic.svg
new file mode 100644
index 00000000..0729a32f
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/view-mirror-symbolic.svg
@@ -0,0 +1,36 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='view-mirror-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16.00001' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.92+devel unknown' viewBox='0 0 16.028591 16.00001' width='16.028591' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='-193.63928' inkscape:cy='446.69119' inkscape:document-rotation='0' inkscape:document-units='px' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:measure-end='0,0' inkscape:measure-start='0,0' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='3440' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='200.02859' originy='790.00003' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-40.971608,-1007)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-40.971608,-1007)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-40.971608,-1007)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-40.971608,-1007)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-40.971608,-1007)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-40.971608,-1007)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-40.971608,-1007)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-40.971608,-1007)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-40.971608,-1007)'>
+
+ <path inkscape:connector-curvature='0' d='m 43.120538,1007 c -0.9012,0 -2.14893,0.6913 -2.14893,1.5746 v 12.7958 c 0,0.8833 1.24773,1.6103 2.14893,1.6104 l 4.492178,-2.9445 c 0.70245,-0.4555 1.44189,-0.7271 1.44189,-1.6105 v -6.9066 c 0,-0.8834 -0.93834,-1.22 -1.44189,-1.6104 z m 0,1.4367 4.790049,2.925 c 0.06616,0.038 0.09803,0.077 0.09803,0.1575 v 6.9066 c 0,0.065 -0.04025,0.1113 -0.08631,0.1379 l -4.801768,2.9445 c -0.093,-10e-5 -0.141,-0.042 -0.141,-0.138 v -12.7956 c -1.5e-4,-0.096 0.0525,-0.1367 0.141,-0.1379 z' id='path68937-3' sodipodi:nodetypes='cssccssccccscccsccc' style='color:#bebebe;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:Sans;-inkscape-font-specification:Sans;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-anchor:start;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:normal;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 54.85127,1007 c 0.9012,0 2.14893,0.6913 2.14893,1.5746 v 12.7958 c 0,0.8833 -1.24773,1.6103 -2.14893,1.6104 l -4.351553,-2.9445 c -0.70245,-0.4555 -1.44189,-0.7271 -1.44189,-1.6105 v -6.9066 c 0,-0.8834 0.93834,-1.22 1.44189,-1.6104 z m 0,1.4367 -4.727549,2.925 c -0.06616,0.038 -0.09803,0.077 -0.09803,0.1575 v 6.9066 c 0,0.065 0.04025,0.1113 0.08631,0.1379 l 4.739268,2.9445 c 0.093,-10e-5 0.141,-0.042 0.141,-0.138 v -12.7956 c 1.5e-4,-0.096 -0.0525,-0.1367 -0.140999,-0.1379 z' id='path4691' sodipodi:nodetypes='cssccssccccscccscc' style='color:#bebebe;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:Sans;-inkscape-font-specification:Sans;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-anchor:start;display:inline;overflow:visible;visibility:visible;opacity:0.5;vector-effect:none;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:normal;enable-background:accumulate'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/view-more-horizontal-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/view-more-horizontal-symbolic-ref.png
new file mode 100644
index 00000000..e137c10d
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/view-more-horizontal-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/view-more-horizontal-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/view-more-horizontal-symbolic.svg
new file mode 100644
index 00000000..b753f749
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/view-more-horizontal-symbolic.svg
@@ -0,0 +1,33 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='view-more-horizontal-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.91 r13725' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='-114.33249' inkscape:cy='231.042' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='99.99979' originy='650' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-141.00041,-867)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-141.00041,-867)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-141.00041,-867)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-141.00041,-867)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-141.00041,-867)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-141.00041,-867)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-141.00041,-867)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-141.00041,-867)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-141.00041,-867)'>
+
+ <rect height='4' id='rect12858' rx='0.38461545' ry='0.50229359' style='color:#000000;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:new' transform='matrix(0,1,-1,0,0,0)' width='4' x='872.99982' y='-157.00041'/>
+ <rect height='4' id='rect12860' rx='0.38461545' ry='0.50229359' style='color:#000000;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:new' transform='matrix(0,1,-1,0,0,0)' width='4' x='872.99982' y='-151.00041'/>
+ <rect height='4' id='rect12862' rx='0.38461545' ry='0.50229359' style='color:#000000;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:new' transform='matrix(0,1,-1,0,0,0)' width='4' x='872.99982' y='-145.00041'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/view-more-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/view-more-symbolic-ref.png
new file mode 100644
index 00000000..1081fa28
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/view-more-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/view-more-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/view-more-symbolic.svg
new file mode 100644
index 00000000..aae2d214
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/view-more-symbolic.svg
@@ -0,0 +1,34 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='view-more-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.4 r9939' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='60.599897' inkscape:cy='545.11648' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='702' inkscape:window-maximized='1' inkscape:window-width='1366' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='119.9998px' originy='650px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ <inkscape:grid color='#000000' empcolor='#000000' empopacity='0' empspacing='4' enabled='true' id='grid5968' opacity='0.1254902' originx='119.9998px' originy='650px' snapvisiblegridlinesonly='true' spacingx='0.5px' spacingy='0.5px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-121.0004,-867)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-121.0004,-867)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-121.0004,-867)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-121.0004,-867)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-121.0004,-867)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-121.0004,-867)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-121.0004,-867)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-121.0004,-867)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-121.0004,-867)'>
+
+ <rect height='4' id='rect20592' rx='0.38461545' ry='0.50229359' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' width='4' x='127.0002' y='867'/>
+ <rect height='4' id='rect16730' rx='0.38461545' ry='0.50229359' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' width='4' x='127.0002' y='873'/>
+ <rect height='4' id='rect16732' rx='0.38461545' ry='0.50229359' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' width='4' x='127.0002' y='879'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/view-paged-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/view-paged-symbolic-ref.png
new file mode 100644
index 00000000..929797dd
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/view-paged-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/view-paged-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/view-paged-symbolic.svg
new file mode 100644
index 00000000..9e157c46
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/view-paged-symbolic.svg
@@ -0,0 +1,34 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='view-paged-symbolic.svg' height='16.000122' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.3.1 r9886' version='1.1' width='16.0002' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='28.341015' inkscape:cy='-17.299568' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='709' inkscape:window-maximized='1' inkscape:window-width='1366' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='80.0002px' originy='650px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-161,-866.99988)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-161,-866.99988)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-161,-866.99988)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-161,-866.99988)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-161,-866.99988)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-161,-866.99988)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-161,-866.99988)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-161,-866.99988)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-161,-866.99988)'>
+
+ <path inkscape:connector-curvature='0' d='m 162,867 0,1 0,11 0,1 1,0 10,0 1,0 0,-1 0,-11 0,-1 -1,0 -10,0 -1,0 z m 2,2 8,0 0,9 -8,0 0,-9 z' id='rect7352-7-94' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.99999988;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 175.0002,869.99988 0,11 -10,0 0,2 12,0 0,-13 z' id='rect7352-7-9-6' sodipodi:nodetypes='ccccccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <rect height='2.0002136' id='rect42942-5-3-1-4-0-0' inkscape:label='a' rx='0.375' ry='0.375' style='opacity:0.35;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible' transform='scale(-1,1)' width='4' x='-170.00021' y='870.99969'/>
+ <rect height='2' id='rect42944-7-5-3-5-1-5-0-8-7' inkscape:label='a' rx='0.375' ry='0.375' style='opacity:0.35;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible' transform='scale(-1,1)' width='3.999999' x='-170.00021' y='873.99988'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/view-pin-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/view-pin-symbolic-ref.png
new file mode 100644
index 00000000..ca908bf7
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/view-pin-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/view-pin-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/view-pin-symbolic.svg
new file mode 100644
index 00000000..59061c69
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/view-pin-symbolic.svg
@@ -0,0 +1,35 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='view-pin-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.92.0 r' viewBox='0 0 16 16' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='0.33689564' inkscape:cy='3.70416' inkscape:document-units='px' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:measure-end='0,0' inkscape:measure-start='0,0' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='3440' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='8'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-79.999998' originy='510' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-321.0002,-727)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-321.0002,-727)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-321.0002,-727)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-321.0002,-727)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-321.0002,-727)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-321.0002,-727)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-321.0002,-727)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-321.0002,-727)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-321.0002,-727)'>
+
+ <path inkscape:connector-curvature='0' d='m 331.0002,730 -3,2 -3,-1 v 7 l 3,-1 3,2 v -4 l 5,-0.48307 -5,-0.51693 z' id='path9895' sodipodi:nodetypes='cccccccccc' style='color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/view-refresh-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/view-refresh-symbolic-ref.png
new file mode 100644
index 00000000..c4f8d0f0
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/view-refresh-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/view-refresh-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/view-refresh-symbolic.svg
new file mode 100644
index 00000000..02cb6ca4
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/view-refresh-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='view-refresh-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.5 r10040' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='false' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='2.2720067' inkscape:cy='5.57145' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1014' inkscape:window-maximized='1' inkscape:window-width='1920' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='2.8284271'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='0px' originy='530px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-241.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-241.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-241.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-241.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-241.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-241.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-241.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-241.0002,-747)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-241.0002,-747)'>
+
+ <path inkscape:connector-curvature='0' d='m 247.71895,749 c -0.19186,0.009 -0.37223,0.0353 -0.5625,0.0625 -1.52218,0.21741 -2.97815,1.02304 -3.96875,2.34375 -1.98119,2.64144 -1.42267,6.42505 1.21875,8.40625 2.64147,1.98122 6.42504,1.42267 8.40625,-1.21875 0.12268,-0.17164 0.18932,-0.38275 0.1875,-0.59375 l 0,-1 -1,0 c -0.31415,-10e-4 -0.62517,0.15406 -0.8125,0.40625 -1.33265,1.77674 -3.81702,2.11387 -5.59375,0.78125 -1.77674,-1.33264 -2.1139,-3.81699 -0.78125,-5.59375 1.33265,-1.77674 3.817,-2.11389 5.59375,-0.78125 0.42946,0.32212 0.76954,0.73295 1.03125,1.1875 l -1.4375,0 c -0.55228,0 -1,0.44772 -1,1 l 0,1 6,0 0,-5 0,-1 -1,0 c -0.55229,0 -1,0.44772 -1,1 l 0,1.6875 c -0.38225,-0.57796 -0.84927,-1.08223 -1.40625,-1.5 -1.15563,-0.86677 -2.53199,-1.25227 -3.875,-1.1875 z' id='path4597' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/view-restore-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/view-restore-symbolic-ref.png
new file mode 100644
index 00000000..c2a85950
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/view-restore-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/view-restore-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/view-restore-symbolic.svg
new file mode 100644
index 00000000..49d0b11a
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/view-restore-symbolic.svg
@@ -0,0 +1,39 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:svg='http://www.w3.org/2000/svg' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' sodipodi:docname='view-restore-symbolic.svg' version='1.1' inkscape:version='0.48.1 r9760' height='16.02426' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16.085251'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:cy='-5.59943' pagecolor='#555753' borderopacity='1' showborder='false' inkscape:bbox-paths='false' guidetolerance='10' inkscape:object-paths='true' inkscape:window-width='1920' showguides='true' inkscape:object-nodes='true' inkscape:snap-bbox='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:snap-nodes='true' bordercolor='#666666' objecttolerance='10' id='namedview88' showgrid='false' inkscape:window-maximized='1' inkscape:window-x='-10' inkscape:snap-global='true' inkscape:window-y='18' gridtolerance='10' inkscape:window-height='1022' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:current-layer='layer12' inkscape:snap-bbox-midpoints='false' inkscape:zoom='4' inkscape:cx='22.192383' inkscape:snap-grids='true' inkscape:pageopacity='1'>
+ <inkscape:grid spacingx='1px' spacingy='1px' id='grid4866' empspacing='2' enabled='true' type='xygrid' snapvisiblegridlinesonly='true' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:label='status' transform='translate(-60.952227,-646.97574)' inkscape:groupmode='layer' id='layer9' style='display:inline'/>
+ <g inkscape:label='devices' transform='translate(-60.952227,-646.97574)' inkscape:groupmode='layer' id='layer10'/>
+ <g inkscape:label='apps' transform='translate(-60.952227,-646.97574)' inkscape:groupmode='layer' id='layer11'/>
+ <g inkscape:label='places' transform='translate(-60.952227,-646.97574)' inkscape:groupmode='layer' id='layer13'/>
+ <g inkscape:label='mimetypes' transform='translate(-60.952227,-646.97574)' inkscape:groupmode='layer' id='layer14'/>
+ <g inkscape:label='emblems' transform='translate(-60.952227,-646.97574)' inkscape:groupmode='layer' id='layer15' style='display:inline'/>
+ <g inkscape:label='emotes' transform='translate(-60.952227,-646.97574)' inkscape:groupmode='layer' id='g71291' style='display:inline'/>
+ <g inkscape:label='categories' transform='translate(-60.952227,-646.97574)' inkscape:groupmode='layer' id='g4953' style='display:inline'/>
+ <g inkscape:label='actions' transform='translate(-60.952227,-646.97574)' inkscape:groupmode='layer' id='layer12' style='display:inline'>
+
+ <path inkscape:connector-curvature='0' d='M 71.78125,647 A 1.0001,1.0001 0 0 0 71,648 l 0,4 a 1.0001,1.0001 0 0 0 1,1 l 4,0 a 1.0001,1.0001 0 1 0 0,-2 l -3,0 0,-3 a 1.0001,1.0001 0 0 0 -1.21875,-1 z' id='path12113-8' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 75.875,647 a 1.0001,1.0001 0 0 0 -0.59375,0.28125 l -4,4 a 1.016466,1.016466 0 1 0 1.4375,1.4375 l 4,-4 A 1.0001,1.0001 0 0 0 75.875,647 z' id='path12147-8' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <rect x='71.000198' y='652' id='rect12919-5' height='1' style='color:#000000;fill:#bdbdbd;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' width='1'/>
+ <path inkscape:connector-curvature='0' d='M 61.90625,653 A 1.0001,1.0001 0 0 0 61,654 l 0,8 a 1.0001,1.0001 0 0 0 1,1 l 8,0 a 1.0001,1.0001 0 0 0 1,-1 l 0,-8 a 1.0001,1.0001 0 0 0 -1,-1 l -8,0 a 1.0001,1.0001 0 0 0 -0.09375,0 z M 63,655 l 6,0 0,6 -6,0 0,-6 z' id='rect13039' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='M 61.90625,655 A 1.001098,1.001098 0 1 0 62,657 l 8,0 a 1.0001,1.0001 0 1 0 0,-2 l -8,0 a 1.0001,1.0001 0 0 0 -0.09375,0 z' id='path13041' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <rect x='76.000198' y='652' id='rect4479-2-9-9-0-8-6' height='1' width='1' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ <rect x='71.000198' y='647' id='rect4479-2-9-9-0-8-6-6' height='1' width='1' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ <rect x='70.000198' y='662' id='rect4479-2-9-9-0-8-6-9' height='1' width='1' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ <rect x='61.000198' y='662' id='rect4479-2-9-9-0-8-6-4' height='1' width='1' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/view-sort-ascending-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/view-sort-ascending-symbolic-ref.png
new file mode 100644
index 00000000..660bbdd2
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/view-sort-ascending-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/view-sort-ascending-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/view-sort-ascending-symbolic.svg
new file mode 100644
index 00000000..bb6fa612
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/view-sort-ascending-symbolic.svg
@@ -0,0 +1,34 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='view-sort-ascending-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.5 r10040' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='36.209643' inkscape:cy='210.11519' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1375' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='39.999799px' originy='650px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-201.0004,-867)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-201.0004,-867)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-201.0004,-867)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-201.0004,-867)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-201.0004,-867)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-201.0004,-867)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-201.0004,-867)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-201.0004,-867)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-201.0004,-867)'>
+
+ <rect height='2' id='rect20747' rx='0.38461545' ry='0.37878788' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' width='2.0000002' x='202.0002' y='870'/>
+ <rect height='2' id='rect20749' rx='0.38461545' ry='0.37878788' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' width='2.0000002' x='202.0002' y='874.01562'/>
+ <rect height='2' id='rect20751' rx='0.38461545' ry='0.37878788' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' width='2.0000002' x='202.0002' y='878'/>
+ <path inkscape:connector-curvature='0' d='m 208.0002,870 0,4 -3.0625,0 5.125,5.78125 5.125,-5.78125 -3.1875,0 0,-4 z' id='rect20753' sodipodi:nodetypes='cccccccc' style='color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/view-sort-descending-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/view-sort-descending-symbolic-ref.png
new file mode 100644
index 00000000..af697afa
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/view-sort-descending-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/view-sort-descending-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/view-sort-descending-symbolic.svg
new file mode 100644
index 00000000..70e2a3b5
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/view-sort-descending-symbolic.svg
@@ -0,0 +1,34 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='view-sort-descending-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.5 r10040' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='16.209643' inkscape:cy='210.11519' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1375' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='19.999799px' originy='650px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-221.0004,-867)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-221.0004,-867)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-221.0004,-867)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-221.0004,-867)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-221.0004,-867)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-221.0004,-867)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-221.0004,-867)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-221.0004,-867)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-221.0004,-867)'>
+
+ <rect height='2' id='rect20781' rx='0.38461545' ry='0.37878788' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' width='2.0000002' x='222.0002' y='870'/>
+ <rect height='2' id='rect20783' rx='0.38461545' ry='0.37878788' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' width='2.0000002' x='222.0002' y='874.01562'/>
+ <rect height='2' id='rect20785' rx='0.38461545' ry='0.37878788' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' width='2.0000002' x='222.0002' y='878'/>
+ <path inkscape:connector-curvature='0' d='m 228.0002,879.78125 0,-4 -3.0625,0 5.125,-5.78125 5.125,5.78125 -3.1875,0 0,4 z' id='path20787' sodipodi:nodetypes='cccccccc' style='color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/view-wrapped-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/view-wrapped-symbolic-ref.png
new file mode 100644
index 00000000..edc776d1
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/view-wrapped-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/view-wrapped-symbolic-rtl-ref.png b/rsvg/tests/fixtures/reftests/adwaita/view-wrapped-symbolic-rtl-ref.png
new file mode 100644
index 00000000..13667b60
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/view-wrapped-symbolic-rtl-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/view-wrapped-symbolic-rtl.svg b/rsvg/tests/fixtures/reftests/adwaita/view-wrapped-symbolic-rtl.svg
new file mode 100644
index 00000000..7c88ce73
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/view-wrapped-symbolic-rtl.svg
@@ -0,0 +1,34 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='view-wrapped-symbolic-rtl.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='94.107767' inkscape:cy='-496.71844' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1280' inkscape:window-maximized='0' inkscape:window-width='1351' inkscape:window-x='3090' inkscape:window-y='0' inkscape:zoom='32'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='100.00026px' originy='80px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-140.99994,-297)'>
+
+ <path inkscape:connector-curvature='0' d='m 142.78125,302 a 1.0001,1.0001 0 0 0 -0.5,1.71875 l 2,2 0.71875,0.6875 0.71875,-0.6875 2,-2 a 1.016466,1.016466 0 1 0 -1.4375,-1.4375 L 145,303.5625 143.71875,302.28125 A 1.0001,1.0001 0 0 0 142.78125,302 z' id='path5606' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 147,298 c -1.6447,0 -3,1.3553 -3,3 l 0,4 2,0 0,-4 c 0,-0.5713 0.4287,-1 1,-1 l 4,0 c 0.5713,0 1,0.4287 1,1 l 0,8 c 0,0.5713 -0.4287,1 -1,1 l -4,0 0,2 4,0 c 1.6447,0 3,-1.3553 3,-3 l 0,-8 c 0,-1.6447 -1.3553,-3 -3,-3 l -4,0 z' id='path5608' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <rect height='1' id='rect5610' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' transform='matrix(0,-1,-1,0,0,0)' width='1' x='-302.99994' y='-147.99994'/>
+ <rect height='1' id='rect5612' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' transform='matrix(0,-1,-1,0,0,0)' width='1' x='-302.99994' y='-142.99994'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-140.99994,-297)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-140.99994,-297)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-140.99994,-297)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-140.99994,-297)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-140.99994,-297)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-140.99994,-297)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-140.99994,-297)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-140.99994,-297)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/view-wrapped-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/view-wrapped-symbolic.svg
new file mode 100644
index 00000000..8c135fb1
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/view-wrapped-symbolic.svg
@@ -0,0 +1,34 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='view-wrapped-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.4 r9939' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='74.362382' inkscape:cy='-24.22881' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1377' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='5.6568542'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='120.00025px' originy='80px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-120.99995,-297)'>
+
+ <path inkscape:connector-curvature='0' d='m 130.78125,302 a 1.0001,1.0001 0 0 0 -0.5,1.71875 l 2,2 0.71875,0.6875 0.71875,-0.6875 2,-2 a 1.016466,1.016466 0 1 0 -1.4375,-1.4375 L 133,303.5625 131.71875,302.28125 A 1.0001,1.0001 0 0 0 130.78125,302 z' id='path8023' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 127,298 c -1.6447,0 -3,1.3553 -3,3 l 0,8 c 0,1.6447 1.3553,3 3,3 l 4,0 0,-2 -4,0 c -0.5713,0 -1,-0.4287 -1,-1 l 0,-8 c 0,-0.5713 0.4287,-1 1,-1 l 4,0 c 0.5713,0 1,0.4287 1,1 l 0,4 2,0 0,-4 c 0,-1.6447 -1.3553,-3 -3,-3 l -4,0 z' id='path8025' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <rect height='1' id='rect8027' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' transform='matrix(0,-1,1,0,0,0)' width='1' x='-302.99994' y='129.99995'/>
+ <rect height='1' id='rect8029' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' transform='matrix(0,-1,1,0,0,0)' width='1' x='-302.99994' y='134.99995'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-120.99995,-297)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-120.99995,-297)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-120.99995,-297)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-120.99995,-297)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-120.99995,-297)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-120.99995,-297)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-120.99995,-297)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-120.99995,-297)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/weather-clear-night-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/weather-clear-night-symbolic-ref.png
new file mode 100644
index 00000000..2babf3bd
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/weather-clear-night-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/weather-clear-night-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/weather-clear-night-symbolic.svg
new file mode 100644
index 00000000..f2f029bc
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/weather-clear-night-symbolic.svg
@@ -0,0 +1,36 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='weather-clear-night-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.92.0 r' viewBox='0 0 16 16' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='21.992875' inkscape:cy='3.150972' inkscape:document-units='px' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:measure-end='0,0' inkscape:measure-start='0,0' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='421' inkscape:window-maximized='0' inkscape:window-width='517' inkscape:window-x='2560' inkscape:window-y='556' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='20.0002' originy='60' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-221,-277)'>
+
+ <path inkscape:connector-curvature='0' d='m 227.81465,278.10742 c -3.29556,0.56457 -5.82226,3.44081 -5.82226,6.89258 0,3.85416 3.1478,7 7.00195,7 1.75049,0 3.3501,-0.65308 4.58008,-1.72266 -3.77539,-0.98237 -6.58203,-4.41767 -6.58203,-8.49218 0,-1.31409 0.30056,-2.55627 0.82226,-3.67774 z' id='path4034-2-5' style='color:#bebebe;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:Sans;-inkscape-font-specification:Sans;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.47313595;marker:none;enable-background:new'/>
+ <path inkscape:connector-curvature='0' d='m 228.99434,278 c -0.40239,0 -0.7955,0.0416 -1.17969,0.10742 -0.5217,1.12147 -0.82226,2.36365 -0.82226,3.67774 0,4.07451 2.80664,7.50981 6.58203,8.49218 1.47813,-1.28537 2.41992,-3.17367 2.41992,-5.27734 0,-3.85416 -3.14584,-7 -7,-7 z' id='path12211' style='color:#bebebe;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:Sans;-inkscape-font-specification:Sans;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-anchor:start;display:inline;overflow:visible;visibility:visible;opacity:0.35;vector-effect:none;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-221,-277)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-221,-277)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-221,-277)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-221,-277)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-221,-277)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-221,-277)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-221,-277)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-221,-277)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/weather-clear-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/weather-clear-symbolic-ref.png
new file mode 100644
index 00000000..a955183f
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/weather-clear-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/weather-clear-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/weather-clear-symbolic.svg
new file mode 100644
index 00000000..26318d07
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/weather-clear-symbolic.svg
@@ -0,0 +1,43 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='weather-clear-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.92.0 r' viewBox='0 0 16.0002 16' width='16.0002' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='41.992875' inkscape:cy='3.150972' inkscape:document-units='px' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:measure-end='0,0' inkscape:measure-start='0,0' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='3440' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='40.000199' originy='60' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-201,-277)'>
+
+ <path inkscape:connector-curvature='0' d='m 208.99561,279.99373 c -2.74958,0 -5.00632,2.25675 -5.00632,5.00633 0,2.74958 2.25674,5.00633 5.00632,5.00633 2.74958,0 5.00632,-2.25675 5.00632,-5.00633 0,-2.74958 -2.25674,-5.00633 -5.00632,-5.00633 z' id='path7834' sodipodi:nodetypes='sssss' style='color:#bebebe;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:Sans;-inkscape-font-specification:Sans;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.20970368;marker:none;enable-background:new'/>
+ <path inkscape:connector-curvature='0' d='m 215.0002,284 c 0.13761,0.71253 0.11183,1.37061 0,2 l 2,-1 z' id='path12258' sodipodi:nodetypes='cccc' style='color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 203.0002,284 c -0.13761,0.71253 -0.11183,1.37061 0,2 l -2,-1 z' id='path12274' sodipodi:nodetypes='cccc' style='color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 210.00019,291 c -0.71251,0.1376 -1.3706,0.11183 -1.99999,0 l 1,1.99999 z' id='path12276' sodipodi:nodetypes='cccc' style='color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 210.0002,279 c -0.71253,-0.1376 -1.37061,-0.11184 -1.99999,0 l 0.99999,-1.99999 z' id='path12278' sodipodi:nodetypes='cccc' style='color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 205.46466,289.94974 c -0.60112,-0.40652 -1.04823,-0.89009 -1.41421,-1.4142 l -0.7071,2.12131 z' id='path12280' sodipodi:nodetypes='cccc' style='color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 213.94995,281.46446 c -0.40654,-0.60112 -0.89009,-1.04824 -1.41421,-1.4142 l 2.12131,-0.70711 z' id='path12282' sodipodi:nodetypes='cccc' style='color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 204.05046,281.46446 c 0.40651,-0.60112 0.89009,-1.04823 1.4142,-1.41421 l -2.12131,-0.7071 z' id='path12284' sodipodi:nodetypes='cccc' style='color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 212.53574,289.94975 c 0.60113,-0.40655 1.04824,-0.89009 1.4142,-1.41421 l 0.70711,2.12131 z' id='path12286' sodipodi:nodetypes='cccc' style='color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-201,-277)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-201,-277)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-201,-277)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-201,-277)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-201,-277)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-201,-277)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-201,-277)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-201,-277)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/weather-few-clouds-night-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/weather-few-clouds-night-symbolic-ref.png
new file mode 100644
index 00000000..bc40eed2
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/weather-few-clouds-night-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/weather-few-clouds-night-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/weather-few-clouds-night-symbolic.svg
new file mode 100644
index 00000000..5a099e2b
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/weather-few-clouds-night-symbolic.svg
@@ -0,0 +1,37 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='weather-few-clouds-night-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.92.0 r' viewBox='0 0 16 16' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='-18.007125' inkscape:cy='3.150972' inkscape:document-units='px' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:measure-end='0,0' inkscape:measure-start='0,0' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='3440' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-19.9998' originy='60' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-261,-277)'>
+
+ <path inkscape:connector-curvature='0' d='m 270.5,287 c -1.38071,0 -2.5,1.11929 -2.5,2.5 0,0.21842 0.0411,0.42306 0.0937,0.625 C 267.91429,290.0491 267.70711,290 267.5,290 c -0.82843,0 -1.5,0.67157 -1.5,1.5 0,0.82843 0.67157,1.5 1.5,1.5 h 8 c 0.82843,0 1.5,-0.67157 1.5,-1.5 0,-0.82843 -0.67157,-1.5 -1.5,-1.5 0,-1.10457 -0.89543,-2 -2,-2 -0.31572,0 -0.60948,0.0885 -0.875,0.21875 C 272.18795,287.49096 271.41074,287 270.5,287 Z' id='path5094-5-03-1' sodipodi:nodetypes='sscssccscscs' style='color:#000000;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2.40000033;marker:none;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 267.82051,278.10742 c -3.29557,0.56457 -5.82226,3.44081 -5.82226,6.89258 0,2.32958 1.15511,4.3942 2.91601,5.66797 0.31106,-0.81261 1.06329,-1.39352 1.94141,-1.63867 0.14016,-1.04685 0.70749,-1.95871 1.51562,-2.55469 -0.86632,-1.35806 -1.37304,-2.9648 -1.37304,-4.68945 0,-1.31408 0.30055,-2.55627 0.82226,-3.67774 z' id='path4034-2-5-8' style='color:#bebebe;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:Sans;-inkscape-font-specification:Sans;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.47313595;marker:none;enable-background:new'/>
+ <path inkscape:connector-curvature='0' d='m 269.0002,278 c -0.40239,0 -0.79551,0.0416 -1.17969,0.10742 -0.52171,1.12147 -0.82226,2.36366 -0.82226,3.67774 0,1.72465 0.50672,3.33139 1.37304,4.68945 0.59893,-0.44169 1.32667,-0.71484 2.12891,-0.71484 0.99742,0 1.82032,0.48451 2.48633,1.125 0.17967,-0.0347 0.31584,-0.125 0.51367,-0.125 0.77504,0 1.47338,0.28828 2.01953,0.75585 0.30505,-0.78201 0.48047,-1.62774 0.48047,-2.51562 0,-3.85416 -3.14584,-7 -7,-7 z' id='path12211-9' style='color:#bebebe;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:Sans;-inkscape-font-specification:Sans;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-anchor:start;display:inline;overflow:visible;visibility:visible;opacity:0.35;vector-effect:none;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-261,-277)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-261,-277)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-261,-277)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-261,-277)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-261,-277)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-261,-277)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-261,-277)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-261,-277)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/weather-few-clouds-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/weather-few-clouds-symbolic-ref.png
new file mode 100644
index 00000000..2d15a4cc
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/weather-few-clouds-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/weather-few-clouds-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/weather-few-clouds-symbolic.svg
new file mode 100644
index 00000000..713a59a2
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/weather-few-clouds-symbolic.svg
@@ -0,0 +1,42 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='weather-few-clouds-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.92.0 r' viewBox='0 0 16.0002 16' width='16.0002' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='1.9928753' inkscape:cy='3.150972' inkscape:document-units='px' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:measure-end='0,0' inkscape:measure-start='0,0' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='3440' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='0.0002' originy='60' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-241,-277)'>
+
+ <path inkscape:connector-curvature='0' d='m 249,280 c -2.74958,0 -5,2.25041 -5,5 0,1.78334 0.9576,3.36255 2.375,4.25 0.16853,-0.0758 0.34883,-0.13986 0.53125,-0.1875 0.22859,-1.81667 1.71945,-3.25 3.59375,-3.25 1.00251,0 1.83852,0.47365 2.5,1.125 0.175,-0.0333 0.30776,-0.125 0.5,-0.125 0.0432,0 0.0823,-0.002 0.125,0 0.22408,-0.56633 0.375,-1.16979 0.375,-1.8125 0,-2.74959 -2.25042,-5 -5,-5 z' id='path552' style='color:#bebebe;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:Sans;-inkscape-font-specification:Sans;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.20970368;marker:none;enable-background:new'/>
+ <path inkscape:connector-curvature='0' d='m 250.5,287 c -1.38071,0 -2.5,1.11929 -2.5,2.5 0,0.21842 0.0411,0.42306 0.0937,0.625 C 247.91429,290.0491 247.70711,290 247.5,290 c -0.82843,0 -1.5,0.67157 -1.5,1.5 0,0.82843 0.67157,1.5 1.5,1.5 h 8 c 0.82843,0 1.5,-0.67157 1.5,-1.5 0,-0.82843 -0.67157,-1.5 -1.5,-1.5 0,-1.10457 -0.89543,-2 -2,-2 -0.31572,0 -0.60948,0.0885 -0.875,0.21875 C 252.18795,287.49096 251.41074,287 250.5,287 Z' id='path5094-5-03' sodipodi:nodetypes='sscssccscscs' style='color:#000000;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2.40000033;marker:none;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 255.0002,284 c 0.13761,0.71253 0.11183,1.37061 0,2 l 2,-1 z' id='path12258-3' sodipodi:nodetypes='cccc' style='color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 243.0002,284 c -0.1376,0.71253 -0.11183,1.37061 0,2 l -2,-1 z' id='path12274-1' sodipodi:nodetypes='cccc' style='color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 250.0002,279 c -0.71253,-0.1376 -1.37061,-0.11184 -1.99999,0 l 0.99999,-1.99999 z' id='path12278-4' sodipodi:nodetypes='cccc' style='color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 245.46466,289.94974 c -0.60112,-0.40652 -1.04823,-0.89009 -1.41421,-1.4142 l -0.7071,2.12131 z' id='path12280-8' sodipodi:nodetypes='cccc' style='color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 253.94995,281.46446 c -0.40654,-0.60112 -0.89009,-1.04824 -1.41421,-1.4142 l 2.12131,-0.70711 z' id='path12282-9' sodipodi:nodetypes='cccc' style='color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 244.05046,281.46446 c 0.40651,-0.60112 0.89009,-1.04823 1.4142,-1.41421 l -2.12131,-0.7071 z' id='path12284-6' sodipodi:nodetypes='cccc' style='color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-241,-277)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-241,-277)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-241,-277)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-241,-277)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-241,-277)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-241,-277)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-241,-277)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-241,-277)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/weather-fog-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/weather-fog-symbolic-ref.png
new file mode 100644
index 00000000..51b1dfc1
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/weather-fog-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/weather-fog-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/weather-fog-symbolic.svg
new file mode 100644
index 00000000..ffc99548
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/weather-fog-symbolic.svg
@@ -0,0 +1,33 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='weather-fog-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.4 r9939' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='61.253988' inkscape:cy='-357.4382' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1403' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='0' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='-39.9998px' originy='60px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-281,-277)'>
+
+ <path inkscape:connector-curvature='0' d='m 284.3125,278 c -0.62347,-2.7e-4 -1.00842,0.32909 -1.28125,0.59375 -0.27283,0.26466 -0.46296,0.53122 -0.65625,0.78125 -0.19329,0.25003 -0.38625,0.48341 -0.5,0.59375 -0.11375,0.11034 -0.1119,0.0312 0.125,0.0312 a 1,1 0 1 0 0,2 c 0.62347,2.7e-4 1.00843,-0.32909 1.28125,-0.59375 0.27282,-0.26466 0.46296,-0.56247 0.65625,-0.8125 0.14196,-0.18364 0.26887,-0.28618 0.375,-0.40625 0.10618,0.12021 0.23303,0.22249 0.375,0.40625 0.19329,0.25019 0.41477,0.54771 0.6875,0.8125 0.27273,0.26479 0.62653,0.59348 1.25,0.59375 0.62346,2.7e-4 1.00842,-0.32909 1.28125,-0.59375 0.27283,-0.26466 0.49421,-0.56247 0.6875,-0.8125 0.14681,-0.18991 0.23598,-0.31677 0.34375,-0.4375 0.10941,0.12126 0.22291,0.24063 0.375,0.4375 0.19329,0.25019 0.41478,0.54771 0.6875,0.8125 0.27272,0.26479 0.65778,0.59348 1.28125,0.59375 0.62346,2.7e-4 1.00842,-0.32909 1.28125,-0.59375 0.27283,-0.26466 0.46296,-0.56247 0.65625,-0.8125 0.14197,-0.18364 0.26887,-0.28618 0.375,-0.40625 0.10618,0.12021 0.23303,0.22249 0.375,0.40625 0.19329,0.25019 0.38353,0.54771 0.65625,0.8125 0.27272,0.26479 0.65777,0.59348 1.28125,0.59375 a 1.0004882,1.0004882 0 1 0 0.0625,-2 c 0.0195,0.008 0.12277,0.0273 0.0625,-0.0312 -0.11385,-0.11054 -0.30671,-0.34356 -0.5,-0.59375 -0.19329,-0.25019 -0.38352,-0.51646 -0.65625,-0.78125 -0.27273,-0.26479 -0.65778,-0.59348 -1.28125,-0.59375 -0.62347,-2.7e-4 -1.00842,0.32909 -1.28125,0.59375 -0.27283,0.26466 -0.46296,0.53122 -0.65625,0.78125 -0.14943,0.19329 -0.26641,0.34779 -0.375,0.46875 -0.10977,-0.12129 -0.22162,-0.27022 -0.375,-0.46875 -0.19329,-0.25019 -0.41477,-0.51646 -0.6875,-0.78125 -0.27273,-0.26479 -0.62653,-0.59348 -1.25,-0.59375 -0.62347,-2.7e-4 -1.00842,0.32909 -1.28125,0.59375 -0.27283,0.26466 -0.49421,0.53122 -0.6875,0.78125 -0.15337,0.1984 -0.26529,0.34761 -0.375,0.46875 -0.10833,-0.12103 -0.19532,-0.27662 -0.34375,-0.46875 -0.19329,-0.25019 -0.41477,-0.51646 -0.6875,-0.78125 -0.27273,-0.26479 -0.65778,-0.59348 -1.28125,-0.59375 z' id='path5123' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.5;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.99469662;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 284.3125,283 c -0.62347,-2.7e-4 -1.00842,0.32909 -1.28125,0.59375 -0.27283,0.26466 -0.46296,0.53122 -0.65625,0.78125 -0.19329,0.25003 -0.38625,0.48341 -0.5,0.59375 -0.11375,0.11034 -0.11191,0.0312 0.125,0.0312 a 1,1 0 1 0 0,2 c 0.62348,2.7e-4 1.00843,-0.32909 1.28125,-0.59375 0.27282,-0.26466 0.46296,-0.56247 0.65625,-0.8125 0.14196,-0.18364 0.26887,-0.28618 0.375,-0.40625 0.10618,0.12021 0.23303,0.22249 0.375,0.40625 0.19329,0.2502 0.41477,0.54771 0.6875,0.8125 0.27273,0.26479 0.62652,0.59348 1.25,0.59375 0.62347,2.7e-4 1.00842,-0.32909 1.28125,-0.59375 0.27283,-0.26466 0.49421,-0.56247 0.6875,-0.8125 0.14681,-0.18991 0.23598,-0.31677 0.34375,-0.4375 0.10941,0.12126 0.22291,0.24062 0.375,0.4375 0.19329,0.2502 0.41478,0.5477 0.6875,0.8125 0.27272,0.2648 0.65777,0.59348 1.28125,0.59375 0.62347,2.7e-4 1.00842,-0.32909 1.28125,-0.59375 0.27283,-0.26466 0.46296,-0.56247 0.65625,-0.8125 0.14197,-0.18364 0.26887,-0.28618 0.375,-0.40625 0.10618,0.12021 0.23303,0.22249 0.375,0.40625 0.19329,0.2502 0.38353,0.54771 0.65625,0.8125 0.27272,0.26479 0.65777,0.59348 1.28125,0.59375 a 1.0004882,1.0004882 0 1 0 0.0625,-2 c 0.0195,0.008 0.12277,0.0273 0.0625,-0.0312 -0.11385,-0.11054 -0.30671,-0.34355 -0.5,-0.59375 -0.19329,-0.2502 -0.38352,-0.51646 -0.65625,-0.78125 -0.27273,-0.26479 -0.65778,-0.59348 -1.28125,-0.59375 -0.62347,-2.7e-4 -1.00842,0.32909 -1.28125,0.59375 -0.27283,0.26466 -0.46296,0.53122 -0.65625,0.78125 -0.14943,0.1933 -0.26641,0.34779 -0.375,0.46875 -0.10977,-0.12129 -0.22162,-0.27022 -0.375,-0.46875 -0.19329,-0.2502 -0.41477,-0.51645 -0.6875,-0.78125 -0.27273,-0.2648 -0.62653,-0.59348 -1.25,-0.59375 -0.62347,-2.7e-4 -1.00843,0.32909 -1.28125,0.59375 -0.27282,0.26466 -0.49421,0.53122 -0.6875,0.78125 -0.15337,0.1984 -0.26529,0.34761 -0.375,0.46875 -0.10833,-0.12104 -0.19532,-0.27662 -0.34375,-0.46875 -0.19329,-0.2502 -0.41477,-0.51646 -0.6875,-0.78125 -0.27273,-0.26479 -0.65777,-0.59348 -1.28125,-0.59375 z' id='path5123-0' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.5;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.99469662;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 284.3125,288 c -0.62347,-2.7e-4 -1.00842,0.32909 -1.28125,0.59375 -0.27283,0.26466 -0.46296,0.53122 -0.65625,0.78125 -0.19329,0.25003 -0.38625,0.48341 -0.5,0.59375 -0.11375,0.11034 -0.1119,0.0312 0.125,0.0312 a 1,1 0 1 0 0,2 c 0.62347,2.7e-4 1.00843,-0.32909 1.28125,-0.59375 0.27282,-0.26466 0.46296,-0.56247 0.65625,-0.8125 0.14196,-0.18364 0.26887,-0.28618 0.375,-0.40625 0.10618,0.12021 0.23303,0.22249 0.375,0.40625 0.19329,0.25019 0.41477,0.54771 0.6875,0.8125 0.27273,0.26479 0.62653,0.59348 1.25,0.59375 0.62346,2.7e-4 1.00842,-0.32909 1.28125,-0.59375 0.27283,-0.26466 0.49421,-0.56247 0.6875,-0.8125 0.14681,-0.18991 0.23598,-0.31677 0.34375,-0.4375 0.10941,0.12126 0.22291,0.24063 0.375,0.4375 0.19329,0.25019 0.41478,0.54771 0.6875,0.8125 0.27272,0.26479 0.65778,0.59348 1.28125,0.59375 0.62346,2.7e-4 1.00842,-0.32909 1.28125,-0.59375 0.27283,-0.26466 0.46296,-0.56247 0.65625,-0.8125 0.14197,-0.18364 0.26887,-0.28618 0.375,-0.40625 0.10671,0.12045 0.23152,0.25178 0.375,0.4375 0.19329,0.25019 0.38353,0.51646 0.65625,0.78125 0.27272,0.26479 0.65777,0.59348 1.28125,0.59375 a 1.0004882,1.0004882 0 1 0 0.0625,-2 c 0.0195,0.008 0.12277,0.0273 0.0625,-0.0312 -0.11385,-0.11054 -0.30671,-0.34356 -0.5,-0.59375 -0.19329,-0.25019 -0.38352,-0.51646 -0.65625,-0.78125 -0.27273,-0.26479 -0.65778,-0.59348 -1.28125,-0.59375 -0.62347,-2.7e-4 -1.00842,0.32909 -1.28125,0.59375 -0.27283,0.26466 -0.46296,0.53122 -0.65625,0.78125 -0.14943,0.19329 -0.26641,0.34779 -0.375,0.46875 -0.10977,-0.12129 -0.22162,-0.27022 -0.375,-0.46875 -0.19329,-0.25019 -0.41477,-0.51646 -0.6875,-0.78125 -0.27273,-0.26479 -0.62653,-0.59348 -1.25,-0.59375 -0.62347,-2.7e-4 -1.00842,0.32909 -1.28125,0.59375 -0.27283,0.26466 -0.49421,0.53122 -0.6875,0.78125 -0.15337,0.1984 -0.26529,0.34761 -0.375,0.46875 -0.10833,-0.12103 -0.19532,-0.27662 -0.34375,-0.46875 -0.19329,-0.25019 -0.41477,-0.51646 -0.6875,-0.78125 -0.27273,-0.26479 -0.65778,-0.59348 -1.28125,-0.59375 z' id='path5123-0-9' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.5;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.99469662;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-281,-277)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-281,-277)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-281,-277)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-281,-277)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-281,-277)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-281,-277)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-281,-277)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-281,-277)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/weather-overcast-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/weather-overcast-symbolic-ref.png
new file mode 100644
index 00000000..b196e140
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/weather-overcast-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/weather-overcast-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/weather-overcast-symbolic.svg
new file mode 100644
index 00000000..62136d1e
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/weather-overcast-symbolic.svg
@@ -0,0 +1,30 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:svg='http://www.w3.org/2000/svg' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' version='1.1' inkscape:version='0.48+devel r9873 custom' height='16' sodipodi:docname='weather-overcast-symbolic.svg' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:object-paths='true' inkscape:cy='-11.950593' inkscape:current-layer='layer9' inkscape:window-width='1280' pagecolor='#555753' showborder='false' showguides='true' inkscape:snap-nodes='false' objecttolerance='10' showgrid='true' inkscape:object-nodes='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:window-x='0' inkscape:snap-bbox='true' bordercolor='#666666' id='namedview88' inkscape:window-maximized='1' inkscape:snap-global='false' inkscape:window-y='26' gridtolerance='10' inkscape:zoom='22.576098' inkscape:window-height='743' borderopacity='1' guidetolerance='10' inkscape:snap-bbox-midpoints='false' inkscape:cx='26.143965' inkscape:bbox-paths='false' inkscape:snap-grids='true' inkscape:pageopacity='1' inkscape:snap-to-guides='true'>
+ <inkscape:grid visible='true' spacingx='1px' type='xygrid' spacingy='1px' id='grid4866' empspacing='2' enabled='true' snapvisiblegridlinesonly='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g transform='translate(-161,-277)' inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline'>
+
+ <path inkscape:connector-curvature='0' d='m 170.5,281 c -1.28379,0 -2.32658,0.97301 -2.46875,2.21875 C 167.70449,283.09667 167.36934,283 167,283 c -1.65685,0 -3,1.34315 -3,3 0,0.0982 0.022,0.1855 0.0312,0.28125 C 163.73151,286.10201 163.37464,286 163,286 c -1.10457,0 -2,0.89543 -2,2 0,1.10457 0.89543,2 2,2 l 12.5,0 c 0.82843,0 1.5,-0.67157 1.5,-1.5 0,-0.82843 -0.67157,-1.5 -1.5,-1.5 -0.20711,0 -0.41429,0.0491 -0.59375,0.125 0.0526,-0.20194 0.0937,-0.40658 0.0937,-0.625 0,-1.22936 -0.89334,-2.22819 -2.0625,-2.4375 0.0419,-0.18136 0.0625,-0.36843 0.0625,-0.5625 0,-1.38071 -1.11929,-2.5 -2.5,-2.5 z' id='path5094-5-04-4-6-4-8' sodipodi:nodetypes='ccsscssccsscscscc' style='color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2.40000033;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ </g>
+ <g transform='translate(-161,-277)' inkscape:groupmode='layer' id='layer10' inkscape:label='devices'/>
+ <g transform='translate(-161,-277)' inkscape:groupmode='layer' id='layer11' inkscape:label='apps'/>
+ <g transform='translate(-161,-277)' inkscape:groupmode='layer' id='layer12' inkscape:label='actions'/>
+ <g transform='translate(-161,-277)' inkscape:groupmode='layer' id='layer13' inkscape:label='places'/>
+ <g transform='translate(-161,-277)' inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes'/>
+ <g transform='translate(-161,-277)' inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline'/>
+ <g transform='translate(-161,-277)' inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/weather-severe-alert-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/weather-severe-alert-symbolic-ref.png
new file mode 100644
index 00000000..eb5afaec
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/weather-severe-alert-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/weather-severe-alert-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/weather-severe-alert-symbolic.svg
new file mode 100644
index 00000000..fb0a1e41
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/weather-severe-alert-symbolic.svg
@@ -0,0 +1,33 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='weather-severe-alert-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.4 r9939' version='1.1' width='16.0002' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='-28.715991' inkscape:cy='-361.9103' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='702' inkscape:window-maximized='1' inkscape:window-width='1366' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='-59.9998px' originy='60px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ <inkscape:grid color='#000000' empcolor='#000000' empopacity='0' empspacing='4' enabled='true' id='grid5968' opacity='0.1254902' originx='-59.9998px' originy='60px' snapvisiblegridlinesonly='true' spacingx='0.5px' spacingy='0.5px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-301,-277)'>
+
+ <path inkscape:connector-curvature='0' d='m 310.5,279 c -1.28379,0 -2.32658,0.97301 -2.46875,2.21875 C 307.70449,281.09667 307.36934,281 307,281 c -1.65685,0 -3,1.34315 -3,3 0,0.0982 0.0221,0.1855 0.0312,0.28125 C 303.73156,284.10201 303.37464,284 303,284 c -1.10457,0 -2,0.89543 -2,2 0,1.10457 0.89543,2 2,2 l 5,0 0,-2.125 c 0,-1.01034 0.86465,-1.875 1.875,-1.875 l 5.0625,0 c -0.20912,-0.9858 -0.99904,-1.7583 -2,-1.9375 0.0419,-0.18136 0.0625,-0.36843 0.0625,-0.5625 0,-1.38071 -1.11929,-2.5 -2.5,-2.5 z' id='path5094-5-04-4-6-4-8-1' style='color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2.40000033;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ <path class='warning' inkscape:connector-curvature='0' d='m 309.8752,285 c -0.49245,0 -0.875,0.38256 -0.875,0.875 l 0,6.25 c 0,0.49244 0.38255,0.875 0.875,0.875 l 6.25,0 c 0.49245,0 0.875,-0.38256 0.875,-0.875 l 0,-6.25 c 0,-0.49244 -0.38255,-0.875 -0.875,-0.875 l -6.25,0 z m 2.125,1 2,0 0,4 -2,0 0,-4 z m 0,5 2,0 0,1 -2,0 0,-1 z' id='path10898-2' sodipodi:nodetypes='ccccccccccccccccccc' style='color:#bebebe;fill:#f57900;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-301,-277)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-301,-277)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-301,-277)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-301,-277)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-301,-277)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-301,-277)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-301,-277)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-301,-277)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/weather-showers-scattered-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/weather-showers-scattered-symbolic-ref.png
new file mode 100644
index 00000000..33ac4e7b
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/weather-showers-scattered-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/weather-showers-scattered-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/weather-showers-scattered-symbolic.svg
new file mode 100644
index 00000000..869ee0db
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/weather-showers-scattered-symbolic.svg
@@ -0,0 +1,33 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns='http://www.w3.org/2000/svg' height='16' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:svg='http://www.w3.org/2000/svg' sodipodi:docname='weather-showers-scattered-symbolic.svg' xmlns:dc='http://purl.org/dc/elements/1.1/' width='16' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' version='1.1' inkscape:version='0.48.1 r9760'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:snap-nodes='true' inkscape:cx='13.654905' inkscape:cy='9.180392' inkscape:snap-to-guides='true' inkscape:window-x='2259' inkscape:window-y='356' inkscape:bbox-paths='false' bordercolor='#666666' borderopacity='1' objecttolerance='10' id='namedview88' inkscape:snap-bbox-midpoints='false' inkscape:guide-bbox='true' inkscape:pageshadow='2' inkscape:snap-bbox='true' inkscape:window-width='1226' inkscape:window-maximized='0' showgrid='false' inkscape:current-layer='layer9' pagecolor='#555753' inkscape:pageopacity='1' inkscape:window-height='967' inkscape:snap-global='true' inkscape:object-nodes='false' inkscape:snap-grids='true' gridtolerance='10' showguides='true' inkscape:zoom='16' guidetolerance='10' inkscape:snap-others='false' showborder='false' inkscape:object-paths='false'>
+ <inkscape:grid id='grid4866' type='xygrid' visible='true' snapvisiblegridlinesonly='true' empspacing='2' enabled='true' spacingx='1px' spacingy='1px'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g id='layer9' transform='translate(-201,-277)' style='display:inline' inkscape:label='status' inkscape:groupmode='layer'>
+
+ <path id='path5094-5-04-4-6' d='m 210.49169,278 c -1.27668,0 -2.31369,0.97301 -2.45508,2.21875 C 207.71166,280.09667 207.37837,280 207.01107,280 c -1.64767,0 -2.98339,1.34315 -2.98339,3 0,0.0982 0.0219,0.1855 0.031,0.28125 C 203.76073,283.10201 203.40579,283 203.03322,283 c -1.09845,0 -1.98893,0.89543 -1.98893,2 0,1.10457 0.89048,2 1.98893,2 l 0.37293,0 c 0.16455,-0.35221 0.36642,-0.68097 0.65261,-0.96875 l 2.45508,-2.46875 2.45508,2.46875 c 0.28329,0.28486 0.46455,0.62003 0.62154,0.96875 l 0.46616,0 1.42954,-1.4375 1.42954,1.4375 2.54831,0 c 0.82384,0 1.4917,-0.67157 1.4917,-1.5 0,-0.82843 -0.66786,-1.5 -1.4917,-1.5 -0.20596,0 -0.412,0.0491 -0.59046,0.125 0.0524,-0.20194 0.0931,-0.40658 0.0931,-0.625 0,-1.22936 -0.88839,-2.22819 -2.05108,-2.4375 0.0417,-0.18136 0.0621,-0.36843 0.0621,-0.5625 0,-1.38071 -1.11309,-2.5 -2.48615,-2.5 z' style='color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2.40000033;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' inkscape:connector-curvature='0'/>
+ <path id='path5927-5-0-8-7-0-1' d='m 206.5,284.90625 -0.34375,0.375 -1.4375,1.40625 c -0.97212,0.97212 -0.97212,2.55913 0,3.53125 0.97212,0.97212 2.59038,0.97213 3.5625,0 0.97212,-0.97212 0.97212,-2.55913 0,-3.53125 l -1.4375,-1.40625 -0.34375,-0.375 z m 0,1.40625 1.0625,1.09375 c 0.58998,0.58998 0.58998,1.53502 0,2.125 -0.58996,0.58997 -1.53502,0.58998 -2.125,0 l 0,-0.0312 c -0.56791,-0.59117 -0.58256,-1.51119 0,-2.09375 L 206.5,286.3125 z' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans' inkscape:connector-curvature='0'/>
+ <path id='path5927-5-0-8-7-0-4' d='m 211.5,286.90625 -0.34375,0.375 -1.4375,1.40625 c -0.97212,0.97212 -0.97212,2.55913 0,3.53125 0.97212,0.97212 2.59038,0.97213 3.5625,0 0.97212,-0.97212 0.97212,-2.55913 0,-3.53125 l -1.4375,-1.40625 -0.34375,-0.375 z m 0,1.40625 1.0625,1.09375 c 0.58998,0.58998 0.58998,1.53502 0,2.125 -0.58996,0.58997 -1.53502,0.58998 -2.125,0 l 0,-0.0312 c -0.56791,-0.59117 -0.58256,-1.51119 0,-2.09375 L 211.5,288.3125 z' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans' inkscape:connector-curvature='0'/>
+ </g>
+ <g id='layer10' transform='translate(-201,-277)' inkscape:label='devices' inkscape:groupmode='layer'/>
+ <g id='layer11' transform='translate(-201,-277)' inkscape:label='apps' inkscape:groupmode='layer'/>
+ <g id='layer13' transform='translate(-201,-277)' inkscape:label='places' inkscape:groupmode='layer'/>
+ <g id='layer14' transform='translate(-201,-277)' inkscape:label='mimetypes' inkscape:groupmode='layer'/>
+ <g id='layer15' transform='translate(-201,-277)' style='display:inline' inkscape:label='emblems' inkscape:groupmode='layer'/>
+ <g id='g71291' transform='translate(-201,-277)' style='display:inline' inkscape:label='emotes' inkscape:groupmode='layer'/>
+ <g id='g4953' transform='translate(-201,-277)' style='display:inline' inkscape:label='categories' inkscape:groupmode='layer'/>
+ <g id='layer12' transform='translate(-201,-277)' style='display:inline' inkscape:label='actions' inkscape:groupmode='layer'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/weather-showers-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/weather-showers-symbolic-ref.png
new file mode 100644
index 00000000..d4dc5ff6
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/weather-showers-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/weather-showers-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/weather-showers-symbolic.svg
new file mode 100644
index 00000000..1f9e7b8b
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/weather-showers-symbolic.svg
@@ -0,0 +1,36 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:svg='http://www.w3.org/2000/svg' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' version='1.1' inkscape:version='0.48+devel r9873 custom' height='16' sodipodi:docname='weather-showers-symbolic.svg' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:object-paths='true' inkscape:cy='11.171206' inkscape:current-layer='layer9' inkscape:window-width='1280' pagecolor='#555753' showborder='false' showguides='true' inkscape:snap-nodes='false' objecttolerance='10' showgrid='true' inkscape:object-nodes='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:window-x='0' inkscape:snap-bbox='true' bordercolor='#666666' id='namedview88' inkscape:window-maximized='1' inkscape:snap-global='true' inkscape:window-y='26' gridtolerance='10' inkscape:zoom='22.576098' inkscape:window-height='743' borderopacity='1' guidetolerance='10' inkscape:snap-bbox-midpoints='false' inkscape:cx='66.427016' inkscape:bbox-paths='false' inkscape:snap-grids='true' inkscape:pageopacity='1' inkscape:snap-to-guides='true'>
+ <inkscape:grid visible='true' spacingx='1px' type='xygrid' spacingy='1px' id='grid4866' empspacing='2' enabled='true' snapvisiblegridlinesonly='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g transform='translate(-221,-277)' inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline'>
+
+ <path inkscape:connector-curvature='0' d='m 230.46539,277 c -1.27312,0 -2.30725,0.97301 -2.44824,2.21875 C 227.6931,279.09667 227.36073,279 226.99446,279 c -1.64309,0 -2.97508,1.34315 -2.97508,3 0,0.0982 0.0218,0.1855 0.0309,0.28125 C 223.75312,282.10201 223.39921,282 223.02769,282 c -1.0954,0 -1.9834,0.89543 -1.9834,2 0,1.10457 0.888,2 1.9834,2 l 12.39618,0 c 0.82155,0 1.48754,-0.67157 1.48754,-1.5 0,-0.82843 -0.66599,-1.5 -1.48754,-1.5 -0.20539,0 -0.41085,0.0491 -0.58882,0.125 0.0522,-0.20194 0.0929,-0.40658 0.0929,-0.625 0,-1.22936 -0.88592,-2.22819 -2.04537,-2.4375 0.0416,-0.18136 0.062,-0.36843 0.062,-0.5625 0,-1.38071 -1.10999,-2.5 -2.47924,-2.5 z' id='path5094-5-04-4-6-4' sodipodi:nodetypes='ccsscssccsscscscc' style='color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2.40000033;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='M 223.40625,287 A 0.49616697,0.49616697 0 0 0 223,287.40625 l -1,4.90625 a 0.49616697,0.49616697 0 1 0 0.96875,0.1875 l 1,-4.90625 A 0.49616697,0.49616697 0 0 0 223.40625,287 z' id='path6561-2' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:0.99223471;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='M 225.40625,287 A 0.49616697,0.49616697 0 0 0 225,287.40625 l -1,4.90625 a 0.49616697,0.49616697 0 1 0 0.96875,0.1875 L 226,287.59375 A 0.49616697,0.49616697 0 0 0 225.40625,287 z' id='use6826' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:0.99223471;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='M 227.40625,287 A 0.49616697,0.49616697 0 0 0 227,287.40625 l -1,4.90625 a 0.50871314,0.50871314 0 1 0 1,0.1875 l 1,-4.90625 A 0.49616697,0.49616697 0 0 0 227.40625,287 z' id='use6826-1' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:0.99223471;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='M 229.40625,287 A 0.49616697,0.49616697 0 0 0 229,287.40625 l -1,4.90625 a 0.50871314,0.50871314 0 1 0 1,0.1875 l 1,-4.90625 A 0.49616697,0.49616697 0 0 0 229.40625,287 z' id='use6826-1-0' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:0.99223471;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 231.40625,287 a 0.49616697,0.49616697 0 0 0 -0.375,0.40625 L 230,292.3125 a 0.50871314,0.50871314 0 1 0 1,0.1875 l 1,-4.90625 A 0.49616697,0.49616697 0 0 0 231.40625,287 z' id='use6826-1-0-0' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:0.99223471;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 233.40625,287 a 0.49616697,0.49616697 0 0 0 -0.375,0.40625 l -1,4.90625 A 0.49616697,0.49616697 0 1 0 233,292.5 l 1,-4.90625 A 0.49616697,0.49616697 0 0 0 233.40625,287 z' id='use6826-1-0-0-6' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:0.99223471;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+ <g transform='translate(-221,-277)' inkscape:groupmode='layer' id='layer10' inkscape:label='devices'/>
+ <g transform='translate(-221,-277)' inkscape:groupmode='layer' id='layer11' inkscape:label='apps'/>
+ <g transform='translate(-221,-277)' inkscape:groupmode='layer' id='layer12' inkscape:label='actions'/>
+ <g transform='translate(-221,-277)' inkscape:groupmode='layer' id='layer13' inkscape:label='places'/>
+ <g transform='translate(-221,-277)' inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes'/>
+ <g transform='translate(-221,-277)' inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline'/>
+ <g transform='translate(-221,-277)' inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/weather-snow-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/weather-snow-symbolic-ref.png
new file mode 100644
index 00000000..c2998578
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/weather-snow-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/weather-snow-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/weather-snow-symbolic.svg
new file mode 100644
index 00000000..7b844952
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/weather-snow-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:svg='http://www.w3.org/2000/svg' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' id='svg7384' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' version='1.1' inkscape:version='0.48+devel r9873 custom' height='16' sodipodi:docname='weather-snow-symbolic.svg' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:object-paths='true' inkscape:cy='-11.950593' inkscape:current-layer='layer9' inkscape:window-width='1280' pagecolor='#555753' showborder='false' showguides='true' inkscape:snap-nodes='false' objecttolerance='10' showgrid='true' inkscape:object-nodes='true' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:window-x='0' inkscape:snap-bbox='true' bordercolor='#666666' id='namedview88' inkscape:window-maximized='1' inkscape:snap-global='false' inkscape:window-y='26' gridtolerance='10' inkscape:zoom='22.576098' inkscape:window-height='743' borderopacity='1' guidetolerance='10' inkscape:snap-bbox-midpoints='false' inkscape:cx='-53.856035' inkscape:bbox-paths='false' inkscape:snap-grids='true' inkscape:pageopacity='1' inkscape:snap-to-guides='true'>
+ <inkscape:grid visible='true' spacingx='1px' type='xygrid' spacingy='1px' id='grid4866' empspacing='2' enabled='true' snapvisiblegridlinesonly='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g transform='translate(-241,-277)' inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline'>
+
+ <path inkscape:connector-curvature='0' d='m 250.53599,277 c -1.27668,0 -2.3137,0.97301 -2.45508,2.21875 C 247.75596,279.09667 247.42266,279 247.05537,279 c -1.64768,0 -2.98339,1.34315 -2.98339,3 0,0.0982 0.022,0.1855 0.031,0.28125 C 243.80503,282.10201 243.45008,282 243.07752,282 c -1.09846,0 -1.98893,0.89543 -1.98893,2 0,1.10457 0.89047,2 1.98893,2 l 1.02554,0 a 1.4918439,1.50015 0 0 1 1.80246,-1.90625 1.4918439,1.50015 0 0 1 0.031,0 1.4918439,1.50015 0 0 1 1.33631,-0.4375 1.4918439,1.50015 0 0 1 0.83908,-0.59375 1.4918439,1.50015 0 0 1 1.39846,-1.09375 1.4918439,1.50015 0 0 1 1.46062,1.09375 1.4918439,1.50015 0 0 1 0.83908,0.59375 1.4918439,1.50015 0 0 1 1.39846,0.40625 1.4918439,1.50015 0 0 1 1.77139,1.9375 l 0.52831,0 c 0.82384,0 1.49169,-0.67157 1.49169,-1.5 0,-0.82843 -0.66785,-1.5 -1.49169,-1.5 -0.20597,0 -0.412,0.0491 -0.59047,0.125 0.0523,-0.20194 0.0932,-0.40658 0.0932,-0.625 0,-1.22936 -0.88839,-2.22819 -2.05108,-2.4375 0.0417,-0.18136 0.0622,-0.36843 0.0622,-0.5625 0,-1.38071 -1.11309,-2.5 -2.48616,-2.5 z' id='path5094-5-04-4-6-4-1' style='color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2.40000033;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='M 249.4375,282.9375 A 0.50005,0.50005 0 0 0 249,283.46875 l 0,0.65625 -0.28125,-0.125 a 0.50316382,0.50316382 0 1 0 -0.4375,0.90625 L 249,285.25 l 0,1.8125 -1.65625,-1.03125 0.0625,-0.875 a 0.50219246,0.50219246 0 1 0 -1,-0.0937 l -0.0312,0.40625 -0.59375,-0.375 A 0.50005,0.50005 0 1 0 245.25,285.9375 l 0.65625,0.40625 -0.3125,0.25 a 0.50316382,0.50316382 0 1 0 0.59375,0.8125 l 0.65625,-0.5 1.6875,1.03125 -1.71875,1.0625 -0.65625,-0.46875 a 0.50005,0.50005 0 1 0 -0.59375,0.78125 l 0.34375,0.25 -0.6875,0.40625 a 0.5118231,0.5118231 0 1 0 0.53125,0.875 l 0.625,-0.375 0.0312,0.375 a 0.50097561,0.50097561 0 1 0 1,-0.0625 l -0.0625,-0.90625 1.65625,-1.03125 0,1.8125 L 248.28125,291 a 0.50316382,0.50316382 0 1 0 0.4375,0.90625 l 0.28125,-0.125 0,0.6875 a 0.50005,0.50005 0 1 0 1,0 l 0,-0.6875 0.28125,0.125 A 0.50316382,0.50316382 0 1 0 250.71875,291 L 250,290.65625 l 0,-1.8125 1.65625,1 -0.0625,0.9375 a 0.50024408,0.50024408 0 1 0 1,0.0312 l 0.0312,-0.375 0.59375,0.375 a 0.50005,0.50005 0 1 0 0.53125,-0.84375 l -0.6875,-0.40625 0.34375,-0.25 A 0.50316382,0.50316382 0 1 0 252.8125,288.5 l -0.65625,0.5 -1.6875,-1.03125 1.6875,-1.03125 0.6875,0.46875 a 0.50005,0.50005 0 1 0 0.5625,-0.8125 l -0.3125,-0.21875 0.6875,-0.4375 a 0.5118231,0.5118231 0 1 0 -0.53125,-0.875 l -0.625,0.375 -0.0312,-0.375 a 0.50097561,0.50097561 0 1 0 -1,0.0625 l 0.0625,0.90625 -1.65625,1.03125 0,-1.8125 0.71875,-0.34375 A 0.50316382,0.50316382 0 1 0 250.28125,284 L 250,284.125 l 0,-0.65625 a 0.50005,0.50005 0 0 0 -0.5625,-0.53125 z' id='path7750' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+ <g transform='translate(-241,-277)' inkscape:groupmode='layer' id='layer10' inkscape:label='devices'/>
+ <g transform='translate(-241,-277)' inkscape:groupmode='layer' id='layer11' inkscape:label='apps'/>
+ <g transform='translate(-241,-277)' inkscape:groupmode='layer' id='layer12' inkscape:label='actions'/>
+ <g transform='translate(-241,-277)' inkscape:groupmode='layer' id='layer13' inkscape:label='places'/>
+ <g transform='translate(-241,-277)' inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes'/>
+ <g transform='translate(-241,-277)' inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline'/>
+ <g transform='translate(-241,-277)' inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/weather-storm-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/weather-storm-symbolic-ref.png
new file mode 100644
index 00000000..e7abe48b
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/weather-storm-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/weather-storm-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/weather-storm-symbolic.svg
new file mode 100644
index 00000000..88616e5f
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/weather-storm-symbolic.svg
@@ -0,0 +1,33 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='weather-storm-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.4 r9939' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='-108.71599' inkscape:cy='-361.9103' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='702' inkscape:window-maximized='1' inkscape:window-width='1366' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='-139.9998px' originy='60px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ <inkscape:grid color='#000000' empcolor='#000000' empopacity='0' empspacing='4' enabled='true' id='grid5968' opacity='0.1254902' originx='-139.9998px' originy='60px' snapvisiblegridlinesonly='true' spacingx='0.5px' spacingy='0.5px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-381,-277)'>
+
+ <path inkscape:connector-curvature='0' d='m 390.50955,277.04355 c -1.27301,0 -2.30704,0.9731 -2.44802,2.21895 -0.32401,-0.12209 -0.65635,-0.21877 -1.02258,-0.21877 -1.64294,0 -2.97481,1.34328 -2.97481,3.00028 0,0.0982 0.0219,0.18552 0.0309,0.28128 -0.29709,-0.17926 -0.65102,-0.28128 -1.02251,-0.28128 -1.0953,0 -1.98321,0.89552 -1.98321,2.00019 0,1.10467 0.81558,1.9558 1.91088,1.9558 l 5,0 0,-1.5 c -0.0163,-0.7855 0.73891,-1.47087 1.51774,-1.48715 0.79948,-0.0169 1.49901,0.68082 1.48226,1.48715 l 0,1.5 4.5,0 c 0.82146,0 1.45475,-0.62724 1.45475,-1.45575 0,-0.82851 -0.66593,-1.50014 -1.48739,-1.50014 -0.20538,0 -0.41082,0.0491 -0.58878,0.12501 0.0521,-0.20196 0.0929,-0.40662 0.0929,-0.62506 0,-1.22947 -0.88584,-2.2284 -2.04518,-2.43773 0.0416,-0.18137 0.062,-0.36846 0.062,-0.56255 0,-1.38084 -1.1099,-2.50023 -2.47901,-2.50023 z' id='path5094-5-04-4-6-4-1-4' sodipodi:nodetypes='ccsscssccccccssscscssc' style='color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2.40000033;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='M 389.40625,284 A 0.49935348,0.49935348 0 0 0 389,284.5 l 0,2.5 -2.5,0 -0.5,0 0,0.5 0,0.5 -1.5,0 -0.21875,0 -0.125,0.15625 -2.5,2.5 a 0.49935348,0.49935348 0 1 0 0.6875,0.6875 L 384.6875,289 386,289 l 0,3 a 0.5,0.5 0 0 0 1,0 l 0,-3.375 a 0.49935348,0.49935348 0 0 0 0,-0.21875 L 387,288 l 2,0 0,0.5 0,0.21875 0.15625,0.125 L 391,290.6875 391,292 a 0.5,0.5 0 0 0 1,0 l 0,-1 1.34375,0 2.40625,1.4375 a 0.50389111,0.50389111 0 1 0 0.5,-0.875 l -2.5,-1.5 -0.125,-0.0625 -0.125,0 -1.8125,0 -1.6875,-1.6875 0,-0.6875 a 0.49935348,0.49935348 0 0 0 0,-0.21875 L 390,284.5 a 0.49935348,0.49935348 0 0 0 -0.59375,-0.5 z' id='path1891-5-8-3' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:0.9986071px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-381,-277)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-381,-277)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-381,-277)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-381,-277)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-381,-277)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-381,-277)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-381,-277)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-381,-277)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/weather-windy-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/weather-windy-symbolic-ref.png
new file mode 100644
index 00000000..01f98e51
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/weather-windy-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/weather-windy-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/weather-windy-symbolic.svg
new file mode 100644
index 00000000..0c514ffd
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/weather-windy-symbolic.svg
@@ -0,0 +1,40 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='weather-windy-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16.009432' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.92.0 r' viewBox='0 0 16.021761 16.009432' width='16.021761' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='-6.2695966' inkscape:cy='3.6564322' inkscape:document-units='px' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:measure-end='0,0' inkscape:measure-start='0,0' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='0' inkscape:window-width='1720' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='5.6568542'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-179.9998' originy='60.003687' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-421,-276.99425)'>
+
+ <path inkscape:connector-curvature='0' d='m 429.05273,277.10547 c -0.64399,-0.16587 -1.33529,-0.14866 -1.99023,0.0723 a 1.0001,1.0001 0 1 0 0.63867,1.89454 c 0.56448,-0.19041 1.18096,-0.0318 1.58399,0.4082 0.40303,0.43995 0.50811,1.06964 0.26953,1.61719 -0.23859,0.54755 -0.76973,0.89883 -1.36524,0.90234 a 1.0001,1.0001 0 1 0 0.0117,2 c 1.38234,-0.008 2.63523,-0.83605 3.1875,-2.10352 0.55227,-1.26746 0.30495,-2.74816 -0.6289,-3.76757 -0.46693,-0.50971 -1.06304,-0.85757 -1.70704,-1.02344 z' id='path33973' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 421,282 v 2 h 7.38086 v -2 z' id='path33975' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 434.9043,281.11914 c -0.53477,-0.15751 -1.11423,-0.16181 -1.66602,0.0137 a 1.0003435,1.0003435 0 1 0 0.60742,1.90625 c 0.33541,-0.10666 0.68417,-0.009 0.93164,0.28321 0.24747,0.29225 0.3141,0.73219 0.15625,1.09961 -0.15784,0.36741 -0.47992,0.57404 -0.82617,0.57617 a 1.0001,1.0001 0 1 0 0.0117,2 c 1.15822,-0.007 2.19541,-0.72353 2.65234,-1.78711 0.45694,-1.06359 0.27923,-2.29829 -0.46875,-3.18164 -0.37398,-0.44168 -0.86366,-0.75265 -1.39843,-0.91016 z' id='path33977' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 428,285 v 2 h 6 v -2 z' id='path33979' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 430.46484,292.99414 c -0.50186,0.044 -1.01601,-0.0614 -1.4707,-0.32422 a 0.9914438,0.9914438 0 1 1 0.99219,-1.7168 c 0.19328,0.11173 0.42455,0.091 0.5957,-0.0527 0.17115,-0.14378 0.2329,-0.37119 0.15625,-0.58203 -0.0766,-0.21084 -0.26742,-0.3457 -0.49023,-0.3457 a 0.99136091,0.99136091 0 1 1 0,-1.98243 c 1.05042,0 1.99469,0.66337 2.35351,1.65039 0.35883,0.98703 0.0601,2.10174 -0.74414,2.77735 -0.4021,0.3378 -0.89072,0.53221 -1.39258,0.57617 z' id='path33981' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.98252356;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 422,287.99609 v 2 h 8.375 v -2 z' id='path33983' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-421,-276.99425)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-421,-276.99425)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-421,-276.99425)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-421,-276.99425)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-421,-276.99425)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-421,-276.99425)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-421,-276.99425)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-421,-276.99425)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/web-browser-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/web-browser-symbolic-ref.png
new file mode 100644
index 00000000..fca44723
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/web-browser-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/web-browser-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/web-browser-symbolic.svg
new file mode 100644
index 00000000..ddc8e070
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/web-browser-symbolic.svg
@@ -0,0 +1,33 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' id='svg7384' sodipodi:docname='web-browser-symbolic.svg' version='1.1' inkscape:version='0.48.1 r9760' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:cc='http://creativecommons.org/ns#' xmlns:svg='http://www.w3.org/2000/svg' width='16' xmlns='http://www.w3.org/2000/svg' height='16.00366'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:object-paths='false' inkscape:current-layer='layer11' inkscape:bbox-paths='false' inkscape:pageshadow='2' inkscape:snap-bbox='true' inkscape:pageopacity='1' inkscape:guide-bbox='true' pagecolor='#555753' bordercolor='#666666' showguides='true' inkscape:snap-bbox-midpoints='false' inkscape:window-maximized='0' inkscape:snap-grids='true' inkscape:window-width='1595' id='namedview88' inkscape:window-x='2191' inkscape:window-y='111' gridtolerance='10' borderopacity='1' showgrid='false' inkscape:cx='21.026784' inkscape:cy='2.9913602' inkscape:snap-nodes='false' inkscape:window-height='1162' inkscape:snap-global='true' inkscape:object-nodes='false' objecttolerance='10' inkscape:snap-others='false' inkscape:zoom='1' guidetolerance='10' inkscape:snap-to-guides='true' showborder='false'>
+ <inkscape:grid enabled='true' type='xygrid' id='grid4866' visible='true' snapvisiblegridlinesonly='true' empspacing='2' spacingx='1px' spacingy='1px'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g style='display:inline' inkscape:groupmode='layer' id='layer9' inkscape:label='status' transform='translate(-183,-529)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-183,-529)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-183,-529)'>
+
+ <path style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:block;overflow:visible;enable-background:accumulate' sodipodi:nodetypes='cccccccc' id='path6242' inkscape:connector-curvature='0' d='m 191.0002,533.84553 0,10.38049 -2.34399,-2.28818 -1.33941,2.73465 c -0.32808,0.73962 -2.03368,0.14492 -1.5487,-0.84412 l 1.32547,-2.83928 -2.95789,0 6.86452,-7.14356 z'/>
+ <path style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans' sodipodi:nodetypes='csccssccsssc' id='path23405' inkscape:connector-curvature='0' d='m 190.15645,530.0625 c -3.82659,0.46006 -6.57883,3.95775 -6.09375,7.78125 0.13127,1.03473 0.29377,1.38184 0.29377,1.38184 l 1.67498,-1.63184 c -0.33104,-2.75343 1.62156,-5.23146 4.375,-5.5625 2.75344,-0.33104 5.23146,1.62156 5.5625,4.375 0.31355,2.60795 -1.39127,5.02493 -3.96875,5.53125 l 0.0312,2 c 0,0 0.52086,-0.1059 0.62354,-0.13097 3.41561,-0.83385 5.70627,-4.1273 5.28271,-7.65028 -0.46006,-3.8266 -3.95466,-6.55381 -7.78125,-6.09375 z'/>
+ <path style='opacity:0.3;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' id='path11289' inkscape:connector-curvature='0' d='m 187.11293,536.81497 0,-0.20574 -0.19826,0.0186 c 0.0165,-0.13095 0.0329,-0.26167 0.0496,-0.3926 l -0.11578,0 -0.11556,0.14959 -0.11578,0.0559 -0.1653,-0.0932 -0.0165,-0.20575 0.0331,-0.22438 0.24798,-0.18688 0.19826,0 0.0329,-0.11229 0.24786,0.0559 0.18183,0.2246 0.0331,-0.37419 0.31401,-0.26167 0.11567,-0.28055 0.23133,-0.0934 0.1322,-0.18688 0.29738,-0.0564 0.14885,-0.22415 c -0.14874,0 -0.29749,0 -0.44623,0 l 0.28094,-0.13095 0.19814,0 0.28106,-0.0937 0.0331,-0.11186 -0.0992,-0.0937 -0.11567,-0.0375 0.0331,-0.11208 -0.0826,-0.16822 -0.19837,0.0746 0.0331,-0.14947 -0.23134,-0.13096 -0.18171,0.3177 0.0165,0.11229 -0.18171,0.075 -0.11578,0.24302 -0.0495,-0.22438 -0.31402,-0.13095 -0.0496,-0.16822 0.41315,-0.24325 0.18182,-0.16822 0.0165,-0.20563 -0.0991,-0.0562 -0.13219,-0.0188 -0.0826,0.20575 c 0,0 -0.1382,0.0271 -0.17373,0.0358 -0.45378,0.41804 -1.37066,1.32044 -1.58368,3.02405 0.008,0.0395 0.15441,0.26854 0.15441,0.26854 l 0.347,0.20552 0.347,0.0937 m 3.96609,-4.30034 -0.4298,-0.16833 -0.49552,0.0561 -0.61161,0.16822 -0.11567,0.11229 0.38008,0.26167 0,0.14959 -0.14875,0.14959 0.19846,0.39294 0.13188,-0.075 0.16561,-0.26168 c 0.2553,-0.0789 0.4842,-0.16833 0.72686,-0.28053 l 0.19846,-0.5048 m 2.52925,0.34192 -0.375,0.0937 -0.21875,0.15625 0,0.125 -0.375,0.25 0.0937,0.34375 0.21875,-0.15625 0.125,0.15625 0.15625,0.0937 0.0937,-0.28125 -0.0625,-0.15625 0.0625,-0.0937 0.21875,-0.1875 0.0937,0 -0.0937,0.21875 0,0.1875 c 0.0892,-0.0242 0.1588,-0.051 0.25,-0.0625 l -0.25,0.1875 0,0.125 -0.3125,0.21875 -0.28125,-0.0625 0,-0.15625 -0.125,0.0625 0.0625,0.15625 -0.21875,0 -0.125,0.21875 -0.15625,0.15625 -0.0937,0.0312 0,0.1875 0.0312,0.15625 -0.0312,0 0,0.53125 0.0625,-0.0312 0.0937,-0.21875 0.1875,-0.125 0.0312,-0.0937 0.28125,-0.0625 0.15625,0.1875 0.1875,0.0937 -0.0937,0.1875 0.15625,-0.0312 0.0625,-0.21875 -0.1875,-0.21875 0.0625,0 0.21875,0.15625 0.0312,0.21875 0.15625,0.21875 0.0625,-0.3125 0.0937,-0.0312 c 0.0959,0.0996 0.1692,0.23163 0.25,0.34375 l 0.28125,0 0.1875,0.125 -0.0937,0.0937 -0.15625,0.15625 -0.25,0 -0.34375,-0.0937 -0.1875,0 -0.125,0.15625 -0.34375,-0.375 -0.25,-0.0625 -0.375,0.0625 -0.15625,0.0937 0,2.40625 0.0312,0.0312 0.25,-0.15625 0.0937,0.0937 0.28125,0 0.125,0.15625 -0.0937,0.3125 0.1875,0.1875 0,0.375 0.125,0.25 -0.0937,0.25 c -0.009,0.16159 0,0.30714 0,0.46875 0.0795,0.21894 0.14355,0.43575 0.21875,0.65625 l 0.0625,0.34375 0,0.1875 0.125,0 0.21875,-0.125 0.25,0 0.375,-0.4375 -0.0312,-0.15625 0.25,-0.21875 -0.1875,-0.1875 0.21875,-0.1875 0.21875,-0.125 0.0937,-0.125 -0.0625,-0.25 0,-0.59375 0.1875,-0.375 0.1875,-0.25 0.25,-0.5625 0,-0.15625 c -0.11654,0.0146 -0.22972,0.0231 -0.34375,0.0312 -0.0722,0.005 -0.14446,0 -0.21875,0 -0.12359,-0.25961 -0.2183,-0.50966 -0.3125,-0.78125 l -0.15625,-0.1875 -0.0937,-0.3125 0.0625,-0.0625 0.21875,0.25 0.25,0.5625 0.15625,0.15625 -0.0625,0.21875 0.15625,0.15625 0.25,-0.25 0.3125,-0.21875 0.15625,-0.1875 0,-0.21875 c -0.0389,-0.0732 -0.0547,-0.14545 -0.0937,-0.21875 l -0.15625,0.1875 -0.125,-0.15625 -0.1875,-0.125 0,-0.28125 0.21875,0.21875 0.21875,-0.0312 c 0.10166,0.0923 0.19205,0.20751 0.28125,0.3125 l 0.15625,-0.1875 c 0,-0.17463 -0.19976,-1.02044 -0.625,-1.75 -0.42526,-0.72932 -1.15625,-1.40625 -1.15625,-1.40625 l -0.0625,0.0937 -0.21875,0.21875 -0.25,-0.25 0.25,0 0.125,-0.125 -0.46875,-0.0937 -0.25,-0.0937 z'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-183,-529)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-183,-529)'/>
+ <g style='display:inline' inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' transform='translate(-183,-529)'/>
+ <g style='display:inline' inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' transform='translate(-183,-529)'/>
+ <g style='display:inline' inkscape:groupmode='layer' id='g4953' inkscape:label='categories' transform='translate(-183,-529)'/>
+ <g style='display:inline' inkscape:groupmode='layer' id='layer12' inkscape:label='actions' transform='translate(-183,-529)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/window-close-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/window-close-symbolic-ref.png
new file mode 100644
index 00000000..24a3e521
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/window-close-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/window-close-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/window-close-symbolic.svg
new file mode 100644
index 00000000..c0c786fd
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/window-close-symbolic.svg
@@ -0,0 +1,28 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:svg='http://www.w3.org/2000/svg' id='svg7384' version='1.1' height='16' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='16'>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs id='defs7386'/>
+ <g transform='translate(-60,-518)' id='layer9' style='display:inline'/>
+ <g transform='translate(-60,-518)' id='layer10'/>
+ <g transform='translate(-60,-518)' id='layer11'/>
+ <g transform='translate(-60,-518)' id='layer12'>
+ <g transform='translate(19,-242)' id='layer4-4-1' style='display:inline'>
+
+ <path inkscape:connector-curvature='0' d='m 45,764 1,0 c 0.01037,-1.2e-4 0.02079,-4.6e-4 0.03125,0 0.254951,0.0112 0.50987,0.12858 0.6875,0.3125 L 49,766.59375 51.3125,764.3125 C 51.578125,764.082 51.759172,764.007 52,764 l 1,0 0,1 c 0,0.28647 -0.03434,0.55065 -0.25,0.75 l -2.28125,2.28125 2.25,2.25 C 52.906938,770.46942 52.999992,770.7347 53,771 l 0,1 -1,0 c -0.265301,-10e-6 -0.530586,-0.0931 -0.71875,-0.28125 L 49,769.4375 46.71875,771.71875 C 46.530586,771.90694 46.26529,772 46,772 l -1,0 0,-1 c -3e-6,-0.26529 0.09306,-0.53058 0.28125,-0.71875 l 2.28125,-2.25 L 45.28125,765.75 C 45.070508,765.55537 44.97809,765.28075 45,765 l 0,-1 z' id='path10839-9' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#bebebe;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.78124988;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Andale Mono;-inkscape-font-specification:Andale Mono'/>
+ </g>
+ </g>
+ <g transform='translate(-60,-518)' id='layer13'/>
+ <g transform='translate(-60,-518)' id='layer14'/>
+ <g transform='translate(-60,-518)' id='layer15'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/window-maximize-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/window-maximize-symbolic-ref.png
new file mode 100644
index 00000000..eac28588
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/window-maximize-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/window-maximize-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/window-maximize-symbolic.svg
new file mode 100644
index 00000000..14d33c1a
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/window-maximize-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='window-maximize-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.4 r9939' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='17.289293' inkscape:cy='3.66502' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1403' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='0' inkscape:zoom='5.6568542'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='160px' originy='750px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-81.0002,-967)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-81.0002,-967)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-81.0002,-967)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-81.0002,-967)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-81.0002,-967)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-81.0002,-967)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-81.0002,-967)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-81.0002,-967)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-81.0002,-967)'>
+
+ <path inkscape:connector-curvature='0' d='m 85,971 0,1 0,6 0,1 1,0 6,0 1,0 0,-1 0,-6 0,-1 -1,0 -6,0 -1,0 z m 2,2 4,0 0,4 -4,0 0,-4 z' id='rect9057' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/window-minimize-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/window-minimize-symbolic-ref.png
new file mode 100644
index 00000000..8273220e
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/window-minimize-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/window-minimize-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/window-minimize-symbolic.svg
new file mode 100644
index 00000000..a865a419
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/window-minimize-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='window-minimize-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.4 r9939' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='37.289293' inkscape:cy='3.66502' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1403' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='0' inkscape:zoom='5.6568542'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='180px' originy='750px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-61.0002,-967)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-61.0002,-967)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-61.0002,-967)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-61.0002,-967)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-61.0002,-967)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-61.0002,-967)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-61.0002,-967)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-61.0002,-967)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-61.0002,-967)'>
+
+ <rect height='1.9887378' id='rect8269' rx='0' ry='0' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' width='8' x='65.000198' y='977.00891'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/window-restore-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/window-restore-symbolic-ref.png
new file mode 100644
index 00000000..7a0de4a4
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/window-restore-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/window-restore-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/window-restore-symbolic.svg
new file mode 100644
index 00000000..2246c002
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/window-restore-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='window-restore-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.4 r9939' version='1.1' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer12' inkscape:cx='-2.7107066' inkscape:cy='3.66502' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='false' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1403' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='0' inkscape:zoom='5.6568542'>
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='140px' originy='750px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-101.0002,-967)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' transform='translate(-101.0002,-967)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-101.0002,-967)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' transform='translate(-101.0002,-967)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-101.0002,-967)'/>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-101.0002,-967)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-101.0002,-967)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-101.0002,-967)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-101.0002,-967)'>
+
+ <path inkscape:connector-curvature='0' d='m 106,972 0,1 0,4 0,1 1,0 4,0 1,0 0,-1 0,-4 0,-1 -1,0 -4,0 -1,0 z m 2,2 2,0 0,2 -2,0 0,-2 z' id='rect9057-5' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/x-office-address-book-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/x-office-address-book-symbolic-ref.png
new file mode 100644
index 00000000..ebaaa6af
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/x-office-address-book-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/x-office-address-book-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/x-office-address-book-symbolic.svg
new file mode 100644
index 00000000..30a1090a
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/x-office-address-book-symbolic.svg
@@ -0,0 +1,39 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='x-office-address-book-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16.00001' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer14' inkscape:cx='-7.71024' inkscape:cy='10.314542' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1170' inkscape:window-maximized='0' inkscape:window-width='1519' inkscape:window-x='585' inkscape:window-y='94' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-300px' originy='104.00001px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <inkscape:path-effect effect='spiro' id='path-effect35671' is_visible='true'/>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-541.0002,-321)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-541.0002,-321)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-541.0002,-321)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-541.0002,-321)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-541.0002,-321)'>
+ <path inkscape:connector-curvature='0' d='m 542.18896,335 c 0,1.0907 0.90929,2.00001 2,2.00001 l 8.82323,-2e-5 c 1.09069,0 1.99999,-0.90928 1.99999,-1.99999 l 1e-5,-11.00001 c 0,-1.09069 -0.9093,-1.99999 -2,-1.99999 l -8.82323,10e-6 c -1.09069,0 -1.99999,0.90929 -2,2 C 546.52229,324 548.67885,324 553.01218,324 l 1e-5,11.00001 C 548.67886,335 546.52229,335 542.18896,335 z' id='rect10788-4' sodipodi:nodetypes='csssssscccc' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 541.59375,333 a 0.50219246,0.50219246 0 1 0 0.0937,1 l 1.8125,0 a 0.50005,0.50005 0 1 0 0,-1 l -1.8125,0 a 0.50005,0.50005 0 0 0 -0.0937,0 z' id='path3601-2-3-3-9-34' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 541.59375,331 a 0.50219246,0.50219246 0 1 0 0.0937,1 l 1.8125,0 a 0.50005,0.50005 0 1 0 0,-1 l -1.8125,0 a 0.50005,0.50005 0 0 0 -0.0937,0 z' id='path3601-2-3-3-9-3-0' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 541.59375,329 a 0.50219246,0.50219246 0 1 0 0.0937,1 l 1.8125,0 a 0.50005,0.50005 0 1 0 0,-1 l -1.8125,0 a 0.50005,0.50005 0 0 0 -0.0937,0 z' id='path3601-2-3-3-9-3-3-4' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 541.59375,327 a 0.50219246,0.50219246 0 1 0 0.0937,1 l 1.8125,0 a 0.50005,0.50005 0 1 0 0,-1 l -1.8125,0 a 0.50005,0.50005 0 0 0 -0.0937,0 z' id='path3601-2-3-3-9-3-3-7-0' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+
+ <path inkscape:connector-curvature='0' d='m 541.59375,325 a 0.50219246,0.50219246 0 1 0 0.0937,1 l 1.8125,0 a 0.50005,0.50005 0 1 0 0,-1 l -1.8125,0 a 0.50005,0.50005 0 0 0 -0.0937,0 z' id='path35635' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 548.0002,331 c 0.32762,0.0664 0.66579,0.007 1,0 0.33355,-0.007 0.66868,0.0392 1,0 0.62377,-0.0737 1.19577,-0.46158 1.52274,-0.99787 0.32697,-0.53629 0.41177,-1.20749 0.26,-1.81699 -0.15177,-0.60949 -0.53175,-1.15378 -1.03205,-1.53354 -0.5003,-0.37976 -1.11579,-0.59773 -1.74158,-0.6516 -0.90784,-0.0782 -1.84201,0.19208 -2.56548,0.74605 -0.72346,0.55397 -1.22846,1.38688 -1.38113,2.2852 -0.10756,0.63289 -0.0431,1.29417 0.18467,1.89437 0.22777,0.60021 0.61825,1.13777 1.11861,1.53996 0.50037,0.40219 1.10931,0.66796 1.74444,0.76136 0.63514,0.0934 1.29481,0.0142 1.88978,-0.22694 l 0,-1 c -0.45327,0.29856 -0.99976,0.45332 -1.54228,0.43675 -0.54251,-0.0166 -1.07854,-0.20438 -1.51276,-0.53004 -0.43421,-0.32566 -0.7646,-0.78766 -0.93241,-1.30383 -0.1678,-0.51618 -0.17225,-1.08414 -0.0126,-1.60288 0.19034,-0.61825 0.6121,-1.15862 1.15428,-1.51147 0.54219,-0.35284 1.19956,-0.51929 1.84572,-0.48853 0.53715,0.0256 1.08173,0.19329 1.48295,0.55136 0.20061,0.17903 0.36214,0.40374 0.45639,0.65556 0.0943,0.25182 0.11974,0.53077 0.0607,0.79308 -0.0541,0.24043 -0.17919,0.46445 -0.35541,0.63674 -0.17622,0.17229 -0.403,0.29225 -0.64459,0.34096 l 0,-0.9777 c -0.1194,-0.2972 -0.32939,-0.55729 -0.59474,-0.73665 -0.26535,-0.17936 -0.58498,-0.27726 -0.90526,-0.27726 -0.32028,0 -0.63991,0.0979 -0.90526,0.27726 -0.26535,0.17936 -0.47534,0.43945 -0.59474,0.73665 -0.15846,0.39444 -0.15178,0.85562 0.0334,1.23826 0.18515,0.38263 0.55001,0.67735 0.96663,0.76174 m 1.03589,-0.97703 c -0.10348,0.10419 -0.24042,0.17463 -0.38536,0.19821 -0.14494,0.0236 -0.29714,1.9e-4 -0.42831,-0.0658 -0.13117,-0.066 -0.24063,-0.17433 -0.30804,-0.30479 -0.0674,-0.13046 -0.0924,-0.28241 -0.0704,-0.42759 0.0188,-0.1237 0.0714,-0.2421 0.15056,-0.33896 0.0792,-0.0969 0.18478,-0.17193 0.30228,-0.21491 0.11751,-0.043 0.24661,-0.0538 0.36961,-0.0309 0.123,0.0229 0.23958,0.0794 0.33375,0.16178' id='path35642' sodipodi:nodetypes='zcsssccsssccszcsc' inkscape:original-d='m 548.0002,331 c 0.45879,0.28355 0.66667,0 1,0 0.33333,0 1,1.78808 1,0 0,-0.87163 0.9828,-5 -0.99089,-5 -2.47138,0 -3.94661,1.3622 -3.94661,3.03125 0,2.07735 1.91323,4.19119 4.9375,3.96875 l 0,-1 c -2.44932,-0.97013 -2.77718,-3.40273 -4,-3 -1.21207,0.39919 1.21192,-2 3,-2 1.62843,0 2.02184,1.33811 2,2 -0.0402,1.21795 -0.5,0.9777 -1,0.9777 l 0,-0.9777 c -3.96875,0.0223 -3.40531,-0.52743 -3,0 0.53128,0.69137 0.54121,1.71645 1,2 z m 1.03589,-0.97703 c -0.91757,0 -1.25244,-0.3 -1.19209,-0.6 0.0603,-0.3 0.49285,-0.42297 1.1562,-0.42297' inkscape:path-effect='#path-effect35671' style='font-size:6.38600874px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:125%;letter-spacing:0px;word-spacing:0px;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;font-family:Cantarell;-inkscape-font-specification:Cantarell Bold'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-541.0002,-321)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-541.0002,-321)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-541.0002,-321)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-541.0002,-321)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/x-office-calendar-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/x-office-calendar-symbolic-ref.png
new file mode 100644
index 00000000..46518768
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/x-office-calendar-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/x-office-calendar-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/x-office-calendar-symbolic.svg
new file mode 100644
index 00000000..b6378055
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/x-office-calendar-symbolic.svg
@@ -0,0 +1,36 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='x-office-calendar-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.92.0 r' viewBox='0 0 16 16' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='true' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer14' inkscape:cx='3.7670768' inkscape:cy='-2.2585768' inkscape:document-units='px' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:measure-end='0,0' inkscape:measure-start='0,0' inkscape:object-nodes='true' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='5.6568542'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-320' originy='84' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient gradientTransform='matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)' id='linearGradient19282' osb:paint='solid'>
+ <stop id='stop19284' offset='0' style='stop-color:#666666;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-561.0002,-301)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-561.0002,-301)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-561.0002,-301)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-561.0002,-301)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-561.0002,-301)'>
+ <path inkscape:connector-curvature='0' d='m 563.96895,302.01094 c -1.05237,0 -2,0.84508 -2,1.9375 v 10.11406 c 0,1.09242 0.94763,1.9375 2,1.9375 h 10.03125 c 1.05237,0 2,-0.84508 2,-1.9375 v -10.11406 c 0,-1.09242 -0.94763,-1.9375 -2,-1.9375 z m 0,3.98906 h 2.03125 v 2 h -2.03125 z m 3.03125,0 h 3 v 2 h -3 z m 4,0 h 3 v 2 h -3 z m -7.03125,3 h 2.03125 v 2 h -2.03125 z m 3.03125,0 h 3 v 2 h -3 z m 4,0 h 3 v 2 h -3 z m -7.03125,3 h 2.03125 v 2 h -2.03125 z m 3.03125,0 h 3 v 2 h -3 z m 4,0 h 3 v 2 h -3 z' id='rect27790' sodipodi:nodetypes='sssssssssccccccccccccccccccccccccccccccccccccccccccccc' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:Sans;-inkscape-font-specification:Sans;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;enable-background:new'/>
+ <rect height='1.9999993' id='rect27810' style='color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.35;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;enable-background:accumulate' width='2.9999993' x='571.00018' y='309'/>
+
+ </g>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-561.0002,-301)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-561.0002,-301)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-561.0002,-301)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-561.0002,-301)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/x-office-document-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/x-office-document-symbolic-ref.png
new file mode 100644
index 00000000..a7c03d10
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/x-office-document-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/x-office-document-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/x-office-document-symbolic.svg
new file mode 100644
index 00000000..62f971a6
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/x-office-document-symbolic.svg
@@ -0,0 +1,35 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='x-office-document-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer14' inkscape:cx='52.28996' inkscape:cy='10.314652' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1170' inkscape:window-maximized='0' inkscape:window-width='1519' inkscape:window-x='585' inkscape:window-y='94' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-239.9998px' originy='104.00012px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-481,-321.00012)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-481,-321.00012)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-481,-321.00012)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-481,-321.00012)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-481,-321.00012)'>
+
+ <path inkscape:connector-curvature='0' d='m 483.8127,322.00012 a 1.0000999,1.0000999 0 0 0 -0.8125,1 l 0,13 a 1.0000999,1.0000999 0 0 0 1,1 l 10,0 a 1.0000999,1.0000999 0 0 0 1,-1 l 0,-9.4375 a 1.0000999,1.0000999 0 0 0 -0.28125,-0.71875 l -3.5625,-3.5625 a 1.0000999,1.0000999 0 0 0 -0.71875,-0.28125 l -6.4375,0 a 1.0000999,1.0000999 0 0 0 -0.0937,0 1.0000999,1.0000999 0 0 0 -0.0937,0 z m 1.1875,2 5,0 0,3 3,0 0,8 -8,0 0,-11 z' id='path35724' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.99999988;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 487.41869,325.99882 c -0.86024,0 -1.55632,0.72246 -1.55632,1.58269 0,0.86024 0.69608,1.55632 1.55632,1.55632 0.86024,0 1.5827,-0.69608 1.5827,-1.55632 0,-0.86023 -0.72246,-1.58269 -1.5827,-1.58269 z m 0,1.00237 c 0.3198,0 0.58032,0.26053 0.58032,0.58032 0,0.3198 -0.26052,0.55395 -0.58032,0.55395 -0.3198,0 -0.55394,-0.23415 -0.55394,-0.55395 0,-0.31979 0.23414,-0.58032 0.55394,-0.58032 z' id='path35728' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.18468678;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <rect height='1' id='rect35730' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' width='2' x='490.00018' y='329'/>
+ <rect height='1' id='rect35732' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' width='6.0000138' x='486.00021' y='331'/>
+ <rect height='1' id='rect35734' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' width='6.0000138' x='486.00021' y='333'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-481,-321.00012)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-481,-321.00012)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-481,-321.00012)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-481,-321.00012)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/x-office-drawing-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/x-office-drawing-symbolic-ref.png
new file mode 100644
index 00000000..bd4dd835
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/x-office-drawing-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/x-office-drawing-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/x-office-drawing-symbolic.svg
new file mode 100644
index 00000000..fe690b5a
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/x-office-drawing-symbolic.svg
@@ -0,0 +1,33 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='x-office-drawing-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer14' inkscape:cx='72.28996' inkscape:cy='10.314652' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1170' inkscape:window-maximized='0' inkscape:window-width='1519' inkscape:window-x='585' inkscape:window-y='94' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-219.9998px' originy='104.00012px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-461,-321.00012)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-461,-321.00012)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-461,-321.00012)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-461,-321.00012)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-461,-321.00012)'>
+
+ <path inkscape:connector-curvature='0' d='m 463.8127,322.00012 a 1.0000999,1.0000999 0 0 0 -0.8125,1 l 0,13 a 1.0000999,1.0000999 0 0 0 1,1 l 10,0 a 1.0000999,1.0000999 0 0 0 1,-1 l 0,-9.4375 a 1.0000999,1.0000999 0 0 0 -0.28125,-0.71875 l -3.5625,-3.5625 a 1.0000999,1.0000999 0 0 0 -0.71875,-0.28125 l -6.4375,0 a 1.0000999,1.0000999 0 0 0 -0.0937,0 1.0000999,1.0000999 0 0 0 -0.0937,0 z m 1.1875,2 5,0 0,3 3,0 0,8 -8,0 0,-11 z' id='path35681' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.99999988;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 469.5625,331.34375 c -0.46643,-0.0643 -1.04585,-0.1297 -1.53125,0.25 -0.40319,0.3154 -0.7654,0.72703 -1.09375,1.03125 -0.32835,0.30422 -0.65996,0.4375 -0.59375,0.4375 l -2.34375,0 0,1 2.34375,0 c 0.58207,0 0.88604,-0.38153 1.25,-0.71875 0.36396,-0.33722 0.75079,-0.69367 1.0625,-0.9375 0.10629,-0.0831 0.40859,-0.14514 0.78125,-0.0937 0.37266,0.0514 0.69959,0.1875 1.09375,0.1875 0.14648,0 0.20407,0.0328 0.3125,0.125 0.10843,0.0922 0.24045,0.24389 0.375,0.4375 0.13455,0.19361 0.28193,0.42119 0.5,0.625 0.21807,0.20381 0.56155,0.375 0.9375,0.375 l 0.84375,0 0,-1 -0.84375,0 c -0.0991,0 -0.15147,-0.002 -0.25,-0.0937 -0.0985,-0.0921 -0.23537,-0.26783 -0.375,-0.46875 -0.13963,-0.20092 -0.29184,-0.42134 -0.53125,-0.625 -0.23941,-0.20366 -0.57764,-0.375 -0.96875,-0.375 -0.0328,0 -0.50232,-0.0919 -0.96875,-0.15625 z' id='path35302-7' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 467.41869,326.86218 c -0.86024,0 -1.55632,0.72246 -1.55632,1.58269 0,0.86024 0.69608,1.55632 1.55632,1.55632 0.86024,0 1.5827,-0.69608 1.5827,-1.55632 0,-0.86023 -0.72246,-1.58269 -1.5827,-1.58269 z m 0,1.00237 c 0.3198,0 0.58032,0.26053 0.58032,0.58032 0,0.3198 -0.26052,0.55395 -0.58032,0.55395 -0.3198,0 -0.55394,-0.23415 -0.55394,-0.55395 0,-0.31979 0.23414,-0.58032 0.55394,-0.58032 z' id='path35306-9' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.18468678;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-461,-321.00012)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-461,-321.00012)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-461,-321.00012)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-461,-321.00012)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/x-office-presentation-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/x-office-presentation-symbolic-ref.png
new file mode 100644
index 00000000..c5d1b90b
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/x-office-presentation-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/x-office-presentation-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/x-office-presentation-symbolic.svg
new file mode 100644
index 00000000..0c32b20d
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/x-office-presentation-symbolic.svg
@@ -0,0 +1,34 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='x-office-presentation-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer14' inkscape:cx='12.28996' inkscape:cy='10.314652' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1170' inkscape:window-maximized='0' inkscape:window-width='1519' inkscape:window-x='585' inkscape:window-y='94' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-279.9998px' originy='104.00012px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-521,-321.00012)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-521,-321.00012)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-521,-321.00012)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-521,-321.00012)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-521,-321.00012)'>
+
+ <path inkscape:connector-curvature='0' d='m 523.0002,324 0,8 12,0 0,-8 z m 6,1 c 1.10457,0 2,0.89543 2,2 l -2,0 z m -1,1 0,2 2,0 c 0,1.10457 -0.89543,2 -2,2 -1.10457,0 -2,-0.89543 -2,-2 0,-1.10457 0.89543,-2 2,-2 z' id='rect35810' sodipodi:nodetypes='ccccccccccccssc' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ <path inkscape:connector-curvature='0' d='m 523,323 a 1.001098,1.001098 0 1 0 0.0937,2 l 11.625,0 a 1.0001,1.0001 0 1 0 0,-2 l -11.625,0 A 1.0001,1.0001 0 0 0 523,323 z' id='path35812' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='M 528.40625,331.5 A 0.50005,0.50005 0 0 0 528,332 l 0,1.75 -1.8125,1.375 a 0.51253811,0.51253811 0 1 0 0.625,0.8125 l 2,-1.53125 L 529,334.25 l 0,-0.25 0,-2 a 0.50005,0.50005 0 0 0 -0.59375,-0.5 z' id='path35814' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <path inkscape:connector-curvature='0' d='m 528.375,333.5 a 0.50005,0.50005 0 0 0 -0.1875,0.90625 l 2,1.5625 a 0.51253811,0.51253811 0 1 0 0.625,-0.8125 l -2,-1.5625 A 0.50005,0.50005 0 0 0 528.375,333.5 z' id='path35816' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-521,-321.00012)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-521,-321.00012)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-521,-321.00012)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-521,-321.00012)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/x-office-spreadsheet-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/x-office-spreadsheet-symbolic-ref.png
new file mode 100644
index 00000000..651fd434
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/x-office-spreadsheet-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/x-office-spreadsheet-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/x-office-spreadsheet-symbolic.svg
new file mode 100644
index 00000000..ca727aa6
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/x-office-spreadsheet-symbolic.svg
@@ -0,0 +1,39 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='x-office-spreadsheet-symbolic.svg' inkscape:export-filename='/home/sam/dev/RESOURCES/gnome-icon-theme-symbolic/src/gnome-stencils.png' inkscape:export-xdpi='90' inkscape:export-ydpi='90' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.48.4 r9939' width='16' xmlns='http://www.w3.org/2000/svg'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-nodes='false' inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer14' inkscape:cx='32.28996' inkscape:cy='10.314652' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#3a3b39' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1170' inkscape:window-maximized='0' inkscape:window-width='1519' inkscape:window-x='585' inkscape:window-y='94' inkscape:zoom='1'>
+ <inkscape:grid dotted='false' empspacing='2' enabled='true' id='grid4866' originx='-259.9998px' originy='104.00012px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='status' style='display:inline' transform='translate(-501,-321.00012)'/>
+ <g inkscape:groupmode='layer' id='layer10' inkscape:label='devices' style='display:inline' transform='translate(-501,-321.00012)'/>
+ <g inkscape:groupmode='layer' id='layer11' inkscape:label='apps' transform='translate(-501,-321.00012)'/>
+ <g inkscape:groupmode='layer' id='layer13' inkscape:label='places' style='display:inline' transform='translate(-501,-321.00012)'/>
+ <g inkscape:groupmode='layer' id='layer14' inkscape:label='mimetypes' transform='translate(-501,-321.00012)'>
+
+ <path inkscape:connector-curvature='0' d='m 503.8127,322.00012 a 1.0000999,1.0000999 0 0 0 -0.8125,1 l 0,13 a 1.0000999,1.0000999 0 0 0 1,1 l 9.99999,0 a 1.0000999,1.0000999 0 0 0 1,-1 l 0,-9.4375 a 1.0000999,1.0000999 0 0 0 -0.28125,-0.71875 l -3.56249,-3.5625 a 1.0000999,1.0000999 0 0 0 -0.71875,-0.28125 l -6.4375,0 a 1.0000999,1.0000999 0 0 0 -0.0937,0 1.0000999,1.0000999 0 0 0 -0.0937,0 z m 1.1875,2 5,0 0,3 2.99999,0 0,8 -7.99999,0 0,-11 z' id='path35764' style='font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.99999988;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans'/>
+ <rect height='1' id='rect35768' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' width='1.0000055' x='506.00018' y='325'/>
+ <rect height='1' id='rect35774' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' width='1.0000055' x='508.00018' y='325'/>
+ <rect height='1' id='rect35776' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' width='1.0000055' x='506.00018' y='327'/>
+ <rect height='1' id='rect35778' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' width='1.0000055' x='508.00018' y='327'/>
+ <rect height='1' id='rect35780' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' width='1.0000055' x='506.00018' y='333'/>
+ <rect height='1' id='rect35782' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' width='1.0000055' x='508.00018' y='333'/>
+ <rect height='1' id='rect35784' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate' width='1.0000055' x='510.00018' y='333'/>
+ <path inkscape:connector-curvature='0' d='m 506.0002,332.01126 6,0 0,-1.01126 -1.46875,-2.55124 -1.53125,2.04687 -1.46875,-1.0625 L 506.0002,331 z' id='path35786' sodipodi:nodetypes='cccccccc' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate'/>
+ </g>
+ <g inkscape:groupmode='layer' id='layer15' inkscape:label='emblems' style='display:inline' transform='translate(-501,-321.00012)'/>
+ <g inkscape:groupmode='layer' id='g71291' inkscape:label='emotes' style='display:inline' transform='translate(-501,-321.00012)'/>
+ <g inkscape:groupmode='layer' id='g4953' inkscape:label='categories' style='display:inline' transform='translate(-501,-321.00012)'/>
+ <g inkscape:groupmode='layer' id='layer12' inkscape:label='actions' style='display:inline' transform='translate(-501,-321.00012)'/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/zoom-fit-best-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/zoom-fit-best-symbolic-ref.png
new file mode 100644
index 00000000..925f81e8
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/zoom-fit-best-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/zoom-fit-best-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/zoom-fit-best-symbolic.svg
new file mode 100644
index 00000000..e0ba6c8d
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/zoom-fit-best-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='zoom-fit-best-symbolic.svg' width='15.981825' inkscape:version='0.48.1 r9760' version='1.1' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' height='16' id='svg7384' xmlns:svg='http://www.w3.org/2000/svg' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:cc='http://creativecommons.org/ns#' xmlns='http://www.w3.org/2000/svg' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:pageopacity='1' inkscape:snap-to-guides='true' borderopacity='1' inkscape:window-maximized='0' inkscape:snap-bbox='true' inkscape:object-nodes='false' inkscape:object-paths='false' inkscape:window-width='1226' pagecolor='#555753' gridtolerance='10' inkscape:pageshadow='2' bordercolor='#666666' inkscape:current-layer='layer12' showguides='true' id='namedview88' showborder='false' inkscape:bbox-paths='false' inkscape:snap-global='true' inkscape:window-x='2804' inkscape:window-y='77' inkscape:snap-nodes='true' inkscape:guide-bbox='true' inkscape:snap-grids='true' objecttolerance='10' inkscape:cx='-105.32058' inkscape:cy='-103.01275' inkscape:snap-others='false' showgrid='false' inkscape:snap-bbox-midpoints='false' guidetolerance='10' inkscape:zoom='1' inkscape:window-height='967'>
+ <inkscape:grid enabled='true' type='xygrid' id='grid4866' snapvisiblegridlinesonly='true' visible='true' empspacing='2' spacingx='1px' spacingy='1px'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:label='status' id='layer9' style='display:inline' inkscape:groupmode='layer' transform='translate(-161.0002,-667)'/>
+ <g inkscape:label='devices' id='layer10' inkscape:groupmode='layer' transform='translate(-161.0002,-667)'/>
+ <g inkscape:label='apps' id='layer11' inkscape:groupmode='layer' transform='translate(-161.0002,-667)'/>
+ <g inkscape:label='places' id='layer13' inkscape:groupmode='layer' transform='translate(-161.0002,-667)'/>
+ <g inkscape:label='mimetypes' id='layer14' inkscape:groupmode='layer' transform='translate(-161.0002,-667)'/>
+ <g inkscape:label='emblems' id='layer15' style='display:inline' inkscape:groupmode='layer' transform='translate(-161.0002,-667)'/>
+ <g inkscape:label='emotes' id='g71291' style='display:inline' inkscape:groupmode='layer' transform='translate(-161.0002,-667)'/>
+ <g inkscape:label='categories' id='g4953' style='display:inline' inkscape:groupmode='layer' transform='translate(-161.0002,-667)'/>
+ <g inkscape:label='actions' id='layer12' style='display:inline' inkscape:groupmode='layer' transform='translate(-161.0002,-667)'>
+ <path sodipodi:nodetypes='ssssssssscccccccccccccccccccccccccccc' d='m 164.1877,669 c -0.6627,0 -1.1875,0.54899 -1.1875,1.21875 l 0,9.5625 c 0,0.66976 0.5248,1.21875 1.1875,1.21875 l 9.625,0 c 0.6627,0 1.1875,-0.54899 1.1875,-1.21875 l 0,-9.5625 c 0,-0.66976 -0.5248,-1.21875 -1.1875,-1.21875 z m 0.8125,2 3,0 0,2 -1,0 0,1 -2,0 z m 5,0 3,0 0,3 -2,0 0,-1 -1,0 z m -5,5 2,0 0,1 1,0 0,2 -3,0 z m 6,0 2,0 0,3 -3,0 0,-2 1,0 z' id='rect11749-5-0-1' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible' inkscape:connector-curvature='0'/>
+
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/zoom-in-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/zoom-in-symbolic-ref.png
new file mode 100644
index 00000000..66955986
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/zoom-in-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/zoom-in-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/zoom-in-symbolic.svg
new file mode 100644
index 00000000..2cc79bcd
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/zoom-in-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='zoom-in-symbolic.svg' width='15.981825' inkscape:version='0.48.1 r9760' version='1.1' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' height='16' id='svg7384' xmlns:svg='http://www.w3.org/2000/svg' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:cc='http://creativecommons.org/ns#' xmlns='http://www.w3.org/2000/svg' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:pageopacity='1' inkscape:snap-to-guides='true' borderopacity='1' inkscape:window-maximized='0' inkscape:snap-bbox='true' inkscape:object-nodes='false' inkscape:object-paths='false' inkscape:window-width='1226' pagecolor='#555753' gridtolerance='10' inkscape:pageshadow='2' bordercolor='#666666' inkscape:current-layer='layer12' showguides='true' id='namedview88' showborder='false' inkscape:bbox-paths='false' inkscape:snap-global='true' inkscape:window-x='2804' inkscape:window-y='77' inkscape:snap-nodes='true' inkscape:guide-bbox='true' inkscape:snap-grids='true' objecttolerance='10' inkscape:cx='-125.32058' inkscape:cy='-103.01275' inkscape:snap-others='false' showgrid='false' inkscape:snap-bbox-midpoints='false' guidetolerance='10' inkscape:zoom='1' inkscape:window-height='967'>
+ <inkscape:grid enabled='true' type='xygrid' id='grid4866' snapvisiblegridlinesonly='true' visible='true' empspacing='2' spacingx='1px' spacingy='1px'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:label='status' id='layer9' style='display:inline' inkscape:groupmode='layer' transform='translate(-181.0002,-667)'/>
+ <g inkscape:label='devices' id='layer10' inkscape:groupmode='layer' transform='translate(-181.0002,-667)'/>
+ <g inkscape:label='apps' id='layer11' inkscape:groupmode='layer' transform='translate(-181.0002,-667)'/>
+ <g inkscape:label='places' id='layer13' inkscape:groupmode='layer' transform='translate(-181.0002,-667)'/>
+ <g inkscape:label='mimetypes' id='layer14' inkscape:groupmode='layer' transform='translate(-181.0002,-667)'/>
+ <g inkscape:label='emblems' id='layer15' style='display:inline' inkscape:groupmode='layer' transform='translate(-181.0002,-667)'/>
+ <g inkscape:label='emotes' id='g71291' style='display:inline' inkscape:groupmode='layer' transform='translate(-181.0002,-667)'/>
+ <g inkscape:label='categories' id='g4953' style='display:inline' inkscape:groupmode='layer' transform='translate(-181.0002,-667)'/>
+ <g inkscape:label='actions' id='layer12' style='display:inline' inkscape:groupmode='layer' transform='translate(-181.0002,-667)'>
+ <path d='m 184.1877,669 c -0.6627,0 -1.1875,0.54899 -1.1875,1.21875 l 0,9.5625 c 0,0.66976 0.5248,1.21875 1.1875,1.21875 l 9.625,0 c 0.6627,0 1.1875,-0.54899 1.1875,-1.21875 l 0,-9.5625 c 0,-0.66976 -0.5248,-1.21875 -1.1875,-1.21875 l -9.625,0 z m 3.8125,3 2,0 0,2 2,0 0,2 -2,0 0,2 -2,0 0,-2 -2,0 0,-2 2,0 0,-2 z' id='rect11749-5-0-1-8' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible' inkscape:connector-curvature='0'/>
+
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/zoom-original-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/zoom-original-symbolic-ref.png
new file mode 100644
index 00000000..fe8de0b9
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/zoom-original-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/zoom-original-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/zoom-original-symbolic.svg
new file mode 100644
index 00000000..d6eda05a
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/zoom-original-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='zoom-original-symbolic.svg' width='15.981825' inkscape:version='0.48.1 r9760' version='1.1' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' height='16' id='svg7384' xmlns:svg='http://www.w3.org/2000/svg' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:cc='http://creativecommons.org/ns#' xmlns='http://www.w3.org/2000/svg' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:pageopacity='1' inkscape:snap-to-guides='true' borderopacity='1' inkscape:window-maximized='0' inkscape:snap-bbox='true' inkscape:object-nodes='false' inkscape:object-paths='false' inkscape:window-width='1226' pagecolor='#555753' gridtolerance='10' inkscape:pageshadow='2' bordercolor='#666666' inkscape:current-layer='layer12' showguides='true' id='namedview88' showborder='false' inkscape:bbox-paths='false' inkscape:snap-global='true' inkscape:window-x='2804' inkscape:window-y='77' inkscape:snap-nodes='true' inkscape:guide-bbox='true' inkscape:snap-grids='true' objecttolerance='10' inkscape:cx='-165.32058' inkscape:cy='-103.01275' inkscape:snap-others='false' showgrid='false' inkscape:snap-bbox-midpoints='false' guidetolerance='10' inkscape:zoom='1' inkscape:window-height='967'>
+ <inkscape:grid enabled='true' type='xygrid' id='grid4866' snapvisiblegridlinesonly='true' visible='true' empspacing='2' spacingx='1px' spacingy='1px'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:label='status' id='layer9' style='display:inline' inkscape:groupmode='layer' transform='translate(-221.0002,-667)'/>
+ <g inkscape:label='devices' id='layer10' inkscape:groupmode='layer' transform='translate(-221.0002,-667)'/>
+ <g inkscape:label='apps' id='layer11' inkscape:groupmode='layer' transform='translate(-221.0002,-667)'/>
+ <g inkscape:label='places' id='layer13' inkscape:groupmode='layer' transform='translate(-221.0002,-667)'/>
+ <g inkscape:label='mimetypes' id='layer14' inkscape:groupmode='layer' transform='translate(-221.0002,-667)'/>
+ <g inkscape:label='emblems' id='layer15' style='display:inline' inkscape:groupmode='layer' transform='translate(-221.0002,-667)'/>
+ <g inkscape:label='emotes' id='g71291' style='display:inline' inkscape:groupmode='layer' transform='translate(-221.0002,-667)'/>
+ <g inkscape:label='categories' id='g4953' style='display:inline' inkscape:groupmode='layer' transform='translate(-221.0002,-667)'/>
+ <g inkscape:label='actions' id='layer12' style='display:inline' inkscape:groupmode='layer' transform='translate(-221.0002,-667)'>
+ <path d='m 224.1877,669 c -0.6627,0 -1.1875,0.54899 -1.1875,1.21875 l 0,9.5625 c 0,0.66976 0.5248,1.21875 1.1875,1.21875 l 9.625,0 c 0.6627,0 1.1875,-0.54899 1.1875,-1.21875 l 0,-9.5625 c 0,-0.66976 -0.5248,-1.21875 -1.1875,-1.21875 l -9.625,0 z m 3.8125,3 2,0 0,6 -2,0 0,-4 -1,0 0,-1 c 0.69433,0 1,-0.34772 1,-1 z' id='rect11749-5-0-1-8-7-8' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible' inkscape:connector-curvature='0'/>
+
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/adwaita/zoom-out-symbolic-ref.png b/rsvg/tests/fixtures/reftests/adwaita/zoom-out-symbolic-ref.png
new file mode 100644
index 00000000..f6724db5
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/zoom-out-symbolic-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/adwaita/zoom-out-symbolic.svg b/rsvg/tests/fixtures/reftests/adwaita/zoom-out-symbolic.svg
new file mode 100644
index 00000000..d0a408d3
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/adwaita/zoom-out-symbolic.svg
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='zoom-out-symbolic.svg' width='15.981825' inkscape:version='0.48.1 r9760' version='1.1' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' height='16' id='svg7384' xmlns:svg='http://www.w3.org/2000/svg' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:cc='http://creativecommons.org/ns#' xmlns='http://www.w3.org/2000/svg' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd'>
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:pageopacity='1' inkscape:snap-to-guides='true' borderopacity='1' inkscape:window-maximized='0' inkscape:snap-bbox='true' inkscape:object-nodes='false' inkscape:object-paths='false' inkscape:window-width='1226' pagecolor='#555753' gridtolerance='10' inkscape:pageshadow='2' bordercolor='#666666' inkscape:current-layer='layer12' showguides='true' id='namedview88' showborder='false' inkscape:bbox-paths='false' inkscape:snap-global='true' inkscape:window-x='2804' inkscape:window-y='77' inkscape:snap-nodes='true' inkscape:guide-bbox='true' inkscape:snap-grids='true' objecttolerance='10' inkscape:cx='-145.32058' inkscape:cy='-103.01275' inkscape:snap-others='false' showgrid='false' inkscape:snap-bbox-midpoints='false' guidetolerance='10' inkscape:zoom='1' inkscape:window-height='967'>
+ <inkscape:grid enabled='true' type='xygrid' id='grid4866' snapvisiblegridlinesonly='true' visible='true' empspacing='2' spacingx='1px' spacingy='1px'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'/>
+ <g inkscape:label='status' id='layer9' style='display:inline' inkscape:groupmode='layer' transform='translate(-201.0002,-667)'/>
+ <g inkscape:label='devices' id='layer10' inkscape:groupmode='layer' transform='translate(-201.0002,-667)'/>
+ <g inkscape:label='apps' id='layer11' inkscape:groupmode='layer' transform='translate(-201.0002,-667)'/>
+ <g inkscape:label='places' id='layer13' inkscape:groupmode='layer' transform='translate(-201.0002,-667)'/>
+ <g inkscape:label='mimetypes' id='layer14' inkscape:groupmode='layer' transform='translate(-201.0002,-667)'/>
+ <g inkscape:label='emblems' id='layer15' style='display:inline' inkscape:groupmode='layer' transform='translate(-201.0002,-667)'/>
+ <g inkscape:label='emotes' id='g71291' style='display:inline' inkscape:groupmode='layer' transform='translate(-201.0002,-667)'/>
+ <g inkscape:label='categories' id='g4953' style='display:inline' inkscape:groupmode='layer' transform='translate(-201.0002,-667)'/>
+ <g inkscape:label='actions' id='layer12' style='display:inline' inkscape:groupmode='layer' transform='translate(-201.0002,-667)'>
+ <path d='m 204.1877,669 c -0.6627,0 -1.1875,0.54899 -1.1875,1.21875 l 0,9.5625 c 0,0.66976 0.5248,1.21875 1.1875,1.21875 l 9.625,0 c 0.6627,0 1.1875,-0.54899 1.1875,-1.21875 l 0,-9.5625 c 0,-0.66976 -0.5248,-1.21875 -1.1875,-1.21875 l -9.625,0 z m 1.8125,5 6,0 0,2 -6,0 0,-2 z' id='rect11749-5-0-1-8-7' style='color:#bebebe;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible' inkscape:connector-curvature='0'/>
+
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/bug483-attribute-selectors-ref.png b/rsvg/tests/fixtures/reftests/bug483-attribute-selectors-ref.png
new file mode 100644
index 00000000..63f8a370
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bug483-attribute-selectors-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/bug483-attribute-selectors.svg b/rsvg/tests/fixtures/reftests/bug483-attribute-selectors.svg
new file mode 100644
index 00000000..5b3230c9
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bug483-attribute-selectors.svg
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="150" height="100">
+ <style type="text/css">
+ rect[id] { fill: blue; }
+
+ rect[id="rojo"] { fill: red; }
+ rect[id|="rojo"] { fill: red; }
+
+ rect[id^="verde"] { fill: lime; }
+ rect[id$="verde"] { fill: lime; }
+
+ rect[id*="azul"] { fill: blue; }
+ </style>
+
+ <rect x="0" y="0" width="50" height="50" id="rojo"/>
+ <rect x="0" y="50" width="50" height="50" id="rojo-jojojo"/>
+
+ <rect x="50" y="0" width="50" height="50" id="verdecito"/>
+ <rect x="50" y="50" width="50" height="50" id="superverde"/>
+
+ <rect x="100" y="0" width="50" height="50" id="cualquier_cosa"/>
+ <rect x="100" y="50" width="50" height="50" id="superazulito"/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/bug525-specificity-ref.png b/rsvg/tests/fixtures/reftests/bug525-specificity-ref.png
new file mode 100644
index 00000000..2eaa94d7
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bug525-specificity-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/bug525-specificity.svg b/rsvg/tests/fixtures/reftests/bug525-specificity.svg
new file mode 100644
index 00000000..2fb1c525
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bug525-specificity.svg
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg version="1.1"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ width="16"
+ height="16">
+ <style type="text/css">
+ rect,circle,path {
+ fill: rgb(0,255,0) !important;
+ }
+ .warning {
+ fill: rgb(255,0,0) !important;
+ }
+ .error {
+ fill: rgb(0,255,0) !important;
+ }
+ .success {
+ fill: rgb(0,255,0) !important;
+ }
+ </style>
+ <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16">
+ <path d="M6.5 0C2.922 0 0 2.922 0 6.5S2.922 13 6.5 13c.17 0 .333-.018.5-.031v-2.031c-.167.018-.327.062-.5.062A4.485 4.485 0 0 1 2 6.5C2 4.003 4.003 2 6.5 2S11 4.003 11 6.5c0 .173-.044.333-.063.5h2.032c.013-.167.031-.33.031-.5C13 2.922 10.078 0 6.5 0z" style="line-height:normal;-inkscape-font-specification:Sans;text-indent:0;text-align:start;text-decoration-line:none;text-transform:none;marker:none" color="#000" font-weight="400" font-size="xx-small" font-family="Sans" overflow="visible" fill="#2e3436"/>
+ <path d="M6.492 2.992A.5.5 0 0 0 6 3.5V6H4.5a.5.5 0 1 0 0 1h2a.5.5 0 0 0 .5-.5v-3a.5.5 0 0 0-.508-.508z" style="line-height:normal;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000;text-transform:none;text-orientation:mixed;shape-padding:0;isolation:auto;mix-blend-mode:normal" color="#000" font-weight="400" font-family="sans-serif" white-space="normal" overflow="visible" fill="#2e3436"/>
+ <path class="warning" d="M8.875 8.068a.861.861 0 0 0-.875.87v6.195a.86.86 0 0 0 .875.867h6.25a.86.86 0 0 0 .875-.867V8.938a.861.861 0 0 0-.875-.87zM11 9h2v2.5s0 .5-.5.5h-1c-.5 0-.5-.5-.5-.5zm.5 4h1c.277 0 .5.223.5.5v1c0 .277-.223.5-.5.5h-1a.499.499 0 0 1-.5-.5v-1c0-.277.223-.5.5-.5z" style="marker:none" color="#bebebe" overflow="visible" fill="#f57900"/>
+ </svg>
+
+</svg> \ No newline at end of file
diff --git a/rsvg/tests/fixtures/reftests/bugs-reftests/bug875-svg-use-width-height-ref.svg b/rsvg/tests/fixtures/reftests/bugs-reftests/bug875-svg-use-width-height-ref.svg
new file mode 100644
index 00000000..a68e5c3a
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs-reftests/bug875-svg-use-width-height-ref.svg
@@ -0,0 +1,4 @@
+<svg width="100" height="100" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <rect fill="none" stroke="green" stroke-width="5" width="100%" height="100%"/>
+ <rect x="45%" y="45%" width="10%" height="10%" fill="red"/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/bugs-reftests/bug875-svg-use-width-height.svg b/rsvg/tests/fixtures/reftests/bugs-reftests/bug875-svg-use-width-height.svg
new file mode 100644
index 00000000..54da0bc1
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs-reftests/bug875-svg-use-width-height.svg
@@ -0,0 +1,9 @@
+<svg width="100" height="100" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <defs>
+ <svg id="a">
+ <rect width="100%" height="100%" fill="red"/>
+ </svg>
+ </defs>
+ <rect fill="none" stroke="green" stroke-width="5" width="100%" height="100%"/>
+ <use xlink:href="#a" x="45%" y="45%" width="10%" height="10%"/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/bugs-reftests/bug880-stroke-wide-line-ref.svg b/rsvg/tests/fixtures/reftests/bugs-reftests/bug880-stroke-wide-line-ref.svg
new file mode 100644
index 00000000..a80e5632
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs-reftests/bug880-stroke-wide-line-ref.svg
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="400" height="400">
+ <rect x="0" y="0" width="400" height="400" fill="lime"/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/bugs-reftests/bug880-stroke-wide-line.svg b/rsvg/tests/fixtures/reftests/bugs-reftests/bug880-stroke-wide-line.svg
new file mode 100644
index 00000000..4e22470f
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs-reftests/bug880-stroke-wide-line.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="400" height="400">
+ <!-- Two lines, one horizontal and one vertical, that have an empty objectBoundingBox.
+ However, they have a stroke with a userSpaceOnUse pattern, which *should* be drawn.
+ -->
+
+ <pattern id="pat" x="0" y="0" width="400" height="400" patternUnits="userSpaceOnUse">
+ <rect x="0" y="0" width="400" height="400" fill="lime"/>
+ </pattern>
+
+ <line x1="0" y1="100" x2="400" y2="100" stroke="url(#pat)" stroke-width="200"/>
+ <line x1="200" y1="200" x2="200" y2="400" stroke="url(#pat)" stroke-width="400"/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/bugs-reftests/bug885-vector-effect-non-scaling-stroke-ref.svg b/rsvg/tests/fixtures/reftests/bugs-reftests/bug885-vector-effect-non-scaling-stroke-ref.svg
new file mode 100644
index 00000000..5fba0ad3
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs-reftests/bug885-vector-effect-non-scaling-stroke-ref.svg
@@ -0,0 +1,4 @@
+<svg width="500" height="500" xmlns="http://www.w3.org/2000/svg">
+ <rect fill="none" stroke="green" stroke-width="25" width="100%" height="100%"/>
+ <rect x="0" y="25%" width="100%" height="50%" fill="red" stroke-width="25" stroke="blue"/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/bugs-reftests/bug885-vector-effect-non-scaling-stroke.svg b/rsvg/tests/fixtures/reftests/bugs-reftests/bug885-vector-effect-non-scaling-stroke.svg
new file mode 100644
index 00000000..be393703
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs-reftests/bug885-vector-effect-non-scaling-stroke.svg
@@ -0,0 +1,4 @@
+<svg width="500" height="500" xmlns="http://www.w3.org/2000/svg">
+ <rect fill="none" stroke="green" stroke-width="25" width="100%" height="100%"/>
+ <rect x="0" y="250%" width="100%" height="500%" transform="scale(1 0.1)" fill="red" vector-effect="non-scaling-stroke" stroke-width="25" stroke="blue"/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/bugs-reftests/bug92-symbol-clip-ref.svg b/rsvg/tests/fixtures/reftests/bugs-reftests/bug92-symbol-clip-ref.svg
new file mode 100644
index 00000000..c319e2fa
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs-reftests/bug92-symbol-clip-ref.svg
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
+ width="100" height="100" viewBox="0 0 100 100">
+ <rect x="0" y="0" width="40" height="40" fill="lime"/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/bugs-reftests/bug92-symbol-clip.svg b/rsvg/tests/fixtures/reftests/bugs-reftests/bug92-symbol-clip.svg
new file mode 100644
index 00000000..f25b65b2
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs-reftests/bug92-symbol-clip.svg
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
+ width="100" height="100" viewBox="0 0 100 100">
+ <defs>
+ <symbol id="foo" viewBox="0 0 50 50">
+ <rect x="0" y="0" width="40" height="40" fill="lime"/>
+ <rect x="50" y="0" width="40" height="40" fill="red"/>
+ </symbol>
+ </defs>
+
+ <use x="0" y="0" width="50" height="50" xlink:href="#foo"/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/bugs-reftests/bug930-invalid-clip-path-transform-ref.svg b/rsvg/tests/fixtures/reftests/bugs-reftests/bug930-invalid-clip-path-transform-ref.svg
new file mode 100644
index 00000000..cae82675
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs-reftests/bug930-invalid-clip-path-transform-ref.svg
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200">
+ <!-- Nothing; the test file should render nothing, so this is empty -->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/bugs-reftests/bug930-invalid-clip-path-transform.svg b/rsvg/tests/fixtures/reftests/bugs-reftests/bug930-invalid-clip-path-transform.svg
new file mode 100644
index 00000000..2c834fd5
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs-reftests/bug930-invalid-clip-path-transform.svg
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200">
+ <!-- This clipPath has an invalid transform. We should just not render the circle below,
+ but not exit with an error. -->
+ <clipPath id="clip" transform="scale(0)">
+ <rect x="100" y="0" width="100" height="100"/>
+ </clipPath>
+ <circle cx="100" cy="100" r="50" fill="green" clip-path="url(#clip)"/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/bugs/a-inside-text-content-738-ref.png b/rsvg/tests/fixtures/reftests/bugs/a-inside-text-content-738-ref.png
new file mode 100644
index 00000000..3baf7517
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/a-inside-text-content-738-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/bugs/a-inside-text-content-738.svg b/rsvg/tests/fixtures/reftests/bugs/a-inside-text-content-738.svg
new file mode 100644
index 00000000..7c3a0482
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/a-inside-text-content-738.svg
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ version="1.1"
+ viewBox="0 0 500 600"
+ font-family="sans-serif"
+ font-size="18">
+ <defs>
+ <style>
+ a {fill: black; font-family: Helvetica; font-size:10; }
+ text { font-family: Helvetica; font-size:10; }
+ </style>
+ </defs>
+
+ <text x="250" y="25" class="head" text-anchor="middle">SVG CSS Tests</text>
+ <g transform="translate(0,50)">
+ <text x="50">a:link</text>
+ <text x="250" class="test"><a xlink:href="#foo">xlink:href</a></text>
+ </g>
+
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/bugs/a-inside-text-content-pseudo-class-738-ref.png b/rsvg/tests/fixtures/reftests/bugs/a-inside-text-content-pseudo-class-738-ref.png
new file mode 100644
index 00000000..3baf7517
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/a-inside-text-content-pseudo-class-738-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/bugs/a-inside-text-content-pseudo-class-738.svg b/rsvg/tests/fixtures/reftests/bugs/a-inside-text-content-pseudo-class-738.svg
new file mode 100644
index 00000000..bc2203b2
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/a-inside-text-content-pseudo-class-738.svg
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ version="1.1"
+ viewBox="0 0 500 600"
+ font-family="sans-serif"
+ font-size="18">
+ <defs>
+ <style>
+ a { fill: white; font-family: Helvetica; font-size:10; }
+ a:link { fill: black; }
+
+ text { fill: black; font-family: Helvetica; font-size:10; }
+ </style>
+ </defs>
+
+ <text x="250" y="25" class="head" text-anchor="middle">SVG CSS Tests</text>
+ <g transform="translate(0,50)">
+ <text x="50">a:link</text>
+ <text x="250" class="test"><a xlink:href="#foo">xlink:href</a></text>
+ </g>
+
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug108-font-size-relative-ref.png b/rsvg/tests/fixtures/reftests/bugs/bug108-font-size-relative-ref.png
new file mode 100644
index 00000000..2b18067b
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug108-font-size-relative-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug108-font-size-relative.svg b/rsvg/tests/fixtures/reftests/bugs/bug108-font-size-relative.svg
new file mode 100644
index 00000000..41fe8a59
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug108-font-size-relative.svg
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100">
+
+
+<title>Voronoi. Simple poor</title>
+
+
+<style type="text/css">
+<![CDATA[
+
+.line {
+ stroke : black;
+ stroke-width : 1;
+ stroke-linecap : butt;
+}
+
+.circle {
+ stroke : none;
+ stroke-width : 0;
+ fill : black;
+}
+
+text {
+ font-family: sans;
+}
+
+.text {
+ stroke-width : 0;
+ stroke : none;
+ fill : black;
+ font-size : 15px;
+ font-style : italic;
+}
+
+.rect {
+ stroke : none;
+ stroke-width : 0;
+}
+
+]]>
+</style>
+
+
+<rect class="rect" x="0" y="0" width="50" height="100" fill="LightBlue"/>
+<rect class="rect" x="50" y="0" width="50" height="100" fill="LightGreen"/><!-- AntiqueWhite LightCyan -->
+<line class="line" x1="25" y1="70" x2="75" y2="70"/>
+<line class="line" x1="50" y1="10" x2="50" y2="90"/>
+<path fill="none" stroke="black" d="M 50,65 l 5,0 l 0,5"/>
+<circle class="circle" cx="25" cy="70" r="2"/>
+<circle class="circle" cx="75" cy="70" r="2"/>
+<text class="text" x="14" y="70">p</text>
+<text class="text" x="80" y="70">q</text>
+<text class="text" x="5" y="20">H<tspan dy="0.2em" style="font-size : smaller">pq</tspan></text>
+<text class="text" x="75" y="20">H<tspan dy="0.2em" style="font-size : smaller">qp</tspan></text>
+
+
+<!--
+Creation timestamp (ISO 8601) 2015-02-06T05:39:42+00:00.
+
+2015-02-06
+ first release
+
+-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug112-svg-delayed-attributes-ref.png b/rsvg/tests/fixtures/reftests/bugs/bug112-svg-delayed-attributes-ref.png
new file mode 100644
index 00000000..7cb3a2c2
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug112-svg-delayed-attributes-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug112-svg-delayed-attributes.svg b/rsvg/tests/fixtures/reftests/bugs/bug112-svg-delayed-attributes.svg
new file mode 100644
index 00000000..9c494345
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug112-svg-delayed-attributes.svg
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" fill="red" width="16" height="16">
+ <svg fill="lime">
+ <rect width="16" height="16"/>
+ </svg>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug165-zero-length-subpath-square-linecap-ref.png b/rsvg/tests/fixtures/reftests/bugs/bug165-zero-length-subpath-square-linecap-ref.png
new file mode 100644
index 00000000..be3c6316
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug165-zero-length-subpath-square-linecap-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug165-zero-length-subpath-square-linecap.svg b/rsvg/tests/fixtures/reftests/bugs/bug165-zero-length-subpath-square-linecap.svg
new file mode 100644
index 00000000..cb725dec
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug165-zero-length-subpath-square-linecap.svg
@@ -0,0 +1,6 @@
+<?xml version="1.0" standalone="no"?>
+<svg width="500" height="200" viewBox="0 0 5 2" version="1.1" xmlns="http://www.w3.org/2000/svg">
+ <path d="m1 1 0 0" stroke="black" stroke-linecap="butt" />
+ <path d="m2.5 1 0 0" stroke="black" stroke-linecap="round" />
+ <path d="m4 1 0 0" stroke="black" stroke-linecap="square" />
+</svg> \ No newline at end of file
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug181-inheritable-attrs-in-svg-ref.png b/rsvg/tests/fixtures/reftests/bugs/bug181-inheritable-attrs-in-svg-ref.png
new file mode 100644
index 00000000..147134b3
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug181-inheritable-attrs-in-svg-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug181-inheritable-attrs-in-svg.svg b/rsvg/tests/fixtures/reftests/bugs/bug181-inheritable-attrs-in-svg.svg
new file mode 100644
index 00000000..cb4fdf04
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug181-inheritable-attrs-in-svg.svg
@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" fill="red" opacity="0.5">
+ <circle cx="64" cy="64" r="32"/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug241-light-source-type-ref.png b/rsvg/tests/fixtures/reftests/bugs/bug241-light-source-type-ref.png
new file mode 100644
index 00000000..f7bd4dac
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug241-light-source-type-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug241-light-source-type.svg b/rsvg/tests/fixtures/reftests/bugs/bug241-light-source-type.svg
new file mode 100644
index 00000000..dcc13cc9
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug241-light-source-type.svg
@@ -0,0 +1,16 @@
+<svg height="48" viewBox="0 0 48 48" width="48" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <filter id="a" color-interpolation-filters="sRGB">
+ <feTurbulence baseFrequency=".037" numOctaves="3" result="result0"/>
+ <feSpecularLighting result="result1" specularConstant="1" specularExponent="24.3" surfaceScale="2">
+ <feDistantLight azimuth="225" elevation="45"/>
+ </feSpecularLighting>
+ <feDiffuseLighting diffuseConstant="1.21" in="result0" surfaceScale="3">
+ <feDistantLight azimuth="225" elevation="42"/>
+ </feDiffuseLighting>
+ <feBlend in2="SourceGraphic" mode="multiply" result="result91"/>
+ <feComposite in="result1" in2="result91" k2="1" k3="1" operator="arithmetic"/>
+ <feComposite in2="SourceAlpha" operator="in" result="result2"/>
+ </filter>
+ <path d="m4 4h40v40h-40z" fill="#f00" filter="url(#a)"/>
+</svg>
+
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug245-negative-dashoffset-ref.png b/rsvg/tests/fixtures/reftests/bugs/bug245-negative-dashoffset-ref.png
new file mode 100644
index 00000000..3c85ae56
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug245-negative-dashoffset-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug245-negative-dashoffset.svg b/rsvg/tests/fixtures/reftests/bugs/bug245-negative-dashoffset.svg
new file mode 100644
index 00000000..48cdaf17
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug245-negative-dashoffset.svg
@@ -0,0 +1,4 @@
+<?xml version="1.0"?>
+<svg width="100" height="20" viewBox="0 0 100 20" version="1.1" xmlns="http://www.w3.org/2000/svg">
+ <line stroke="#000" stroke-width="5" stroke-dasharray="20, 4" stroke-dashoffset="-5" x1="10" y1="10" x2="90" y2="10" />
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug282-drop-shadow-ref.png b/rsvg/tests/fixtures/reftests/bugs/bug282-drop-shadow-ref.png
new file mode 100644
index 00000000..18b51189
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug282-drop-shadow-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug282-drop-shadow.svg b/rsvg/tests/fixtures/reftests/bugs/bug282-drop-shadow.svg
new file mode 100644
index 00000000..04afae33
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug282-drop-shadow.svg
@@ -0,0 +1,12 @@
+<svg width="48" height="48" version="1.1" xmlns="http://www.w3.org/2000/svg">
+ <defs>
+ <filter id="filter22" color-interpolation-filters="sRGB">
+ <feFlood flood-color="rgb(0,0,0)" flood-opacity=".5" result="flood"/>
+ <feComposite in="flood" in2="SourceGraphic" operator="in" result="composite1"/>
+ <feGaussianBlur in="composite1" result="blur" stdDeviation="2"/>
+ <feOffset dx="0" dy="2" result="offset"/>
+ <feComposite in="SourceGraphic" in2="offset" result="composite2"/>
+ </filter>
+ </defs>
+ <circle cx="24" cy="24" r="20" fill="#EA4335" filter="url(#filter22)"/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug340047-ref.png b/rsvg/tests/fixtures/reftests/bugs/bug340047-ref.png
new file mode 100644
index 00000000..bc69bad6
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug340047-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug340047.svg b/rsvg/tests/fixtures/reftests/bugs/bug340047.svg
new file mode 100644
index 00000000..954bc7a7
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug340047.svg
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="744.09448819"
+ height="1052.3622047"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.47 r22583"
+ sodipodi:docname="New document 1">
+
+ <g fill = "navy">
+ <text x = "10" y = "25" font-size = "20" font-family="sans">
+ <tspan>
+ e = mc
+ <tspan baseline-shift = "super">
+ 2
+ </tspan>
+ </tspan>
+ <tspan x = "10" y = "60">
+ T
+ <tspan baseline-shift = "sub">
+ i+2
+ </tspan>
+ =T
+ <tspan baseline-shift = "sub">
+ i
+ </tspan>
+ + T
+ <tspan baseline-shift = "sub">
+ i+1
+ </tspan>
+ </tspan>
+ </text>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug363-missing-space-ref.png b/rsvg/tests/fixtures/reftests/bugs/bug363-missing-space-ref.png
new file mode 100644
index 00000000..be503be4
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug363-missing-space-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug363-missing-space.svg b/rsvg/tests/fixtures/reftests/bugs/bug363-missing-space.svg
new file mode 100644
index 00000000..8203f802
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug363-missing-space.svg
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 450" font-family="sans-serif" font-size="50">
+ <text x="20" y="100">hello <tspan>world</tspan></text>
+ <!-- <text x="20" y="150">hello<tspan> world</tspan></text> -->
+ <text x="20" y="200">hello <tspan> world</tspan></text>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug372-small-arcs-ref.png b/rsvg/tests/fixtures/reftests/bugs/bug372-small-arcs-ref.png
new file mode 100644
index 00000000..1bd1fa8c
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug372-small-arcs-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug372-small-arcs.svg b/rsvg/tests/fixtures/reftests/bugs/bug372-small-arcs.svg
new file mode 100644
index 00000000..d3ce679f
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug372-small-arcs.svg
@@ -0,0 +1,24 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="320" height="320" viewBox="0 0 16 16">
+ <path d="M 4.25 4
+ h .5
+ a .25 .25 0 0 1 .25 .25
+ V 5
+ h .75
+ a .25 .25 0 0 1 .25 .25
+ v .5
+ a .25 .25 0 0 1 -.25 .25
+ H 5
+ v .75
+ a .25 .25 0 0 1 -.25 .25
+ h -.5
+ A .25 .25 0 0 1 4 6.75
+ V 6
+ h -.75
+ A .25 .25 0 0 1 3 5.75
+ v -.5
+ A .25 .25 0 0 1 3.25 5
+ H 4
+ v -.75
+ A .25 .25 0 0 1 4.25 4
+ z"/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug373-gradient-userspaceonuse-ref.png b/rsvg/tests/fixtures/reftests/bugs/bug373-gradient-userspaceonuse-ref.png
new file mode 100644
index 00000000..5d8e4c42
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug373-gradient-userspaceonuse-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug373-gradient-userspaceonuse.svg b/rsvg/tests/fixtures/reftests/bugs/bug373-gradient-userspaceonuse.svg
new file mode 100644
index 00000000..218e5f79
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug373-gradient-userspaceonuse.svg
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ We draw a horizontal and a vertical line, both with a gradient.
+ Since gradientUnits="userSpaceOnUse", it does not matter that the
+ lines have an empty bounding box, as would be the case for
+ objectBoundingBox. Thus, the gradient *is* drawn (here, all green),
+ instead of leaving the lines unstyled.
+-->
+<svg
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ version="1.1"
+ x="0px"
+ y="0px"
+ width="200"
+ height="200"
+ viewBox="0 0 200 200"
+ xml:space="preserve">
+ <rect x="0" y="0" width="200" height="200" style="fill:blue" />
+ <g>
+ <radialGradient id="SVGID_19_" cx="100" cy="100" r="100" gradientUnits="userSpaceOnUse">
+ <stop offset="0" style="stop-color:green" />
+ </radialGradient>
+ <line
+ x1="100"
+ y1="0"
+ x2="100"
+ y2="200"
+ style="fill:none;stroke:url(#SVGID_19_);stroke-width:2;stroke-miterlimit:10"
+ />
+ <line
+ x1="0"
+ y1="100"
+ x2="200"
+ y2="100"
+ style="fill:none;stroke:url(#SVGID_19_);stroke-width:2;stroke-miterlimit:10"
+ />
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug403357-ref.png b/rsvg/tests/fixtures/reftests/bugs/bug403357-ref.png
new file mode 100644
index 00000000..6af46402
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug403357-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug403357.svg b/rsvg/tests/fixtures/reftests/bugs/bug403357.svg
new file mode 100644
index 00000000..67c72239
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug403357.svg
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--Bug 403357 – Marker display doesn't respect overflow property-->
+<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="200" height="160">
+ <defs>
+ <marker orient="0" markerHeight="10" markerWidth="10" viewBox="0 0 1 1" refY="0.5" refX="0.5" id="marker0" overflow="hidden">
+ <path d="M 0 0.5 L 0.5 1 L 1 0.5 L 0.5 0 Z" />
+ </marker>
+ <marker orient="0" markerHeight="5" markerWidth="5" viewBox="0 0 .5 .5" refY="0.5" refX="0.5" id="marker1" overflow="hidden">
+ <path d="M 0 0.5 L 0.5 1 L 1 0.5 L 0.5 0 Z" />
+ </marker>
+ <marker orient="0" markerHeight="5" markerWidth="5" viewBox="0 0 .5 .5" refY="0.5" refX="0.5" id="marker2" overflow="visible">
+ <path d="M 0 0.5 L 0.5 1 L 1 0.5 L 0.5 0 Z" />
+ </marker>
+ <marker orient="30" markerHeight="10" markerWidth="10" viewBox="0 0 1 1" refY="0.5" refX="0.5" id="marker3" overflow="hidden">
+ <path d="M 0 0.5 L 0.5 1 L 1 0.5 L 0.5 0 Z" />
+ </marker>
+ <marker orient="30" markerHeight="5" markerWidth="5" viewBox="0 0 .5 .5" refY="0.5" refX="0.5" id="marker4" overflow="hidden">
+ <path d="M 0 0.5 L 0.5 1 L 1 0.5 L 0.5 0 Z" />
+ </marker>
+ <marker orient="30" markerHeight="5" markerWidth="5" viewBox="0 0 .5 .5" refY="0.5" refX="0.5" id="marker5" overflow="visible">
+ <path d="M 0 0.5 L 0.5 1 L 1 0.5 L 0.5 0 Z" />
+ </marker>
+ <marker orient="0" markerHeight="10" markerWidth="10" refY="5" refX="5" id="marker10" overflow="hidden">
+ <path d="M 0 5 L 5 10 L 10 5 L 5 0 Z" />
+ </marker>
+ <marker orient="0" markerHeight="5" markerWidth="5" refY="5" refX="5" id="marker11" overflow="hidden">
+ <path d="M 0 5 L 5 10 L 10 5 L 5 0 Z" />
+ </marker>
+ <marker orient="0" markerHeight="5" markerWidth="5" refY="5" refX="5" id="marker12" overflow="visible">
+ <path d="M 0 5 L 5 10 L 10 5 L 5 0 Z" />
+ </marker>
+ <marker orient="30" markerHeight="10" markerWidth="10" refY="5" refX="5" id="marker13" overflow="hidden">
+ <path d="M 0 5 L 5 10 L 10 5 L 5 0 Z" />
+ </marker>
+ <marker orient="30" markerHeight="5" markerWidth="5" refY="5" refX="5" id="marker14" overflow="hidden">
+ <path d="M 0 5 L 5 10 L 10 5 L 5 0 Z" />
+ </marker>
+ <marker orient="30" markerHeight="5" markerWidth="5" refY="5" refX="5" id="marker15" overflow="visible">
+ <path d="M 0 5 L 5 10 L 10 5 L 5 0 Z" />
+ </marker>
+ </defs>
+ <path stroke="black" stroke-width="2" marker-start="url(#marker0)" marker-end="url(#marker10)" d="M 20 40 L 80 40" />
+ <path stroke="black" stroke-width="2" marker-start="url(#marker1)" marker-end="url(#marker11)" d="M 20 80 L 80 80" />
+ <path stroke="black" stroke-width="2" marker-start="url(#marker2)" marker-end="url(#marker12)" d="M 20 120 L 80 120" />
+ <path stroke="black" stroke-width="2" marker-start="url(#marker3)" marker-end="url(#marker13)" d="M 120 40 L 180 40" />
+ <path stroke="black" stroke-width="2" marker-start="url(#marker4)" marker-end="url(#marker14)" d="M 120 80 L 180 80" />
+ <path stroke="black" stroke-width="2" marker-start="url(#marker5)" marker-end="url(#marker15)" d="M 120 120 L 180 120" />
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug476507-ref.png b/rsvg/tests/fixtures/reftests/bugs/bug476507-ref.png
new file mode 100644
index 00000000..2a7f1b93
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug476507-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug476507.svg b/rsvg/tests/fixtures/reftests/bugs/bug476507.svg
new file mode 100644
index 00000000..26029ea8
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug476507.svg
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="744.09448819"
+ height="1052.3622047"
+ id="svg4454"
+ version="1.1"
+ inkscape:version="0.48.3.1 r9886"
+ sodipodi:docname="New document 10">
+ <defs
+ id="defs4456">
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lend"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path3786"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.35"
+ inkscape:cx="375"
+ inkscape:cy="520"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="472"
+ inkscape:window-height="383"
+ inkscape:window-x="600"
+ inkscape:window-y="271"
+ inkscape:window-maximized="0" />
+ <metadata
+ id="metadata4459">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1">
+ <path
+ style="fill:none;stroke:#000000;stroke-width:3.29999995;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow1Lend)"
+ d="m 237.45964,473.86553 c 0,0 133.56466,15.06684 176.97377,168.95554 2.11668,7.50381 4.58183,16.60919 4.58183,16.60919"
+ id="path4227"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="csc"
+ inkscape:export-xdpi="57.75"
+ inkscape:export-ydpi="57.75" />
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug481-tspan-uses-at-least-first-x-ref.png b/rsvg/tests/fixtures/reftests/bugs/bug481-tspan-uses-at-least-first-x-ref.png
new file mode 100644
index 00000000..b5883094
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug481-tspan-uses-at-least-first-x-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug481-tspan-uses-at-least-first-x.svg b/rsvg/tests/fixtures/reftests/bugs/bug481-tspan-uses-at-least-first-x.svg
new file mode 100644
index 00000000..7c7ed4a3
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug481-tspan-uses-at-least-first-x.svg
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200">
+ <!--
+ As of July 2019, librsvg does not support multiple positions in
+ the x/y/dx/dy attributes of text/tspan elements. This test is to
+ check that the library at least uses the first position specified.
+
+ (The reference PNG for this SVG is incorrect with respect to the
+ spec, since we don't actually use the second and third positions;
+ it's as if the "Foo" had normal letter spacing.)
+ -->
+ <text style="font-family: sans; font-size: 50; fill: black;" y="100">
+ <tspan x="70 120 170">Foo</tspan>
+ </text>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug494-text-accumulate-dy-ref.png b/rsvg/tests/fixtures/reftests/bugs/bug494-text-accumulate-dy-ref.png
new file mode 100644
index 00000000..67a52de8
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug494-text-accumulate-dy-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug494-text-accumulate-dy.svg b/rsvg/tests/fixtures/reftests/bugs/bug494-text-accumulate-dy.svg
new file mode 100644
index 00000000..6eea3686
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug494-text-accumulate-dy.svg
@@ -0,0 +1,14 @@
+<?xml version="1.0" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg" xml:lang="en" viewBox="0 0 178 178" version="1.1">
+<style type="text/css">
+ svg {
+ font-family: sans;
+ font-size: 44px;
+ }
+ </style>
+ <text x="0" y="0">
+ <tspan x="0" dy="1.2em">Tata</tspan>
+ <tspan x="0" dy="1.2em">Toto tu</tspan>
+ <tspan x="0" dy="1.2em">ppo</tspan>
+ </text>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug506-pattern-fallback-ref.png b/rsvg/tests/fixtures/reftests/bugs/bug506-pattern-fallback-ref.png
new file mode 100644
index 00000000..b9fec4e9
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug506-pattern-fallback-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug506-pattern-fallback.svg b/rsvg/tests/fixtures/reftests/bugs/bug506-pattern-fallback.svg
new file mode 100644
index 00000000..64f71050
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug506-pattern-fallback.svg
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ version="1.1"
+ width="256"
+ height="256"
+ viewBox="0 0 256 256">
+ <defs>
+ <pattern id="pattern1" xlink:href="#pattern2"/>
+ <pattern id="pattern2" patternUnits="userSpaceOnUse" width="1" height="1">
+ <image width="1" height="1" preserveAspectRatio="none"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAADElEQVQI12Ng+M8AAAICAQCqKp4n
+AAAAAElFTkSuQmCC"
+ x="0"
+ y="0"/>
+ </pattern>
+ </defs>
+ <rect x="100" y="100" width="56" height="56" style="fill:url(#pattern1);"/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug510-pattern-fill-opacity-ref.png b/rsvg/tests/fixtures/reftests/bugs/bug510-pattern-fill-opacity-ref.png
new file mode 100644
index 00000000..cad2c3e7
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug510-pattern-fill-opacity-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug510-pattern-fill-opacity.svg b/rsvg/tests/fixtures/reftests/bugs/bug510-pattern-fill-opacity.svg
new file mode 100644
index 00000000..569d8ba4
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug510-pattern-fill-opacity.svg
@@ -0,0 +1,21 @@
+<svg width="200" height="200" xmlns="http://www.w3.org/2000/svg">
+ <defs>
+ <linearGradient id="Gradient1">
+ <stop offset="5%" stop-color="white"/>
+ <stop offset="95%" stop-color="blue"/>
+ </linearGradient>
+ <linearGradient id="Gradient2" x1="0" x2="0" y1="0" y2="1">
+ <stop offset="5%" stop-color="red"/>
+ <stop offset="95%" stop-color="orange"/>
+ </linearGradient>
+
+ <pattern id="Pattern" x="0" y="0" width=".25" height=".25">
+ <rect x="0" y="0" width="50" height="50" fill="skyblue"/>
+ <rect x="0" y="0" width="25" height="25" fill="url(#Gradient2)"/>
+ </pattern>
+ </defs>
+
+ <rect fill="url(#Gradient1)" width="200" height="200"/>
+ <rect fill="url(#Pattern)" stroke="black" width="200" height="200" fill-opacity=".2"/>
+</svg>
+
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug510-pattern-fill-ref.png b/rsvg/tests/fixtures/reftests/bugs/bug510-pattern-fill-ref.png
new file mode 100644
index 00000000..6fdae2c4
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug510-pattern-fill-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug510-pattern-fill.svg b/rsvg/tests/fixtures/reftests/bugs/bug510-pattern-fill.svg
new file mode 100644
index 00000000..9698a03a
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug510-pattern-fill.svg
@@ -0,0 +1,21 @@
+<svg width="200" height="200" xmlns="http://www.w3.org/2000/svg">
+ <defs>
+ <linearGradient id="Gradient1">
+ <stop offset="5%" stop-color="white"/>
+ <stop offset="95%" stop-color="blue"/>
+ </linearGradient>
+ <linearGradient id="Gradient2" x1="0" x2="0" y1="0" y2="1">
+ <stop offset="5%" stop-color="red"/>
+ <stop offset="95%" stop-color="orange"/>
+ </linearGradient>
+
+ <pattern id="Pattern" x="0" y="0" width=".25" height=".25">
+ <rect x="0" y="0" width="50" height="50" fill="skyblue"/>
+ <rect x="0" y="0" width="25" height="25" fill="url(#Gradient2)"/>
+ </pattern>
+ </defs>
+
+ <rect fill="url(#Gradient1)" width="200" height="200"/>
+ <rect fill="url(#Pattern)" stroke="black" width="200" height="200"/>
+</svg>
+
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug548-data-url-without-mimetype-ref.png b/rsvg/tests/fixtures/reftests/bugs/bug548-data-url-without-mimetype-ref.png
new file mode 100644
index 00000000..9008274a
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug548-data-url-without-mimetype-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug548-data-url-without-mimetype.svg b/rsvg/tests/fixtures/reftests/bugs/bug548-data-url-without-mimetype.svg
new file mode 100644
index 00000000..f2cd71c7
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug548-data-url-without-mimetype.svg
@@ -0,0 +1,6 @@
+<svg xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink" width="10" height="10">
+ <image
+ xlink:href="data:;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAIAAAACUFjqAAAAFElEQVQY02Nk+M+ABzAxMIxKYwIAQC0BEwZFOw4AAAAASUVORK5CYII="
+ x="0" y="0" width="10" height="10"/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug563933-ref.png b/rsvg/tests/fixtures/reftests/bugs/bug563933-ref.png
new file mode 100644
index 00000000..1e50f0d6
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug563933-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug563933.svg b/rsvg/tests/fixtures/reftests/bugs/bug563933.svg
new file mode 100644
index 00000000..dd920ba9
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug563933.svg
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="80" height="128" version="1.1">
+<g id="clubart">
+<g fill="#7F7F7F">
+<path d="M37.88,44.11c-.62,0.11-1.16,0.88-1.45,1.38c-.19,0.32-.19,0.75-.37,1.05c-.28,0.47-.3-.62-.3-.68c.09-1.01-.21-1.16-1.31-.63c-.98,0.49-2.44,1.49-2.66,2.67c-.18,0.93-1.23,2.09-2.03,2.54c-.34,0.17-.36,0.15-.17-.37c.13-.3,0.41-.82,0.64-1.12c.43-.54,0.41-.97-.02-.54c-.13,0.13-.38,0.19-.54,0.13c-.34-.13-.35,0.46-.35,0.64c.02,0.54-.28,0.44-.33,0.87c-.1,0.76-.19,1.29-.54,1.97l-.26-.75c-.34-1.01-.9-1.05-1.78-.15c-.44,0.45-.83,1.08-.97,1.7c-.02,0.09-.09,0.38,0.1,0.38c.21,0,0.28-.96,0.41-1.14c.21-.25,1.21-1.71,1.71-1.41c.79,0.47,0,2.35-.08,2.98c-.01,0.24-.95,1.79-1.18,1.65c.08,0.05,0.9-2.6,0.95-3.01c.08-.59-.17-.5-.4-.07c-.18,0.34-.28,0.73-.51,1.05c-.06,0.08-.46,0.24-.44,0.2c.02,0.05,0.03,0.1,0.05,0.15c.26,0.39-.06,1.21-.15,1.63l-.19-.73c-.28-.99-.39-.75-.17,0.36c.13,0.71,0.09,1.01-.17,1.27c-.64,0.57-.59,2.09-.78,2.87c-.08,0.31-.14,0.78-.34,1.04c-.08,0.1-.17-.1-.18-.14c-.07-.32,0.09-.71,0.21-1c.38-.84-.34-2.34-.77-1.63c-.11,0.19,0.46,0.45,0.28,0.86c-.38,0.85-.61-.58-.64-.6c-.08,0.02-.14,0.08-.17,0.17c-.34,0.54-.24,1.27,0.21,1.51c.44,0.24,0.65,1.14,0.87,1.58c.32,0.63,0.31,1.19-.49,1.13c-.69-.02-.71,0-.77,0.9c-.07,0.92,0.36,1.53,0.57,2.38c.17,0.66,0.84,0.99,1.33,1.42c.29,0.25,2.49,2.53,1.87,2.96c-.65,0.39-.76-.43-.93-.87c-.23-.61-.77-.84-1.39-.92c-.47-.09-.54-.02-.47,0.56c.07,0.56,0.27,1.1,0.89,1.17c.38,0.05,1.31-.01,0.82,0.61c-.35,0.42,0.44,0.19,0.62,0.15c.65-.1,1-.04,1.46,0.45c1.1,1.17-.12,0.69-.88,1.25c-.41,0.3-.41,0.32,0,1.03c.21,0.39,0.68,0.99,1.05,1.31c.8,0.77,1.73,0.56,2.77,0.54c.26,0,2.29,0.18,1.02,0.53c-.58,0.15-.54,0.5,0.13,0.92c.63,0.42,0.89,0.11,1.51-.17c.51-.23,1.1-.06,1.62,0.06c.98,0.2,1.91,0.48,2.85,0.82c-.36,0.01-1.29,0.16-1.5-.19c-.19-.32-1.61-.24-2.53,0.17c-.81,0.37-.84,0.39-.39,0.77c.48,0.45,0.94,0.18,1.5,0.04c.46-.12,0.86-.02,0.25,0.31c-.71,0.37-.54,0.58,0.47,0.6c.53,0,1.09,0.03,1.61,0.15c.75,0.16,1.06-.33,1.73-.44c.39-.07,0.75,0.41,1.25,0.32c.48-.08,1.01-.38,1.17-.87c.1-.36,3.14,0.85,3.49,1.01c.39,0.15,0.41,0.13,0.11-.24c-.24-.3-.26-.41-.04-.47c.54-.19,0.24-.49-.6-.62c-.04-.01-1.15-.31-.98-.42c.29-.19,1.24,0.21,1.58,0.27c.39,0.07,0.79,0.15,1.19,0.13c.71-.03,1.15-.51,1.59-1.01c.79-.92,0.83-1.08,0.26-1.48c-1.01-.71,1.39-.57,1.7-.71c1.1-.47,1.81-1.11,2.43-2.19c.12-.23,0.36-.56,0.17-.82C52,71.19,51.69,71,51.84,70.77c.4-.62,1.47-.56,1.95-1.13c.32-.39-.88-.32-1.37,0.08c-.51,0.43-.41,0.09,0.24-.77c.5-.66,1.17-.94,1.85-1.35c.8-.48,1.46-1.2,1.89-2.03c.29-.59,0.37-1.15,0.33-1.81c-.05-.81-.02-1.94-.39-2.69c-.35-.65-1.46-.01-1.45,0.01c-.01-.05-.02-.11-.02-.16c.02-.28,0.17-.62,1.07-2.26c.17-.32,0.17-.62,0.02-1.03c-.21-.56-.26-.58-.75-.26l-.49,0.34c.13-.71,0.21-1.46,0.54-2.11c.24-.41,0.21-.47-.06-.37c-.24,0.11-.32-.02-.34-.47l-.02-.62c-.16,0.49-.28,0.96-.33,1.48c-.02,0.17,0.04,1.68-.29,1.14c-.39-.65-.02-1.69,0.16-2.34c.29-1.06,0.28-1.49-.24-2.48c-.36-.67-.86-1.35-1.13-1.53c-.43-.28-.47-.28-.34,0.04c.12,0.37,0.44,0.21,0.64,0.44c.21,0.24,0.29,0.78,0.47,1.07c.47,0.74,0.74,1,0.47,1.89c-.24,0.8-.28,0.86-.49,0.5c-.15-.3-.19-.68-.22-1.01c-.01-.1-.14-1.03-.16-.99c-.09,0.13-.21,0.02-.3-.24c-.06-.24-.09-.54-.02-.62c.16-.27-.35-.17-.42-.11c-.24,0.21-.07,0.46-.52,0.35c-.45-.13-.58-.6-.21-.82c.13-.07,0.21-.3,0.19-.5c0-.27-.41,0.51-.41,0.5c-.12,0.25-.24,0.5-.36,0.75c-.14-.32-.31-.65-.39-.99c-.05-.23-.01-1.46-.4-1.31c-.32,0.14-.44-.2-.7-.24c-.27-.03,0.23,0.6,0.19,0.56c.04,0.06,0.09,0.13,0.13,0.19c.01,0.25-.69-.25-.71-.27c-.41-.34-.77-.75-1.09-1.17c-.58-.75-.73-1.89-1.42-2.52c-.56-.52-1.61-.9-1.37-.52c.19,0.27,0.63,0.26,0.88,0.48c.35,0.31,0.69,0.76,0.81,1.22c.09,0.41,0.06,0.45-.19,0.24c-.19-.16-.11-.65-.19-.58c-.25,0.25-1.39-.69-1.76-.69c-.1-.02-.19,0-.27,0.05c0,0.18,0.84,0.47,0.38,0.66c-.15,0.06-.02,0.13,0.3,0.13c.22,0.01,0.5,0.05,0.67,0.2c.25,0.23-.22,0.25-.17,0.38c.07,0.22,0.7,0.27,0.88,0.42c.28,0.23-.25,0.41-.46,0.1c-.13-.27-.97-.33-1.24-.57c-.51-.44-.92-1.04-1.18-1.66l-.28-.67c.07,0.52,0.14,1.03,0.19,1.55c-.36-.2-.74-.38-1.1-.6c-.67-.42-.72-1.11-1.56-1.35c-.64-.19-1.24,0.41-.94,0.92c.35,0.72-1.07,1.07-.62,1.68c.33,0.39,0.9,0.13,0.71,0.8c-.15,0.64,0.06,0.77,1.44,0.88c.73,0.05,1.31-.05,1.93-.45c.54-.34,1.25-.71,1.86-.32c.58,0.36-1.59,0.56-1.5,0.6c.13,0.04,0.21,0.19,0.13,0.3c-.19,0.34,1.03,0.04,1.12,0c.56-.25,1.08-.63,1.74-.47c.11,0.03,0.47,0.29,0.15,0.38c-.22,0.06-.51-.06-.76-.01c-.45,0.1-1.16,0.34-1.4,0.76c-.15,0.24,0.62,0.99,1.99,2.02c.55,0.42,1.25,0.71,1.95,0.63c.78-.09,1.04-.5,1.69,0.15l0.54,0.54l-.81-.02c-.62-.02-.83,0.06-.9,0.34c-.11,0.56,0.75,1.31,1.33,1.16c1.18-.31,0.17,0.87-.07,1.32c-.37,0.71-.04,1.64,0.11,2.36c.15,0.9,1.09,1.58,1.71,2.17c.21,0.21,1.57,1.33,1.13,1.71c-.15,0.13-.68-.74-1.14-.38c-.36,0.31-.33,0.86-.59,1.25c-.3,0.44-.85,0.82-.94,1.38c-.08,0.49,0.08,0.79-.17,1.24c-.26,0.48-.04,1.28,0.2,1.72c.54,0.95,0.41,1.38-1.11,3.29l-.49,0.62c-.02-.6,0.03-1.27-.19-1.83c-.13-.37-.19-.34-.73,0.15c-.55,0.51-.54,0.96-.45,1.68c.09,0.86-.07,1.42-.54,2.15c-.03,0.06-1.08,1.26-1.08,0.99c.05-.05,0.11-.1,0.16-.15c.15-.08,0.43-.43,0.6-.77c.34-.69,0.41-1.91,0.09-1.72c-.28,0.18-.05,0.83-.15,1.12c-.19,0.57-.62,1.06-1.07,1.44c-.25,0.21-.57,0.5-.9,0.54c-.21,0.03-.34-.23-.13-.36c.15-.03,0.29-.07,0.43-.13c.01-.1,0.01-.2,0-.3c.1-.04,0.2-.08,0.3-.11c.22-.13,0.39-.37,0.52-.59c.47-.79,0.36-.82-.41-.11c-.42,0.38-.48,0.43-.87,0.14c.35,0.27-1.27,1.75-1.06,0.98c.06-.13,0.15-.52,0.21-.86c.12-.43,0.29-.46,0.64-.63c.36-.18,0.58-.52,0.88-.78c.15-.13,1.49-.87,1.55-.81c-.44-.44-1.7,0.6-2.01,0.85c-.4,0.31-.77,0.65-1.09,1.04c-.1,0.12-.67,1.06-.55,1.15c-.05-.09-.07-.19-.07-.29c-.15-.6-.69-.51-1.11-.25c-.57,0.35-.5,0.72-.79,1.23c-.1,0.19-.26,0.37-.44,0.48c-.26,0.17-.26-.1-.41-.06c-.23,0.07-.91,1.44-1.11,1.29c-.25-.28,0.57-1.18,0.74-1.35c.43-.42,1.34-.29,0.86-1.27c-.24-.54-1.01-.51-1.51-.56c-.27-.02-3.3-.04-3.32-.09c.12,0.31,1.66,0.34,1.93,0.37c.44,0.05,0.89,0.09,1.34,0.08c.17,0,1.01-.2,0.88,0.06c-.22,0.33,0.51,0.16,0.51,0.41c0,0.25-3.94-.02-4.35-.02c-.16,0-.63,0.03-.72-.17c-.04-.08,0.1-.53-.01-.52c-.21,0.04-.23,0.22-.46,0.08c-.38-.24-.62-.67-.94-.97c-.5-.47-1.43-1.12-2.15-.74l-.47,0.26l0.49-.11c.64-.13,1.41,0.3,2.21,1.18c.62,0.71,0.86,1.59,0.36,1.42c-.15-.04-.26-.26-.21-.45c.08-.5-.42-.16-.64-.37c-.12-.12-.17-1.01-.39-.59c-.23,0.37-.58-.56-1.01-.6c-.56-.07-.66,0.3-.17,0.49c.33,0.17,0.03,0.31,0.21,0.46c.18,0.15,0.61-.02,0.45,0.38c-.18,0.49,0.68,0.22,0.86,0.36c.11,0.09-.38,0.25-.29,0.35c.11,0.05,0.24,0.07,0.36,0.06c.51,0,0.51,0.02,0.09,0.24c-.39,0.17-.6,0.08-1.39-.65c-.76-.73-1.15-1.55-1.48-2.51c.09,0.68,0.09,1.57,0.58,2.11c.66,0.73-.04,0.3-1.2-.75c-1.16-1.03-1.31-1.44-.75-1.89c.19-.17,0.3-.54,0.26-.95c-.08-1.01-1.15-.9-1.48-.09c-.17,0.39-.26,0.79-.24,0.9c.04,0.11-.09,0.08-.26-.09c-.41-.32-.45-.51-.09-.3c.17,0.11,0.19,0.04,0.09-.26c-.16-.38-.45-.96-.21-1.37c.23-.4,0.39-.7,0.42-1.18c.07-1.03-.2-2.32-.92-3.11c-.47-.51-.49-.51-.92-.13c-.23,0.21-.51,0.69-.62,1.05c-.17,0.6-.19,0.58-.21-.45c-.01-.44-.05-1.01,0.3-1.34c.45-.42,0.63-.73,0.54-1.38c-.11-.84-.23-1.22,0.28-1.96c.35-.52,0.2-1.1,0.09-1.68c-.24-1.38-.6-1.7-1.24-1.12c-.62,0.56-.68,0.32-.17-.49c.6-.92,1.68-.55,2.21-1.57c.06-.12,0.49-.73,0.17-.82c-.29-.07-.82-.09-.5,0.3c.21,0.26,0.19,0.34-.11,0.45c-.32,0.13-.89-.38-.53-.51c.24-.08,0.15-.34,0.26-.5c.18-.29,0.52-.5,0.81-.66c.9-.52,1.13-.94,0.43-.75c-.29,0.08-.6-.11-.26-.26c.44-.2,0.98-.23,1.45-.29c1.16-.15,1.98-.5,2.98-1.12c.41-.24,1.56-1.39,1.14-1.96c-.3-.4-.25,0.26-.26,0.37c-.06,0.37-.28,0.76-.52,1.04c-.22,0.25-.51,0.23-.75,0.46c-.19,0.18-.5,0.28-.73,0.38c-.14,0.06-1.73,0.49-1.7,0.4c.04-.15,0.17-.26,0.28-.28c.62,0,1.16-.64,1.8-.56c.06,0,0.12,0,0.17,0c.03-.05-.53-.21-.19-.47c.07-.05,1.09-.25,0.83-.4c-.44-.26-1.64,0.29-2.03,0.55c-.31,0.22-.27-.14-.64,0.19c-.25,0.2-.58,0.38-.9,0.45c-.49,0.13-.47,0.09,0.15-.56c.72-.72,1.93-1.01,2.89-1.31c.45-.15,0.48-.61-.09-.34c-.71,0.39-.98,0.11-.32-.32c1.33-.87,3.05-.16,4.46-.06c.75,0.05,3.56-.12,3.59-1.3c0-.41-1.5-.99-1.78-.71c-.24,0.24,0.99,0.36,1.22,0.52c.36,0.26,0.34,0.3-.21,0.69c-.64,0.43-2.06,0.58-3.26,0.39c-1.28-.21,0.44-.42,0.82-.44c.14-.01,2.26,0.02,1.86-.42c-.15-.15-1.33-.13-3.04,0.02c-1.07,0.11-1.07,0.11-.32-.15c.41-.15,0.86-.32,1.01-.43c.37-.24,0.86,0.13,1.28-.13c.32-.19,0.28-.21-.32-.24c-1.39,0,0.34-.48,0.76-.55c.94-.14,1.29-.79,1.72-1.58c.17-.32,0.19-.6,0.06-.73c-.18-.18-.54,1-.63,1.13c-.35,0.52-.92,0.85-1.53,0.97l-.75,0.13c.59-.31,1.17-.62,1.65-1.1c.34-.37,0.34-.41,0-.54c-.19-.06-.39-.02-.43,0.09c-.04,0.11-1.46,1.01-1.46,1.02c-.02-.07,0-.14,0.04-.2c.12-.36,0.49-.4,0.62-.77c.2-.6,1.82-.45,1.82-.88C39.02,43.8,38.05,44.08,37.88,44.11 M41.11,45.29c-.08,0.25-.6,0.54-.6,0.09C40.51,44.96,41.21,44.94,41.11,45.29 M35.48,45.74c-.45,1.57-1.18,2.43-2.4,2.86c-.83,0.3-.96-.04-.15-.34c.49-.21,0.58-.77,1.05-1.09c.27-.18,1.07-.63,0.51-.95c-.39-.25-.64,0.82-.94,0.32c-.21-.34,0.81-1.18,1.54-1.25C35.55,45.24,35.59,45.31,35.48,45.74 M41.58,45.67c0,0.28-.48,0.27-.32,0C41.36,45.47,41.58,45.36,41.58,45.67 M40.9,46.47c-.87,0.23,0.04,0.47,0.04,0.73c0,0.29-.95-.06-1.05-.15c-.17-.15,0.71-.71,1.05-.71C41.18,46.36,41.16,46.41,40.9,46.47 M42.08,46.47c-.15,0.04-.41,0.04-.54,0C41.24,46.34,42.34,46.34,42.08,46.47 M33.45,46.66c0,0.29-.28,0.73-.55,0.84c-.17,0.07-.31-.15-.31,0.17c0,0.21-.14,0.44-.3,0.56c-.41,0.34-.17-.77,0.28-1.29C32.89,46.58,33.45,46.41,33.45,46.66 M42.83,47.31c-.15,0.04-1.03,0.26-1.03,0.5c0,0.75,0.71-.06,0.94,0.08c.55,0.34,0.21,0.38,0.8-.06c.1-.08,0.98-.42,0.72,0c-.32,0.52-1.63,0.92-2.61,0.77c-.56-.06-1.03-.17-1.09-.21c-.04-.04,0.09-.34,0.28-.65c.39-.56,0.77-.71,2.14-.73l0.86-.02L42.83,47.31 M48.59,49.59c.54,0.23,1.16,0.62,1.49,1.13c.32,0.49-.36,0.2-.53-.16c-.17-.36-.24-.39-.24-.11c-.08,0.76-1.09,0.04-1.35-.32c-.17-.25-.7-.26-.96-.24c-.78,0.06,0.41,0.53,0.25,0.74c.02-.04,2.33,0.74,2.57,0.86c.47,0.26,0.69,0.41,0.47,0.34c-.76-.23-1.17,0.64-1.99,0.26c-.42-.18-.63-.51-.99-.73c-.47-.29-.91-.44-1.34-.83c-.6-.52-.75-.75-.54-.84C46.6,49.29,47.82,49.26,48.59,49.59 M52.42,52.21c.39,0.31,0.12,0.66,0.45,1.03c.42,0.45-.27,0.74,0.19,0.9c.19,0.06,0.3,0.19,0.24,0.28c-.47,0.43-1.08-1.47-1.22-1.66C51.42,51.91,51.59,51.61,52.42,52.21 M29.16,52.55c0,0.23-.71,0.31-.81,0.17c.02-.08,0.07-.14,0.16-.17C28.93,52.28,29.16,52.28,29.16,52.55 M50.3,53.76c-.19,0.19-.6-.13-.45-.39c.09-.13,0.21-.13,0.36,0.02C50.34,53.52,50.39,53.67,50.3,53.76 M51.89,54.1c.23,0.45,0.23,0.47-.09,0.19C51.27,53.92,51.47,53.3,51.89,54.1 M51.01,54.15c0,0.24-.41,0.32-.54,0.13C50.3,53.99,51.01,54.01,51.01,54.15 M52.08,55.46c.13,0.14,0.35,0.32,0.56,0.32c.34,0,0.31,0.43,0.45,0.64c.35,0.57,0.52,1.1,0.58,1.79c.11,1.14,0.09,1.23-.3,1.01c-.51-.28-.78-1.17-.93-1.68c-.07-.23-.17-.55-.08-.79c.19-.43-.49-.4-.49,0.04c-.02,0.34-.04,0.34-.32-.02c-.06-.12-.16-.2-.28-.25c-.3,0.07,1.08,1.41,0.94,1.58c-.18,0.13-.64-.37-.81-.45c-.45-.17-.51-1.1-.11-1.93C51.59,55.05,51.72,55,52.08,55.46 M26.81,56.1c0,0.4-.43,0.4-.43,0C26.38,55.71,26.81,55.7,26.81,56.1 M55.72,57.93c0,0.33-.89,0.24-.75,0C55.08,57.72,55.72,57.57,55.72,57.93 M26.87,59.39c.03,0.43,0.05,1.08-.21,1.46c-.28,0.4-.18,1.05-.58,1.35c-.26,0.22-.3,0.17-.24-.34c.05-.39,0.18-.75,0.24-1.14c.08-.45,0.06-.95-.06-1.39c-.07-.25-.39-.37-.4-.4c-.03-.08,0.3-.42,0.32-.44C26.59,57.78,26.83,57.99,26.87,59.39 M52.29,59c-.19,0.13-.15,0.24,0.17,0.41c.26,0.13,0.56,0.43,0.69,0.64c.19,0.41,0.17,0.41-.45,0.09c-.5-.24-1.04-.89-1.34-1.35c-.11-.17-.23-.55-.11-.75c.09-.15,0.61,0.31,0.63,0.33C52.34,58.7,52.46,58.9,52.29,59 M23.59,58.79c0,0.11-.15,0.15-.32,0.09c-.13-.04-.23-.12-.32-.21C22.95,58.52,23.59,58.52,23.59,58.79 M25.35,60.21c-.06,0.32-.17,0.47-.3,0.34C24.64,60.14,25.59,59.07,25.35,60.21 M53.75,60.53c-.06,0.43-.11,0.41-.19-.19c0-.03-.1-.49,0.01-.53C53.79,59.73,53.76,60.47,53.75,60.53 M56.11,61.93c.04,0.45,0.17,0.95,0.26,1.08c.24,0.26,0.06,1.68-.28,2.45c-.28,0.62-1.44,1.78-1.61,1.63c.1,0.1,1.46-1.96,1.54-2.23c.23-.76-.05-2.33-.68-.91c-.17,0.37-.38,0.58-.51,0.52c-.3-.21,0.27,1.05-.28,0.86c-.24-.11-.28-.04-.19,0.22c.2,0.45-.44,0.24-.28,0.62c.06,0.17,0.02,0.43-.11,0.6c-.17,0.28-.03-.99-.01-1.13c.07-.56,0.16-1.04,0.35-1.58c.17-.5,0.15-1.2,0.68-1.43c.15-.07,1.08-.77,0.87-.98c-.06-.09-.32,0.04-.56,0.26c-.43,0.39-.45,0.39-.28-.02C55.44,60.72,56.02,60.72,56.11,61.93 M53.15,62.36c0,1.11-.81-.81-.21-.45C53.06,61.97,53.15,62.19,53.15,62.36 M24.09,62.36c.41,0.15,0.47,0.43,0.15,0.62c-.35,0.21-.05-.48-.51-.06c-.21,0.19-.24,0.32-.04,0.43c.15,0.11,0.13,0.17-.09,0.17c-.24,0.02-.21,0.08,0.09,0.32c.48,0.35,0.43,1.16,0.86,1.7c.73,0.99,0.71,1.05-.19,0.49c-.63-.4-.8-1.09-1.04-1.75c-.19-.51-.49-1.61-.2-2.12c.06-.09,0.21-.13,0.34-.07C23.59,62.19,23.87,62.29,24.09,62.36 M26.49,62.87c-.1,0.16-.62,0.32-.43,0C26.15,62.7,26.66,62.53,26.49,62.87 M24.6,63.56c-.06,0.17-.13,0.11-.13-.13c-.02-.24,0.04-.37,0.11-.28C24.64,63.22,24.67,63.41,24.6,63.56 M53.36,64.1c0,0.27-.87-.69-1.03-.68c-.26,0.02,0.42,0.57,0.44,0.59c.19,0.25,0.07,0.96,0.42,1.06c.32,0.11-.15,1.76-.62,2.13c-.06,0.08-.15,0.13-.24,0.14c-.06-.02,0.58-1.23,0.52-1.45c-.1-.46-.16-1.31-.5-1.68c-.29-.31-.14,1.15-.53,0.9c-.27-.17,0.28,0.52,0.23,0.63c-.08,0.17-.35,0.08-.28,0.36c.04,0.15,0.27,0.42,0.24,0.58c-.06,0.04-.12,0.03-.17-.04c-.05-.02-.1-.04-.14-.07c.21,0.01-.16,1.1-.41,0.39c-.23-.64,0.03-1.54,0.15-2.17c.28-1.42,0.68-1.83,1.41-1.33C53.13,63.63,53.36,63.93,53.36,64.1 M25.42,65.02c.13,1.08,0.11,1.14-.17,0.67c-.27-.41-.18-.84-.17-1.28c.02-.42-.25,0.02-.39-.08c-.09-.06,0.1-.46,0.11-.48C25.03,63.26,25.27,63.75,25.42,65.02 M27.86,65.73c.51,1.05,0.58,2.64,0.15,3.22c-.28,0.34-.3,0.34-.43-.19c-.09-.32-.04-.69,0.06-.79c.17-.17,0.3-.53,0.22-.77c-.04-.11-.37,0.49-.4,0.37c-.08-.27,0.08-.62,0.27-.8c.13-.06,0.17-.12,0.12-.2c-.33,0.08-.43,0.22-.29-.27l0.15-.52l-.54,0.5c-.39,0.37-.51,0.67-.45,1.08c.09,0.54,0.06,0.56-.21,0.17c-.43-.51,0.23-1.07-.04-1.48c-.18-.18,0.38-.86,0.48-.99C27.39,64.51,27.67,65.33,27.86,65.73 M53.17,67.24c-.21,0.19-.24,0.17-.11-.13c.06-.21,0.19-.32,0.26-.26C53.39,66.92,53.32,67.09,53.17,67.24 M51.82,67.93c-.06,0.07-.19-.04-.26-.26c-.13-.3-.11-.32,0.11-.13C51.82,67.69,51.89,67.86,51.82,67.93 M54.16,67.52c-.06,0.07-.26,0.09-.41,0.02c-.17-.06-.11-.13,0.13-.13C54.11,67.39,54.24,67.45,54.16,67.52 M27.34,69.3c.28,0.49-.11,0.21-.45-.3c-.19-.28-.26-.65-.17-.8c.11-.17,0.21-.09,0.32,0.3C27.13,68.83,27.26,69.17,27.34,69.3 M24.62,68.51c-.08,0.25-.6,0.54-.6,0.09C24.02,68.19,24.72,68.15,24.62,68.51 M51.99,68.83c-.21,0.56-1.5,2.19-1.71,2.21c0,0,0.91-1.35,0.99-1.47c.13-.2,0.38-.51,0.38-.77C51.65,68.41,52.13,68.36,51.99,68.83 M25.09,69.11c0,0.31-.69,0.26-.54,0C24.66,68.91,25.09,68.76,25.09,69.11 M27.9,70.23c.24,0.45,0.24,0.47-.09,0.19C27.28,70.04,27.48,69.43,27.9,70.23 M49.08,70.08c0,0.54-1,0.3-.49-.17C48.82,69.65,49.08,69.73,49.08,70.08 M30.02,70.18c0,0.33-.89,0.24-.75,0C29.37,69.98,30.02,69.82,30.02,70.18 M48.87,70.83c0,0.35-.43,0.18-.54,0C48.19,70.54,48.87,70.53,48.87,70.83 M29.59,71.04c0,0.28-.43,0.27-.43,0C29.16,70.77,29.59,70.76,29.59,71.04 M51.87,71.45c0,0.34-.56,1.31-.79,1.42c-.38,0.13-.34-.45,0.06-.84c.7-.74-1.12,0.19-1.25,0.21c-.44,0.06-.15,0-.42,0.27c-.09,0.09-.53,0.19-.71,0.38c-.64,0.69-.86,0.67-.39-.08c.54-.82,1.16-1.31,1.67-1.33c.24,0,0.56-.09,0.73-.19C51.07,71.09,51.87,71.21,51.87,71.45 M28.41,72.12c.24,0.4,0.9,0.14,1.18,0.65c.23,0.42,0.67,0.32,0.94,0.75c.45,0.69,0.15,0.69-.6,0c-.19-.18-.45-.36-.71-.41c-.14-.03-.35,0.12-.45-.04c-.22-.35-.19-.81-.62-.11c-.55,0.86,1.68,0.34,0.88,1.01c-.1,0.06-.18,0.13-.26,0.22c0,0.01,0.99-.17,0.98-.11c-.04,0.09-.11,0.17-.19,0.24c-.29,0.31-1.19,0.4-1.44-.02c-.31-.5-.84-.72-1.13-1.27c-.05-.1-.47-.73-.3-.82c.38-.2,1.01-.26,1.44-.26C28.22,71.92,28.35,71.99,28.41,72.12 M50.52,73.52c-.2,0.41-.67,0.24-.99,0.43c-.24,0.13-.7,0.56-1.02,0.3c-.08-.07,0.41-.44,0.36-.4c.31-.26,1.23-.35,1.39-.67C50.47,72.85,50.67,73.11,50.52,73.52 M43.08,74.05c0,0.28-.43,0.27-.43,0C42.66,73.78,43.08,73.77,43.08,74.05 M42.38,74.74c-.06,0.17-.13,0.11-.13-.13c-.02-.24,0.04-.37,0.11-.28C42.42,74.4,42.44,74.59,42.38,74.74 M40.09,75.04c0,0.06-.11,0.3-.21,0.54c-.21,0.39-.28,0.39-.71,0.09c-.36-.24-1.34-.2-1.54-.54C37.54,75.01,40.09,74.71,40.09,75.04 M47.86,75.32c.15,0.15-.06,0.5-.62,1.08c-.72,0.77-1.79,1.28-2.78,0.56c-.39-.32-.39-.32,0.19-.19c.6,0.14,0.5-.4,1.01-.13c.2,0.1,1.07-.14,1.07-.41c0-.24-1.83-.12-1.98-.12c-.07,0-1.16,0.01-.89-.12c.31-.13,0.48-.38,0.75-.53c.33-.18,0.94,0,1.17-.35C45.95,74.83,47.52,74.98,47.86,75.32 M35.48,75.56c.17,0.28-.32,0.28-.75,0c-.09-.03-.14-.09-.17-.17C34.69,75.2,35.39,75.38,35.48,75.56 M37.6,75.67c.06,0.11,0.08,0.21,0.04,0.32c-.13-.09-.25-.19-.34-.32C36.96,75.22,37.46,75.38,37.6,75.67 M31.95,75.88c0,0.4-.43,0.39-.43,0C31.52,75.49,31.95,75.48,31.95,75.88 M38.69,76.83c-.38,0.34-.98-.64-.72-.97c.06-.08,0.42,0.41,0.38,0.36C38.59,76.5,38.74,76.78,38.69,76.83 M38.91,75.99c.17,0.29-.6,0.29-.43,0C38.61,75.73,38.78,75.73,38.91,75.99 M41.5,76.53c-.3,0.28-.56,0.69-.58,0.9c0,0.24-.06,0.28-.13,0.11c-.04-.13-.19-.21-.3-.15c-.28,0.17,0.02-.58,0.41-1.03C41.3,75.9,42.36,75.73,41.5,76.53 M34.67,77.43c-.19,0.19-.41,0.3-.49,0.24c-.45-.45,0.76-.71,0.75-.55C34.86,77.24,34.78,77.34,34.67,77.43 M36.32,77.54c.19,0.26,0.3,0.52,0.23,0.56c-.11,0.11-1.16-.67-1.18-.88C35.37,76.87,36.02,77.08,36.32,77.54 M39.55,77.64c.23,0.24,0.91,1.15,0.07,0.75c-.39-.19-.8-1.08-1.07-.62c-.2,0.41-.72,0.41-1.05,0.71c-.28,0.26-.41,0.26-.54,0.06c-.09-.15-.06-.21,0.06-.13c.32,0.2,1.2-.88,1.38-1.04C38.92,76.92,39.11,77.17,39.55,77.64 M43.81,77.84c.47,0.19,0.21,0.49-.3,0.36c-.24-.07-.36-.19-.3-.3C43.34,77.67,43.38,77.67,43.81,77.84"/>
+<path d="M48.44,50.19c0,0.27,0.48,0.27,0.32,0C48.66,49.99,48.44,49.87,48.44,50.19"/>
+<path d="M52.74,57.2c0,0.24,0.06,0.3,0.13,0.13c.06-.15,0.04-.34-.02-.41C52.79,56.83,52.72,56.96,52.74,57.2"/>
+<path d="M53.19,58.36c0,0.3,0.04,0.41,0.11,0.26c.04-.13,0.04-.39,0-.54C53.24,57.95,53.19,58.06,53.19,58.36"/>
+<path d="M54.86,63.52c0,0.27,0.48,0.27,0.32,0C55.09,63.32,54.86,63.2,54.86,63.52"/>
+<path d="M45.12,75.77c-.16,0.27,0.32,0.27,0.32,0C45.44,75.46,45.22,75.57,45.12,75.77"/>
+</g>
+<g fill="#282828">
+<path d="M37.81,44.4c-.06,0.13,0.02,0.15,0.19,0.09C38.69,44.22,37.99,44.05,37.81,44.4"/>
+<path d="M41.04,45.16c.13,0.26,0.64,0.25,0.68,0.46c.05,0.25-.3,0.43-.49,0.47c-.19,0.04-.32,0-.24-.13c.06-.11-.06-.26-.3-.32c-.51-.13-.54-.06-.09,0.37c.4,0.45,1.05,0.17,1.5,0.46c.42,0.27-1.07,0.23-1.18,0.29c-.47,0.3,0.09,0.45,0.84,0.24c.39-.11,0.79-.15,0.88-.09c.39,0.24,0.17-.28-.47-1.16C41.54,44.88,40.79,44.49,41.04,45.16"/>
+<path d="M37.1,45.82c-.9,0.77-1.18,1.25-.58,1.03c.26-.13,0.33-.49,0.62-.68c.31-.2,1.04-.46,1.15-.87C38.39,44.88,38.02,45,37.1,45.82"/>
+<path d="M38.67,45.99c-.53,0.34-1.13,0.54-1.71,0.77c.67-.11,1.4-.19,1.93-.67C39.37,45.63,39.27,45.56,38.67,45.99"/>
+<path d="M34.06,46.55c0,0.24-.6,0.29-.73,0.54c-.17,0.49,0.17,0.39,0.73-.21c.08-.09,0.33-.34,0.31-.5C34.35,46.22,34.06,46.44,34.06,46.55"/>
+<path d="M44.02,46.53c.28,0.52-1.05-.1-.86,0.24c.07,0.11,1.01,0.32,0.67,0.51c-.46,0.25-1.05,0.06-1.54,0.33c-.36,0.24-.34,0.26,0.19,0.13c.41-.09,0.56-.04,0.47,0.11c-.28,0.44,0.57-.07,0.62-.11c.26-.2,1.08-.57,1.26-.06c.04,0.15,0.15,0.24,0.21,0.17C45.28,47.61,44.01,46.51,44.02,46.53"/>
+<path d="M45.41,46.66c.33,0.38,0.84,0.51,1.2,0.92c.32,0.37,0.46,0.89,0.78,1.21c.6,0.6,1.86,1.05,1.56,0.56c-.17-.34-.77-.04-.92-.26c-.04-.06,0.31-.28,0.33-.33c-.02,0.08-.46-.42-.48-.49c-.1-.38-.37-.39-.65-.58c-.33-.21-1.54-1.52-1.96-1.36C45.16,46.38,45.43,46.68,45.41,46.66"/>
+<path d="M34.98,47.2c-.3,0.73,0.06,0.84,0.66,0.19c.24-.26,0.3-.37,0.09-.21c-.3,0.21-.36,0.19-.45-.13C35.22,46.72,35.15,46.75,34.98,47.2"/>
+<path d="M39.93,47.28c.23,0.19,0.58,0.34,0.75,0.32c.3,0,0.3-.02,0.02-.13c-.17-.06-.51-.22-.75-.32C39.52,46.96,39.52,46.96,39.93,47.28"/>
+<path d="M32.67,47.86c-.09,0.13-.11,0.28-.04,0.34C33.24,48.82,33.27,46.81,32.67,47.86"/>
+<path d="M34.1,48.19c-.21,0.41-.15,0.49,0.66,0.82l0.9,0.34c-.41-.33-1.09-.76-1.22-1.29C34.36,47.8,34.3,47.84,34.1,48.19"/>
+<path d="M36.2,48.27c-.06,0.04-.12,0.09-.18,0.13c-.03,0.04,0.61,0.19,0.61-.13C36.63,47.93,36.38,48.16,36.2,48.27"/>
+<path d="M37.17,48.27c-.18,0.29,0.53,0.19,0.64,0C37.97,47.95,37.27,48.07,37.17,48.27"/>
+<path d="M45.84,48.27c0,0.23-1.19,0.85-1.07,0.86c.51,0,1.14-.37,1.55-.66C46.98,48.01,45.84,47.95,45.84,48.27"/>
+<path d="M43.1,48.59c-.34,0.41-.06,0.41,0.47,0c.3-.24,0.34-.32,0.11-.32C43.51,48.29,43.25,48.42,43.1,48.59"/>
+<path d="M30.1,48.72c-.09,0.13-.28,0.17-.45,0.11c-.4-.16-.32,0.59-.29,0.79c.06,0.36,0.55-.44,0.58-.49c.01-.01,0.41-.65,0.39-.65C30.22,48.53,30.15,48.61,30.1,48.72"/>
+<path d="M31.38,49.09c.19,0.24-1.83,1.64-2.04,1.83l-.02-.52c-.02-.45-.04-.43-.17,0.15c-.09,0.36-.24,0.77-.32,0.9c-.07,0.07-.1,0.16-.08,0.25c-.05-.04,2.36-1.55,2.37-1.46c-.04-.13,0.24-.47,0.58-.75c.6-.52,0.6-.54,0.11-.49C31.53,49,31.34,49.05,31.38,49.09"/>
+<path d="M50.25,50.36c.09,0.34,0.28,0.8,0.43,1.03c.43,0.62,0.36,0.75-.32,0.62c-.34-.06-.66-.04-.73,0.08c-.02,0.03,0.94,0.03,1.05,0.34c.1,0.3,0.62,0.47,0.39,0.07c-.11-.17-.06-.17,0.19,0.04c.34,0.27,0.26,0.73,0.45,1.11c.02,0.05,0.65,1.12,0.35,1.02c-.66-.16-.76-1.25-1.46-1.48L50.1,53c.54,0.77,1.08,1.53,1.78,2.16c.87,0.78,1.44,0.87,1.69,2.12c.12,0.55,0.21,1.1,0.26,1.66c.03,0.39-.08,1.2,0.21,1.5c.17,0.17-.47,0.77-.28,1.16c.13,0.22,0.21,0.62,0.21,0.9c.01,0.11-.01,0.22-.04,0.33c.03-.04-1.05-1.7-.71-.59c.16,0.53-.26,0.24-.3,0.48c.04,0.04,0.07,0.08,0.11,0.13c.13,0.08,0.26,0.3,0.26,0.47c.07,0.67,0.17,1.36,0.09,2.03c-.05,0.46-.58,1.19-.46,1.6c.03,0.09,0.28-.38,0.23-.28c.17-.28,0.28-.32,0.41-.13c.08,0.14,0.31-.93,0.32-.99c.06-.5,0.11-1.1,0.32-1.57c.27-.49,0.27-1.08,0.44-1.61c.05-.14,0.64-1.4,0.76-1.36c-.08,0.03-.16,0.08-.22,0.15c-.39,0.3-.41,0.28-.28-.54c.19-.99,1.43-2.13,0.79-3.12c-.17-.24-.19-.17-.09,0.26c.15,0.65-.24,0.84-.73,0.34c-.06-.1-.13-.15-.23-.14c-.34,0.38,0.94,0.55,0.7,0.85c-.06,0.13-.26,0.17-.39,0.13c-.45-.2,0.08,1.09-.32,0.84c-.82-.55,0.18-3.02,0.26-3.72c.03-.21-.19-.97-.28-.43c-.02,0.11-.32,1.97-.5,1.44c-.16-.45-.29-.93-.24-1.41c.02-.18,0.39-.98-.01-.8c-.36,0.11-.49-1.28-.58-1.57c-.03-.1-.49-1.34-.54-1.29c-.23,0.23,0.59,2.47,0.66,2.95c.13,0.62,0.11,0.67-.11,0.3c-.24-.44-.62-.76-.89-1.17c-.22-.35-.09-.7-.38-1.08c-.23-.33-.28-.92-.51-1.19c-.14-.17-.3-.09-.43-.29c-.16-.23-.26-.51-.34-.78C50.49,49.71,50.02,49.37,50.25,50.36 M52.16,53.43c.16,0.27-.32,0.28-.32,0C51.84,53.12,52.06,53.23,52.16,53.43 M52.91,55.39c0,0.13-.09,0.15-.21,0.09c-.16-.1-.32-.62,0-.43C52.82,55.11,52.91,55.28,52.91,55.39 M53.98,63.54c0,0.27-.48,0.26-.32,0C53.76,63.34,53.98,63.22,53.98,63.54"/>
+<path d="M46.91,50.08c0,0.15,1.35,0.8,1.44,0.69c.13-.13-.6-.64-1.03-.71C47.1,50.01,46.91,50.04,46.91,50.08"/>
+<path d="M32.09,51c.15,0.06,0.34,0.04,0.41-.02c.09-.07-.04-.13-.28-.11C31.98,50.87,31.92,50.94,32.09,51"/>
+<path d="M49.4,51.18c.47,0.36,1.03,0.43,0.84,0.11c-.09-.13-1.08-.28-1.09-.39C49.2,51.02,49.28,51.11,49.4,51.18"/>
+<path d="M31.06,51.28c-.79,0.22-1.53,0.7-2.25,1.1c.53-.11,1.04-.2,1.54-.41c.55-.23,1.01-.58,1.31-.88C31.62,51.09,31.36,51.18,31.06,51.28"/>
+<path d="M46.7,51.37c0,0.04,0.15,0.15,0.34,0.21c.17,0.06,0.26,0.04,0.19-.09C47.1,51.28,46.7,51.2,46.7,51.37"/>
+<path d="M27.98,52.21c-.15,0.58,0.02,0.75,0.39,0.34c.26-.26,0.26-.34,0.02-.56C28.17,51.8,28.09,51.84,27.98,52.21"/>
+<path d="M26.65,52.94c-.18,0.47-.36,0.96-.45,1.46c-.08,0.43-.59,1.05-.43,1.48c.17,0.38-.42,0.38-.59,0.55c-.28,0.28-.01,0.94-.07,1.29c-.06,0.38-.39,0.6-.45,0.98c-.05,0.31,0.37,0.63,0.3,0.75c-.09,0.13-.21,0.17-.32,0.11c-.11-.06-.21,0.11-.26,0.36l-.06,0.5l-.3-.52c-.28-.53,0-.61,0.12-1.09c.09-.38,0.04-.8,0.03-1.18l-.3,0.71c-.24,0.54-.41,0.69-.66,0.58c-.32-.11-.34-.09-.02,0.26c.35,0.41,0.62,0.91,0.81,1.4c.07,0.18,0.15,1.11,0.26,1.19c.1,0.08,0.24-.4,0.34-.33c.33,0.22-.06,0.77-.41,0.7c-.43-.09-.43-.07,0.04,0.41c.34,0.34,0.76,0.72,0.96,1.17c.18,0.42,0.12,0.83,0.41,1.23c.3,0.39,0.3,0.39,0.32-.17c0-.75,0.86-.88,0.86-1.63l-.02-.58c-.15,0.28-.49,1.18-.86,1.18c-.44,0,0.44-1.5,0.54-1.5c-.19,0.03-.34,0.12-.47,0.26c-.4,0.4-.36-.11-.32-.43c.02-.19,0.43-2.19,0.28-2.19c-.55,0-.61,1.9-.66,2.23c-.06,0.43-.29,0.19-.35-.09c-.1-.48,0.16-1.21-.13-1.64c-.18-.31,0.36-.64,0.53-.79c.28-.25,0.23-.52,0.11-.84c-.26-.8,0.32-1.66,1.29-1.91c.36-.09,0.79-.34,0.94-.54c.28-.32,0.26-.35-.13-.2c-.86,0.37-1.24,0.26-1.28-.3c-.02-.3,0.95-3.65,0.83-3.65C26.95,52.14,26.69,52.86,26.65,52.94 M25.54,57.13c-.06,0.04-.12,0.08-.18,0.13c-.17,0.03,0.05-.78,0.33-.49C25.73,56.83,25.67,57,25.54,57.13 M25.49,63.11c0,0.28-.43,0.27-.43,0C25.07,62.83,25.49,62.82,25.49,63.11"/>
+<path d="M27.79,53.15c-.2,0.15-.25,0.84-.4,1.09c-.08,0.13-1.03,1.23-.9,1.32c.06,0.06,1.51-1.36,1.69-1.48c.04-.02,0.72-.4,0.35-.42c-.29-.02-1.08-.24-.39-.5c.13-.07,0.15-.13,0.02-.13C28.02,53,27.85,53.07,27.79,53.15"/>
+<path d="M54.43,53.35c0,0.24,0.06,0.3,0.13,0.13c.06-.15,0.04-.34-.02-.41C54.47,52.98,54.41,53.11,54.43,53.35"/>
+<path d="M54.21,54.21c0,0.24,0.06,0.3,0.13,0.13c.06-.15,0.04-.34-.02-.41C54.26,53.84,54.19,53.97,54.21,54.21"/>
+<path d="M50.02,54.29c.11,0.18,0.32,0.32,0.32,0C50.34,54.03,49.87,54,50.02,54.29"/>
+<path d="M52.01,56.85c-.09,0.28-.06,0.67,0.04,0.86c.12,0.27,1.25,2.26,1.24,2.28c.19-.2-.6-1.46-.69-1.7c-.07-.18-.55-1.65-.5-1.69C52.05,56.67,52.02,56.76,52.01,56.85"/>
+<path d="M26.8,58.59c0,0.17,0.09,0.47,0.19,0.65c.26,0.39,0.26,0.04,0-.54C26.86,58.42,26.8,58.38,26.8,58.59"/>
+<path d="M26.89,60.08c.04,0.14-.17,1.19-.32,1.1c.1-.04,0.2-.11,0.28-.19c.41-.32,0.49-.99,0.13-1.23C26.8,59.67,26.78,59.77,26.89,60.08"/>
+<path d="M56.12,62.16c0,0.17,0.11,0.26,0.21,0.19C56.92,62.06,56.12,61.48,56.12,62.16"/>
+<path d="M23.87,63.6c.05,0.41,0.36,0.76,0.55,1.11c.17,0.33,0.18,0.71,0.35,1.03c.21,0.38,0.56,0.66,0.7,1.08c.03,0.09,0.25,1.12,0.53,0.65c.19-.35,0.36-1.46,0.19-1.18c-.28,0.41-.84,0.11-1.09-.62c-.17-.46-.9-1.7-.71-2.19C24.43,63.28,23.81,63.23,23.87,63.6"/>
+<path d="M55.48,64.07c0,0.38-.43,0.31-.43,0.73c0,0.45-.33,0.72-.55,1.07c-.31,0.49-.51,1.04-.73,1.58c.23-.2,0.45-.4,0.68-.6c.17-.15,0.34-.29,0.47-.48c.17-.22-.03-.29,0.12-.53c.31-.5,0.61-.87,0.74-1.46C55.88,63.89,55.48,63.51,55.48,64.07"/>
+<path d="M51.24,64.72c0,0.34,0.04,0.47,0.11,0.26c.04-.19,0.04-.49,0-.64C51.28,64.2,51.24,64.35,51.24,64.72"/>
+<path d="M52.14,65.06c0,0.89-.57,2.6-.11,3.38c.17,0.32,0.02,0.64-.75,1.61c-.26,0.33-.52,0.66-.82,0.95c-.09,0.09-.7,0.48-.42-.01c.11-.15,0.02-.13-.21,0.06c-.26,0.21-.3,0.34-.13,0.39c.77,0.29,2.39-.97,3.06-1.29c.79-.41,1.11-.71,0.43-.45c-.26,0.11-.3,0.06-.17-.17c.1-.14-1,0.67-1.14,0.58c-.13-.13,0.64-1.13,0.72-1.24c.33-.47,0.85-.81,0.88-1.41c.02-.54,0-.56-.26-.22c-.06,0.08-.3,0.41-.45,0.36c-.15-.04,0.12-.32,0.08-.37c-.11,0.02-.2,0.07-.27,0.16c-.36,0.3-.39,0.28-.24-.22c.21-.67,0.17-2.32-.06-2.75C52.16,64.22,52.12,64.46,52.14,65.06 M52.69,68.14c0,0.24-.41,0.32-.54,0.13C51.99,67.98,52.69,68,52.69,68.14"/>
+<path d="M56.23,65.28c-.09,0.13-.11,0.26-.04,0.32c.04,0.07,0.15-.04,0.21-.24C56.55,65,56.42,64.93,56.23,65.28"/>
+<path d="M27.14,66.48c-.21,0.19-.15,1.81,0.06,2.32c.13,0.3,0.19-.02,0.19-1.03C27.42,66.33,27.4,66.2,27.14,66.48"/>
+<path d="M55.33,66.59c-.26,0.13-.51,0.36-.58,0.51c-.06,0.19,0.15,0.11,0.51-.17C56.12,66.31,56.14,66.2,55.33,66.59"/>
+<path d="M23.78,68.07c0,0.11,0.11,0.15,0.21,0.09C24.55,67.88,23.78,67.67,23.78,68.07"/>
+<path d="M24.57,68.18c.06,0.24,0.66,1.25,0.86,1.31c.43,0.15-.02-1.05-.53-1.4C24.45,67.79,24.42,67.82,24.57,68.18"/>
+<path d="M26.14,68.2c0,0.11,0.11,0.32,0.21,0.5c.03,0.09,0.09,0.15,0.17,0.16C26.96,68.53,26.14,67.78,26.14,68.2"/>
+<path d="M28.02,69.02c-.13,0.28-.32,0.47-.43,0.41c-.11-.08-.09,0.07,0.09,0.32c.41,0.67,0.5-.36,0.6-.69C28.51,68.33,28.34,68.31,28.02,69.02"/>
+<path d="M50.96,69.49c-.28,0.34-.26,0.37,0.09,0.09c.04-.03,0.41-.3,0.35-.42C51.32,68.97,50.92,69.55,50.96,69.49"/>
+<path d="M48.99,69.47c-.17,0.17,0.1,0.41,0.14,0.56c.08,0.26,0,0.58-.11,0.81c-.19,0.39-.76,0.26-.67,0.62c.05,0.26-.17,1.66-.38,1.75c.03-.03,0.05-.06,0.08-.1c.48-.69,1.19-1.36,1.35-2.21C49.52,70.27,49.25,69.23,48.99,69.47"/>
+<path d="M26.27,69.75c-.34,0.07-.66,0.26-.73,0.43c-.09,0.24,0,0.26,0.3,0.13c.24-.09,0.6-.15,0.83-.15c.54,0.02,1.19,0.79,1.43,1.22c.11,0.19,0,0.38,0.18,0.52c.45,0.33,1.04,0.38,1.42,0.82c.06,0.08,0.12,0.16,0.19,0.23c-.28-.16-.32-.98-.12-1.23c.41-.51,0.86-.86,0.43-1.52c-.03-.16-.09-.21-.2-.16c-.01,0.16-.03,0.32-.07,0.48c-.13,0.25-.33,0.09-.29,0.48c0,0.21-.11,0.37-.28,0.32c-.15-.02-.41,0.04-.56,0.17c-.35,0.32-.84-.65-.98-.83c-.06-.08-.31-.46-.46-.46c-.3,0-.04-.62-.32-.62C26.95,69.6,26.61,69.67,26.27,69.75"/>
+<path d="M48.09,70.44c-.09,0.13-.11,0.26-.04,0.32c.04,0.06,0.15-.04,0.21-.24C48.41,70.16,48.28,70.09,48.09,70.44"/>
+<path d="M50.44,72.14c-.17,0.29-.96,0.09-.96,0.47c0,0.09-.73,0.41-.88,0.54c-.79,0.71-.69,0.82,0.36,0.39c.5-.2,0.95-.61,1.33-.98c.15-.14,0.32-.3,0.41-.49C50.85,71.8,50.5,72.02,50.44,72.14"/>
+<path d="M34.28,72.72c0,0.13,0.17,0.37,0.39,0.51C35,73.51,35,73.51,34.7,73.1c-.17-.24-.34-.47-.36-.52C34.3,72.54,34.28,72.59,34.28,72.72"/>
+<path d="M30.42,73.21c0,0.3,0.72,0.71,0.62,0.95c-.08,0.18-.85-.38-.9-.41c-.81-.54-1.09-.45-.41,0.13c.36,0.3,0.54,0.39,0.86,0.43c.09,0-.04,0.09-.28,0.19c-.07,0.02-.14,0.06-.19,0.12c.04-.1,1.78,0.15,1.95,0.47c.12,0.24-.17,0.41,0.06,0.69c.22,0.25,0.62,0.42,0.94,0.29c.69-.24,1.35-.15,3.08,0.41c1.48,0.47,1.54,0.52,1.26,0.9c-.56,0.76-.55-.31-1.13-.29c-.12,0.01,0.12,0.42,0.1,0.37c.45,0.86,0.75,0.9,1.48,0.28c.07-.07,0.96-.8,0.51-.87c-.48-.08-.52-.17-.56-.7c-.04-.41,1.09-.45,1.24-.04c.11,0.26,0.04,0.32-.23,0.21c-.34-.11-.34-.11-.04,0.13c.44,0.34,0.71,1.01,1.07,1.44c.15,0.18,0.41,0.55,0.67,0.58c.1,0.01,0.45-.23,0.33-.32c-.11,0-.22-.04-.31-.11c-.11-.18,0.18-.53-.13-.63c-.47-.17,0.32-1.33,0.96-1.4c.45-.06,0.71,0.18,0.96,0.53c.06,0.08,1.04,1.29,1.05,1.11c-.05-.11-.13-.2-.25-.26c-.62-.47-.28-.58,0.66-.24c.47,0.17,1.28,0.3,1.82,0.28c.81-.02,0.86-.04,0.21-.11c-1.03-.11-2.98-.71-3.13-.97c-.2-.31,0.28-.47,0.49-.48c.53-.02,0.74,0.01,1.09-.48c.26-.32,0.62-.77,0.81-.97c.04-.04,0.37-.34,0.31-.46c-.07-.15-2.45,1.87-1.63,0.68c.02-.02,0.43-.83,0.28-.76c-.41,0.19-.38,0.47-.92,0.53c-.33,0.04-.56,0.08-.47,0.45c.06,0.21-.02,0.58-.17,0.8c-.28,0.39-.3,0.36-.3-.22v-.6c-.23,0.21-.46,0.45-.72,0.63c-.25,0.18-.68,0.2-.89,0.39c-.25,0.22-.17,0.56-.52,0.76c-.92,0.5-.88,0.13,0.11-1.03l0.77-.9c-1.1,0-2.18-.03-3.28-.13c-1.33-.13-1.37-.13-.98,0.26c.28,0.3,0.43,0.34,0.53,0.15c.33-.53,2.51-.02,3.08,0.04l-.39,0.49c-.48,0.59-.74,0.29-1.35,0.02c-.17-.08-1.17-.43-.94,0.13c.09,0.26,0,0.32-.39,0.24c-.28-.04-.71-.17-.92-.26c-.28-.11-.36-.09-.26,0.08c.06,0.13,0.04,0.28-.09,0.37c-.16,0.09-.25-.21-.46-.2c-.27,0.01-.58-.15-.83-.25c-.5-.2-1.53-.49-1.84-.97c-.04-.09-.24-.13-.41-.04c-.37,0.12-.97-.54-1.18-.75C31.22,73.84,30.42,73.2,30.42,73.21 M33.63,75.6c0,0.24-.45,0.24-.83,0C32.44,75.36,33.63,75.28,33.63,75.6"/>
+<path d="M33.29,73.75c.13,0.13,0.47,0.54,0.69,0.54c.1,0-.35-.54-.34-.54c-.14-.15-.45-.54-.69-.54C32.8,73.21,33.3,73.76,33.29,73.75"/>
+<path d="M45.84,73.53c-.35,0.45,0.16,0.29,0.3,0c.06-.11,0.08-.21,0.04-.32C46.05,73.3,45.94,73.4,45.84,73.53"/>
+<path d="M37.87,73.79c.15,0.06,0.34,0.04,0.41-.02c.09-.06-.04-.13-.28-.11C37.77,73.66,37.7,73.73,37.87,73.79"/>
+<path d="M47.25,74.11c-.01,0.01-.34,0.45-.28,0.52c.09,0.09,0.7-.11,0.79-.13c.49-.11,0.58-.17,0.28-.19c-.34-.02-.45-.13-.36-.34C47.88,73.49,47.62,73.58,47.25,74.11"/>
+<path d="M27.53,74.07c.11,0.18,0.32,0.32,0.32,0C27.85,73.81,27.38,73.78,27.53,74.07"/>
+<path d="M35.35,74.31c.09,0.6,0,0.82-.32,0.71c-.21-.11-.46,0.09-.24,0.27c.19,0.15,0.6,0.11,0.83,0.2c.43,0.15,0.43-.88,0-1.25C35.37,74.03,35.32,74.05,35.35,74.31"/>
+<path d="M45.86,74.61c.01-.01-.46,0.54-.3,0.54c.23,0,0.54-.39,0.66-.54C46.83,73.92,46.53,73.92,45.86,74.61"/>
+<path d="M34.21,74.59c-.14,0.36,0.26,0.2,0.39,0.06C34.9,74.32,34.39,74.16,34.21,74.59"/>
+<path d="M28.06,74.59c0,0.04,0.19,0.13,0.43,0.19c.24,0.07,0.39,0.02,0.3-.09C28.69,74.5,28.06,74.42,28.06,74.59"/>
+<path d="M29.31,74.87c.15,0.06,0.34,0.04,0.41-.02c.09-.07-.04-.13-.28-.11C29.2,74.74,29.13,74.8,29.31,74.87"/>
+<path d="M35.99,75.04c0,0.04,0.21,0.21,0.49,0.34c.43,0.24,0.45,0.24,0.17-.09C36.37,74.95,35.99,74.8,35.99,75.04"/>
+<path d="M42.95,76.22c-.17,0.29,0.6,0.29,0.43,0C43.25,75.97,43.08,75.96,42.95,76.22"/>
+<path d="M43.7,76.44c0,0.11,0.32,0.21,0.71,0.19c.58,0,0.62-.04,0.26-.19C44.06,76.18,43.7,76.18,43.7,76.44"/>
+<path d="M45.37,76.37c.15,0.06,0.34,0.04,0.41-.02c.09-.07-.04-.13-.28-.11C45.26,76.24,45.2,76.31,45.37,76.37"/>
+<path d="M41.41,76.69c-.13,0.15-.3,0.5-.36,0.75c-.13,0.41-.09,0.47,0.19,0.37c.26-.1,0.35-1.42,0.51-.68c.16,0.78,0.07,0.72,0.82,0.94c.21,0.06,0.3,0.04,0.17-.06c-.13-.09-.32-.45-.43-.79C42.07,76.48,41.73,76.31,41.41,76.69"/>
+<path d="M33.12,77.62c.15,0.37,0.43,0.43,0.6,0.13c.06-.11-.02-.26-.21-.32C33.03,77.23,32.99,77.25,33.12,77.62"/>
+<path d="M35.09,78.05c-.36,0.5-.36,0.52,0.04,0.47c.43-.04,0.26-.3,0.46-.49c.1-.09,0.41,0.48,0.57,0.49c.2,0.01-.31-.63-.32-.64C35.48,77.58,35.43,77.6,35.09,78.05"/>
+<path d="M38.43,78.03c-.11,0.33-.73,0.29-.73,0.56c0,0.49,0.65-.1,0.77-.19c.32-.26,0.43-.47,0.3-.56C38.67,77.77,38.49,77.86,38.43,78.03"/>
+<path d="M44.17,78.2c.04,0.26,0.21,0.52,0.39,0.56c.07,0.06,0.14,0.07,0.21,0.04c.01-.13-.27-.37-.32-.48c-.12-.26,0.4-.08,0.22-.37C44.43,77.55,44.11,77.73,44.17,78.2"/>
+</g>
+</g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug577-multiple-font-families-ref.png b/rsvg/tests/fixtures/reftests/bugs/bug577-multiple-font-families-ref.png
new file mode 100644
index 00000000..075edd14
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug577-multiple-font-families-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug587721-text-transform-ref.png b/rsvg/tests/fixtures/reftests/bugs/bug587721-text-transform-ref.png
new file mode 100644
index 00000000..798fc6fb
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug587721-text-transform-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug587721-text-transform.svg b/rsvg/tests/fixtures/reftests/bugs/bug587721-text-transform.svg
new file mode 100644
index 00000000..d86b6ef7
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug587721-text-transform.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg width="1179.75118pt" height="687.74173pt"
+ viewBox="0 0 1179.75118 687.74173"
+ enable-background="new 0 0 1179.75118 687.74173"
+ version="1.1" xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink" >
+
+ <g font-family="'DejaVu Sans'" font-size="1" kerning="0" font-weight="400" fill="#000000">
+ <text transform="matrix(12 0 0 12 929.88438 660.96434)">Frenchtown</text>
+ </g>
+
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug590-mask-units-ref.png b/rsvg/tests/fixtures/reftests/bugs/bug590-mask-units-ref.png
new file mode 100644
index 00000000..3647c930
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug590-mask-units-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug590-mask-units.svg b/rsvg/tests/fixtures/reftests/bugs/bug590-mask-units.svg
new file mode 100644
index 00000000..14e2e719
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug590-mask-units.svg
@@ -0,0 +1,26 @@
+<svg preserveAspectRatio="xMidYMid" viewBox="-70 -100 140 200" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <defs>
+ <!-- A square mask -->
+ <mask id="square-mask">
+ <rect fill="#ffffff" height="49" stroke="none" width="49" x="-49" y="24.5"/>
+ </mask>
+ </defs>
+ <g fill="none" stroke="#292d2f" stroke-width="0.14">
+ <!-- Black background rectangle -->
+ <rect fill="#292d2f" height="200" stroke="#292d2f" width="140" x="-70" y="-100"/>
+
+ <!-- Draw a filled white circle and apply a square mask to only show the bottom left 90 degree arc -->
+ <g mask="url(#square-mask)">
+ <g fill="#ffffff" stroke="none" transform="matrix(-1.8369701987210297e-16 -1 1 -1.8369701987210297e-16 -24.5 49)">
+ <circle cx="24.5" cy="24.5" r="49"/>
+ </g>
+ </g>
+
+ <!-- Magenta outline of the square mask -->
+ <rect stroke="#ff00ff" height="49" fill="none" width="49" x="-49" y="24.5"/>
+ <!-- Yellow outline of the entire circle to mask -->
+ <g fill="none" stroke="#ffff00" transform="matrix(-1.8369701987210297e-16 -1 1 -1.8369701987210297e-16 -24.5 49)">
+ <circle cx="24.5" cy="24.5" r="49" />
+ </g>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug603550-mask-luminance-ref.png b/rsvg/tests/fixtures/reftests/bugs/bug603550-mask-luminance-ref.png
new file mode 100644
index 00000000..456b1982
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug603550-mask-luminance-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug603550-mask-luminance.svg b/rsvg/tests/fixtures/reftests/bugs/bug603550-mask-luminance.svg
new file mode 100644
index 00000000..19c40b2f
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug603550-mask-luminance.svg
@@ -0,0 +1,130 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ width="744.09448819"
+ height="1052.3622047">
+ <defs
+ id="defs34">
+ <mask
+ maskUnits="userSpaceOnUse"
+ id="masky"
+ x="0"
+ y="0"
+ width='500'
+ height='500'>
+ <g>
+ <rect
+ style="fill:white; stroke:none"
+ id="rect128"
+ width="500"
+ height="500"
+ x="0"
+ y="0" />
+ </g>
+ </mask>
+ </defs>
+ <g mask="url(#masky)" >
+ <g mask="url(#masky)" >
+ <g mask="url(#masky)" >
+ <g mask="url(#masky)" >
+ <g mask="url(#masky)" >
+ <g mask="url(#masky)" >
+ <g mask="url(#masky)" >
+ <g mask="url(#masky)" >
+ <g mask="url(#masky)" >
+ <g mask="url(#masky)" >
+ <rect
+ style="fill:#000000;fill-opacity:1;stroke:none"
+ id="rect42"
+ width="600"
+ height="300"
+ x="0"
+ y="0"/>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ <g mask="url(#masky)" >
+ <g mask="url(#masky)" >
+ <g mask="url(#masky)" >
+ <g mask="url(#masky)" >
+ <g mask="url(#masky)" >
+ <g mask="url(#masky)" >
+ <g mask="url(#masky)" >
+ <g mask="url(#masky)" >
+ <g mask="url(#masky)" >
+ <g mask="url(#masky)" >
+ <g mask="url(#masky)" >
+ <g mask="url(#masky)" >
+ <g mask="url(#masky)" >
+ <g mask="url(#masky)" >
+ <g mask="url(#masky)" >
+ <g mask="url(#masky)" >
+ <g mask="url(#masky)" >
+ <g mask="url(#masky)" >
+ <g mask="url(#masky)" >
+ <g mask="url(#masky)" >
+ <g mask="url(#masky)" >
+ <g mask="url(#masky)" >
+ <g mask="url(#masky)" >
+ <g mask="url(#masky)" >
+ <g mask="url(#masky)" >
+ <g mask="url(#masky)" >
+ <g mask="url(#masky)" >
+ <g mask="url(#masky)" >
+ <g mask="url(#masky)" >
+ <g mask="url(#masky)" >
+ <rect
+ style="fill:#000000;fill-opacity:1;stroke:none"
+ id="rect42"
+ width="600"
+ height="300"
+ x="0"
+ y="300"/>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ <rect
+ style="fill:#000000;fill-opacity:1;stroke:none"
+ id="rect42"
+ width="50"
+ height="600"
+ x="275"
+ y="0"/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug609-clippath-transform-ref.png b/rsvg/tests/fixtures/reftests/bugs/bug609-clippath-transform-ref.png
new file mode 100644
index 00000000..58924a21
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug609-clippath-transform-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug609-clippath-transform.svg b/rsvg/tests/fixtures/reftests/bugs/bug609-clippath-transform.svg
new file mode 100644
index 00000000..a689a06b
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug609-clippath-transform.svg
@@ -0,0 +1,23 @@
+<svg xmlns="http://www.w3.org/2000/svg"
+ width="100"
+ height="100">
+
+ <rect width="100"
+ height="100"
+ x="0"
+ y="0"
+ fill="black" />
+
+ <rect clip-path="url(#clip)"
+ width="100"
+ height="100"
+ x="0"
+ y="0"
+ fill="red" />
+
+ <defs>
+ <clipPath id="clip" transform="translate(25, 25)">
+ <rect width="50" height="50" x="0" y="0"/>
+ </clipPath>
+ </defs>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug634324-blur-negative-transform-ref.png b/rsvg/tests/fixtures/reftests/bugs/bug634324-blur-negative-transform-ref.png
new file mode 100644
index 00000000..b87da96f
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug634324-blur-negative-transform-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug634324-blur-negative-transform.svg b/rsvg/tests/fixtures/reftests/bugs/bug634324-blur-negative-transform.svg
new file mode 100644
index 00000000..8b8278b7
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug634324-blur-negative-transform.svg
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg width="640" height="480"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg">
+ <defs>
+ <filter id="filter5259">
+ <feGaussianBlur stdDeviation="10" />
+ </filter>
+ </defs>
+ <path
+ d="m 254.28573,198.07648 -83.98834,-2.98146 -50.07031,67.49735 -23.118289,-80.79897 -79.666374,-26.76187 69.700445,-46.95505 0.833789,-84.0371 66.195529,51.779153 80.18169,-25.17591 -28.78936,78.956327 z"
+ transform="matrix(-0.2675823,1.2978266,-1.2978266,-0.2675823,432.82964,76.441279)"
+ style="filter:url(#filter5259)" />
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug642-nested-tspan-dx-dy-ref.png b/rsvg/tests/fixtures/reftests/bugs/bug642-nested-tspan-dx-dy-ref.png
new file mode 100644
index 00000000..81887de8
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug642-nested-tspan-dx-dy-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug642-nested-tspan-dx-dy.svg b/rsvg/tests/fixtures/reftests/bugs/bug642-nested-tspan-dx-dy.svg
new file mode 100644
index 00000000..175d00c8
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug642-nested-tspan-dx-dy.svg
@@ -0,0 +1,17 @@
+<svg width="500" height="500" xmlns="http://www.w3.org/2000/svg" version="1.1">
+ <rect x="0" y="0" width="500" height="500" fill="white"/>
+
+ <!-- with buggy #642 these will overlap -->
+ <text x="100" y="100" fill="black" style="font-family: sans-serif; font-size: 20px;">
+ <tspan x="100" y="100" dy="0"><tspan>one</tspan></tspan>
+ <tspan x="100" y="100" dy="20"><tspan>two</tspan></tspan>
+ <tspan x="100" y="100" dy="40"><tspan>three</tspan></tspan>
+ </text>
+
+ <!-- but these won't, note the whitespace inside the outermost tspans -->
+ <text x="100" y="200" fill="black" style="font-family: sans-serif; font-size: 20px;">
+ <tspan x="100" y="200" dy="0"> <tspan>one</tspan></tspan>
+ <tspan x="100" y="200" dy="20"> <tspan>two</tspan></tspan>
+ <tspan x="100" y="200" dy="40"> <tspan>three</tspan></tspan>
+ </text>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug667-tspan-visibility-ref.png b/rsvg/tests/fixtures/reftests/bugs/bug667-tspan-visibility-ref.png
new file mode 100644
index 00000000..3b48cb6d
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug667-tspan-visibility-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug667-tspan-visibility.svg b/rsvg/tests/fixtures/reftests/bugs/bug667-tspan-visibility.svg
new file mode 100644
index 00000000..7919fab3
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug667-tspan-visibility.svg
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<svg viewBox="0 0 300 300" xmlns="http://www.w3.org/2000/svg" version="1.1">
+ <g>
+ <!-- text and tspans all visible -->
+ <text x="10" y="10" font-family="sans" font-size="12">
+ foo
+ <tspan>bar</tspan>
+ <tspan>baz</tspan>
+ </text>
+
+ <!-- tspan with display none -->
+ <text x="10" y="50" font-family="sans" font-size="12">
+ foo
+ <tspan display="none">bar</tspan>
+ <tspan>baz</tspan>
+ </text>
+
+ <!-- tspan with visibility hidden -->
+ <text x="10" y="100" font-family="sans" font-size="12">
+ foo
+ <tspan visibility="hidden">bar</tspan>
+ <tspan>baz</tspan>
+ </text>
+
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug668-small-caps-ref.png b/rsvg/tests/fixtures/reftests/bugs/bug668-small-caps-ref.png
new file mode 100644
index 00000000..42de8479
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug668-small-caps-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug668-small-caps.svg b/rsvg/tests/fixtures/reftests/bugs/bug668-small-caps.svg
new file mode 100644
index 00000000..a69f52b5
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug668-small-caps.svg
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="300" height="100">
+ <!-- This doesn't work with font-family:sans - one needs to use the real font name -->
+ <text x="10" y="70" style="font-family:Roboto; font-size:40; font-variant:small-caps;">BlahBlehBlih</text>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug689832-unresolved-gradient-ref.png b/rsvg/tests/fixtures/reftests/bugs/bug689832-unresolved-gradient-ref.png
new file mode 100644
index 00000000..64cbe5c0
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug689832-unresolved-gradient-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug689832-unresolved-gradient.svg b/rsvg/tests/fixtures/reftests/bugs/bug689832-unresolved-gradient.svg
new file mode 100644
index 00000000..15413d83
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug689832-unresolved-gradient.svg
@@ -0,0 +1,220 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 13.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ id="Ebene_1"
+ x="0px"
+ y="0px"
+ width="256px"
+ height="18px"
+ viewBox="0 0 256 18"
+ enable-background="new 0 0 256 18"
+ xml:space="preserve"
+ sodipodi:version="0.32"
+ inkscape:version="0.47 r22583"
+ sodipodi:docname="Button_Single_Normal.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ inkscape:export-filename="C:\Users\Markus\Desktop\OMAN SOL\ownThemes\vThemes\Button\Single\Button_Single_Normal.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"><sodipodi:namedview
+ inkscape:window-height="667"
+ inkscape:window-width="640"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ guidetolerance="10.0"
+ gridtolerance="10.0"
+ objecttolerance="10.0"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ pagecolor="#ffffff"
+ id="base"
+ showgrid="false"
+ inkscape:zoom="2.125"
+ inkscape:cx="128"
+ inkscape:cy="9"
+ inkscape:window-x="58"
+ inkscape:window-y="58"
+ inkscape:current-layer="Ebene_1"
+ inkscape:window-maximized="0" /><metadata
+ id="metadata29"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
+ id="defs27"><inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 9 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="256 : 9 : 1"
+ inkscape:persp3d-origin="128 : 6 : 1"
+ id="perspective7327" /></defs>
+<g
+ id="g3">
+ <rect
+ width="256"
+ height="18"
+ id="rect5" />
+ <g
+ id="g7">
+ <linearGradient
+ id="SVGID_1_"
+ gradientUnits="userSpaceOnUse"
+ x1="60.0854"
+ y1="-58.9146"
+ x2="191.20831"
+ y2="71.267044">
+ <stop
+ offset="0"
+ style="stop-color:#0000d4;stop-opacity:1"
+ id="stop10" />
+ <stop
+ offset="0.1459"
+ style="stop-color:#0000d4;stop-opacity:1"
+ id="stop12" />
+ <stop
+ offset="0.5197"
+ style="stop-color:#000080;stop-opacity:1"
+ id="stop14" />
+ <stop
+ offset="0.8174"
+ style="stop-color:#000055;stop-opacity:1"
+ id="stop16" />
+ <stop
+ offset="1"
+ style="stop-color:#00002b;stop-opacity:1"
+ id="stop18" />
+ </linearGradient>
+ <path
+ fill="url(#SVGID_1_-839-88)"
+ d="M256,2c0-1.105-0.896-2-2-2H2C0.895,0,0,0.895,0,2v14c0,1.104,0.895,2,2,2h252c1.104,0,2-0.896,2-2 V2z"
+ id="path20"
+ style="fill:url(#SVGID_1_-510-219)" />
+ <g
+ opacity="0.4"
+ id="g22">
+ <path
+ fill="#ffffff"
+ d="M254,0H2C0.895,0,0,0.895,0,2v2.707C38.479,7.436,82.145,9,128,9c45.791,0,89.176-1.541,128-4.293V2 C256,0.895,255.104,0,254,0z"
+ id="path24" />
+ </g>
+ <linearGradient
+ id="SVGID_1_-839"
+ gradientUnits="userSpaceOnUse"
+ x1="60.0854"
+ y1="-58.9146"
+ x2="191.20831"
+ y2="71.267044">
+ <stop
+ offset="0"
+ style="stop-color:#00d400;stop-opacity:1"
+ id="stop7347" />
+ <stop
+ offset="0.1459"
+ style="stop-color:#00d400;stop-opacity:1"
+ id="stop7349" />
+ <stop
+ offset="0.5197"
+ style="stop-color:#008000;stop-opacity:1"
+ id="stop7351" />
+ <stop
+ offset="0.8174"
+ style="stop-color:#005500;stop-opacity:1"
+ id="stop7353" />
+ <stop
+ offset="1"
+ style="stop-color:#002b00;stop-opacity:1"
+ id="stop7355" />
+ </linearGradient>
+ <linearGradient
+ id="SVGID_1_-510"
+ gradientUnits="userSpaceOnUse"
+ x1="60.0854"
+ y1="-58.9146"
+ x2="191.20831"
+ y2="71.267044">
+ <stop
+ offset="0"
+ style="stop-color:#00d400;stop-opacity:1"
+ id="stop7358" />
+ <stop
+ offset="0.1459"
+ style="stop-color:#00d400;stop-opacity:1"
+ id="stop7360" />
+ <stop
+ offset="0.5197"
+ style="stop-color:#008000;stop-opacity:1"
+ id="stop7362" />
+ <stop
+ offset="0.8174"
+ style="stop-color:#005500;stop-opacity:1"
+ id="stop7364" />
+ <stop
+ offset="1"
+ style="stop-color:#002b00;stop-opacity:1"
+ id="stop7366" />
+ </linearGradient>
+ <linearGradient
+ id="SVGID_1_-839-88"
+ gradientUnits="userSpaceOnUse"
+ x1="60.0854"
+ y1="-58.9146"
+ x2="191.20831"
+ y2="71.267044">
+ <stop
+ offset="0"
+ style="stop-color:#0000d4;stop-opacity:1"
+ id="stop7425" />
+ <stop
+ offset="0.1459"
+ style="stop-color:#0000d4;stop-opacity:1"
+ id="stop7427" />
+ <stop
+ offset="0.5197"
+ style="stop-color:#000080;stop-opacity:1"
+ id="stop7429" />
+ <stop
+ offset="0.8174"
+ style="stop-color:#000055;stop-opacity:1"
+ id="stop7431" />
+ <stop
+ offset="1"
+ style="stop-color:#00002b;stop-opacity:1"
+ id="stop7433" />
+ </linearGradient>
+ <linearGradient
+ id="SVGID_1_-510-219"
+ gradientUnits="userSpaceOnUse"
+ x1="60.0854"
+ y1="-58.9146"
+ x2="191.20831"
+ y2="71.267044">
+ <stop
+ offset="0"
+ style="stop-color:#0000d4;stop-opacity:1"
+ id="stop7436" />
+ <stop
+ offset="0.1459"
+ style="stop-color:#0000d4;stop-opacity:1"
+ id="stop7438" />
+ <stop
+ offset="0.5197"
+ style="stop-color:#000080;stop-opacity:1"
+ id="stop7440" />
+ <stop
+ offset="0.8174"
+ style="stop-color:#000055;stop-opacity:1"
+ id="stop7442" />
+ <stop
+ offset="1"
+ style="stop-color:#00002b;stop-opacity:1"
+ id="stop7444" />
+ </linearGradient>
+ </g>
+</g>
+</svg> \ No newline at end of file
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug718-rect-negative-rx-ry-ref.png b/rsvg/tests/fixtures/reftests/bugs/bug718-rect-negative-rx-ry-ref.png
new file mode 100644
index 00000000..5fd1b8cf
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug718-rect-negative-rx-ry-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug718-rect-negative-rx-ry.svg b/rsvg/tests/fixtures/reftests/bugs/bug718-rect-negative-rx-ry.svg
new file mode 100644
index 00000000..1f526d16
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug718-rect-negative-rx-ry.svg
@@ -0,0 +1,11 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="300" height="100">
+<!-- Negative values for rx/ry should be ignored -->
+ <rect x="20" y="20" width="60" height="60" fill="red"/>
+ <rect x="10" y="10" width="80" height="80" rx="-10" ry="5" fill="lime"/>
+
+ <rect x="120" y="20" width="60" height="60" fill="red"/>
+ <rect x="110" y="10" width="80" height="80" rx="5" ry="-10" fill="lime"/>
+
+ <rect x="220" y="20" width="60" height="60" fill="red"/>
+ <rect x="210" y="10" width="80" height="80" rx="-5" ry="-10" fill="lime"/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug730-font-scaling-ref.png b/rsvg/tests/fixtures/reftests/bugs/bug730-font-scaling-ref.png
new file mode 100644
index 00000000..5fef4bdf
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug730-font-scaling-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug730-font-scaling.svg b/rsvg/tests/fixtures/reftests/bugs/bug730-font-scaling.svg
new file mode 100644
index 00000000..5a8ea2b8
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug730-font-scaling.svg
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="500" height="200">
+ <svg x="10" y="0" width="480" height="40" viewBox="0 0 480 40">
+ <text x="0" y="25" font-size="20" font-family="sans">How vexingly quick daft zebras jump!</text>
+ </svg>
+
+ <svg x="10" y="40" width="480" height="40" viewBox="0 0 240 20">
+ <text x="0" y="12.5" font-size="10" font-family="sans">How vexingly quick daft zebras jump!</text>
+ </svg>
+
+ <svg x="10" y="80" width="480" height="40" viewBox="0 0 120 10">
+ <text x="0" y="6.25" font-size="5" font-family="sans">How vexingly quick daft zebras jump!</text>
+ </svg>
+
+ <svg x="10" y="120" width="480" height="40" viewBox="0 0 60 5">
+ <text x="0" y="3.125" font-size="2.5" font-family="sans">How vexingly quick daft zebras jump!</text>
+ </svg>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug738367-ref.png b/rsvg/tests/fixtures/reftests/bugs/bug738367-ref.png
new file mode 100644
index 00000000..dd1af4a1
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug738367-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug738367.svg b/rsvg/tests/fixtures/reftests/bugs/bug738367.svg
new file mode 100644
index 00000000..00860a44
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug738367.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg id="svg2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 300" version="1.1">
+ <path fill="#AAA" stroke="#F00" d="m100,50c100,0,100,100,0,150s-100,50,0,50z"/>
+ <path fill="#AAA" stroke="#F00" d="m300,50c100,0,100,100,0,150h0s-100,50,0,50z"/>
+ <path fill="#AAA" stroke="#F00" d="m500,50c100,0,100,100,0,150v0s-100,50,0,50z"/>
+ <path fill="#AAA" stroke="#F00" d="m700,50c100,0,100,100,0,150l0,0s-100,50,0,50z"/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug749415-ref.png b/rsvg/tests/fixtures/reftests/bugs/bug749415-ref.png
new file mode 100644
index 00000000..b843dcdd
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug749415-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug749415.svg b/rsvg/tests/fixtures/reftests/bugs/bug749415.svg
new file mode 100644
index 00000000..15865a5a
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug749415.svg
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" version="1.1" width="643.56433" height="257.42575" id="svg2852">
+ <defs id="defs2854"/>
+ <g transform="translate(-58.921894,66.069669)" id="layer1">
+ <text x="69.253036" y="-29.653135" id="text3167" xml:space="preserve" style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"><tspan x="69.253036" y="-29.653135" id="tspan3169">1</tspan></text>
+ <text x="69.253036" y="179.25775" id="text3167-4" xml:space="preserve" style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"><tspan x="69.253036" y="179.25775" id="tspan3273">6</tspan></text>
+ <text x="69.253036" y="137.47557" id="text3167-48" xml:space="preserve" style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"><tspan x="69.253036" y="137.47557" id="tspan3271">5</tspan></text>
+ <text x="69.253036" y="95.693436" id="text3167-45" xml:space="preserve" style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"><tspan x="69.253036" y="95.693436" id="tspan3269">4</tspan></text>
+ <text x="69.253036" y="53.911259" id="text3167-7" xml:space="preserve" style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"><tspan x="69.253036" y="53.911259" id="tspan3267">3</tspan></text>
+ <text x="69.253036" y="12.129059" id="text3167-2" xml:space="preserve" style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"><tspan x="69.253036" y="12.129059" id="tspan3265">2</tspan></text>
+ <g transform="matrix(1.5,0,0,1.5,397.76677,54.817007)" id="g3300">
+ <rect width="4.8888898" height="4.6808534" x="-192.98616" y="-71.900017" id="rect2862-2-1-7-2-61" style="fill:#19b2ce;fill-opacity:1;fill-rule:nonzero;stroke:none"/>
+ <rect width="2" height="16" x="-87.267052" y="-182.85747" transform="matrix(0.70710678,-0.70710678,0.70710678,0.70710678,0,0)" id="rect2862-2-1-7-2-2-4-42" style="fill:#19b2ce;fill-opacity:1;fill-rule:nonzero;stroke:none"/>
+ </g>
+ <text x="164.86249" y="-28.66876" id="text3304" xml:space="preserve" style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"><tspan x="164.86249" y="-28.66876" id="tspan3308">Tip mass 0.5 kg</tspan></text>
+ <rect width="44.000343" height="14.666781" x="97.317757" y="-7.0793319" id="rect2862-2-1-7-4-4-6" style="fill:#ce9919;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"/>
+ <text x="161.62811" y="12.691559" id="text3304-7" xml:space="preserve" style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"><tspan x="161.62811" y="12.691559" id="tspan3408">Liquid crystal device</tspan></text>
+ <rect width="28.712872" height="28.712872" x="104.96149" y="27.906385" id="rect3434" style="fill:#cdd9ec;fill-opacity:1;fill-rule:nonzero;stroke:none"/>
+ <text x="161.62811" y="54.473759" id="text3304-4" xml:space="preserve" style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"><tspan x="161.62811" y="54.473759" id="tspan3461">Membrane 7.5 um thick</tspan></text>
+ <rect width="26.400206" height="13.200104" x="106.11783" y="77.429321" id="rect2862-2-1-7-4-44-4-2-33" style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#808080;stroke-width:0.73499995;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"/>
+ <text x="162.65936" y="96.677811" id="text3304-7-2" xml:space="preserve" style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"><tspan x="162.65936" y="96.677811" id="tspan3542">Solar cells 25 um thick</tspan></text>
+ <g transform="translate(-11.463337,-2.9292343)" id="g3588">
+ <path d="m 82.3125,172.71875 -32.21875,32.21875 2.8125,0 30.8125,-30.8125 -1.40625,-1.40625 z" transform="translate(58.921894,-65.07957)" id="rect2862-2-1-7-2-2-3-8-7" style="fill:#ceaa19;fill-opacity:1;fill-rule:nonzero;stroke:none"/>
+ <path d="m 92.21875,182.59375 -23.3125,23.34375 2.8125,0 21.90625,-21.90625 -1.40625,-1.4375 z" transform="translate(58.921894,-65.07957)" id="rect2862-2-1-7-2-2-3-5-9-9" style="fill:#1982ce;fill-opacity:1;fill-rule:nonzero;stroke:none"/>
+ </g>
+ <text x="162.47852" y="138.45995" id="text3304-3" xml:space="preserve" style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"><tspan x="162.47852" y="138.45995" id="tspan3617">Tethers</tspan></text>
+ <path d="m 187.32394,828.41852 a 83.098595,83.098595 0 1 1 -166.197185,0 83.098595,83.098595 0 1 1 166.197185,0 z" transform="matrix(0.24067796,0,0,0.24067796,94.233178,-31.78839)" id="path3939-9" style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none"/>
+ <path d="m 187.32394,828.41852 a 83.098595,83.098595 0 1 1 -166.197185,0 83.098595,83.098595 0 1 1 166.197185,0 z" transform="matrix(0.06016949,0,0,0.06016949,438.17176,92.436)" id="path3939-5-1-8" style="fill:#f3dd00;fill-opacity:1;fill-rule:nonzero;stroke:none"/>
+ <path d="m 187.32394,828.41852 a 83.098595,83.098595 0 1 1 -166.197185,0 83.098595,83.098595 0 1 1 166.197185,0 z" transform="matrix(0.06016949,0,0,0.06016949,453.02324,75.60432)" id="path3939-5-6-6" style="fill:#f3dd00;fill-opacity:1;fill-rule:nonzero;stroke:none"/>
+ <path d="m 187.32394,828.41852 a 83.098595,83.098595 0 1 1 -166.197185,0 83.098595,83.098595 0 1 1 166.197185,0 z" transform="matrix(0.06016949,0,0,0.06016949,424.31037,84.5152)" id="path3939-5-5-5" style="fill:#f3dd00;fill-opacity:1;fill-rule:nonzero;stroke:none"/>
+ <path d="m 187.32394,828.41852 a 83.098595,83.098595 0 1 1 -166.197185,0 83.098595,83.098595 0 1 1 166.197185,0 z" transform="matrix(0.06016949,0,0,0.06016949,440.15195,61.74293)" id="path3939-5-0-0" style="fill:#f3dd00;fill-opacity:1;fill-rule:nonzero;stroke:none"/>
+ <text x="159.24414" y="179.82025" id="text3304-3-6" xml:space="preserve" style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"><tspan x="159.24414" y="179.82025" id="tspan3684">Main body</tspan></text>
+ <text x="485.80463" y="138.83588" id="text3304-3-6-2" xml:space="preserve" style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"><tspan x="485.80463" y="138.83588" id="tspan3711">Instruments</tspan></text>
+ <text x="392.2764" y="138.83588" id="text3167-4-8" xml:space="preserve" style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"><tspan x="392.2764" y="138.83588" id="tspan3738">7</tspan></text>
+ <rect width="643.56433" height="257.42575" x="0" y="-0.99009901" transform="translate(58.921894,-65.07957)" id="rect3740" style="fill:none;stroke:none"/>
+ </g>
+</svg> \ No newline at end of file
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug760180-ref.png b/rsvg/tests/fixtures/reftests/bugs/bug760180-ref.png
new file mode 100644
index 00000000..a6838ca4
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug760180-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug760180.svg b/rsvg/tests/fixtures/reftests/bugs/bug760180.svg
new file mode 100644
index 00000000..c1929f81
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug760180.svg
@@ -0,0 +1,159 @@
+<svg id="svg-root" width="100%" height="100%"
+ viewBox="0 0 480 360" xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= Copyright 2008 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="AG" author="ED" status="accepted"
+ version="$Revision: 1.9 $" testname="$RCSfile: painting-marker-06-f.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/painting.html#MarkerElement">
+ <p>
+ Tests the basic support for markers. For the three tests, there
+ should be two identical paths with markers drawn. The path on the left is
+ rendered using the marker elements. The path on the right is rendered using
+ the equivalent SVG, showing what the marked path should look like.
+ </p>
+ <p>
+ This test is similar to the painting-marker-01-f.svg test, but has some viewBox attributes
+ that have a non-zero offset.
+ </p>
+ <p>
+ The top test examines the basic support for the marker element and style. The markers are purple rectangles.
+ </p>
+ <p>
+ The middle test examines the support for the different styles of marker properties. The
+ "marker-start" property defines the marker to use at the first vertex of the marked path,
+ in this case a purple rectangle. The "marker-end" property defines the marker to use at the
+ last vertex of the marked path, in this case a blue triangle. The "marker-mid" property
+ defines the marker to use at all vertices, other than the first and last, of the marked path,
+ in this case a green circle.
+ </p>
+ <p>
+ The bottom test examines the support for marker orientation along the
+ path direction. The second vertex, the top right corner of the path, has a marker that
+ is rotated 45 degrees, since that is the average of the horizontal and vertical segments
+ each side. The last vertex, the bottom right corner of the path, has a marker rotated 90
+ degrees since that is the direction of the last path segment.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The rendered picture should match the reference image, except for possible
+ variations in the labelling text (per CSS2 rules).
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: painting-marker-06-f.svg,v $</title>
+ <defs>
+ <font-face
+ font-family="SVGFreeSansASCII"
+ unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <defs>
+ <!-- ===================================================================== -->
+ <!-- Define a few simple marker elements -->
+ <!-- ===================================================================== -->
+ <marker id="marker1" viewBox="20 20 10 10" markerWidth="2" markerHeight="2" refX="25" refY="25" markerUnits="strokeWidth">
+ <rect x="20" y="20" width="10" height="10" fill="purple" stroke="none"/>
+ </marker>
+ <marker id="marker2" viewBox="-5 -5 10 10" markerWidth="2" markerHeight="2" markerUnits="strokeWidth" orient="auto">
+ <path d="M 0 -5 L 5 5 L -5 5 Z" fill="blue" stroke="none"/>
+ </marker>
+ <marker id="markerStart" viewBox="0 0 10 10" markerWidth="2" markerHeight="2" refX="5" refY="5" markerUnits="strokeWidth">
+ <rect width="10" height="10" fill="purple" stroke="none"/>
+ </marker>
+ <marker id="markerMiddle" viewBox="0 0 10 10" markerWidth="2" markerHeight="2" refX="5" refY="5" markerUnits="strokeWidth">
+ <circle cx="5" cy="5" r="5" fill="green" stroke="none"/>
+ </marker>
+ <marker id="markerEnd" viewBox="0 0 10 10" markerWidth="2" markerHeight="2" refX="5" refY="5" markerUnits="strokeWidth">
+ <path d="M 5 0 L 10 10 L 0 10 Z" fill="blue" stroke="none"/>
+ </marker>
+ </defs>
+ <!-- ===================================================================== -->
+ <!-- Basic Marker Test -->
+ <!-- ===================================================================== -->
+ <text x="170" y="30" font-size="14">Basic Markers</text>
+ <path fill="none" stroke="black" stroke-width="8" marker-start="url(#marker1)" marker-mid="url(#marker1)" marker-end="url(#marker1)" d="M 130 40 L 180 40 L 180 90"/>
+ <!-- ===================================================================== -->
+ <!-- Generate the equivalent SVG -->
+ <!-- ===================================================================== -->
+ <g transform="translate(120,0)">
+ <path fill="none" stroke="black" stroke-width="8" d="M 130 40 L 180 40 L 180 90"/>
+ <g transform="translate(130,40) scale(8) scale(0.2, 0.2) translate(-5, -5)" fill="none" stroke="black" stroke-width="8">
+ <rect width="10" height="10" fill="purple" stroke="none"/>
+ </g>
+ <g transform="translate(180,40) scale(8) scale(0.2, 0.2) translate(-5, -5)" fill="none" stroke="black" stroke-width="8">
+ <rect width="10" height="10" fill="purple" stroke="none"/>
+ </g>
+ <g transform="translate(180,90) scale(8) scale(0.2, 0.2) translate(-5, -5)" fill="none" stroke="black" stroke-width="8">
+ <rect width="10" height="10" fill="purple" stroke="none"/>
+ </g>
+ </g>
+ <!-- ===================================================================== -->
+ <!-- Start, Middle and End Marker Test -->
+ <!-- ===================================================================== -->
+ <text x="145" y="125" font-size="14">Start, Middle and End</text>
+ <path fill="none" stroke="black" stroke-width="8" marker-start="url(#markerStart)" marker-mid="url(#markerMiddle)" marker-end="url(#markerEnd)" d="M 130 135 L 180 135 L 180 185"/>
+ <!-- ===================================================================== -->
+ <!-- Generate the equivalent SVG -->
+ <!-- ===================================================================== -->
+ <g transform="translate(120,0)">
+ <path fill="none" stroke="black" stroke-width="8" d="M 130 135 L 180 135 L 180 185"/>
+ <g transform="translate(130,135) scale(8) scale(0.2, 0.2) translate(-5, -5)" fill="none" stroke="black" stroke-width="8">
+ <rect width="10" height="10" fill="purple" stroke="none"/>
+ </g>
+ <g transform="translate(180,135) scale(8) scale(0.2, 0.2) translate(-5, -5)" fill="none" stroke="black" stroke-width="8">
+ <circle cx="5" cy="5" r="5" fill="green" stroke="none"/>
+ </g>
+ <g transform="translate(180,185) scale(8) scale(0.2, 0.2) translate(-5, -5)" fill="none" stroke="black" stroke-width="8">
+ <path d="M 5 0 L 10 10 L 0 10 Z" fill="blue" stroke="none"/>
+ </g>
+ </g>
+ <!-- ===================================================================== -->
+ <!-- Auto Orientation Marker Test -->
+ <!-- ===================================================================== -->
+ <text x="145" y="220" font-size="14">Automatic Orientation</text>
+ <path fill="none" stroke="black" stroke-width="8" marker-start="url(#marker2)" marker-mid="url(#marker2)" marker-end="url(#marker2)" d="M 130 230 L 180 230 L 180 280"/>
+ <!-- ===================================================================== -->
+ <!-- Generate the equivalent SVG -->
+ <!-- ===================================================================== -->
+ <g transform="translate(120,0)">
+ <path fill="none" stroke="black" stroke-width="8" d="M 130 230 L 180 230 L 180 280"/>
+ <g transform="translate(130,230) rotate(0) scale(8) scale(0.2, 0.2) translate(-5, -5)" fill="none" stroke="black" stroke-width="8">
+ <path d="M 5 0 L 10 10 L 0 10 Z" fill="blue" stroke="none"/>
+ </g>
+ <g transform="translate(180,230) rotate(45) scale(8) scale(0.2, 0.2) translate(-5, -5)" fill="none" stroke="black" stroke-width="8">
+ <path d="M 5 0 L 10 10 L 0 10 Z" fill="blue" stroke="none"/>
+ </g>
+ <g transform="translate(180,280) rotate(90) scale(8) scale(0.2, 0.2) translate(-5, -5)" fill="none" stroke="black" stroke-width="8">
+ <path d="M 5 0 L 10 10 L 0 10 Z" fill="blue" stroke="none"/>
+ </g>
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none"
+ fill="black">$Revision: 1.9 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug761175-recursive-masks-ref.png b/rsvg/tests/fixtures/reftests/bugs/bug761175-recursive-masks-ref.png
new file mode 100644
index 00000000..aceb5d20
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug761175-recursive-masks-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug761175-recursive-masks.svg b/rsvg/tests/fixtures/reftests/bugs/bug761175-recursive-masks.svg
new file mode 100644
index 00000000..22482664
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug761175-recursive-masks.svg
@@ -0,0 +1,50 @@
+<svg version="1.1" baseProfile="full" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" stroke-linecap="round" stroke-linejoin="round" fill-rule="evenodd" width="321.00" height="27.00" viewBox="0 0 6420 540">
+ <metadata>
+ <rdf:RDF>
+ <rdf:Description>
+ <dc:description>MSS/MilX-Export to SVG</dc:description>
+ <dc:publisher>gs-soft AG</dc:publisher>
+ </rdf:Description>
+ </rdf:RDF>
+ </metadata>
+ <defs>
+ <style type="text/css">
+ <![CDATA[
+ .Pen0 {fill:none;stroke:black;stroke-width:42;}
+ .Pen1 {fill:none;stroke:black;stroke-width:44;}
+ ]]>
+ </style>
+ <mask id="Mask_ClipObj0_ex_ClipObj1" maskUnits="userSpaceOnUse" x="0" y="0" width="6420" height="540">
+ <g>
+ <use xlink:href="#ClipObj0" fill="white"/>
+ <use xlink:href="#ClipObj1" fill="black"/>
+ </g>
+ </mask>
+ <g id="ClipObj0_ex_ClipObj1">
+ <use xlink:href="#ClipObj0" mask="url(#Mask_ClipObj0_ex_ClipObj1)"/>
+ </g>
+ <mask id="Region0" maskUnits="userSpaceOnUse" x="0" y="0" width="6420" height="540" fill-rule="nonzero">
+ <use xlink:href="#ClipObj0_ex_ClipObj1" fill="white"/>
+ </mask>
+ <mask id="Region1" maskUnits="userSpaceOnUse" x="0" y="0" width="6420" height="540" fill-rule="nonzero">
+ <use xlink:href="#ClipObj0" fill="white"/>
+ </mask>
+ <rect id="ClipObj0" x="0" y="0" width="6420" height="540"/>
+ <polygon id="ClipObj1" points="2760,20 3660,20 3660,500 2760,500"/>
+ <g id="Block1">
+ <g transform="matrix(0.068 0 0 0.068 2 2)">
+ <polyline points="480,0 300,300" class="Pen1"/>
+ </g>
+ </g>
+ </defs>
+ <g mask="url(#Region0)">
+ <g transform="matrix(1.66667 0 0 1.66667 0 0)">
+ <polyline points="30,156 3810,156" class="Pen0"/>
+ </g>
+ </g>
+ <g mask="url(#Region1)">
+ <g transform="matrix(19.529 0 0 19.1333 2751.67 21.6667)">
+ <use xlink:href="#Block1"/>
+ </g>
+ </g>
+</svg> \ No newline at end of file
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug761871-reset-reflection-points-ref.png b/rsvg/tests/fixtures/reftests/bugs/bug761871-reset-reflection-points-ref.png
new file mode 100644
index 00000000..e76e47c5
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug761871-reset-reflection-points-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug761871-reset-reflection-points.svg b/rsvg/tests/fixtures/reftests/bugs/bug761871-reset-reflection-points.svg
new file mode 100644
index 00000000..cc3bda9f
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug761871-reset-reflection-points.svg
@@ -0,0 +1,18 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 256 128">
+
+<!-- alternating S (or C) and T -->
+<path d="M 10 10 S 10 48 48 48 T 48 10"/>
+<path d="M 60 10 S 60 48 98 48 Q 98 48 98 10"/>
+
+<path d="M 10 60 C 10 60 10 98 48 98 T 48 60"/>
+<path d="M 60 60 C 60 60 60 98 98 98 Q 98 98 98 60"/>
+<g transform='translate (128, 0)'>
+<!-- alternating Q (or T) and S -->
+<path d="M 10 10 T 10 48 S 48 48 48 10"/>
+<path d="M 60 10 T 60 48 C 60 48 98 48 98 10"/>
+
+<path d="M 10 60 Q 10 60 10 98 S 48 98 48 60"/>
+<path d="M 60 60 Q 60 60 60 98 C 60 98 98 98 98 60"/>
+</g>
+</svg>
+
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug763386-marker-coincident-ref.png b/rsvg/tests/fixtures/reftests/bugs/bug763386-marker-coincident-ref.png
new file mode 100644
index 00000000..2248fd7b
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug763386-marker-coincident-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug763386-marker-coincident.svg b/rsvg/tests/fixtures/reftests/bugs/bug763386-marker-coincident.svg
new file mode 100644
index 00000000..7af4f9e3
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug763386-marker-coincident.svg
@@ -0,0 +1,15 @@
+<svg xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ viewBox="0 0 130 130">
+ <marker id="marker"
+ viewBox="-4 -4 8 8"
+ orient="auto">
+ <path d="M -1 -4, -1, 4, 1, 0 Z"/>
+ </marker>
+ <path stroke-width="8" marker-start="url(#marker)" marker-end="url(#marker)"
+ stroke="red" d="M 12,12 c 0,0 0,0 40,40"/>
+ <path stroke-width="8" marker-start="url(#marker)" marker-end="url(#marker)"
+ stroke="red" d="M 118,12 c -40,40 -40,40 -40,40"/>
+ <path stroke-width="8" marker-start="url(#marker)" marker-end="url(#marker)"
+ stroke="red" d="M 12,70 c 0,0 40,40 40,40"/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug776297-marker-on-non-path-elements-ref.png b/rsvg/tests/fixtures/reftests/bugs/bug776297-marker-on-non-path-elements-ref.png
new file mode 100644
index 00000000..1b5634c1
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug776297-marker-on-non-path-elements-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug776297-marker-on-non-path-elements.svg b/rsvg/tests/fixtures/reftests/bugs/bug776297-marker-on-non-path-elements.svg
new file mode 100644
index 00000000..d8b78f31
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug776297-marker-on-non-path-elements.svg
@@ -0,0 +1,16 @@
+<svg xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ viewBox="0 0 128 64">
+ <marker id="marker"
+ viewBox="0 -1 4 2"
+ orient="auto">
+ <path fill="blue" d="M 0 -1 L 4 0 0 1" />
+ </marker>
+
+ <path stroke-width="4" marker-mid="url(#marker)"
+ stroke="red" fill="none" d="M 12,12 l 40,0 0,40 -40,0 0,-40"/>
+ <circle stroke-width="4" cx="32" cy="32" r="20" marker-mid="url(#marker)"
+ stroke="red" fill="none"/>
+ <rect stroke-width="4" x="76" y="12" width="40" height="40" marker-mid="url(#marker)"
+ stroke="red" fill="none"/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug786372-default-style-type-ref.png b/rsvg/tests/fixtures/reftests/bugs/bug786372-default-style-type-ref.png
new file mode 100644
index 00000000..f3bf76a8
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug786372-default-style-type-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug786372-default-style-type.svg b/rsvg/tests/fixtures/reftests/bugs/bug786372-default-style-type.svg
new file mode 100644
index 00000000..780aac63
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug786372-default-style-type.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><defs><style>.a{fill:#010101;}.b{fill:none;}</style></defs><title>Icont set</title><path class="a" d="M17.15,15.56c-2-.46-3.87-.87-3-2.58,2.75-5.2.73-8-2.18-8S7.06,7.89,9.82,13c.93,1.72-1,2.12-3,2.58C5.06,16,5,16.86,5,18.42V19H19v-.57C19,16.87,18.95,16,17.15,15.56Z"/><path class="b" d="M0,0H24V24H0Z"/></svg> \ No newline at end of file
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug788-inner-svg-viewbox-ref.png b/rsvg/tests/fixtures/reftests/bugs/bug788-inner-svg-viewbox-ref.png
new file mode 100644
index 00000000..93349f98
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug788-inner-svg-viewbox-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/bugs/bug788-inner-svg-viewbox.svg b/rsvg/tests/fixtures/reftests/bugs/bug788-inner-svg-viewbox.svg
new file mode 100644
index 00000000..25029f61
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/bug788-inner-svg-viewbox.svg
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" fill="#FFFFFF" height="62px" version="1.1" viewBox="0 0 164 62" width="164px">
+ <defs>
+ <clipPath id="clip"><rect height="100%" width="100%" x="0" y="0"/></clipPath>
+ </defs>
+ <g clip-path="url(#clip)">
+ <g style="text-anchor:middle" transform="translate(72)">
+ <linearGradient id="BOX" x1="100%" x2="100%" y1="100%" y2="0">
+ <stop offset="0" style="stop-color:#2E2E2E"/>
+ <stop offset="1" style="stop-color:#676769"/>
+ </linearGradient>
+
+ <g transform="translate(-148)">
+ <svg height="45%" width="22px" x="100%" y="3.33%">
+ <rect fill="url(#BOX)" height="100%" width="100%"/>
+ <rect fill="green" x="50%" y="72%" width="4px" height="4px">3</rect>
+ </svg>
+ </g>
+ </g>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/bugs/ignore-577-multiple-font-families.svg b/rsvg/tests/fixtures/reftests/bugs/ignore-577-multiple-font-families.svg
new file mode 100644
index 00000000..a7d3ca84
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/bugs/ignore-577-multiple-font-families.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="500" height="500">
+ <rect x="0" y="0" width="500" height="500" fill="white"/>
+ <text font-family="Nonexistent Family, serif, sans" x="100" y="100" font-size="30">
+ Hello
+ </text>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/css-import-ref.png b/rsvg/tests/fixtures/reftests/css-import-ref.png
new file mode 100644
index 00000000..ca9f7883
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/css-import-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/css-import-url-ref.png b/rsvg/tests/fixtures/reftests/css-import-url-ref.png
new file mode 100644
index 00000000..ca9f7883
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/css-import-url-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/css-import-url.svg b/rsvg/tests/fixtures/reftests/css-import-url.svg
new file mode 100644
index 00000000..b4bb97db
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/css-import-url.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 400">
+<style type="text/css">
+ @import url("css-import.css");
+</style>
+<rect class="myrect" x="10" y="10" width="100" height="100"/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/css-import.css b/rsvg/tests/fixtures/reftests/css-import.css
new file mode 100644
index 00000000..c7037d76
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/css-import.css
@@ -0,0 +1 @@
+.myrect{fill:green;}
diff --git a/rsvg/tests/fixtures/reftests/css-import.svg b/rsvg/tests/fixtures/reftests/css-import.svg
new file mode 100644
index 00000000..bb2a56f7
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/css-import.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 400">
+<style type="text/css">
+ @import "css-import.css";
+</style>
+<rect class="myrect" x="10" y="10" width="100" height="100"/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/duplicate-id-ref.png b/rsvg/tests/fixtures/reftests/duplicate-id-ref.png
new file mode 100644
index 00000000..56e95a80
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/duplicate-id-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/duplicate-id.svg b/rsvg/tests/fixtures/reftests/duplicate-id.svg
new file mode 100644
index 00000000..c05f3413
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/duplicate-id.svg
@@ -0,0 +1,7 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="10" height="10">
+ <defs>
+ <rect fill="chartreuse" id="a" width="10" height="10" />
+ <rect fill="tomato" id="a" width="10" height="10" />
+ </defs>
+ <use xlink:href="#a"/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/filter-component-transfer-from-reference-page-ref.png b/rsvg/tests/fixtures/reftests/filter-component-transfer-from-reference-page-ref.png
new file mode 100644
index 00000000..ae7977dc
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/filter-component-transfer-from-reference-page-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/filter-component-transfer-from-reference-page.svg b/rsvg/tests/fixtures/reftests/filter-component-transfer-from-reference-page.svg
new file mode 100644
index 00000000..677d50ce
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/filter-component-transfer-from-reference-page.svg
@@ -0,0 +1,63 @@
+<!-- This was taken from the reference page over at
+ https://www.w3.org/TR/SVG11/filters.html#feComponentTransferElement -->
+<svg width="8cm" height="4cm" viewBox="0 0 800 400"
+ xmlns="http://www.w3.org/2000/svg" version="1.1">
+ <title>Example feComponentTransfer - Examples of feComponentTransfer operations</title>
+ <desc>Four text strings showing the effects of feComponentTransfer:
+ an identity function acting as a reference,
+ use of the feComponentTransfer table option,
+ use of the feComponentTransfer linear option,
+ and use of the feComponentTransfer gamma option.</desc>
+ <defs>
+ <linearGradient id="MyGradient" gradientUnits="userSpaceOnUse"
+ x1="100" y1="0" x2="600" y2="0">
+ <stop offset="0" stop-color="#ff0000" />
+ <stop offset=".33" stop-color="#00ff00" />
+ <stop offset=".67" stop-color="#0000ff" />
+ <stop offset="1" stop-color="#000000" />
+ </linearGradient>
+ <filter id="Identity" filterUnits="objectBoundingBox"
+ x="0%" y="0%" width="100%" height="100%">
+ <feComponentTransfer>
+ <feFuncR type="identity"/>
+ <feFuncG type="identity"/>
+ <feFuncB type="identity"/>
+ <feFuncA type="identity"/>
+ </feComponentTransfer>
+ </filter>
+ <filter id="Table" filterUnits="objectBoundingBox"
+ x="0%" y="0%" width="100%" height="100%">
+ <feComponentTransfer>
+ <feFuncR type="table" tableValues="0 0 1 1"/>
+ <feFuncG type="table" tableValues="1 1 0 0"/>
+ <feFuncB type="table" tableValues="0 1 1 0"/>
+ </feComponentTransfer>
+ </filter>
+ <filter id="Linear" filterUnits="objectBoundingBox"
+ x="0%" y="0%" width="100%" height="100%">
+ <feComponentTransfer>
+ <feFuncR type="linear" slope=".5" intercept=".25"/>
+ <feFuncG type="linear" slope=".5" intercept="0"/>
+ <feFuncB type="linear" slope=".5" intercept=".5"/>
+ </feComponentTransfer>
+ </filter>
+ <filter id="Gamma" filterUnits="objectBoundingBox"
+ x="0%" y="0%" width="100%" height="100%">
+ <feComponentTransfer>
+ <feFuncR type="gamma" amplitude="2" exponent="5" offset="0"/>
+ <feFuncG type="gamma" amplitude="2" exponent="3" offset="0"/>
+ <feFuncB type="gamma" amplitude="2" exponent="1" offset="0"/>
+ </feComponentTransfer>
+ </filter>
+ </defs>
+ <rect fill="none" stroke="blue"
+ x="1" y="1" width="798" height="398"/>
+ <g font-family="Verdana" font-size="75"
+ font-weight="bold" fill="url(#MyGradient)" >
+ <rect x="100" y="0" width="600" height="20" />
+ <text x="100" y="90">Identity</text>
+ <text x="100" y="190" filter="url(#Table)" >TableLookup</text>
+ <text x="100" y="290" filter="url(#Linear)" >LinearFunc</text>
+ <text x="100" y="390" filter="url(#Gamma)" >GammaFunc</text>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/filter-composite-color-interpolation-filters-ref.png b/rsvg/tests/fixtures/reftests/filter-composite-color-interpolation-filters-ref.png
new file mode 100644
index 00000000..de7d2c38
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/filter-composite-color-interpolation-filters-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/filter-conv-bounds-ref.png b/rsvg/tests/fixtures/reftests/filter-conv-bounds-ref.png
new file mode 100644
index 00000000..604bdfeb
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/filter-conv-bounds-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/filter-conv-bounds.svg b/rsvg/tests/fixtures/reftests/filter-conv-bounds.svg
new file mode 100644
index 00000000..7d6eb44d
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/filter-conv-bounds.svg
@@ -0,0 +1,36 @@
+<svg id="svg-root" width="100%" height="100%"
+ viewBox="0 0 480 360" xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink">
+
+ <!-- The test checks if edgeMode wrapping wraps around the input surface bounds,
+ or the input surface bounds clipped to the primitive subregion.
+ The spec doesn't specify anything, Chromium uses the latter, and Firefox uses the former.
+
+ Since both are wrapping the input surface clipped to the filter effects region,
+ wrapping while obeying clipping to the primitive subregion seems like the better behavior,
+ so that's what librsvg does. -->
+ <filter id="primitive-bounds-narrower">
+ <feConvolveMatrix kernelUnitLength="1" x="0" y="0" width="25" height="25" edgeMode="wrap" order="5" targetX="0" targetY="0" kernelMatrix="1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"/>
+ </filter>
+
+ <!-- Same as above, but the primitive subregion is now larger than the input surface.
+ Both Chromium and Firefox don't tile the input surface in this case. -->
+ <filter id="primitive-bounds-larger">
+ <feFlood x="0" y="0" width="30" height="30" flood-color="red" result="f1"/>
+ <feFlood x="5" y="5" width="20" height="20" flood-color="green" result="f2"/>
+ <feMerge>
+ <feMergeNode in="f1"/>
+ <feMergeNode in="f2"/>
+ </feMerge>
+ <feConvolveMatrix kernelUnitLength="1" x="0" y="0" width="50" height="50" edgeMode="wrap" order="5" targetX="0" targetY="0" kernelMatrix="1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"/>
+ </filter>
+
+ <g transform="translate(30 20)" filter="url(#primitive-bounds-narrower)">
+ <rect fill="red" x="1" y="1" width="50" height="50"/>
+ <rect fill="green" x="6" y="6" width="40" height="40"/>
+ </g>
+
+ <g transform="translate(90 20)" filter="url(#primitive-bounds-larger)">
+ <rect x="1" y="1" width="50" height="50"/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/filter-conv-divisor-ref.png b/rsvg/tests/fixtures/reftests/filter-conv-divisor-ref.png
new file mode 100644
index 00000000..1a581f98
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/filter-conv-divisor-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/filter-conv-divisor.svg b/rsvg/tests/fixtures/reftests/filter-conv-divisor.svg
new file mode 100644
index 00000000..9f2d729e
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/filter-conv-divisor.svg
@@ -0,0 +1,70 @@
+<svg id="svg-root" width="100%" height="100%"
+ viewBox="0 0 480 360" xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink">
+
+ <!-- no divisor specified, sum of matrix elements is 0: divisor is 1 -->
+ <filter id="conv1">
+ <feConvolveMatrix kernelMatrix="1 0 0
+ 0 0 0
+ 0 0 -1"/>
+ </filter>
+
+ <!-- divisor set to 0, sum of matrix elements is 0: divisor is 1 -->
+ <filter id="conv2">
+ <feConvolveMatrix kernelMatrix="1 0 0
+ 0 0 0
+ 0 0 -1" divisor="0"/>
+ </filter>
+
+ <!-- no divisor specified, sum of matrix elements is 2: divisor is 2 -->
+ <filter id="conv3">
+ <feConvolveMatrix kernelMatrix="1 0 0
+ 0 0 0
+ 0 0 1"/>
+ </filter>
+
+ <!-- divisor set to 0, sum of matrix elements is 2: divisor is 2 -->
+ <filter id="conv4">
+ <feConvolveMatrix kernelMatrix="1 0 0
+ 0 0 0
+ 0 0 1" divisor="0"/>
+ </filter>
+
+ <!-- divisor set to 1, sum of matrix elements is 2: divisor is 1 -->
+ <filter id="conv5">
+ <feConvolveMatrix kernelMatrix="1 0 0
+ 0 0 0
+ 0 0 1" divisor="1"/>
+ </filter>
+
+ <g transform="translate(20 20)">
+ <rect fill="blue" x="1" y="1" width="100" height="100"/>
+ <rect fill="blue" stroke="white" stroke-width="2" x="25" y="25" width="50" height="50"/>
+ </g>
+
+ <g transform="translate(140 20)">
+ <rect fill="blue" x="1" y="1" width="100" height="100"/>
+ <rect fill="blue" stroke="white" stroke-width="2" x="25" y="25" width="50" height="50" filter="url(#conv1)"/>
+ </g>
+
+ <g transform="translate(260 20)">
+ <rect fill="blue" x="1" y="1" width="100" height="100"/>
+ <rect fill="blue" stroke="white" stroke-width="2" x="25" y="25" width="50" height="50" filter="url(#conv2)"/>
+ </g>
+
+ <g transform="translate(20 140)">
+ <rect fill="blue" x="1" y="1" width="100" height="100"/>
+ <rect fill="blue" stroke="white" stroke-width="2" x="25" y="25" width="50" height="50" filter="url(#conv3)"/>
+ </g>
+
+ <g transform="translate(140 140)">
+ <rect fill="blue" x="1" y="1" width="100" height="100"/>
+ <rect fill="blue" stroke="white" stroke-width="2" x="25" y="25" width="50" height="50" filter="url(#conv4)"/>
+ </g>
+
+ <g transform="translate(260 140)">
+ <rect fill="blue" x="1" y="1" width="100" height="100"/>
+ <rect fill="blue" stroke="white" stroke-width="2" x="25" y="25" width="50" height="50" filter="url(#conv5)"/>
+ </g>
+
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/filter-effects-region-ref.png b/rsvg/tests/fixtures/reftests/filter-effects-region-ref.png
new file mode 100644
index 00000000..79559741
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/filter-effects-region-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/filter-effects-region.svg b/rsvg/tests/fixtures/reftests/filter-effects-region.svg
new file mode 100644
index 00000000..fcd37944
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/filter-effects-region.svg
@@ -0,0 +1,84 @@
+<svg id="svg-root" width="100%" height="100%"
+ viewBox="0 0 480 360" xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink">
+
+ <!-- -10%, -10%, 120%, 120% from the referencing node. -->
+ <filter id="defaults">
+ <feFlood flood-color="green"/>
+ </filter>
+
+ <!-- -10%, -10%, 120%, 120% from the user coordinate system.
+ In this case full image translated to 300, 20
+ as per the group node enclosing the reference node. -->
+ <filter id="usou-defaults" filterUnits="userSpaceOnUse">
+ <feFlood flood-color="green"/>
+ </filter>
+
+ <!-- Fractions of the bounding box on the referencing element. -->
+ <filter id="fractions" x="0.25" y="0.25" width="0.5" height="0.5">
+ <feFlood flood-color="green"/>
+ </filter>
+
+ <!-- Fractions of the bounding box on the referencing element.
+ Note this "em": in this case it's invalid. -->
+ <filter id="fractions-invalid" x="0.25em" y="0.25" width="0.5" height="0.5">
+ <feFlood flood-color="green"/>
+ </filter>
+
+ <!-- Same as above but for the primitive subregion. -->
+ <filter id="fractions-invalid-primitive" primitiveUnits="objectBoundingBox">
+ <feFlood flood-color="green"/>
+ <feOffset width="0.9em" dx="0.5" dy="0.5"/>
+ </filter>
+
+ <!-- According to the spec, the "em" here should use the coordinate system
+ of the referencing node, per filterUnits="userSpaceOnUse". However, the "em" units
+ should resolve with respec to the element's font-size. Firefox (incorrectly?)
+ uses the font-size of the element that referenced the filter. -->
+ <filter id="cascading" filterUnits="userSpaceOnUse" style="font-size: 20px"
+ x="1em" y="1em" width="50" height="50">
+ <feFlood flood-color="green"/>
+ </filter>
+
+ <!-- Same as above but for the default primitiveUnits="userSpaceOnUse"; the primitive's width/height default to 100%
+ with respect to the filter region, whose default is filterUnits="objectBoundingBox".
+ Firefox has the same bug here. -->
+ <filter id="cascading-primitive" style="font-size: 20px">
+ <feFlood x="1em" y="1em" flood-color="green"/>
+ </filter>
+
+ <g transform="translate(30 20)">
+ <rect fill="red" x="1" y="1" width="50" height="50"/>
+ <rect fill="red" x="1" y="1" width="50" height="50" filter="url(#defaults)"/>
+ </g>
+
+ <g transform="translate(100 20)">
+ <rect fill="red" x="1" y="1" width="50" height="50"/>
+ <rect fill="red" x="1" y="1" width="50" height="50" filter="url(#fractions)"/>
+ </g>
+
+ <g transform="translate(100 100)">
+ <rect fill="red" x="1" y="1" width="50" height="50"/>
+ <rect fill="red" x="1" y="1" width="50" height="50" filter="url(#fractions-invalid)"/>
+ </g>
+
+ <g transform="translate(100 180)">
+ <rect fill="red" x="1" y="1" width="50" height="50"/>
+ <rect fill="red" x="1" y="1" width="50" height="50" filter="url(#fractions-invalid-primitive)"/>
+ </g>
+
+ <g transform="translate(170 20)" style="font-size: 10px">
+ <rect fill="red" x="1" y="1" width="50" height="50"/>
+ <rect fill="red" x="1" y="1" width="50" height="50" filter="url(#cascading)"/>
+ </g>
+
+ <g transform="translate(170 100)" style="font-size: 10px">
+ <rect fill="red" x="1" y="1" width="50" height="50"/>
+ <rect fill="red" x="1" y="1" width="50" height="50" filter="url(#cascading-primitive)"/>
+ </g>
+
+ <g transform="translate(300 20)">
+ <rect fill="red" x="1" y="1" width="50" height="50"/>
+ <rect fill="red" x="1" y="1" width="50" height="50" filter="url(#usou-defaults)"/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/filter-image-from-reference-page-ref.png b/rsvg/tests/fixtures/reftests/filter-image-from-reference-page-ref.png
new file mode 100644
index 00000000..f8cb24a6
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/filter-image-from-reference-page-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/filter-image-from-reference-page.svg b/rsvg/tests/fixtures/reftests/filter-image-from-reference-page.svg
new file mode 100644
index 00000000..e9cef3f0
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/filter-image-from-reference-page.svg
@@ -0,0 +1,35 @@
+<!-- This was taken from the reference page over at
+ https://www.w3.org/TR/SVG11/filters.html#feImageElement -->
+<svg width="600" height="250" viewBox="0 0 600 250"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink">
+ <title>Example feImage - Examples of feImage use</title>
+ <desc>Three examples of using feImage, the first showing the
+ default rendering, the second showing the image fit
+ to a box and the third showing the image
+ shifted and clipped.</desc>
+ <defs>
+ <filter id="Default">
+ <feImage xlink:href="svg1.1/images/smiley.png" />
+ </filter>
+ <filter id="Fitted" primitiveUnits="objectBoundingBox">
+ <feImage xlink:href="svg1.1/images/smiley.png"
+ x="0" y="0" width="100%" height="100%"
+ preserveAspectRatio="none"/>
+ </filter>
+ <filter id="Shifted">
+ <feImage xlink:href="svg1.1/images/smiley.png"
+ x="500" y="5"/>
+ </filter>
+ </defs>
+ <rect fill="none" stroke="blue"
+ x="1" y="1" width="598" height="248"/>
+ <g>
+ <rect x="50" y="25" width="100" height="200" filter="url(#Default)"/>
+ <rect x="50" y="25" width="100" height="200" fill="none" stroke="green"/>
+ <rect x="250" y="25" width="100" height="200" filter="url(#Fitted)"/>
+ <rect x="250" y="25" width="100" height="200" fill="none" stroke="green"/>
+ <rect x="450" y="25" width="100" height="200" filter="url(#Shifted)"/>
+ <rect x="450" y="25" width="100" height="200" fill="none" stroke="green"/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/filter-kernel-unit-length-ref.png b/rsvg/tests/fixtures/reftests/filter-kernel-unit-length-ref.png
new file mode 100644
index 00000000..ca3a0467
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/filter-kernel-unit-length-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/filter-kernel-unit-length.svg b/rsvg/tests/fixtures/reftests/filter-kernel-unit-length.svg
new file mode 100644
index 00000000..c45b7721
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/filter-kernel-unit-length.svg
@@ -0,0 +1,30 @@
+<svg id="svg-root" width="100%" height="100%"
+ viewBox="0 0 480 360" xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink">
+
+ <!-- The test checks that kernelUnitLength is handled properly by filters which support it. -->
+ <filter id="convolve-matrix">
+ <feConvolveMatrix kernelUnitLength="2 1" x="0" y="0" width="25" height="25" edgeMode="wrap" order="5" targetX="0" targetY="0" kernelMatrix="1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"/>
+ </filter>
+
+ <filter id="pointLightA" filterUnits="objectBoundingBox" x="0" y="0" width="1" height="1">
+ <feDiffuseLighting kernelUnitLength="2" in="SourceGraphic" diffuseConstant="1" surfaceScale="10" lighting-color="white">
+ <fePointLight x="0" y="0" z="10"/>
+ </feDiffuseLighting>
+ </filter>
+ <filter id="spotLightD" filterUnits="objectBoundingBox" x="0" y="0" width="1" height="1">
+ <feDiffuseLighting kernelUnitLength="0.25" in="SourceGraphic" diffuseConstant="1" surfaceScale="10" lighting-color="white">
+ <feSpotLight x="25" y="0" z="35" pointsAtX="25" pointsAtY="30" pointsAtZ="0" specularExponent="0" limitingConeAngle="30"/>
+ </feDiffuseLighting>
+ </filter>
+
+ <g transform="translate(30 20)" filter="url(#convolve-matrix)">
+ <rect fill="red" x="1" y="1" width="50" height="50"/>
+ <rect fill="green" x="6" y="6" width="40" height="40"/>
+ </g>
+
+ <g transform="translate(30 60)">
+ <image xlink:href="svg1.1/images/bumpMap2.png" width="50" height="30" filter="url(#pointLightA)"/>
+ <rect transform="translate(70, 0)" width="50" height="30" filter="url(#spotLightD)"/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/filter-offset-ref.png b/rsvg/tests/fixtures/reftests/filter-offset-ref.png
new file mode 100644
index 00000000..c3da529d
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/filter-offset-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/filter-offset.svg b/rsvg/tests/fixtures/reftests/filter-offset.svg
new file mode 100644
index 00000000..a7c8633a
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/filter-offset.svg
@@ -0,0 +1,33 @@
+<svg id="svg-root" width="100%" height="100%"
+ viewBox="0 0 480 360" xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink">
+
+ <!-- normal offset -->
+ <filter id="offset1" primitiveUnits="objectBoundingBox">
+ <feOffset dx="0.5" dy="0.1"/>
+ </filter>
+
+ <!-- zero offset -->
+ <filter id="offset2" primitiveUnits="objectBoundingBox">
+ <feOffset dx="0" dy="0"/>
+ </filter>
+
+ <!-- offset larger than the source (no intersection) -->
+ <filter id="offset3" primitiveUnits="objectBoundingBox">
+ <feOffset dx="100" dy="100"/>
+ </filter>
+
+ <g transform="translate(30 20)">
+ <rect fill="green" x="1" y="1" width="50" height="50"/>
+ <rect fill="red" x="60" y="1" width="50" height="50"/>
+
+ <rect fill="green" x="1" y="60" width="50" height="50"/>
+ <rect fill="red" x="1" y="60" width="50" height="50" filter="url(#offset1)"/>
+
+ <rect fill="green" x="1" y="120" width="50" height="50"/>
+ <rect fill="red" x="1" y="120" width="50" height="50" filter="url(#offset2)"/>
+
+ <rect fill="green" x="1" y="180" width="50" height="50"/>
+ <rect fill="red" x="1" y="180" width="50" height="50" filter="url(#offset3)"/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/font-shorthand-ref.png b/rsvg/tests/fixtures/reftests/font-shorthand-ref.png
new file mode 100644
index 00000000..b3b3a050
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/font-shorthand-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/font-shorthand.svg b/rsvg/tests/fixtures/reftests/font-shorthand.svg
new file mode 100644
index 00000000..18b28215
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/font-shorthand.svg
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="500" height="500">
+ <text style="font: bold 50px sans;" x="100" y="250">Hello world</text>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/gzip-compressed-ref.png b/rsvg/tests/fixtures/reftests/gzip-compressed-ref.png
new file mode 100644
index 00000000..8aa2a9e1
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/gzip-compressed-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/gzip-compressed.svg b/rsvg/tests/fixtures/reftests/gzip-compressed.svg
new file mode 100644
index 00000000..1a7d554c
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/gzip-compressed.svg
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/hexchat-ref.png b/rsvg/tests/fixtures/reftests/hexchat-ref.png
new file mode 100644
index 00000000..9b2bf0dd
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/hexchat-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/hexchat.svg b/rsvg/tests/fixtures/reftests/hexchat.svg
new file mode 100644
index 00000000..07be27f5
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/hexchat.svg
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ height="64"
+ width="64">
+ <metadata>
+ <rdf:RDF>
+ <cc:Work>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:creator>
+ <cc:Agent>
+ <dc:title>Guglielmi David</dc:title>
+ </cc:Agent>
+ </dc:creator>
+ <cc:license rdf:resource="http://creativecommons.org/licenses/GPL/2.0/" />
+ <dc:rights>
+ <cc:Agent>
+ <dc:title>Peter Zelezny</dc:title>
+ </cc:Agent>
+ </dc:rights>
+ <dc:contributor>
+ <cc:Agent>
+ <dc:title>Samuel Messner</dc:title>
+ </cc:Agent>
+ </dc:contributor>
+ </cc:Work>
+ <cc:License rdf:about="http://creativecommons.org/licenses/GPL/2.0/">
+ <cc:requires rdf:resource="http://web.resource.org/cc/Notice" />
+ <cc:requires rdf:resource="http://web.resource.org/cc/ShareAlike" />
+ <cc:requires rdf:resource="http://web.resource.org/cc/SourceCode" />
+ <cc:permits rdf:resource="http://web.resource.org/cc/Reproduction" />
+ <cc:permits rdf:resource="http://web.resource.org/cc/Distribution" />
+ <cc:permits rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
+ </cc:License>
+ </rdf:RDF>
+ </metadata>
+ <defs>
+ <linearGradient id="hexchatGradient" x1="0" y1="0" x2="0" y2="1">
+ <stop id="hgYellowStop" offset="0" style="stop-color: #FFD600" />
+ <stop id="hgRedStop" offset="1" style="stop-color: #FF2600" />
+ </linearGradient>
+ </defs>
+ <use xlink:href="#outline" style="opacity:0.15" transform="translate(0,2)" id="shadow" />
+ <path
+ style="fill:#000000; fill-opacity: 1;"
+ d="M 31.71875,4.1088109 C 24.433462,4.1801109 17.123427,4.6356469 15.75,5.4213109 13.003148,6.9926379 0.06149557,29.207739 0.09374996,32.296311 0.12600597,35.384884 13.564642,57.372816 16.34375,58.890061 19.122855,60.407306 45.503149,60.148888 48.25,58.577561 50.996852,57.006233 63.938504,34.791133 63.90625,31.702561 63.87399,28.613989 50.466608,6.5948049 47.6875,5.0775609 46.297948,4.3189379 39.004037,4.0375089 31.71875,4.1088109 Z m -0.1875,9.2500001 c 3.386631,-0.03246 6.676687,0.05409 8.75,0.28125 l -8.71875,9.71875 -9.0625,-9.5 c 2.055746,-0.283043 5.521157,-0.466366 9.03125,-0.5 z m 17.34375,9.84375 c 2.298293,3.744897 4.302354,7.392556 4.3125,8.34375 0.01126,1.055883 -2.358157,5.507241 -4.875,9.6875 l -9.03125,-8.03125 z m -34.46875,0.25 8.75,9.75 -8.1875,7.875 c -2.482342,-3.992634 -4.707927,-8.110307 -4.71875,-9.125 -0.01021,-0.95736 1.927117,-4.687748 4.15625,-8.5 z m 17.15625,16.90625 9.8125,9.21875 c -4.111037,0.67314 -16.108253,0.781873 -19.46875,0.125 z"
+ id="outline" />
+ <path
+ style="fill:url(#hexchatGradient); fill-opacity: 1;"
+ d="m 31.34375,6.1713109 c -6.857093,0.06521 -13.707297,0.469014 -15,1.1875 C 13.758345,8.7957819 1.5633917,29.128076 1.5937497,31.952561 c 0.03036,2.824486 12.6654863,22.924987 15.2812503,24.3125 2.615763,1.387513 27.445846,1.186972 30.03125,-0.25 2.585405,-1.436972 14.780359,-21.769265 14.75,-24.59375 C 61.62589,28.596826 48.990764,8.4650729 46.375,7.0775609 45.067119,6.3838039 38.200842,6.1061049 31.34375,6.1713109 Z m 0.0625,5.0625001 c 5.36199,-0.05245 10.696035,0.19201 11.71875,0.75 0.06132,0.03346 0.143803,0.127745 0.21875,0.1875 l -11.28125,12.59375 -0.5,0.53125 -0.46875,-0.53125 -11.75,-12.3125 c 0.10903,-0.09884 0.228263,-0.201843 0.3125,-0.25 1.010846,-0.577879 6.38801,-0.916306 11.75,-0.96875 z m 18.0625,9.46875 c 2.883844,4.661341 5.612556,9.652893 5.625,10.84375 0.01348,1.290331 -3.064699,7.087557 -6.09375,12.09375 l -11.09375,-9.90625 -0.53125,-0.46875 0.5,-0.46875 11.59375,-12.09375 z m -35.78125,0.03125 10.84375,12.0625 0.4375,0.46875 -0.46875,0.4375 -10.28125,9.90625 c -3.04689,-4.86606 -6.0493623,-10.36778 -6.0625003,-11.625 -0.01271,-1.216102 2.6892393,-6.451996 5.5312503,-11.25 z m 17.875,17.78125 0.4375,0.4375 12.34375,11.59375 c -0.318014,0.365376 -0.587006,0.638955 -0.78125,0.75 -2.02169,1.155758 -21.423322,1.397228 -23.46875,0.28125 -0.228202,-0.124506 -0.601742,-0.47821 -1,-0.9375 l 12,-11.6875 0.46875,-0.4375 z"
+ id="coloredX" />
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/ignore-filter-composite-color-interpolation-filters.svg b/rsvg/tests/fixtures/reftests/ignore-filter-composite-color-interpolation-filters.svg
new file mode 100644
index 00000000..1cf28387
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/ignore-filter-composite-color-interpolation-filters.svg
@@ -0,0 +1,65 @@
+<svg version="1.1" baseProfile="basic" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <defs>
+ <path id="Blue100" d="M 0 0 L 150 0 L 150 150 z" fill="#008888"/>
+ <path id="Red100" d="M 0 0 L 0 150 L 150 0 z" fill="#880088"/>
+ <path id="Blue50" d="M 0 0 L 150 0 L 150 150 z" fill="#008888" fill-opacity="0.5"/>
+ <path id="Red50" d="M 0 0 L 0 150 L 150 0 z" fill="#880088" fill-opacity="0.5"/>
+
+ <filter id="atop-50" x="0" y="0" width="1" height="1">
+ <feImage xlink:href="#Blue50" result="blue"/>
+ <feImage xlink:href="#Red50" result="red"/>
+ <feComposite in2="blue" in="red" operator="atop"/>
+ </filter>
+
+ <filter id="atop-50-sRGB" x="0" y="0" width="1" height="1">
+ <feImage xlink:href="#Blue50" result="blue"/>
+ <feImage xlink:href="#Red50" result="red"/>
+ <feComposite in2="blue" in="red" operator="atop" color-interpolation-filters="sRGB"/>
+ </filter>
+
+ <filter id="arithmetic-sRGB-inherited" x="0" y="0" width="1" height="1" color-interpolation-filters="sRGB">
+ <feImage xlink:href="#Blue100" result="blue"/>
+ <feImage xlink:href="#Red100" result="red"/>
+ <feComposite in2="blue" in="red" operator="arithmetic" k1=".5" k2=".5" k3=".5" k4=".5"/>
+ </filter>
+
+ <filter id="arithmetic" x="0" y="0" width="1" height="1">
+ <feImage xlink:href="#Blue100" result="blue"/>
+ <feImage xlink:href="#Red100" result="red"/>
+ <feComposite in2="blue" in="red" operator="arithmetic" k1=".5" k2=".5" k3=".5" k4=".5"/>
+ </filter>
+
+ <filter id="arithmetic-sRGB" x="0" y="0" width="1" height="1">
+ <feImage xlink:href="#Blue100" result="blue"/>
+ <feImage xlink:href="#Red100" result="red"/>
+ <feComposite in2="blue" in="red" operator="arithmetic" k1=".5" k2=".5" k3=".5" k4=".5" color-interpolation-filters="sRGB"/>
+ </filter>
+ </defs>
+ <g font-family="Verdana" font-size="60" shape-rendering="crispEdges" transform="translate(5,70) scale(.4)">
+ <rect fill="none" stroke="blue" x="1" y="1" width="1098" height="723"/>
+ <text x="100" y="75">First row: linearRGB</text>
+ <text x="100" y="180">Second row: sRGB</text>
+
+ <g transform="translate(555,230)">
+ <rect x="0" y="0" width="150" height="150" filter="url(#atop-50)"/>
+ </g>
+ <g transform="translate(555,430)">
+ <rect x="0" y="0" width="150" height="150" filter="url(#atop-50-sRGB)"/>
+ </g>
+ <g transform="translate(735,230)">
+ <!-- The property should not apply here (it's applied to filter primitives). -->
+ <rect x="0" y="0" width="150" height="150" filter="url(#arithmetic)" color-interpolation-filters="sRGB"/>
+ </g>
+ <g transform="translate(735,430)">
+ <rect x="0" y="0" width="150" height="150" filter="url(#arithmetic-sRGB-inherited)"/>
+ </g>
+ <g transform="translate(915,230)">
+ <rect x="0" y="0" width="150" height="150" filter="url(#arithmetic)"/>
+ </g>
+ <g transform="translate(915,430)">
+ <rect x="0" y="0" width="150" height="150" filter="url(#arithmetic-sRGB)"/>
+ </g>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/include-compressed-ref.png b/rsvg/tests/fixtures/reftests/include-compressed-ref.png
new file mode 100644
index 00000000..8aa2a9e1
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/include-compressed-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/include-compressed.svg b/rsvg/tests/fixtures/reftests/include-compressed.svg
new file mode 100644
index 00000000..365d3fcb
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/include-compressed.svg
@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="10" height="10">
+ <use xlink:href="gzip-compressed.svg#a" width="10" height="10" />
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/include-fallback-ref.png b/rsvg/tests/fixtures/reftests/include-fallback-ref.png
new file mode 100644
index 00000000..5f33f768
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/include-fallback-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/include-fallback.svg b/rsvg/tests/fixtures/reftests/include-fallback.svg
new file mode 100644
index 00000000..a5e43594
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/include-fallback.svg
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ width="320" height="240">
+ <text font-family="sans" x="10" y="100">
+ <xi:include href="nonexistent.txt" parse="text" encoding="UTF-8">
+ <xi:fallback>Hello fallback!</xi:fallback>
+ </xi:include>
+ </text>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/include-text-ref.png b/rsvg/tests/fixtures/reftests/include-text-ref.png
new file mode 100644
index 00000000..24d71b2a
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/include-text-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/include-text.svg b/rsvg/tests/fixtures/reftests/include-text.svg
new file mode 100644
index 00000000..b966cd73
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/include-text.svg
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ width="320" height="240">
+ <text font-family="sans" x="10" y="100"><xi:include href="text.txt" parse="text" encoding="UTF-8"/></text>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/rtl-tspan-ref.png b/rsvg/tests/fixtures/reftests/rtl-tspan-ref.png
new file mode 100644
index 00000000..aa425a70
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/rtl-tspan-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/rtl-tspan.svg b/rsvg/tests/fixtures/reftests/rtl-tspan.svg
new file mode 100644
index 00000000..510d6391
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/rtl-tspan.svg
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xml:lang="fa" direction="rtl" width="300" height="100">
+ <line x1="50%" y1="0" x2="50%" y2="100%" stroke-width="2" stroke="blue"/>
+ <g font-family="Dana-FaNum" font-size="16" fill="black">
+ <text x="50%" y="30" text-anchor="start"><tspan font-weight="bold">نام: </tspan><tspan>مهدی </tspan></text>
+ <text x="50%" y="60" text-anchor="middle"><tspan font-weight="bold">نام: </tspan><tspan>مهدی </tspan></text>
+ <text x="50%" y="90" text-anchor="end"><tspan font-weight="bold">نام: </tspan><tspan>مهدی </tspan></text>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/specificity-ref.png b/rsvg/tests/fixtures/reftests/specificity-ref.png
new file mode 100644
index 00000000..c7119981
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/specificity-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/specificity.svg b/rsvg/tests/fixtures/reftests/specificity.svg
new file mode 100644
index 00000000..c9623ce2
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/specificity.svg
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="32" height="16">
+ <!-- We have two stylesheets - test that they are both considered.
+ Also, test, that specificity and ordering are handled by having
+ multiple rules that match each element.
+ -->
+ <style type="text/css">
+ .foo {
+ fill: limegreen;
+ }
+ .bar {
+ fill: red;
+ }
+ </style>
+ <rect x="0" y="0" width="16" height="16" class="foo"/>
+ <rect x="16" y="0" width="16" height="16" class="bar"/>
+ <style type="text/css">
+ rect {
+ fill: red;
+ }
+ .bar {
+ fill: limegreen;
+ }
+ </style>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/structural-pseudo-classes-ref.png b/rsvg/tests/fixtures/reftests/structural-pseudo-classes-ref.png
new file mode 100644
index 00000000..f3e59551
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/structural-pseudo-classes-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/structural-pseudo-classes.svg b/rsvg/tests/fixtures/reftests/structural-pseudo-classes.svg
new file mode 100644
index 00000000..c9494098
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/structural-pseudo-classes.svg
@@ -0,0 +1,59 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="50" height="50">
+ <style type="text/css">
+ g {
+ display: none;
+ }
+ svg:root g {
+ display: block;
+ }
+ rect {
+ display: none;
+ fill: red;
+ }
+ svg rect {
+ fill: red;
+ }
+ svg rect:not(:last-child) {
+ fill: red;
+ }
+ svg rect:last-child {
+ fill: black;
+ }
+ g path {
+ stroke: red;
+ }
+ g:only-of-type path:nth-child(2n+1) {
+ stroke: black;
+ }
+ svg:not(.missing-class) g > rect {
+ display: block;
+ }
+ circle:first-of-type:not(.evil-class) {
+ fill: yellow;
+ stroke: black;
+ stroke-width: 1px;
+ }
+ line {
+ stroke: red;
+ }
+ line:not(:root) {
+ stroke: black;
+ }
+ line:last-of-type {
+ stroke: blue;
+ stroke-width: 1px;
+ }
+ svg > path:empty {
+ stroke: blue;
+ stroke-width: 1px;
+ }
+ </style>
+ <circle class="present-class" cx="25" cy="25" r="25"/>
+ <g>
+ <path d="M 9,30 L 18,35"/>
+ <rect x="18" y="35" width="15" height="1"/>
+ </g>
+ <line x1="33" x2="42" y1="35" y2="30"/>
+ <line x1="18" x2="18" y1="9" y2="20"/>
+ <path d="M 32,9 L 32,20"/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/style-with-xml-comments-ref.png b/rsvg/tests/fixtures/reftests/style-with-xml-comments-ref.png
new file mode 100644
index 00000000..8aa2a9e1
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/style-with-xml-comments-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/style-with-xml-comments.svg b/rsvg/tests/fixtures/reftests/style-with-xml-comments.svg
new file mode 100644
index 00000000..6812f880
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/style-with-xml-comments.svg
@@ -0,0 +1,10 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="10px" height="10px">
+ <defs>
+ <style type="text/css">
+ rect {
+ fill: <!-- yellow --> red;
+ }
+ </style>
+ </defs>
+ <rect width="10" height="10"/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/coords-trans-01-b-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/coords-trans-01-b-ref.png
new file mode 100644
index 00000000..2e6a8ff9
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/coords-trans-01-b-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/coords-trans-01-b.svg b/rsvg/tests/fixtures/reftests/svg1.1/coords-trans-01-b.svg
new file mode 100644
index 00000000..19431e0f
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/coords-trans-01-b.svg
@@ -0,0 +1,239 @@
+<svg version="1.1" baseProfile="basic" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="SVGWG" author="Vincent Hardy" status="accepted"
+ version="$Revision: 1.6 $" testname="$RCSfile: coords-trans-01-b.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/coords.html#EstablishingANewUserSpace">
+ <p>
+ This test verifies the implementation of transforms. It tests elementary transforms
+ and transform nesting.
+ Note that for layout purposes, this test uses nesting of translation with the elementary transforms.
+ </p>
+ <p>
+ The test uses the rect element, the fill color (solid primary colors) and transforms.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The rendered picture should match the reference image exactly except for variations in the labeling text.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: coords-trans-01-b.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <g transform="translate(0, 30)" font-size="13">
+ <!-- ====================================================================== -->
+ <!-- First, draw a test grid ============================================== -->
+ <!-- ====================================================================== -->
+ <g id="test-grid" stroke="#cccccc" stroke-width="1">
+ <line x1="10" y1="10.5" x2="470" y2="10.5"/>
+ <line x1="10" y1="20.5" x2="470" y2="20.5"/>
+ <line x1="10" y1="30.5" x2="470" y2="30.5"/>
+ <line x1="10" y1="40.5" x2="470" y2="40.5"/>
+ <line x1="10" y1="50.5" x2="470" y2="50.5"/>
+ <line x1="10" y1="60.5" x2="470" y2="60.5"/>
+ <line x1="10" y1="70.5" x2="470" y2="70.5"/>
+ <line x1="10" y1="80.5" x2="470" y2="80.5"/>
+ <line x1="10" y1="90.5" x2="470" y2="90.5"/>
+ <line x1="10" y1="100.5" x2="470" y2="100.5"/>
+ <line x1="10" y1="110.5" x2="470" y2="110.5"/>
+ <line x1="10" y1="120.5" x2="470" y2="120.5"/>
+ <line x1="10" y1="130.5" x2="470" y2="130.5"/>
+ <line x1="10" y1="140.5" x2="470" y2="140.5"/>
+ <line x1="10" y1="150.5" x2="470" y2="150.5"/>
+ <line x1="10" y1="160.5" x2="470" y2="160.5"/>
+ <line x1="10" y1="170.5" x2="470" y2="170.5"/>
+ <line x1="10" y1="180.5" x2="470" y2="180.5"/>
+ <line x1="10" y1="190.5" x2="470" y2="190.5"/>
+ <line x1="10" y1="200.5" x2="470" y2="200.5"/>
+ <line x1="10" y1="210.5" x2="470" y2="210.5"/>
+ <line x1="10" y1="220.5" x2="470" y2="220.5"/>
+ <line x1="10" y1="230.5" x2="470" y2="230.5"/>
+ <line x1="10" y1="240.5" x2="470" y2="240.5"/>
+ <line x1="10" y1="250.5" x2="470" y2="250.5"/>
+ <line x1="10" y1="260.5" x2="470" y2="260.5"/>
+ <line y1="10" x1="10.5" y2="260.5" x2="10.5"/>
+ <line y1="10" x1="20.5" y2="260.5" x2="20.5"/>
+ <line y1="10" x1="30.5" y2="260.5" x2="30.5"/>
+ <line y1="10" x1="40.5" y2="260.5" x2="40.5"/>
+ <line y1="10" x1="50.5" y2="260.5" x2="50.5"/>
+ <line y1="10" x1="60.5" y2="260.5" x2="60.5"/>
+ <line y1="10" x1="70.5" y2="260.5" x2="70.5"/>
+ <line y1="10" x1="80.5" y2="260.5" x2="80.5"/>
+ <line y1="10" x1="90.5" y2="260.5" x2="90.5"/>
+ <line y1="10" x1="100.5" y2="260.5" x2="100.5"/>
+ <line y1="10" x1="110.5" y2="260.5" x2="110.5"/>
+ <line y1="10" x1="120.5" y2="260.5" x2="120.5"/>
+ <line y1="10" x1="130.5" y2="260.5" x2="130.5"/>
+ <line y1="10" x1="140.5" y2="260.5" x2="140.5"/>
+ <line y1="10" x1="150.5" y2="260.5" x2="150.5"/>
+ <line y1="10" x1="160.5" y2="260.5" x2="160.5"/>
+ <line y1="10" x1="170.5" y2="260.5" x2="170.5"/>
+ <line y1="10" x1="180.5" y2="260.5" x2="180.5"/>
+ <line y1="10" x1="190.5" y2="260.5" x2="190.5"/>
+ <line y1="10" x1="200.5" y2="260.5" x2="200.5"/>
+ <line y1="10" x1="210.5" y2="260.5" x2="210.5"/>
+ <line y1="10" x1="220.5" y2="260.5" x2="220.5"/>
+ <line y1="10" x1="230.5" y2="260.5" x2="230.5"/>
+ <line y1="10" x1="240.5" y2="260.5" x2="240.5"/>
+ <line y1="10" x1="250.5" y2="260.5" x2="250.5"/>
+ <line y1="10" x1="260.5" y2="260.5" x2="260.5"/>
+ <line y1="10" x1="270.5" y2="260.5" x2="270.5"/>
+ <line y1="10" x1="280.5" y2="260.5" x2="280.5"/>
+ <line y1="10" x1="290.5" y2="260.5" x2="290.5"/>
+ <line y1="10" x1="300.5" y2="260.5" x2="300.5"/>
+ <line y1="10" x1="310.5" y2="260.5" x2="310.5"/>
+ <line y1="10" x1="320.5" y2="260.5" x2="320.5"/>
+ <line y1="10" x1="330.5" y2="260.5" x2="330.5"/>
+ <line y1="10" x1="340.5" y2="260.5" x2="340.5"/>
+ <line y1="10" x1="350.5" y2="260.5" x2="350.5"/>
+ <line y1="10" x1="360.5" y2="260.5" x2="360.5"/>
+ <line y1="10" x1="370.5" y2="260.5" x2="370.5"/>
+ <line y1="10" x1="380.5" y2="260.5" x2="380.5"/>
+ <line y1="10" x1="390.5" y2="260.5" x2="390.5"/>
+ <line y1="10" x1="400.5" y2="260.5" x2="400.5"/>
+ <line y1="10" x1="410.5" y2="260.5" x2="410.5"/>
+ <line y1="10" x1="420.5" y2="260.5" x2="420.5"/>
+ <line y1="10" x1="430.5" y2="260.5" x2="430.5"/>
+ <line y1="10" x1="440.5" y2="260.5" x2="440.5"/>
+ <line y1="10" x1="450.5" y2="260.5" x2="450.5"/>
+ <line y1="10" x1="460.5" y2="260.5" x2="460.5"/>
+ <line y1="10" x1="470.5" y2="260.5" x2="470.5"/>
+ </g>
+ <!-- ====================================================================== -->
+ <!-- Now, test elementary transforms. For each transform, 3 markers are -->
+ <!-- placed where the user space is expected after transformations for the -->
+ <!-- origin (black) and the points in (20, 0) (blue) and (0, 20) (red). -->
+ <!-- Then, a blue line going from (0, 0) to (20, 0) is drawn and a red line -->
+ <!-- going from (0, 0) to (0, 20), after applying the elementary -->
+ <!-- transformation. If the test succeeds, the red line should join the -->
+ <!-- black marker to the red marker and the blue line the black marker to -->
+ <!-- the blue marker. -->
+ <!-- ====================================================================== -->
+ <g id="elementary-transforms-test" transform="translate(0, 10)">
+ <g id="elementary-transforms">
+ <!-- Translate -->
+ <g transform="translate(50, 50)">
+ <rect x="0" y="0" width="20" height="2" fill="blue"/>
+ <rect x="0" y="0" width="2" height="20" fill="red"/>
+ </g>
+ <!-- Rotate -90 deg about (150, 70) -->
+ <g transform="translate(150, 70) rotate(-90)">
+ <rect x="0" y="0" width="20" height="2" fill="blue"/>
+ <rect x="0" y="0" width="2" height="20" fill="red"/>
+ </g>
+ <!-- Skew X -->
+ <g transform="translate(250, 50) skewX(45)">
+ <rect x="0" y="0" width="20" height="2" fill="blue"/>
+ <rect x="0" y="0" width="2" height="20" fill="red"/>
+ </g>
+ <!-- Skew Y -->
+ <g transform="translate(350, 50) skewY(45)">
+ <rect x="0" y="0" width="20" height="2" fill="blue"/>
+ <rect x="0" y="0" width="2" height="20" fill="red"/>
+ </g>
+ <!-- Scale 2 -->
+ <g transform="translate(210, 120) scale(2)">
+ <rect x="0" y="0" width="20" height="1" fill="blue"/>
+ <rect x="0" y="0" width="1" height="20" fill="red"/>
+ </g>
+ </g>
+ <!-- elementary-transforms -->
+ <!-- Draw all the markers -->
+ <g id="elementary-transforms-test-markers">
+ <!-- Translate -->
+ <text x="40" y="40">translate (50, 50)</text>
+ <rect x="48" y="48" width="5" height="5" fill="black"/>
+ <rect x="68" y="48" width="5" height="5" fill="blue"/>
+ <rect x="48" y="68" width="5" height="5" fill="red"/>
+ <!-- Rotate -90 deg about (150, 70) -->
+ <text x="140" y="40">rotate(-90)</text>
+ <rect x="148" y="68" width="5" height="5" fill="black"/>
+ <rect x="148" y="48" width="5" height="5" fill="blue"/>
+ <rect x="168" y="68" width="5" height="5" fill="red"/>
+ <!-- Skew X -->
+ <text x="240" y="40">skew x (45)</text>
+ <rect x="248" y="48" width="5" height="5" fill="black"/>
+ <rect x="268" y="48" width="5" height="5" fill="blue"/>
+ <rect x="268" y="68" width="5" height="5" fill="red"/>
+ <!-- Skew Y -->
+ <text x="340" y="40">skew y (45)</text>
+ <rect x="348" y="48" width="5" height="5" fill="black"/>
+ <rect x="368" y="68" width="5" height="5" fill="blue"/>
+ <rect x="348" y="68" width="5" height="5" fill="red"/>
+ <!-- Scale 2 -->
+ <text x="200" y="110">scale (2)</text>
+ <rect x="208" y="118" width="5" height="5" fill="black"/>
+ <rect x="248" y="118" width="5" height="5" fill="blue"/>
+ <rect x="208" y="158" width="5" height="5" fill="red"/>
+ </g>
+ <!-- elementary-transforms-test-markers -->
+ </g>
+ <g id="nested-transforms-test">
+ <g id="nested-transforms">
+ <!-- scale/translate in transform attribute -->
+ <g transform="scale(3, 2) translate(16.666667, 105)">
+ <rect x="0" y="0" width="20" height="1" fill="blue"/>
+ <rect x="0" y="0" width="0.67" height="20" fill="red"/>
+ </g>
+ <!-- scale/translate in successive elements -->
+ <g transform="translate(200, 0)">
+ <g transform="scale(3, 2)">
+ <g transform="translate(16.666667, 105)">
+ <rect x="0" y="0" width="20" height="1" fill="blue"/>
+ <rect x="0" y="0" width="0.67" height="20" fill="red"/>
+ </g>
+ </g>
+ </g>
+ </g>
+ <!-- nested-transforms -->
+ <g id="nested-transforms-test-markers">
+ <!-- scale and translate -->
+ <text x="40" y="200">scale(25, 95) and translate(2, 2)</text>
+ <rect x="48" y="208" width="5" height="5" fill="black"/>
+ <rect x="108" y="208" width="5" height="5" fill="blue"/>
+ <rect x="48" y="248" width="5" height="5" fill="red"/>
+ <!-- scale then translate -->
+ <text x="240" y="200">scale(25, 95) then translate(2, 2)</text>
+ <rect x="248" y="208" width="5" height="5" fill="black"/>
+ <rect x="308" y="208" width="5" height="5" fill="blue"/>
+ <rect x="248" y="248" width="5" height="5" fill="red"/>
+ </g>
+ <!-- nested-transforms-test-markers -->
+ </g>
+ <!-- nested-transforms test -->
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.6 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/coords-trans-02-t-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/coords-trans-02-t-ref.png
new file mode 100644
index 00000000..4f6f12df
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/coords-trans-02-t-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/coords-trans-02-t.svg b/rsvg/tests/fixtures/reftests/svg1.1/coords-trans-02-t.svg
new file mode 100644
index 00000000..ef3ab1a8
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/coords-trans-02-t.svg
@@ -0,0 +1,176 @@
+<svg version="1.1" baseProfile="tiny" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="SVGWG" author="Vincent Hardy" status="accepted"
+ version="$Revision: 1.6 $" testname="$RCSfile: coords-trans-02-t.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/coords.html#EstablishingANewUserSpace">
+ <p>
+ This test verifies the implementation of transforms. It tests elementary transforms
+ and transform nesting.
+ Note that for layout purposes, this test uses nesting of translation with the elementary transforms.
+ </p>
+ <p>
+ The test uses the rect element, the fill color (solid primary colors) and transforms.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The rendered picture should match the reference image exactly except for variations in the labeling text.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: coords-trans-02-t.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <g transform="translate(0, 30)" font-size="12">
+ <!-- ====================================================================== -->
+ <!-- First, draw a test grid ============================================== -->
+ <!-- ====================================================================== -->
+ <!--g id="test-grid" stroke="#cccccc" stroke-width="1" >
+ <line x1="10" y1="10.5" x2="470" y2="10.5"/>
+ <line x1="10" y1="20.5" x2="470" y2="20.5"/>
+ <line x1="10" y1="30.5" x2="470" y2="30.5"/>
+ <line x1="10" y1="40.5" x2="470" y2="40.5"/>
+ <line x1="10" y1="50.5" x2="470" y2="50.5"/>
+ <line x1="10" y1="60.5" x2="470" y2="60.5"/>
+ <line x1="10" y1="70.5" x2="470" y2="70.5"/>
+ <line x1="10" y1="80.5" x2="470" y2="80.5"/>
+ <line x1="10" y1="90.5" x2="470" y2="90.5"/>
+ <line x1="10" y1="100.5" x2="470" y2="100.5"/>
+ <line x1="10" y1="110.5" x2="470" y2="110.5"/>
+ <line x1="10" y1="120.5" x2="470" y2="120.5"/>
+ <line x1="10" y1="130.5" x2="470" y2="130.5"/>
+ <line x1="10" y1="140.5" x2="470" y2="140.5"/>
+ <line x1="10" y1="150.5" x2="470" y2="150.5"/>
+ <line x1="10" y1="160.5" x2="470" y2="160.5"/>
+ <line x1="10" y1="170.5" x2="470" y2="170.5"/>
+ <line x1="10" y1="180.5" x2="470" y2="180.5"/>
+ <line x1="10" y1="190.5" x2="470" y2="190.5"/>
+ <line x1="10" y1="200.5" x2="470" y2="200.5"/>
+ <line x1="10" y1="210.5" x2="470" y2="210.5"/>
+ <line x1="10" y1="220.5" x2="470" y2="220.5"/>
+ <line x1="10" y1="230.5" x2="470" y2="230.5"/>
+ <line x1="10" y1="240.5" x2="470" y2="240.5"/>
+ <line x1="10" y1="250.5" x2="470" y2="250.5"/>
+ <line x1="10" y1="260.5" x2="470" y2="260.5"/>
+ <line y1="10" x1="10.5" y2="260.5" x2="10.5"/>
+ <line y1="10" x1="20.5" y2="260.5" x2="20.5"/>
+ <line y1="10" x1="30.5" y2="260.5" x2="30.5"/>
+ <line y1="10" x1="40.5" y2="260.5" x2="40.5"/>
+ <line y1="10" x1="50.5" y2="260.5" x2="50.5"/>
+ <line y1="10" x1="60.5" y2="260.5" x2="60.5"/>
+ <line y1="10" x1="70.5" y2="260.5" x2="70.5"/>
+ <line y1="10" x1="80.5" y2="260.5" x2="80.5"/>
+ <line y1="10" x1="90.5" y2="260.5" x2="90.5"/>
+ <line y1="10" x1="100.5" y2="260.5" x2="100.5"/>
+ <line y1="10" x1="110.5" y2="260.5" x2="110.5"/>
+ <line y1="10" x1="120.5" y2="260.5" x2="120.5"/>
+ <line y1="10" x1="130.5" y2="260.5" x2="130.5"/>
+ <line y1="10" x1="140.5" y2="260.5" x2="140.5"/>
+ <line y1="10" x1="150.5" y2="260.5" x2="150.5"/>
+ <line y1="10" x1="160.5" y2="260.5" x2="160.5"/>
+ <line y1="10" x1="170.5" y2="260.5" x2="170.5"/>
+ <line y1="10" x1="180.5" y2="260.5" x2="180.5"/>
+ <line y1="10" x1="190.5" y2="260.5" x2="190.5"/>
+ <line y1="10" x1="200.5" y2="260.5" x2="200.5"/>
+ <line y1="10" x1="210.5" y2="260.5" x2="210.5"/>
+ <line y1="10" x1="220.5" y2="260.5" x2="220.5"/>
+ <line y1="10" x1="230.5" y2="260.5" x2="230.5"/>
+ <line y1="10" x1="240.5" y2="260.5" x2="240.5"/>
+ <line y1="10" x1="250.5" y2="260.5" x2="250.5"/>
+ <line y1="10" x1="260.5" y2="260.5" x2="260.5"/>
+ <line y1="10" x1="270.5" y2="260.5" x2="270.5"/>
+ <line y1="10" x1="280.5" y2="260.5" x2="280.5"/>
+ <line y1="10" x1="290.5" y2="260.5" x2="290.5"/>
+ <line y1="10" x1="300.5" y2="260.5" x2="300.5"/>
+ <line y1="10" x1="310.5" y2="260.5" x2="310.5"/>
+ <line y1="10" x1="320.5" y2="260.5" x2="320.5"/>
+ <line y1="10" x1="330.5" y2="260.5" x2="330.5"/>
+ <line y1="10" x1="340.5" y2="260.5" x2="340.5"/>
+ <line y1="10" x1="350.5" y2="260.5" x2="350.5"/>
+ <line y1="10" x1="360.5" y2="260.5" x2="360.5"/>
+ <line y1="10" x1="370.5" y2="260.5" x2="370.5"/>
+ <line y1="10" x1="380.5" y2="260.5" x2="380.5"/>
+ <line y1="10" x1="390.5" y2="260.5" x2="390.5"/>
+ <line y1="10" x1="400.5" y2="260.5" x2="400.5"/>
+ <line y1="10" x1="410.5" y2="260.5" x2="410.5"/>
+ <line y1="10" x1="420.5" y2="260.5" x2="420.5"/>
+ <line y1="10" x1="430.5" y2="260.5" x2="430.5"/>
+ <line y1="10" x1="440.5" y2="260.5" x2="440.5"/>
+ <line y1="10" x1="450.5" y2="260.5" x2="450.5"/>
+ <line y1="10" x1="460.5" y2="260.5" x2="460.5"/>
+ <line y1="10" x1="470.5" y2="260.5" x2="470.5"/>
+ </g-->
+ <!-- ====================================================================== -->
+ <!-- Now, test elementary transforms. For each transform, 3 markers are -->
+ <!-- placed where the user space is expected after transformations for the -->
+ <!-- origin (black) and the points in (20, 0) (blue) and (0, 20) (red). -->
+ <!-- Then, a blue line going from (0, 0) to (20, 0) is drawn and a red line -->
+ <!-- going from (0, 0) to (0, 20), after applying the elementary -->
+ <!-- transformation. If the test succeeds, the red line should join the -->
+ <!-- black marker to the red marker and the blue line the black marker to -->
+ <!-- the blue marker. -->
+ <!-- ====================================================================== -->
+ <g id="elementary-transforms-test" transform="translate(0, 10)">
+ <g id="elementary-transforms" transform="translate(-30, 0) scale(2.5, 2.5)">
+ <!-- Translate -->
+ <g transform="translate(50, 50)">
+ <rect x="0" y="0" width="20" height="2" fill="blue"/>
+ <rect x="0" y="0" width="2" height="20" fill="red"/>
+ </g>
+ <!-- Rotate -90 deg about (150, 70) -->
+ <g transform="translate(150, 70) rotate(-90)">
+ <rect x="0" y="0" width="20" height="2" fill="blue"/>
+ <rect x="0" y="0" width="2" height="20" fill="red"/>
+ </g>
+ </g>
+ <!-- elementary-transforms -->
+ <!-- Draw all the markers -->
+ <g id="elementary-transforms-test-markers" transform="translate(-30, 0) scale(2.5, 2.5)">
+ <!-- Translate -->
+ <text x="40" y="40">translate (50, 50)</text>
+ <rect x="48" y="48" width="5" height="5" fill="black"/>
+ <rect x="68" y="48" width="5" height="5" fill="blue"/>
+ <rect x="48" y="68" width="5" height="5" fill="red"/>
+ <!-- Rotate -90 deg about (150, 70) -->
+ <text x="140" y="40">rotate(-90)</text>
+ <rect x="148" y="68" width="5" height="5" fill="black"/>
+ <rect x="148" y="48" width="5" height="5" fill="blue"/>
+ <rect x="168" y="68" width="5" height="5" fill="red"/>
+ </g>
+ <!-- elementary-transforms-test-markers -->
+ </g>
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.6 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/coords-trans-03-t-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/coords-trans-03-t-ref.png
new file mode 100644
index 00000000..3783f54d
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/coords-trans-03-t-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/coords-trans-03-t.svg b/rsvg/tests/fixtures/reftests/svg1.1/coords-trans-03-t.svg
new file mode 100644
index 00000000..b1c507c9
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/coords-trans-03-t.svg
@@ -0,0 +1,99 @@
+<svg version="1.1" baseProfile="tiny" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="SVGWG" author="Vincent Hardy" status="accepted"
+ version="$Revision: 1.6 $" testname="$RCSfile: coords-trans-03-t.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/coords.html#EstablishingANewUserSpace">
+ <p>
+ This test verifies the implementation of transforms. It tests elementary transforms
+ and transform nesting.
+ Note that for layout purposes, this test uses nesting of translation with the elementary transforms.
+ </p>
+ <p>
+ The test uses the rect element, the fill color (solid primary colors) and transforms.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The rendered picture should match the reference image exactly except for variations in the labeling text.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: coords-trans-03-t.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <g transform="translate(0, 30)" font-size="12">
+ <!-- ====================================================================== -->
+ <!-- Now, test elementary transforms. For each transform, 3 markers are -->
+ <!-- placed where the user space is expected after transformations for the -->
+ <!-- origin (black) and the points in (20, 0) (blue) and (0, 20) (red). -->
+ <!-- Then, a blue line going from (0, 0) to (20, 0) is drawn and a red line -->
+ <!-- going from (0, 0) to (0, 20), after applying the elementary -->
+ <!-- transformation. If the test succeeds, the red line should join the -->
+ <!-- black marker to the red marker and the blue line the black marker to -->
+ <!-- the blue marker. -->
+ <!-- ====================================================================== -->
+ <g id="elementary-transforms-test" transform="translate(0, 10)">
+ <g id="elementary-transforms" transform="translate(-560, 0) scale(2.5, 2.5)">
+ <!-- Skew X -->
+ <g transform="translate(250, 50) skewX(45)">
+ <rect x="0" y="0" width="20" height="2" fill="blue"/>
+ <rect x="0" y="0" width="2" height="20" fill="red"/>
+ </g>
+ <!-- Skew Y -->
+ <g transform="translate(350, 50) skewY(45)">
+ <rect x="0" y="0" width="20" height="2" fill="blue"/>
+ <rect x="0" y="0" width="2" height="20" fill="red"/>
+ </g>
+ </g>
+ <!-- elementary-transforms -->
+ <!-- Draw all the markers -->
+ <g id="elementary-transforms-test-markers" transform="translate(-560, 0) scale(2.5, 2.5)">
+ <!-- Skew X -->
+ <text x="240" y="40">skew x (45)</text>
+ <rect x="248" y="48" width="5" height="5" fill="black"/>
+ <rect x="268" y="48" width="5" height="5" fill="blue"/>
+ <rect x="268" y="68" width="5" height="5" fill="red"/>
+ <!-- Skew Y -->
+ <text x="340" y="40">skew y (45)</text>
+ <rect x="348" y="48" width="5" height="5" fill="black"/>
+ <rect x="368" y="68" width="5" height="5" fill="blue"/>
+ <rect x="348" y="68" width="5" height="5" fill="red"/>
+ </g>
+ <!-- elementary-transforms-test-markers -->
+ </g>
+ <!-- nested-transforms test -->
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.6 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/coords-trans-04-t-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/coords-trans-04-t-ref.png
new file mode 100644
index 00000000..7407a96a
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/coords-trans-04-t-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/coords-trans-04-t.svg b/rsvg/tests/fixtures/reftests/svg1.1/coords-trans-04-t.svg
new file mode 100644
index 00000000..3ca36308
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/coords-trans-04-t.svg
@@ -0,0 +1,88 @@
+<svg version="1.1" baseProfile="tiny" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="SVGWG" author="Vincent Hardy" status="accepted"
+ version="$Revision: 1.6 $" testname="$RCSfile: coords-trans-04-t.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/coords.html#EstablishingANewUserSpace">
+ <p>
+ This test verifies the implementation of transforms. It tests elementary transforms
+ and transform nesting.
+ Note that for layout purposes, this test uses nesting of translation with the elementary transforms.
+ </p>
+ <p>
+ The test uses the rect element, the fill color (solid primary colors) and transforms.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The rendered picture should match the reference image exactly except for variations in the labeling text.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: coords-trans-04-t.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <g transform="translate(0, 30)" font-size="12">
+ <!-- ====================================================================== -->
+ <!-- Now, test elementary transforms. For each transform, 3 markers are -->
+ <!-- placed where the user space is expected after transformations for the -->
+ <!-- origin (black) and the points in (20, 0) (blue) and (0, 20) (red). -->
+ <!-- Then, a blue line going from (0, 0) to (20, 0) is drawn and a red line -->
+ <!-- going from (0, 0) to (0, 20), after applying the elementary -->
+ <!-- transformation. If the test succeeds, the red line should join the -->
+ <!-- black marker to the red marker and the blue line the black marker to -->
+ <!-- the blue marker. -->
+ <!-- ====================================================================== -->
+ <g id="elementary-transforms-test">
+ <g id="elementary-transforms" transform="translate(60, 45) scale(2.5, 2.5)">
+ <!-- Scale 2 -->
+ <g transform="translate(40, 10) scale(2)">
+ <rect x="0" y="0" width="20" height="1" fill="blue"/>
+ <rect x="0" y="0" width="1" height="20" fill="red"/>
+ </g>
+ </g>
+ <!-- elementary-transforms -->
+ <!-- Draw all the markers -->
+ <g id="elementary-transforms-test-markers" transform="translate(-364, -230) scale(2.5, 2.5)">
+ <!-- Scale 2 -->
+ <text x="200" y="110">scale (2)</text>
+ <rect x="208" y="118" width="5" height="5" fill="black"/>
+ <rect x="248" y="118" width="5" height="5" fill="blue"/>
+ <rect x="208" y="158" width="5" height="5" fill="red"/>
+ </g>
+ <!-- elementary-transforms-test-markers -->
+ </g>
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.6 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/coords-trans-05-t-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/coords-trans-05-t-ref.png
new file mode 100644
index 00000000..0583aa03
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/coords-trans-05-t-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/coords-trans-05-t.svg b/rsvg/tests/fixtures/reftests/svg1.1/coords-trans-05-t.svg
new file mode 100644
index 00000000..d0d78bf4
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/coords-trans-05-t.svg
@@ -0,0 +1,88 @@
+<svg version="1.1" baseProfile="tiny" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="SVGWG" author="Vincent Hardy" status="accepted"
+ version="$Revision: 1.7 $" testname="$RCSfile: coords-trans-05-t.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/coords.html#EstablishingANewUserSpace">
+ <p>
+ This test verifies the implementation of transforms. It tests elementary transforms
+ and transform nesting.
+ Note that for layout purposes, this test uses nesting of translation with the elementary transforms.
+ </p>
+ <p>
+ The test uses the rect element, the fill color (solid primary colors) and transforms.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The rendered picture should match the reference image exactly except for variations in the labeling text.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: coords-trans-05-t.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <g transform="translate(0, 30)" font-size="12">
+ <!-- ====================================================================== -->
+ <!-- Now, test elementary transforms. For each transform, 3 markers are -->
+ <!-- placed where the user space is expected after transformations for the -->
+ <!-- origin (black) and the points in (20, 0) (blue) and (0, 20) (red). -->
+ <!-- Then, a blue line going from (0, 0) to (20, 0) is drawn and a red line -->
+ <!-- going from (0, 0) to (0, 20), after applying the elementary -->
+ <!-- transformation. If the test succeeds, the red line should join the -->
+ <!-- black marker to the red marker and the blue line the black marker to -->
+ <!-- the blue marker. -->
+ <!-- ====================================================================== -->
+ <g id="nested-transforms-test">
+ <g id="nested-transforms" transform="translate(-90, -450)">
+ <!-- scale/translate in transform attribute -->
+ <g transform="scale(7.5, 5) translate(16.666667, 105)">
+ <rect x="0" y="0" width="20" height="1" fill="blue"/>
+ <rect x="0" y="0" width="0.67" height="20" fill="red"/>
+ </g>
+ </g>
+ <!-- nested-transforms -->
+ <g id="nested-transforms-test-markers" transform="translate(-90, -450) scale(2.5, 2.5)">
+ <!-- scale and translate -->
+ <text x="40" y="200">scale(25, 95) - translate(2, 2)</text>
+ <rect x="48" y="208" width="5" height="5" fill="black"/>
+ <rect x="108" y="208" width="5" height="5" fill="blue"/>
+ <rect x="48" y="248" width="5" height="5" fill="red"/>
+ </g>
+ <!-- nested-transforms-test-markers -->
+ </g>
+ <!-- nested-transforms test -->
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.7 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/coords-trans-06-t-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/coords-trans-06-t-ref.png
new file mode 100644
index 00000000..11c6b394
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/coords-trans-06-t-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/coords-trans-06-t.svg b/rsvg/tests/fixtures/reftests/svg1.1/coords-trans-06-t.svg
new file mode 100644
index 00000000..9b845b23
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/coords-trans-06-t.svg
@@ -0,0 +1,82 @@
+<svg version="1.1" baseProfile="tiny" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="SVGWG" author="Vincent Hardy" status="accepted"
+ version="$Revision: 1.6 $" testname="$RCSfile: coords-trans-06-t.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/coords.html#EstablishingANewUserSpace">
+ <p>
+ This test verifies the implementation of transforms. It tests elementary transforms
+ and transform nesting.
+ Note that for layout purposes, this test uses nesting of translation with the elementary transforms.
+ </p>
+ <p>
+ The test uses the rect element, the fill color (solid primary colors) and transforms.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The rendered picture should match the reference image exactly except for variations in the labeling text.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: coords-trans-06-t.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <g transform="translate(0, 30)" font-size="12">
+ <g id="nested-transforms-test">
+ <g id="nested-transforms">
+ <!-- scale/translate in successive elements -->
+ <g transform="translate(-102, -450)">
+ <g transform="scale(7.5, 5)">
+ <g transform="translate(16.666667, 105)">
+ <rect x="0" y="0" width="20" height="1" fill="blue"/>
+ <rect x="0" y="0" width="0.67" height="20" fill="red"/>
+ </g>
+ </g>
+ </g>
+ </g>
+ <!-- nested-transforms -->
+ <g id="nested-transforms-test-markers" transform="translate(-600, -450) scale(2.5, 2.5)">
+ <!-- scale then translate -->
+ <text x="248" y="200">scale(25, 95) then translate(2, 2)</text>
+ <rect x="248" y="208" width="5" height="5" fill="black"/>
+ <rect x="308" y="208" width="5" height="5" fill="blue"/>
+ <rect x="248" y="248" width="5" height="5" fill="red"/>
+ </g>
+ <!-- nested-transforms-test-markers -->
+ </g>
+ <!-- nested-transforms test -->
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.6 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/coords-trans-07-t-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/coords-trans-07-t-ref.png
new file mode 100644
index 00000000..85acea05
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/coords-trans-07-t-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/coords-trans-07-t.svg b/rsvg/tests/fixtures/reftests/svg1.1/coords-trans-07-t.svg
new file mode 100644
index 00000000..f9cb6c44
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/coords-trans-07-t.svg
@@ -0,0 +1,70 @@
+<svg version="1.1" baseProfile="tiny" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="OA" author="CN" status="accepted"
+ version="$Revision: 1.6 $" testname="$RCSfile: coords-trans-07-t.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/coords.html#EstablishingANewUserSpace">
+ <p>
+ This test verifies the implementation of transforms. It tests elementary transforms
+ and transform nesting.
+ Note that for layout purposes, this test uses nesting of translation with the elementary transforms.
+ </p>
+ <p>
+ The test uses the rect element, the fill color (solid primary colors) and transforms.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The rendered picture should match the reference image exactly except for variations in the labeling text - a long blue line at four o'clock and a short red line at seven o'clock below the text "translate+rotate", and, below and to the left of that, a long green line at four o'clock and a short red line at seven o'clock below the text "rotate+translate".
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: coords-trans-07-t.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <g id="elementary-transforms-test">
+ <g id="object_1" transform="rotate(30) translate(200, 100)">
+ <rect x="0" y="0" width="150" height="5" fill="green"/>
+ <rect x="0" y="0" width="5" height="50" fill="red"/>
+ </g>
+ <text x="65" y="185" font-size="20">rotate+translate</text>
+
+ <g id="object_2" transform="translate(200,100) rotate(30)">
+ <rect x="0" y="0" width="150" height="5" fill="blue"/>
+ <rect x="0" y="0" width="5" height="50" fill="red"/>
+ </g>
+ <text x="150" y="100" font-size="20">translate+rotate</text>
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.6 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/coords-trans-08-t-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/coords-trans-08-t-ref.png
new file mode 100644
index 00000000..e315bd92
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/coords-trans-08-t-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/coords-trans-08-t.svg b/rsvg/tests/fixtures/reftests/svg1.1/coords-trans-08-t.svg
new file mode 100644
index 00000000..d1cbf594
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/coords-trans-08-t.svg
@@ -0,0 +1,76 @@
+<svg version="1.1" baseProfile="tiny" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="OA" author="CN" status="accepted"
+ version="$Revision: 1.6 $" testname="$RCSfile: coords-trans-08-t.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/coords.html#EstablishingANewUserSpace">
+ <p>
+ This test verifies the implementation of transforms. It tests elementary transforms
+ and transform nesting.
+ Note that for layout purposes, this test uses nesting of translation with the elementary transforms.
+ </p>
+ <p>
+ This test will check if the transfomations performed are carried out in the proper order. The result should differ depending on which transformation comes first.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The rendered picture should match the reference image exactly except for variations in the labeling text.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: coords-trans-08-t.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <g id="elementary-transforms-test">
+ <g id="object_1" transform="skewX(45) skewY(45)">
+ <rect x="0" y="0" width="150" height="5" fill="blue"/>
+ <rect x="0" y="0" width="5" height="50" fill="red"/>
+ <rect x="150" y="0" width="5" height="50" fill="black"/>
+ <rect x="0" y="50" width="150" height="5" fill="black"/>
+ <ellipse rx="40" ry="15" cx="75" cy="25" fill="purple"/>
+ </g>
+ <text x="30" y="16" font-size="12">skewX(45)+skewY(45)</text>
+
+ <g id="object_2" transform="translate(200,0) skewY(45) skewX(45)">
+ <rect x="0" y="0" width="150" height="5" fill="blue"/>
+ <rect x="0" y="0" width="5" height="50" fill="red"/>
+ <rect x="150" y="0" width="5" height="50" fill="black"/>
+ <rect x="0" y="50" width="150" height="5" fill="black"/>
+ <ellipse rx="40" ry="15" cx="75" cy="25" fill="purple"/>
+ </g>
+ <text x="230" y="16" font-size="12">skewY(45)+skewX(45)</text>
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.6 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/coords-trans-09-t-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/coords-trans-09-t-ref.png
new file mode 100644
index 00000000..ac21fe28
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/coords-trans-09-t-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/coords-trans-09-t.svg b/rsvg/tests/fixtures/reftests/svg1.1/coords-trans-09-t.svg
new file mode 100644
index 00000000..d37ef9cc
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/coords-trans-09-t.svg
@@ -0,0 +1,102 @@
+<svg version="1.1" baseProfile="tiny" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="OA" author="CN" status="accepted"
+ version="$Revision: 1.6 $" testname="$RCSfile: coords-trans-09-t.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/coords.html#EstablishingANewUserSpace">
+ <p>
+ This test verifies the implementation of transforms. It tests elementary transforms
+ and transform nesting.
+ Note that for layout purposes, this test uses nesting of translation with the elementary transforms.
+ </p>
+ <p>
+ This test will check if the various matrix operations work
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The rendered picture should match the reference image exactly except for variations in the labeling text.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: coords-trans-09-t.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <g id="elementary-transforms-test">
+
+ <g transform="matrix(0 0 0 0 0 0)">
+ <rect x="0" y="0" width="150" height="5" fill="blue"/>
+ <rect x="0" y="0" width="5" height="50" fill="red"/>
+ </g>
+ <text x="6" y="20" font-size="20">matrix(0 0 0 0 0 0)</text>
+
+ <g transform="matrix(1 0 0 1 100 100)">
+ <rect x="0" y="0" width="150" height="5" fill="blue"/>
+ <rect x="0" y="0" width="5" height="50" fill="red"/>
+ </g>
+ <text x="100" y="100" font-size="20">matrix(1 0 0 1 100 100)</text>
+
+ <g transform="matrix(1.5 0 0 1.5 70 60)">
+ <rect x="0" y="0" width="150" height="5" fill="blue"/>
+ <rect x="0" y="0" width="5" height="50" fill="red"/>
+ </g>
+ <text x="70" y="60" font-size="20">matrix(1.5 0 0 1.5 70 60)</text>
+
+ <g transform="matrix(1 0 0.5 1 30 170)">
+ <rect x="0" y="0" width="150" height="5" fill="blue"/>
+ <rect x="0" y="0" width="5" height="50" fill="red"/>
+ </g>
+ <text x="30" y="170" font-size="20">matrix(1 0 0.5 1 30 170)</text>
+
+ <g transform="matrix(1 0.5 0 1 100 200)">
+ <rect x="0" y="0" width="150" height="5" fill="blue"/>
+ <rect x="0" y="0" width="5" height="50" fill="red"/>
+ </g>
+ <text x="100" y="200" font-size="20">matrix(1 0.5 0 1 100 200)</text>
+
+ <g transform="matrix(0 1 -1 0 450 0)">
+ <rect x="0" y="0" width="150" height="5" fill="blue"/>
+ <rect x="0" y="0" width="5" height="50" fill="red"/>
+ </g>
+ <text x="275" y="30" font-size="20">matrix(0 1 -1 0 450 0)</text>
+
+ <g transform="matrix(1 0.8 0.8 1 300 220)">
+ <rect x="0" y="0" width="150" height="5" fill="blue"/>
+ <rect x="0" y="0" width="5" height="50" fill="red"/>
+ </g>
+ <text x="230" y="220" font-size="20">matrix(1 0.8 0.8 1 300 220)</text>
+
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.6 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/coords-viewattr-01-b-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/coords-viewattr-01-b-ref.png
new file mode 100644
index 00000000..ddecd445
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/coords-viewattr-01-b-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/coords-viewattr-01-b.svg b/rsvg/tests/fixtures/reftests/svg1.1/coords-viewattr-01-b.svg
new file mode 100644
index 00000000..05fbe99f
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/coords-viewattr-01-b.svg
@@ -0,0 +1,140 @@
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1 Basic//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-basic.dtd" [
+ <!ENTITY Smile "
+ <rect x='.5' y='.5' width='29' height='39' fill='black' stroke='orange' stroke-width='2'/>
+ <g transform='translate(0, 5)'>
+ <circle cx='15' cy='15' r='10' fill='yellow'/>
+ <circle cx='12' cy='12' r='1.5' fill='black'/>
+ <circle cx='17' cy='12' r='1.5' fill='black'/>
+ <path d='M 10 19 L 15 23 20 19' stroke='black' stroke-width='2'/>
+ </g>
+ ">
+ <!ENTITY Viewport1 "<rect x='.5' y='.5' width='49' height='29' fill='none' stroke='blue'/>">
+ <!ENTITY Viewport2 "<rect x='.5' y='.5' width='29' height='59' fill='none' stroke='blue'/>">
+]>
+<svg version="1.1" baseProfile="basic" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="SVGWG" author="Vincent Hardy" status="accepted"
+ version="$Revision: 1.8 $" testname="$RCSfile: coords-viewattr-01-b.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/coords.html#ViewBoxAttribute">
+ <p>
+ This test verifies the implementation of the viewBox and the
+ preserveAspectRatio attribute. This is a modified version of the sample
+ file included in the SVG specification. It exercises the various
+ preserveAspectRatio values and uses a general entity definition in order
+ to make reading of the SVG source easier.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Load the document in the user agent.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The rendered picture should match the reference image exactly except for
+ variations in the labeling text.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: coords-viewattr-01-b.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <g font-size="9" transform="translate(0, 30)">
+ <desc>Example PreserveAspectRatio - demonstrate available options</desc>
+ <text text-anchor="middle" x="240" font-size="16">Test available options of preserveAspectRatio</text>
+ <text x="35.5" y="30" text-anchor="middle">SVG to fit</text>
+ <g transform="translate(20,40)">&Smile;</g>
+ <text x="35.5" y="110" text-anchor="middle">Viewport 1</text>
+ <g transform="translate(10,120)">&Viewport1;</g>
+ <text x="35.5" y="180" text-anchor="middle">Viewport 2</text>
+ <g transform="translate(20,190)">&Viewport2;</g>
+ <g id="meet-group-1" transform="translate(120, 50)">
+ <text x="0" y="-20">---------- meet --------------------</text>
+ <g>
+ <text y="-5">xMin*</text>&Viewport1;
+ <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" preserveAspectRatio="xMinYMin meet" viewBox="0 0 30 40" width="50" height="30">&Smile;</svg>
+ </g>
+ <g transform="translate(70,0)">
+ <text y="-5">xMid*</text>&Viewport1;
+ <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" preserveAspectRatio="xMidYMid meet" viewBox="0 0 30 40" width="50" height="30">&Smile;</svg>
+ </g>
+ <g transform="translate(0,50)">
+ <text y="-5">xMax*</text>&Viewport1;
+ <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" preserveAspectRatio="xMaxYMax meet" viewBox="0 0 30 40" width="50" height="30">&Smile;</svg>
+ </g>
+ </g>
+ <g id="meet-group-2" transform="translate(300, 50)">
+ <text x="0" y="-20">---------- meet ------------------------</text>
+ <g>
+ <text y="-5">*YMin</text>&Viewport2;
+ <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" preserveAspectRatio="xMinYMin meet" viewBox="0 0 30 40" width="30" height="60">&Smile;</svg>
+ </g>
+ <g transform="translate(50, 0)">
+ <text y="-5">*YMid</text>&Viewport2;
+ <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" preserveAspectRatio="xMidYMid meet" viewBox="0 0 30 40" width="30" height="60">&Smile;</svg>
+ </g>
+ <g transform="translate(100, 0)">
+ <text y="-5">*YMax</text>&Viewport2;
+ <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" preserveAspectRatio="xMaxYMax meet" viewBox="0 0 30 40" width="30" height="60">&Smile;</svg>
+ </g>
+ </g>
+ <g id="slice-group-1" transform="translate(120, 185)">
+ <text x="0" y="-20">---------- slice -------------------------</text>
+ <g>
+ <text y="-5">xMin*</text>&Viewport2;
+ <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" preserveAspectRatio="xMinYMin slice" viewBox="0 0 30 40" width="30" height="60">&Smile;</svg>
+ </g>
+ <g transform="translate(50,0)">
+ <text y="-5">xMid*</text>&Viewport2;
+ <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" preserveAspectRatio="xMidYMid slice" viewBox="0 0 30 40" width="30" height="60">&Smile;</svg>
+ </g>
+ <g transform="translate(100,0)">
+ <text y="-5">xMax*</text>&Viewport2;
+ <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" preserveAspectRatio="xMaxYMax slice" viewBox="0 0 30 40" width="30" height="60">&Smile;</svg>
+ </g>
+ </g>
+ <g id="slide-group-2" transform="translate(300, 155) translate(0, 30)">
+ <text x="0" y="-20">---------- slice ---------------------</text>
+ <g>
+ <text y="-5">*YMin</text>&Viewport1;
+ <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" preserveAspectRatio="xMinYMin slice" viewBox="0 0 30 40" width="50" height="30">&Smile;</svg>
+ </g>
+ <g transform="translate(70,0)">
+ <text y="-5">*YMid</text>&Viewport1;
+ <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" preserveAspectRatio="xMidYMid slice" viewBox="0 0 30 40" width="50" height="30">&Smile;</svg>
+ </g>
+ <g transform="translate(0,50)">
+ <text y="-5">*YMax</text>&Viewport1;
+ <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" preserveAspectRatio="xMaxYMax slice" viewBox="0 0 30 40" width="50" height="30">&Smile;</svg>
+ </g>
+ </g>
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.8 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/coords-viewattr-02-b-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/coords-viewattr-02-b-ref.png
new file mode 100644
index 00000000..21faf2e5
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/coords-viewattr-02-b-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/coords-viewattr-02-b.svg b/rsvg/tests/fixtures/reftests/svg1.1/coords-viewattr-02-b.svg
new file mode 100644
index 00000000..77a0e197
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/coords-viewattr-02-b.svg
@@ -0,0 +1,716 @@
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1 Basic//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-basic.dtd" [
+ <!ENTITY Viewport1 "<rect x='.5' y='.5' width='49' height='29' fill='none' stroke='blue'/>">
+ <!ENTITY Viewport2 "<rect x='.5' y='.5' width='29' height='59' fill='none' stroke='blue'/>">
+]>
+<svg version="1.1" baseProfile="basic" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="SVGWG" author="Vincent Hardy" status="accepted"
+ version="$Revision: 1.9 $" testname="$RCSfile: coords-viewattr-02-b.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/coords.html#ViewBoxAttribute">
+ <p>
+ This test verifies the implementation of the preserveAspectRatio attribute on &lt;image&gt;
+ referencing raster content.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ This is a modified version of the sample file included in the SVG specification.
+ It exercises the various preserveAspectRatio values and uses a general entity definition
+ in order to make reading of the SVG source easier.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The rendered picture should match the reference image exactly except for variations in the labeling text.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: coords-viewattr-02-b.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <g font-size="9" transform="translate(0, 30)">
+ <desc>Example PreserveAspectRatio - demonstrate available options</desc>
+ <text text-anchor="middle" x="240" font-size="16">Test options of preserveAspectRatio on an image element</text>
+ <text x="40" y="30" text-anchor="middle">Raster to fit</text>
+ <g transform="translate(20,40)">
+ <image xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAAHgAA/+4ADkFkb2JlAGTAAAAAAf/b
+AIQAEAsLCwwLEAwMEBcPDQ8XGxQQEBQbHxcXFxcXHx4XGhoaGhceHiMlJyUjHi8vMzMvL0BAQEBA
+QEBAQEBAQEBAQAERDw8RExEVEhIVFBEUERQaFBYWFBomGhocGhomMCMeHh4eIzArLicnJy4rNTUw
+MDU1QEA/QEBAQEBAQEBAQEBA/8AAEQgAZABkAwEiAAIRAQMRAf/EAT8AAAEFAQEBAQEBAAAAAAAA
+AAMAAQIEBQYHCAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUD
+DDMBAAIRAwQhEjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1Rk
+RcKjdDYX0lXiZfKzhMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX
+5/cRAAICAQIEBAMEBQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1MV
+Y3M08SUGFqKygwcmNcLSRJNUoxdkRVU2dGXi8rOEw9N14/NGlKSFtJXE1OT0pbXF1eX1VmZ2hpam
+tsbW5vYnN0dXZ3eHl6e3x//aAAwDAQACEQMRAD8A8/SSR8LCyc/JZi4rDZdYYa0flPgAgSACSaA1
+JKkLWuc4NaC5x0AGpJXT9J+onUcwC3Od9jpOoYRutI/q/m/P7l1X1f8Aqth9HYLXgX5xHuuI0b5V
+g8fHlbixOa+LSsw5fQf5w7/QMscfdxcL6n9BwwP1cXvH5953/wDR+j+C1qsbHoEU1MqHgxob+RES
+WVPNlyG5zlP+8bXgAbBRAIgiR4Knk9G6TlgjIw6Xz32AO/zhBVxJNjOUTcZGJ8DSnk+pf4v8C4F/
+T7XY1nZj/fX/AOSH4rjOq9E6l0mzZmVFrSYZa33Vu+Dv4L19Qvx6Mmp1GRW22p4hzHCQQtDl/imf
+GQMh96Hj830P8VpgDto+KJLqPrR9UX9M3ZuCDZgzL2cupn8rfP71y63sObHmgJ4zYP2g9ixEEGip
+JJJSoXa1znBrQS5xgAckleo/Vb6vM6Phh9oBzrwDc790cisfDv5rlfqJ0kZnUXZ1rZpw4LJ4Nrvo
+/wCbz9y9GWH8W5o8X3eB0GuTz6Blxx6qSSVDrPWcTo2J9pyZcXHbVU36T3eA/iVkwhKchCAMpS0A
+C9vpLiKP8YxNwGRhbaCdSx8vA+BABXZ42TTl49eTjuD6bWhzHDuCpc/K5sFe7DhEtjdj8FCQOyRJ
+Vuo9Qxum4lmZlO21V+GpcTw1o8SuQP8AjHd62mCPQn/Se+P82EsHKZ8wMsUOIR62Br9UGQG73CSq
+9M6li9Uw2ZmK6a36EHRzXDlrh4hWlDKJjIxkKMTRBXLOa17Sx4DmuBDmnUEHsV5j9bfq/wDsfMFt
+AP2LIJNX8h3ev+5enqj1rplfVem3Yb43PE1OP5tjdWlWuR5o8vlBJ9E9Jjw7/RbKNh8fSRPQu9f7
+PtPrb/T2d987dv3pLqLHfx+jA+ofU/CGH0HHkQ+8G9/9v6P/AEYW0h41Qox6qRxUxrB/ZEIi4/NM
+5Ms5n9ORl9rYAoAKXEf4xqLicLIAJoaHsJ7B5gj7wF26Hk42Pl0ux8mtttLxDmOEgqTlc/sZoZa4
+hG7HgdFSFinxVeo/Uui+n6v44ukby97Gnsxxlv38p6PqX9X6b/WGOXwZax7i5g/snn5rcAAAAEAc
+BXfiHxDHnxxx44yri4iZfkFkIEGy8v8A4waL7Oj1WVgmum4OtA7Atc0OPzK85XttlbLWOrsaHseC
+HNcJBB7ELCP1K+rxv9b7O6Jn0t7tn3TP4o8h8Rx4MXt5Iy0JMTHx7qlAk2Gl/i8ovr6ZkWvBFVtv
+6Ke+0Q5w/J8l1ajVVXTW2qpoZWwQ1jRAAHYBSWfzGb3s08tcPGbpeBQpSSSSiS8d+xGf8/PU2/od
+n22I03fQ/wDPmqS6z7Oz7V9pj3+n6c+W7ckrv36fc/7m9j+1bw/9K0oIIBHB4SVPo2SMvpOHkAzv
+pZP9YCHfiFcVOcTGUoneJI+xKkkkkEqSSSSUpJJJJSkkkklKSSSSUrySWX+0m/8AOT9mz/2l9T+3
+v4/zUlL7E+3+T93/AAUX+dOP/i+6kLsC3p7z+kxnb2D/AIN+v4O/KusXkHROq2dJ6lVmMktadtrB
++dW76Q/u8165j305NFeRQ4PqtaHMcO4KufFOXOPOcgHoza/4XUftWwNiuzMkASeFiYv1u6Nk59mC
+LdjmO212v0rtPfa74+PK2yARB1BXKdc+ouLmOdkdNcMa86uqP804+UfR/Iq3LR5eRlHPKUOIeiQ2
+B8Uyvo9WkvNmZv1u+rf6O1rzjt0AsHq0/wBl44+RWjj/AOMd4AGTggnu6uyP+i5p/Kp5fDM/zYjD
+PDpKEh+1HGOuj3CS41/+MfFA9mFYXeBeAPwBWfk/XzrOWfSwMdlLnaDaDbZ8u34IR+Gc2d4CA7yk
+K/BXHF7nP6jhdOoORmWtqrHE8uPg0ckqt0Tr2F1ql9mNLH1uh9T43Afmu07FcbifVP6wdavGT1Wx
+1LDy+47rI8G19vnC7bpPRsDpFHo4dcE/zlrtXvP8pyGfDy2HGYjJ72e94fJHwSDInag3kznNY0uc
+Ya0SSeAAnXLfXnrgw8L9m0O/WcofpI5ZV3/zuPvVfBhlmyxxx/SO/YdSkmhbyv7fd/zp/bEn0/W4
+/wCB/m4/zEliJLqfu2L93/Jez/gdmCz+NqXUfVH60fsx4wc1x+w2H2POvouPf+qe/wB65dJHNhhm
+xnHMWD9oPcKBINh9ta5r2h7CHNcJa4agg9wnXmH1f+tuZ0iKLQcjC/0RPuZ/xZ/gvQemda6b1Wvf
+h3B7vzqj7bG/FpXN81yOXlySRxw6TG317M0ZAt7nQqnf0bpORrdhUvJ7mts/eBKuJKrGUom4kx8j
+SXNZ9W+gsMjApnzbP5VeoxcbHEY9LKR4VtDf+pCIknSy5JfNOUv7xJVQUkmc5rGlzyGtGpJMABcv
+1z684WG11HTYysnj1P8ABMPx/O+X3p2HBlzS4ccTL8h5lRIG7qdf6/i9FxfUsIfkvB9CidXHxPg0
+LyzMzMjOybMrJdvutO5zv4DyCWZmZOdkOycqw23P+k535B4BBXR8lyUeWj+9kl80v2DwYZSvyUkk
+kri1SSSSSlIlHr+q37Pv9afZ6c758tuqSSB2P7dlPc9E/wCfm1vqbPR0j7b9KP7H6T711mP9q2D7
+V6e/v6e6P+kkkuZ575z/ALm3/wAh+1nj9fql+Cy+p/8AOTaf2b9l/wCub9/y/NSSVfB84/m/+q/K
+k/X6PA9f/wCdO4/tj1vTnT/Q/L0/YsNJJdTy381H+a/6j8n0YDv1+qkkklMhSSSSSn//2Q==" width="40" height="40" preserveAspectRatio="none" />
+ </g>
+ <text x="35.5" y="110" text-anchor="middle">Viewport 1</text>
+ <g transform="translate(10,120)">&Viewport1;</g>
+ <text x="35.5" y="180" text-anchor="middle">Viewport 2</text>
+ <g transform="translate(20,190)">&Viewport2;</g>
+ <g id="meet-group-1" transform="translate(120, 50)">
+ <text x="0" y="-20">---------- meet --------------------</text>
+ <g>
+ <text y="-5">xMin*</text>&Viewport1;
+ <image xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAAHgAA/+4ADkFkb2JlAGTAAAAAAf/b
+AIQAEAsLCwwLEAwMEBcPDQ8XGxQQEBQbHxcXFxcXHx4XGhoaGhceHiMlJyUjHi8vMzMvL0BAQEBA
+QEBAQEBAQEBAQAERDw8RExEVEhIVFBEUERQaFBYWFBomGhocGhomMCMeHh4eIzArLicnJy4rNTUw
+MDU1QEA/QEBAQEBAQEBAQEBA/8AAEQgAZABkAwEiAAIRAQMRAf/EAT8AAAEFAQEBAQEBAAAAAAAA
+AAMAAQIEBQYHCAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUD
+DDMBAAIRAwQhEjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1Rk
+RcKjdDYX0lXiZfKzhMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX
+5/cRAAICAQIEBAMEBQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1MV
+Y3M08SUGFqKygwcmNcLSRJNUoxdkRVU2dGXi8rOEw9N14/NGlKSFtJXE1OT0pbXF1eX1VmZ2hpam
+tsbW5vYnN0dXZ3eHl6e3x//aAAwDAQACEQMRAD8A8/SSR8LCyc/JZi4rDZdYYa0flPgAgSACSaA1
+JKkLWuc4NaC5x0AGpJXT9J+onUcwC3Od9jpOoYRutI/q/m/P7l1X1f8Aqth9HYLXgX5xHuuI0b5V
+g8fHlbixOa+LSsw5fQf5w7/QMscfdxcL6n9BwwP1cXvH5953/wDR+j+C1qsbHoEU1MqHgxob+RES
+WVPNlyG5zlP+8bXgAbBRAIgiR4Knk9G6TlgjIw6Xz32AO/zhBVxJNjOUTcZGJ8DSnk+pf4v8C4F/
+T7XY1nZj/fX/AOSH4rjOq9E6l0mzZmVFrSYZa33Vu+Dv4L19Qvx6Mmp1GRW22p4hzHCQQtDl/imf
+GQMh96Hj830P8VpgDto+KJLqPrR9UX9M3ZuCDZgzL2cupn8rfP71y63sObHmgJ4zYP2g9ixEEGip
+JJJSoXa1znBrQS5xgAckleo/Vb6vM6Phh9oBzrwDc790cisfDv5rlfqJ0kZnUXZ1rZpw4LJ4Nrvo
+/wCbz9y9GWH8W5o8X3eB0GuTz6Blxx6qSSVDrPWcTo2J9pyZcXHbVU36T3eA/iVkwhKchCAMpS0A
+C9vpLiKP8YxNwGRhbaCdSx8vA+BABXZ42TTl49eTjuD6bWhzHDuCpc/K5sFe7DhEtjdj8FCQOyRJ
+Vuo9Qxum4lmZlO21V+GpcTw1o8SuQP8AjHd62mCPQn/Se+P82EsHKZ8wMsUOIR62Br9UGQG73CSq
+9M6li9Uw2ZmK6a36EHRzXDlrh4hWlDKJjIxkKMTRBXLOa17Sx4DmuBDmnUEHsV5j9bfq/wDsfMFt
+AP2LIJNX8h3ev+5enqj1rplfVem3Yb43PE1OP5tjdWlWuR5o8vlBJ9E9Jjw7/RbKNh8fSRPQu9f7
+PtPrb/T2d987dv3pLqLHfx+jA+ofU/CGH0HHkQ+8G9/9v6P/AEYW0h41Qox6qRxUxrB/ZEIi4/NM
+5Ms5n9ORl9rYAoAKXEf4xqLicLIAJoaHsJ7B5gj7wF26Hk42Pl0ux8mtttLxDmOEgqTlc/sZoZa4
+hG7HgdFSFinxVeo/Uui+n6v44ukby97Gnsxxlv38p6PqX9X6b/WGOXwZax7i5g/snn5rcAAAAEAc
+BXfiHxDHnxxx44yri4iZfkFkIEGy8v8A4waL7Oj1WVgmum4OtA7Atc0OPzK85XttlbLWOrsaHseC
+HNcJBB7ELCP1K+rxv9b7O6Jn0t7tn3TP4o8h8Rx4MXt5Iy0JMTHx7qlAk2Gl/i8ovr6ZkWvBFVtv
+6Ke+0Q5w/J8l1ajVVXTW2qpoZWwQ1jRAAHYBSWfzGb3s08tcPGbpeBQpSSSSiS8d+xGf8/PU2/od
+n22I03fQ/wDPmqS6z7Oz7V9pj3+n6c+W7ckrv36fc/7m9j+1bw/9K0oIIBHB4SVPo2SMvpOHkAzv
+pZP9YCHfiFcVOcTGUoneJI+xKkkkkEqSSSSUpJJJJSkkkklKSSSSUrySWX+0m/8AOT9mz/2l9T+3
+v4/zUlL7E+3+T93/AAUX+dOP/i+6kLsC3p7z+kxnb2D/AIN+v4O/KusXkHROq2dJ6lVmMktadtrB
++dW76Q/u8165j305NFeRQ4PqtaHMcO4KufFOXOPOcgHoza/4XUftWwNiuzMkASeFiYv1u6Nk59mC
+LdjmO212v0rtPfa74+PK2yARB1BXKdc+ouLmOdkdNcMa86uqP804+UfR/Iq3LR5eRlHPKUOIeiQ2
+B8Uyvo9WkvNmZv1u+rf6O1rzjt0AsHq0/wBl44+RWjj/AOMd4AGTggnu6uyP+i5p/Kp5fDM/zYjD
+PDpKEh+1HGOuj3CS41/+MfFA9mFYXeBeAPwBWfk/XzrOWfSwMdlLnaDaDbZ8u34IR+Gc2d4CA7yk
+K/BXHF7nP6jhdOoORmWtqrHE8uPg0ckqt0Tr2F1ql9mNLH1uh9T43Afmu07FcbifVP6wdavGT1Wx
+1LDy+47rI8G19vnC7bpPRsDpFHo4dcE/zlrtXvP8pyGfDy2HGYjJ72e94fJHwSDInag3kznNY0uc
+Ya0SSeAAnXLfXnrgw8L9m0O/WcofpI5ZV3/zuPvVfBhlmyxxx/SO/YdSkmhbyv7fd/zp/bEn0/W4
+/wCB/m4/zEliJLqfu2L93/Jez/gdmCz+NqXUfVH60fsx4wc1x+w2H2POvouPf+qe/wB65dJHNhhm
+xnHMWD9oPcKBINh9ta5r2h7CHNcJa4agg9wnXmH1f+tuZ0iKLQcjC/0RPuZ/xZ/gvQemda6b1Wvf
+h3B7vzqj7bG/FpXN81yOXlySRxw6TG317M0ZAt7nQqnf0bpORrdhUvJ7mts/eBKuJKrGUom4kx8j
+SXNZ9W+gsMjApnzbP5VeoxcbHEY9LKR4VtDf+pCIknSy5JfNOUv7xJVQUkmc5rGlzyGtGpJMABcv
+1z684WG11HTYysnj1P8ABMPx/O+X3p2HBlzS4ccTL8h5lRIG7qdf6/i9FxfUsIfkvB9CidXHxPg0
+LyzMzMjOybMrJdvutO5zv4DyCWZmZOdkOycqw23P+k535B4BBXR8lyUeWj+9kl80v2DwYZSvyUkk
+kri1SSSSSlIlHr+q37Pv9afZ6c758tuqSSB2P7dlPc9E/wCfm1vqbPR0j7b9KP7H6T711mP9q2D7
+V6e/v6e6P+kkkuZ575z/ALm3/wAh+1nj9fql+Cy+p/8AOTaf2b9l/wCub9/y/NSSVfB84/m/+q/K
+k/X6PA9f/wCdO4/tj1vTnT/Q/L0/YsNJJdTy381H+a/6j8n0YDv1+qkkklMhSSSSSn//2Q==" preserveAspectRatio="xMinYMin meet" width="50" height="30" />
+ </g>
+ <g transform="translate(70,0)">
+ <text y="-5">xMid*</text>&Viewport1;
+ <image xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAAHgAA/+4ADkFkb2JlAGTAAAAAAf/b
+AIQAEAsLCwwLEAwMEBcPDQ8XGxQQEBQbHxcXFxcXHx4XGhoaGhceHiMlJyUjHi8vMzMvL0BAQEBA
+QEBAQEBAQEBAQAERDw8RExEVEhIVFBEUERQaFBYWFBomGhocGhomMCMeHh4eIzArLicnJy4rNTUw
+MDU1QEA/QEBAQEBAQEBAQEBA/8AAEQgAZABkAwEiAAIRAQMRAf/EAT8AAAEFAQEBAQEBAAAAAAAA
+AAMAAQIEBQYHCAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUD
+DDMBAAIRAwQhEjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1Rk
+RcKjdDYX0lXiZfKzhMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX
+5/cRAAICAQIEBAMEBQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1MV
+Y3M08SUGFqKygwcmNcLSRJNUoxdkRVU2dGXi8rOEw9N14/NGlKSFtJXE1OT0pbXF1eX1VmZ2hpam
+tsbW5vYnN0dXZ3eHl6e3x//aAAwDAQACEQMRAD8A8/SSR8LCyc/JZi4rDZdYYa0flPgAgSACSaA1
+JKkLWuc4NaC5x0AGpJXT9J+onUcwC3Od9jpOoYRutI/q/m/P7l1X1f8Aqth9HYLXgX5xHuuI0b5V
+g8fHlbixOa+LSsw5fQf5w7/QMscfdxcL6n9BwwP1cXvH5953/wDR+j+C1qsbHoEU1MqHgxob+RES
+WVPNlyG5zlP+8bXgAbBRAIgiR4Knk9G6TlgjIw6Xz32AO/zhBVxJNjOUTcZGJ8DSnk+pf4v8C4F/
+T7XY1nZj/fX/AOSH4rjOq9E6l0mzZmVFrSYZa33Vu+Dv4L19Qvx6Mmp1GRW22p4hzHCQQtDl/imf
+GQMh96Hj830P8VpgDto+KJLqPrR9UX9M3ZuCDZgzL2cupn8rfP71y63sObHmgJ4zYP2g9ixEEGip
+JJJSoXa1znBrQS5xgAckleo/Vb6vM6Phh9oBzrwDc790cisfDv5rlfqJ0kZnUXZ1rZpw4LJ4Nrvo
+/wCbz9y9GWH8W5o8X3eB0GuTz6Blxx6qSSVDrPWcTo2J9pyZcXHbVU36T3eA/iVkwhKchCAMpS0A
+C9vpLiKP8YxNwGRhbaCdSx8vA+BABXZ42TTl49eTjuD6bWhzHDuCpc/K5sFe7DhEtjdj8FCQOyRJ
+Vuo9Qxum4lmZlO21V+GpcTw1o8SuQP8AjHd62mCPQn/Se+P82EsHKZ8wMsUOIR62Br9UGQG73CSq
+9M6li9Uw2ZmK6a36EHRzXDlrh4hWlDKJjIxkKMTRBXLOa17Sx4DmuBDmnUEHsV5j9bfq/wDsfMFt
+AP2LIJNX8h3ev+5enqj1rplfVem3Yb43PE1OP5tjdWlWuR5o8vlBJ9E9Jjw7/RbKNh8fSRPQu9f7
+PtPrb/T2d987dv3pLqLHfx+jA+ofU/CGH0HHkQ+8G9/9v6P/AEYW0h41Qox6qRxUxrB/ZEIi4/NM
+5Ms5n9ORl9rYAoAKXEf4xqLicLIAJoaHsJ7B5gj7wF26Hk42Pl0ux8mtttLxDmOEgqTlc/sZoZa4
+hG7HgdFSFinxVeo/Uui+n6v44ukby97Gnsxxlv38p6PqX9X6b/WGOXwZax7i5g/snn5rcAAAAEAc
+BXfiHxDHnxxx44yri4iZfkFkIEGy8v8A4waL7Oj1WVgmum4OtA7Atc0OPzK85XttlbLWOrsaHseC
+HNcJBB7ELCP1K+rxv9b7O6Jn0t7tn3TP4o8h8Rx4MXt5Iy0JMTHx7qlAk2Gl/i8ovr6ZkWvBFVtv
+6Ke+0Q5w/J8l1ajVVXTW2qpoZWwQ1jRAAHYBSWfzGb3s08tcPGbpeBQpSSSSiS8d+xGf8/PU2/od
+n22I03fQ/wDPmqS6z7Oz7V9pj3+n6c+W7ckrv36fc/7m9j+1bw/9K0oIIBHB4SVPo2SMvpOHkAzv
+pZP9YCHfiFcVOcTGUoneJI+xKkkkkEqSSSSUpJJJJSkkkklKSSSSUrySWX+0m/8AOT9mz/2l9T+3
+v4/zUlL7E+3+T93/AAUX+dOP/i+6kLsC3p7z+kxnb2D/AIN+v4O/KusXkHROq2dJ6lVmMktadtrB
++dW76Q/u8165j305NFeRQ4PqtaHMcO4KufFOXOPOcgHoza/4XUftWwNiuzMkASeFiYv1u6Nk59mC
+LdjmO212v0rtPfa74+PK2yARB1BXKdc+ouLmOdkdNcMa86uqP804+UfR/Iq3LR5eRlHPKUOIeiQ2
+B8Uyvo9WkvNmZv1u+rf6O1rzjt0AsHq0/wBl44+RWjj/AOMd4AGTggnu6uyP+i5p/Kp5fDM/zYjD
+PDpKEh+1HGOuj3CS41/+MfFA9mFYXeBeAPwBWfk/XzrOWfSwMdlLnaDaDbZ8u34IR+Gc2d4CA7yk
+K/BXHF7nP6jhdOoORmWtqrHE8uPg0ckqt0Tr2F1ql9mNLH1uh9T43Afmu07FcbifVP6wdavGT1Wx
+1LDy+47rI8G19vnC7bpPRsDpFHo4dcE/zlrtXvP8pyGfDy2HGYjJ72e94fJHwSDInag3kznNY0uc
+Ya0SSeAAnXLfXnrgw8L9m0O/WcofpI5ZV3/zuPvVfBhlmyxxx/SO/YdSkmhbyv7fd/zp/bEn0/W4
+/wCB/m4/zEliJLqfu2L93/Jez/gdmCz+NqXUfVH60fsx4wc1x+w2H2POvouPf+qe/wB65dJHNhhm
+xnHMWD9oPcKBINh9ta5r2h7CHNcJa4agg9wnXmH1f+tuZ0iKLQcjC/0RPuZ/xZ/gvQemda6b1Wvf
+h3B7vzqj7bG/FpXN81yOXlySRxw6TG317M0ZAt7nQqnf0bpORrdhUvJ7mts/eBKuJKrGUom4kx8j
+SXNZ9W+gsMjApnzbP5VeoxcbHEY9LKR4VtDf+pCIknSy5JfNOUv7xJVQUkmc5rGlzyGtGpJMABcv
+1z684WG11HTYysnj1P8ABMPx/O+X3p2HBlzS4ccTL8h5lRIG7qdf6/i9FxfUsIfkvB9CidXHxPg0
+LyzMzMjOybMrJdvutO5zv4DyCWZmZOdkOycqw23P+k535B4BBXR8lyUeWj+9kl80v2DwYZSvyUkk
+kri1SSSSSlIlHr+q37Pv9afZ6c758tuqSSB2P7dlPc9E/wCfm1vqbPR0j7b9KP7H6T711mP9q2D7
+V6e/v6e6P+kkkuZ575z/ALm3/wAh+1nj9fql+Cy+p/8AOTaf2b9l/wCub9/y/NSSVfB84/m/+q/K
+k/X6PA9f/wCdO4/tj1vTnT/Q/L0/YsNJJdTy381H+a/6j8n0YDv1+qkkklMhSSSSSn//2Q==" preserveAspectRatio="xMidYMid meet" width="50" height="30" />
+ </g>
+ <g transform="translate(0,50)">
+ <text y="-5">xMax*</text>&Viewport1;
+ <image xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAAHgAA/+4ADkFkb2JlAGTAAAAAAf/b
+AIQAEAsLCwwLEAwMEBcPDQ8XGxQQEBQbHxcXFxcXHx4XGhoaGhceHiMlJyUjHi8vMzMvL0BAQEBA
+QEBAQEBAQEBAQAERDw8RExEVEhIVFBEUERQaFBYWFBomGhocGhomMCMeHh4eIzArLicnJy4rNTUw
+MDU1QEA/QEBAQEBAQEBAQEBA/8AAEQgAZABkAwEiAAIRAQMRAf/EAT8AAAEFAQEBAQEBAAAAAAAA
+AAMAAQIEBQYHCAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUD
+DDMBAAIRAwQhEjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1Rk
+RcKjdDYX0lXiZfKzhMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX
+5/cRAAICAQIEBAMEBQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1MV
+Y3M08SUGFqKygwcmNcLSRJNUoxdkRVU2dGXi8rOEw9N14/NGlKSFtJXE1OT0pbXF1eX1VmZ2hpam
+tsbW5vYnN0dXZ3eHl6e3x//aAAwDAQACEQMRAD8A8/SSR8LCyc/JZi4rDZdYYa0flPgAgSACSaA1
+JKkLWuc4NaC5x0AGpJXT9J+onUcwC3Od9jpOoYRutI/q/m/P7l1X1f8Aqth9HYLXgX5xHuuI0b5V
+g8fHlbixOa+LSsw5fQf5w7/QMscfdxcL6n9BwwP1cXvH5953/wDR+j+C1qsbHoEU1MqHgxob+RES
+WVPNlyG5zlP+8bXgAbBRAIgiR4Knk9G6TlgjIw6Xz32AO/zhBVxJNjOUTcZGJ8DSnk+pf4v8C4F/
+T7XY1nZj/fX/AOSH4rjOq9E6l0mzZmVFrSYZa33Vu+Dv4L19Qvx6Mmp1GRW22p4hzHCQQtDl/imf
+GQMh96Hj830P8VpgDto+KJLqPrR9UX9M3ZuCDZgzL2cupn8rfP71y63sObHmgJ4zYP2g9ixEEGip
+JJJSoXa1znBrQS5xgAckleo/Vb6vM6Phh9oBzrwDc790cisfDv5rlfqJ0kZnUXZ1rZpw4LJ4Nrvo
+/wCbz9y9GWH8W5o8X3eB0GuTz6Blxx6qSSVDrPWcTo2J9pyZcXHbVU36T3eA/iVkwhKchCAMpS0A
+C9vpLiKP8YxNwGRhbaCdSx8vA+BABXZ42TTl49eTjuD6bWhzHDuCpc/K5sFe7DhEtjdj8FCQOyRJ
+Vuo9Qxum4lmZlO21V+GpcTw1o8SuQP8AjHd62mCPQn/Se+P82EsHKZ8wMsUOIR62Br9UGQG73CSq
+9M6li9Uw2ZmK6a36EHRzXDlrh4hWlDKJjIxkKMTRBXLOa17Sx4DmuBDmnUEHsV5j9bfq/wDsfMFt
+AP2LIJNX8h3ev+5enqj1rplfVem3Yb43PE1OP5tjdWlWuR5o8vlBJ9E9Jjw7/RbKNh8fSRPQu9f7
+PtPrb/T2d987dv3pLqLHfx+jA+ofU/CGH0HHkQ+8G9/9v6P/AEYW0h41Qox6qRxUxrB/ZEIi4/NM
+5Ms5n9ORl9rYAoAKXEf4xqLicLIAJoaHsJ7B5gj7wF26Hk42Pl0ux8mtttLxDmOEgqTlc/sZoZa4
+hG7HgdFSFinxVeo/Uui+n6v44ukby97Gnsxxlv38p6PqX9X6b/WGOXwZax7i5g/snn5rcAAAAEAc
+BXfiHxDHnxxx44yri4iZfkFkIEGy8v8A4waL7Oj1WVgmum4OtA7Atc0OPzK85XttlbLWOrsaHseC
+HNcJBB7ELCP1K+rxv9b7O6Jn0t7tn3TP4o8h8Rx4MXt5Iy0JMTHx7qlAk2Gl/i8ovr6ZkWvBFVtv
+6Ke+0Q5w/J8l1ajVVXTW2qpoZWwQ1jRAAHYBSWfzGb3s08tcPGbpeBQpSSSSiS8d+xGf8/PU2/od
+n22I03fQ/wDPmqS6z7Oz7V9pj3+n6c+W7ckrv36fc/7m9j+1bw/9K0oIIBHB4SVPo2SMvpOHkAzv
+pZP9YCHfiFcVOcTGUoneJI+xKkkkkEqSSSSUpJJJJSkkkklKSSSSUrySWX+0m/8AOT9mz/2l9T+3
+v4/zUlL7E+3+T93/AAUX+dOP/i+6kLsC3p7z+kxnb2D/AIN+v4O/KusXkHROq2dJ6lVmMktadtrB
++dW76Q/u8165j305NFeRQ4PqtaHMcO4KufFOXOPOcgHoza/4XUftWwNiuzMkASeFiYv1u6Nk59mC
+LdjmO212v0rtPfa74+PK2yARB1BXKdc+ouLmOdkdNcMa86uqP804+UfR/Iq3LR5eRlHPKUOIeiQ2
+B8Uyvo9WkvNmZv1u+rf6O1rzjt0AsHq0/wBl44+RWjj/AOMd4AGTggnu6uyP+i5p/Kp5fDM/zYjD
+PDpKEh+1HGOuj3CS41/+MfFA9mFYXeBeAPwBWfk/XzrOWfSwMdlLnaDaDbZ8u34IR+Gc2d4CA7yk
+K/BXHF7nP6jhdOoORmWtqrHE8uPg0ckqt0Tr2F1ql9mNLH1uh9T43Afmu07FcbifVP6wdavGT1Wx
+1LDy+47rI8G19vnC7bpPRsDpFHo4dcE/zlrtXvP8pyGfDy2HGYjJ72e94fJHwSDInag3kznNY0uc
+Ya0SSeAAnXLfXnrgw8L9m0O/WcofpI5ZV3/zuPvVfBhlmyxxx/SO/YdSkmhbyv7fd/zp/bEn0/W4
+/wCB/m4/zEliJLqfu2L93/Jez/gdmCz+NqXUfVH60fsx4wc1x+w2H2POvouPf+qe/wB65dJHNhhm
+xnHMWD9oPcKBINh9ta5r2h7CHNcJa4agg9wnXmH1f+tuZ0iKLQcjC/0RPuZ/xZ/gvQemda6b1Wvf
+h3B7vzqj7bG/FpXN81yOXlySRxw6TG317M0ZAt7nQqnf0bpORrdhUvJ7mts/eBKuJKrGUom4kx8j
+SXNZ9W+gsMjApnzbP5VeoxcbHEY9LKR4VtDf+pCIknSy5JfNOUv7xJVQUkmc5rGlzyGtGpJMABcv
+1z684WG11HTYysnj1P8ABMPx/O+X3p2HBlzS4ccTL8h5lRIG7qdf6/i9FxfUsIfkvB9CidXHxPg0
+LyzMzMjOybMrJdvutO5zv4DyCWZmZOdkOycqw23P+k535B4BBXR8lyUeWj+9kl80v2DwYZSvyUkk
+kri1SSSSSlIlHr+q37Pv9afZ6c758tuqSSB2P7dlPc9E/wCfm1vqbPR0j7b9KP7H6T711mP9q2D7
+V6e/v6e6P+kkkuZ575z/ALm3/wAh+1nj9fql+Cy+p/8AOTaf2b9l/wCub9/y/NSSVfB84/m/+q/K
+k/X6PA9f/wCdO4/tj1vTnT/Q/L0/YsNJJdTy381H+a/6j8n0YDv1+qkkklMhSSSSSn//2Q==" preserveAspectRatio="xMaxYMax meet" width="50" height="30" />
+ </g>
+ </g>
+ <g id="meet-group-2" transform="translate(300, 50)">
+ <text x="0" y="-20">---------- meet ------------------------</text>
+ <g>
+ <text y="-5">*YMin</text>&Viewport2;
+ <image xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAAHgAA/+4ADkFkb2JlAGTAAAAAAf/b
+AIQAEAsLCwwLEAwMEBcPDQ8XGxQQEBQbHxcXFxcXHx4XGhoaGhceHiMlJyUjHi8vMzMvL0BAQEBA
+QEBAQEBAQEBAQAERDw8RExEVEhIVFBEUERQaFBYWFBomGhocGhomMCMeHh4eIzArLicnJy4rNTUw
+MDU1QEA/QEBAQEBAQEBAQEBA/8AAEQgAZABkAwEiAAIRAQMRAf/EAT8AAAEFAQEBAQEBAAAAAAAA
+AAMAAQIEBQYHCAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUD
+DDMBAAIRAwQhEjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1Rk
+RcKjdDYX0lXiZfKzhMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX
+5/cRAAICAQIEBAMEBQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1MV
+Y3M08SUGFqKygwcmNcLSRJNUoxdkRVU2dGXi8rOEw9N14/NGlKSFtJXE1OT0pbXF1eX1VmZ2hpam
+tsbW5vYnN0dXZ3eHl6e3x//aAAwDAQACEQMRAD8A8/SSR8LCyc/JZi4rDZdYYa0flPgAgSACSaA1
+JKkLWuc4NaC5x0AGpJXT9J+onUcwC3Od9jpOoYRutI/q/m/P7l1X1f8Aqth9HYLXgX5xHuuI0b5V
+g8fHlbixOa+LSsw5fQf5w7/QMscfdxcL6n9BwwP1cXvH5953/wDR+j+C1qsbHoEU1MqHgxob+RES
+WVPNlyG5zlP+8bXgAbBRAIgiR4Knk9G6TlgjIw6Xz32AO/zhBVxJNjOUTcZGJ8DSnk+pf4v8C4F/
+T7XY1nZj/fX/AOSH4rjOq9E6l0mzZmVFrSYZa33Vu+Dv4L19Qvx6Mmp1GRW22p4hzHCQQtDl/imf
+GQMh96Hj830P8VpgDto+KJLqPrR9UX9M3ZuCDZgzL2cupn8rfP71y63sObHmgJ4zYP2g9ixEEGip
+JJJSoXa1znBrQS5xgAckleo/Vb6vM6Phh9oBzrwDc790cisfDv5rlfqJ0kZnUXZ1rZpw4LJ4Nrvo
+/wCbz9y9GWH8W5o8X3eB0GuTz6Blxx6qSSVDrPWcTo2J9pyZcXHbVU36T3eA/iVkwhKchCAMpS0A
+C9vpLiKP8YxNwGRhbaCdSx8vA+BABXZ42TTl49eTjuD6bWhzHDuCpc/K5sFe7DhEtjdj8FCQOyRJ
+Vuo9Qxum4lmZlO21V+GpcTw1o8SuQP8AjHd62mCPQn/Se+P82EsHKZ8wMsUOIR62Br9UGQG73CSq
+9M6li9Uw2ZmK6a36EHRzXDlrh4hWlDKJjIxkKMTRBXLOa17Sx4DmuBDmnUEHsV5j9bfq/wDsfMFt
+AP2LIJNX8h3ev+5enqj1rplfVem3Yb43PE1OP5tjdWlWuR5o8vlBJ9E9Jjw7/RbKNh8fSRPQu9f7
+PtPrb/T2d987dv3pLqLHfx+jA+ofU/CGH0HHkQ+8G9/9v6P/AEYW0h41Qox6qRxUxrB/ZEIi4/NM
+5Ms5n9ORl9rYAoAKXEf4xqLicLIAJoaHsJ7B5gj7wF26Hk42Pl0ux8mtttLxDmOEgqTlc/sZoZa4
+hG7HgdFSFinxVeo/Uui+n6v44ukby97Gnsxxlv38p6PqX9X6b/WGOXwZax7i5g/snn5rcAAAAEAc
+BXfiHxDHnxxx44yri4iZfkFkIEGy8v8A4waL7Oj1WVgmum4OtA7Atc0OPzK85XttlbLWOrsaHseC
+HNcJBB7ELCP1K+rxv9b7O6Jn0t7tn3TP4o8h8Rx4MXt5Iy0JMTHx7qlAk2Gl/i8ovr6ZkWvBFVtv
+6Ke+0Q5w/J8l1ajVVXTW2qpoZWwQ1jRAAHYBSWfzGb3s08tcPGbpeBQpSSSSiS8d+xGf8/PU2/od
+n22I03fQ/wDPmqS6z7Oz7V9pj3+n6c+W7ckrv36fc/7m9j+1bw/9K0oIIBHB4SVPo2SMvpOHkAzv
+pZP9YCHfiFcVOcTGUoneJI+xKkkkkEqSSSSUpJJJJSkkkklKSSSSUrySWX+0m/8AOT9mz/2l9T+3
+v4/zUlL7E+3+T93/AAUX+dOP/i+6kLsC3p7z+kxnb2D/AIN+v4O/KusXkHROq2dJ6lVmMktadtrB
++dW76Q/u8165j305NFeRQ4PqtaHMcO4KufFOXOPOcgHoza/4XUftWwNiuzMkASeFiYv1u6Nk59mC
+LdjmO212v0rtPfa74+PK2yARB1BXKdc+ouLmOdkdNcMa86uqP804+UfR/Iq3LR5eRlHPKUOIeiQ2
+B8Uyvo9WkvNmZv1u+rf6O1rzjt0AsHq0/wBl44+RWjj/AOMd4AGTggnu6uyP+i5p/Kp5fDM/zYjD
+PDpKEh+1HGOuj3CS41/+MfFA9mFYXeBeAPwBWfk/XzrOWfSwMdlLnaDaDbZ8u34IR+Gc2d4CA7yk
+K/BXHF7nP6jhdOoORmWtqrHE8uPg0ckqt0Tr2F1ql9mNLH1uh9T43Afmu07FcbifVP6wdavGT1Wx
+1LDy+47rI8G19vnC7bpPRsDpFHo4dcE/zlrtXvP8pyGfDy2HGYjJ72e94fJHwSDInag3kznNY0uc
+Ya0SSeAAnXLfXnrgw8L9m0O/WcofpI5ZV3/zuPvVfBhlmyxxx/SO/YdSkmhbyv7fd/zp/bEn0/W4
+/wCB/m4/zEliJLqfu2L93/Jez/gdmCz+NqXUfVH60fsx4wc1x+w2H2POvouPf+qe/wB65dJHNhhm
+xnHMWD9oPcKBINh9ta5r2h7CHNcJa4agg9wnXmH1f+tuZ0iKLQcjC/0RPuZ/xZ/gvQemda6b1Wvf
+h3B7vzqj7bG/FpXN81yOXlySRxw6TG317M0ZAt7nQqnf0bpORrdhUvJ7mts/eBKuJKrGUom4kx8j
+SXNZ9W+gsMjApnzbP5VeoxcbHEY9LKR4VtDf+pCIknSy5JfNOUv7xJVQUkmc5rGlzyGtGpJMABcv
+1z684WG11HTYysnj1P8ABMPx/O+X3p2HBlzS4ccTL8h5lRIG7qdf6/i9FxfUsIfkvB9CidXHxPg0
+LyzMzMjOybMrJdvutO5zv4DyCWZmZOdkOycqw23P+k535B4BBXR8lyUeWj+9kl80v2DwYZSvyUkk
+kri1SSSSSlIlHr+q37Pv9afZ6c758tuqSSB2P7dlPc9E/wCfm1vqbPR0j7b9KP7H6T711mP9q2D7
+V6e/v6e6P+kkkuZ575z/ALm3/wAh+1nj9fql+Cy+p/8AOTaf2b9l/wCub9/y/NSSVfB84/m/+q/K
+k/X6PA9f/wCdO4/tj1vTnT/Q/L0/YsNJJdTy381H+a/6j8n0YDv1+qkkklMhSSSSSn//2Q==" preserveAspectRatio="xMinYMin meet" width="30" height="60" />
+ </g>
+ <g transform="translate(50, 0)">
+ <text y="-5">*YMid</text>&Viewport2;
+ <image xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAAHgAA/+4ADkFkb2JlAGTAAAAAAf/b
+AIQAEAsLCwwLEAwMEBcPDQ8XGxQQEBQbHxcXFxcXHx4XGhoaGhceHiMlJyUjHi8vMzMvL0BAQEBA
+QEBAQEBAQEBAQAERDw8RExEVEhIVFBEUERQaFBYWFBomGhocGhomMCMeHh4eIzArLicnJy4rNTUw
+MDU1QEA/QEBAQEBAQEBAQEBA/8AAEQgAZABkAwEiAAIRAQMRAf/EAT8AAAEFAQEBAQEBAAAAAAAA
+AAMAAQIEBQYHCAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUD
+DDMBAAIRAwQhEjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1Rk
+RcKjdDYX0lXiZfKzhMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX
+5/cRAAICAQIEBAMEBQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1MV
+Y3M08SUGFqKygwcmNcLSRJNUoxdkRVU2dGXi8rOEw9N14/NGlKSFtJXE1OT0pbXF1eX1VmZ2hpam
+tsbW5vYnN0dXZ3eHl6e3x//aAAwDAQACEQMRAD8A8/SSR8LCyc/JZi4rDZdYYa0flPgAgSACSaA1
+JKkLWuc4NaC5x0AGpJXT9J+onUcwC3Od9jpOoYRutI/q/m/P7l1X1f8Aqth9HYLXgX5xHuuI0b5V
+g8fHlbixOa+LSsw5fQf5w7/QMscfdxcL6n9BwwP1cXvH5953/wDR+j+C1qsbHoEU1MqHgxob+RES
+WVPNlyG5zlP+8bXgAbBRAIgiR4Knk9G6TlgjIw6Xz32AO/zhBVxJNjOUTcZGJ8DSnk+pf4v8C4F/
+T7XY1nZj/fX/AOSH4rjOq9E6l0mzZmVFrSYZa33Vu+Dv4L19Qvx6Mmp1GRW22p4hzHCQQtDl/imf
+GQMh96Hj830P8VpgDto+KJLqPrR9UX9M3ZuCDZgzL2cupn8rfP71y63sObHmgJ4zYP2g9ixEEGip
+JJJSoXa1znBrQS5xgAckleo/Vb6vM6Phh9oBzrwDc790cisfDv5rlfqJ0kZnUXZ1rZpw4LJ4Nrvo
+/wCbz9y9GWH8W5o8X3eB0GuTz6Blxx6qSSVDrPWcTo2J9pyZcXHbVU36T3eA/iVkwhKchCAMpS0A
+C9vpLiKP8YxNwGRhbaCdSx8vA+BABXZ42TTl49eTjuD6bWhzHDuCpc/K5sFe7DhEtjdj8FCQOyRJ
+Vuo9Qxum4lmZlO21V+GpcTw1o8SuQP8AjHd62mCPQn/Se+P82EsHKZ8wMsUOIR62Br9UGQG73CSq
+9M6li9Uw2ZmK6a36EHRzXDlrh4hWlDKJjIxkKMTRBXLOa17Sx4DmuBDmnUEHsV5j9bfq/wDsfMFt
+AP2LIJNX8h3ev+5enqj1rplfVem3Yb43PE1OP5tjdWlWuR5o8vlBJ9E9Jjw7/RbKNh8fSRPQu9f7
+PtPrb/T2d987dv3pLqLHfx+jA+ofU/CGH0HHkQ+8G9/9v6P/AEYW0h41Qox6qRxUxrB/ZEIi4/NM
+5Ms5n9ORl9rYAoAKXEf4xqLicLIAJoaHsJ7B5gj7wF26Hk42Pl0ux8mtttLxDmOEgqTlc/sZoZa4
+hG7HgdFSFinxVeo/Uui+n6v44ukby97Gnsxxlv38p6PqX9X6b/WGOXwZax7i5g/snn5rcAAAAEAc
+BXfiHxDHnxxx44yri4iZfkFkIEGy8v8A4waL7Oj1WVgmum4OtA7Atc0OPzK85XttlbLWOrsaHseC
+HNcJBB7ELCP1K+rxv9b7O6Jn0t7tn3TP4o8h8Rx4MXt5Iy0JMTHx7qlAk2Gl/i8ovr6ZkWvBFVtv
+6Ke+0Q5w/J8l1ajVVXTW2qpoZWwQ1jRAAHYBSWfzGb3s08tcPGbpeBQpSSSSiS8d+xGf8/PU2/od
+n22I03fQ/wDPmqS6z7Oz7V9pj3+n6c+W7ckrv36fc/7m9j+1bw/9K0oIIBHB4SVPo2SMvpOHkAzv
+pZP9YCHfiFcVOcTGUoneJI+xKkkkkEqSSSSUpJJJJSkkkklKSSSSUrySWX+0m/8AOT9mz/2l9T+3
+v4/zUlL7E+3+T93/AAUX+dOP/i+6kLsC3p7z+kxnb2D/AIN+v4O/KusXkHROq2dJ6lVmMktadtrB
++dW76Q/u8165j305NFeRQ4PqtaHMcO4KufFOXOPOcgHoza/4XUftWwNiuzMkASeFiYv1u6Nk59mC
+LdjmO212v0rtPfa74+PK2yARB1BXKdc+ouLmOdkdNcMa86uqP804+UfR/Iq3LR5eRlHPKUOIeiQ2
+B8Uyvo9WkvNmZv1u+rf6O1rzjt0AsHq0/wBl44+RWjj/AOMd4AGTggnu6uyP+i5p/Kp5fDM/zYjD
+PDpKEh+1HGOuj3CS41/+MfFA9mFYXeBeAPwBWfk/XzrOWfSwMdlLnaDaDbZ8u34IR+Gc2d4CA7yk
+K/BXHF7nP6jhdOoORmWtqrHE8uPg0ckqt0Tr2F1ql9mNLH1uh9T43Afmu07FcbifVP6wdavGT1Wx
+1LDy+47rI8G19vnC7bpPRsDpFHo4dcE/zlrtXvP8pyGfDy2HGYjJ72e94fJHwSDInag3kznNY0uc
+Ya0SSeAAnXLfXnrgw8L9m0O/WcofpI5ZV3/zuPvVfBhlmyxxx/SO/YdSkmhbyv7fd/zp/bEn0/W4
+/wCB/m4/zEliJLqfu2L93/Jez/gdmCz+NqXUfVH60fsx4wc1x+w2H2POvouPf+qe/wB65dJHNhhm
+xnHMWD9oPcKBINh9ta5r2h7CHNcJa4agg9wnXmH1f+tuZ0iKLQcjC/0RPuZ/xZ/gvQemda6b1Wvf
+h3B7vzqj7bG/FpXN81yOXlySRxw6TG317M0ZAt7nQqnf0bpORrdhUvJ7mts/eBKuJKrGUom4kx8j
+SXNZ9W+gsMjApnzbP5VeoxcbHEY9LKR4VtDf+pCIknSy5JfNOUv7xJVQUkmc5rGlzyGtGpJMABcv
+1z684WG11HTYysnj1P8ABMPx/O+X3p2HBlzS4ccTL8h5lRIG7qdf6/i9FxfUsIfkvB9CidXHxPg0
+LyzMzMjOybMrJdvutO5zv4DyCWZmZOdkOycqw23P+k535B4BBXR8lyUeWj+9kl80v2DwYZSvyUkk
+kri1SSSSSlIlHr+q37Pv9afZ6c758tuqSSB2P7dlPc9E/wCfm1vqbPR0j7b9KP7H6T711mP9q2D7
+V6e/v6e6P+kkkuZ575z/ALm3/wAh+1nj9fql+Cy+p/8AOTaf2b9l/wCub9/y/NSSVfB84/m/+q/K
+k/X6PA9f/wCdO4/tj1vTnT/Q/L0/YsNJJdTy381H+a/6j8n0YDv1+qkkklMhSSSSSn//2Q==" preserveAspectRatio="xMidYMid meet" width="30" height="60" />
+ </g>
+ <g transform="translate(100, 0)">
+ <text y="-5">*YMax</text>&Viewport2;
+ <image xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAAHgAA/+4ADkFkb2JlAGTAAAAAAf/b
+AIQAEAsLCwwLEAwMEBcPDQ8XGxQQEBQbHxcXFxcXHx4XGhoaGhceHiMlJyUjHi8vMzMvL0BAQEBA
+QEBAQEBAQEBAQAERDw8RExEVEhIVFBEUERQaFBYWFBomGhocGhomMCMeHh4eIzArLicnJy4rNTUw
+MDU1QEA/QEBAQEBAQEBAQEBA/8AAEQgAZABkAwEiAAIRAQMRAf/EAT8AAAEFAQEBAQEBAAAAAAAA
+AAMAAQIEBQYHCAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUD
+DDMBAAIRAwQhEjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1Rk
+RcKjdDYX0lXiZfKzhMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX
+5/cRAAICAQIEBAMEBQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1MV
+Y3M08SUGFqKygwcmNcLSRJNUoxdkRVU2dGXi8rOEw9N14/NGlKSFtJXE1OT0pbXF1eX1VmZ2hpam
+tsbW5vYnN0dXZ3eHl6e3x//aAAwDAQACEQMRAD8A8/SSR8LCyc/JZi4rDZdYYa0flPgAgSACSaA1
+JKkLWuc4NaC5x0AGpJXT9J+onUcwC3Od9jpOoYRutI/q/m/P7l1X1f8Aqth9HYLXgX5xHuuI0b5V
+g8fHlbixOa+LSsw5fQf5w7/QMscfdxcL6n9BwwP1cXvH5953/wDR+j+C1qsbHoEU1MqHgxob+RES
+WVPNlyG5zlP+8bXgAbBRAIgiR4Knk9G6TlgjIw6Xz32AO/zhBVxJNjOUTcZGJ8DSnk+pf4v8C4F/
+T7XY1nZj/fX/AOSH4rjOq9E6l0mzZmVFrSYZa33Vu+Dv4L19Qvx6Mmp1GRW22p4hzHCQQtDl/imf
+GQMh96Hj830P8VpgDto+KJLqPrR9UX9M3ZuCDZgzL2cupn8rfP71y63sObHmgJ4zYP2g9ixEEGip
+JJJSoXa1znBrQS5xgAckleo/Vb6vM6Phh9oBzrwDc790cisfDv5rlfqJ0kZnUXZ1rZpw4LJ4Nrvo
+/wCbz9y9GWH8W5o8X3eB0GuTz6Blxx6qSSVDrPWcTo2J9pyZcXHbVU36T3eA/iVkwhKchCAMpS0A
+C9vpLiKP8YxNwGRhbaCdSx8vA+BABXZ42TTl49eTjuD6bWhzHDuCpc/K5sFe7DhEtjdj8FCQOyRJ
+Vuo9Qxum4lmZlO21V+GpcTw1o8SuQP8AjHd62mCPQn/Se+P82EsHKZ8wMsUOIR62Br9UGQG73CSq
+9M6li9Uw2ZmK6a36EHRzXDlrh4hWlDKJjIxkKMTRBXLOa17Sx4DmuBDmnUEHsV5j9bfq/wDsfMFt
+AP2LIJNX8h3ev+5enqj1rplfVem3Yb43PE1OP5tjdWlWuR5o8vlBJ9E9Jjw7/RbKNh8fSRPQu9f7
+PtPrb/T2d987dv3pLqLHfx+jA+ofU/CGH0HHkQ+8G9/9v6P/AEYW0h41Qox6qRxUxrB/ZEIi4/NM
+5Ms5n9ORl9rYAoAKXEf4xqLicLIAJoaHsJ7B5gj7wF26Hk42Pl0ux8mtttLxDmOEgqTlc/sZoZa4
+hG7HgdFSFinxVeo/Uui+n6v44ukby97Gnsxxlv38p6PqX9X6b/WGOXwZax7i5g/snn5rcAAAAEAc
+BXfiHxDHnxxx44yri4iZfkFkIEGy8v8A4waL7Oj1WVgmum4OtA7Atc0OPzK85XttlbLWOrsaHseC
+HNcJBB7ELCP1K+rxv9b7O6Jn0t7tn3TP4o8h8Rx4MXt5Iy0JMTHx7qlAk2Gl/i8ovr6ZkWvBFVtv
+6Ke+0Q5w/J8l1ajVVXTW2qpoZWwQ1jRAAHYBSWfzGb3s08tcPGbpeBQpSSSSiS8d+xGf8/PU2/od
+n22I03fQ/wDPmqS6z7Oz7V9pj3+n6c+W7ckrv36fc/7m9j+1bw/9K0oIIBHB4SVPo2SMvpOHkAzv
+pZP9YCHfiFcVOcTGUoneJI+xKkkkkEqSSSSUpJJJJSkkkklKSSSSUrySWX+0m/8AOT9mz/2l9T+3
+v4/zUlL7E+3+T93/AAUX+dOP/i+6kLsC3p7z+kxnb2D/AIN+v4O/KusXkHROq2dJ6lVmMktadtrB
++dW76Q/u8165j305NFeRQ4PqtaHMcO4KufFOXOPOcgHoza/4XUftWwNiuzMkASeFiYv1u6Nk59mC
+LdjmO212v0rtPfa74+PK2yARB1BXKdc+ouLmOdkdNcMa86uqP804+UfR/Iq3LR5eRlHPKUOIeiQ2
+B8Uyvo9WkvNmZv1u+rf6O1rzjt0AsHq0/wBl44+RWjj/AOMd4AGTggnu6uyP+i5p/Kp5fDM/zYjD
+PDpKEh+1HGOuj3CS41/+MfFA9mFYXeBeAPwBWfk/XzrOWfSwMdlLnaDaDbZ8u34IR+Gc2d4CA7yk
+K/BXHF7nP6jhdOoORmWtqrHE8uPg0ckqt0Tr2F1ql9mNLH1uh9T43Afmu07FcbifVP6wdavGT1Wx
+1LDy+47rI8G19vnC7bpPRsDpFHo4dcE/zlrtXvP8pyGfDy2HGYjJ72e94fJHwSDInag3kznNY0uc
+Ya0SSeAAnXLfXnrgw8L9m0O/WcofpI5ZV3/zuPvVfBhlmyxxx/SO/YdSkmhbyv7fd/zp/bEn0/W4
+/wCB/m4/zEliJLqfu2L93/Jez/gdmCz+NqXUfVH60fsx4wc1x+w2H2POvouPf+qe/wB65dJHNhhm
+xnHMWD9oPcKBINh9ta5r2h7CHNcJa4agg9wnXmH1f+tuZ0iKLQcjC/0RPuZ/xZ/gvQemda6b1Wvf
+h3B7vzqj7bG/FpXN81yOXlySRxw6TG317M0ZAt7nQqnf0bpORrdhUvJ7mts/eBKuJKrGUom4kx8j
+SXNZ9W+gsMjApnzbP5VeoxcbHEY9LKR4VtDf+pCIknSy5JfNOUv7xJVQUkmc5rGlzyGtGpJMABcv
+1z684WG11HTYysnj1P8ABMPx/O+X3p2HBlzS4ccTL8h5lRIG7qdf6/i9FxfUsIfkvB9CidXHxPg0
+LyzMzMjOybMrJdvutO5zv4DyCWZmZOdkOycqw23P+k535B4BBXR8lyUeWj+9kl80v2DwYZSvyUkk
+kri1SSSSSlIlHr+q37Pv9afZ6c758tuqSSB2P7dlPc9E/wCfm1vqbPR0j7b9KP7H6T711mP9q2D7
+V6e/v6e6P+kkkuZ575z/ALm3/wAh+1nj9fql+Cy+p/8AOTaf2b9l/wCub9/y/NSSVfB84/m/+q/K
+k/X6PA9f/wCdO4/tj1vTnT/Q/L0/YsNJJdTy381H+a/6j8n0YDv1+qkkklMhSSSSSn//2Q==" preserveAspectRatio="xMaxYMax meet" width="30" height="60" />
+ </g>
+ </g>
+ <g id="slice-group-1" transform="translate(120, 185)">
+ <text x="0" y="-20">---------- slice -------------------------</text>
+ <g>
+ <text y="-5">xMin*</text>&Viewport2;
+ <image xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAAHgAA/+4ADkFkb2JlAGTAAAAAAf/b
+AIQAEAsLCwwLEAwMEBcPDQ8XGxQQEBQbHxcXFxcXHx4XGhoaGhceHiMlJyUjHi8vMzMvL0BAQEBA
+QEBAQEBAQEBAQAERDw8RExEVEhIVFBEUERQaFBYWFBomGhocGhomMCMeHh4eIzArLicnJy4rNTUw
+MDU1QEA/QEBAQEBAQEBAQEBA/8AAEQgAZABkAwEiAAIRAQMRAf/EAT8AAAEFAQEBAQEBAAAAAAAA
+AAMAAQIEBQYHCAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUD
+DDMBAAIRAwQhEjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1Rk
+RcKjdDYX0lXiZfKzhMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX
+5/cRAAICAQIEBAMEBQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1MV
+Y3M08SUGFqKygwcmNcLSRJNUoxdkRVU2dGXi8rOEw9N14/NGlKSFtJXE1OT0pbXF1eX1VmZ2hpam
+tsbW5vYnN0dXZ3eHl6e3x//aAAwDAQACEQMRAD8A8/SSR8LCyc/JZi4rDZdYYa0flPgAgSACSaA1
+JKkLWuc4NaC5x0AGpJXT9J+onUcwC3Od9jpOoYRutI/q/m/P7l1X1f8Aqth9HYLXgX5xHuuI0b5V
+g8fHlbixOa+LSsw5fQf5w7/QMscfdxcL6n9BwwP1cXvH5953/wDR+j+C1qsbHoEU1MqHgxob+RES
+WVPNlyG5zlP+8bXgAbBRAIgiR4Knk9G6TlgjIw6Xz32AO/zhBVxJNjOUTcZGJ8DSnk+pf4v8C4F/
+T7XY1nZj/fX/AOSH4rjOq9E6l0mzZmVFrSYZa33Vu+Dv4L19Qvx6Mmp1GRW22p4hzHCQQtDl/imf
+GQMh96Hj830P8VpgDto+KJLqPrR9UX9M3ZuCDZgzL2cupn8rfP71y63sObHmgJ4zYP2g9ixEEGip
+JJJSoXa1znBrQS5xgAckleo/Vb6vM6Phh9oBzrwDc790cisfDv5rlfqJ0kZnUXZ1rZpw4LJ4Nrvo
+/wCbz9y9GWH8W5o8X3eB0GuTz6Blxx6qSSVDrPWcTo2J9pyZcXHbVU36T3eA/iVkwhKchCAMpS0A
+C9vpLiKP8YxNwGRhbaCdSx8vA+BABXZ42TTl49eTjuD6bWhzHDuCpc/K5sFe7DhEtjdj8FCQOyRJ
+Vuo9Qxum4lmZlO21V+GpcTw1o8SuQP8AjHd62mCPQn/Se+P82EsHKZ8wMsUOIR62Br9UGQG73CSq
+9M6li9Uw2ZmK6a36EHRzXDlrh4hWlDKJjIxkKMTRBXLOa17Sx4DmuBDmnUEHsV5j9bfq/wDsfMFt
+AP2LIJNX8h3ev+5enqj1rplfVem3Yb43PE1OP5tjdWlWuR5o8vlBJ9E9Jjw7/RbKNh8fSRPQu9f7
+PtPrb/T2d987dv3pLqLHfx+jA+ofU/CGH0HHkQ+8G9/9v6P/AEYW0h41Qox6qRxUxrB/ZEIi4/NM
+5Ms5n9ORl9rYAoAKXEf4xqLicLIAJoaHsJ7B5gj7wF26Hk42Pl0ux8mtttLxDmOEgqTlc/sZoZa4
+hG7HgdFSFinxVeo/Uui+n6v44ukby97Gnsxxlv38p6PqX9X6b/WGOXwZax7i5g/snn5rcAAAAEAc
+BXfiHxDHnxxx44yri4iZfkFkIEGy8v8A4waL7Oj1WVgmum4OtA7Atc0OPzK85XttlbLWOrsaHseC
+HNcJBB7ELCP1K+rxv9b7O6Jn0t7tn3TP4o8h8Rx4MXt5Iy0JMTHx7qlAk2Gl/i8ovr6ZkWvBFVtv
+6Ke+0Q5w/J8l1ajVVXTW2qpoZWwQ1jRAAHYBSWfzGb3s08tcPGbpeBQpSSSSiS8d+xGf8/PU2/od
+n22I03fQ/wDPmqS6z7Oz7V9pj3+n6c+W7ckrv36fc/7m9j+1bw/9K0oIIBHB4SVPo2SMvpOHkAzv
+pZP9YCHfiFcVOcTGUoneJI+xKkkkkEqSSSSUpJJJJSkkkklKSSSSUrySWX+0m/8AOT9mz/2l9T+3
+v4/zUlL7E+3+T93/AAUX+dOP/i+6kLsC3p7z+kxnb2D/AIN+v4O/KusXkHROq2dJ6lVmMktadtrB
++dW76Q/u8165j305NFeRQ4PqtaHMcO4KufFOXOPOcgHoza/4XUftWwNiuzMkASeFiYv1u6Nk59mC
+LdjmO212v0rtPfa74+PK2yARB1BXKdc+ouLmOdkdNcMa86uqP804+UfR/Iq3LR5eRlHPKUOIeiQ2
+B8Uyvo9WkvNmZv1u+rf6O1rzjt0AsHq0/wBl44+RWjj/AOMd4AGTggnu6uyP+i5p/Kp5fDM/zYjD
+PDpKEh+1HGOuj3CS41/+MfFA9mFYXeBeAPwBWfk/XzrOWfSwMdlLnaDaDbZ8u34IR+Gc2d4CA7yk
+K/BXHF7nP6jhdOoORmWtqrHE8uPg0ckqt0Tr2F1ql9mNLH1uh9T43Afmu07FcbifVP6wdavGT1Wx
+1LDy+47rI8G19vnC7bpPRsDpFHo4dcE/zlrtXvP8pyGfDy2HGYjJ72e94fJHwSDInag3kznNY0uc
+Ya0SSeAAnXLfXnrgw8L9m0O/WcofpI5ZV3/zuPvVfBhlmyxxx/SO/YdSkmhbyv7fd/zp/bEn0/W4
+/wCB/m4/zEliJLqfu2L93/Jez/gdmCz+NqXUfVH60fsx4wc1x+w2H2POvouPf+qe/wB65dJHNhhm
+xnHMWD9oPcKBINh9ta5r2h7CHNcJa4agg9wnXmH1f+tuZ0iKLQcjC/0RPuZ/xZ/gvQemda6b1Wvf
+h3B7vzqj7bG/FpXN81yOXlySRxw6TG317M0ZAt7nQqnf0bpORrdhUvJ7mts/eBKuJKrGUom4kx8j
+SXNZ9W+gsMjApnzbP5VeoxcbHEY9LKR4VtDf+pCIknSy5JfNOUv7xJVQUkmc5rGlzyGtGpJMABcv
+1z684WG11HTYysnj1P8ABMPx/O+X3p2HBlzS4ccTL8h5lRIG7qdf6/i9FxfUsIfkvB9CidXHxPg0
+LyzMzMjOybMrJdvutO5zv4DyCWZmZOdkOycqw23P+k535B4BBXR8lyUeWj+9kl80v2DwYZSvyUkk
+kri1SSSSSlIlHr+q37Pv9afZ6c758tuqSSB2P7dlPc9E/wCfm1vqbPR0j7b9KP7H6T711mP9q2D7
+V6e/v6e6P+kkkuZ575z/ALm3/wAh+1nj9fql+Cy+p/8AOTaf2b9l/wCub9/y/NSSVfB84/m/+q/K
+k/X6PA9f/wCdO4/tj1vTnT/Q/L0/YsNJJdTy381H+a/6j8n0YDv1+qkkklMhSSSSSn//2Q==" preserveAspectRatio="xMinYMin slice" width="30" height="60" />
+ </g>
+ <g transform="translate(50,0)">
+ <text y="-5">xMid*</text>&Viewport2;
+ <image xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAAHgAA/+4ADkFkb2JlAGTAAAAAAf/b
+AIQAEAsLCwwLEAwMEBcPDQ8XGxQQEBQbHxcXFxcXHx4XGhoaGhceHiMlJyUjHi8vMzMvL0BAQEBA
+QEBAQEBAQEBAQAERDw8RExEVEhIVFBEUERQaFBYWFBomGhocGhomMCMeHh4eIzArLicnJy4rNTUw
+MDU1QEA/QEBAQEBAQEBAQEBA/8AAEQgAZABkAwEiAAIRAQMRAf/EAT8AAAEFAQEBAQEBAAAAAAAA
+AAMAAQIEBQYHCAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUD
+DDMBAAIRAwQhEjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1Rk
+RcKjdDYX0lXiZfKzhMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX
+5/cRAAICAQIEBAMEBQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1MV
+Y3M08SUGFqKygwcmNcLSRJNUoxdkRVU2dGXi8rOEw9N14/NGlKSFtJXE1OT0pbXF1eX1VmZ2hpam
+tsbW5vYnN0dXZ3eHl6e3x//aAAwDAQACEQMRAD8A8/SSR8LCyc/JZi4rDZdYYa0flPgAgSACSaA1
+JKkLWuc4NaC5x0AGpJXT9J+onUcwC3Od9jpOoYRutI/q/m/P7l1X1f8Aqth9HYLXgX5xHuuI0b5V
+g8fHlbixOa+LSsw5fQf5w7/QMscfdxcL6n9BwwP1cXvH5953/wDR+j+C1qsbHoEU1MqHgxob+RES
+WVPNlyG5zlP+8bXgAbBRAIgiR4Knk9G6TlgjIw6Xz32AO/zhBVxJNjOUTcZGJ8DSnk+pf4v8C4F/
+T7XY1nZj/fX/AOSH4rjOq9E6l0mzZmVFrSYZa33Vu+Dv4L19Qvx6Mmp1GRW22p4hzHCQQtDl/imf
+GQMh96Hj830P8VpgDto+KJLqPrR9UX9M3ZuCDZgzL2cupn8rfP71y63sObHmgJ4zYP2g9ixEEGip
+JJJSoXa1znBrQS5xgAckleo/Vb6vM6Phh9oBzrwDc790cisfDv5rlfqJ0kZnUXZ1rZpw4LJ4Nrvo
+/wCbz9y9GWH8W5o8X3eB0GuTz6Blxx6qSSVDrPWcTo2J9pyZcXHbVU36T3eA/iVkwhKchCAMpS0A
+C9vpLiKP8YxNwGRhbaCdSx8vA+BABXZ42TTl49eTjuD6bWhzHDuCpc/K5sFe7DhEtjdj8FCQOyRJ
+Vuo9Qxum4lmZlO21V+GpcTw1o8SuQP8AjHd62mCPQn/Se+P82EsHKZ8wMsUOIR62Br9UGQG73CSq
+9M6li9Uw2ZmK6a36EHRzXDlrh4hWlDKJjIxkKMTRBXLOa17Sx4DmuBDmnUEHsV5j9bfq/wDsfMFt
+AP2LIJNX8h3ev+5enqj1rplfVem3Yb43PE1OP5tjdWlWuR5o8vlBJ9E9Jjw7/RbKNh8fSRPQu9f7
+PtPrb/T2d987dv3pLqLHfx+jA+ofU/CGH0HHkQ+8G9/9v6P/AEYW0h41Qox6qRxUxrB/ZEIi4/NM
+5Ms5n9ORl9rYAoAKXEf4xqLicLIAJoaHsJ7B5gj7wF26Hk42Pl0ux8mtttLxDmOEgqTlc/sZoZa4
+hG7HgdFSFinxVeo/Uui+n6v44ukby97Gnsxxlv38p6PqX9X6b/WGOXwZax7i5g/snn5rcAAAAEAc
+BXfiHxDHnxxx44yri4iZfkFkIEGy8v8A4waL7Oj1WVgmum4OtA7Atc0OPzK85XttlbLWOrsaHseC
+HNcJBB7ELCP1K+rxv9b7O6Jn0t7tn3TP4o8h8Rx4MXt5Iy0JMTHx7qlAk2Gl/i8ovr6ZkWvBFVtv
+6Ke+0Q5w/J8l1ajVVXTW2qpoZWwQ1jRAAHYBSWfzGb3s08tcPGbpeBQpSSSSiS8d+xGf8/PU2/od
+n22I03fQ/wDPmqS6z7Oz7V9pj3+n6c+W7ckrv36fc/7m9j+1bw/9K0oIIBHB4SVPo2SMvpOHkAzv
+pZP9YCHfiFcVOcTGUoneJI+xKkkkkEqSSSSUpJJJJSkkkklKSSSSUrySWX+0m/8AOT9mz/2l9T+3
+v4/zUlL7E+3+T93/AAUX+dOP/i+6kLsC3p7z+kxnb2D/AIN+v4O/KusXkHROq2dJ6lVmMktadtrB
++dW76Q/u8165j305NFeRQ4PqtaHMcO4KufFOXOPOcgHoza/4XUftWwNiuzMkASeFiYv1u6Nk59mC
+LdjmO212v0rtPfa74+PK2yARB1BXKdc+ouLmOdkdNcMa86uqP804+UfR/Iq3LR5eRlHPKUOIeiQ2
+B8Uyvo9WkvNmZv1u+rf6O1rzjt0AsHq0/wBl44+RWjj/AOMd4AGTggnu6uyP+i5p/Kp5fDM/zYjD
+PDpKEh+1HGOuj3CS41/+MfFA9mFYXeBeAPwBWfk/XzrOWfSwMdlLnaDaDbZ8u34IR+Gc2d4CA7yk
+K/BXHF7nP6jhdOoORmWtqrHE8uPg0ckqt0Tr2F1ql9mNLH1uh9T43Afmu07FcbifVP6wdavGT1Wx
+1LDy+47rI8G19vnC7bpPRsDpFHo4dcE/zlrtXvP8pyGfDy2HGYjJ72e94fJHwSDInag3kznNY0uc
+Ya0SSeAAnXLfXnrgw8L9m0O/WcofpI5ZV3/zuPvVfBhlmyxxx/SO/YdSkmhbyv7fd/zp/bEn0/W4
+/wCB/m4/zEliJLqfu2L93/Jez/gdmCz+NqXUfVH60fsx4wc1x+w2H2POvouPf+qe/wB65dJHNhhm
+xnHMWD9oPcKBINh9ta5r2h7CHNcJa4agg9wnXmH1f+tuZ0iKLQcjC/0RPuZ/xZ/gvQemda6b1Wvf
+h3B7vzqj7bG/FpXN81yOXlySRxw6TG317M0ZAt7nQqnf0bpORrdhUvJ7mts/eBKuJKrGUom4kx8j
+SXNZ9W+gsMjApnzbP5VeoxcbHEY9LKR4VtDf+pCIknSy5JfNOUv7xJVQUkmc5rGlzyGtGpJMABcv
+1z684WG11HTYysnj1P8ABMPx/O+X3p2HBlzS4ccTL8h5lRIG7qdf6/i9FxfUsIfkvB9CidXHxPg0
+LyzMzMjOybMrJdvutO5zv4DyCWZmZOdkOycqw23P+k535B4BBXR8lyUeWj+9kl80v2DwYZSvyUkk
+kri1SSSSSlIlHr+q37Pv9afZ6c758tuqSSB2P7dlPc9E/wCfm1vqbPR0j7b9KP7H6T711mP9q2D7
+V6e/v6e6P+kkkuZ575z/ALm3/wAh+1nj9fql+Cy+p/8AOTaf2b9l/wCub9/y/NSSVfB84/m/+q/K
+k/X6PA9f/wCdO4/tj1vTnT/Q/L0/YsNJJdTy381H+a/6j8n0YDv1+qkkklMhSSSSSn//2Q==" preserveAspectRatio="xMidYMid slice" width="30" height="60" />
+ </g>
+ <g transform="translate(100,0)">
+ <text y="-5">xMax*</text>&Viewport2;
+ <image xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAAHgAA/+4ADkFkb2JlAGTAAAAAAf/b
+AIQAEAsLCwwLEAwMEBcPDQ8XGxQQEBQbHxcXFxcXHx4XGhoaGhceHiMlJyUjHi8vMzMvL0BAQEBA
+QEBAQEBAQEBAQAERDw8RExEVEhIVFBEUERQaFBYWFBomGhocGhomMCMeHh4eIzArLicnJy4rNTUw
+MDU1QEA/QEBAQEBAQEBAQEBA/8AAEQgAZABkAwEiAAIRAQMRAf/EAT8AAAEFAQEBAQEBAAAAAAAA
+AAMAAQIEBQYHCAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUD
+DDMBAAIRAwQhEjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1Rk
+RcKjdDYX0lXiZfKzhMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX
+5/cRAAICAQIEBAMEBQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1MV
+Y3M08SUGFqKygwcmNcLSRJNUoxdkRVU2dGXi8rOEw9N14/NGlKSFtJXE1OT0pbXF1eX1VmZ2hpam
+tsbW5vYnN0dXZ3eHl6e3x//aAAwDAQACEQMRAD8A8/SSR8LCyc/JZi4rDZdYYa0flPgAgSACSaA1
+JKkLWuc4NaC5x0AGpJXT9J+onUcwC3Od9jpOoYRutI/q/m/P7l1X1f8Aqth9HYLXgX5xHuuI0b5V
+g8fHlbixOa+LSsw5fQf5w7/QMscfdxcL6n9BwwP1cXvH5953/wDR+j+C1qsbHoEU1MqHgxob+RES
+WVPNlyG5zlP+8bXgAbBRAIgiR4Knk9G6TlgjIw6Xz32AO/zhBVxJNjOUTcZGJ8DSnk+pf4v8C4F/
+T7XY1nZj/fX/AOSH4rjOq9E6l0mzZmVFrSYZa33Vu+Dv4L19Qvx6Mmp1GRW22p4hzHCQQtDl/imf
+GQMh96Hj830P8VpgDto+KJLqPrR9UX9M3ZuCDZgzL2cupn8rfP71y63sObHmgJ4zYP2g9ixEEGip
+JJJSoXa1znBrQS5xgAckleo/Vb6vM6Phh9oBzrwDc790cisfDv5rlfqJ0kZnUXZ1rZpw4LJ4Nrvo
+/wCbz9y9GWH8W5o8X3eB0GuTz6Blxx6qSSVDrPWcTo2J9pyZcXHbVU36T3eA/iVkwhKchCAMpS0A
+C9vpLiKP8YxNwGRhbaCdSx8vA+BABXZ42TTl49eTjuD6bWhzHDuCpc/K5sFe7DhEtjdj8FCQOyRJ
+Vuo9Qxum4lmZlO21V+GpcTw1o8SuQP8AjHd62mCPQn/Se+P82EsHKZ8wMsUOIR62Br9UGQG73CSq
+9M6li9Uw2ZmK6a36EHRzXDlrh4hWlDKJjIxkKMTRBXLOa17Sx4DmuBDmnUEHsV5j9bfq/wDsfMFt
+AP2LIJNX8h3ev+5enqj1rplfVem3Yb43PE1OP5tjdWlWuR5o8vlBJ9E9Jjw7/RbKNh8fSRPQu9f7
+PtPrb/T2d987dv3pLqLHfx+jA+ofU/CGH0HHkQ+8G9/9v6P/AEYW0h41Qox6qRxUxrB/ZEIi4/NM
+5Ms5n9ORl9rYAoAKXEf4xqLicLIAJoaHsJ7B5gj7wF26Hk42Pl0ux8mtttLxDmOEgqTlc/sZoZa4
+hG7HgdFSFinxVeo/Uui+n6v44ukby97Gnsxxlv38p6PqX9X6b/WGOXwZax7i5g/snn5rcAAAAEAc
+BXfiHxDHnxxx44yri4iZfkFkIEGy8v8A4waL7Oj1WVgmum4OtA7Atc0OPzK85XttlbLWOrsaHseC
+HNcJBB7ELCP1K+rxv9b7O6Jn0t7tn3TP4o8h8Rx4MXt5Iy0JMTHx7qlAk2Gl/i8ovr6ZkWvBFVtv
+6Ke+0Q5w/J8l1ajVVXTW2qpoZWwQ1jRAAHYBSWfzGb3s08tcPGbpeBQpSSSSiS8d+xGf8/PU2/od
+n22I03fQ/wDPmqS6z7Oz7V9pj3+n6c+W7ckrv36fc/7m9j+1bw/9K0oIIBHB4SVPo2SMvpOHkAzv
+pZP9YCHfiFcVOcTGUoneJI+xKkkkkEqSSSSUpJJJJSkkkklKSSSSUrySWX+0m/8AOT9mz/2l9T+3
+v4/zUlL7E+3+T93/AAUX+dOP/i+6kLsC3p7z+kxnb2D/AIN+v4O/KusXkHROq2dJ6lVmMktadtrB
++dW76Q/u8165j305NFeRQ4PqtaHMcO4KufFOXOPOcgHoza/4XUftWwNiuzMkASeFiYv1u6Nk59mC
+LdjmO212v0rtPfa74+PK2yARB1BXKdc+ouLmOdkdNcMa86uqP804+UfR/Iq3LR5eRlHPKUOIeiQ2
+B8Uyvo9WkvNmZv1u+rf6O1rzjt0AsHq0/wBl44+RWjj/AOMd4AGTggnu6uyP+i5p/Kp5fDM/zYjD
+PDpKEh+1HGOuj3CS41/+MfFA9mFYXeBeAPwBWfk/XzrOWfSwMdlLnaDaDbZ8u34IR+Gc2d4CA7yk
+K/BXHF7nP6jhdOoORmWtqrHE8uPg0ckqt0Tr2F1ql9mNLH1uh9T43Afmu07FcbifVP6wdavGT1Wx
+1LDy+47rI8G19vnC7bpPRsDpFHo4dcE/zlrtXvP8pyGfDy2HGYjJ72e94fJHwSDInag3kznNY0uc
+Ya0SSeAAnXLfXnrgw8L9m0O/WcofpI5ZV3/zuPvVfBhlmyxxx/SO/YdSkmhbyv7fd/zp/bEn0/W4
+/wCB/m4/zEliJLqfu2L93/Jez/gdmCz+NqXUfVH60fsx4wc1x+w2H2POvouPf+qe/wB65dJHNhhm
+xnHMWD9oPcKBINh9ta5r2h7CHNcJa4agg9wnXmH1f+tuZ0iKLQcjC/0RPuZ/xZ/gvQemda6b1Wvf
+h3B7vzqj7bG/FpXN81yOXlySRxw6TG317M0ZAt7nQqnf0bpORrdhUvJ7mts/eBKuJKrGUom4kx8j
+SXNZ9W+gsMjApnzbP5VeoxcbHEY9LKR4VtDf+pCIknSy5JfNOUv7xJVQUkmc5rGlzyGtGpJMABcv
+1z684WG11HTYysnj1P8ABMPx/O+X3p2HBlzS4ccTL8h5lRIG7qdf6/i9FxfUsIfkvB9CidXHxPg0
+LyzMzMjOybMrJdvutO5zv4DyCWZmZOdkOycqw23P+k535B4BBXR8lyUeWj+9kl80v2DwYZSvyUkk
+kri1SSSSSlIlHr+q37Pv9afZ6c758tuqSSB2P7dlPc9E/wCfm1vqbPR0j7b9KP7H6T711mP9q2D7
+V6e/v6e6P+kkkuZ575z/ALm3/wAh+1nj9fql+Cy+p/8AOTaf2b9l/wCub9/y/NSSVfB84/m/+q/K
+k/X6PA9f/wCdO4/tj1vTnT/Q/L0/YsNJJdTy381H+a/6j8n0YDv1+qkkklMhSSSSSn//2Q==" preserveAspectRatio="xMaxYMax slice" width="30" height="60" />
+ </g>
+ </g>
+ <g id="slide-group-2" transform="translate(300, 155) translate(0, 30)">
+ <text x="0" y="-20">---------- slice ---------------------</text>
+ <g>
+ <text y="-5">*YMin</text>&Viewport1;
+ <image xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAAHgAA/+4ADkFkb2JlAGTAAAAAAf/b
+AIQAEAsLCwwLEAwMEBcPDQ8XGxQQEBQbHxcXFxcXHx4XGhoaGhceHiMlJyUjHi8vMzMvL0BAQEBA
+QEBAQEBAQEBAQAERDw8RExEVEhIVFBEUERQaFBYWFBomGhocGhomMCMeHh4eIzArLicnJy4rNTUw
+MDU1QEA/QEBAQEBAQEBAQEBA/8AAEQgAZABkAwEiAAIRAQMRAf/EAT8AAAEFAQEBAQEBAAAAAAAA
+AAMAAQIEBQYHCAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUD
+DDMBAAIRAwQhEjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1Rk
+RcKjdDYX0lXiZfKzhMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX
+5/cRAAICAQIEBAMEBQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1MV
+Y3M08SUGFqKygwcmNcLSRJNUoxdkRVU2dGXi8rOEw9N14/NGlKSFtJXE1OT0pbXF1eX1VmZ2hpam
+tsbW5vYnN0dXZ3eHl6e3x//aAAwDAQACEQMRAD8A8/SSR8LCyc/JZi4rDZdYYa0flPgAgSACSaA1
+JKkLWuc4NaC5x0AGpJXT9J+onUcwC3Od9jpOoYRutI/q/m/P7l1X1f8Aqth9HYLXgX5xHuuI0b5V
+g8fHlbixOa+LSsw5fQf5w7/QMscfdxcL6n9BwwP1cXvH5953/wDR+j+C1qsbHoEU1MqHgxob+RES
+WVPNlyG5zlP+8bXgAbBRAIgiR4Knk9G6TlgjIw6Xz32AO/zhBVxJNjOUTcZGJ8DSnk+pf4v8C4F/
+T7XY1nZj/fX/AOSH4rjOq9E6l0mzZmVFrSYZa33Vu+Dv4L19Qvx6Mmp1GRW22p4hzHCQQtDl/imf
+GQMh96Hj830P8VpgDto+KJLqPrR9UX9M3ZuCDZgzL2cupn8rfP71y63sObHmgJ4zYP2g9ixEEGip
+JJJSoXa1znBrQS5xgAckleo/Vb6vM6Phh9oBzrwDc790cisfDv5rlfqJ0kZnUXZ1rZpw4LJ4Nrvo
+/wCbz9y9GWH8W5o8X3eB0GuTz6Blxx6qSSVDrPWcTo2J9pyZcXHbVU36T3eA/iVkwhKchCAMpS0A
+C9vpLiKP8YxNwGRhbaCdSx8vA+BABXZ42TTl49eTjuD6bWhzHDuCpc/K5sFe7DhEtjdj8FCQOyRJ
+Vuo9Qxum4lmZlO21V+GpcTw1o8SuQP8AjHd62mCPQn/Se+P82EsHKZ8wMsUOIR62Br9UGQG73CSq
+9M6li9Uw2ZmK6a36EHRzXDlrh4hWlDKJjIxkKMTRBXLOa17Sx4DmuBDmnUEHsV5j9bfq/wDsfMFt
+AP2LIJNX8h3ev+5enqj1rplfVem3Yb43PE1OP5tjdWlWuR5o8vlBJ9E9Jjw7/RbKNh8fSRPQu9f7
+PtPrb/T2d987dv3pLqLHfx+jA+ofU/CGH0HHkQ+8G9/9v6P/AEYW0h41Qox6qRxUxrB/ZEIi4/NM
+5Ms5n9ORl9rYAoAKXEf4xqLicLIAJoaHsJ7B5gj7wF26Hk42Pl0ux8mtttLxDmOEgqTlc/sZoZa4
+hG7HgdFSFinxVeo/Uui+n6v44ukby97Gnsxxlv38p6PqX9X6b/WGOXwZax7i5g/snn5rcAAAAEAc
+BXfiHxDHnxxx44yri4iZfkFkIEGy8v8A4waL7Oj1WVgmum4OtA7Atc0OPzK85XttlbLWOrsaHseC
+HNcJBB7ELCP1K+rxv9b7O6Jn0t7tn3TP4o8h8Rx4MXt5Iy0JMTHx7qlAk2Gl/i8ovr6ZkWvBFVtv
+6Ke+0Q5w/J8l1ajVVXTW2qpoZWwQ1jRAAHYBSWfzGb3s08tcPGbpeBQpSSSSiS8d+xGf8/PU2/od
+n22I03fQ/wDPmqS6z7Oz7V9pj3+n6c+W7ckrv36fc/7m9j+1bw/9K0oIIBHB4SVPo2SMvpOHkAzv
+pZP9YCHfiFcVOcTGUoneJI+xKkkkkEqSSSSUpJJJJSkkkklKSSSSUrySWX+0m/8AOT9mz/2l9T+3
+v4/zUlL7E+3+T93/AAUX+dOP/i+6kLsC3p7z+kxnb2D/AIN+v4O/KusXkHROq2dJ6lVmMktadtrB
++dW76Q/u8165j305NFeRQ4PqtaHMcO4KufFOXOPOcgHoza/4XUftWwNiuzMkASeFiYv1u6Nk59mC
+LdjmO212v0rtPfa74+PK2yARB1BXKdc+ouLmOdkdNcMa86uqP804+UfR/Iq3LR5eRlHPKUOIeiQ2
+B8Uyvo9WkvNmZv1u+rf6O1rzjt0AsHq0/wBl44+RWjj/AOMd4AGTggnu6uyP+i5p/Kp5fDM/zYjD
+PDpKEh+1HGOuj3CS41/+MfFA9mFYXeBeAPwBWfk/XzrOWfSwMdlLnaDaDbZ8u34IR+Gc2d4CA7yk
+K/BXHF7nP6jhdOoORmWtqrHE8uPg0ckqt0Tr2F1ql9mNLH1uh9T43Afmu07FcbifVP6wdavGT1Wx
+1LDy+47rI8G19vnC7bpPRsDpFHo4dcE/zlrtXvP8pyGfDy2HGYjJ72e94fJHwSDInag3kznNY0uc
+Ya0SSeAAnXLfXnrgw8L9m0O/WcofpI5ZV3/zuPvVfBhlmyxxx/SO/YdSkmhbyv7fd/zp/bEn0/W4
+/wCB/m4/zEliJLqfu2L93/Jez/gdmCz+NqXUfVH60fsx4wc1x+w2H2POvouPf+qe/wB65dJHNhhm
+xnHMWD9oPcKBINh9ta5r2h7CHNcJa4agg9wnXmH1f+tuZ0iKLQcjC/0RPuZ/xZ/gvQemda6b1Wvf
+h3B7vzqj7bG/FpXN81yOXlySRxw6TG317M0ZAt7nQqnf0bpORrdhUvJ7mts/eBKuJKrGUom4kx8j
+SXNZ9W+gsMjApnzbP5VeoxcbHEY9LKR4VtDf+pCIknSy5JfNOUv7xJVQUkmc5rGlzyGtGpJMABcv
+1z684WG11HTYysnj1P8ABMPx/O+X3p2HBlzS4ccTL8h5lRIG7qdf6/i9FxfUsIfkvB9CidXHxPg0
+LyzMzMjOybMrJdvutO5zv4DyCWZmZOdkOycqw23P+k535B4BBXR8lyUeWj+9kl80v2DwYZSvyUkk
+kri1SSSSSlIlHr+q37Pv9afZ6c758tuqSSB2P7dlPc9E/wCfm1vqbPR0j7b9KP7H6T711mP9q2D7
+V6e/v6e6P+kkkuZ575z/ALm3/wAh+1nj9fql+Cy+p/8AOTaf2b9l/wCub9/y/NSSVfB84/m/+q/K
+k/X6PA9f/wCdO4/tj1vTnT/Q/L0/YsNJJdTy381H+a/6j8n0YDv1+qkkklMhSSSSSn//2Q==" preserveAspectRatio="xMinYMin slice" width="50" height="30" />
+ </g>
+ <g transform="translate(70,0)">
+ <text y="-5">*YMid</text>&Viewport1;
+ <image xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAAHgAA/+4ADkFkb2JlAGTAAAAAAf/b
+AIQAEAsLCwwLEAwMEBcPDQ8XGxQQEBQbHxcXFxcXHx4XGhoaGhceHiMlJyUjHi8vMzMvL0BAQEBA
+QEBAQEBAQEBAQAERDw8RExEVEhIVFBEUERQaFBYWFBomGhocGhomMCMeHh4eIzArLicnJy4rNTUw
+MDU1QEA/QEBAQEBAQEBAQEBA/8AAEQgAZABkAwEiAAIRAQMRAf/EAT8AAAEFAQEBAQEBAAAAAAAA
+AAMAAQIEBQYHCAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUD
+DDMBAAIRAwQhEjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1Rk
+RcKjdDYX0lXiZfKzhMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX
+5/cRAAICAQIEBAMEBQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1MV
+Y3M08SUGFqKygwcmNcLSRJNUoxdkRVU2dGXi8rOEw9N14/NGlKSFtJXE1OT0pbXF1eX1VmZ2hpam
+tsbW5vYnN0dXZ3eHl6e3x//aAAwDAQACEQMRAD8A8/SSR8LCyc/JZi4rDZdYYa0flPgAgSACSaA1
+JKkLWuc4NaC5x0AGpJXT9J+onUcwC3Od9jpOoYRutI/q/m/P7l1X1f8Aqth9HYLXgX5xHuuI0b5V
+g8fHlbixOa+LSsw5fQf5w7/QMscfdxcL6n9BwwP1cXvH5953/wDR+j+C1qsbHoEU1MqHgxob+RES
+WVPNlyG5zlP+8bXgAbBRAIgiR4Knk9G6TlgjIw6Xz32AO/zhBVxJNjOUTcZGJ8DSnk+pf4v8C4F/
+T7XY1nZj/fX/AOSH4rjOq9E6l0mzZmVFrSYZa33Vu+Dv4L19Qvx6Mmp1GRW22p4hzHCQQtDl/imf
+GQMh96Hj830P8VpgDto+KJLqPrR9UX9M3ZuCDZgzL2cupn8rfP71y63sObHmgJ4zYP2g9ixEEGip
+JJJSoXa1znBrQS5xgAckleo/Vb6vM6Phh9oBzrwDc790cisfDv5rlfqJ0kZnUXZ1rZpw4LJ4Nrvo
+/wCbz9y9GWH8W5o8X3eB0GuTz6Blxx6qSSVDrPWcTo2J9pyZcXHbVU36T3eA/iVkwhKchCAMpS0A
+C9vpLiKP8YxNwGRhbaCdSx8vA+BABXZ42TTl49eTjuD6bWhzHDuCpc/K5sFe7DhEtjdj8FCQOyRJ
+Vuo9Qxum4lmZlO21V+GpcTw1o8SuQP8AjHd62mCPQn/Se+P82EsHKZ8wMsUOIR62Br9UGQG73CSq
+9M6li9Uw2ZmK6a36EHRzXDlrh4hWlDKJjIxkKMTRBXLOa17Sx4DmuBDmnUEHsV5j9bfq/wDsfMFt
+AP2LIJNX8h3ev+5enqj1rplfVem3Yb43PE1OP5tjdWlWuR5o8vlBJ9E9Jjw7/RbKNh8fSRPQu9f7
+PtPrb/T2d987dv3pLqLHfx+jA+ofU/CGH0HHkQ+8G9/9v6P/AEYW0h41Qox6qRxUxrB/ZEIi4/NM
+5Ms5n9ORl9rYAoAKXEf4xqLicLIAJoaHsJ7B5gj7wF26Hk42Pl0ux8mtttLxDmOEgqTlc/sZoZa4
+hG7HgdFSFinxVeo/Uui+n6v44ukby97Gnsxxlv38p6PqX9X6b/WGOXwZax7i5g/snn5rcAAAAEAc
+BXfiHxDHnxxx44yri4iZfkFkIEGy8v8A4waL7Oj1WVgmum4OtA7Atc0OPzK85XttlbLWOrsaHseC
+HNcJBB7ELCP1K+rxv9b7O6Jn0t7tn3TP4o8h8Rx4MXt5Iy0JMTHx7qlAk2Gl/i8ovr6ZkWvBFVtv
+6Ke+0Q5w/J8l1ajVVXTW2qpoZWwQ1jRAAHYBSWfzGb3s08tcPGbpeBQpSSSSiS8d+xGf8/PU2/od
+n22I03fQ/wDPmqS6z7Oz7V9pj3+n6c+W7ckrv36fc/7m9j+1bw/9K0oIIBHB4SVPo2SMvpOHkAzv
+pZP9YCHfiFcVOcTGUoneJI+xKkkkkEqSSSSUpJJJJSkkkklKSSSSUrySWX+0m/8AOT9mz/2l9T+3
+v4/zUlL7E+3+T93/AAUX+dOP/i+6kLsC3p7z+kxnb2D/AIN+v4O/KusXkHROq2dJ6lVmMktadtrB
++dW76Q/u8165j305NFeRQ4PqtaHMcO4KufFOXOPOcgHoza/4XUftWwNiuzMkASeFiYv1u6Nk59mC
+LdjmO212v0rtPfa74+PK2yARB1BXKdc+ouLmOdkdNcMa86uqP804+UfR/Iq3LR5eRlHPKUOIeiQ2
+B8Uyvo9WkvNmZv1u+rf6O1rzjt0AsHq0/wBl44+RWjj/AOMd4AGTggnu6uyP+i5p/Kp5fDM/zYjD
+PDpKEh+1HGOuj3CS41/+MfFA9mFYXeBeAPwBWfk/XzrOWfSwMdlLnaDaDbZ8u34IR+Gc2d4CA7yk
+K/BXHF7nP6jhdOoORmWtqrHE8uPg0ckqt0Tr2F1ql9mNLH1uh9T43Afmu07FcbifVP6wdavGT1Wx
+1LDy+47rI8G19vnC7bpPRsDpFHo4dcE/zlrtXvP8pyGfDy2HGYjJ72e94fJHwSDInag3kznNY0uc
+Ya0SSeAAnXLfXnrgw8L9m0O/WcofpI5ZV3/zuPvVfBhlmyxxx/SO/YdSkmhbyv7fd/zp/bEn0/W4
+/wCB/m4/zEliJLqfu2L93/Jez/gdmCz+NqXUfVH60fsx4wc1x+w2H2POvouPf+qe/wB65dJHNhhm
+xnHMWD9oPcKBINh9ta5r2h7CHNcJa4agg9wnXmH1f+tuZ0iKLQcjC/0RPuZ/xZ/gvQemda6b1Wvf
+h3B7vzqj7bG/FpXN81yOXlySRxw6TG317M0ZAt7nQqnf0bpORrdhUvJ7mts/eBKuJKrGUom4kx8j
+SXNZ9W+gsMjApnzbP5VeoxcbHEY9LKR4VtDf+pCIknSy5JfNOUv7xJVQUkmc5rGlzyGtGpJMABcv
+1z684WG11HTYysnj1P8ABMPx/O+X3p2HBlzS4ccTL8h5lRIG7qdf6/i9FxfUsIfkvB9CidXHxPg0
+LyzMzMjOybMrJdvutO5zv4DyCWZmZOdkOycqw23P+k535B4BBXR8lyUeWj+9kl80v2DwYZSvyUkk
+kri1SSSSSlIlHr+q37Pv9afZ6c758tuqSSB2P7dlPc9E/wCfm1vqbPR0j7b9KP7H6T711mP9q2D7
+V6e/v6e6P+kkkuZ575z/ALm3/wAh+1nj9fql+Cy+p/8AOTaf2b9l/wCub9/y/NSSVfB84/m/+q/K
+k/X6PA9f/wCdO4/tj1vTnT/Q/L0/YsNJJdTy381H+a/6j8n0YDv1+qkkklMhSSSSSn//2Q==" preserveAspectRatio="xMidYMid slice" width="50" height="30" />
+ </g>
+ <g transform="translate(0,50)">
+ <text y="-5">*YMax</text>&Viewport1;
+ <image xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAAHgAA/+4ADkFkb2JlAGTAAAAAAf/b
+AIQAEAsLCwwLEAwMEBcPDQ8XGxQQEBQbHxcXFxcXHx4XGhoaGhceHiMlJyUjHi8vMzMvL0BAQEBA
+QEBAQEBAQEBAQAERDw8RExEVEhIVFBEUERQaFBYWFBomGhocGhomMCMeHh4eIzArLicnJy4rNTUw
+MDU1QEA/QEBAQEBAQEBAQEBA/8AAEQgAZABkAwEiAAIRAQMRAf/EAT8AAAEFAQEBAQEBAAAAAAAA
+AAMAAQIEBQYHCAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUD
+DDMBAAIRAwQhEjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1Rk
+RcKjdDYX0lXiZfKzhMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX
+5/cRAAICAQIEBAMEBQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1MV
+Y3M08SUGFqKygwcmNcLSRJNUoxdkRVU2dGXi8rOEw9N14/NGlKSFtJXE1OT0pbXF1eX1VmZ2hpam
+tsbW5vYnN0dXZ3eHl6e3x//aAAwDAQACEQMRAD8A8/SSR8LCyc/JZi4rDZdYYa0flPgAgSACSaA1
+JKkLWuc4NaC5x0AGpJXT9J+onUcwC3Od9jpOoYRutI/q/m/P7l1X1f8Aqth9HYLXgX5xHuuI0b5V
+g8fHlbixOa+LSsw5fQf5w7/QMscfdxcL6n9BwwP1cXvH5953/wDR+j+C1qsbHoEU1MqHgxob+RES
+WVPNlyG5zlP+8bXgAbBRAIgiR4Knk9G6TlgjIw6Xz32AO/zhBVxJNjOUTcZGJ8DSnk+pf4v8C4F/
+T7XY1nZj/fX/AOSH4rjOq9E6l0mzZmVFrSYZa33Vu+Dv4L19Qvx6Mmp1GRW22p4hzHCQQtDl/imf
+GQMh96Hj830P8VpgDto+KJLqPrR9UX9M3ZuCDZgzL2cupn8rfP71y63sObHmgJ4zYP2g9ixEEGip
+JJJSoXa1znBrQS5xgAckleo/Vb6vM6Phh9oBzrwDc790cisfDv5rlfqJ0kZnUXZ1rZpw4LJ4Nrvo
+/wCbz9y9GWH8W5o8X3eB0GuTz6Blxx6qSSVDrPWcTo2J9pyZcXHbVU36T3eA/iVkwhKchCAMpS0A
+C9vpLiKP8YxNwGRhbaCdSx8vA+BABXZ42TTl49eTjuD6bWhzHDuCpc/K5sFe7DhEtjdj8FCQOyRJ
+Vuo9Qxum4lmZlO21V+GpcTw1o8SuQP8AjHd62mCPQn/Se+P82EsHKZ8wMsUOIR62Br9UGQG73CSq
+9M6li9Uw2ZmK6a36EHRzXDlrh4hWlDKJjIxkKMTRBXLOa17Sx4DmuBDmnUEHsV5j9bfq/wDsfMFt
+AP2LIJNX8h3ev+5enqj1rplfVem3Yb43PE1OP5tjdWlWuR5o8vlBJ9E9Jjw7/RbKNh8fSRPQu9f7
+PtPrb/T2d987dv3pLqLHfx+jA+ofU/CGH0HHkQ+8G9/9v6P/AEYW0h41Qox6qRxUxrB/ZEIi4/NM
+5Ms5n9ORl9rYAoAKXEf4xqLicLIAJoaHsJ7B5gj7wF26Hk42Pl0ux8mtttLxDmOEgqTlc/sZoZa4
+hG7HgdFSFinxVeo/Uui+n6v44ukby97Gnsxxlv38p6PqX9X6b/WGOXwZax7i5g/snn5rcAAAAEAc
+BXfiHxDHnxxx44yri4iZfkFkIEGy8v8A4waL7Oj1WVgmum4OtA7Atc0OPzK85XttlbLWOrsaHseC
+HNcJBB7ELCP1K+rxv9b7O6Jn0t7tn3TP4o8h8Rx4MXt5Iy0JMTHx7qlAk2Gl/i8ovr6ZkWvBFVtv
+6Ke+0Q5w/J8l1ajVVXTW2qpoZWwQ1jRAAHYBSWfzGb3s08tcPGbpeBQpSSSSiS8d+xGf8/PU2/od
+n22I03fQ/wDPmqS6z7Oz7V9pj3+n6c+W7ckrv36fc/7m9j+1bw/9K0oIIBHB4SVPo2SMvpOHkAzv
+pZP9YCHfiFcVOcTGUoneJI+xKkkkkEqSSSSUpJJJJSkkkklKSSSSUrySWX+0m/8AOT9mz/2l9T+3
+v4/zUlL7E+3+T93/AAUX+dOP/i+6kLsC3p7z+kxnb2D/AIN+v4O/KusXkHROq2dJ6lVmMktadtrB
++dW76Q/u8165j305NFeRQ4PqtaHMcO4KufFOXOPOcgHoza/4XUftWwNiuzMkASeFiYv1u6Nk59mC
+LdjmO212v0rtPfa74+PK2yARB1BXKdc+ouLmOdkdNcMa86uqP804+UfR/Iq3LR5eRlHPKUOIeiQ2
+B8Uyvo9WkvNmZv1u+rf6O1rzjt0AsHq0/wBl44+RWjj/AOMd4AGTggnu6uyP+i5p/Kp5fDM/zYjD
+PDpKEh+1HGOuj3CS41/+MfFA9mFYXeBeAPwBWfk/XzrOWfSwMdlLnaDaDbZ8u34IR+Gc2d4CA7yk
+K/BXHF7nP6jhdOoORmWtqrHE8uPg0ckqt0Tr2F1ql9mNLH1uh9T43Afmu07FcbifVP6wdavGT1Wx
+1LDy+47rI8G19vnC7bpPRsDpFHo4dcE/zlrtXvP8pyGfDy2HGYjJ72e94fJHwSDInag3kznNY0uc
+Ya0SSeAAnXLfXnrgw8L9m0O/WcofpI5ZV3/zuPvVfBhlmyxxx/SO/YdSkmhbyv7fd/zp/bEn0/W4
+/wCB/m4/zEliJLqfu2L93/Jez/gdmCz+NqXUfVH60fsx4wc1x+w2H2POvouPf+qe/wB65dJHNhhm
+xnHMWD9oPcKBINh9ta5r2h7CHNcJa4agg9wnXmH1f+tuZ0iKLQcjC/0RPuZ/xZ/gvQemda6b1Wvf
+h3B7vzqj7bG/FpXN81yOXlySRxw6TG317M0ZAt7nQqnf0bpORrdhUvJ7mts/eBKuJKrGUom4kx8j
+SXNZ9W+gsMjApnzbP5VeoxcbHEY9LKR4VtDf+pCIknSy5JfNOUv7xJVQUkmc5rGlzyGtGpJMABcv
+1z684WG11HTYysnj1P8ABMPx/O+X3p2HBlzS4ccTL8h5lRIG7qdf6/i9FxfUsIfkvB9CidXHxPg0
+LyzMzMjOybMrJdvutO5zv4DyCWZmZOdkOycqw23P+k535B4BBXR8lyUeWj+9kl80v2DwYZSvyUkk
+kri1SSSSSlIlHr+q37Pv9afZ6c758tuqSSB2P7dlPc9E/wCfm1vqbPR0j7b9KP7H6T711mP9q2D7
+V6e/v6e6P+kkkuZ575z/ALm3/wAh+1nj9fql+Cy+p/8AOTaf2b9l/wCub9/y/NSSVfB84/m/+q/K
+k/X6PA9f/wCdO4/tj1vTnT/Q/L0/YsNJJdTy381H+a/6j8n0YDv1+qkkklMhSSSSSn//2Q==" preserveAspectRatio="xMaxYMax slice" width="50" height="30" />
+ </g>
+ </g>
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.9 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/coords-viewattr-03-b-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/coords-viewattr-03-b-ref.png
new file mode 100644
index 00000000..cad2b687
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/coords-viewattr-03-b-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/coords-viewattr-03-b.svg b/rsvg/tests/fixtures/reftests/svg1.1/coords-viewattr-03-b.svg
new file mode 100644
index 00000000..02c31605
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/coords-viewattr-03-b.svg
@@ -0,0 +1,94 @@
+<svg version="1.1" baseProfile="basic" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="CL" author="BB" status="accepted"
+ version="$Revision: 1.6 $" testname="$RCSfile: coords-viewattr-03-b.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/coords.html#ViewBoxAttribute">
+ <p>
+ This file tests the allowed syntax of the viewBox attribute. The viewBox attribute is a list of
+ four numbers min-x, min-y, width and height, separated by whitespace and/or a comma.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ In the rendered result, you should see 6 identical light blue shapes.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: coords-viewattr-03-b.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <text font-size="20" x="240" y="28" text-anchor="middle">&lt;svg&gt; 'viewBox' attribute</text>
+
+ <g fill="lightblue" stroke="black">
+
+ <svg x="35" y="50" width="100" height="100" viewBox="0 0 200 200" overflow="visible">
+ <path fill-rule="evenodd" d="M20,20 Q180,20 180,180 Q20,180 20,20 Z M20,180 Q20,20 180,20 Q180,180 20,180 Z M100,40 L160,100 100,160 40,100 Z"/>
+ </svg>
+ <text font-size="13.5" x="85" y="155" text-anchor="middle" fill="black" stroke="none">viewBox="0 0 200 200"</text>
+ <text font-size="13.5" x="85" y="170" text-anchor="middle" fill="black" stroke="none">overflow="visible" </text>
+
+ <svg x="35" y="180" width="100" height="100" viewBox="0 0 200 200" overflow="hidden">
+ <path fill-rule="evenodd" d="M20,20 Q180,20 180,180 Q20,180 20,20 Z M20,180 Q20,20 180,20 Q180,180 20,180 Z M100,40 L160,100 100,160 40,100 Z"/>
+ </svg>
+ <text font-size="13.5" x="85" y="285" text-anchor="middle" fill="black" stroke="none">viewBox="0 0 200 200"</text>
+ <text font-size="13.5" x="85" y="300" text-anchor="middle" fill="black" stroke="none">overflow="hidden" </text>
+
+ <svg x="190" y="50" width="100" height="100" viewBox="0,0,200,200" overflow="visible">
+ <path fill-rule="evenodd" d="M20,20 Q180,20 180,180 Q20,180 20,20 Z M20,180 Q20,20 180,20 Q180,180 20,180 Z M100,40 L160,100 100,160 40,100 Z"/>
+ </svg>
+ <text font-size="13.5" x="240" y="155" text-anchor="middle" fill="black" stroke="none">viewBox="0,0,200,200"</text>
+ <text font-size="13.5" x="240" y="170" text-anchor="middle" fill="black" stroke="none">overflow="visible" </text>
+
+ <svg x="190" y="180" width="100" height="100" viewBox="0,0,200,200" overflow="hidden">
+ <path fill-rule="evenodd" d="M20,20 Q180,20 180,180 Q20,180 20,20 Z M20,180 Q20,20 180,20 Q180,180 20,180 Z M100,40 L160,100 100,160 40,100 Z"/>
+ </svg>
+ <text font-size="13.5" x="240" y="285" text-anchor="middle" fill="black" stroke="none">viewBox="0,0,200,200"</text>
+ <text font-size="13.5" x="240" y="300" text-anchor="middle" fill="black" stroke="none">overflow="hidden" </text>
+
+ <svg x="345" y="50" width="100" height="100" viewBox="0,0, 200, 200" overflow="visible">
+ <path fill-rule="evenodd" d="M20,20 Q180,20 180,180 Q20,180 20,20 Z M20,180 Q20,20 180,20 Q180,180 20,180 Z M100,40 L160,100 100,160 40,100 Z"/>
+ </svg>
+ <text font-size="13.5" x="395" y="155" text-anchor="middle" fill="black" stroke="none">viewBox="0,0, 200, 200"</text>
+ <text font-size="13.5" x="395" y="170" text-anchor="middle" fill="black" stroke="none">overflow="visible" </text>
+
+ <svg x="345" y="180" width="100" height="100" viewBox="0,0, 200, 200" overflow="hidden">
+ <path fill-rule="evenodd" d="M20,20 Q180,20 180,180 Q20,180 20,20 Z M20,180 Q20,20 180,20 Q180,180 20,180 Z M100,40 L160,100 100,160 40,100 Z"/>
+ </svg>
+ <text font-size="13.5" x="395" y="285" text-anchor="middle" fill="black" stroke="none">viewBox="0,0, 200, 200"</text>
+ <text font-size="13.5" x="395" y="300" text-anchor="middle" fill="black" stroke="none">overflow="hidden" </text>
+
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.6 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-background-01-f-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/filters-background-01-f-ref.png
new file mode 100644
index 00000000..414e6e9e
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-background-01-f-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-background-01-f.svg b/rsvg/tests/fixtures/reftests/svg1.1/filters-background-01-f.svg
new file mode 100644
index 00000000..72510dd5
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-background-01-f.svg
@@ -0,0 +1,159 @@
+<svg id="svg-root" width="100%" height="100%"
+ viewBox="0 0 480 360" xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= Copyright 2008 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="[reviewer]" author="ED" status="created"
+ version="$Revision: 1.2 $" testname="$RCSfile: filters-background-01-f.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/filters.html#AccessingBackgroundImage">
+ <p>
+ Test background image processing.
+ </p>
+ <p>
+ The first subtest enables background image processing and adds an empty ‘g’ element
+ which invokes the ShiftBGAndBlur filter. This filter takes the current accumulated
+ background image (i.e., the entire reference graphic) as input, shifts its offscreen
+ down, blurs it, and then writes the result to the canvas. Note that the offscreen for
+ the filter is initialized to transparent black, which allows the already rendered
+ rectangle, circle and triangle to show through after the filter renders its own
+ result to the canvas.
+ </p>
+ <p>
+ The second subtest enables background image processing and instead invokes the
+ ShiftBGAndBlur filter on the inner ‘g’ element. The accumulated background at the
+ time the filter is applied contains only the rectangle. Because the children
+ of the inner ‘g’ (i.e., the circle and triangle) are not part of the inner ‘g’ element's
+ background and because ShiftBGAndBlur ignores SourceGraphic, the children of the inner ‘g’
+ do not appear in the result.
+ </p>
+ <p>
+ The third subtest enables background image processing and invokes the ShiftBGAndBlur on the
+ ‘polygon’ element that draws the triangle. The accumulated background at the time the filter
+ is applied contains the rectangle plus the circle ignoring the effect of the ‘opacity’
+ property on the inner ‘g’ element. (Note that the blurred circle at the bottom does not
+ let the rectangle show through on its left side. This is due to ignoring the effect of
+ the ‘opacity’ property.) Because the triangle itself is not part of the accumulated background
+ and because ShiftBGAndBlur ignores SourceGraphic, the triangle does not appear in the result.
+ </p>
+ <p>
+ The fourth subtest is the same as the third except that filter ShiftBGAndBlur_WithSourceGraphic is
+ invoked instead of ShiftBGAndBlur. ShiftBGAndBlur_WithSourceGraphic performs the same effect as
+ ShiftBGAndBlur, but then renders the SourceGraphic on top of the shifted, blurred background
+ image. In this case, SourceGraphic is the blue triangle; thus, the result is the same as in
+ the fourth case except that the triangle now appears.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The test is passed if:
+ </p>
+ <ul>
+ <li>each blue rectangle has the same shapes twice inside, once without filters applied, once with (blurred)</li>
+ <li>from left to right, the blue rectangles contain the following shapes: [rectangle, circle, triangle], [rectangle], [rectangle, circle], [rectangle, circle, triangle]</li>
+ </ul>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: filters-background-01-f.svg,v $</title>
+ <defs>
+ <font-face
+ font-family="SVGFreeSansASCII"
+ unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <defs>
+ <filter id="ShiftBGAndBlur" filterUnits="userSpaceOnUse" x="0" y="0" width="1200" height="400">
+ <desc>
+ This filter discards the SourceGraphic, if any, and just produces
+ a result consisting of the BackgroundImage shifted down 125 units
+ and then blurred.
+ </desc>
+ <feOffset in="BackgroundImage" dx="0" dy="125" />
+ <feGaussianBlur stdDeviation="8" />
+ </filter>
+ <filter id="ShiftBGAndBlur_WithSourceGraphic"
+ filterUnits="userSpaceOnUse" x="0" y="0" width="1200" height="400">
+ <desc>
+ This filter takes the BackgroundImage, shifts it down 125 units, blurs it,
+ and then renders the SourceGraphic on top of the shifted/blurred background.
+ </desc>
+ <feOffset in="BackgroundImage" dx="0" dy="125" />
+ <feGaussianBlur stdDeviation="8" result="blur" />
+ <feMerge>
+ <feMergeNode in="blur"/>
+ <feMergeNode in="SourceGraphic"/>
+ </feMerge>
+ </filter>
+ </defs>
+
+ <g transform="scale(0.4) translate(-200 300)">
+ <g enable-background="new" transform="translate(270,0)">
+ <desc>The second adds an empty 'g' element which invokes ShiftBGAndBlur.</desc>
+ <rect x="25" y="25" width="100" height="100" fill="fuchsia"/>
+ <g opacity=".5">
+ <circle cx="125" cy="75" r="45" fill="#D3FF00"/>
+ <polygon points="160,25 160,125 240,75" fill="#7A16FF"/>
+ </g>
+ <g filter="url(#ShiftBGAndBlur)"/>
+ <rect x="5" y="5" width="260" height="260" fill="none" stroke="blue"/>
+ </g>
+
+ <g enable-background="new" transform="translate(540,0)">
+ <desc>The third invokes ShiftBGAndBlur on the inner group.</desc>
+ <rect x="25" y="25" width="100" height="100" fill="fuchsia"/>
+ <g filter="url(#ShiftBGAndBlur)" opacity=".5">
+ <circle cx="125" cy="75" r="45" fill="#D3FF00"/>
+ <polygon points="160,25 160,125 240,75" fill="#7A16FF"/>
+ </g>
+ <rect x="5" y="5" width="260" height="260" fill="none" stroke="blue"/>
+ </g>
+
+ <g enable-background="new" transform="translate(810,0)">
+ <desc>The fourth invokes ShiftBGAndBlur on the triangle.</desc>
+ <rect x="25" y="25" width="100" height="100" fill="fuchsia"/>
+ <g opacity=".5">
+ <circle cx="125" cy="75" r="45" fill="#D3FF00"/>
+ <polygon points="160,25 160,125 240,75" fill="#7A16FF"
+ filter="url(#ShiftBGAndBlur)"/>
+ </g>
+ <rect x="5" y="5" width="260" height="260" fill="none" stroke="blue"/>
+ </g>
+
+ <g enable-background="new" transform="translate(1080,0)">
+ <desc>The fifth invokes ShiftBGAndBlur_WithSourceGraphic on the triangle.</desc>
+ <rect x="25" y="25" width="100" height="100" fill="fuchsia"/>
+ <g opacity=".5">
+ <circle cx="125" cy="75" r="45" fill="#D3FF00"/>
+ <polygon points="160,25 160,125 240,75" fill="#7A16FF"
+ filter="url(#ShiftBGAndBlur_WithSourceGraphic)"/>
+ </g>
+ <rect x="5" y="5" width="260" height="260" fill="none" stroke="blue"/>
+ </g>
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none"
+ fill="black">$Revision: 1.2 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-blend-01-b-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/filters-blend-01-b-ref.png
new file mode 100644
index 00000000..e4812179
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-blend-01-b-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-blend-01-b.svg b/rsvg/tests/fixtures/reftests/svg1.1/filters-blend-01-b.svg
new file mode 100644
index 00000000..685a59ee
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-blend-01-b.svg
@@ -0,0 +1,108 @@
+<svg version="1.1" baseProfile="basic" preserveAspectRatio="xMidYMid meet" zoomAndPan="magnify" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="SVGWG" author="Jon Ferraiolo" status="accepted"
+ version="$Revision: 1.9 $" testname="$RCSfile: filters-blend-01-b.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/filters.html#feBlendElement">
+ <p>
+ Verify correct operation of the five compositing modes
+ of the feBlend filter primitive. Seven rectangles are
+ blended into a gradient, with text strings identifying
+ which of the the five feBlend modes were used.
+ </p>
+ <p>
+ All rectangles but the fourth one have a blue fill, although the
+ blend mode will adjust this color. The fourth has a yellow fill.
+ </p>
+ <p>
+ The third and fourth rectangles are grouped and the filter is applied to the group.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The rendered picture should match the reference image
+ exactly, except for possible variations in the
+ labelling text (per CSS2 rules).
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: filters-blend-01-b.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <g font-size="9" transform="scale(3)">
+ <image x="40" y="5" width="100" height="98" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAAABCAMAAAAfBfuPAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAEsUExURfb/AK3/AAD/9/9sAIn/AN7/ABT/AAB//zD/AP9GAAD/s1H/AAD/H/8AxwD/bn8A/1wA/wD/XJv/AP8Ai//MAGP/ABMA/wD/LP8A6P8KAP8AF/8A9QD/xAAA/wD1/9MA/wD/gABY/wD/Cf8ATJEA//+6AACT/wCn/+v/AAD/TAD/kf8AYKMA//8kAAAk/wAV/y0A/3b/AP80AAD/O/cA//8A/wD///8An/8A2QD/Ev8AAMQA/+0A/7MA////AP8ACuAA//8AJ24A/0sA//8AOAA0/wAK/wBF//8WAAgA/x8A///2AL//AP8AdTwA/wn/AP/bAP+AAP+UAM//AP+nAP8AtADp/wD/o0D/AP/qAADb/wC5/wDL/wD/AAD/7QD/0gD/4CH/AABr//9ZAG2IeB4AAABvSURBVHjaYrCyl3J0Udb2FTYP5bWQkDY1sXGQt7bVUeF3EnD2M/AS85R109dzdVdMYldTj46JCpMzY4pLiJfhCtdS4BPUNBbnsVSK9WdL5IjgFjVkEWL0CWbVYLDzjgwQUQ0JCmRO5jTS9ZAECDAA3aQTV3E5iioAAAAASUVORK5CYII="/>
+ <defs>
+ <filter id="BlendNormal" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+ <feFlood in="BackgroundAlpha" flood-color="#0f0" flood-opacity="0.5" result="img1"/>
+ <feBlend in2="img1" in="SourceGraphic" mode="normal"/>
+ </filter>
+ <filter id="BlendMultiply" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+ <feFlood in="SourceGraphic" flood-color="#0f0" flood-opacity="0.5" result="img2"/>
+ <feBlend in="SourceGraphic" in2="img2" mode="multiply"/>
+ </filter>
+ <filter id="BlendScreen" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+ <feFlood in="SourceGraphic" flood-color="#0f0" flood-opacity="0.5" result="img2"/>
+ <feBlend in="SourceGraphic" in2="img2" mode="screen"/>
+ </filter>
+ <filter id="BlendDarken" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+ <feFlood in="SourceGraphic" flood-color="#0f0" flood-opacity="0.5" result="img2"/>
+ <feBlend in="SourceGraphic" in2="img2" mode="darken"/>
+ </filter>
+ <filter id="BlendLighten" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+ <feFlood in="SourceGraphic" flood-color="#0f0" flood-opacity="0.5" result="img2"/>
+ <feBlend in="SourceGraphic" in2="img2" mode="lighten"/>
+ </filter>
+ </defs>
+ <rect x="30" y="10" width="120" height="10" fill="blue" opacity="0.5" filter="url(#BlendNormal)"/>
+ <rect x="30" y="23" width="120" height="10" fill="blue" opacity="0.5" filter="url(#BlendMultiply)"/>
+ <g filter="url(#BlendMultiply)">
+ <rect x="30" y="36" width="120" height="10" fill="blue" opacity="0.5"/>
+ <rect x="30" y="49" width="120" height="10" fill="#ff0" opacity="0.5"/>
+ </g>
+ <rect x="30" y="62" width="120" height="10" fill="blue" opacity="0.5" filter="url(#BlendScreen)"/>
+ <rect x="30" y="75" width="120" height="10" fill="blue" opacity="0.5" filter="url(#BlendDarken)"/>
+ <rect x="30" y="88" width="120" height="10" fill="blue" opacity="0.5" filter="url(#BlendLighten)"/>
+ <g fill="#333" font-size="7">
+ <text x="5" y="17">Normal</text>
+ <text x="5" y="30">Multiply</text>
+ <text x="5" y="43">Multiply</text>
+ <text x="5" y="56">Multiply</text>
+ <text x="5" y="69">Screen</text>
+ <text x="5" y="82">Darken</text>
+ <text x="5" y="95">Lighten</text>
+ </g>
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none"
+ fill="black">$Revision: 1.9 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000"/>
+ <!-- comment out this watermark once the test is approved --><!--
+ <g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-color-01-b-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/filters-color-01-b-ref.png
new file mode 100644
index 00000000..0d7f7241
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-color-01-b-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-color-01-b.svg b/rsvg/tests/fixtures/reftests/svg1.1/filters-color-01-b.svg
new file mode 100644
index 00000000..53b993a0
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-color-01-b.svg
@@ -0,0 +1,112 @@
+<svg version="1.1" baseProfile="basic" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="SVGWG" author="Jon Ferraiolo" status="accepted"
+ version="$Revision: 1.6 $" testname="$RCSfile: filters-color-01-b.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/filters.html#feColorMatrixElement">
+ <p>
+ Test which verifies the basic facilities of
+ feColorMatrix.
+ </p>
+ <p>
+ This test uses the following elements : a nested
+ &lt;svg&gt; with a viewBox attribute, &lt;linearGradient&gt;,
+ &lt;filter&gt;, &lt;feColorMatrix&gt;, &lt;feComposite&gt;.
+ </p>
+ <p>
+ The test case shows five rectangles filled with a
+ gradient showing the effects of feColorMatrix: an
+ unfiltered rectangle acting as a reference, use of the
+ feColorMatrix matrix option to convert to grayscale,
+ use of the feColorMatrix saturate option, use of the
+ feColorMatrix hueRotate option, and use of the
+ feColorMatrix luminanceToAlpha option.
+ </p>
+ <p>
+ The test is somewhat self-explanatory as the strings
+ document the type of feColorMatrix operation that is
+ being used.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The rendered picture should match the reference image
+ exactly, except for possible variations in the
+ labelling text (per CSS2 rules).
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: filters-color-01-b.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <svg xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" x="-10" y="5" width="500" height="290" viewBox="0 0 800 500">
+ <title>Example feColorMatrix - Examples of feColorMatrix operations</title>
+ <desc>Five rectangles filled with a gradient showing the effects of feColorMatrix: an unfiltered rectangle acting as a reference, use of the feColorMatrix matrix option to convert to grayscale, use of the feColorMatrix saturate option, use of the feColorMatrix hueRotate option, and use of the feColorMatrix luminanceToAlpha option.</desc>
+ <defs>
+ <linearGradient id="MyGradient" gradientUnits="userSpaceOnUse" x1="20" y1="0" x2="760" y2="0">
+ <stop offset="0" stop-color="#dd00dd"/>
+ <stop offset=".33" stop-color="#22cc22"/>
+ <stop offset=".67" stop-color="#400000"/>
+ <stop offset="1" stop-color="#a0a0ff"/>
+ </linearGradient>
+ <filter id="Matrix" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+ <feColorMatrix type="matrix" in="SourceGraphic" values=".33 .33 .33 0 0 .33 .33 .33 0 0 .33 .33 .33 0 0 .33 .33 .33 0 0"/>
+ </filter>
+ <filter id="Saturate40" filterUnits="objectBoundingBox" x="-5%" y="-5%" width="110%" height="110%">
+ <feColorMatrix type="saturate" in="SourceGraphic" values=".25"/>
+ </filter>
+ <filter id="HueRotate90" filterUnits="objectBoundingBox" x="-5%" y="-5%" width="110%" height="110%">
+ <feColorMatrix type="hueRotate" in="SourceGraphic" values="90"/>
+ </filter>
+ <filter id="LuminanceToAlpha" filterUnits="objectBoundingBox" x="-5%" y="-5%" width="110%" height="110%">
+ <feColorMatrix type="luminanceToAlpha" in="SourceGraphic" result="a"/>
+ <feComposite in="SourceGraphic" in2="a" operator="in"/>
+ </filter>
+ </defs>
+ <g font-size="40" font-family="Verdana">
+ <rect fill="none" stroke="blue" x="1" y="1" width="798" height="498"/>
+ <rect x="20" y="20" width="760" height="40" fill="url(#MyGradient)"/>
+ <text x="20" y="95">Unfiltered</text>
+ <rect x="20" y="120" width="760" height="40" fill="url(#MyGradient)" filter="url(#Matrix)"/>
+ <text x="20" y="195">type="matrix" (grayscale matrix)</text>
+ <rect x="20" y="220" width="760" height="40" fill="url(#MyGradient)" filter="url(#Saturate40)"/>
+ <text x="20" y="295">type="saturate" values=".4"</text>
+ <rect x="20" y="320" width="760" height="40" fill="url(#MyGradient)" filter="url(#HueRotate90)"/>
+ <text x="20" y="395">type="hueRotate" values="90"</text>
+ <rect x="20" y="420" width="760" height="40" fill="url(#MyGradient)" filter="url(#LuminanceToAlpha)"/>
+ <text x="20" y="495">type="luminanceToAlpha"</text>
+ </g>
+ </svg>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.6 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-color-02-b-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/filters-color-02-b-ref.png
new file mode 100644
index 00000000..3721aadc
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-color-02-b-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-color-02-b.svg b/rsvg/tests/fixtures/reftests/svg1.1/filters-color-02-b.svg
new file mode 100644
index 00000000..ac399b98
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-color-02-b.svg
@@ -0,0 +1,112 @@
+<svg version="1.1" baseProfile="basic" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="CM" author="AG" status="accepted"
+ version="$Revision: 1.7 $" testname="$RCSfile: filters-color-02-b.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/filters.html#feColorMatrixElement">
+ <p>
+ Tests the default behaviour of feComponentTransfer
+ </p>
+ <p>
+ The test displays two rects with the same gradient fill. The gradient
+ fill has the stops red, green, blue and black all of which are evenly
+ spaced.
+ </p>
+ <p>
+ The first rect with the 'Reference' label beneath it has an
+ feComponentTransfer filter applied to it. This filter specifies a
+ 'linear' transform for the Red component such that Red is transformed to
+ Black. The Green component is specified as an 'identity' transform. The
+ remaining components (Green, Alpha) are unspecified and by default
+ must be treated as 'identity' transforms.
+ </p>
+ <p>
+ The second rect with the 'Default' label beneath it has an
+ feComponentTransfer filter applied to it. This filter specifies a
+ multiple transforms from the Red component. The last transform
+ specified for the Red component is a 'linear' transform that shifts Red
+ to Black. This is the transform that should be used by a conforming
+ implementation. There are no other components specified for the filter
+ of the second rect. A conforming implementation should treat
+ unspecified components in an feComponentTransfer as 'identity'.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ For this test to pass both rects must have a gradient fill that has the
+ stop colors Black, Green, Blue and Black, equally spaced.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: filters-color-02-b.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <defs>
+ <linearGradient id="MyGradient" gradientUnits="objectBoundingBox" x1="0" y1="0" x2="1" y2="0">
+ <stop offset="0" stop-color="#ff0000"/>
+ <stop offset=".33" stop-color="#00ff00"/>
+ <stop offset=".67" stop-color="#0000ff"/>
+ <stop offset="1" stop-color="#000000"/>
+ </linearGradient>
+
+ <filter id="Reference" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+ <feComponentTransfer>
+ <feFuncR type="linear" slope="0" intercept="0"/>
+ <feFuncG type="identity"/>
+ </feComponentTransfer>
+ </filter>
+
+ <filter id="Default" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+ <!-- Red becomes black, green/blue/alpha use the identity function,
+ since erratum specifies omitted functions are the identity
+ function, and duplicated ones take the last one. -->
+ <feComponentTransfer>
+ <feFuncR type="identity"/>
+ <feFuncR type="linear" slope="0" intercept="1"/>
+ <feFuncR type="linear" slope="0" intercept="0"/>
+ </feComponentTransfer>
+ </filter>
+ </defs>
+
+ <g fill="url(#MyGradient)">
+ <rect x="20" y="40" width="440" height="40" filter="url(#Reference)"/>
+ <rect x="20" y="140" width="440" height="40" filter="url(#Default)"/>
+ </g>
+
+ <g font-family="Verdana" font-size="20" font-weight="bold">
+ <text x="40" y="100">Reference</text>
+ <text x="40" y="200">Default</text>
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.7 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved --><!--
+ <g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-composite-02-b-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/filters-composite-02-b-ref.png
new file mode 100644
index 00000000..01935401
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-composite-02-b-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-composite-02-b.svg b/rsvg/tests/fixtures/reftests/svg1.1/filters-composite-02-b.svg
new file mode 100644
index 00000000..23e4b9ad
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-composite-02-b.svg
@@ -0,0 +1,203 @@
+<svg version="1.1" baseProfile="basic" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="SVGWG" author="Jon Ferraiolo" status="accepted"
+ version="$Revision: 1.6 $" testname="$RCSfile: filters-composite-02-b.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/filters.html#feCompositeElement">
+ <p>
+ Test which verifies the basic facilities of feComposite.
+ </p>
+ <p>
+ This test uses the following elements: &lt;path&gt;, &lt;filter&gt;
+ &lt;feImage&gt; &lt;feComposite&gt;.
+ </p>
+ <p>
+ The test case shows six pairs of overlapping triangles
+ depicting the six different feComposite operators. The
+ first row shows compositing when both triangles have
+ opacity=1. The second row shows compositing when both
+ triangles have opacity=.5. The six columns illustrate the
+ six types of compositing operations.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The rendered picture should match the reference image
+ exactly, except for possible variations in the
+ labelling text (per CSS2 rules).
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: filters-composite-02-b.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <g transform="translate(15 -60)">
+ <title>Example feComposite - Examples of feComposite operations</title>
+ <desc>Six pairs of overlapping triangles depicting the six different feComposite operators.</desc>
+ <defs>
+ <path id="Blue100" d="M 0 0 L 150 0 L 150 150 z" fill="#00ffff"/>
+ <path id="Red100" d="M 0 0 L 0 150 L 150 0 z" fill="#ff00ff"/>
+ <path id="Blue50" d="M 0 0 L 150 0 L 150 150 z" fill="#00ffff" fill-opacity="0.5"/>
+ <path id="Red50" d="M 0 0 L 0 150 L 150 0 z" fill="#ff00ff" fill-opacity="0.5"/>
+
+ <filter id="over" x="0" y="0" width="1" height="1">
+ <feImage xlink:href="#Blue100" result="blue"/>
+ <feImage xlink:href="#Red100" result="red"/>
+ <feComposite in2="blue" in="red" operator="over"/>
+ </filter>
+
+ <filter id="over50" x="0" y="0" width="1" height="1">
+ <feImage xlink:href="#Blue50" result="blue"/>
+ <feImage xlink:href="#Red50" result="red"/>
+ <feComposite in2="blue" in="red" operator="over"/>
+ </filter>
+
+ <filter id="in" x="0" y="0" width="1" height="1">
+ <feImage xlink:href="#Blue100" result="blue"/>
+ <feImage xlink:href="#Red100" result="red"/>
+ <feComposite in2="blue" in="red" operator="in"/>
+ </filter>
+
+ <filter id="in50" x="0" y="0" width="1" height="1">
+ <feImage xlink:href="#Blue50" result="blue"/>
+ <feImage xlink:href="#Red50" result="red"/>
+ <feComposite in2="blue" in="red" operator="in"/>
+ </filter>
+
+ <filter id="out" x="0" y="0" width="1" height="1">
+ <feImage xlink:href="#Blue100" result="blue"/>
+ <feImage xlink:href="#Red100" result="red"/>
+ <feComposite in2="blue" in="red" operator="out"/>
+ </filter>
+
+ <filter id="out50" x="0" y="0" width="1" height="1">
+ <feImage xlink:href="#Blue50" result="blue"/>
+ <feImage xlink:href="#Red50" result="red"/>
+ <feComposite in2="blue" in="red" operator="out"/>
+ </filter>
+
+ <filter id="atop" x="0" y="0" width="1" height="1">
+ <feImage xlink:href="#Blue100" result="blue"/>
+ <feImage xlink:href="#Red100" result="red"/>
+ <feComposite in2="blue" in="red" operator="atop"/>
+ </filter>
+
+ <filter id="atop50" x="0" y="0" width="1" height="1">
+ <feImage xlink:href="#Blue50" result="blue"/>
+ <feImage xlink:href="#Red50" result="red"/>
+ <feComposite in2="blue" in="red" operator="atop"/>
+ </filter>
+
+ <filter id="xor" x="0" y="0" width="1" height="1">
+ <feImage xlink:href="#Blue100" result="blue"/>
+ <feImage xlink:href="#Red100" result="red"/>
+ <feComposite in2="blue" in="red" operator="xor"/>
+ </filter>
+
+ <filter id="xor50" x="0" y="0" width="1" height="1">
+ <feImage xlink:href="#Blue50" result="blue"/>
+ <feImage xlink:href="#Red50" result="red"/>
+ <feComposite in2="blue" in="red" operator="xor"/>
+ </filter>
+
+ <filter id="arithmetic" x="0" y="0" width="1" height="1">
+ <feImage xlink:href="#Blue100" result="blue"/>
+ <feImage xlink:href="#Red100" result="red"/>
+ <feComposite in2="blue" in="red" operator="arithmetic" k1=".5" k2=".5" k3=".5" k4=".5"/>
+ </filter>
+
+ <filter id="arithmetic50" x="0" y="0" width="1" height="1">
+ <feImage xlink:href="#Blue50" result="blue"/>
+ <feImage xlink:href="#Red50" result="red"/>
+ <feComposite in2="blue" in="red" operator="arithmetic" k1=".5" k2=".5" k3=".5" k4=".5"/>
+ </filter>
+ </defs>
+ <g font-family="Verdana" font-size="60" shape-rendering="crispEdges" transform="translate(5,70) scale(.4)">
+ <rect fill="none" stroke="blue" x="1" y="1" width="1098" height="723"/>
+ <text x="100" y="75">on first Row : opacity 1.0</text>
+ <text x="100" y="180">on second row opacity 0.5</text>
+
+ <g transform="translate(15,230)">
+ <rect x="0" y="0" width="150" height="150" filter="url(#over)"/>
+ <text x="10" y="400">over</text>
+ </g>
+
+ <g transform="translate(15,430)">
+ <rect x="0" y="0" width="150" height="150" filter="url(#over50)"/>
+ </g>
+
+ <g transform="translate(195,230)">
+ <rect x="0" y="0" width="150" height="150" filter="url(#in)"/>
+ <text x="10" y="400">in</text>
+ </g>
+
+ <g transform="translate(195,430)">
+ <rect x="0" y="0" width="150" height="150" filter="url(#in50)"/>
+ </g>
+
+ <g transform="translate(375,230)">
+ <rect x="0" y="0" width="150" height="150" filter="url(#out)"/>
+ <text x="10" y="400">out</text>
+ </g>
+ <g transform="translate(375,430)">
+ <rect x="0" y="0" width="150" height="150" filter="url(#out50)"/>
+ </g>
+
+ <g transform="translate(555,230)">
+ <rect x="0" y="0" width="150" height="150" filter="url(#atop)"/>
+ <text x="10" y="400">atop</text>
+ </g>
+ <g transform="translate(555,430)">
+ <rect x="0" y="0" width="150" height="150" filter="url(#atop50)"/>
+ </g>
+
+ <g transform="translate(735,230)">
+ <rect x="0" y="0" width="150" height="150" filter="url(#xor)"/>
+ <text x="10" y="400">xor</text>
+ </g>
+ <g transform="translate(735,430)">
+ <rect x="0" y="0" width="150" height="150" filter="url(#xor50)"/>
+ </g>
+ <g transform="translate(915,230)">
+ <rect x="0" y="0" width="150" height="150" filter="url(#arithmetic)"/>
+ <text x="-25" y="400">arith-</text>
+ <text x="-25" y="470">metic</text>
+ </g>
+ <g transform="translate(915,430)">
+ <rect x="0" y="0" width="150" height="150" filter="url(#arithmetic50)"/>
+ </g>
+ </g>
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.6 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-composite-03-f-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/filters-composite-03-f-ref.png
new file mode 100644
index 00000000..9543b949
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-composite-03-f-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-composite-03-f.svg b/rsvg/tests/fixtures/reftests/svg1.1/filters-composite-03-f.svg
new file mode 100644
index 00000000..fc1d8c34
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-composite-03-f.svg
@@ -0,0 +1,91 @@
+<svg id="svg-root" width="100%" height="100%"
+ viewBox="0 0 480 360" xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= Copyright 2008 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="CL" author="ED" status="accepted"
+ version="$Revision: 1.4 $" testname="$RCSfile: filters-composite-03-f.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/filters.html#feCompositeElement">
+ <p>
+ Tests the arithmetic operator in feComposite.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The test is passed if there are four filled squares visible, and the
+ fill color matches the respective reference stroke exactly.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: filters-composite-03-f.svg,v $</title>
+ <defs>
+ <font-face
+ font-family="SVGFreeSansASCII"
+ unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <defs>
+ <filter id="composite-ident" x="0" y="0" width="1" height="1">
+ <feComposite operator="arithmetic" in="FillPaint" in2="StrokePaint" k1="0" k2="1" k3="-1" k4="0"/>
+ </filter>
+ <filter id="composite-negative" x="0" y="0" width="1" height="1">
+ <feComposite operator="arithmetic" in="FillPaint" in2="FillPaint" k1="0" k2="2" k3="-1.5" k4="0"/>
+ </filter>
+ <filter id="composite-mixed" x="0" y="0" width="1" height="1">
+ <feComposite operator="arithmetic" in="FillPaint" in2="StrokePaint" k1="1" k2="-0.5" k3="0.2" k4="-0.1"/>
+ </filter>
+ <filter id="composite-clamped" x="0" y="0" width="1" height="1">
+ <feComposite operator="arithmetic" in="FillPaint" in2="StrokePaint" k1="0" k2="10" k3="20" k4="0"/>
+ </filter>
+ </defs>
+
+ <g transform="translate(100 30)">
+ <rect id="reference1" fill="lime" width="120" height="120"/>
+ <rect fill="red" stroke="red" filter="url(#composite-ident)" x="10" y="10" width="100" height="100"/>
+ </g>
+ <g transform="translate(250 30)">
+ <!-- librsvg note: white background to fix the test suite being stupid. -->
+ <rect fill="white" x="10" y="10" width="100" height="100"/>
+ <rect fill="#0F0" filter="url(#composite-negative)" x="10" y="10" width="100" height="100"/>
+ <rect id="reference2" stroke="#7FFF7F" x="5" y="5" width="110" height="110" stroke-width="12" fill="none"/>
+ </g>
+ <g transform="translate(100 180)">
+ <!-- librsvg note: white background to fix the test suite being stupid. -->
+ <rect fill="white" x="10" y="10" width="100" height="100"/>
+ <rect fill="rgb(43,17,12)" stroke="rgb(32,42,37)" filter="url(#composite-mixed)" x="10" y="10" width="100" height="100"/>
+ <rect id="reference3" stroke="#666" x="5" y="5" width="110" height="110" stroke-width="12" fill="none"/>
+ </g>
+ <g transform="translate(250 180)">
+ <rect fill="rgb(0,127,0)" stroke="rgb(0,0,127)" filter="url(#composite-clamped)" x="10" y="10" width="100" height="100"/>
+ <rect id="reference4" stroke="rgb(0,255,255)" x="5" y="5" width="110" height="110" stroke-width="12" fill="none"/>
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none"
+ fill="black">$Revision: 1.4 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--
+ <g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>
+ -->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-composite-04-f-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/filters-composite-04-f-ref.png
new file mode 100644
index 00000000..03d51070
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-composite-04-f-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-composite-04-f.svg b/rsvg/tests/fixtures/reftests/svg1.1/filters-composite-04-f.svg
new file mode 100644
index 00000000..4885b13a
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-composite-04-f.svg
@@ -0,0 +1,78 @@
+<svg id="svg-root" width="100%" height="100%"
+ viewBox="0 0 480 360" xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= Copyright 2008 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="[reviewer]" author="[author]" status="empty"
+ version="$Revision: 1.1 $" testname="$RCSfile: filters-composite-04-f.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/filters.html#feCompositeElement">
+ <p>
+ Test feComposite and the arithmetic operator to implement a simple dissolve operation.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The test has passed if there are four images visible, each in
+ different stages of dissolving the bird in the foreground into the
+ tree in the background.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: filters-composite-04-f.svg,v $</title>
+ <defs>
+ <font-face
+ font-family="SVGFreeSansASCII"
+ unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <defs>
+ <filter id="dissolve1" x="0" y="0" width="1" height="1">
+ <feImage xlink:href="resources/stefan_252_tRNS_opti.png" result="bird"/>
+ <feComposite operator="arithmetic" in="SourceGraphic" in2="bird" k1="0" k2="0.5" k3="0.5" k4="0"/>
+ </filter>
+ <filter id="dissolve2" x="0" y="0" width="1" height="1">
+ <feImage xlink:href="resources/stefan_252_tRNS_opti.png" result="bird"/>
+ <feComposite operator="arithmetic" in="SourceGraphic" in2="bird" k1="0" k2="0.1" k3="0.9" k4="0"/>
+ </filter>
+ <filter id="dissolve3" x="0" y="0" width="1" height="1">
+ <feImage xlink:href="resources/stefan_252_tRNS_opti.png" result="bird"/>
+ <feComposite operator="arithmetic" in="SourceGraphic" in2="bird" k1="0" k2="0.75" k3="0.25" k4="0"/>
+ </filter>
+ <filter id="dissolve4" x="0" y="0" width="1" height="1">
+ <feImage xlink:href="resources/stefan_252_tRNS_opti.png" result="bird"/>
+ <feComposite operator="arithmetic" in="SourceGraphic" in2="bird" k1="0" k2="0.25" k3="0.75" k4="0"/>
+ </filter>
+ </defs>
+
+ <image width="120" height="80" xlink:href="resources/tree.jpg" filter="url(#dissolve1)" transform="translate(100 80)"/>
+ <image width="120" height="80" xlink:href="resources/tree.jpg" filter="url(#dissolve2)" transform="translate(250 80)"/>
+ <image width="120" height="80" xlink:href="resources/tree.jpg" filter="url(#dissolve3)" transform="translate(100 190)"/>
+ <image width="120" height="80" xlink:href="resources/tree.jpg" filter="url(#dissolve4)" transform="translate(250 190)"/>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none"
+ fill="black">$Revision: 1.1 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-composite-05-f-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/filters-composite-05-f-ref.png
new file mode 100644
index 00000000..006f21d7
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-composite-05-f-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-composite-05-f.svg b/rsvg/tests/fixtures/reftests/svg1.1/filters-composite-05-f.svg
new file mode 100644
index 00000000..2f6bd55f
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-composite-05-f.svg
@@ -0,0 +1,67 @@
+<svg id="svg-root" width="100%" height="100%"
+ viewBox="0 0 480 360" xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= Copyright 2008 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="[reviewer]" author="ED" status="created"
+ version="$Revision: 1.1 $" testname="$RCSfile: filters-composite-05-f.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/filters.html#feCompositeElement">
+ <p>
+ Testing the feComposite element and that the 'k2' and 'k3' attributes
+ are animatable. The result is an animated dissolve between two images.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Reload the testcase or click the image to run animation again.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The test has passed if there is an animation effect that gradually
+ dissolves a photo of a tree into an image of a bird over the course
+ of two seconds. The final result is that the bird is fully visible
+ and the tree photo is invisible.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: filters-composite-05-f.svg,v $</title>
+ <defs>
+ <font-face
+ font-family="SVGFreeSansASCII"
+ unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <defs>
+ <!-- librsvg note: we don't support animation, but let's not miss out on a test image.
+ Animation replaced with just final values. -->
+ <filter id="dissolve" x="0" y="0" width="1" height="1">
+ <feImage xlink:href="resources/stefan_252_tRNS_opti.png" result="bird"/>
+ <feComposite operator="arithmetic" in="SourceGraphic" in2="bird" k1="0" k2="0" k3="1" k4="0"/>
+ </filter>
+ </defs>
+
+ <image id="image" width="320" height="160" xlink:href="resources/tree.jpg" filter="url(#dissolve)" transform="translate(80 80)"/>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none"
+ fill="black">$Revision: 1.1 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-comptran-01-b-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/filters-comptran-01-b-ref.png
new file mode 100644
index 00000000..5e40a86c
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-comptran-01-b-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-comptran-01-b.svg b/rsvg/tests/fixtures/reftests/svg1.1/filters-comptran-01-b.svg
new file mode 100644
index 00000000..4f94d941
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-comptran-01-b.svg
@@ -0,0 +1,126 @@
+<svg version="1.1" baseProfile="basic" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="SVGWG" author="Jon Ferraiolo" status="accepted"
+ version="$Revision: 1.6 $" testname="$RCSfile: filters-comptran-01-b.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/filters.html#feComponentTransferElement">
+ <p>
+ Test which verifies the basic facilities of
+ feComponentTransfer.
+ </p>
+ <p>
+ This test uses the following elements : a nested &lt;svg&gt;
+ with a viewBox attribute, &lt;linearGradient&gt;, &lt;filter&gt;,
+ &lt;feComponentTransfer&gt;.
+ </p>
+ <p>
+ The test case shows four rectangles filled with a
+ gradient showing the effects of feComponentTransfer: an
+ identity function acting as a reference, use of the
+ feComponentTransfer table option, use of the
+ feComponentTransfer linear option, and use of the
+ feComponentTransfer gamma option.
+ </p>
+ <p>
+ The test is somewhat self-explanatory as the strings
+ document the type of feComponentTransfer operation that
+ is being used.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The rendered picture should match the reference image
+ exactly, except for possible variations in the
+ labelling text (per CSS2 rules).
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: filters-comptran-01-b.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <svg xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" x="15" y="5" width="450" height="300" viewBox="0 0 630 420">
+ <title>Example feComponentTransfer - Examples of feComponentTransfer operations</title>
+ <desc>Four rectangles filled with a gradient showing the effects of feComponentTransfer: an identity function acting as a reference, use of the feComponentTransfer table option, use of the feComponentTransfer linear option, and use of the feComponentTransfer gamma option.</desc>
+ <defs>
+ <linearGradient id="MyGradient" gradientUnits="userSpaceOnUse" x1="10" y1="0" x2="590" y2="0">
+ <stop offset="0" stop-color="#ff0000"/>
+ <stop offset=".33" stop-color="#00ff00"/>
+ <stop offset=".67" stop-color="#0000ff"/>
+ <stop offset="1" stop-color="#000000"/>
+ </linearGradient>
+ <filter id="Identity" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+ <feComponentTransfer>
+ <feFuncR type="identity"/>
+ <feFuncG type="identity"/>
+ <feFuncB type="identity"/>
+ <feFuncA type="identity"/>
+ </feComponentTransfer>
+ </filter>
+ <filter id="Table" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+ <feComponentTransfer>
+ <feFuncR type="table" tableValues="0 0 1 1"/>
+ <feFuncG type="table" tableValues="1 1 0 0"/>
+ <feFuncB type="table" tableValues="0 1 1 0"/>
+ </feComponentTransfer>
+ </filter>
+ <filter id="Linear" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+ <feComponentTransfer>
+ <feFuncR type="linear" slope=".5" intercept=".25"/>
+ <feFuncG type="linear" slope=".5" intercept="0"/>
+ <feFuncB type="linear" slope=".5" intercept=".5"/>
+ </feComponentTransfer>
+ </filter>
+ <filter id="Gamma" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+ <feComponentTransfer>
+ <feFuncR type="gamma" amplitude="2" exponent="5" offset="0"/>
+ <feFuncG type="gamma" amplitude="2" exponent="3" offset="0"/>
+ <feFuncB type="gamma" amplitude="2" exponent="1" offset="0"/>
+ </feComponentTransfer>
+ </filter>
+ </defs>
+ <rect fill="none" stroke="blue" x="1" y="1" width="628" height="418"/>
+ <g font-size="30" font-family="Verdana">
+ <rect fill="none" stroke="blue" x="1" y="1" width="628" height="418"/>
+ <rect x="10" y="10" width="580" height="40" fill="url(#MyGradient)" filter="url(#Identity)"/>
+ <text x="10" y="80">type: identity</text>
+ <rect x="10" y="110" width="580" height="40" fill="url(#MyGradient)" filter="url(#Table)"/>
+ <text x="10" y="180">type: table</text>
+ <rect x="10" y="210" width="580" height="40" fill="url(#MyGradient)" filter="url(#Linear)"/>
+ <text x="10" y="280">type:linear slope:.5 intercepts:.25/0/.5</text>
+ <rect x="10" y="310" width="580" height="40" fill="url(#MyGradient)" filter="url(#Gamma)"/>
+ <text x="10" y="380">type: gamma ampl:2 exponents:5/3/1</text>
+ </g>
+ </svg>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.6 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-conv-01-f-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/filters-conv-01-f-ref.png
new file mode 100644
index 00000000..b15cf3cb
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-conv-01-f-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-conv-01-f.svg b/rsvg/tests/fixtures/reftests/svg1.1/filters-conv-01-f.svg
new file mode 100644
index 00000000..0ff4c9f3
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-conv-01-f.svg
@@ -0,0 +1,112 @@
+<svg version="1.1" baseProfile="full" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="SVGWG" author="Vincent Hardy" status="accepted"
+ version="$Revision: 1.6 $" testname="$RCSfile: filters-conv-01-f.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/filters.html#feConvolveMatrixElement">
+ <p>
+ Test which verifies the basic facilities of
+ feConvolveMatrix.
+ </p>
+ <p>
+ This test defines six filters that exercise traditional
+ convolutions: uniform blur, vertical and horizontal
+ blurs, edge detection, embossing and sharpening. Note
+ that the edge detection filter produces a fully
+ transparent image because the alpha channel is convolved
+ and produces 0 values.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The rendered picture should match the reference image
+ exactly, except for possible variations in the
+ labelling text (per CSS2 rules).
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: filters-conv-01-f.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="12">
+ <!--Generated by the Java 2D API Graphics2D SVG Generator, Sun Microsystems Inc.-->
+ <g transform="translate(20, 40)">
+ <defs id="defs1">
+ <filter id="convolve1" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+ <feConvolveMatrix order="3 3" kernelMatrix="0.1111 0.1111 0.1111 0.1111 0.1111 0.1111 0.1111 0.1111 0.1111" edgeMode="none"/>
+ </filter>
+ <filter id="convolve2" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+ <feConvolveMatrix order="3 3" kernelMatrix="-1 -1 -1 -1 8 -1 -1 -1 -1" edgeMode="duplicate"/>
+ </filter>
+ <filter id="convolve3" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+ <feConvolveMatrix order="3 3" kernelMatrix="-1 -1 -1 -1 9 -1 -1 -1 -1" edgeMode="none"/>
+ </filter>
+ <filter id="convolve4" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+ <feConvolveMatrix order="3 3" kernelMatrix="-2 0 0 0 1 0 0 0 2" edgeMode="none"/>
+ </filter>
+ <filter id="convolve5" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+ <feConvolveMatrix order="3 1" kernelMatrix="0.3333 0.3333 0.3333" edgeMode="none"/>
+ </filter>
+ <filter id="convolve6" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+ <feConvolveMatrix order="1 3" kernelMatrix="0.3333 0.3333 0.3333" edgeMode="none"/>
+ </filter>
+ </defs>
+ <g shape-rendering="geometricPrecision" text-rendering="geometricPrecision">
+ <text x="10" y="20" stroke="none" opacity="1" filter="none">Blur (3x3)</text>
+ <g opacity="1" filter="none">
+ <image width="50" height="63" xlink:href="images/filters-conv-01-f.includeimage.png" x="10" y="30" filter="url(#convolve1)"/>
+ </g>
+ <text x="10" y="20" transform="translate(150,0)" stroke="none" opacity="1" filter="none">Edge Detection (3x3)</text>
+ <g transform="translate(150,0)" opacity="1" filter="none">
+ <image width="50" height="63" xlink:href="images/filters-conv-01-f.includeimage.png" x="10" y="30" filter="url(#convolve2)"/>
+ </g>
+ <text x="10" y="20" transform="translate(300,0)" stroke="none" opacity="1" filter="none">Sharpening (3x3)</text>
+ <g transform="translate(300,0)" opacity="1" filter="none">
+ <image width="50" height="63" xlink:href="images/filters-conv-01-f.includeimage.png" x="10" y="30" filter="url(#convolve3)"/>
+ </g>
+ <text x="10" y="20" transform="translate(0,93)" stroke="none" opacity="1" filter="none">Embossing (3x3)</text>
+ <g transform="translate(0,93)" opacity="1" filter="none">
+ <image width="50" height="63" xlink:href="images/filters-conv-01-f.includeimage.png" x="10" y="30" filter="url(#convolve4)"/>
+ </g>
+ <text x="10" y="20" transform="translate(150,93)" stroke="none" opacity="1" filter="none">Horizontal blur (3x1)</text>
+ <g transform="translate(150,93)" opacity="1" filter="none">
+ <image width="50" height="63" xlink:href="images/filters-conv-01-f.includeimage.png" x="10" y="30" filter="url(#convolve5)"/>
+ </g>
+ <text x="10" y="20" transform="translate(300,93)" stroke="none" opacity="1" filter="none">Vertical blur (1x3)</text>
+ <g transform="translate(300,93)" opacity="1" filter="none">
+ <image width="50" height="63" xlink:href="images/filters-conv-01-f.includeimage.png" x="10" y="30" filter="url(#convolve6)"/>
+ </g>
+ </g>
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.6 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-conv-02-f-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/filters-conv-02-f-ref.png
new file mode 100644
index 00000000..0a5fabf7
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-conv-02-f-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-conv-02-f.svg b/rsvg/tests/fixtures/reftests/svg1.1/filters-conv-02-f.svg
new file mode 100644
index 00000000..8f16e18a
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-conv-02-f.svg
@@ -0,0 +1,77 @@
+<svg id="svg-root" width="100%" height="100%"
+ viewBox="0 0 480 360" xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= Copyright 2008 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.3" reviewer="CM" author="ED" status="accepted"
+ version="$Revision: 1.9 $" testname="$RCSfile: filters-conv-02-f.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/filters.html#feConvolveMatrixElementOrderAttribute">
+ <p>
+ Tests feConvolveMatrix with different values for the 'order' attribute.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>Run the test. No interaction required.
+
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>You should see three filtered images. Each image is the same
+ and has the same filter applied to it.
+ The test has passed if all the three filtered images look the same, and the filtered result shows bright white edges on a dark background.
+ The rendered picture should match the reference image.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: filters-conv-02-f.svg,v $</title>
+ <defs>
+ <font-face
+ font-family="SVGFreeSansASCII"
+ unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <defs>
+ <filter id="convolve-without-order" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+ <feConvolveMatrix kernelMatrix="1 1 1 1 -8 1 1 1 1" preserveAlpha="true"/>
+ </filter>
+ <filter id="convolve-with-order1" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+ <feConvolveMatrix order="3" kernelMatrix="1 1 1 1 -8 1 1 1 1" preserveAlpha="true"/>
+ </filter>
+ <filter id="convolve-with-order2" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+ <feConvolveMatrix order="3 3" kernelMatrix="1 1 1 1 -8 1 1 1 1" preserveAlpha="true"/>
+ </filter>
+ </defs>
+
+ <text x="50%" y="3em" style="font-size:18px; text-anchor:middle">feConvolveMatrix 'order' attribute</text>
+
+ <image x="90" y="100" width="100" height="100" xlink:href="images/image1.jpg" filter="url(#convolve-without-order)"/>
+ <text x="135" y="220" style="font-size:9px; text-anchor:middle">without order</text>
+
+ <image x="190" y="100" width="100" height="100" xlink:href="images/image1.jpg" filter="url(#convolve-with-order1)"/>
+ <text x="235" y="220" style="font-size:9px; text-anchor:middle">order="3"</text>
+
+ <image x="290" y="100" width="100" height="100" xlink:href="images/image1.jpg" filter="url(#convolve-with-order2)"/>
+ <text x="335" y="220" style="font-size:9px; text-anchor:middle">order="3 3"</text>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none"
+ fill="black">$Revision: 1.9 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000"/>
+ <!-- comment out this watermark once the test is approved --><!--
+ <g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-conv-03-f-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/filters-conv-03-f-ref.png
new file mode 100644
index 00000000..eaa060f6
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-conv-03-f-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-conv-03-f.svg b/rsvg/tests/fixtures/reftests/svg1.1/filters-conv-03-f.svg
new file mode 100644
index 00000000..2e5460b3
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-conv-03-f.svg
@@ -0,0 +1,104 @@
+<svg id="svg-root" width="100%" height="100%"
+ viewBox="0 0 480 360" xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= Copyright 2008 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.3" reviewer="CM" owner="ED" status="accepted"
+ version="$Revision: 1.8 $" testname="$RCSfile: filters-conv-03-f.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/#feConvolveMatrixElementOrderAttribute">
+ <p>
+ Tests the 'in1' DOM attribute on 'feConvolveMatrix'.
+ </p>
+ <p>
+ Load the testcase, you should see three nearly identical images that say "FAIL".
+ After 3 seconds all three images should be replaced by the same image of a bird.
+ The two images to the right have filters applied, while the one on the left is always unfiltered.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The test has passed if:
+ </p>
+ <ul>
+ <li>the two images inside the blue rects look exactly the same</li>
+ <li>the same base image is used in all three rects</li>
+ <li>the purple image that says "FAIL" is replaced after 3 seconds by an image of a bird</li>
+ </ul>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: filters-conv-03-f.svg,v $</title>
+ <defs>
+ <font-face
+ font-family="SVGFreeSansASCII"
+ unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <!-- librsvg note: we don't support animation, but let's not miss out on a test image.
+ Animation replaced with just final values. -->
+ <defs>
+ <filter id="sharpenAnim" x="0" y="0" width="100%" height="100%">
+ <feImage xlink:href="images/stefan_252_tRNS_opti.png" result="passimg"/>
+ <feConvolveMatrix in="passimg" order="3" kernelMatrix="0 -1 0
+ -1 5 -1
+ 0 -1 0" preserveAlpha="true">
+ <set attributeName="in" to="passimg" begin="3s" fill="freeze" onbegin="runtest()"/>
+ </feConvolveMatrix>
+ </filter>
+ <filter id="sharpenScript" x="0" y="0" width="100%" height="100%">
+ <feImage xlink:href="images/stefan_252_tRNS_opti.png" result="passimg"/>
+ <feConvolveMatrix id="prim" in="passimg" order="3" kernelMatrix="0 -1 0
+ -1 5 -1
+ 0 -1 0" preserveAlpha="true"/>
+ </filter>
+
+ <text id="pass" x="240" y="150" text-anchor="middle" font-size="30px">PASS</text>
+ </defs>
+
+ <script type="application/ecmascript">
+ function runtest()
+ {
+ var img = document.getElementById("img");
+ img.href.baseVal = "images/stefan_252_tRNS_opti.png";
+ var prim = document.getElementById("prim");
+ prim.in1.baseVal = "passimg";
+ }
+ </script>
+
+ <text x="50%" y="3em" style="font-size:18px; text-anchor:middle">feConvolveMatrix 'in1' DOM</text>
+ <image id="img" xlink:href="images/stefan_252_tRNS_opti.png" x="80" y="100" width="100" height="100"/>
+ <image xlink:href="images/purplesquidj.png" x="190" y="100" width="100" height="100" filter="url(#sharpenAnim)"/>
+ <image xlink:href="images/purplesquidj.png" x="300" y="100" width="100" height="100" filter="url(#sharpenScript)"/>
+ <rect x="80" y="100" width="100" height="100" stroke="black" fill="none"/>
+ <rect x="190" y="100" width="100" height="100" stroke="blue" fill="none"/>
+ <rect x="300" y="100" width="100" height="100" stroke="blue" fill="none"/>
+ <text x="130" y="220" style="font-size:9px; text-anchor:middle">Original image</text>
+ <text x="240" y="220" style="font-size:9px; text-anchor:middle">Animated filter</text>
+ <text x="350" y="220" style="font-size:9px; text-anchor:middle">Scripted filter</text>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none"
+ fill="black">$Revision: 1.8 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000"/>
+ <!-- comment out this watermark once the test is approved --><!--
+ <g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-conv-04-f-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/filters-conv-04-f-ref.png
new file mode 100644
index 00000000..92ef677c
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-conv-04-f-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-conv-04-f.svg b/rsvg/tests/fixtures/reftests/svg1.1/filters-conv-04-f.svg
new file mode 100644
index 00000000..a66cf323
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-conv-04-f.svg
@@ -0,0 +1,163 @@
+<svg id="svg-root" width="100%" height="100%"
+ viewBox="0 0 480 360" xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= Copyright 2008 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.3" reviewer="ED" owner="AG" status="created"
+ version="$Revision: 1.4 $" testname="$RCSfile: filters-conv-04-f.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/filters.html#feConvolveMatrixElementBiasAttribute">
+ <p>
+ Tests the 'bias' attribute on 'feConvolveMatrix'.
+ </p>
+ <p>
+ The test uses a raster image and a vector graphic to test the effect
+ that the 'bias' attribute on 'feConvolveMatrix' has.
+ </p>
+ <p>
+ The first row of images in the test are four identical raster images.
+ The first image is the original unfiltered image. The second has the
+ filter kernel applied with no bias value specified. The third and fourth
+ images both have a bias value specified for the filter.
+ </p>
+ <p>
+ The second row of images in the test are four rectangle objects with a
+ gradient fill. The gradient fill transitions from opaque green to
+ transparent green. The first image is the original unfiltered graphic. The
+ second graphic has a filter kernel applied with no bias value specified.
+ The third and forth images both have a bias value specified for the
+ filter.
+ </p>
+ <p>
+ Behind each filter result there's a checkerboard pattern placed, to help
+ verify that there's transparency in the lower row, but not in the upper.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The test has passed if:
+ </p>
+ <ul>
+ <li>
+ The raster images in the top row appears more faded and coarse for each instance
+ further to the right.
+ <ul>
+ <li>The first image (left most) must be smooth and clear</li>
+ <li>
+ The second image (second from the left) must contain the same colours as
+ the first image but have course outlining around the objects.
+ </li>
+ <li>
+ The third image (second from the right) must contain colour that is very faded
+ but have course outlining around the faded objects.
+ </li>
+ <li>
+ The last image (right most) must be completed faded such that all the colour
+ in the first image appears to have gone to white. Some course outlining should
+ appear in the image.
+ </li>
+ </ul>
+ </li>
+ <li>
+ The top row has no checkerboard pattern visible where the filtered results are.
+ </li>
+ <li>
+ The rectangle with a green gradient going from left to right appears
+ more faded for each instance further to the right.
+ <ul>
+ <li>
+ The first image (left most) must be a rect filled with a linear gradient that
+ transitions from solid green to transparent green.
+ </li>
+ <li>The second image (second from the left) must be identical to the first image.</li>
+ <li>
+ The third image (second from the right) must contain a linear gradient that transitions
+ from a solid faded green to transparent faded green.
+ </li>
+ <li>
+ The last image (right most) must contain a linear gradient that transitions from
+ solid white to transparent white.
+ </li>
+ </ul>
+ </li>
+ <li>
+ The bottom row must show 95% of the checkerboard pattern where the filtered results are
+ since the gradients are transparent.
+ </li>
+ </ul>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: filters-conv-04-f.svg,v $</title>
+ <defs>
+ <font-face
+ font-family="SVGFreeSansASCII"
+ unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <defs>
+ <filter id="convolve-without-bias" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+ <feConvolveMatrix kernelMatrix="1 1 1 1 -7 1 1 1 1" preserveAlpha="false"/>
+ </filter>
+ <filter id="convolve-with-bias05" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+ <feConvolveMatrix kernelMatrix="1 1 1 1 -7 1 1 1 1" preserveAlpha="false" bias="0.5"/>
+ </filter>
+ <filter id="convolve-with-bias1" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+ <feConvolveMatrix kernelMatrix="1 1 1 1 -7 1 1 1 1" preserveAlpha="false" bias="1"/>
+ </filter>
+
+ <linearGradient id="test_linear_gradient" gradientUnits="objectBoundingBox" x1="0" x2="1" y1="0" y2="0">
+ <stop stop-color="#00FF00" stop-opacity="1" offset="0"/>
+ <stop stop-color="#00FF00" stop-opacity="0" offset="1"/>
+ </linearGradient>
+ </defs>
+
+ <g transform="translate(0, 20)">
+ <image x="12" y="1" width="97" height="98" xlink:href="images/DisplaceChecker.png"/>
+ <image x="127" y="1" width="97" height="98" xlink:href="images/DisplaceChecker.png"/>
+ <image x="242" y="1" width="97" height="98" xlink:href="images/DisplaceChecker.png"/>
+ <image x="357" y="1" width="97" height="98" xlink:href="images/DisplaceChecker.png"/>
+
+ <image x="10" y="0" width="100" height="100" xlink:href="images/townsville.jpg" />
+ <image x="125" y="0" width="100" height="100" xlink:href="images/townsville.jpg" filter="url(#convolve-without-bias)"/>
+ <image x="240" y="0" width="100" height="100" xlink:href="images/townsville.jpg" filter="url(#convolve-with-bias05)"/>
+ <image x="355" y="0" width="100" height="100" xlink:href="images/townsville.jpg" filter="url(#convolve-with-bias1)"/>
+ </g>
+
+ <g transform="translate(0, 110)">
+ <image x="11" y="51" width="98" height="98" xlink:href="images/DisplaceChecker.png"/>
+ <image x="126" y="51" width="98" height="98" xlink:href="images/DisplaceChecker.png"/>
+ <image x="241" y="51" width="98" height="98" xlink:href="images/DisplaceChecker.png"/>
+ <image x="356" y="51" width="98" height="98" xlink:href="images/DisplaceChecker.png"/>
+
+ <rect fill="url(#test_linear_gradient)" stroke="black" x="10" y="50" width="100" height="100"/>
+ <rect fill="url(#test_linear_gradient)" stroke="black" x="125" y="50" width="100" height="100" filter="url(#convolve-without-bias)"/>
+ <rect fill="url(#test_linear_gradient)" stroke="black" x="240" y="50" width="100" height="100" filter="url(#convolve-with-bias05)"/>
+ <rect fill="url(#test_linear_gradient)" stroke="black" x="355" y="50" width="100" height="100" filter="url(#convolve-with-bias1)"/>
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none"
+ fill="black">$Revision: 1.4 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-conv-05-f-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/filters-conv-05-f-ref.png
new file mode 100644
index 00000000..38ce2527
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-conv-05-f-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-conv-05-f.svg b/rsvg/tests/fixtures/reftests/svg1.1/filters-conv-05-f.svg
new file mode 100644
index 00000000..b60f774e
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-conv-05-f.svg
@@ -0,0 +1,83 @@
+<svg id="svg-root" width="100%" height="100%"
+ viewBox="0 0 480 360" xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= Copyright 2008 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.3" reviewer="CM" author="ED" status="created"
+ version="$Revision: 1.2 $" testname="$RCSfile: filters-conv-05-f.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/filters.html#feConvolveMatrixElementOrderAttribute">
+ <p>
+ Tests feConvolveMatrix and the 'edgeMode' attribute.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ You should see three filtered images, each result should be slightly different, if they all look the same the test has failed.
+ The rendered picture should match the reference image.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: filters-conv-05-f.svg,v $</title>
+ <defs>
+ <font-face
+ font-family="SVGFreeSansASCII"
+ unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <defs>
+ <filter id="emNone" filterUnits="objectBoundingBox" primitiveUnits="objectBoundingBox" x="0" y="0" width="1" height="1">
+ <feConvolveMatrix kernelMatrix="1 1 1 1 -7 1 1 1 1" preserveAlpha="false" edgeMode="none"/>
+ </filter>
+ <filter id="emWrap" filterUnits="objectBoundingBox" primitiveUnits="objectBoundingBox" x="0" y="0" width="1" height="1">
+ <feConvolveMatrix kernelMatrix="1 1 1 1 -7 1 1 1 1" preserveAlpha="false" edgeMode="wrap"/>
+ </filter>
+ <filter id="emDuplicate" filterUnits="objectBoundingBox" primitiveUnits="objectBoundingBox" x="0" y="0" width="1" height="1">
+ <feConvolveMatrix kernelMatrix="1 1 1 1 -7 1 1 1 1" preserveAlpha="false" edgeMode="duplicate"/>
+ </filter>
+
+ <g id="box">
+ <rect width="10" height="100" fill="blue"/>
+ <rect x="10" width="100" height="10" fill="yellow"/>
+ <rect x="110" width="10" height="100" fill="lime"/>
+ <rect x="10" y="90" width="100" height="10" fill="black"/>
+ </g>
+ </defs>
+
+ <text x="50%" y="3em" style="font-size:18px; text-anchor:middle">feConvolveMatrix 'edgeMode'</text>
+
+ <use xlink:href="#box" filter="url(#emNone)" transform="translate(40 100)"/>
+ <text x="100" y="220" font-size="14" text-anchor="middle">none</text>
+
+ <use xlink:href="#box" filter="url(#emWrap)" transform="translate(180 100)"/>
+ <text x="240" y="220" font-size="14" text-anchor="middle">wrap</text>
+
+ <use xlink:href="#box" filter="url(#emDuplicate)" transform="translate(320 100)"/>
+ <text x="380" y="220" font-size="14" text-anchor="middle">duplicate</text>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none"
+ fill="black">$Revision: 1.2 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-diffuse-01-f-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/filters-diffuse-01-f-ref.png
new file mode 100644
index 00000000..74b22af6
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-diffuse-01-f-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-diffuse-01-f.svg b/rsvg/tests/fixtures/reftests/svg1.1/filters-diffuse-01-f.svg
new file mode 100644
index 00000000..e1e3a38e
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-diffuse-01-f.svg
@@ -0,0 +1,152 @@
+<svg version="1.1" baseProfile="full" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="SVGWG" author="Vincent Hardy" status="accepted"
+ version="$Revision: 1.6 $" testname="$RCSfile: filters-diffuse-01-f.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/filters.html#feDiffuseLightingElement">
+ <p>
+ Verify the basic operation of the feDiffuseLighting
+ element. The test shows three rows of 3 images. Each
+ rows tests a different aspect of the filter and shows
+ the result of the filtering operation.
+ </p>
+ <p>
+ The first row shows the result of varying the
+ surfaceScale attribute. The second row shows the result
+ of varying the diffuse constant (kd) attribute. The last
+ row shows the result of varying the lighting-color
+ property.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The rendered picture should match the reference image.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: filters-diffuse-01-f.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <!-- Title -->
+ <text x="145" y="30" fill="black" font-size="12" font-family="Arial" font-weight="bold">Filters: feDiffuseLighting</text>
+ <!-- ===================================================================== -->
+ <!-- Filter definitions -->
+ <!-- ===================================================================== -->
+ <defs>
+ <!-- ================================================= -->
+ <!-- Surface scale -->
+ <!-- ================================================= -->
+ <filter id="surfaceScaleA" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+ <feDiffuseLighting in="SourceGraphic" diffuseConstant="1" surfaceScale="1">
+ <feDistantLight azimuth="45" elevation="45"/>
+ </feDiffuseLighting>
+ </filter>
+ <filter id="surfaceScaleB" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+ <feDiffuseLighting in="SourceGraphic" diffuseConstant="1" surfaceScale="10">
+ <feDistantLight azimuth="45" elevation="45"/>
+ </feDiffuseLighting>
+ </filter>
+ <filter id="surfaceScaleC" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+ <feDiffuseLighting in="SourceGraphic" diffuseConstant="1" surfaceScale="-10">
+ <feDistantLight azimuth="45" elevation="45"/>
+ </feDiffuseLighting>
+ </filter>
+ <!-- ================================================= -->
+ <!-- Diffuse Constants -->
+ <!-- ================================================= -->
+ <filter id="diffuseConstantA" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+ <feDiffuseLighting in="SourceGraphic" diffuseConstant="0" surfaceScale="10">
+ <feDistantLight azimuth="45" elevation="45"/>
+ </feDiffuseLighting>
+ </filter>
+ <filter id="diffuseConstantB" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+ <feDiffuseLighting in="SourceGraphic" diffuseConstant="1" surfaceScale="10">
+ <feDistantLight azimuth="45" elevation="45"/>
+ </feDiffuseLighting>
+ </filter>
+ <filter id="diffuseConstantC" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+ <feDiffuseLighting in="SourceGraphic" diffuseConstant="2" surfaceScale="10">
+ <feDistantLight azimuth="45" elevation="45"/>
+ </feDiffuseLighting>
+ </filter>
+ <!-- ================================================= -->
+ <!-- Lighting colors -->
+ <!-- ================================================= -->
+ <filter id="lightingColorA" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+ <feDiffuseLighting in="SourceGraphic" diffuseConstant="1" surfaceScale="10" lighting-color="red">
+ <feDistantLight azimuth="45" elevation="45"/>
+ </feDiffuseLighting>
+ </filter>
+ <filter id="lightingColorB" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+ <feDiffuseLighting in="SourceGraphic" diffuseConstant="1" surfaceScale="10" lighting-color="yellow">
+ <feDistantLight azimuth="45" elevation="45"/>
+ </feDiffuseLighting>
+ </filter>
+ <filter id="lightingColorC" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+ <feDiffuseLighting in="SourceGraphic" diffuseConstant="1" surfaceScale="10" lighting-color="blue">
+ <feDistantLight azimuth="45" elevation="45"/>
+ </feDiffuseLighting>
+ </filter>
+ </defs>
+ <!-- ==================================================== -->
+ <!-- The same image is rendered multiple times with using -->
+ <!-- different filters. -->
+ <!-- ==================================================== -->
+ <!-- Various Surface Scales -->
+ <g transform="translate(0, 50)">
+ <text x="90" y="25">Various values for surfaceScale: 1, 10 and -10</text>
+ <image xlink:href="images/bumpMap2.png" x="90" y="30" width="50" height="30" filter="url(#surfaceScaleA)"/>
+ <image xlink:href="images/bumpMap2.png" x="160" y="30" width="50" height="30" filter="url(#surfaceScaleB)"/>
+ <image xlink:href="images/bumpMap2.png" x="230" y="30" width="50" height="30" filter="url(#surfaceScaleC)"/>
+ </g>
+ <!-- Various Diffuse Constants -->
+ <g transform="translate(0, 120)">
+ <text x="90" y="25">Various values for diffuseConstants: 0, 1 and 2</text>
+ <image xlink:href="images/bumpMap2.png" x="90" y="30" width="50" height="30" filter="url(#diffuseConstantA)"/>
+ <image xlink:href="images/bumpMap2.png" x="160" y="30" width="50" height="30" filter="url(#diffuseConstantB)"/>
+ <image xlink:href="images/bumpMap2.png" x="230" y="30" width="50" height="30" filter="url(#diffuseConstantC)"/>
+ </g>
+ <!-- Various Light Colors -->
+ <g transform="translate(0, 190)">
+ <text x="90" y="25">Various values for lighting color: red, yellow and blue</text>
+ <image xlink:href="images/bumpMap2.png" x="90" y="30" width="50" height="30" filter="url(#lightingColorA)"/>
+ <image xlink:href="images/bumpMap2.png" x="160" y="30" width="50" height="30" filter="url(#lightingColorB)"/>
+ <image xlink:href="images/bumpMap2.png" x="230" y="30" width="50" height="30" filter="url(#lightingColorC)"/>
+ </g>
+ <!-- ===================================================== -->
+ <!-- Legends -->
+ <!-- ===================================================== -->
+ <!-- Surface Scale -->
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.6 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-displace-01-f-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/filters-displace-01-f-ref.png
new file mode 100644
index 00000000..c8fe8b3c
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-displace-01-f-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-displace-02-f-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/filters-displace-02-f-ref.png
new file mode 100644
index 00000000..a751513d
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-displace-02-f-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-displace-02-f.svg b/rsvg/tests/fixtures/reftests/svg1.1/filters-displace-02-f.svg
new file mode 100644
index 00000000..1fc1d1bc
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-displace-02-f.svg
@@ -0,0 +1,90 @@
+<svg version="1.1" baseProfile="full" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="ED" author="CL" status="accepted"
+ version="$Revision: 1.9 $" testname="$RCSfile: filters-displace-02-f.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/filters.html#feDisplacementMapElement">
+ <p>
+ This tests feDisplacementMap without feImage. The input geometry is also used as the displacement map.
+ </p>
+ <p>
+ The bottom subtest tests that not specifying the 'xChannelSelector' attribute has the same effect as if 'A' was specified.
+ </p>
+ <p>
+ In both cases the filter input image consists of a gradient that is rendered using the default 'color-interpolation' which is 'sRGB'.
+ The default colorspace for filter primitives is 'linearRGB'. The filtering operation happens in 'linearRGB' space and the
+ result is then transformed back to 'sRGB' space for display.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The test has passed if:
+ </p>
+ <ul>
+ <li>the top rectangle is overlapped by a gradient that has its blackest part centered around the vertical green line that splits the top rectangle</li>
+ <li>the bottom right corner of the area covered by the top gradient is aligned with the corner just below the top rectangle</li>
+ <li>the bottom rectangle is overlapped by a gradient that is displaced upwards with the maximum displacement the middle indicated by the vertical green line that splits the bottom rectangle</li>
+ <li>no part of the bottom gradient extends outside the bottom rectangle</li>
+ <li>both gradients use the same gradientcolors</li>
+ </ul>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: filters-displace-02-f.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <linearGradient id="fade" gradientUnits="objectBoundingBox">
+ <stop offset="0" stop-color="#600" stop-opacity="0"/>
+ <stop offset="0.5" stop-color="#000" stop-opacity="1"/>
+ <stop offset="1.0" stop-color="#300" stop-opacity="0"/>
+ </linearGradient>
+
+ <filter id="bend" filterUnits="objectBoundingBox" x="0" width="1.0" y="-1.3" height="2.28">
+ <feDisplacementMap in="SourceGraphic" in2="SourceAlpha" yChannelSelector="A" scale="30"/>
+ </filter>
+
+ <filter id="slide" filterUnits="objectBoundingBox" x="-0.3" width="1.3" y="0" height="1.3">
+ <feDisplacementMap in="SourceGraphic" in2="SourceGraphic" xChannelSelector="R" yChannelSelector="G" scale="80"/>
+ </filter>
+
+ <polyline points="280, 40, 280,120" stroke-width="2" stroke="green"/>
+ <polyline points="400, 144, 420,144, 420, 124" stroke-width="2" stroke="green" fill="none"/>
+ <rect width="360" height="80" x="60" y="40" fill="none" stroke="#933" stroke-width="2"/>
+ <rect width="360" height="80" x="60" y="40" fill="url(#fade)" filter="url(#slide)"/>
+
+ <polyline points="240, 180, 240,260" stroke-width="2" stroke="green"/>
+ <rect width="360" height="80" x="60" y="180" fill="none" stroke="#933" stroke-width="2"/>
+ <rect width="360" height="80" x="60" y="180" fill="url(#fade)" filter="url(#bend)"/>
+
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.9 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-example-01-b-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/filters-example-01-b-ref.png
new file mode 100644
index 00000000..7438a787
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-example-01-b-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-felem-02-f-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/filters-felem-02-f-ref.png
new file mode 100644
index 00000000..59d231cc
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-felem-02-f-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-felem-02-f.svg b/rsvg/tests/fixtures/reftests/svg1.1/filters-felem-02-f.svg
new file mode 100644
index 00000000..ebcdac5e
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-felem-02-f.svg
@@ -0,0 +1,127 @@
+<svg id="svg-root" width="100%" height="100%"
+ viewBox="0 0 480 360" xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= Copyright 2008 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.3" reviewer="TB" author="ED" status="accepted"
+ version="$Revision: 1.7 $" testname="$RCSfile: filters-felem-02-f.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/filters.html#FilterElementPrimitiveUnitsAttribute">
+ <p>
+ This tests the 'primitiveUnits' attribute and how it affects other attribute values.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ You should see three rectangles in a row, then a row of three circles, then a row of three stars.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The test has passed if:
+ </p>
+ <ul>
+ <li>There is no red visible anywhere</li>
+ <li>The first row has three green rectangles</li>
+ <li>The second row has three black circles, and the middle one has more blurred edges than the other two.</li>
+ <li>The third row has three green stars.</li>
+ </ul>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: filters-felem-02-f.svg,v $</title>
+ <defs>
+ <font-face
+ font-family="SVGFreeSansASCII"
+ unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+
+ <defs>
+ <filter id="usou1" primitiveUnits="userSpaceOnUse" x="0" y="0" width="100%" height="100%">
+ <feFlood flood-color="lime" x="25" y="25" width="50" height="50"/>
+ </filter>
+ <filter id="obb1" primitiveUnits="objectBoundingBox" x="0" y="0" width="100%" height="100%">
+ <feFlood flood-color="lime" x="25%" y="25%" width="50%" height="50%"/>
+ </filter>
+ <filter id="default1" x="0" y="0" width="100%" height="100%">
+ <feFlood flood-color="lime" x="25" y="25" width="50" height="50"/>
+ </filter>
+
+ <filter id="usou2" primitiveUnits="userSpaceOnUse" x="-50%" y="-50%" width="200%" height="200%">
+ <feGaussianBlur stdDeviation="0.2"/>
+ </filter>
+ <filter id="obb2" primitiveUnits="objectBoundingBox" x="-50%" y="-50%" width="200%" height="200%">
+ <feGaussianBlur stdDeviation="0.2"/>
+ </filter>
+ <filter id="default2" x="-50%" y="-50%" width="200%" height="200%">
+ <feGaussianBlur stdDeviation="0.2"/>
+ </filter>
+
+ <filter id="usou3" primitiveUnits="userSpaceOnUse" x="-50%" y="-50%" width="200%" height="200%">
+ <feOffset dx="2" dy="2"/>
+ </filter>
+ <filter id="obb3" filterUnits="userSpaceOnUse" primitiveUnits="objectBoundingBox" x="-50%" y="-50%" width="200%" height="200%">
+ <feOffset dx="2" dy="2"/>
+ </filter>
+ <filter id="default3" x="-50%" y="-50%" width="200%" height="200%">
+ <feOffset dx="2" dy="2"/>
+ </filter>
+
+ <polygon id="star" points="300,60 311.755,83.819 338.042,87.639 319.021,106.180 323.511,132.360 300,120 276.488,132.360 280.978,106.180 261.957,87.639 288.244,83.819 300,60 311.755,83.819"/>
+
+ </defs>
+
+ <g transform="translate(80 0)">
+
+ <rect fill="red" width="50" height="50" transform="translate(25 25)"/>
+ <rect fill="red" width="100" height="100" filter="url(#usou1)" transform="translate(0 0)"/>
+
+ <rect fill="red" width="50" height="50" transform="translate(125 25)"/>
+ <rect fill="red" width="100" height="100" filter="url(#obb1)" transform="translate(100 0)"/>
+
+ <rect fill="red" width="50" height="50" transform="translate(225 25)"/>
+ <rect fill="red" width="100" height="100" filter="url(#default1)" transform="translate(200 0)"/>
+
+ <g transform="translate(50 40)">
+ <circle r="30" filter="url(#usou2)" transform="translate(0 100)"/>
+ <circle r="30" filter="url(#obb2)" transform="translate(100 100)"/>
+ <circle r="30" filter="url(#default2)" transform="translate(200 100)"/>
+ </g>
+
+
+ <use xlink:href="#star" transform="translate(-250 150)" fill="red"/>
+ <use xlink:href="#star" transform="translate(-252 148)" fill="lime" filter="url(#usou3)"/>
+ <use xlink:href="#star" transform="translate(-250 150)" fill="none" stroke-width="2" stroke="lime"/>
+
+ <use xlink:href="#star" transform="translate(-150 150)" fill="red"/>
+ <use xlink:href="#star" transform="translate(-302 5.1)" fill="lime" filter="url(#obb3)"/>
+ <use xlink:href="#star" transform="translate(-150 150)" fill="none" stroke-width="2" stroke="lime"/>
+
+ <use xlink:href="#star" transform="translate(-50 150)" fill="red"/>
+ <use xlink:href="#star" transform="translate(-52 148)" fill="lime" filter="url(#default3)"/>
+ <use xlink:href="#star" transform="translate(-50 150)" fill="none" stroke-width="2" stroke="lime"/>
+
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none"
+ fill="black">$Revision: 1.7 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000"/>
+ <!-- comment out this watermark once the test is approved
+ <g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
+
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-gauss-01-b-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/filters-gauss-01-b-ref.png
new file mode 100644
index 00000000..dbe96435
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-gauss-01-b-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-gauss-01-b.svg b/rsvg/tests/fixtures/reftests/svg1.1/filters-gauss-01-b.svg
new file mode 100644
index 00000000..d1cd3a5f
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-gauss-01-b.svg
@@ -0,0 +1,93 @@
+<svg version="1.1" baseProfile="basic" preserveAspectRatio="xMidYMid meet" zoomAndPan="magnify" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="SVGWG" author="Tim Thompson" status="accepted"
+ version="$Revision: 1.7 $" testname="$RCSfile: filters-gauss-01-b.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/animate.html#feGaussianBlurElement">
+ <p>
+ In the upper left corner of the output are blue and yellow rectangles that overlap,
+ they appear normally, no gaussianBlur has been applied.
+ In the upper right the same rectangles are displayed with a blur filter applied,
+ the standard deviation is the same for both the x and y axis.
+ In the lower right corner the rectangles appear again,
+ this time the standard deviation is different along the x (20) and y (1) axis.
+ </p>
+ <p>
+ On top of the rectangles in the upper right and lower right, thin (half-pixel-wide) blue
+ lines are drawn to show the outline of the object bounding box (the inside lines) and the
+ outline of the filter region (the outside lines). The blur effect should be clipped
+ to the bounds of the filter region.
+ </p>
+ <p>
+ The test uses the 'rect' element, as well as basic fill (solid primary colors),
+ stroke (black 1-pixel and blue half-pixel lines), font-family (Arial) and font-size properties.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The rendered picture should match the reference image, except for possible
+ variations in the labelling text (per CSS2 rules).
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: filters-gauss-01-b.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <defs>
+ <g id="rects">
+ <rect x="0" y="0" width="90" height="90" fill="blue"/>
+ <rect x="45" y="45" width="90" height="90" fill="yellow"/>
+ </g>
+ <g id="rect_outlines">
+ <rect x="0" y="0" width="135" height="135" fill="none" stroke="blue" stroke-width=".5"/>
+ <rect x="-13.5" y="-13.5" width="162" height="162" fill="none" stroke="blue" stroke-width=".5"/>
+ </g>
+ <filter id="blur" filterUnits="objectBoundingBox" x="-10%" y="-10%" width="120%" height="120%">
+ <feGaussianBlur stdDeviation="10"/>
+ </filter>
+ <filter id="blurxy" filterUnits="objectBoundingBox" x="-10%" y="-10%" width="120%" height="120%">
+ <feGaussianBlur stdDeviation="20 1"/>
+ </filter>
+ </defs>
+ <use xlink:href="#rects"/>
+ <g transform="translate(310,15)">
+ <use xlink:href="#rects" filter="url(#blur)"/>
+ <use xlink:href="#rect_outlines"/>
+ </g>
+ <g transform="translate(310,200)">
+ <use xlink:href="#rects" filter="url(#blurxy)"/>
+ <use xlink:href="#rect_outlines"/>
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.7 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-gauss-02-f-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/filters-gauss-02-f-ref.png
new file mode 100644
index 00000000..20dc454f
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-gauss-02-f-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-gauss-02-f.svg b/rsvg/tests/fixtures/reftests/svg1.1/filters-gauss-02-f.svg
new file mode 100644
index 00000000..003fc59e
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-gauss-02-f.svg
@@ -0,0 +1,85 @@
+<svg id="svg-root" width="100%" height="100%"
+ viewBox="0 0 480 360" xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= Copyright 2008 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="TB" author="ED" status="accepted"
+ version="$Revision: 1.3 $" testname="$RCSfile: filters-gauss-02-f.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/animate.html#feGaussianBlurElement">
+ <p>
+ Test that when 'stdDeviation' is zero in one of X or Y the filter input image is
+ blurred only in the non-zero direction.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The test is passed if:
+ </p>
+ <ul>
+ <li>the left subtest shows a blue and yellow rectangle fused together, with blur applied only in the vertical direction</li>
+ <li>the right subtest shows a blue and yellow rectangle fused together, with blur applied only in the horizontal direction</li>
+ <li>the blurred shapes are within the blue guidelines</li>
+ </ul>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: filters-gauss-02-f.svg,v $</title>
+ <defs>
+ <font-face
+ font-family="SVGFreeSansASCII"
+ unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <defs>
+ <g id="rects">
+ <rect x="0" y="0" width="90" height="90" fill="blue"/>
+ <rect x="45" y="45" width="90" height="90" fill="yellow"/>
+ </g>
+ <g id="rect_outlines">
+ <rect x="0" y="0" width="135" height="135" fill="none" stroke="blue" stroke-width=".5"/>
+ <rect x="-13.5" y="-13.5" width="162" height="162" fill="none" stroke="blue" stroke-width=".5"/>
+ </g>
+ <filter id="blury" filterUnits="objectBoundingBox" x="-10%" y="-10%" width="120%" height="120%">
+ <feGaussianBlur stdDeviation="0 10"/>
+ </filter>
+ <filter id="blurx" filterUnits="objectBoundingBox" x="-10%" y="-10%" width="120%" height="120%">
+ <feGaussianBlur stdDeviation="20 0"/>
+ </filter>
+ </defs>
+ <g transform="translate(80,100)">
+ <use xlink:href="#rects" filter="url(#blury)"/>
+ <use xlink:href="#rect_outlines"/>
+ </g>
+ <g transform="translate(270,100)">
+ <use xlink:href="#rects" filter="url(#blurx)"/>
+ <use xlink:href="#rect_outlines"/>
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none"
+ fill="black">$Revision: 1.3 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--
+ <g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>
+ -->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-gauss-03-f-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/filters-gauss-03-f-ref.png
new file mode 100644
index 00000000..13a20c2f
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-gauss-03-f-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-gauss-03-f.svg b/rsvg/tests/fixtures/reftests/svg1.1/filters-gauss-03-f.svg
new file mode 100644
index 00000000..ea7c54ca
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-gauss-03-f.svg
@@ -0,0 +1,65 @@
+<svg id="svg-root" width="100%" height="100%"
+ viewBox="0 0 480 360" xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= Copyright 2008 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="TB" author="ED" status="accepted"
+ version="$Revision: 1.3 $" testname="$RCSfile: filters-gauss-03-f.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/animate.html#feGaussianBlurElement">
+ <p>
+ Test that when 'stdDeviation' is zero the result is a non-blurred image.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The test is passed if there's a green rectangle visible, and no red.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: filters-gauss-03-f.svg,v $</title>
+ <defs>
+ <font-face
+ font-family="SVGFreeSansASCII"
+ unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <defs>
+ <rect id="rect" x="0" y="0" width="90" height="90"/>
+ <filter id="identity" filterUnits="objectBoundingBox" x="-10%" y="-10%" width="150%" height="150%">
+ <feGaussianBlur stdDeviation="0"/>
+ </filter>
+ </defs>
+ <g transform="translate(190,120)">
+ <use xlink:href="#rect" fill="red"/>
+ <use xlink:href="#rect" fill="lime" stroke="lime" stroke-width="2" filter="url(#identity)"/>
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none"
+ fill="black">$Revision: 1.3 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--
+ <g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>
+ -->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-image-01-b-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/filters-image-01-b-ref.png
new file mode 100644
index 00000000..85a05515
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-image-01-b-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-image-01-b.svg b/rsvg/tests/fixtures/reftests/svg1.1/filters-image-01-b.svg
new file mode 100644
index 00000000..d0e70652
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-image-01-b.svg
@@ -0,0 +1,59 @@
+<svg version="1.1" baseProfile="basic" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="SVGWG" author="Tim Thompson" status="accepted"
+ version="$Revision: 1.7 $" testname="$RCSfile: filters-image-01-b.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/filters.html#feImageElement">
+ <p>
+ An image should be displayed in the middle of the view area.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The rendered picture should match the reference image.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: filters-image-01-b.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <defs>
+ <filter id="image">
+ <feImage x="145" y="50" width="190" height="190" xlink:href="images/image1.jpg"/>
+ </filter>
+ </defs>
+ <text font-family="Arial" font-size="12" x="240" y="20" text-anchor="middle">Basic test of feImage filter support.</text>
+ <rect width="480" height="360" filter="url(#image)"/>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.7 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-image-02-b-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/filters-image-02-b-ref.png
new file mode 100644
index 00000000..5156d7be
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-image-02-b-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-image-02-b.svg b/rsvg/tests/fixtures/reftests/svg1.1/filters-image-02-b.svg
new file mode 100644
index 00000000..ee27834e
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-image-02-b.svg
@@ -0,0 +1,83 @@
+<svg id="svg-root" width="100%" height="100%"
+ viewBox="0 0 480 360" xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= Copyright 2008 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="CM" author="ED" status="accepted"
+ version="$Revision: 1.9 $" testname="$RCSfile: filters-image-02-b.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/filters.html#feImage">
+ <p>
+ Tests the animatability of 'xlink:href' on the 'feImage' element.
+ The test will first show two blue images that should look exactly the same,
+ then after two seconds both images should simultaneously change to show two
+ pink images that also look exactly the same.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>Run the test. No interaction required.
+
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The test has passed if:
+ </p>
+ <ul>
+ <li>at first there are two identical <a href="../images/bluesquidj.png">blue images</a> shown next to each other</li>
+ <li>after two seconds the two blue images are simultaneously replaced by two <a href="../images/pinksquidj.png">pink images</a></li>
+ </ul>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: filters-image-02-b.svg,v $</title>
+ <defs>
+ <font-face
+ font-family="SVGFreeSansASCII"
+ unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+
+ <!-- LIBRSVG NOTE: since we don't support animation, we display the first shown image. However,
+ the reference output displays the second image. In order to not miss out on a plain image
+ test though, the first image in this test is replaced with the second image to get the
+ matching output. -->
+ <defs>
+ <filter id="feimage" x="0" y="0" width="100%" height="100%" filterUnits="objectBoundingBox">
+ <feImage xlink:href="images/pinksquidj.png">
+ <set attributeName="xlink:href" to="images/pinksquidj.png" begin="2s"/>
+ </feImage>
+ </filter>
+ </defs>
+
+ <rect fill="red" filter="url(#feimage)" x="70" y="60" width="150" height="200"/>
+ <image xlink:href="images/pinksquidj.png" x="260" y="60" width="150" height="200">
+ <set attributeName="xlink:href" to="images/pinksquidj.png" begin="2s"/>
+ </image>
+
+ <g text-anchor="middle">
+ <text x="50%" y="60" font-size="30">Animation in filters</text>
+ <text x="145" y="220">'feImage'</text>
+ <text x="335" y="220">'image'</text>
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none"
+ fill="black">$Revision: 1.9 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000"/>
+ <!-- comment out this watermark once the test is approved --><!--
+ <g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-image-03-f-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/filters-image-03-f-ref.png
new file mode 100644
index 00000000..5dc78608
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-image-03-f-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-image-03-f.svg b/rsvg/tests/fixtures/reftests/svg1.1/filters-image-03-f.svg
new file mode 100644
index 00000000..355826eb
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-image-03-f.svg
@@ -0,0 +1,179 @@
+<svg id="svg-root" width="100%" height="100%"
+ viewBox="0 0 480 360" xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= Copyright 2008 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="TB" author="ED" status="accepted"
+ version="$Revision: 1.3 $" testname="$RCSfile: filters-image-03-f.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/filters.html#feImageElement">
+ <p>
+ This tests the feImage element with a number of different filter primitive subregion values.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The test is passed if:
+ </p>
+ <ul>
+ <li>the first row show four smiley faces of the same size, each framed by a blue rectangle</li>
+ <li>the first image on the left on the second row shows half a smiley face (horizontally offset)</li>
+ <li>the second image on the left on the second row shows half a smiley face (vertically offset)</li>
+ <li>the third image on the left on the second row shows the upper-lefthand quarter of the smiley face enlarged to fit the blue rectangle</li>
+ <li>the rightmost image on the second row shows the upper-lefthand quarter of the smiley face (horizontally and vertically offset)</li>
+ </ul>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: filters-image-03-f.svg,v $</title>
+ <defs>
+ <font-face
+ font-family="SVGFreeSansASCII"
+ unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <defs>
+ <!-- A breakdown of this testcase:
+
+ All filters:
+ filterUnits not specified, defaults to objectBoundingBox.
+ x=0, y=0, width=1, height=1 -> filter region = bounding box.
+
+ viewport is viewbox which is 0 0 480 360
+ primitiveUnits not specified, defaults to userSpaceOnUse
+ preserveAspectRatio defaults to xMidYMid meet
+
+ Top row
+ 1. Default:
+ x defaults to 0% relative to filter region (special case)
+ y defaults to 0% relative to filter region (special case)
+ width defaults to 100% of filter region (special case)
+ height defaults to 100% of filter region (special case)
+
+ 2. All specified relative
+ x = 20.8% = 100/480 (0.2083)
+ y = 0% = 0/360 (0.0)
+ width = 10.4% = 50/480 (0.1042)
+ height = 13.8% = 50/360 (0.1388)
+
+ 3. All specified absolute
+ x = 200
+ y = 0
+ width = 50
+ height = 50
+
+ 4. y Specified
+ x defaults to 0% relative to filter region (special case)
+ y = 0% = 0/360
+ width defaults to 100% of filter region (special case)
+ height defaults to 100% of filter region (special case)
+
+ Bottom row
+ 1. Width specified
+ x defaults to 0% relative to filter region (special case)
+ y defaults to 0% relative to filter region (special case)
+ width 20.4% 97.92/480 **** Should be 20.8%
+ height defaults to 100% of filter region (special case)
+
+ 2. Height specified
+ x defaults to 0% relative to filter region (special case)
+ y defaults to 0% relative to filter region (special case)
+ width defaults to 100% of filter region (special case)
+ height 27.6% 99.36/360
+
+ 3. Width and height specified
+ x defaults to 0% relative to filter region (special case)
+ y defaults to 0% relative to filter region (special case)
+ width 20.8% 99.8/480 (x2)
+ height 27.6% 99.36/360 (x2)
+
+ 4. x, y specified
+ x = 67.7% = 325.0
+ y = 34.6% = 125.0
+ width defaults to 100% of filter region (special case)
+ height defaults to 100% of filter region (special case)
+ -->
+ <filter id="default" x="0" y="0" width="1" height="1">
+ <feImage xlink:href="images/smiley.png"/>
+ </filter>
+ <filter id="all_specified_relative" x="0" y="0" width="1" height="1">
+ <!-- x=100/480 y=0/360 width=50/480 height=50/360-->
+ <feImage x="20.8%" y="0%" width="10.4%" height="13.8%"
+ xlink:href="images/smiley.png"/>
+ </filter>
+ <filter id="all_specified_absolute" x="0" y="0" width="1" height="1">
+ <feImage x="200" y="0" height="50" width="50"
+ xlink:href="images/smiley.png"/>
+ </filter>
+ <filter id="y_specified" x="0" y="0" width="1" height="1">
+ <feImage y="0%"
+ xlink:href="images/smiley.png"/>
+ </filter>
+ <filter id="width_specified" x="0" y="0" width="1" height="1">
+ <feImage width="20.8%"
+ xlink:href="images/smiley.png"/>
+ </filter>
+ <filter id="height_specified" x="0" y="0" width="1" height="1">
+ <feImage height="27.6%"
+ xlink:href="images/smiley.png"/>
+ </filter>
+ <filter id="width_height_specified" x="0" y="0" width="1" height="1">
+ <feImage width="20.8%" height="27.6%"
+ xlink:href="images/smiley.png"/>
+ </filter>
+ <filter id="x_y_specified" x="0" y="0" width="1" height="1">
+ <feImage x="67.7%" y="34.6%"
+ xlink:href="images/smiley.png"/>
+ </filter>
+ </defs>
+
+ <g transform="translate(60 100)">
+ <rect fill="red" width="50" height="50" filter="url(#default)"/>
+ <rect fill="red" x="100" width="50" height="50" filter="url(#all_specified_relative)"/>
+ <rect fill="red" x="200" width="50" height="50" filter="url(#all_specified_absolute)"/>
+ <rect fill="red" x="300" width="50" height="50" filter="url(#y_specified)"/>
+
+ <rect fill="red" y="100" width="50" height="50" filter="url(#width_specified)"/>
+ <rect fill="red" x="100" y="100" width="50" height="50" filter="url(#height_specified)"/>
+ <rect fill="red" x="200" y="100" width="50" height="50" filter="url(#width_height_specified)"/>
+ <rect fill="red" x="300" y="100" width="50" height="50" filter="url(#x_y_specified)"/>
+
+ <g id="reference_frames" stroke="blue" stroke-width="1" fill="none">
+ <rect width="50" height="50" />
+ <rect x="100" width="50" height="50"/>
+ <rect x="200" width="50" height="50"/>
+ <rect x="300" width="50" height="50"/>
+ <rect y="100" width="50" height="50"/>
+ <rect x="100" y="100" width="50" height="50"/>
+ <rect x="200" y="100" width="50" height="50"/>
+ <rect x="300" y="100" width="50" height="50"/>
+ </g>
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none"
+ fill="black">$Revision: 1.3 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--
+ <g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>
+ -->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-image-04-f-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/filters-image-04-f-ref.png
new file mode 100644
index 00000000..1f1a791a
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-image-04-f-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-image-04-f.svg b/rsvg/tests/fixtures/reftests/svg1.1/filters-image-04-f.svg
new file mode 100644
index 00000000..af36bd42
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-image-04-f.svg
@@ -0,0 +1,119 @@
+<svg id="svg-root" width="100%" height="100%"
+ viewBox="0 0 480 360" xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2011 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="ED" author="TB" status="accepted"
+ version="$Revision: 1.3 $" testname="$RCSfile: filters-image-04-f.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/filters.html#feImageElement">
+ <p>
+ This tests the feImage element with a number of different filter primitive subregion values.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The test is passed if:
+ </p>
+ <ul>
+ <li>the first row show four smiley faces of the same size, each framed by a blue rectangle</li>
+ <li>the first image on the left on the second row shows half a smiley face (horizontally offset)</li>
+ <li>the second image on the left on the second row shows half a smiley face (vertically offset)</li>
+ <li>the third image on the left on the second row shows the upper-lefthand quarter of the smiley face enlarged to fit the blue rectangle</li>
+ <li>the rightmost image on the second row shows the upper-lefthand quarter of the smiley face (horizontally and vertically offset)</li>
+ </ul>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: filters-image-04-f.svg,v $</title>
+ <defs>
+ <font-face
+ font-family="SVGFreeSansASCII"
+ unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <defs>
+ <filter id="default" x="0" y="0" width="1" height="1" primitiveUnits="objectBoundingBox">
+ <feImage xlink:href="images/smiley.png"/>
+ </filter>
+ <filter id="all_specified_relative" x="0" y="0" width="1" height="1" primitiveUnits="objectBoundingBox">
+ <feImage x="0%" y="0%" width="100%" height="100%"
+ xlink:href="images/smiley.png"/>
+ </filter>
+ <filter id="all_specified_absolute" x="0" y="0" width="1" height="1" primitiveUnits="objectBoundingBox">
+ <feImage x="0" y="0" height="1" width="1"
+ xlink:href="images/smiley.png"/>
+ </filter>
+ <filter id="y_specified" x="0" y="0" width="1" height="1" primitiveUnits="objectBoundingBox">
+ <feImage y="0%"
+ xlink:href="images/smiley.png"/>
+ </filter>
+ <filter id="width_specified" x="0" y="0" width="1" height="1" primitiveUnits="objectBoundingBox">
+ <feImage width="200%"
+ xlink:href="images/smiley.png"/>
+ </filter>
+ <filter id="height_specified" x="0" y="0" width="1" height="1" primitiveUnits="objectBoundingBox">
+ <feImage height="200%"
+ xlink:href="images/smiley.png"/>
+ </filter>
+ <filter id="width_height_specified" x="0" y="0" width="1" height="1" primitiveUnits="objectBoundingBox">
+ <feImage width="200%" height="200%"
+ xlink:href="images/smiley.png"/>
+ </filter>
+ <filter id="x_y_specified" x="0" y="0" width="1" height="1" primitiveUnits="objectBoundingBox">
+ <feImage x="0.5" y="0.5"
+ xlink:href="images/smiley.png"/>
+ </filter>
+ </defs>
+
+ <text text-anchor="middle" x="240" y="40" font-size="16">primitiveUnits = "objectBoundingBox"</text>
+ <g transform="translate(60 100)">
+ <rect fill="red" width="50" height="50" filter="url(#default)"/>
+ <rect fill="red" x="100" width="50" height="50" filter="url(#all_specified_relative)"/>
+ <rect fill="red" x="200" width="50" height="50" filter="url(#all_specified_absolute)"/>
+ <rect fill="red" x="300" width="50" height="50" filter="url(#y_specified)"/>
+
+ <rect fill="red" y="100" width="50" height="50" filter="url(#width_specified)"/>
+ <rect fill="red" x="100" y="100" width="50" height="50" filter="url(#height_specified)"/>
+ <rect fill="red" x="200" y="100" width="50" height="50" filter="url(#width_height_specified)"/>
+ <rect fill="red" x="300" y="100" width="50" height="50" filter="url(#x_y_specified)"/>
+
+ <g id="reference_frames" stroke="blue" stroke-width="1" fill="none">
+ <rect width="50" height="50" />
+ <rect x="100" width="50" height="50"/>
+ <rect x="200" width="50" height="50"/>
+ <rect x="300" width="50" height="50"/>
+ <rect y="100" width="50" height="50"/>
+ <rect x="100" y="100" width="50" height="50"/>
+ <rect x="200" y="100" width="50" height="50"/>
+ <rect x="300" y="100" width="50" height="50"/>
+ </g>
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none"
+ fill="black">$Revision: 1.3 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000"/>
+ <!-- comment out this watermark once the test is approved
+ <g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-image-05-f-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/filters-image-05-f-ref.png
new file mode 100644
index 00000000..f3c73786
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-image-05-f-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-image-05-f.svg b/rsvg/tests/fixtures/reftests/svg1.1/filters-image-05-f.svg
new file mode 100644
index 00000000..2a42fa4d
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-image-05-f.svg
@@ -0,0 +1,195 @@
+<svg id="svg-root" width="100%" height="100%"
+ viewBox="0 0 480 360" xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2011 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="ED" author="Tavmjong Bah" status="accepted"
+ version="$Revision: 1.3 $" testname="$RCSfile: filters-image-05-f.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/filters.html#feImageElement">
+ <p>
+ This test verifies the implementation of the preserveAspectRatio attribute on &lt;feImage&gt;
+ referencing raster content.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ This test copies coords-viewattr-02-b, substituting feImage for image.
+ It exercises the various preserveAspectRatio values. An external bitmap
+ is referenced.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The rendered picture should match the reference image exactly except for variations in the labeling text.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: filters-image-05-f.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <defs>
+ <filter id="default" x="0" y="0" width="1" height="1">
+ <feImage xlink:href="images/smiley.png"/>
+ </filter>
+ <!-- Meet -->
+ <filter id="xMinYMinMeet" x="0" y="0" width="1" height="1">
+ <feImage xlink:href="images/smiley.png" preserveAspectRatio="xMinYMin meet"/>
+ </filter>
+ <filter id="xMidYMinMeet" x="0" y="0" width="1" height="1">
+ <feImage xlink:href="images/smiley.png" preserveAspectRatio="xMidYMin meet"/>
+ </filter>
+ <filter id="xMaxYMinMeet" x="0" y="0" width="1" height="1">
+ <feImage xlink:href="images/smiley.png" preserveAspectRatio="xMaxYMin meet"/>
+ </filter>
+ <filter id="xMinYMidMeet" x="0" y="0" width="1" height="1">
+ <feImage xlink:href="images/smiley.png" preserveAspectRatio="xMinYMid meet"/>
+ </filter>
+ <filter id="xMidYMidMeet" x="0" y="0" width="1" height="1">
+ <feImage xlink:href="images/smiley.png" preserveAspectRatio="xMidYMid meet"/>
+ </filter>
+ <filter id="xMaxYMidMeet" x="0" y="0" width="1" height="1">
+ <feImage xlink:href="images/smiley.png" preserveAspectRatio="xMaxYMid meet"/>
+ </filter>
+ <filter id="xMinYMaxMeet" x="0" y="0" width="1" height="1">
+ <feImage xlink:href="images/smiley.png" preserveAspectRatio="xMinYMax meet"/>
+ </filter>
+ <filter id="xMidYMaxMeet" x="0" y="0" width="1" height="1">
+ <feImage xlink:href="images/smiley.png" preserveAspectRatio="xMidYMax meet"/>
+ </filter>
+ <filter id="xMaxYMaxMeet" x="0" y="0" width="1" height="1">
+ <feImage xlink:href="images/smiley.png" preserveAspectRatio="xMaxYMax meet"/>
+ </filter>
+ <!-- Slice -->
+ <filter id="xMinYMinSlice" x="0" y="0" width="1" height="1">
+ <feImage xlink:href="images/smiley.png" preserveAspectRatio="xMinYMin slice"/>
+ </filter>
+ <filter id="xMidYMinSlice" x="0" y="0" width="1" height="1">
+ <feImage xlink:href="images/smiley.png" preserveAspectRatio="xMidYMin slice"/>
+ </filter>
+ <filter id="xMaxYMinSlice" x="0" y="0" width="1" height="1">
+ <feImage xlink:href="images/smiley.png" preserveAspectRatio="xMaxYMin slice"/>
+ </filter>
+ <filter id="xMinYMidSlice" x="0" y="0" width="1" height="1">
+ <feImage xlink:href="images/smiley.png" preserveAspectRatio="xMinYMid slice"/>
+ </filter>
+ <filter id="xMidYMidSlice" x="0" y="0" width="1" height="1">
+ <feImage xlink:href="images/smiley.png" preserveAspectRatio="xMidYMid slice"/>
+ </filter>
+ <filter id="xMaxYMidSlice" x="0" y="0" width="1" height="1">
+ <feImage xlink:href="images/smiley.png" preserveAspectRatio="xMaxYMid slice"/>
+ </filter>
+ <filter id="xMinYMaxSlice" x="0" y="0" width="1" height="1">
+ <feImage xlink:href="images/smiley.png" preserveAspectRatio="xMinYMax slice"/>
+ </filter>
+ <filter id="xMidYMaxSlice" x="0" y="0" width="1" height="1">
+ <feImage xlink:href="images/smiley.png" preserveAspectRatio="xMidYMax slice"/>
+ </filter>
+ <filter id="xMaxYMaxSlice" x="0" y="0" width="1" height="1">
+ <feImage xlink:href="images/smiley.png" preserveAspectRatio="xMaxYMax slice"/>
+ </filter>
+ </defs>
+ <g font-size="9" transform="translate(0, 30)">
+ <desc>Example PreserveAspectRatio - demonstrate available options</desc>
+ <text text-anchor="middle" x="240" font-size="16">Test preserveAspectRatio on an feImage element.</text>
+ <text x="40" y="30" text-anchor="middle">Raster to fit</text>
+ <g transform="translate(20,40)">
+ <rect fill="red" width="40" height="40" filter="url(#default)"/>
+ </g>
+ <text x="35.5" y="110" text-anchor="middle">Viewport 1</text>
+ <g transform="translate(10,120)"><rect x='.5' y='.5' width='49' height='29' fill='none' stroke='blue'/></g>
+ <text x="35.5" y="180" text-anchor="middle">Viewport 2</text>
+ <g transform="translate(20,190)"><rect x='.5' y='.5' width='29' height='59' fill='none' stroke='blue'/></g>
+ <g id="meet-group-1" transform="translate(120, 50)">
+ <text x="0" y="-20">---------- meet --------------------</text>
+ <g>
+ <text y="-5">xMin*</text>
+ <rect x='.5' y='.5' width='49' height='29' fill='none' stroke='blue'/>
+ <rect fill="red" width="50" height="30" filter="url(#xMinYMinMeet)"/>
+ </g>
+ <g transform="translate(70,0)">
+ <text y="-5">xMid*</text>
+ <rect x='.5' y='.5' width='49' height='29' fill='none' stroke='blue'/>
+ <rect fill="red" width="50" height="30" filter="url(#xMidYMidMeet)"/>
+ </g>
+ <g transform="translate(0,50)">
+ <text y="-5">xMax*</text>
+ <rect x='.5' y='.5' width='49' height='29' fill='none' stroke='blue'/>
+ <rect fill="red" width="50" height="30" filter="url(#xMaxYMaxMeet)"/>
+ </g>
+ </g>
+ <g id="meet-group-2" transform="translate(300, 50)">
+ <text x="0" y="-20">---------- meet ------------------------</text>
+ <g>
+ <text y="-5">*YMin</text><rect x='.5' y='.5' width='29' height='59' fill='none' stroke='blue'/>
+ <rect fill="red" width="30" height="60" filter="url(#xMinYMinMeet)"/>
+ </g>
+ <g transform="translate(50, 0)">
+ <text y="-5">*YMid</text><rect x='.5' y='.5' width='29' height='59' fill='none' stroke='blue'/>
+ <rect fill="red" width="30" height="60" filter="url(#xMidYMidMeet)"/>
+ </g>
+ <g transform="translate(100, 0)">
+ <text y="-5">*YMax</text><rect x='.5' y='.5' width='29' height='59' fill='none' stroke='blue'/>
+ <rect fill="red" width="30" height="60" filter="url(#xMaxYMaxMeet)"/>
+ </g>
+ </g>
+ <g id="slice-group-1" transform="translate(120, 185)">
+ <text x="0" y="-20">---------- slice -------------------------</text>
+ <g>
+ <text y="-5">xMin*</text><rect x='.5' y='.5' width='29' height='59' fill='none' stroke='blue'/>
+ <rect fill="red" width="30" height="60" filter="url(#xMinYMinSlice)"/>
+ </g>
+ <g transform="translate(50,0)">
+ <text y="-5">xMid*</text><rect x='.5' y='.5' width='29' height='59' fill='none' stroke='blue'/>
+ <rect fill="red" width="30" height="60" filter="url(#xMidYMidSlice)"/>
+ </g>
+ <g transform="translate(100,0)">
+ <text y="-5">xMax*</text><rect x='.5' y='.5' width='29' height='59' fill='none' stroke='blue'/>
+ <rect fill="red" width="30" height="60" filter="url(#xMaxYMaxSlice)"/>
+ </g>
+ </g>
+ <g id="slide-group-2" transform="translate(300, 155) translate(0, 30)">
+ <text x="0" y="-20">---------- slice ---------------------</text>
+ <g>
+ <text y="-5">*YMin</text>
+ <rect x='.5' y='.5' width='49' height='29' fill='none' stroke='blue'/>
+ <rect fill="red" width="50" height="30" filter="url(#xMinYMinSlice)"/>
+ </g>
+ <g transform="translate(70,0)">
+ <text y="-5">*YMid</text>
+ <rect x='.5' y='.5' width='49' height='29' fill='none' stroke='blue'/>
+ <rect fill="red" width="50" height="30" filter="url(#xMidYMidSlice)"/>
+ </g>
+ <g transform="translate(0,50)">
+ <text y="-5">*YMax</text>
+ <rect x='.5' y='.5' width='49' height='29' fill='none' stroke='blue'/>
+ <rect fill="red" width="50" height="30" filter="url(#xMaxYMaxSlice)"/>
+ </g>
+ </g>
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none"
+ fill="black">$Revision: 1.3 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000"/>
+ <!-- comment out this watermark once the test is approved
+ <g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-light-01-f-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/filters-light-01-f-ref.png
new file mode 100644
index 00000000..dba98996
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-light-01-f-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-light-01-f.svg b/rsvg/tests/fixtures/reftests/svg1.1/filters-light-01-f.svg
new file mode 100644
index 00000000..796dc71e
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-light-01-f.svg
@@ -0,0 +1,187 @@
+<svg version="1.1" baseProfile="full" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="SVGWG" author="Vincent Hardy" status="accepted"
+ version="$Revision: 1.6 $" testname="$RCSfile: filters-light-01-f.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/filters.html#LightSourceDefinitions">
+ <p>
+ Verify the basic operation of the different lights used in the feDiffuseLighting
+ and feSpecularLighting elements. The test uses the same feDiffuseLighting filter,
+ using different lights.
+ </p>
+ <p>
+ The first row shows different settings for feDistantLight. The second row shows
+ different settings for fePointLight. The last row shows different settings for
+ feSpotLight.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The rendered image should look approximately like the reference image, except for the last
+ feSpotLight test for which a reference image could not be created. The reference image may not be pixel accurate. However, the rendered image should show
+ at least 'similar' lighting results and bump maps.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: filters-light-01-f.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <!-- Title -->
+ <text x="240" y="20" fill="black" font-size="12" font-family="Arial" text-anchor="middle">Filters: feDistantLight, fePointLight, feSpotLight</text>
+ <!-- ===================================================================== -->
+ <!-- Filter definitions -->
+ <!-- ===================================================================== -->
+ <defs>
+ <!-- ================================================= -->
+ <!-- feDistantLight -->
+ <!-- ================================================= -->
+ <filter id="distantLightA" filterUnits="objectBoundingBox" x="0" y="0" width="1" height="1">
+ <feDiffuseLighting in="SourceGraphic" diffuseConstant="1" surfaceScale="10" lighting-color="white">
+ <feDistantLight azimuth="0" elevation="0"/>
+ </feDiffuseLighting>
+ </filter>
+ <filter id="distantLightB" filterUnits="objectBoundingBox" x="0" y="0" width="1" height="1">
+ <feDiffuseLighting in="SourceGraphic" diffuseConstant="1" surfaceScale="10" lighting-color="white">
+ <feDistantLight azimuth="45" elevation="0"/>
+ </feDiffuseLighting>
+ </filter>
+ <filter id="distantLightC" filterUnits="objectBoundingBox" x="0" y="0" width="1" height="1">
+ <feDiffuseLighting in="SourceGraphic" diffuseConstant="1" surfaceScale="10" lighting-color="white">
+ <feDistantLight azimuth="0" elevation="45"/>
+ </feDiffuseLighting>
+ </filter>
+ <filter id="distantLightD" filterUnits="objectBoundingBox" x="0" y="0" width="1" height="1">
+ <feDiffuseLighting in="SourceGraphic" diffuseConstant="1" surfaceScale="10" lighting-color="white">
+ <feDistantLight azimuth="45" elevation="45"/>
+ </feDiffuseLighting>
+ </filter>
+ <!-- ================================================= -->
+ <!-- fePointLight -->
+ <!-- ================================================= -->
+ <filter id="pointLightA" filterUnits="objectBoundingBox" x="0" y="0" width="1" height="1">
+ <feDiffuseLighting in="SourceGraphic" diffuseConstant="1" surfaceScale="10" lighting-color="white">
+ <fePointLight x="0" y="0" z="10"/>
+ </feDiffuseLighting>
+ </filter>
+ <filter id="pointLightB" filterUnits="objectBoundingBox" x="0" y="0" width="1" height="1">
+ <feDiffuseLighting in="SourceGraphic" diffuseConstant="1" surfaceScale="10" lighting-color="white">
+ <fePointLight x="50" y="0" z="10"/>
+ </feDiffuseLighting>
+ </filter>
+ <filter id="pointLightC" filterUnits="objectBoundingBox" x="0" y="0" width="1" height="1">
+ <feDiffuseLighting in="SourceGraphic" diffuseConstant="1" surfaceScale="10" lighting-color="white">
+ <fePointLight x="0" y="30" z="10"/>
+ </feDiffuseLighting>
+ </filter>
+ <filter id="pointLightD" filterUnits="objectBoundingBox" x="0" y="0" width="1" height="1">
+ <feDiffuseLighting in="SourceGraphic" diffuseConstant="1" surfaceScale="10" lighting-color="white">
+ <fePointLight x="50" y="30" z="10"/>
+ </feDiffuseLighting>
+ </filter>
+ <!-- ================================================= -->
+ <!-- feSpotLight -->
+ <!-- ================================================= -->
+ <filter id="spotLightA" filterUnits="objectBoundingBox" x="0" y="0" width="1" height="1">
+ <feDiffuseLighting in="SourceGraphic" diffuseConstant="1" surfaceScale="10" lighting-color="white">
+ <feSpotLight x="25" y="0" z="35" pointsAtX="25" pointsAtY="30" pointsAtZ="0" specularExponent="0"/>
+ </feDiffuseLighting>
+ </filter>
+ <filter id="spotLightB" filterUnits="objectBoundingBox" x="0" y="0" width="1" height="1">
+ <feDiffuseLighting in="SourceGraphic" diffuseConstant="1" surfaceScale="10" lighting-color="white">
+ <feSpotLight x="25" y="30" z="35" pointsAtX="25" pointsAtY="0" pointsAtZ="0" specularExponent="0"/>
+ </feDiffuseLighting>
+ </filter>
+ <filter id="spotLightC" filterUnits="objectBoundingBox" x="0" y="0" width="1" height="1">
+ <feDiffuseLighting in="SourceGraphic" diffuseConstant="1" surfaceScale="10" lighting-color="white">
+ <feSpotLight x="25" y="0" z="35" pointsAtX="25" pointsAtY="30" pointsAtZ="0" specularExponent="1"/>
+ </feDiffuseLighting>
+ </filter>
+ <filter id="spotLightD" filterUnits="objectBoundingBox" x="0" y="0" width="1" height="1">
+ <feDiffuseLighting in="SourceGraphic" diffuseConstant="1" surfaceScale="10" lighting-color="white">
+ <feSpotLight x="25" y="0" z="35" pointsAtX="25" pointsAtY="30" pointsAtZ="0" specularExponent="0" limitingConeAngle="30"/>
+ </feDiffuseLighting>
+ </filter>
+ </defs>
+ <!-- ==================================================== -->
+ <!-- The same image is rendered multiple times with using -->
+ <!-- different filters. -->
+ <!-- ==================================================== -->
+ <!-- Various feDistantLights -->
+ <g transform="translate(0, 40)">
+ <text x="70" y="10">Various values for feDistantLight azimuth and elevation</text>
+ <text x="70" y="25">(0, 0)</text>
+ <text x="165" y="25">(45, 0)</text>
+ <text x="260" y="25">(0, 45)</text>
+ <text x="355" y="25">(45, 45)</text>
+ <image xlink:href="images/bumpMap2.png" x="70" y="30" width="50" height="30" filter="url(#distantLightA)"/>
+ <image xlink:href="images/bumpMap2.png" x="165" y="30" width="50" height="30" filter="url(#distantLightB)"/>
+ <image xlink:href="images/bumpMap2.png" x="260" y="30" width="50" height="30" filter="url(#distantLightC)"/>
+ <image xlink:href="images/bumpMap2.png" x="355" y="30" width="50" height="30" filter="url(#distantLightD)"/>
+ </g>
+ <!-- Various fePointLights -->
+ <g transform="translate(0, 120)">
+ <text x="70" y="10">Various values for fePointLight's x, y and z</text>
+ <text x="70" y="25">(0, 0, 10)</text>
+ <text x="165" y="25">(50, 0, 10)</text>
+ <text x="260" y="25">(0, 30, 10)</text>
+ <text x="355" y="25">(50, 30, 10)</text>
+ </g>
+ <g>
+ <image transform="translate(70, 150)" xlink:href="images/bumpMap2.png" width="50" height="30" filter="url(#pointLightA)"/>
+ <image transform="translate(165, 150)" xlink:href="images/bumpMap2.png" width="50" height="30" filter="url(#pointLightB)"/>
+ <image transform="translate(260, 150)" xlink:href="images/bumpMap2.png" width="50" height="30" filter="url(#pointLightC)"/>
+ <image transform="translate(355, 150)" xlink:href="images/bumpMap2.png" width="50" height="30" filter="url(#pointLightD)"/>
+ </g>
+ <!-- feSpotLight -->
+ <g transform="translate(0, 210)">
+ <text x="70" y="0">Various values for feSpotLight's x, y, z, pointsAtX, pointsAtY, pointsAtZ</text>
+ <text x="70" y="15">(25, 0, 25)</text>
+ <text x="70" y="30">(25, 30, 0)</text>
+ <text x="165" y="15">(25, 30, 25)</text>
+ <text x="165" y="30">(25, 0, 0)</text>
+ <text x="260" y="30">np=1</text>
+ <text x="355" y="30">limitingConeAngle=30</text>
+ </g>
+ <g>
+ <rect transform="translate(70, 245)" width="50" height="30" filter="url(#spotLightA)"/>
+ <rect transform="translate(165, 245)" width="50" height="30" filter="url(#spotLightB)"/>
+ <rect transform="translate(260, 245)" width="50" height="30" filter="url(#spotLightC)"/>
+ <rect transform="translate(355, 245)" width="50" height="30" filter="url(#spotLightD)"/>
+ </g>
+ <!-- ===================================================== -->
+ <!-- Legends -->
+ <!-- ===================================================== -->
+ <!-- Surface Scale -->
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.6 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-light-02-f-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/filters-light-02-f-ref.png
new file mode 100644
index 00000000..151c105e
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-light-02-f-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-light-02-f.svg b/rsvg/tests/fixtures/reftests/svg1.1/filters-light-02-f.svg
new file mode 100644
index 00000000..c5b61328
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-light-02-f.svg
@@ -0,0 +1,97 @@
+<svg id="svg-root" width="100%" height="100%"
+ viewBox="0 0 480 360" xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= Copyright 2008 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.3" reviewer="CM" author="ED" status="accepted"
+ version="$Revision: 1.6 $" testname="$RCSfile: filters-light-02-f.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/filters.html#feDistantLightAzimuthAttribute">
+ <p>
+ This test verifies that the <a>'azimuth'</a> attribute is interpreted as a clockwise value in degrees.
+ </p>
+<p>The test should show four arrows, indicating the direction of the incoming distant light.
+ As the four circles are lit by a specular lighting filter a faint shaded arc should appear.
+ The middle of each such arc should be where the corresponding arrow points.</p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The test has passed if the shaded arcs are displayed only on the side indicated by the arrows.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: filters-light-02-f.svg,v $</title>
+ <defs>
+ <font-face
+ font-family="SVGFreeSansASCII"
+ unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <defs>
+ <filter id="right">
+ <feSpecularLighting surfaceScale="5" specularConstant="100" specularExponent="10">
+ <feDistantLight azimuth="0" elevation="30"/>
+ </feSpecularLighting>
+ </filter>
+ <filter id="down">
+ <feSpecularLighting surfaceScale="5" specularConstant="100" specularExponent="10">
+ <feDistantLight azimuth="90" elevation="30"/>
+ </feSpecularLighting>
+ </filter>
+ <filter id="left">
+ <feSpecularLighting surfaceScale="5" specularConstant="100" specularExponent="10">
+ <feDistantLight azimuth="180" elevation="30"/>
+ </feSpecularLighting>
+ </filter>
+ <filter id="up">
+ <feSpecularLighting surfaceScale="5" specularConstant="100" specularExponent="10">
+ <feDistantLight azimuth="270" elevation="30"/>
+ </feSpecularLighting>
+ </filter>
+
+ <marker id="arrow" markerWidth="10" markerHeight="10" viewBox="0 0 10 40" overflow="visible" orient="auto">
+ <path d="M-1 5l10 -5l-10 -5z"/>
+ </marker>
+ </defs>
+
+ <text x="50%" y="3em" style="font-size:18px; text-anchor:middle">'feDistantLight' azimuth</text>
+
+ <g transform="scale(4) translate(0 50)">
+ <circle id="c1" r="10" filter="url(#right)" transform="translate(20 0)"/>
+ <circle id="c2" r="10" filter="url(#down)" transform="translate(50 0)"/>
+ <circle id="c3" r="10" filter="url(#left)" transform="translate(80 0)"/>
+ <circle id="c4" r="10" filter="url(#up)" transform="translate(110 0)"/>
+ </g>
+
+ <line marker-end="url(#arrow)" x1="0" y1="-25" x2="0" y2="25" stroke="black" stroke-width="3" transform="translate(200 180)"/>
+ <line marker-end="url(#arrow)" x1="0" y1="-25" x2="0" y2="25" stroke="black" stroke-width="3" transform="rotate(90) translate(200 -350)"/>
+ <line marker-end="url(#arrow)" x1="0" y1="-25" x2="0" y2="25" stroke="black" stroke-width="3" transform="rotate(180) translate(-440 -225)"/>
+ <line marker-end="url(#arrow)" x1="0" y1="-25" x2="0" y2="25" stroke="black" stroke-width="3" transform="rotate(270) translate(-200 50)"/>
+
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none"
+ fill="black">$Revision: 1.6 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000"/>
+ <!-- comment out this watermark once the test is approved --><!--
+ <g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-light-03-f-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/filters-light-03-f-ref.png
new file mode 100644
index 00000000..58830d08
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-light-03-f-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-light-03-f.svg b/rsvg/tests/fixtures/reftests/svg1.1/filters-light-03-f.svg
new file mode 100644
index 00000000..65238a99
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-light-03-f.svg
@@ -0,0 +1,124 @@
+<svg id="svg-root" width="100%" height="100%"
+ viewBox="0 0 480 360" xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= Copyright 2008 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.3" reviewer="CL" author="ED" status="accepted"
+ version="$Revision: 1.10 $" testname="$RCSfile: filters-light-03-f.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/filters.html#feDisplacementMap">
+ <p>
+ Test resolving of 'primitiveUnits' on the 'z' attribute of 'fePointLight'.
+You should see some shapes that have a black border, three circles and three rectangles.
+ The fill of these shapes should look the same.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The test has passed if:
+ </p>
+ <ul>
+ <li>All of the circles look identical</li>
+ <li>The shapes all look like they have been filled with a gradient</li>
+ <li>No parts of the fill extend outside the black borders</li>
+ <li>All of the rects look identical</li>
+ <li>The circles must be fully filled by the filter output, which should resemble a radial gradient with a white focal point in the lower right position (about four o'clock, as shown by the small white circles)</li>
+ <li>The rects must be fully filled by the filter output, which should resemble a radial gradient with a white focal point in the lower right corner.</li>
+ </ul>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: filters-light-03-f.svg,v $</title>
+ <defs>
+ <font-face
+ font-family="SVGFreeSansASCII"
+ unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <defs>
+ <filter id="light-primobjbbox" primitiveUnits="objectBoundingBox">
+ <feSpecularLighting lighting-color="blue" surfaceScale="5" specularConstant="10" specularExponent="6">
+ <!-- Note: for z this assumes that the scalefactor is
+ sqrt(bbox.width*bbox.width + bbox.height*bbox.height)/sqrt(2) -->
+ <fePointLight x="0.875" y="0.875" z="-0.0625"/>
+ </feSpecularLighting>
+ <feComposite operator="in" in2="SourceGraphic"/>
+ </filter>
+ <filter id="light-primobjbbox-rect" primitiveUnits="objectBoundingBox">
+ <feSpecularLighting lighting-color="blue" surfaceScale="5" specularConstant="10" specularExponent="6">
+ <!-- Note: for z the scalefactor is 31,622776601683793319988935444327
+ sqrt(bbox.width*bbox.width + bbox.height*bbox.height)/sqrt(2) -->
+ <fePointLight x="0.75" y="1.5" z="-0.15811388300841896659994467722167"/>
+ </feSpecularLighting>
+ <feComposite operator="in" in2="SourceGraphic"/>
+ </filter>
+ <filter id="light-primusou" primitiveUnits="userSpaceOnUse">
+ <feSpecularLighting lighting-color="blue" surfaceScale="5" specularConstant="10" specularExponent="6">
+ <fePointLight x="30" y="30" z="-5"/>
+ </feSpecularLighting>
+ <feComposite operator="in" in2="SourceGraphic"/>
+ </filter>
+ <filter id="light-primdefault">
+ <feSpecularLighting lighting-color="blue" surfaceScale="5" specularConstant="10" specularExponent="6">
+ <fePointLight x="30" y="30" z="-5"/>
+ </feSpecularLighting>
+ <feComposite operator="in" in2="SourceGraphic"/>
+ </filter>
+ </defs>
+
+ <g stroke="black" transform="translate(80 100)">
+ <circle r="40" stroke-width="10" filter="url(#light-primobjbbox)" fill="black"/>
+ <circle r="44" stroke-width="1" fill="none"/>
+ <rect width="40" height="20" filter="url(#light-primobjbbox-rect)" fill="black" transform="translate(-20 60)"/>
+ <rect width="40" height="20" fill="none" transform="translate(-20 60)"/>
+ <text y="100" font-size="8" stroke="none" text-anchor="middle">primitiveUnits="objectBoundingBox"</text>
+ <circle cx="30" cy="30" r="5" fill="white"/>
+ </g>
+
+ <g stroke="black" transform="translate(245 100)">
+ <circle r="40" stroke-width="10" filter="url(#light-primusou)" fill="black"/>
+ <circle r="44" stroke-width="1" fill="none"/>
+ <rect width="40" height="20" filter="url(#light-primusou)" fill="black" transform="translate(-20 60)"/>
+ <rect width="40" height="20" fill="none" transform="translate(-20 60)"/>
+ <text y="100" font-size="8" stroke="none" text-anchor="middle">primitiveUnits="userSpaceOnUse"</text>
+ <circle cx="30" cy="30" r="5" fill="white"/>
+ </g>
+
+ <g stroke="black" transform="translate(400 100)">
+ <circle r="40" stroke-width="10" filter="url(#light-primdefault)" fill="black"/>
+ <circle r="44" stroke-width="1" fill="none"/>
+ <rect width="40" height="20" filter="url(#light-primdefault)" fill="black" transform="translate(-20 60)"/>
+ <rect width="40" height="20" fill="none" transform="translate(-20 60)"/>
+ <text y="100" font-size="8" stroke="none" text-anchor="middle">primitiveUnits unspecified</text>
+ <circle cx="30" cy="30" r="5" fill="white"/>
+ </g>
+ </g>
+
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none"
+ fill="black">$Revision: 1.10 $</text>
+ </g>
+
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000"/>
+ <!-- comment out this watermark once the test is approved --><!--
+ <g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
+
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-light-04-f-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/filters-light-04-f-ref.png
new file mode 100644
index 00000000..5a309987
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-light-04-f-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-light-04-f.svg b/rsvg/tests/fixtures/reftests/svg1.1/filters-light-04-f.svg
new file mode 100644
index 00000000..9b942ae8
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-light-04-f.svg
@@ -0,0 +1,136 @@
+<svg version="1.1" baseProfile="full" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="CL" author="ED" status="accepted"
+ version="$Revision: 1.4 $" testname="$RCSfile: filters-light-04-f.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/filters.html#feSpotLightLimitingConeAngleAttribute">
+ <p>
+ Test various values for limitingConeAngle in feSpotLight.
+ </p>
+ <p>
+ There should be four rects in two rows. Each of the rects has a different filter applied,
+ and each of those filters uses different values for limitingConeAngle.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The rendered image should look approximately like the reference image, and the third rectangle from the left
+ in each row must be animated.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: filters-light-04-f.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <!-- Title -->
+ <text x="240" y="50" fill="black" font-size="16" font-family="Arial" text-anchor="middle">feSpotLight's limitingConeAngle</text>
+ <!-- ===================================================================== -->
+ <!-- Filter definitions -->
+ <!-- ===================================================================== -->
+ <defs>
+ <!-- ================================================= -->
+ <!-- feSpotLight -->
+ <!-- ================================================= -->
+ <filter id="spotLightA" filterUnits="objectBoundingBox" x="0" y="0" width="1" height="1">
+ <feDiffuseLighting in="SourceGraphic" diffuseConstant="1" surfaceScale="10" lighting-color="white">
+ <feSpotLight x="25" y="0" z="35" pointsAtX="25" pointsAtY="30" pointsAtZ="0" specularExponent="0" limitingConeAngle="30"/>
+ </feDiffuseLighting>
+ </filter>
+ <filter id="spotLightB" filterUnits="objectBoundingBox" x="0" y="0" width="1" height="1">
+ <feDiffuseLighting in="SourceGraphic" diffuseConstant="1" surfaceScale="10" lighting-color="white">
+ <feSpotLight x="25" y="0" z="35" pointsAtX="25" pointsAtY="30" pointsAtZ="0" specularExponent="0" limitingConeAngle="20"/>
+ </feDiffuseLighting>
+ </filter>
+ <filter id="spotLightC" filterUnits="objectBoundingBox" x="0" y="0" width="1" height="1">
+ <feDiffuseLighting in="SourceGraphic" diffuseConstant="1" surfaceScale="10" lighting-color="white">
+ <!-- librsvg note: we don't support animation, but let's not miss out on a test image.
+ Animation replaced with just final values. -->
+ <feSpotLight x="25" y="0" z="35" pointsAtX="25" pointsAtY="30" pointsAtZ="0" specularExponent="0" limitingConeAngle="50"/>
+ </feDiffuseLighting>
+ </filter>
+ <filter id="spotLightD" filterUnits="objectBoundingBox" x="0" y="0" width="1" height="1">
+ <feDiffuseLighting in="SourceGraphic" diffuseConstant="1" surfaceScale="10" lighting-color="white">
+ <feSpotLight x="25" y="0" z="35" pointsAtX="25" pointsAtY="30" pointsAtZ="0" specularExponent="0" limitingConeAngle="5"/>
+ </feDiffuseLighting>
+ </filter>
+ <filter id="spotLightE" filterUnits="objectBoundingBox" x="0" y="0" width="1" height="1">
+ <feDiffuseLighting in="SourceGraphic" diffuseConstant="1" surfaceScale="10" lighting-color="white">
+ <feSpotLight x="25" y="0" z="35" pointsAtX="25" pointsAtY="30" pointsAtZ="0" specularExponent="0" limitingConeAngle="-30"/>
+ </feDiffuseLighting>
+ </filter>
+ <filter id="spotLightF" filterUnits="objectBoundingBox" x="0" y="0" width="1" height="1">
+ <feDiffuseLighting in="SourceGraphic" diffuseConstant="1" surfaceScale="10" lighting-color="white">
+ <feSpotLight x="25" y="0" z="35" pointsAtX="25" pointsAtY="30" pointsAtZ="0" specularExponent="0" limitingConeAngle="-20"/>
+ </feDiffuseLighting>
+ </filter>
+ <filter id="spotLightG" filterUnits="objectBoundingBox" x="0" y="0" width="1" height="1">
+ <feDiffuseLighting in="SourceGraphic" diffuseConstant="1" surfaceScale="10" lighting-color="white">
+ <feSpotLight x="25" y="0" z="35" pointsAtX="25" pointsAtY="30" pointsAtZ="0" specularExponent="0" limitingConeAngle="-50"/>
+ </feDiffuseLighting>
+ </filter>
+ <filter id="spotLightH" filterUnits="objectBoundingBox" x="0" y="0" width="1" height="1">
+ <feDiffuseLighting in="SourceGraphic" diffuseConstant="1" surfaceScale="10" lighting-color="white">
+ <!-- librsvg note: we don't support animation, but let's not miss out on a test image.
+ Animation replaced with just final values. -->
+ <feSpotLight x="25" y="0" z="35" pointsAtX="25" pointsAtY="30" pointsAtZ="0" specularExponent="0" limitingConeAngle="-5"/>
+ </feDiffuseLighting>
+ </filter>
+ </defs>
+ <!-- feSpotLight -->
+ <g transform="translate(0 -20)">
+ <g transform="translate(0 110)" font-size="9" font-family="Arial">
+ <text x="70" y="30">30</text>
+ <text x="165" y="30">20</text>
+ <text x="260" y="30">Animated (0..50)</text>
+ <text x="355" y="30">5</text>
+ <g transform="translate(0 100)">
+ <text x="70" y="30">-30</text>
+ <text x="165" y="30">-20</text>
+ <text x="260" y="30">Animated (0..-50)</text>
+ <text x="355" y="30">-5</text>
+ </g>
+ </g>
+ <g>
+ <rect transform="translate(70, 145)" width="50" height="30" filter="url(#spotLightA)"/>
+ <rect transform="translate(165, 145)" width="50" height="30" filter="url(#spotLightB)"/>
+ <rect transform="translate(260, 145)" width="50" height="30" filter="url(#spotLightC)"/>
+ <rect transform="translate(355, 145)" width="50" height="30" filter="url(#spotLightD)"/>
+ <rect transform="translate(70, 245)" width="50" height="30" filter="url(#spotLightE)"/>
+ <rect transform="translate(165, 245)" width="50" height="30" filter="url(#spotLightF)"/>
+ <rect transform="translate(260, 245)" width="50" height="30" filter="url(#spotLightG)"/>
+ <rect transform="translate(355, 245)" width="50" height="30" filter="url(#spotLightH)"/>
+ </g>
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.4 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-light-05-f-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/filters-light-05-f-ref.png
new file mode 100644
index 00000000..9b9ed92a
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-light-05-f-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-light-05-f.svg b/rsvg/tests/fixtures/reftests/svg1.1/filters-light-05-f.svg
new file mode 100644
index 00000000..a880bb3b
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-light-05-f.svg
@@ -0,0 +1,252 @@
+<svg id="svg-root" width="100%" height="100%"
+ viewBox="0 0 480 360" xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= Copyright 2008 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.3" reviewer="ED" author="AG" status="reviewed"
+ version="$Revision: 1.3 $" testname="$RCSfile: filters-light-05-f.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/filters.html#feDistantLightElevationAttribute">
+ <p>
+ This test verifies that the <a>'elevation'</a> attribute is interpreted as a
+ complementary value to the z-axis in degrees.
+ </p>
+ <p>
+ The test shows four different elevation angles that can be used for feDistantLight source.
+ The four different feDistantLight light sources are used in three different filter cases; feDiffuseLight, feSpecularLight
+ and feMerge which merges both feDiffuseLight and feSpecularLight to form a single filter. Using four different elevation values
+ in three different filter cases gives twelve different filters. All twelve filter cases are applied to a vector graphic and
+ then to a raster graphic. The vector graphic results are shown to the left and the raster graphic results are shown to the right.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The test has passed if
+ </p>
+ <ul>
+ <li>The top row has from left to right for a single graphic set:
+ <ul>
+ <li>A green square with a black circle inside of it</li>
+ <li>A black square</li>
+ <li>A black square with a green semicircle inside the lefthand side of the rect</li>
+ <li>A black square with a green semicircle inside the righthand side of the rect</li>
+ </ul>
+ </li>
+ <li>The middle row has from left to right for a single graphic set:
+ <ul>
+ <li>A green square with a white circle inside of it</li>
+ <li>A green semicircle pointing to the right on top of a white background</li>
+ <li>A green square with a white crest inside pointing to the right</li>
+ <li>A green square with a white crest inside pointing to the left</li>
+ </ul>
+ </li>
+ <li>The bottom row has from left to right for a single graphic set:
+ <ul>
+ <li>A green square with a black circle inside of it</li>
+ <li>A black square with a green semicircle inside pointing to the right</li>
+ <li>A green square with a circle inside that has a shadow on the righthand side and a reflection on the lefthand side</li>
+ <li>A green square with a circle inside that has a shadow on the lefthand side and a reflection on the righthand side</li>
+ </ul>
+ </li>
+ </ul>
+ <p>
+ If the test shows any red, the test has failed.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: filters-light-05-f.svg,v $</title>
+ <defs>
+ <font-face
+ font-family="SVGFreeSansASCII"
+ unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <defs color="#00FF00">
+ <filter id="distantLightUp">
+ <feDiffuseLighting in="SourceGraphic" surfaceScale="10" diffuseConstant="1" lighting-color="currentColor">
+ <feDistantLight azimuth="0" elevation="90"/>
+ </feDiffuseLighting>
+ </filter>
+ <filter id="distantLightDown">
+ <feDiffuseLighting in="SourceGraphic" surfaceScale="10" diffuseConstant="1" lighting-color="currentColor">
+ <feDistantLight azimuth="0" elevation="270"/>
+ </feDiffuseLighting>
+ </filter>
+ <filter id="distantLightLeft">
+ <feDiffuseLighting in="SourceGraphic" surfaceScale="10" diffuseConstant="1" lighting-color="currentColor">
+ <feDistantLight azimuth="0" elevation="180"/>
+ </feDiffuseLighting>
+ </filter>
+ <filter id="distantLightRight">
+ <feDiffuseLighting in="SourceGraphic" surfaceScale="10" diffuseConstant="1" lighting-color="currentColor">
+ <feDistantLight azimuth="0" elevation="0"/>
+ </feDiffuseLighting>
+ </filter>
+
+ <filter id="specularLightUp">
+ <feSpecularLighting in="SourceGraphic" surfaceScale="10" specularConstant="1" specularExponent="1" lighting-color="currentColor">
+ <feDistantLight azimuth="0" elevation="90"/>
+ </feSpecularLighting>
+ </filter>
+ <filter id="specularLightDown">
+ <feSpecularLighting in="SourceGraphic" surfaceScale="10" specularConstant="1" specularExponent="1" lighting-color="currentColor">
+ <feDistantLight azimuth="0" elevation="270"/>
+ </feSpecularLighting>
+ </filter>
+ <filter id="specularLightLeft">
+ <feSpecularLighting in="SourceGraphic" surfaceScale="10" specularConstant="1" specularExponent="1" lighting-color="currentColor">
+ <feDistantLight azimuth="0" elevation="180"/>
+ </feSpecularLighting>
+ </filter>
+ <filter id="specularLightRight">
+ <feSpecularLighting in="SourceGraphic" surfaceScale="10" specularConstant="1" specularExponent="1" lighting-color="currentColor">
+ <feDistantLight azimuth="0" elevation="0"/>
+ </feSpecularLighting>
+ </filter>
+
+ <filter id="combinedUp">
+ <feDiffuseLighting in="SourceGraphic" surfaceScale="10" diffuseConstant="1" lighting-color="currentColor" result="res_a">
+ <feDistantLight azimuth="0" elevation="90"/>
+ </feDiffuseLighting>
+ <feSpecularLighting in="SourceGraphic" surfaceScale="10" specularConstant="1" specularExponent="1" lighting-color="currentColor" result="res_b">
+ <feDistantLight azimuth="0" elevation="90"/>
+ </feSpecularLighting>
+ <feMerge>
+ <feMergeNode in="res_a"/>
+ <feMergeNode in="res_b"/>
+ </feMerge>
+ </filter>
+ <filter id="combinedDown">
+ <feDiffuseLighting in="SourceGraphic" surfaceScale="10" diffuseConstant="1" lighting-color="currentColor" result="res_a">
+ <feDistantLight azimuth="0" elevation="270"/>
+ </feDiffuseLighting>
+ <feSpecularLighting in="SourceGraphic" surfaceScale="10" specularConstant="1" specularExponent="1" lighting-color="currentColor" result="res_b">
+ <feDistantLight azimuth="0" elevation="270"/>
+ </feSpecularLighting>
+ <feMerge>
+ <feMergeNode in="res_a"/>
+ <feMergeNode in="res_b"/>
+ </feMerge>
+ </filter>
+ <filter id="combinedLeft">
+ <feDiffuseLighting in="SourceGraphic" surfaceScale="10" diffuseConstant="1" lighting-color="currentColor" result="res_a">
+ <feDistantLight azimuth="0" elevation="180"/>
+ </feDiffuseLighting>
+ <feSpecularLighting in="SourceGraphic" surfaceScale="10" specularConstant="1" specularExponent="1" lighting-color="currentColor" result="res_b">
+ <feDistantLight azimuth="0" elevation="180"/>
+ </feSpecularLighting>
+ <feMerge>
+ <feMergeNode in="res_a"/>
+ <feMergeNode in="res_b"/>
+ </feMerge>
+ </filter>
+ <filter id="combinedRight">
+ <feDiffuseLighting in="SourceGraphic" surfaceScale="10" diffuseConstant="1" lighting-color="currentColor" result="res_a">
+ <feDistantLight azimuth="0" elevation="0"/>
+ </feDiffuseLighting>
+ <feSpecularLighting in="SourceGraphic" surfaceScale="10" specularConstant="1" specularExponent="1" lighting-color="currentColor" result="res_b">
+ <feDistantLight azimuth="0" elevation="0"/>
+ </feSpecularLighting>
+ <feMerge>
+ <feMergeNode in="res_a"/>
+ <feMergeNode in="res_b"/>
+ </feMerge>
+ </filter>
+ </defs>
+
+ <text x="70" y="40" stroke="none" fill="black">feDiffuseLight using feDistantLight source</text>
+ <g transform="scale(1.5) translate(5 45)">
+ <circle id="c1" r="10" fill="red" filter="url(#distantLightUp)" transform="translate(20 0)"/>
+ <circle id="c2" r="10" fill="red" filter="url(#distantLightDown)" transform="translate(50 0)"/>
+ <circle id="c3" r="10" fill="red" filter="url(#distantLightLeft)" transform="translate(80 0)"/>
+ <circle id="c4" r="10" fill="red" filter="url(#distantLightRight)" transform="translate(110 0)"/>
+ </g>
+ <text x="20" y="100" font-size="10" stroke="none" fill="black">90 deg</text>
+ <text x="65" y="100" font-size="10" stroke="none" fill="black">270 deg</text>
+ <text x="110" y="100" font-size="10" stroke="none" fill="black">180 deg</text>
+ <text x="160" y="100" font-size="10" stroke="none" fill="black">0 deg</text>
+
+ <text x="70" y="135" stroke="none" fill="black">feSpecularLight using feDistantLight source</text>
+ <g transform="scale(1.5) translate(5 110)">
+ <circle id="c1" r="10" fill="red" filter="url(#specularLightUp)" transform="translate(20 0)"/>
+ <circle id="c2" r="10" fill="red" filter="url(#specularLightDown)" transform="translate(50 0)"/>
+ <circle id="c3" r="10" fill="red" filter="url(#specularLightLeft)" transform="translate(80 0)"/>
+ <circle id="c4" r="10" fill="red" filter="url(#specularLightRight)" transform="translate(110 0)"/>
+ </g>
+ <text x="20" y="195" font-size="10" stroke="none" fill="black">90 deg</text>
+ <text x="65" y="195" font-size="10" stroke="none" fill="black">270 deg</text>
+ <text x="110" y="195" font-size="10" stroke="none" fill="black">180 deg</text>
+ <text x="160" y="195" font-size="10" stroke="none" fill="black">0 deg</text>
+
+ <text x="30" y="230" stroke="none" fill="black">feDiffuseLight and feSpecularLight using feDistantLight</text>
+ <g transform="scale(1.5) translate(5 170)">
+ <circle id="c1" r="10" fill="red" filter="url(#combinedUp)" transform="translate(20 0)"/>
+ <circle id="c2" r="10" fill="red" filter="url(#combinedDown)" transform="translate(50 0)"/>
+ <circle id="c3" r="10" fill="red" filter="url(#combinedLeft)" transform="translate(80 0)"/>
+ <circle id="c4" r="10" fill="red" filter="url(#combinedRight)" transform="translate(110 0)"/>
+ </g>
+ <text x="20" y="290" font-size="10" stroke="none" fill="black">90 deg</text>
+ <text x="65" y="290" font-size="10" stroke="none" fill="black">270 deg</text>
+ <text x="110" y="290" font-size="10" stroke="none" fill="black">180 deg</text>
+ <text x="160" y="290" font-size="10" stroke="none" fill="black">0 deg</text>
+
+ <g transform="translate(0, 55)">
+ <image xlink:href="images/bumpMap3.png" x="240" y="0" width="40" height="30" filter="url(#distantLightUp)"/>
+ <image xlink:href="images/bumpMap3.png" x="300" y="0" width="40" height="30" filter="url(#distantLightDown)"/>
+ <image xlink:href="images/bumpMap3.png" x="360" y="0" width="40" height="30" filter="url(#distantLightLeft)"/>
+ <image xlink:href="images/bumpMap3.png" x="420" y="0" width="40" height="30" filter="url(#distantLightRight)"/>
+ </g>
+ <text x="245" y="100" font-size="10" stroke="none" fill="black">90 deg</text>
+ <text x="305" y="100" font-size="10" stroke="none" fill="black">270 deg</text>
+ <text x="365" y="100" font-size="10" stroke="none" fill="black">180 deg</text>
+ <text x="430" y="100" font-size="10" stroke="none" fill="black">0 deg</text>
+
+ <g transform="translate(0, 150)">
+ <image xlink:href="images/bumpMap3.png" x="240" y="0" width="40" height="30" filter="url(#specularLightUp)"/>
+ <image xlink:href="images/bumpMap3.png" x="300" y="0" width="40" height="30" filter="url(#specularLightDown)"/>
+ <image xlink:href="images/bumpMap3.png" x="360" y="0" width="40" height="30" filter="url(#specularLightLeft)"/>
+ <image xlink:href="images/bumpMap3.png" x="420" y="0" width="40" height="30" filter="url(#specularLightRight)"/>
+ </g>
+ <text x="245" y="195" font-size="10" stroke="none" fill="black">90 deg</text>
+ <text x="305" y="195" font-size="10" stroke="none" fill="black">270 deg</text>
+ <text x="365" y="195" font-size="10" stroke="none" fill="black">180 deg</text>
+ <text x="430" y="195" font-size="10" stroke="none" fill="black">0 deg</text>
+
+ <g transform="translate(0, 240)">
+ <image xlink:href="images/bumpMap3.png" x="240" y="0" width="40" height="30" filter="url(#combinedUp)"/>
+ <image xlink:href="images/bumpMap3.png" x="300" y="0" width="40" height="30" filter="url(#combinedDown)"/>
+ <image xlink:href="images/bumpMap3.png" x="360" y="0" width="40" height="30" filter="url(#combinedLeft)"/>
+ <image xlink:href="images/bumpMap3.png" x="420" y="0" width="40" height="30" filter="url(#combinedRight)"/>
+ </g>
+ <text x="245" y="290" font-size="10" stroke="none" fill="black">90 deg</text>
+ <text x="305" y="290" font-size="10" stroke="none" fill="black">270 deg</text>
+ <text x="365" y="290" font-size="10" stroke="none" fill="black">180 deg</text>
+ <text x="430" y="290" font-size="10" stroke="none" fill="black">0 deg</text>
+
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none"
+ fill="black">$Revision: 1.3 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-morph-01-f-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/filters-morph-01-f-ref.png
new file mode 100644
index 00000000..83163116
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-morph-01-f-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-morph-01-f.svg b/rsvg/tests/fixtures/reftests/svg1.1/filters-morph-01-f.svg
new file mode 100644
index 00000000..af9a6b02
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-morph-01-f.svg
@@ -0,0 +1,103 @@
+<svg version="1.1" baseProfile="full" preserveAspectRatio="xMidYMid meet" zoomAndPan="magnify" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="SVGWG" author="Jon Ferraiolo" status="accepted"
+ version="$Revision: 1.8 $" testname="$RCSfile: filters-morph-01-f.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/filters.html#feMorphologyElement">
+ <p>
+ Test which verifies the basic facilities of feMorphology.
+ </p>
+ <p>
+ The test shows the same graphics filtered with four different feMorphology
+ settings. The top two have the type erode and a radius of 1(left) and 2(right).
+ The bottom two have the type dilate and a radius of 1(left) and 3(right).
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The rendered picture should match the reference image, except for possible
+ variations in the labelling text (per CSS2 rules).
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: filters-morph-01-f.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <text x="240" y="16" text-anchor="middle" font-size="12pt">Filter Effect: feMorphology</text>
+ <g transform="translate(0, -6)">
+ <defs>
+ <filter id="erode1" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+ <feMorphology operator="erode" radius="1"/>
+ </filter>
+ <filter id="erode2" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+ <feMorphology operator="erode" radius="2"/>
+ </filter>
+ <filter id="dilate1" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+ <feMorphology operator="dilate" radius="1"/>
+ </filter>
+ <filter id="dilate2" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+ <feMorphology operator="dilate" radius="3"/>
+ </filter>
+ <g id="morphologySource">
+ <g fill-rule="nonzero" clip-rule="nonzero" stroke="#000000" stroke-miterlimit="4">
+ <g>
+ <path fill="#FFFFFF" stroke="#6666FF" stroke-width="7.1711" d="M81.403,78.289H3.585v-64.75h77.818v64.75z"/>
+ <path fill="none" stroke="#00FF00" stroke-width="7.1711" d="M93.261,77.536c0,23.285-18.581,42.163-41.503,42.163c-22.921,0-41.503-18.877-41.503-42.163c0-23.286,18.582-42.163,41.503-42.163c22.922,0,41.503,18.877,41.503,42.163z"/>
+ <path fill="none" stroke="#FF8000" stroke-width="7.1711" d="M98.31,28.445l13.288,27.354l29.714,4.385l-21.501,21.292l5.076,30.064L98.31,97.347l-26.577,14.194l5.076-30.064L55.307,60.184l29.714-4.385L98.31,28.445z"/>
+ <path fill="none" stroke="#FFFF00" stroke-width="7.1711" d="M131.563,26.338c0,28.559-22.79,51.709-50.901,51.709c-22.489,0-40.72-18.521-40.72-41.367c0-18.278,14.584-33.095,32.576-33.095c14.394,0,26.061,11.854,26.061,26.475 c0,11.698-9.334,21.181-20.849,21.181c-9.211,0-16.68-7.586-16.68-16.944c0-7.486,5.975-13.555,13.344-13.555c5.895,0,10.674,4.855,10.674,10.844c0,4.791-3.823,8.676-8.54,8.676c-3.773,0-6.832-3.107-6.832-6.941"/>
+ </g>
+ </g>
+ </g>
+ </defs>
+ <g text-anchor="middle">
+ <g transform="translate(0, 0)">
+ <use xlink:href="#morphologySource" x="35" y="25" filter="url(#erode1)"/>
+ <text x="110" y="156">type=erode radius=1</text>
+ </g>
+ <g transform="translate(255, 0)">
+ <use xlink:href="#morphologySource" x="35" y="25" filter="url(#erode2)"/>
+ <text x="110" y="156">type=erode radius=2</text>
+ </g>
+ <g transform="translate(0, 140)">
+ <use xlink:href="#morphologySource" x="35" y="25" filter="url(#dilate1)"/>
+ <text x="110" y="156">type=dilate radius=1</text>
+ </g>
+ <g transform="translate(255, 140)">
+ <use xlink:href="#morphologySource" x="35" y="25" filter="url(#dilate2)"/>
+ <text x="110" y="156">type=dilate radius=3</text>
+ </g>
+ </g>
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.8 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-offset-01-b-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/filters-offset-01-b-ref.png
new file mode 100644
index 00000000..37c8eefb
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-offset-01-b-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-offset-01-b.svg b/rsvg/tests/fixtures/reftests/svg1.1/filters-offset-01-b.svg
new file mode 100644
index 00000000..d00ad44a
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-offset-01-b.svg
@@ -0,0 +1,112 @@
+<svg version="1.1" baseProfile="basic" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="SVGWG" author="Peter Graffagnino" status="accepted"
+ version="$Revision: 1.6 $" testname="$RCSfile: filters-offset-01-b.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/filters.html#feOffsetElement">
+ <p>
+ The target crosshairs should align with
+ lower left bounds of the associated circle.
+ The color of each crosshair should match
+ the associated circle.
+ </p>
+ <p>
+ Verify the basic capability to handle the feOffset, feMerge and
+ feFlood filter nodes. Four copies of a filled circle should appear at
+ various offsets and colors. For each circle a reference crosshair is
+ drawn at the lower left of the circle to indicate the expected color,
+ opacity and position for the filtered element. The targets are drawn
+ with the standard svg path element.
+ </p>
+ <p>
+ In addition to feFlood, feMerge, and feOffset, this test uses
+ 'feComposite' to recolor the SourceGraphic with the feFlood color.
+ The source graphic uses 'circle'. The target cross hairs are drawn
+ with 'path' and use 'fill' and 'fill-opacity'.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The rendered image should match the reference image. Additionally, the
+ target crosshairs should match the color, lower left corner, and
+ opacity of each copy of the filtered circle.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: filters-offset-01-b.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <defs>
+ <filter id="FOMTest" filterUnits="objectBoundingBox" x="0" y="0" width="2.5" height="4">
+
+ <feOffset result="Off1" dx="40" dy="30"/>
+ <feFlood result="F1" flood-color="#408000" flood-opacity=".8"/>
+ <feComposite in2="Off1" operator="in" result="C1"/>
+
+ <feOffset in="SourceGraphic" result="Off2" dx="80" dy="60"/>
+ <feFlood result="F2" flood-color="#408000" flood-opacity=".6"/>
+ <feComposite in2="Off2" operator="in" result="C2"/>
+
+ <feOffset in="SourceGraphic" result="Off3" dx="120" dy="90"/>
+ <feFlood result="F3" flood-color="#408000" flood-opacity=".4"/>
+ <feComposite in2="Off3" operator="in" result="C3"/>
+
+ <feMerge>
+ <feMergeNode in="C3"/>
+ <feMergeNode in="C2"/>
+ <feMergeNode in="C1"/>
+ <feMergeNode in="SourceGraphic"/>
+ </feMerge>
+ </filter>
+ </defs>
+
+ <circle cx="160" cy="50" r="40" fill="#000" filter="url(#FOMTest)"/>
+
+ <!-- Add some crosshairs of the same color of the
+ flood at the same location as the offset -->
+
+ <!-- 20 pixel cross hair at 120,90 -->
+ <path fill="#000" transform="translate(120, 90)" d="M-1,-11h2v10h10v2h-10v10h-2v-10h-10v-2h10v-10"/>
+
+ <!-- 20 pixel cross hair at 160,120 -->
+ <path fill="#408000" fill-opacity=".8" transform="translate(160, 120)" d="M-1,-11h2v10h10v2h-10v10h-2v-10h-10v-2h10v-10"/>
+
+ <!-- 20 pixel cross hair at 200,150 -->
+ <path fill="#408000" fill-opacity=".6" transform="translate(200, 150)" d="M-1,-11h2v10h10v2h-10v10h-2v-10h-10v-2h10v-10"/>
+
+ <!-- 20 pixel cross hair at 240,180 -->
+ <path fill="#408000" fill-opacity=".4" transform="translate(240, 180)" d="M-1,-11h2v10h10v2h-10v10h-2v-10h-10v-2h10v-10"/>
+
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.6 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-overview-01-b-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/filters-overview-01-b-ref.png
new file mode 100644
index 00000000..b2a6975d
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-overview-01-b-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-overview-01-b.svg b/rsvg/tests/fixtures/reftests/svg1.1/filters-overview-01-b.svg
new file mode 100644
index 00000000..c5b9621c
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-overview-01-b.svg
@@ -0,0 +1,165 @@
+<svg version="1.1" baseProfile="basic" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="CL" author="BB" status="accepted"
+ version="$Revision: 1.8 $" testname="$RCSfile: filters-overview-01-b.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/filters.html#FilterPrimitivesOverview">
+ <p>The purpose of this file is to test the 'in' attribute on filter primitives.</p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ To pass this test, the UA must render all 6 cases (SourceGraphic, SourceAlpha, BackgroundImage, BackgroundAlpha, FillPaint, StrokePaint) correctly.
+ </p>
+ <ol>
+ <li>The result for in="SourceGraphic" is a non blurred vertical rectangle (green with dashed stroke) overlayed with three blurred circles (red/green/blue with dashed stroke).</li>
+ <li>The result for in="SourceAlpha" is a non blurred vertical rectangle (green with dashed stroke) overlayed with three blurred circles (dark gray with dashed stroke).</li>
+ <li>The result for in="BackgroundImage" is a blurred vertical rectangle (green with dashed stroke).</li>
+ <li>The result for in="BackgroundAlpha" is blurred vertical rectangle (dark gray with dashed stroke).</li>
+ <li>The results for in="FillPaint" and in="StrokePaint" are the same. They consists of a non blurred vertical rectangle (green with dashed stroke) overlayed with a blue rectangle with blurred edges.</li>
+ <li>The size of the blue rectangles are bigger than the blurred circles.</li>
+ </ol>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: filters-overview-01-b.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <defs>
+ <linearGradient id="grad1" gradientUnits="objectBoundingBox" x1="50%" y1="-3%" x2="50%" y2="106%">
+ <stop offset="0.00" stop-color="#0000ff"/>
+ <stop offset="0.33" stop-color="#ffffff"/>
+ <stop offset="0.67" stop-color="#ff0000"/>
+ <stop offset="1.00" stop-color="#ffff00"/>
+ </linearGradient>
+
+ <filter id="GaussianBlur1" filterUnits="objectBoundingBox" x="-20%" y="-20%" width="140%" height="140%">
+ <feGaussianBlur in="SourceAlpha" stdDeviation="2"/>
+ </filter>
+
+ <filter id="GaussianBlur2" filterUnits="objectBoundingBox" x="-20%" y="-20%" width="140%" height="140%">
+ <feGaussianBlur in="SourceGraphic" stdDeviation="2"/>
+ </filter>
+
+ <filter id="GaussianBlur3" filterUnits="objectBoundingBox" x="-30%" y="-30%" width="160%" height="160%">
+ <feFlood flood-color="white" result="flood"/>
+ <feGaussianBlur in="BackgroundAlpha" stdDeviation="2" result="blur"/>
+ <feMerge>
+ <feMergeNode in="flood"/>
+ <feMergeNode in="blur"/>
+ </feMerge>
+ </filter>
+
+ <filter id="GaussianBlur4" filterUnits="objectBoundingBox" x="-40%" y="-40%" width="180%" height="180%">
+ <feFlood flood-color="white" result="flood"/>
+ <feGaussianBlur in="BackgroundImage" stdDeviation="2" result="blur"/>
+ <feMerge>
+ <feMergeNode in="flood"/>
+ <feMergeNode in="blur"/>
+ </feMerge>
+ </filter>
+
+ <filter id="GaussianBlur5" filterUnits="objectBoundingBox" x="-20%" y="-20%" width="140%" height="140%">
+ <feGaussianBlur in="StrokePaint" stdDeviation="5"/>
+ </filter>
+
+ <filter id="GaussianBlur6" filterUnits="objectBoundingBox" x="-20%" y="-20%" width="140%" height="140%">
+ <feGaussianBlur in="FillPaint" stdDeviation="5"/>
+ </filter>
+ </defs>
+
+ <g enable-background="new" stroke-dasharray="25 5" stroke="black" stroke-width="3" font-size="14" fill="black">
+
+ <rect x="90" y="50" width="16" height="95" fill="green"/>
+ <g fill-opacity="0.6" stroke="black" stroke-width="3" filter="url(#GaussianBlur1)">
+ <circle cx="098" cy="085" r="25" fill="red"/>
+ <circle cx="080" cy="110" r="25" fill="blue"/>
+ <circle cx="116" cy="110" r="25" fill="green"/>
+ </g>
+ <text x="98" y="160" stroke="none" text-anchor="middle">SourceAlpha</text>
+
+ <desc> =========================================================================================== </desc>
+
+ <rect x="90" y="185" width="16" height="95" fill="green"/>
+ <g fill-opacity="0.6" stroke="black" stroke-width="3" filter="url(#GaussianBlur2)">
+ <circle cx="098" cy="220" r="25" fill="red"/>
+ <circle cx="080" cy="245" r="25" fill="blue"/>
+ <circle cx="116" cy="245" r="25" fill="green"/>
+ </g>
+ <text x="98" y="295" stroke="none" text-anchor="middle">SourceGraphic</text>
+
+ <desc> =========================================================================================== </desc>
+
+ <rect x="230" y="50" width="16" height="95" fill="green"/>
+ <g fill-opacity="0.6" stroke="black" stroke-width="3" filter="url(#GaussianBlur3)">
+ <circle cx="238" cy="085" r="25" fill="red"/>
+ <circle cx="220" cy="110" r="25" fill="blue"/>
+ <circle cx="256" cy="110" r="25" fill="green"/>
+ </g>
+ <text x="238" y="160" stroke="none" text-anchor="middle">BackgroundAlpha</text>
+
+ <desc> =========================================================================================== </desc>
+
+ <rect x="230" y="185" width="16" height="95" fill="green"/>
+ <g fill-opacity="0.6" stroke="black" stroke-width="3" filter="url(#GaussianBlur4)">
+ <circle cx="238" cy="220" r="25" fill="red"/>
+ <circle cx="220" cy="245" r="25" fill="blue"/>
+ <circle cx="256" cy="245" r="25" fill="green"/>
+ </g>
+ <text x="238" y="295" stroke="none" text-anchor="middle">BackgroundImage</text>
+
+ <desc> =========================================================================================== </desc>
+
+ <rect x="370" y="50" width="16" height="95" fill="green"/>
+ <g id='g' stroke-opacity="0.6" stroke="blue" stroke-width="3" filter="url(#GaussianBlur5)">
+ <circle cx="378" cy="085" r="25" fill="red"/>
+ <circle cx="360" cy="110" r="25" fill="blue"/>
+ <circle cx="396" cy="110" r="25" fill="green"/>
+ </g>
+ <text x="378" y="160" stroke="none" text-anchor="middle">FillPaint</text>
+
+ <desc> =========================================================================================== </desc>
+
+ <rect x="370" y="185" width="16" height="95" fill="green"/>
+ <g fill-opacity="0.6" fill="blue" stroke="black" stroke-width="3" filter="url(#GaussianBlur6)">
+ <circle cx="378" cy="220" r="25"/>
+ <circle cx="360" cy="245" r="25"/>
+ <circle cx="396" cy="245" r="25"/>
+ </g>
+ <text x="378" y="295" stroke="none" text-anchor="middle">StrokePaint</text>
+
+ </g>
+
+ <text x="240" y="30" font-size="20" text-anchor="middle">Filter input test</text>
+
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.8 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-overview-02-b-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/filters-overview-02-b-ref.png
new file mode 100644
index 00000000..fcc0827c
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-overview-02-b-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-overview-02-b.svg b/rsvg/tests/fixtures/reftests/svg1.1/filters-overview-02-b.svg
new file mode 100644
index 00000000..89f48d75
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-overview-02-b.svg
@@ -0,0 +1,178 @@
+<svg version="1.1" baseProfile="basic" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="CL" author="BB" status="created"
+ version="$Revision: 1.1 $" testname="$RCSfile: filters-overview-02-b.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/filters.html#FilterPrimitivesOverview">
+ <p>
+ The purpose of this file is to test the 'in' attribute on filter primitives.
+ This test is the same as filters-overview-01-b.svg but uses gradients with gradientUnits="userSpaceOnUse" instead for the
+ FillPaint/StrokePaint.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ To pass this test, the UA must render all 6 cases (SourceGraphic, SourceAlpha, BackgroundImage, BackgroundAlpha, FillPaint, StrokePaint) correctly.
+ </p>
+ <ol>
+ <li>The result for in="SourceGraphic" is a non blurred vertical rectangle (green with dashed stroke) overlayed with three blurred circles (red/green/blue with dashed stroke).</li>
+ <li>The result for in="SourceAlpha" is a non blurred vertical rectangle (green with dashed stroke) overlayed with three blurred circles (dark gray with dashed stroke).</li>
+ <li>The result for in="BackgroundImage" is a blurred vertical rectangle (green with dashed stroke).</li>
+ <li>The result for in="BackgroundAlpha" is blurred vertical rectangle (dark gray with dashed stroke).</li>
+ <li>The results for in="FillPaint" and in="StrokePaint" are the same. They consists of a non blurred vertical rectangle (green with dashed stroke) overlayed with a blurred gradiant (blue/white/red/yellow).</li>
+ <li>The size of the gradients are bigger than the blurred circles.</li>
+ </ol>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: filters-overview-02-b.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <defs>
+ <linearGradient id="grad1" gradientUnits="userSpaceOnUse" x1="140.5" y1="57.75" x2="140.5" y2="139.5">
+ <stop offset="0.00" stop-color="#0000ff"/>
+ <stop offset="0.33" stop-color="#ffffff"/>
+ <stop offset="0.67" stop-color="#ff0000"/>
+ <stop offset="1.00" stop-color="#ffff00"/>
+ </linearGradient>
+
+ <linearGradient id="grad2" gradientUnits="userSpaceOnUse" x1="140.5" y1="192.75" x2="140.5" y2="274.5">
+ <stop offset="0.00" stop-color="#0000ff"/>
+ <stop offset="0.33" stop-color="#ffffff"/>
+ <stop offset="0.67" stop-color="#ff0000"/>
+ <stop offset="1.00" stop-color="#ffff00"/>
+ </linearGradient>
+
+ <filter id="GaussianBlur1" filterUnits="objectBoundingBox" x="-20%" y="-20%" width="140%" height="140%">
+ <feGaussianBlur in="SourceAlpha" stdDeviation="2"/>
+ </filter>
+
+ <filter id="GaussianBlur2" filterUnits="objectBoundingBox" x="-20%" y="-20%" width="140%" height="140%">
+ <feGaussianBlur in="SourceGraphic" stdDeviation="2"/>
+ </filter>
+
+ <filter id="GaussianBlur3" filterUnits="objectBoundingBox" x="-30%" y="-30%" width="160%" height="160%">
+ <feFlood flood-color="white" result="flood"/>
+ <feGaussianBlur in="BackgroundAlpha" stdDeviation="2" result="blur"/>
+ <feMerge>
+ <feMergeNode in="flood"/>
+ <feMergeNode in="blur"/>
+ </feMerge>
+ </filter>
+
+ <filter id="GaussianBlur4" filterUnits="objectBoundingBox" x="-40%" y="-40%" width="180%" height="180%">
+ <feFlood flood-color="white" result="flood"/>
+ <feGaussianBlur in="BackgroundImage" stdDeviation="2" result="blur"/>
+ <feMerge>
+ <feMergeNode in="flood"/>
+ <feMergeNode in="blur"/>
+ </feMerge>
+ </filter>
+
+ <filter id="GaussianBlur5" filterUnits="objectBoundingBox" x="-20%" y="-20%" width="140%" height="140%">
+ <feGaussianBlur in="StrokePaint" stdDeviation="5"/>
+ </filter>
+
+ <filter id="GaussianBlur6" filterUnits="objectBoundingBox" x="-20%" y="-20%" width="140%" height="140%">
+ <feGaussianBlur in="FillPaint" stdDeviation="5"/>
+ </filter>
+ </defs>
+
+ <g enable-background="new" stroke-dasharray="25 5" stroke="black" stroke-width="3" font-size="14" fill="black">
+
+ <rect x="90" y="50" width="16" height="95" fill="green"/>
+ <g fill-opacity="0.6" stroke="black" stroke-width="3" filter="url(#GaussianBlur1)">
+ <circle cx="098" cy="085" r="25" fill="red"/>
+ <circle cx="080" cy="110" r="25" fill="blue"/>
+ <circle cx="116" cy="110" r="25" fill="green"/>
+ </g>
+ <text x="98" y="160" stroke="none" text-anchor="middle">SourceAlpha</text>
+
+ <desc> =========================================================================================== </desc>
+
+ <rect x="90" y="185" width="16" height="95" fill="green"/>
+ <g fill-opacity="0.6" stroke="black" stroke-width="3" filter="url(#GaussianBlur2)">
+ <circle cx="098" cy="220" r="25" fill="red"/>
+ <circle cx="080" cy="245" r="25" fill="blue"/>
+ <circle cx="116" cy="245" r="25" fill="green"/>
+ </g>
+ <text x="98" y="295" stroke="none" text-anchor="middle">SourceGraphic</text>
+
+ <desc> =========================================================================================== </desc>
+
+ <rect x="230" y="50" width="16" height="95" fill="green"/>
+ <g fill-opacity="0.6" stroke="black" stroke-width="3" filter="url(#GaussianBlur3)">
+ <circle cx="238" cy="085" r="25" fill="red"/>
+ <circle cx="220" cy="110" r="25" fill="blue"/>
+ <circle cx="256" cy="110" r="25" fill="green"/>
+ </g>
+ <text x="238" y="160" stroke="none" text-anchor="middle">BackgroundAlpha</text>
+
+ <desc> =========================================================================================== </desc>
+
+ <rect x="230" y="185" width="16" height="95" fill="green"/>
+ <g fill-opacity="0.6" stroke="black" stroke-width="3" filter="url(#GaussianBlur4)">
+ <circle cx="238" cy="220" r="25" fill="red"/>
+ <circle cx="220" cy="245" r="25" fill="blue"/>
+ <circle cx="256" cy="245" r="25" fill="green"/>
+ </g>
+ <text x="238" y="295" stroke="none" text-anchor="middle">BackgroundImage</text>
+
+ <desc> =========================================================================================== </desc>
+
+ <rect x="370" y="50" width="16" height="95" fill="green"/>
+ <!-- bbox: 335 60 86 75 -->
+ <g stroke-opacity="0.6" stroke="url(#grad1)" stroke-width="3" filter="url(#GaussianBlur5)">
+ <circle cx="378" cy="085" r="25" fill="red"/>
+ <circle cx="360" cy="110" r="25" fill="blue"/>
+ <circle cx="396" cy="110" r="25" fill="green"/>
+ </g>
+ <text x="378" y="160" stroke="none" text-anchor="middle">FillPaint</text>
+
+ <desc> =========================================================================================== </desc>
+
+ <rect x="370" y="185" width="16" height="95" fill="green"/>
+ <!-- bbox: 335 195 86 75 -->
+ <g fill-opacity="0.6" fill="url(#grad2)" stroke="black" stroke-width="3" filter="url(#GaussianBlur6)">
+ <circle cx="378" cy="220" r="25"/>
+ <circle cx="360" cy="245" r="25"/>
+ <circle cx="396" cy="245" r="25"/>
+ </g>
+ <text x="378" y="295" stroke="none" text-anchor="middle">StrokePaint</text>
+
+ </g>
+
+ <text x="240" y="30" font-size="20" text-anchor="middle">Filter input test</text>
+
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.1 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-overview-03-b-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/filters-overview-03-b-ref.png
new file mode 100644
index 00000000..e987e5bd
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-overview-03-b-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-overview-03-b.svg b/rsvg/tests/fixtures/reftests/svg1.1/filters-overview-03-b.svg
new file mode 100644
index 00000000..c5688b3a
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-overview-03-b.svg
@@ -0,0 +1,166 @@
+<svg version="1.1" baseProfile="basic" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="CL" author="BB" status="created"
+ version="$Revision: 1.2 $" testname="$RCSfile: filters-overview-03-b.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/filters.html#FilterPrimitivesOverview">
+ <!-- XXX make a more extensive test of FillPaint/StrokePaint in this test -->
+ <p>The purpose of this file is to test the 'in' attribute on filter primitives.</p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ To pass this test, the UA must render all 6 cases (SourceGraphic, SourceAlpha, BackgroundImage, BackgroundAlpha, FillPaint, StrokePaint) correctly.
+ </p>
+ <ol>
+ <li>The result for in="SourceGraphic" is a non blurred vertical rectangle (green with dashed stroke) overlayed with three blurred circles (red/green/blue with dashed stroke).</li>
+ <li>The result for in="SourceAlpha" is a non blurred vertical rectangle (green with dashed stroke) overlayed with three blurred circles (dark gray with dashed stroke).</li>
+ <li>The result for in="BackgroundImage" is a blurred vertical rectangle (green with dashed stroke).</li>
+ <li>The result for in="BackgroundAlpha" is blurred vertical rectangle (dark gray with dashed stroke).</li>
+ <li>The results for in="FillPaint" and in="StrokePaint" are the same. They consists of a non blurred vertical rectangle (green with dashed stroke) overlayed with a blurred gradiant (blue/white/red/yellow).</li>
+ <li>The size of the gradients are bigger than the blurred circles.</li>
+ </ol>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: filters-overview-03-b.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <defs>
+ <linearGradient id="grad1" gradientUnits="objectBoundingBox" x1="50%" y1="-3%" x2="50%" y2="106%">
+ <stop offset="0.00" stop-color="#0000ff"/>
+ <stop offset="0.33" stop-color="#ffffff"/>
+ <stop offset="0.67" stop-color="#ff0000"/>
+ <stop offset="1.00" stop-color="#ffff00"/>
+ </linearGradient>
+
+ <filter id="GaussianBlur1" filterUnits="objectBoundingBox" x="-20%" y="-20%" width="140%" height="140%">
+ <feGaussianBlur in="SourceAlpha" stdDeviation="2"/>
+ </filter>
+
+ <filter id="GaussianBlur2" filterUnits="objectBoundingBox" x="-20%" y="-20%" width="140%" height="140%">
+ <feGaussianBlur in="SourceGraphic" stdDeviation="2"/>
+ </filter>
+
+ <filter id="GaussianBlur3" filterUnits="objectBoundingBox" x="-30%" y="-30%" width="160%" height="160%">
+ <feFlood flood-color="white" result="flood"/>
+ <feGaussianBlur in="BackgroundAlpha" stdDeviation="2" result="blur"/>
+ <feMerge>
+ <feMergeNode in="flood"/>
+ <feMergeNode in="blur"/>
+ </feMerge>
+ </filter>
+
+ <filter id="GaussianBlur4" filterUnits="objectBoundingBox" x="-40%" y="-40%" width="180%" height="180%">
+ <feFlood flood-color="white" result="flood"/>
+ <feGaussianBlur in="BackgroundImage" stdDeviation="2" result="blur"/>
+ <feMerge>
+ <feMergeNode in="flood"/>
+ <feMergeNode in="blur"/>
+ </feMerge>
+ </filter>
+
+ <filter id="GaussianBlur5" filterUnits="objectBoundingBox" x="-20%" y="-20%" width="140%" height="140%">
+ <feGaussianBlur in="StrokePaint" stdDeviation="5"/>
+ </filter>
+
+ <filter id="GaussianBlur6" filterUnits="objectBoundingBox" x="-20%" y="-20%" width="140%" height="140%">
+ <feGaussianBlur in="FillPaint" stdDeviation="5"/>
+ </filter>
+ </defs>
+
+ <g enable-background="new" stroke-dasharray="25 5" stroke="black" stroke-width="3" font-size="14" fill="black">
+
+ <rect x="90" y="50" width="16" height="95" fill="green"/>
+ <g fill-opacity="0.6" stroke="black" stroke-width="3" filter="url(#GaussianBlur1)">
+ <circle cx="098" cy="085" r="25" fill="red"/>
+ <circle cx="080" cy="110" r="25" fill="blue"/>
+ <circle cx="116" cy="110" r="25" fill="green"/>
+ </g>
+ <text x="98" y="160" stroke="none" text-anchor="middle">SourceAlpha</text>
+
+ <desc> =========================================================================================== </desc>
+
+ <rect x="90" y="185" width="16" height="95" fill="green"/>
+ <g fill-opacity="0.6" stroke="black" stroke-width="3" filter="url(#GaussianBlur2)">
+ <circle cx="098" cy="220" r="25" fill="red"/>
+ <circle cx="080" cy="245" r="25" fill="blue"/>
+ <circle cx="116" cy="245" r="25" fill="green"/>
+ </g>
+ <text x="98" y="295" stroke="none" text-anchor="middle">SourceGraphic</text>
+
+ <desc> =========================================================================================== </desc>
+
+ <rect x="230" y="50" width="16" height="95" fill="green"/>
+ <g fill-opacity="0.6" stroke="black" stroke-width="3" filter="url(#GaussianBlur3)">
+ <circle cx="238" cy="085" r="25" fill="red"/>
+ <circle cx="220" cy="110" r="25" fill="blue"/>
+ <circle cx="256" cy="110" r="25" fill="green"/>
+ </g>
+ <text x="238" y="160" stroke="none" text-anchor="middle">BackgroundAlpha</text>
+
+ <desc> =========================================================================================== </desc>
+
+ <rect x="230" y="185" width="16" height="95" fill="green"/>
+ <g fill-opacity="0.6" stroke="black" stroke-width="3" filter="url(#GaussianBlur4)">
+ <circle cx="238" cy="220" r="25" fill="red"/>
+ <circle cx="220" cy="245" r="25" fill="blue"/>
+ <circle cx="256" cy="245" r="25" fill="green"/>
+ </g>
+ <text x="238" y="295" stroke="none" text-anchor="middle">BackgroundImage</text>
+
+ <desc> =========================================================================================== </desc>
+
+ <rect x="370" y="50" width="16" height="95" fill="green"/>
+ <g id='g' stroke-opacity="0.6" stroke="url(#grad1)" stroke-width="3" filter="url(#GaussianBlur5)">
+ <circle cx="378" cy="085" r="25" fill="red"/>
+ <circle cx="360" cy="110" r="25" fill="blue"/>
+ <circle cx="396" cy="110" r="25" fill="green"/>
+ </g>
+ <text x="378" y="160" stroke="none" text-anchor="middle">FillPaint</text>
+
+ <desc> =========================================================================================== </desc>
+
+ <rect x="370" y="185" width="16" height="95" fill="green"/>
+ <g fill-opacity="0.6" fill="url(#grad1)" stroke="black" stroke-width="3" filter="url(#GaussianBlur6)">
+ <circle cx="378" cy="220" r="25"/>
+ <circle cx="360" cy="245" r="25"/>
+ <circle cx="396" cy="245" r="25"/>
+ </g>
+ <text x="378" y="295" stroke="none" text-anchor="middle">StrokePaint</text>
+
+ </g>
+
+ <text x="240" y="30" font-size="20" text-anchor="middle">Filter input test</text>
+
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.2 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-specular-01-f-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/filters-specular-01-f-ref.png
new file mode 100644
index 00000000..622e2ad6
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-specular-01-f-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-specular-01-f.svg b/rsvg/tests/fixtures/reftests/svg1.1/filters-specular-01-f.svg
new file mode 100644
index 00000000..a5963a6b
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-specular-01-f.svg
@@ -0,0 +1,195 @@
+<svg version="1.1" baseProfile="full" preserveAspectRatio="xMidYMid meet" zoomAndPan="magnify" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="SVGWG" author="Vincent Hardy" status="accepted"
+ version="$Revision: 1.6 $" testname="$RCSfile: filters-specular-01-f.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/filters.html#feSpecularLightingElement">
+ <p>
+ Verify the basic operation of the feSpecularLighting element. The test shows
+ four rows of 3 images. Each row tests a different aspect of the filter and
+ shows the result of the filtering operation.
+ </p>
+ <p>
+ The first row shows the result of varying the surfaceScale attribute. The second
+ row shows the result of varying the specular constant (ks) attribute. The third
+ row shows the result of varying the specular exponent (np) attribute. The last
+ row shows the result of varying the lighting-color property.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The rendered picture should match the reference image.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: filters-specular-01-f.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <!-- Title -->
+ <text x="240" y="20" fill="black" font-size="12" font-family="Arial" text-anchor="middle">Filters: feSpecularLighting</text>
+ <!-- ===================================================================== -->
+ <!-- Filter definitions -->
+ <!-- ===================================================================== -->
+ <defs>
+ <!-- ================================================= -->
+ <!-- Surface scale -->
+ <!-- ================================================= -->
+ <filter id="surfaceScaleA" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+ <feSpecularLighting in="SourceGraphic" specularConstant="1" specularExponent="1" surfaceScale="1" lighting-color="white">
+ <feDistantLight azimuth="45" elevation="45"/>
+ </feSpecularLighting>
+ </filter>
+ <filter id="surfaceScaleB" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+ <feSpecularLighting in="SourceGraphic" specularConstant="1" specularExponent="1" surfaceScale="10" lighting-color="white">
+ <feDistantLight azimuth="45" elevation="45"/>
+ </feSpecularLighting>
+ </filter>
+ <filter id="surfaceScaleC" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+ <feSpecularLighting in="SourceGraphic" specularConstant="1" specularExponent="1" surfaceScale="-10" lighting-color="white">
+ <feDistantLight azimuth="45" elevation="45"/>
+ </feSpecularLighting>
+ </filter>
+ <!-- ================================================= -->
+ <!-- Specular Constants -->
+ <!-- ================================================= -->
+ <filter id="specularConstantA" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+ <feSpecularLighting in="SourceGraphic" specularConstant="0" specularExponent="1" surfaceScale="10" lighting-color="white">
+ <feDistantLight azimuth="45" elevation="45"/>
+ </feSpecularLighting>
+ </filter>
+ <filter id="specularConstantB" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+ <feSpecularLighting in="SourceGraphic" specularConstant="1" specularExponent="1" surfaceScale="10" lighting-color="white">
+ <feDistantLight azimuth="45" elevation="45"/>
+ </feSpecularLighting>
+ </filter>
+ <filter id="specularConstantC" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+ <feSpecularLighting in="SourceGraphic" specularConstant="2" specularExponent="1" surfaceScale="10" lighting-color="white">
+ <feDistantLight azimuth="45" elevation="45"/>
+ </feSpecularLighting>
+ </filter>
+ <!-- ================================================= -->
+ <!-- Specular Exponent -->
+ <!-- ================================================= -->
+ <filter id="specularExponentA" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+ <feSpecularLighting in="SourceGraphic" specularConstant="1" specularExponent="1" surfaceScale="10" lighting-color="white">
+ <feDistantLight azimuth="45" elevation="45"/>
+ </feSpecularLighting>
+ </filter>
+ <filter id="specularExponentB" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+ <feSpecularLighting in="SourceGraphic" specularConstant="1" specularExponent="2" surfaceScale="10" lighting-color="white">
+ <feDistantLight azimuth="45" elevation="45"/>
+ </feSpecularLighting>
+ </filter>
+ <filter id="specularExponentC" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+ <feSpecularLighting in="SourceGraphic" specularConstant="1" specularExponent="4" surfaceScale="10" lighting-color="white">
+ <feDistantLight azimuth="45" elevation="45"/>
+ </feSpecularLighting>
+ </filter>
+ <!-- ================================================= -->
+ <!-- Lighting colors -->
+ <!-- ================================================= -->
+ <filter id="lightingColorA" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+ <feSpecularLighting in="SourceGraphic" specularConstant="1" specularExponent="1" surfaceScale="10" lighting-color="red">
+ <feDistantLight azimuth="45" elevation="45"/>
+ </feSpecularLighting>
+ </filter>
+ <filter id="lightingColorB" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+ <feSpecularLighting in="SourceGraphic" specularConstant="1" specularExponent="1" surfaceScale="10" lighting-color="yellow">
+ <feDistantLight azimuth="45" elevation="45"/>
+ </feSpecularLighting>
+ </filter>
+ <filter id="lightingColorC" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+ <feSpecularLighting in="SourceGraphic" specularConstant="1" specularExponent="1" surfaceScale="10" lighting-color="blue">
+ <feDistantLight azimuth="45" elevation="45"/>
+ </feSpecularLighting>
+ </filter>
+ </defs>
+ <!-- ==================================================== -->
+ <!-- The same image is rendered multiple times with using -->
+ <!-- different filters. -->
+ <!-- ==================================================== -->
+ <!-- Various Surface Scales -->
+ <g transform="translate(0, 20)">
+ <text x="90" y="25">Various values for surfaceScale: 1, 10 and -10</text>
+ <g fill="black">
+ <rect x="90" y="30" width="50" height="30"/>
+ <rect x="205" y="30" width="50" height="30"/>
+ <rect x="320" y="30" width="50" height="30"/>
+ </g>
+ <image xlink:href="images/bumpMap2.png" x="90" y="30" width="50" height="30" filter="url(#surfaceScaleA)"/>
+ <image xlink:href="images/bumpMap2.png" x="205" y="30" width="50" height="30" filter="url(#surfaceScaleB)"/>
+ <image xlink:href="images/bumpMap2.png" x="320" y="30" width="50" height="30" filter="url(#surfaceScaleC)"/>
+ </g>
+ <!-- Various Specular Constants -->
+ <g transform="translate(0, 90)">
+ <text x="90" y="25">Various values for specularConstants: 0, 1 and 2</text>
+ <g fill="black">
+ <rect x="90" y="30" width="50" height="30"/>
+ <rect x="205" y="30" width="50" height="30"/>
+ <rect x="320" y="30" width="50" height="30"/>
+ </g>
+ <image xlink:href="images/bumpMap2.png" x="90" y="30" width="50" height="30" filter="url(#specularConstantA)"/>
+ <image xlink:href="images/bumpMap2.png" x="205" y="30" width="50" height="30" filter="url(#specularConstantB)"/>
+ <image xlink:href="images/bumpMap2.png" x="320" y="30" width="50" height="30" filter="url(#specularConstantC)"/>
+ </g>
+ <!-- Various Specular Exponents -->
+ <g transform="translate(0, 160)">
+ <text x="90" y="25">Various values for specularExponents: 1, 2 and 4</text>
+ <g fill="black">
+ <rect x="90" y="30" width="50" height="30"/>
+ <rect x="205" y="30" width="50" height="30"/>
+ <rect x="320" y="30" width="50" height="30"/>
+ </g>
+ <image xlink:href="images/bumpMap2.png" x="90" y="30" width="50" height="30" filter="url(#specularExponentA)"/>
+ <image xlink:href="images/bumpMap2.png" x="205" y="30" width="50" height="30" filter="url(#specularExponentB)"/>
+ <image xlink:href="images/bumpMap2.png" x="320" y="30" width="50" height="30" filter="url(#specularExponentC)"/>
+ </g>
+ <!-- Various Light Colors -->
+ <g transform="translate(0, 230)">
+ <text x="90" y="25">Various values for lighting color: red, yellow and blue</text>
+ <g fill="black">
+ <rect x="90" y="30" width="50" height="30"/>
+ <rect x="205" y="30" width="50" height="30"/>
+ <rect x="320" y="30" width="50" height="30"/>
+ </g>
+ <image xlink:href="images/bumpMap2.png" x="90" y="30" width="50" height="30" filter="url(#lightingColorA)"/>
+ <image xlink:href="images/bumpMap2.png" x="205" y="30" width="50" height="30" filter="url(#lightingColorB)"/>
+ <image xlink:href="images/bumpMap2.png" x="320" y="30" width="50" height="30" filter="url(#lightingColorC)"/>
+ </g>
+ <!-- ===================================================== -->
+ <!-- Legends -->
+ <!-- ===================================================== -->
+ <!-- Surface Scale -->
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.6 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-tile-01-b-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/filters-tile-01-b-ref.png
new file mode 100644
index 00000000..5030256f
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-tile-01-b-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-tile-01-b.svg b/rsvg/tests/fixtures/reftests/svg1.1/filters-tile-01-b.svg
new file mode 100644
index 00000000..df49b53a
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-tile-01-b.svg
@@ -0,0 +1,80 @@
+<svg version="1.1" baseProfile="basic" preserveAspectRatio="xMidYMid meet" zoomAndPan="magnify" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="SVGWG" author="Rick Graham" status="accepted"
+ version="$Revision: 1.8 $" testname="$RCSfile: filters-tile-01-b.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/filters.html#feTileElement">
+ <p>
+ The test case constructs a filter that uses feTile to tile the entire specified filter region.
+ The tile consists of a green rectangle over a larger transparent rectangle.
+ The green rectangle is created with feFlood and feOffset. There is also a semi-transparent
+ blue rectangle that should exactly cover one of the tiled rectangles, creating a purple
+ tile with a black stroke (4 tiles down and 3 across).
+ </p>
+ <p>
+ The test uses the 'rect' element, feTile, feFlood, feOffset, feMerge, fill style, stroke,
+ font-family and font-size properties.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The rendered picture should match the reference image, except for possible variations
+ in the labelling text (per CSS2 rules).
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: filters-tile-01-b.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <text font-size="15" x="240" y="25" text-anchor="middle">feTile filter test: a tiled pattern</text>
+ <!-- ====================================================================== -->
+ <!-- Tiled created in defs then applied to rectangle -->
+ <!-- this seems pretty complex to me -->
+ <!-- ====================================================================== -->
+ <defs>
+ <filter id="feTileFilter" filterUnits="userSpaceOnUse" primitiveUnits="userSpaceOnUse" x="115" y="40" width="250" height="250">
+ <feFlood x="115" y="40" width="54" height="19" flood-color="lime"/>
+ <feOffset x="115" y="40" width="50" height="25" dx="6" dy="6" result="offset"/>
+ <feTile/>
+ </filter>
+ </defs>
+ <!-- The 'g' has no content, but the filter causes a rectangle
+ to be created which is filled with a tiled pattern. -->
+ <g filter="url(#feTileFilter)"/>
+ <!-- Show the outline of the rectangle which is filled with the tiled pattern. -->
+ <rect x="115" y="40" width="250" height="250" fill="none" stroke="blue" stroke-width="2"/>
+ <!-- draw a semi-transparent rectangle over one of the tiles -->
+ <rect x="215" y="115" width="50" height="25" fill="blue" fill-opacity="0.5" stroke="black"/>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.8 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-turb-01-f-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/filters-turb-01-f-ref.png
new file mode 100644
index 00000000..2c3ab830
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-turb-01-f-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-turb-01-f.svg b/rsvg/tests/fixtures/reftests/svg1.1/filters-turb-01-f.svg
new file mode 100644
index 00000000..9d0ef617
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-turb-01-f.svg
@@ -0,0 +1,102 @@
+<svg version="1.1" baseProfile="full" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="SVGWG" author="Jon Ferraiolo" status="accepted"
+ version="$Revision: 1.7 $" testname="$RCSfile: filters-turb-01-f.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/filters.html#feTurbulenceElement">
+ <p>
+ Test which verifies the basic facilities of feTurbulence. Six rectangular areas showing the
+ effects of various parameter settings for feTurbulence. The sample image indicates the
+ parameter settings to produce the given image.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The rendered picture should match the reference image, except for possible variations
+ in the labelling text (per CSS2 rules).
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: filters-turb-01-f.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <desc>Six rectangular areas showing the effects of various parameter settings for feTurbulence.</desc>
+ <g font-family="Verdana" text-anchor="middle" font-size="10">
+ <defs>
+ <filter id="Turb1" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+ <feTurbulence type="turbulence" baseFrequency="0.05" numOctaves="2"/>
+ </filter>
+ <filter id="Turb2" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+ <feTurbulence type="turbulence" baseFrequency="0.1" numOctaves="2"/>
+ </filter>
+ <filter id="Turb3" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+ <feTurbulence type="turbulence" baseFrequency="0.05" numOctaves="8"/>
+ </filter>
+ <filter id="Turb4" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+ <feTurbulence type="fractalNoise" baseFrequency="0.1" numOctaves="4"/>
+ </filter>
+ <filter id="Turb5" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+ <feTurbulence type="fractalNoise" baseFrequency="0.4" numOctaves="4"/>
+ </filter>
+ <filter id="Turb6" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+ <feTurbulence type="fractalNoise" baseFrequency="0.1" numOctaves="1"/>
+ </filter>
+ </defs>
+ <rect x="25" y="25" width="100" height="75" filter="url(#Turb1)"/>
+ <text x="75" y="117">type=turbulence</text>
+ <text x="75" y="129">baseFrequency=0.05</text>
+ <text x="75" y="141">numOctaves=2</text>
+ <rect x="175" y="25" width="100" height="75" filter="url(#Turb2)"/>
+ <text x="225" y="117">type=turbulence</text>
+ <text x="225" y="129">baseFrequency=0.1</text>
+ <text x="225" y="141">numOctaves=2</text>
+ <rect x="325" y="25" width="100" height="75" filter="url(#Turb3)"/>
+ <text x="375" y="117">type=turbulence</text>
+ <text x="375" y="129">baseFrequency=0.05</text>
+ <text x="375" y="141">numOctaves=8</text>
+ <rect x="25" y="180" width="100" height="75" filter="url(#Turb4)"/>
+ <text x="75" y="272">type=fractalNoise</text>
+ <text x="75" y="284">baseFrequency=0.1</text>
+ <text x="75" y="296">numOctaves=4</text>
+ <rect x="175" y="180" width="100" height="75" filter="url(#Turb5)"/>
+ <text x="225" y="272">type=fractalNoise</text>
+ <text x="225" y="284">baseFrequency=0.4</text>
+ <text x="225" y="296">numOctaves=4</text>
+ <rect x="325" y="180" width="100" height="75" filter="url(#Turb6)"/>
+ <text x="375" y="272">type=fractalNoise</text>
+ <text x="375" y="284">baseFrequency=0.1</text>
+ <text x="375" y="296">numOctaves=1</text>
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.7 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-turb-02-f-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/filters-turb-02-f-ref.png
new file mode 100644
index 00000000..9b3fc165
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-turb-02-f-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/filters-turb-02-f.svg b/rsvg/tests/fixtures/reftests/svg1.1/filters-turb-02-f.svg
new file mode 100644
index 00000000..233b1485
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/filters-turb-02-f.svg
@@ -0,0 +1,148 @@
+<svg id="svg-root" width="100%" height="100%"
+ viewBox="0 0 480 360" xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= Copyright 2008 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.3" reviewer="CM" author="ED" status="accepted"
+ version="$Revision: 1.7 $" testname="$RCSfile: filters-turb-02-f.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/filters.html#feTurbulenceSeedAttribute">
+ <p>
+ This tests the <a>'seed'</a> attribute on <a>'feTurbulence'</a>.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>You should see three rectangles with black stroke. In each of these rectangles there should be
+ a series of numbers indicating the value for <a>'seed'</a> that was used on the small rectangle
+ directly above the number. The top stroked rectangle should contain 7 smaller rects that all
+ have a different filter applied to them, the lower two rectangles should contain 2 smaller rects
+ each. The filtered rectangles in each stroked rectangle should all look exactly the same.
+ If the filtered rectangles are red, that indicates that the test has failed.
+ </p>
+ <p>
+ The test has passed if:
+ </p>
+ <ul>
+ <li>the top stroked rectangle contains 7 smaller rectangles that are all identical</li>
+ <li>the lower left stroked rectangle contains 2 smaller rectangles that are identical</li>
+ <li>the lower right stroked rectangle contains 2 smaller rectangles that are identical</li>
+ <li>there's no red visible inside the stroked rectangles</li>
+ </ul>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: filters-turb-02-f.svg,v $</title>
+ <defs>
+ <font-face
+ font-family="SVGFreeSansASCII"
+ unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <defs>
+ <!-- test negative values, these two should be same as seed="0" and seed="1" -->
+ <filter id="turbneg1" x="0" y="0" width="100%" height="100%">
+ <feTurbulence seed="-0.2" baseFrequency="0.01" type="turbulence"/>
+ </filter>
+ <filter id="turbneg2" x="0" y="0" width="100%" height="100%">
+ <feTurbulence seed="-0.5" baseFrequency="0.01" type="turbulence"/>
+ </filter>
+ <filter id="turbneg3" x="0" y="0" width="100%" height="100%">
+ <feTurbulence seed="-0.8" baseFrequency="0.01" type="turbulence"/>
+ </filter>
+
+ <!-- the reference for seed="0" -->
+ <filter id="turbzero" x="0" y="0" width="100%" height="100%">
+ <feTurbulence seed="0" baseFrequency="0.01" type="turbulence"/>
+ </filter>
+
+ <!-- seed="0" is transformed by the setup_seed method to be equal to seed="1" -->
+ <filter id="turbpos1" x="0" y="0" width="100%" height="100%">
+ <feTurbulence seed="0.2" baseFrequency="0.01" type="turbulence"/>
+ </filter>
+ <filter id="turbpos2" x="0" y="0" width="100%" height="100%">
+ <feTurbulence seed="0.5" baseFrequency="0.01" type="turbulence"/>
+ </filter>
+ <filter id="turbpos3" x="0" y="0" width="100%" height="100%">
+ <feTurbulence seed="1.5" baseFrequency="0.01" type="turbulence"/>
+ </filter>
+
+ <!-- These should be the same -->
+ <filter id="turbneg4" x="0" y="0" width="100%" height="100%">
+ <feTurbulence seed="-1" baseFrequency="0.01" type="turbulence"/>
+ </filter>
+ <filter id="turbneg5" x="0" y="0" width="100%" height="100%">
+ <feTurbulence seed="-1.5" baseFrequency="0.01" type="turbulence"/>
+ </filter>
+
+ <!-- These should be the same -->
+ <filter id="turbneg6" x="0" y="0" width="100%" height="100%">
+ <feTurbulence seed="-2" baseFrequency="0.01" type="turbulence"/>
+ </filter>
+ <filter id="turbneg7" x="0" y="0" width="100%" height="100%">
+ <feTurbulence seed="-2.6" baseFrequency="0.01" type="turbulence"/>
+ </filter>
+
+ <style type="text/css">
+ #subtests text { fill: black }
+ </style>
+ </defs>
+
+ <rect width="100%" height="100%" fill="white"/>
+ <text x="50%" y="2em" style="font-size:24px; text-anchor:middle">feTurbulence seed</text>
+
+ <g id="subtests" transform="translate(65 80)" text-anchor="middle">
+ <rect width="50" height="50" filter="url(#turbneg3)"/>
+ <text x="25" y="80">-0.8</text>
+ <rect width="50" height="50" filter="url(#turbneg2)" transform="translate(50 0)"/>
+ <text x="75" y="80">-0.5</text>
+ <rect width="50" height="50" filter="url(#turbneg1)" transform="translate(100 0)"/>
+ <text x="125" y="80">-0.2</text>
+ <rect width="50" height="50" filter="url(#turbzero)" transform="translate(150 0)"/>
+ <text x="175" y="80">0</text>
+ <rect width="50" height="50" filter="url(#turbpos1)" transform="translate(200 0)"/>
+ <text x="225" y="80">0.2</text>
+ <rect width="50" height="50" filter="url(#turbpos2)" transform="translate(250 0)"/>
+ <text x="275" y="80">0.5</text>
+ <rect width="50" height="50" filter="url(#turbpos3)" transform="translate(300 0)"/>
+ <text x="325" y="80">1.5</text>
+ <rect x="-5" y="-5" width="360" height="100" stroke="black" fill="none"/>
+
+ <rect width="50" height="50" filter="url(#turbneg4)" transform="translate(0 120)"/>
+ <text x="25" y="200">-1</text>
+ <rect width="50" height="50" filter="url(#turbneg5)" transform="translate(50 120)"/>
+ <text x="75" y="200">-1.5</text>
+ <rect x="-5" y="115" width="110" height="100" stroke="black" fill="none"/>
+
+ <rect width="50" height="50" filter="url(#turbneg6)" transform="translate(250 120)"/>
+ <text x="275" y="200">-2</text>
+ <rect width="50" height="50" filter="url(#turbneg7)" transform="translate(300 120)"/>
+ <text x="325" y="200">-2.6</text>
+ <rect x="245" y="115" width="110" height="100" stroke="black" fill="none"/>
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none"
+ fill="black">$Revision: 1.7 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000"/>
+ <!-- comment out this watermark once the test is approved --><!--
+ <g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/ignore-filters-displace-01-f.svg b/rsvg/tests/fixtures/reftests/svg1.1/ignore-filters-displace-01-f.svg
new file mode 100644
index 00000000..13dd2b7c
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/ignore-filters-displace-01-f.svg
@@ -0,0 +1,141 @@
+<svg version="1.1" baseProfile="full" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="SVGWG" author="Peter Graffagnino" status="accepted"
+ version="$Revision: 1.6 $" testname="$RCSfile: filters-displace-01-f.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/filters.html#feDisplacementMapElement">
+ <p>
+ Verify the basic capability to handle the feDisplacementMap filter
+ node. Six images should appear in 2 rows of 3. On the left in each
+ row a test image of a checker board is displayed. In the middle
+ column is the displacement map. In the right-hand column is the
+ result. All displacement maps are generated as png files with gamma
+ 1.0 and must be interpreted linearly for the proper geometric
+ displacement to occur.
+ </p>
+ <p>
+ The top row tests a displacement map which displaces each pixel by an
+ amount equivalent to a rotation of 20 degrees around the center of the
+ image. A blue reference rectangle is drawn on the result using an svg
+ transform attribute to mimick the same 20 degree rotation. The edges
+ of the blue rectangle should be parallel to the grid lines in the
+ displaced image. Distortion of the grid pattern such that the grid
+ lines are slightly curved is indicative of improper gamma handling in
+ the viewer.
+ </p>
+ <p>
+ The bottom row tests a displacement map which distorts the image
+ spherically.
+ </p>
+ <p>
+ In addition to feDisplacementMap, this test uses the 'feImage' and
+ 'rect' elements. Figure labeling uses the text element. The
+ reference blue rectangle uses fill, fill-opacity, and transform.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The rendered image should match the reference image. The edges
+ of the blue rectangle must be parallel to the grid lines in the
+ displaced image. The center of the bottommost right distorted image
+ should be on a gridpoint.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: filters-displace-01-f.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <defs>
+ <filter id="DispMapChecker" filterUnits="objectBoundingBox" x="0" y="0" width="1" height="1">
+ <feImage xlink:href="images/DisplaceChecker.png"/>
+ </filter>
+ <filter id="RotateMap" filterUnits="objectBoundingBox" x="0" y="0" width="1" height="1">
+ <feImage xlink:href="images/rotate20.png"/>
+ </filter>
+ <filter id="SphereMap" filterUnits="objectBoundingBox" x="0" y="0" width="1" height="1">
+ <feImage xlink:href="images/sphere.png"/>
+ </filter>
+ <filter id="RotateMapTest" filterUnits="objectBoundingBox" x="0" y="0" width="1" height="1">
+ <feImage result="Map" xlink:href="images/rotate20.png"/>
+ <feImage result="Texture" xlink:href="images/DisplaceChecker.png"/>
+ <feDisplacementMap in="Texture" in2="Map" scale="64" xChannelSelector="R" yChannelSelector="G"/>
+ </filter>
+ <filter id="SphereMapTest" filterUnits="objectBoundingBox" x="0" y="0" width="1" height="1">
+ <feImage result="Map" xlink:href="images/sphere.png"/>
+ <feImage result="Texture" xlink:href="images/DisplaceChecker.png"/>
+ <feDisplacementMap in="Texture" in2="Map" scale="64" xChannelSelector="R" yChannelSelector="G"/>
+ </filter>
+ </defs>
+
+ <g font-family="Arial" font-size="12" text-anchor="middle">
+ <rect x="15" y="15" width="128" height="128" filter="url(#DispMapChecker)"/>
+ <rect x="20" y="115" width="118" height="20" fill="#DDD"/>
+ <text x="79" y="130">Checkerboard Image</text>
+
+ <rect x="158" y="15" width="128" height="128" filter="url(#RotateMap)"/>
+ <rect x="163" y="112" width="118" height="30" fill="#DDD"/>
+ <text>
+ <tspan x="222" y="125">Displacement Map</tspan>
+ <tspan x="222" y="138">(20 deg. rotation)</tspan>
+ </text>
+
+
+
+ <rect x="301" y="15" width="128" height="128" filter="url(#RotateMapTest)"/>
+ <rect x="-1" y="-1" width="2" height="2" transform="translate(365,79) rotate(20) scale(32)" fill="blue" fill-opacity="0.5"/>
+ <text>
+ <tspan x="365" y="160">Result</tspan>
+ <tspan x="365" y="172">(overlayed with 20 deg.</tspan>
+ <tspan x="365" y="184">rotated blue rectangle)</tspan>
+ </text>
+
+
+ <rect x="15" y="158" width="128" height="128" filter="url(#DispMapChecker)"/>
+ <rect x="20" y="258" width="118" height="20" fill="#DDD"/>
+ <text x="79" y="273">Checkerboard Image</text>
+
+
+ <rect x="158" y="158" width="128" height="128" filter="url(#SphereMap)"/>
+ <rect x="163" y="255" width="118" height="30" fill="#DDD"/>
+ <text>
+ <tspan x="222" y="268">Displacement Map</tspan>
+ <tspan x="222" y="283">(spherical distortion)</tspan>
+ </text>
+
+
+ <rect x="301" y="200" width="128" height="128" filter="url(#SphereMapTest)"/>
+ <text x="365" y="345">Result</text>
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.6 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/ignore-filters-example-01-b.svg b/rsvg/tests/fixtures/reftests/svg1.1/ignore-filters-example-01-b.svg
new file mode 100644
index 00000000..825f309b
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/ignore-filters-example-01-b.svg
@@ -0,0 +1,93 @@
+<svg version="1.1" baseProfile="basic" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="SVGWG" author="Jon Ferraiolo" status="accepted"
+ version="$Revision: 1.7 $" testname="$RCSfile: filters-example-01-b.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/filters.html#AnExample">
+ <p>
+ A single filter that uses a combination of filter
+ primitives. You should see a gray rectangle that
+ contains a green outer ring and a green inner button
+ with "SVG" on it, both having a 3D appearance.
+ </p>
+ <p>
+ Verify that a typical usage of filtering is operation.
+ This test case creates a 3D lighting effect and requires
+ that several filters are working: feGaussianBlur, feOffset,
+ feSpecularLighting, feComposite and feMerge. The graphic
+ consisting of the string "SVG" sitting on top of oval
+ filled in green and surrounded by an oval outlined in green.
+ </p>
+ <p>
+ The test uses a nested 'svg' element, 'rect' element,
+ 'path' element, as well as basic fill (solid
+ colors), stroke (solid colors with stroke-width
+ lines), font-family (Verdana and Arial) and font-size properties.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The rendered picture should match the reference image
+ exactly, except for possible variations in the labelling
+ text (per CSS2 rules).
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: filters-example-01-b.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <!-- Here is the test case -->
+ <svg xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" x="80" y="110" width="300" height="180" viewBox="0 0 200 120">
+ <title>Example filters01.svg - introducing filter effects</title>
+ <desc>An example which combines multiple filter primitives to produce a 3D lighting effect on a graphic consisting of the string "SVG" sitting on top of oval filled in green and surrounded by an oval outlined in green.</desc>
+ <defs>
+ <filter id="MyFilter" filterUnits="userSpaceOnUse" x="0" y="0" width="200" height="120">
+ <feGaussianBlur in="SourceAlpha" stdDeviation="4" result="blur"/>
+ <feOffset in="blur" dx="4" dy="4" result="offsetBlur"/>
+ <feComposite in="SourceGraphic" in2="offsetBlur" operator="over"/>
+ </filter>
+ </defs>
+ <rect x="1" y="1" width="198" height="118" fill="#888888" stroke="blue"/>
+ <g filter="url(#MyFilter)">
+ <g>
+ <path fill="none" stroke="#00D900" stroke-width="10" d="M50,90 C0,90 0,30 50,30 L150,30 C200,30 200,90 150,90 z"/>
+ <path fill="#00D900" d="M60,80 C30,80 30,40 60,40 L140,40 C170,40 170,80 140,80 z"/>
+ <g fill="#FFFFFF" stroke="black" font-size="45" font-family="Verdana">
+ <text x="52" y="76">SVG</text>
+ </g>
+ </g>
+ </g>
+ </svg>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.7 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/ignore-masking-path-07-b.svg b/rsvg/tests/fixtures/reftests/svg1.1/ignore-masking-path-07-b.svg
new file mode 100644
index 00000000..63f73d82
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/ignore-masking-path-07-b.svg
@@ -0,0 +1,147 @@
+<svg version="1.1" baseProfile="basic" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.3" reviewer="CM" author="ED" status="accepted"
+ version="$Revision: 1.11 $" testname="$RCSfile: masking-path-07-b.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/masking.html#ClippingPaths">
+ <p>
+ This tests that 'clipPath' elements can be used together and how the clipping paths are intersected.
+ </p>
+ <p>
+ There is a gray-white pattern as a background for the two subtest rectangles. This is to show that the holes that are cut out using clip-paths are transparent.
+ The first subtest verifies that when you use the 'clip-path' property on a child element inside a 'clipPath' element the child element is clipped correctly.
+ The second subtest verifies that when a 'clipPath' element has a 'clip-path' property the result is the intersection of the two clip paths.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The test has passed if the following conditions are met:
+ </p>
+ <ul>
+ <li>There is no red visible.</li>
+ <li>No shapes extend outside of the rects that have a thick black border.</li>
+ <li>For the left subtest:
+ <ul>
+ <li>There must be a large blue rect with a transparent smaller rect in it, and the intersection of two circles.</li>
+ <li>The borders of the clipregions are shown with black stroke.</li>
+ <li>The blue shapes must be visible only inside of these stroked regions.</li>
+ </ul>
+ </li>
+ <li>For the right subtest:
+ <ul>
+ <li>The test on the right must show part of the large blue rect shape with a transparent rect in it, and part of a circle.</li>
+ <li>The blue shapes must only be visible inside of the circle that has black stroke.</li>
+ </ul>
+ </li>
+ </ul>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: masking-path-07-b.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+
+ <defs>
+ <clipPath id="clipCircle1">
+ <circle id="c1" cx="100" cy="100" r="50"/>
+ </clipPath>
+
+ <clipPath id="clipCircle2">
+ <circle id="c2" cx="150" cy="150" r="50"/>
+ </clipPath>
+
+ <clipPath id="clipPath1">
+ <path id="p1" d="M10 10l100 0 0 100 -100 0ZM50 50l40 0 0 40 -40 0Z" clip-rule="evenodd"/>
+ </clipPath>
+
+ <!-- "If a valid 'clip-path' reference is placed on one of the children of a 'clipPath' element,
+ then the given child element is clipped by the referenced clipping path before OR'ing the
+ silhouette of the child element with the silhouettes of the other child elements." -->
+ <clipPath id="clipRects1">
+ <rect x="50" y="30" width="25" height="100"/>
+ <rect x="25" y="50" width="10" height="10" clip-path="url(#clipTwoCircles)"/>
+ </clipPath>
+
+ <!-- Test use in a clipPath -->
+ <clipPath id="clipTwoCircles">
+ <use xlink:href="#c1"/>
+ <use xlink:href="#c2"/>
+ </clipPath>
+
+ <clipPath id="clipInClip1">
+ <use xlink:href="#c2" clip-path="url(#clipCircle1)"/>
+ <use xlink:href="#p1"/>
+ </clipPath>
+
+ <clipPath id="clipOnClip1" clip-path="url(#clipCircle1)">
+ <use xlink:href="#c2"/>
+ <use xlink:href="#p1"/>
+ </clipPath>
+
+ <pattern patternUnits="userSpaceOnUse" id="pattern" x="0" y="0" width="20" height="20">
+ <rect x="0" y="0" width="10" height="10" fill="gray"/>
+ <rect x="10" y="10" width="10" height="10" fill="gray"/>
+ </pattern>
+ </defs>
+
+ <rect x="20" y="70" width="210" height="210" fill="url(#pattern)" stroke="black" stroke-width="4"/>
+ <rect x="250" y="70" width="210" height="210" fill="url(#pattern)" stroke="black" stroke-width="4"/>
+
+ <text x="240" y="2em" text-anchor="middle">Test clip unions and intersections</text>
+
+ <g transform="translate(20, 70)">
+ <g id="subtest1">
+ <use xlink:href="#p1" fill="red" fill-rule="evenodd"/>
+ <use xlink:href="#c2" fill="red" clip-path="url(#clipCircle1)"/>
+ <use xlink:href="#c1" fill="red" clip-path="url(#clipCircle2)"/>
+
+ <rect width="200" height="200" fill="blue" clip-path="url(#clipInClip1)"/>
+
+ <use xlink:href="#c2" fill="none" clip-path="url(#clipCircle1)" stroke="black"/>
+ <use xlink:href="#c1" fill="none" clip-path="url(#clipCircle2)" stroke="black"/>
+ <use xlink:href="#p1" fill="none" stroke="black"/>
+ </g>
+
+ <g id="subtest2" transform="translate(230,0)">
+ <g clip-path="url(#clipCircle1)">
+ <use xlink:href="#c2" fill="red"/>
+ <use xlink:href="#p1" fill="red" fill-rule="evenodd"/>
+ </g>
+
+ <rect width="300" height="300" fill="blue" clip-path="url(#clipOnClip1)"/>
+
+ <use xlink:href="#c1" fill="none" stroke="black"/>
+ </g>
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.11 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved --><!--
+ <g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/images/DisplaceChecker.png b/rsvg/tests/fixtures/reftests/svg1.1/images/DisplaceChecker.png
new file mode 100644
index 00000000..25c77d0a
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/images/DisplaceChecker.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/images/bumpMap2.png b/rsvg/tests/fixtures/reftests/svg1.1/images/bumpMap2.png
new file mode 100644
index 00000000..1609323d
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/images/bumpMap2.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/images/bumpMap3.png b/rsvg/tests/fixtures/reftests/svg1.1/images/bumpMap3.png
new file mode 100644
index 00000000..646f5de5
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/images/bumpMap3.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/images/filters-conv-01-f.includeimage.png b/rsvg/tests/fixtures/reftests/svg1.1/images/filters-conv-01-f.includeimage.png
new file mode 100644
index 00000000..f8fb8523
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/images/filters-conv-01-f.includeimage.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/images/image1.jpg b/rsvg/tests/fixtures/reftests/svg1.1/images/image1.jpg
new file mode 100644
index 00000000..40c1b258
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/images/image1.jpg
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/images/pinksquidj.png b/rsvg/tests/fixtures/reftests/svg1.1/images/pinksquidj.png
new file mode 100644
index 00000000..e88ae4eb
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/images/pinksquidj.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/images/purplesquidj.png b/rsvg/tests/fixtures/reftests/svg1.1/images/purplesquidj.png
new file mode 100644
index 00000000..90000a8b
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/images/purplesquidj.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/images/rotate20.png b/rsvg/tests/fixtures/reftests/svg1.1/images/rotate20.png
new file mode 100644
index 00000000..e566bfad
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/images/rotate20.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/images/smiley.png b/rsvg/tests/fixtures/reftests/svg1.1/images/smiley.png
new file mode 100644
index 00000000..5bcc67a2
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/images/smiley.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/images/sphere.png b/rsvg/tests/fixtures/reftests/svg1.1/images/sphere.png
new file mode 100644
index 00000000..9e22388e
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/images/sphere.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/images/stefan_252_tRNS_opti.png b/rsvg/tests/fixtures/reftests/svg1.1/images/stefan_252_tRNS_opti.png
new file mode 100644
index 00000000..1937a315
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/images/stefan_252_tRNS_opti.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/images/townsville.jpg b/rsvg/tests/fixtures/reftests/svg1.1/images/townsville.jpg
new file mode 100644
index 00000000..3a4a1994
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/images/townsville.jpg
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/masking-filter-01-f-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/masking-filter-01-f-ref.png
new file mode 100644
index 00000000..b55f7742
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/masking-filter-01-f-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/masking-filter-01-f.svg b/rsvg/tests/fixtures/reftests/svg1.1/masking-filter-01-f.svg
new file mode 100644
index 00000000..777c6c69
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/masking-filter-01-f.svg
@@ -0,0 +1,81 @@
+<svg version="1.1" baseProfile="full" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="AG" author="CM" status="accepted"
+ version="$Revision: 1.7 $" testname="$RCSfile: masking-filter-01-f.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/masking.html#Introduction">
+ <p>
+ This tests that the 'filter' property does not apply to 'mask'.
+ </p>
+ <p>
+ The mask 'm' covers a rectangular area (200 x 200) except for a window
+ (100 x 100) in the top left hand corner. Initially the mask window is
+ set on top of the green square. Hence, the green square is shown and
+ the red square is covered. If filters are supported the window within
+ the mask will be shifted by an offset of 100,100 placing it on top of
+ the red square.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The test passes if a green square is shown. If any
+ red shows, the test has failed.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: masking-filter-01-f.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <g shape-rendering="geometricPrecision">
+ <text font-size="18" x="10" y="35">Testing 'filter' applied to 'mask'</text>
+
+ <defs>
+ <filter id="f" x="0" y="0" width="200" height="200"
+ filterUnits="userSpaceOnUse" filterPrimitiveUnits="userSpaceOnUse">
+ <feOffset dx="100" dy="100"/>
+ </filter>
+ <mask id="m" x="0" y="0" width="200" height="200"
+ maskUnits="userSpaceOnUse" maskContentUnits="userSpaceOnUse"
+ filter="url(#f)">
+ <rect width="100" height="100" fill="white"/>
+ </mask>
+ </defs>
+
+ <g mask="url(#m)" transform="translate(10,50)">
+ <rect width="100" height="100" fill="green"/>
+ <rect x="101" y="101" width="99" height="99" fill="red"/>
+ </g>
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.7 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/masking-intro-01-f-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/masking-intro-01-f-ref.png
new file mode 100644
index 00000000..35baa6a3
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/masking-intro-01-f-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/masking-intro-01-f.svg b/rsvg/tests/fixtures/reftests/svg1.1/masking-intro-01-f.svg
new file mode 100644
index 00000000..4a0357bd
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/masking-intro-01-f.svg
@@ -0,0 +1,81 @@
+<svg version="1.1" baseProfile="full" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="CL" author="BB" status="accepted"
+ version="$Revision: 1.6 $" testname="$RCSfile: masking-intro-01-f.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/masking.html#Introduction">
+ <p>
+ The rules are different regarding the geometry of a shape when clipping and masking.
+ For example, a clip-path does not take into account the stroke of the shape used for clipping.
+ It is however, used when masking.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The test is passed if there are two identical darkblue circles at the top of the illustration, and
+ below those two circles, two more circles should appear. They are of lighter appearance,
+ the one on the left has a darker and thick stroke.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: masking-intro-01-f.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <g shape-rendering="geometricPrecision">
+ <title id="test-title">masking-mask-04-f.svg</title>
+ <desc id="test-desc">Tests the impact of strokes within clipPath and mask</desc>
+ <text font-size="18" x="240" y="35" text-anchor="middle">Testing stroke inclusion for 'clip-path' and 'mask'</text>
+
+ <defs>
+ <clipPath id="one" clipPathUnits="objectBoundingBox">
+ <circle cx="0.3" cy="0.5" r="0.2" stroke-width="0.15" fill="none" stroke="red"/>
+ <circle cx="0.7" cy="0.5" r="0.2" stroke-width="0.15" fill="none" stroke="none"/>
+ </clipPath>
+ </defs>
+
+ <rect x="150" y="0" width="200" height="200" fill="darkblue" clip-path="url(#one)"/>
+ <text x="50" y="110">With a 'clip-path':</text>
+
+ <defs>
+ <mask id="two" maskUnits="objectBoundingBox" maskContentUnits="objectBoundingBox" color-interpolation="linearRGB">
+ <circle cx="0.3" cy="0.5" r="0.2" stroke-width="0.15" fill="blue" stroke="red"/>
+ <circle cx="0.7" cy="0.5" r="0.2" stroke-width="0.15" fill="blue" stroke="none"/>
+ </mask>
+ </defs>
+
+ <rect x="150" y="150" width="200" height="200" fill="darkblue" mask="url(#two)"/>
+ <text x="50" y="260">With a 'mask':</text>
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.6 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/masking-mask-01-b-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/masking-mask-01-b-ref.png
new file mode 100644
index 00000000..22a28b66
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/masking-mask-01-b-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/masking-mask-01-b.svg b/rsvg/tests/fixtures/reftests/svg1.1/masking-mask-01-b.svg
new file mode 100644
index 00000000..5928d57e
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/masking-mask-01-b.svg
@@ -0,0 +1,131 @@
+<svg version="1.1" baseProfile="basic" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="SVGWG" author="Haroon Sheikh" status="accepted"
+ version="$Revision: 1.8 $" testname="$RCSfile: masking-mask-01-b.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/masking.html#Masking">
+ <p>
+ Test to see if the masking features using the mask element and mask
+ property are available.
+ </p>
+ <p>
+ A red rectangle is displayed in the background to help view the result
+ of transparency and masking.
+ </p>
+ <p>
+ From top to bottom, the tests are as follows.
+ </p>
+ <p>
+ In the top test, a linear gradient is used inside the mask to change the opacity
+ of the rectangle from 1.0 (at the top) to 0.5 (at the bottom).
+ </p>
+ <p>
+ In the second test, a simple 50% opaque rectangle is used as a mask.
+ </p>
+ <p>
+ In the third test, no mask is used, but a rectangle is shown with 50% opacity.
+ The second and third test should look the same.
+ </p>
+ <p>
+ Lastly, a string of text has a mask applied to it. The mask only covers a partial
+ area of the text, so the text should only be half visible. Also the mask consists
+ of 4 rectangles with various levels of opacity.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The rendered picture should match the reference image, except
+ variations are possible in the labelling text (per CSS2 rules).
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: masking-mask-01-b.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <style type="text/css">
+ @font-face {
+ font-family: larabie-anglepoise;
+ src: url(woffs/anglepoi.woff) format("woff");
+ }
+ </style>
+ <defs>
+ <font horiz-adv-x="313">
+ <!-- Converted from Larabie Anglepoise by Batik ttf2svg -->
+ <font-face font-family="larabie-anglepoise" units-per-em="1000" panose-1="0 0 4 0 0 0 0 0 0 0" ascent="703" descent="-300" alphabetic="0"/>
+ <missing-glyph horiz-adv-x="500" d="M63 0V700H438V0H63ZM125 63H375V638H125V63Z"/>
+ <glyph unicode="S" glyph-name="S" horiz-adv-x="385" d="M371 1H29V144H264Q264 151 264 166Q265 180 265 188Q265 212 249 212H132Q83 212 55 247Q29 279 29 329V566H335V422H136V375Q136 360 144 356Q148 355 168 355H279Q327 355 352 309Q371 273 371 221V1Z"/>
+ <glyph unicode="V" glyph-name="V" horiz-adv-x="351" d="M365 563L183 -33L0 563H101L183 296L270 563H365Z"/>
+ <glyph unicode="G" glyph-name="G" horiz-adv-x="367" d="M355 1H18V564H355V420H125V144H248V211H156V355H355V1Z"/>
+ <hkern g1="V" g2="G" k="-40"/>
+ </font>
+ </defs>
+ <g font-family="SVGFreeSansASCII,sans-serif">
+ <text font-size="14" x="10" y="20">Test for mask support</text>
+ <!-- Draw a red rectangle in the background -->
+ <rect x="10" y="30" width="100" height="260" fill="red"/>
+ <!-- Apply a gradient ramp based opacity -->
+ <mask id="mask1" maskUnits="userSpaceOnUse" x="60" y="50" width="100" height="60" color-interpolation="linearRGB">
+ <defs>
+ <linearGradient gradientUnits="userSpaceOnUse" id="Grad1" x1="60" y1="50" x2="60" y2="120">
+ <stop stop-color="white" stop-opacity="1" offset="0"/>
+ <stop stop-color="white" stop-opacity="0.5" offset="1"/>
+ </linearGradient>
+ </defs>
+ <rect x="60" y="50" width="100" height="60" fill="url(#Grad1)"/>
+ </mask>
+ <rect x="60" y="50" width="100" height="60" fill="lime" mask="url(#mask1)"/>
+ <text font-size="12" x="200" y="65">Mask with linear gradient from</text>
+ <text font-size="12" x="200" y="80">opacity=1 to opactity=0.5</text>
+ <!-- Simulate a uniform opacity using a mask -->
+ <mask id="mask2" maskUnits="userSpaceOnUse" x="60" y="120" width="100" height="30" color-interpolation="linearRGB">
+ <rect x="60" y="120" width="100" height="30" fill-opacity="0.5" fill="white"/>
+ </mask>
+ <rect x="60" y="120" width="100" height="30" fill="lime" mask="url(#mask2)"/>
+ <text font-size="12" x="200" y="135">Mask with uniform opacity of 0.5</text>
+ <!-- Apply a uniform opacity -->
+ <rect x="60" y="160" width="100" height="30" fill="lime" fill-opacity="0.5"/>
+ <text font-size="12" x="200" y="175">Rectangle with uniform opacity of 0.5</text>
+ <!-- Apply a mask to text -->
+ <mask id="mask3" maskUnits="userSpaceOnUse" x="60" y="200" width="200" height="100" color-interpolation="linearRGB">
+ <rect x="60" y="200" width="200" height="25" fill="white" fill-opacity="0.5"/>
+ <rect x="60" y="225" width="200" height="25" fill="white" fill-opacity="0.2"/>
+ <rect x="60" y="250" width="200" height="25" fill="white" fill-opacity="1"/>
+ <rect x="60" y="275" width="200" height="25" fill="white" fill-opacity="0.7"/>
+ </mask>
+ <text x="60" y="280" font-family="larabie-anglepoise" font-size="110" fill="lime" mask="url(#mask3)">SVG</text>
+ <text font-size="12" x="200" y="225">Text with mask containing rectangles</text>
+ <text font-size="12" x="200" y="240">of various opacities</text>
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.8 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/masking-mask-02-f-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/masking-mask-02-f-ref.png
new file mode 100644
index 00000000..5c00c54b
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/masking-mask-02-f-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/masking-mask-02-f.svg b/rsvg/tests/fixtures/reftests/svg1.1/masking-mask-02-f.svg
new file mode 100644
index 00000000..38cd9420
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/masking-mask-02-f.svg
@@ -0,0 +1,50 @@
+<svg id="svg-root" width="100%" height="100%" viewBox="0 0 480 360" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= Copyright 2008 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/" template-version="1.4" reviewer="CL" author="Microsoft" status="accepted" version="$Revision: 1.3 $" testname="$RCSfile: masking-mask-02-f.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://dev.w3.org/SVG/profiles/1.1F2/publish/masking.html#Masking">
+ <p>
+ If the 'mask' property references a 'mask' element containing no children, the element referencing it is not rendered.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>Run the test. No interaction required.</p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Test passes if there is a single green rectangle, with no red visible on the page.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: masking-mask-02-f.svg,v $</title>
+ <defs>
+ <font-face
+ font-family="SVGFreeSansASCII"
+ unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <mask id="testMask" />
+ <rect x="100" y="100" width="250" height="150" fill="green" />
+ <rect x="100" y="100" width="250" height="150" fill="red" mask="url(#testMask)" />
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none"
+ fill="black">$Revision: 1.3 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000"/>
+ <!-- comment out this watermark once the test is approved
+ <g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg> \ No newline at end of file
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/masking-opacity-01-b-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/masking-opacity-01-b-ref.png
new file mode 100644
index 00000000..1f74f799
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/masking-opacity-01-b-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/masking-opacity-01-b.svg b/rsvg/tests/fixtures/reftests/svg1.1/masking-opacity-01-b.svg
new file mode 100644
index 00000000..ce34caeb
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/masking-opacity-01-b.svg
@@ -0,0 +1,125 @@
+<svg version="1.1" baseProfile="basic" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="SVGWG" author="Haroon Sheikh" status="accepted"
+ version="$Revision: 1.6 $" testname="$RCSfile: masking-opacity-01-b.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/masking.html#ObjectAndGroupOpacityProperties">
+ <p>
+ Test to see the effect of applying an opacity property to a group.
+ </p>
+ <p>
+ A blue rectangle with a green rectangle on top are contained in a
+ group. This opacity of the group and the opacity of the rectangles are
+ changed in this test. A red rectangle is provided in the background so
+ that opacity changes are obvious visually.
+ </p>
+ <p>
+ From top to bottom, the tests are as follows.
+ </p>
+ <p>
+ In the top test, the opacities of the group and the individual rectangles are
+ all set to 1.
+ </p>
+ <p>
+ In the second test, the group is given an opacity of 0.5.
+ </p>
+ <p>
+ In the third test, the group maintains a group opacity of 1 whereas each individual
+ rectangle is given an opacity of 0.5 in the group.
+ </p>
+ <p>
+ Lastly, the group and individual rectangles are all given an opacity of 0.5.
+ </p>
+
+
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ In the top test, the green rectangle should appear on top of the blue
+ rectangle.
+ </p>
+ <p>
+ In the second test, the blue
+ rectangle should not show through in the region where the green and blue overlap.
+ </p>
+ <p>
+ In the third test, the blue rectangle
+ should show through in the overlap region.
+ </p>
+ <p>
+ Lastly, the
+ result should be similar to the previous test only fainter (because the opacity) is
+ resulting in less contribution.
+ </p>
+ <p>
+ The rendered picture should match the reference image exactly, except for possible
+ variations in the labelling text (per CSS2 rules).
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: masking-opacity-01-b.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <text font-size="24" x="50" y="27">Test for opacity property on a group.</text>
+ <rect x="10" y="30" width="100" height="260" fill="red"/>
+ <g opacity="1">
+ <rect x="60" y="50" width="80" height="40" fill="blue"/>
+ <rect x="70" y="60" width="80" height="40" fill="lime"/>
+ </g>
+ <text font-size="20" x="200" y="62">Group opacity: 1</text>
+ <text font-size="20" x="200" y="80">Blue rectangle opacity: 1</text>
+ <text font-size="20" x="200" y="98">Green rectangle opacity: 1</text>
+ <g opacity="0.5">
+ <rect x="60" y="110" width="80" height="40" fill="blue"/>
+ <rect x="70" y="120" width="80" height="40" fill="lime"/>
+ </g>
+ <text font-size="20" x="200" y="122">Group opacity: 0.5</text>
+ <text font-size="20" x="200" y="140">Blue rectangle opacity: 1</text>
+ <text font-size="20" x="200" y="158">Green rectangle opacity: 1</text>
+ <g opacity="1">
+ <rect x="60" y="170" width="80" height="40" fill="blue" opacity=".5"/>
+ <rect x="70" y="180" width="80" height="40" fill="lime" opacity=".5"/>
+ </g>
+ <text font-size="20" x="200" y="182">Group opacity: 1</text>
+ <text font-size="20" x="200" y="200">Blue rectangle opacity: 0.5</text>
+ <text font-size="20" x="200" y="218">Green rectangle opacity: 0.5</text>
+ <g opacity="0.5">
+ <rect x="60" y="230" width="80" height="40" fill="blue" opacity=".5"/>
+ <rect x="70" y="240" width="80" height="40" fill="lime" opacity=".5"/>
+ </g>
+ <text font-size="20" x="200" y="242">Group opacity: 0.5</text>
+ <text font-size="20" x="200" y="260">Blue rectangle opacity: 0.5</text>
+ <text font-size="20" x="200" y="278">Green rectangle opacity: 0.5</text>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.6 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/masking-path-01-b-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/masking-path-01-b-ref.png
new file mode 100644
index 00000000..4a9e5d9a
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/masking-path-01-b-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/masking-path-01-b.svg b/rsvg/tests/fixtures/reftests/svg1.1/masking-path-01-b.svg
new file mode 100644
index 00000000..81dbc8da
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/masking-path-01-b.svg
@@ -0,0 +1,95 @@
+<svg version="1.1" baseProfile="basic" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="CL" author="LH" status="accepted"
+ version="$Revision: 1.7 $" testname="$RCSfile: masking-path-01-b.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/masking.html#ClippingPaths">
+ <p>
+ Test to see if the basic clipping works using the clipPath element
+ and the clip-path property.
+ </p>
+ <p>
+ This test uses the following elements : &lt;clipPath&gt; and the following
+ properties : clip-path.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The test at the top shows an orange rectangle (with black stroke) being clipped by another rectangle.
+ So only the middle portion of the orange rectangle should be visible. Also the black stroke should
+ only be visible along the top and bottom edge of the rectangle.
+ </p>
+ <p>
+ The example at the bottom has a group containing a text string and two rectangles. The group
+ has a clipping path defined using two overlapping rectangles. Of concern is the overlapping area
+ shared by the two rectangles. There should not be holes in this overlapping area, the
+ clip region is the union of the two rectangles. For clarity,
+ guide rectangles in grey show the position of the clipping rectangles.
+ </p>
+ <p>
+ The rendered picture should match the reference image exactly, except for possible
+ variations in the labelling text (per CSS2 rules).
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: masking-path-01-b.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <g shape-rendering="geometricPrecision">
+ <!--text font-size="14" x="10" y="20">Test for clipping using clipPath element</text-->
+ <defs>
+ <clipPath id="clip1">
+ <rect x="200" y="10" width="60" height="100"/>
+ </clipPath>
+ <clipPath id="clip2">
+ <rect x="90" y="150" width="175" height="100"/>
+ <rect x="225" y="160" width="95" height="75"/>
+ </clipPath>
+ </defs>
+ <rect x="20" y="20" width="440" height="60" fill="orange" stroke="black" stroke-width="5" clip-path="url(#clip1)"/>
+ <text font-size="30" x="20" y="130">Rectangle being clipped</text>
+ <g clip-path="url(#clip2)">
+ <rect x="115" y="190" width="225" height="40" fill="aqua" stroke="blue" stroke-width="5"/>
+ <rect x="115" y="240" width="225" height="40" fill="lime" stroke="green" stroke-width="5"/>
+ <text font-size="30" x="115" y="180">Line of text to be clipped</text>
+ </g>
+ <text font-size="30" x="20" y="280">Group being clipped</text>
+ <!-- show the two rects and the overlap area -->
+ <g fill="none" stroke="#999" stroke-width="2">
+ <rect x="90" y="150" width="175" height="100"/>
+ <rect x="225" y="160" width="95" height="75"/>
+ </g>
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.7 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/masking-path-02-b-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/masking-path-02-b-ref.png
new file mode 100644
index 00000000..7ca12c2b
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/masking-path-02-b-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/masking-path-02-b.svg b/rsvg/tests/fixtures/reftests/svg1.1/masking-path-02-b.svg
new file mode 100644
index 00000000..d952df14
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/masking-path-02-b.svg
@@ -0,0 +1,84 @@
+<svg version="1.1" baseProfile="basic" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="SVGWG" author="Haroon Sheikh" status="accepted"
+ version="$Revision: 1.8 $" testname="$RCSfile: masking-path-02-b.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/masking.html#ClippingPaths">
+ <p>
+ Test to see if clipPathUnits attribute is handled properly on a
+ clipPath element. Only tests the userSpaceOnUse and
+ objectBoundingBox items of the clipPathUnits. userSpace has been
+ tested by the previous test as it is the default.
+ </p>
+ <p>
+ The test at the top shows a pink rectangle that has been clipped by a
+ rectangular clipping path. The clipping path is defined using clipPathUnits=objectBoundingBox.
+
+ </p>
+ <p>
+ The example at the bottom a rotated blue rectangle that has been clipped by a
+ rectangular clipping path. The clipping path is defined using clipPathUnits=userSpaceOnUse.
+
+ </p>
+ <p>
+ The rendered picture should match the reference image exactly, except for possible
+ variations in the labelling text (per CSS2 rules).
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The test passes if the pink rectangle and blue diamond do not have any
+ color painted outside of their black borders.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: masking-path-02-b.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <g shape-rendering="geometricPrecision">
+ <clipPath id="clip1" clipPathUnits="objectBoundingBox">
+ <rect x=".25" y=".5" width=".6" height="1"/>
+ </clipPath>
+ <rect x="10" y="10" width="430" height="80" fill="#F08" clip-path="url(#clip1)"/>
+ <rect x="117" y="50" width="258" height="40" fill="none" stroke="black" stroke-width="4"/>
+ <text font-size="30" x="20" y="130">clipPathUnits=objectBoundingBox</text>
+ <clipPath id="clip2" clipPathUnits="userSpaceOnUse">
+ <rect x="60" y="60" width="80" height="80"/>
+ </clipPath>
+ <rect transform="translate(100 200) rotate(-45)" x="0" y="0" width="120" height="120" fill="blue" clip-path="url(#clip2)"/>
+ <rect transform="translate(100 200) rotate(-45)" x="60" y="60" width="60" height="60" fill="none" stroke="black" stroke-width="4"/>
+ <text font-size="30" x="20" y="280">clipPathUnits=userSpaceOnUse</text>
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.8 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/masking-path-03-b-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/masking-path-03-b-ref.png
new file mode 100644
index 00000000..ee29bb08
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/masking-path-03-b-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/masking-path-03-b.svg b/rsvg/tests/fixtures/reftests/svg1.1/masking-path-03-b.svg
new file mode 100644
index 00000000..92186a6c
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/masking-path-03-b.svg
@@ -0,0 +1,134 @@
+<svg version="1.1" baseProfile="basic" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="SVGWG" author="Jon Ferraiolo" status="accepted"
+ version="$Revision: 1.7 $" testname="$RCSfile: masking-path-03-b.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/masking.html#ClippingPaths">
+ <p>
+ Test 'overflow'/'clip' on outermost and inner 'svg' elements.
+ </p>
+ <p>
+ There are two parts to the test. The first part tests viewport clipping
+ on outermost 'svg' elements. The second part tests viewport clipping
+ on inner 'svg' elements.
+ </p>
+ <p>
+ The test case also tests the initial value of the 'overflow' property
+ to ensure that it is set to 'hidden' for all 'svg' elements.
+ Tester should zoom out and/or pan to check this.
+ </p>
+ <p>
+ To test clipping to the outermost 'svg' element,
+ a rectangle with a light blue interior, a light red border and a black
+ string that says "Clip to outer 'svg'" is painted four times such that
+ it will overflow each of the top, left, right and bottom
+ sides of the bounds of the outermost 'svg' element, respectively.
+ </p>
+ <p>
+ To test clipping to inner 'svg' elements, a rectangle with a light red
+ interior, a light blue border and a black string that says "Clip to
+ inner 'svg'" is painted four times such that it will overflow each of
+ the top, left, right and bottom sides of the bounds of an inner 'svg'
+ element, respectively.
+ </p>
+ <p>
+ Note that minor text layout differences, as are permissible under CSS2
+ rules, can lead to slightly different visual results regarding where
+ the text strings get clipped.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>The test passes if:</p>
+ <ul>
+ <li>The four "Outer Clip" boxed strings must not render outside the
+ outermost 'svg' element (the 480x360 rectangular viewport) and
+ must continue to be clipped to this viewport if the image is zoomed in or out,
+ or panned.</li>
+ <li>The four "Inner Clip" boxed strings must not render outside the
+ bounds of the green rectangle.</li>
+ </ul>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: masking-path-03-b.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <g shape-rendering="geometricPrecision">
+ <!--text font-size="18" text-anchor="middle" x="240" y="70">Test 'overflow'/'clip' on outermost and inner 'svg' elements</text-->
+ <text font-size="18" x="10" y="70">Test 'overflow'/'clip' on outermost and inner 'svg' elements</text>
+ <!-- Test initial value for 'overflow' property (i.e., hidden)
+ on outermost 'svg' -->
+ <g font-size="48" stroke-width="2">
+ <g transform="translate(115,-20)">
+ <rect width="250" height="60" fill="#ccccff" stroke="#ff8888"/>
+ <text x="15" y="45">Outer Clip</text>
+ </g>
+ <g transform="translate(-175,150)">
+ <rect width="250" height="60" fill="#ccccff" stroke="#ff8888"/>
+ <text x="15" y="45">Outer Clip</text>
+ </g>
+ <g transform="translate(405,150)">
+ <rect width="250" height="60" fill="#ccccff" stroke="#ff8888"/>
+ <text x="15" y="45">Outer Clip</text>
+ </g>
+ <g transform="translate(115,330)">
+ <rect width="250" height="60" fill="#ccccff" stroke="#ff8888"/>
+ <text x="15" y="45">Outer Clip</text>
+ </g>
+ </g>
+ <!-- Test initial value for 'overflow' property (i.e., hidden)
+ on inner 'svg' -->
+ <rect x="115" y="100" width="250" height="160" fill="none" stroke="#006600" stroke-width="5"/>
+ <svg xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" x="115" y="100" width="250" height="160">
+ <g font-size="32" stroke-width="2">
+ <g transform="translate(50,-15)">
+ <rect width="150" height="35" fill="#ffaaaa" stroke="#6666ff"/>
+ <text x="6" y="26">Inner Clip</text>
+ </g>
+ <g transform="translate(-50,62.5)">
+ <rect width="150" height="35" fill="#ffaaaa" stroke="#6666ff"/>
+ <text x="6" y="26">Inner Clip</text>
+ </g>
+ <g transform="translate(150,62.5)">
+ <rect width="150" height="35" fill="#ffaaaa" stroke="#6666ff"/>
+ <text x="6" y="26">Inner Clip</text>
+ </g>
+ <g transform="translate(50,140)">
+ <rect width="150" height="35" fill="#ffaaaa" stroke="#6666ff"/>
+ <text x="6" y="26">Inner Clip</text>
+ </g>
+ </g>
+ </svg>
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.7 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/masking-path-04-b-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/masking-path-04-b-ref.png
new file mode 100644
index 00000000..60f5dd19
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/masking-path-04-b-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/masking-path-04-b.svg b/rsvg/tests/fixtures/reftests/svg1.1/masking-path-04-b.svg
new file mode 100644
index 00000000..2f5ef6f0
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/masking-path-04-b.svg
@@ -0,0 +1,79 @@
+<svg version="1.1" baseProfile="basic" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="SVGWG" author="Chris Lilley" status="accepted"
+ version="$Revision: 1.5 $" testname="$RCSfile: masking-path-04-b.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/masking.html#ClippingPaths">
+ <p>
+ This test exercises basic user-specified clip paths, using a text
+ string (i.e., content of a 'text' element) as the clip path.
+ </p>
+ <p>
+ There is a rectangular image of a swirly blue pattern with large
+ yellow text, "Clip Test" superimposed. The image is a PNG file,
+ imported into the picture via the 'image' element.
+ </p>
+ <p>
+ The test uses the 'rect' element, as well as basic fill (solid primary
+ colors), stroke (black 1-pixel lines), font-family (Arial and
+ Impact) and font-size properties.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The rendered picture should match the reference image, except for
+ possible variations in the labelling text (per CSS2 rules).
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: masking-path-04-b.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <g shape-rendering="geometricPrecision">
+ <defs>
+ <clipPath id="sample" clipPathUnits="userSpaceOnUse">
+ <text x="45" y="270" font-size="100" font-family="Impact">Clip Test</text>
+ </clipPath>
+ </defs>
+
+ <g>
+ <image xlink:href="resources/bluesquidj.png" preserveAspectRatio="none" x="30" y="20" width="410" height="140"/>
+ <text x="55" y="130" font-size="100" font-family="Impact" fill="yellow">Clip Test</text>
+ </g>
+ <g>
+ <image xlink:href="resources/bluesquidj.png" preserveAspectRatio="none" x="20" y="170" width="410" height="160" clip-path="url(#sample)"/>
+ </g>
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.5 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/masking-path-05-f-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/masking-path-05-f-ref.png
new file mode 100644
index 00000000..c324bb4c
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/masking-path-05-f-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/masking-path-05-f.svg b/rsvg/tests/fixtures/reftests/svg1.1/masking-path-05-f.svg
new file mode 100644
index 00000000..e6146eab
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/masking-path-05-f.svg
@@ -0,0 +1,78 @@
+<svg version="1.1" baseProfile="basic" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="SVGWG" author="Haroon Sheikh" status="accepted"
+ version="$Revision: 1.6 $" testname="$RCSfile: masking-path-05-f.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/masking.html#ClippingPaths">
+ <p>
+ Test to see if clip-rule property has been implemented properly.
+ </p>
+ <p>
+ The test at the top shows a red rectangle that has been clipped by a
+ clipping path that overlaps itself.
+ </p>
+ <p>
+ The test at the bottom shows a blue rectangle that has been clipped by a
+ clipping path that overlaps itself.
+ </p>
+ <p>
+ The rendered picture should match the reference image exactly, except for possible
+ variations in the labelling text (per CSS2 rules).
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ In the first rectangle, the clip-rule is defined to be evenodd so the overlap should have a hole in it.
+ The clip-rule is defined to be nonzero so the overlap should be filled.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: masking-path-05-f.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <g shape-rendering="geometricPrecision">
+ <text font-size="14" x="150" y="20">Test for clip-rule property.</text>
+ <clipPath id="clip1">
+ <path clip-rule="evenodd" d="M200,40l20,0 0,60 20,0 0,-20 -60,0 0,-20 80,0 0,60 -60,0 0,-80z"/>
+ </clipPath>
+ <rect x="50" y="30" width="350" height="100" fill="red" clip-path="url(#clip1)"/>
+ <text font-size="12" x="100" y="140">clip-rule=evenodd</text>
+ <clipPath id="clip2">
+ <path clip-rule="nonzero" d="M200,170l20,0 0,60 20,0 0,-20 -60,0 0,-20 80,0 0,60 -60,0 0,-80z"/>
+ </clipPath>
+ <rect x="50" y="160" width="350" height="100" fill="blue" clip-path="url(#clip2)"/>
+ <text font-size="12" x="100" y="270">cliprule=nonzero</text>
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.6 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/masking-path-07-b-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/masking-path-07-b-ref.png
new file mode 100644
index 00000000..77c3dd18
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/masking-path-07-b-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/masking-path-08-b-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/masking-path-08-b-ref.png
new file mode 100644
index 00000000..426b175c
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/masking-path-08-b-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/masking-path-08-b.svg b/rsvg/tests/fixtures/reftests/svg1.1/masking-path-08-b.svg
new file mode 100644
index 00000000..17291ade
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/masking-path-08-b.svg
@@ -0,0 +1,140 @@
+<svg id="svg-root" width="100%" height="100%"
+ viewBox="0 0 480 360" xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= Copyright 2008 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.3" reviewer="CM" author="ED" status="accepted"
+ version="$Revision: 1.7 $" testname="$RCSfile: masking-path-08-b.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/masking.html#EstablishingANewClippingPath">
+ <p>
+ This tests a few 'clip-path' cases to see that clipping paths are applied and constructed properly.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ There are nine subtests in this test. There should be a big stroked rectangle with nine smaller rectangles inside. If all of the smaller rectangles are green the test has passed.
+ </p>
+ <p>
+ The test has passed if:
+ </p>
+ <ul>
+ <li>There is no red visible.</li>
+ <li>Each of the nine small rectangles are green.</li>
+ </ul>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: masking-path-08-b.svg,v $</title>
+ <defs>
+ <font-face
+ font-family="SVGFreeSansASCII"
+ unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+
+ <defs>
+ <clipPath id="emptyclip">
+ </clipPath>
+ <clipPath id="hiddenclip">
+ <rect width="100" height="100" visibility="hidden"/>
+ </clipPath>
+ <clipPath id="displayclip">
+ <rect width="100" height="100" display="none"/>
+ </clipPath>
+ <clipPath id="opacityclip">
+ <rect width="100" height="100" opacity="0"/>
+ </clipPath>
+ <clipPath id="strokefillclip">
+ <rect width="100" height="100" stroke="none" fill="none"/>
+ </clipPath>
+ <clipPath id="strokewidthclip">
+ <rect x="40" y="40" width="20" height="20" stroke="black" stroke-width="80"/>
+ </clipPath>
+ <clipPath id="strokeopacityclip">
+ <rect x="40" y="40" width="20" height="20" stroke="black" stroke-opacity="0" stroke-width="80"/>
+ </clipPath>
+ <clipPath id="fillopacityclip">
+ <rect width="100" height="100" fill-opacity="0"/>
+ </clipPath>
+ </defs>
+
+ <text x="240" y="50" text-anchor="middle">Establishing a new clipping path</text>
+
+ <g transform="scale(0.5) translate(320 200)">
+ <rect width="100" height="100" fill="lime"/>
+ <rect width="100" height="100" fill="red" clip-path="url(#emptyclip)"/>
+
+ <g transform="translate(110 0)">
+ <rect width="100" height="100" fill="lime"/>
+ <rect width="100" height="100" fill="red" clip-path="url(#hiddenclip)"/>
+ </g>
+
+ <g transform="translate(220 0)">
+ <rect width="100" height="100" fill="lime"/>
+ <rect width="100" height="100" fill="red" clip-path="url(#displayclip)"/>
+ </g>
+
+ <!-- This has an intentionally broken clip-path url -->
+ <g transform="translate(0 110)">
+ <rect x="0.5" y="0.5" width="99" height="99" fill="red"/>
+ <rect width="100" height="100" fill="lime" clip-path="url(#unknown)"/>
+ </g>
+
+ <g transform="translate(110 110)">
+ <rect x="0.5" y="0.5" width="99" height="99" fill="red"/>
+ <rect width="100" height="100" fill="lime" clip-path="url(#opacityclip)"/>
+ </g>
+
+ <g transform="translate(220 110)">
+ <rect x="0.5" y="0.5" width="99" height="99" fill="red"/>
+ <rect width="100" height="100" fill="lime" clip-path="url(#strokefillclip)"/>
+ </g>
+
+ <g transform="translate(0 220)">
+ <rect width="100" height="100" fill="lime"/>
+ <rect width="100" height="100" fill="red" clip-path="url(#strokewidthclip)"/>
+ <rect x="39" y="39" width="22" height="22" fill="lime"/>
+ </g>
+
+ <g transform="translate(110 220)">
+ <rect width="100" height="100" fill="lime"/>
+ <rect width="100" height="100" fill="red" clip-path="url(#strokeopacityclip)"/>
+ <rect x="39" y="39" width="22" height="22" fill="lime"/>
+ </g>
+
+ <g transform="translate(220 220)">
+ <rect x="0.5" y="0.5" width="99" height="99" fill="red"/>
+ <rect width="100" height="100" fill="lime" clip-path="url(#fillopacityclip)"/>
+ </g>
+
+ <rect width="320" height="320" fill="none" stroke="black"/>
+ </g>
+
+
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none"
+ fill="black">$Revision: 1.7 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000"/>
+ <!-- comment out this watermark once the test is approved --><!--
+ <g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/painting-control-02-f-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/painting-control-02-f-ref.png
new file mode 100644
index 00000000..def882eb
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/painting-control-02-f-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/painting-control-02-f.svg b/rsvg/tests/fixtures/reftests/svg1.1/painting-control-02-f.svg
new file mode 100644
index 00000000..8177e60b
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/painting-control-02-f.svg
@@ -0,0 +1,65 @@
+<svg id="svg-root" width="100%" height="100%"
+ viewBox="0 0 480 360" xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= Copyright 2008 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="CL" author="Microsoft" status="accepted"
+ version="$Revision: 1.3 $" testname="$RCSfile: painting-control-02-f.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/painting.html#StrokeProperties">
+ <p>
+ 'Stroke' attributes affected by directionality start at the point at which the graphics element starts.
+ </p>
+ <p>
+ The test creates two 'path' elements that have the same 'stroke-dasharray' assignment. The paths will create the same visual shape,
+ but the start and end points will be opposite. Test passes if the 'stroke-dasharray' of each path is drawn differently.
+ Second subtest is the same but with stroke-dashoffset.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Test passes if there are two lines, each composed of alternating black and orange boxes.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: painting-control-02-f.svg,v $</title>
+ <defs>
+ <font-face
+ font-family="SVGFreeSansASCII"
+ unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+
+ <path d="M 100 100 L 100 190" fill="none" stroke="orange" stroke-width="20" stroke-dasharray="10px 20px 20px" />
+ <path d="M 100 190 L 100 100" fill="none" stroke="black" stroke-width="20" stroke-dasharray="10px 20px 20px" />
+
+ <path d="M 200 100 L 200 190" fill="none" stroke="orange" stroke-width="20" stroke-dashoffset="5px" stroke-dasharray="10px 10px 10px" />
+ <path d="M 200 190 L 200 100" fill="none" stroke="black" stroke-width="20" stroke-dashoffset="5px" stroke-dasharray="10px 10px 10px" />
+
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none"
+ fill="black">$Revision: 1.3 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000"/>
+ <!-- comment out this watermark once the test is approved
+ <g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/painting-marker-01-f-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/painting-marker-01-f-ref.png
new file mode 100644
index 00000000..f8be006c
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/painting-marker-01-f-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/painting-marker-01-f.svg b/rsvg/tests/fixtures/reftests/svg1.1/painting-marker-01-f.svg
new file mode 100644
index 00000000..b48c390f
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/painting-marker-01-f.svg
@@ -0,0 +1,157 @@
+<svg version="1.1" baseProfile="full" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="SVGWG" author="Dean Jackson" status="accepted"
+ version="$Revision: 1.7 $" testname="$RCSfile: painting-marker-01-f.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/painting.html#Markers">
+ <p>
+ Tests the basic support for markers.
+ </p>
+ <p>
+ The top test examines the basic support for the marker element and style. The markers are purple rectangles.
+ </p>
+ <p>
+ The middle test examines the support for the different styles of marker properties. The
+ "marker-start" property defines the marker to use at the first vertex of the marked path,
+ in this case a purple rectangle. The "marker-end" property defines the marker to use at the
+ last vertex of the marked path, in this case a blue triangle. The "marker-mid" property
+ defines the marker to use at all vertices, other than the first and last, of the marked path,
+ in this case a green circle.
+ </p>
+ <p>
+ The bottom test examines the support for marker orientation along the
+ path direction. The second vertex, the top right corner of the path, has a marker that
+ is rotated 45 degrees, since that is the average of the horizontal and vertical segments
+ each side. The last vertex, the bottom right corner of the path, has a marker rotated 90
+ degrees since that is the direction of the last path segment.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ For the three tests, there should be two identical paths with markers drawn.
+ The path on the left is rendered using the marker elements. The path on the
+ right is rendered using the equivalent SVG, showing what the marked path should
+ look like.
+ </p>
+ <p>
+ The rendered picture should match the reference image, except for possible
+ variations in the labelling text (per CSS2 rules).
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: painting-marker-01-f.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <defs>
+ <!-- ===================================================================== -->
+ <!-- Define a few simple marker elements -->
+ <!-- ===================================================================== -->
+ <marker id="marker1" viewBox="0 0 10 10" markerWidth="2" markerHeight="2" refX="5" refY="5" markerUnits="strokeWidth">
+ <rect width="10" height="10" fill="purple" stroke="none"/>
+ </marker>
+ <marker id="marker2" viewBox="0 0 10 10" markerWidth="2" markerHeight="2" refX="5" refY="5" markerUnits="strokeWidth" orient="auto">
+ <path d="M 5 0 L 10 10 L 0 10 Z" fill="blue" stroke="none"/>
+ </marker>
+ <marker id="markerStart" viewBox="0 0 10 10" markerWidth="2" markerHeight="2" refX="5" refY="5" markerUnits="strokeWidth">
+ <rect width="10" height="10" fill="purple" stroke="none"/>
+ </marker>
+ <marker id="markerMiddle" viewBox="0 0 10 10" markerWidth="2" markerHeight="2" refX="5" refY="5" markerUnits="strokeWidth">
+ <circle cx="5" cy="5" r="5" fill="green" stroke="none"/>
+ </marker>
+ <marker id="markerEnd" viewBox="0 0 10 10" markerWidth="2" markerHeight="2" refX="5" refY="5" markerUnits="strokeWidth">
+ <path d="M 5 0 L 10 10 L 0 10 Z" fill="blue" stroke="none"/>
+ </marker>
+ </defs>
+ <!-- ===================================================================== -->
+ <!-- Basic Marker Test -->
+ <!-- ===================================================================== -->
+ <text x="170" y="30" font-size="14">Basic Markers</text>
+ <path fill="none" stroke="black" stroke-width="8" marker-start="url(#marker1)" marker-mid="url(#marker1)" marker-end="url(#marker1)" d="M 130 40 L 180 40 L 180 90"/>
+ <!-- ===================================================================== -->
+ <!-- Generate the equivalent SVG -->
+ <!-- ===================================================================== -->
+ <g transform="translate(120,0)">
+ <path fill="none" stroke="black" stroke-width="8" d="M 130 40 L 180 40 L 180 90"/>
+ <g transform="translate(130,40) scale(8) scale(0.2, 0.2) translate(-5, -5)" fill="none" stroke="black" stroke-width="8">
+ <rect width="10" height="10" fill="purple" stroke="none"/>
+ </g>
+ <g transform="translate(180,40) scale(8) scale(0.2, 0.2) translate(-5, -5)" fill="none" stroke="black" stroke-width="8">
+ <rect width="10" height="10" fill="purple" stroke="none"/>
+ </g>
+ <g transform="translate(180,90) scale(8) scale(0.2, 0.2) translate(-5, -5)" fill="none" stroke="black" stroke-width="8">
+ <rect width="10" height="10" fill="purple" stroke="none"/>
+ </g>
+ </g>
+ <!-- ===================================================================== -->
+ <!-- Start, Middle and End Marker Test -->
+ <!-- ===================================================================== -->
+ <text x="145" y="125" font-size="14">Start, Middle and End</text>
+ <path fill="none" stroke="black" stroke-width="8" marker-start="url(#markerStart)" marker-mid="url(#markerMiddle)" marker-end="url(#markerEnd)" d="M 130 135 L 180 135 L 180 185"/>
+ <!-- ===================================================================== -->
+ <!-- Generate the equivalent SVG -->
+ <!-- ===================================================================== -->
+ <g transform="translate(120,0)">
+ <path fill="none" stroke="black" stroke-width="8" d="M 130 135 L 180 135 L 180 185"/>
+ <g transform="translate(130,135) scale(8) scale(0.2, 0.2) translate(-5, -5)" fill="none" stroke="black" stroke-width="8">
+ <rect width="10" height="10" fill="purple" stroke="none"/>
+ </g>
+ <g transform="translate(180,135) scale(8) scale(0.2, 0.2) translate(-5, -5)" fill="none" stroke="black" stroke-width="8">
+ <circle cx="5" cy="5" r="5" fill="green" stroke="none"/>
+ </g>
+ <g transform="translate(180,185) scale(8) scale(0.2, 0.2) translate(-5, -5)" fill="none" stroke="black" stroke-width="8">
+ <path d="M 5 0 L 10 10 L 0 10 Z" fill="blue" stroke="none"/>
+ </g>
+ </g>
+ <!-- ===================================================================== -->
+ <!-- Auto Orientation Marker Test -->
+ <!-- ===================================================================== -->
+ <text x="145" y="220" font-size="14">Automatic Orientation</text>
+ <path fill="none" stroke="black" stroke-width="8" marker-start="url(#marker2)" marker-mid="url(#marker2)" marker-end="url(#marker2)" d="M 130 230 L 180 230 L 180 280"/>
+ <!-- ===================================================================== -->
+ <!-- Generate the equivalent SVG -->
+ <!-- ===================================================================== -->
+ <g transform="translate(120,0)">
+ <path fill="none" stroke="black" stroke-width="8" d="M 130 230 L 180 230 L 180 280"/>
+ <g transform="translate(130,230) rotate(0) scale(8) scale(0.2, 0.2) translate(-5, -5)" fill="none" stroke="black" stroke-width="8">
+ <path d="M 5 0 L 10 10 L 0 10 Z" fill="blue" stroke="none"/>
+ </g>
+ <g transform="translate(180,230) rotate(45) scale(8) scale(0.2, 0.2) translate(-5, -5)" fill="none" stroke="black" stroke-width="8">
+ <path d="M 5 0 L 10 10 L 0 10 Z" fill="blue" stroke="none"/>
+ </g>
+ <g transform="translate(180,280) rotate(90) scale(8) scale(0.2, 0.2) translate(-5, -5)" fill="none" stroke="black" stroke-width="8">
+ <path d="M 5 0 L 10 10 L 0 10 Z" fill="blue" stroke="none"/>
+ </g>
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.7 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/painting-marker-02-f-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/painting-marker-02-f-ref.png
new file mode 100644
index 00000000..688228a1
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/painting-marker-02-f-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/painting-marker-02-f.svg b/rsvg/tests/fixtures/reftests/svg1.1/painting-marker-02-f.svg
new file mode 100644
index 00000000..bab08fc2
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/painting-marker-02-f.svg
@@ -0,0 +1,245 @@
+<svg version="1.1" baseProfile="full" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="SVGWG" author="Dean Jackson" status="accepted"
+ version="$Revision: 1.7 $" testname="$RCSfile: painting-marker-02-f.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/painting.html#Markers">
+ <p>
+ Tests the rendering of markers, specifically property inheritance. For the four tests, there should
+ be two identical paths with markers drawn.
+ </p>
+ <p>
+ The top two tests examine the rendering of markers when the marker and the path
+ referencing it share the same parent and all painting properties are specfied on
+ that parent. The first test show inheritance of the 'fill' property and the
+ second the inheritance of the 'paint' property. In both tests, the marker
+ is painting using the same properties as the referencing object. Because of
+ scaling transformations on the marker, the stroke on the second test is thinner
+ than on the referencing object.
+ </p>
+ <p>
+ The third and fourth tests examine the rendering of markers in a situation where the
+ marker and referencing path do NOT share the same parent and painting
+ properties are specified both on the parent of the marked path and on the contents
+ of the marker itself. In both cases, the marker's parent specifies
+ fill="green" stroke="blue" stroke-width="8". For the third test, the marker contents
+ override with stroke="black". For the fourth test, the marker contents
+ override with fill="black". In neither case should you see
+ fill="orange" or stroke="blue" or "stroke="purple" on the markers as these properties
+ are specified on the ancestor of the referencing object or the referencing object itself
+ and thus shouldn't affect the marker.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The path on the left is rendered using the marker elements.
+ The path on the right is rendered using the equivalent SVG,
+ showing what the marked path should look like. These should be
+ identical and match the image to the right.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: painting-marker-02-f.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <defs>
+ <clipPath id="overflowHiddenClip1" clipPathUnits="userSpaceOnUse">
+ <rect x="0" y="0" width="2" height="2"/>
+ </clipPath>
+ <clipPath id="overflowHiddenClip" clipPathUnits="userSpaceOnUse">
+ <rect x="0" y="0" width="4" height="4"/>
+ </clipPath>
+ </defs>
+ <g fill="green">
+ <text x="125" y="30" font-size="14" fill="black">Marker Rendering Properties</text>
+ <!-- ===================================================================== -->
+ <!-- Fill property -->
+ <!-- ===================================================================== -->
+ <g fill="black" stroke="none" stroke-width="8">
+ <marker id="marker1" viewBox="0 0 10 10" markerWidth="2" markerHeight="2" refX="5" refY="5" markerUnits="strokeWidth">
+ <rect width="10" height="10"/>
+ </marker>
+ <text x="100" y="140" font-size="10" fill="black" stroke="none">Fill Property</text>
+ <path marker-start="url(#marker1)" marker-mid="url(#marker1)" marker-end="url(#marker1)" d="M 30 60 L 80 60 L 80 110 Z"/>
+ <!-- ===================================================================== -->
+ <!-- Generate the equivalent SVG -->
+ <!-- ===================================================================== -->
+ <g transform="translate(120,0)">
+ <path d="M 30 60 L 80 60 L 80 110 Z"/>
+ <g transform="translate(30,60) scale(8) translate(-1, -1)">
+ <g clip-path="url(#overflowHiddenClip1)">
+ <g transform="scale(0.2, 0.2)">
+ <rect width="10" height="10"/>
+ </g>
+ </g>
+ </g>
+ <g transform="translate(80,60) scale(8) translate(-1, -1)">
+ <g clip-path="url(#overflowHiddenClip1)">
+ <g transform="scale(0.2, 0.2)">
+ <rect width="10" height="10"/>
+ </g>
+ </g>
+ </g>
+ <g transform="translate(80,110) scale(8) translate(-1, -1)">
+ <g clip-path="url(#overflowHiddenClip1)">
+ <g transform="scale(0.2, 0.2)">
+ <rect width="10" height="10"/>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ <!-- ===================================================================== -->
+ <!-- Stroke property -->
+ <!-- ===================================================================== -->
+ <g fill="none" stroke="black" stroke-width="4">
+ <marker id="marker2" viewBox="0 0 20 20" markerWidth="4" markerHeight="4" refX="10" refY="10" markerUnits="strokeWidth">
+ <rect width="20" height="20"/>
+ </marker>
+ <text x="340" y="140" font-size="10" fill="black" stroke="none">Stroke Property</text>
+ <path marker-start="url(#marker2)" marker-mid="url(#marker2)" marker-end="url(#marker2)" d="M 270 60 L 320 60 L 320 110 Z"/>
+ <!-- ===================================================================== -->
+ <!-- Generate the equivalent SVG -->
+ <!-- ===================================================================== -->
+ <g transform="translate(120,0)">
+ <path d="M 270 60 L 320 60 L 320 110 Z"/>
+ <!-- ===================================================================== -->
+ <!-- Generate the equivalent SVG -->
+ <!-- ===================================================================== -->
+ <g transform="translate(270,60) scale(4) translate(-2, -2)">
+ <g clip-path="url(#overflowHiddenClip)">
+ <g transform="scale(0.2, 0.2)">
+ <rect width="20" height="20"/>
+ </g>
+ </g>
+ </g>
+ <g transform="translate(320,60) scale(4) translate(-2, -2)">
+ <g clip-path="url(#overflowHiddenClip)">
+ <g transform="scale(0.2, 0.2)">
+ <rect width="20" height="20"/>
+ </g>
+ </g>
+ </g>
+ <g transform="translate(320, 110) scale(4) translate(-2, -2)">
+ <g clip-path="url(#overflowHiddenClip)">
+ <g transform="scale(0.2, 0.2)">
+ <rect width="20" height="20"/>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ <!-- ===================================================================== -->
+ <!-- Define marker element with parents setting painting properties -->
+ <!-- ===================================================================== -->
+ <g fill="green" stroke="blue" stroke-width="8">
+ <marker id="marker3" viewBox="0 0 20 20" markerWidth="4" markerHeight="4" refX="10" refY="10" markerUnits="strokeWidth">
+ <rect width="20" height="20" stroke="black"/>
+ </marker>
+ <marker id="marker4" viewBox="0 0 10 10" markerWidth="4" markerHeight="4" refX="5" refY="5" markerUnits="strokeWidth">
+ <rect width="10" height="10" fill="black" stroke-width="4"/>
+ </marker>
+ </g>
+ <!-- ===================================================================== -->
+ <!-- Parent and specified properties -->
+ <!-- ===================================================================== -->
+ <g fill="orange" stroke="blue">
+ <text x="90" y="270" font-size="10" fill="black" stroke="none">Mixed Properties</text>
+ <path stroke="purple" stroke-width="4" marker-start="url(#marker3)" marker-mid="url(#marker3)" marker-end="url(#marker3)" d="M 30 190 L 80 190 L 80 240 Z"/>
+ <!-- ===================================================================== -->
+ <!-- Generate the equivalent SVG -->
+ <!-- ===================================================================== -->
+ <g transform="translate(120,0)">
+ <path stroke="purple" stroke-width="4" d="M 30 190 L 80 190 L 80 240 Z"/>
+ <g fill="green" stroke="black" stroke-width="8">
+ <g transform="translate(30,190) scale(4) translate(-2, -2)">
+ <g clip-path="url(#overflowHiddenClip)">
+ <g transform="scale(.2, .2)">
+ <rect width="20" height="20"/>
+ </g>
+ </g>
+ </g>
+ <g transform="translate(80,190) scale(4) translate(-2, -2)">
+ <g clip-path="url(#overflowHiddenClip)">
+ <g transform="scale(0.2, 0.2)">
+ <rect width="20" height="20"/>
+ </g>
+ </g>
+ </g>
+ <g transform="translate(80,240) scale(4) translate(-2, -2)">
+ <g clip-path="url(#overflowHiddenClip)">
+ <g transform="scale(0.2, 0.2)">
+ <rect width="20" height="20"/>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ <g fill="orange" stroke="green">
+ <text x="340" y="270" font-size="10" fill="black" stroke="none">Mixed Properties</text>
+ <path stroke="purple" stroke-width="4" marker-start="url(#marker4)" marker-mid="url(#marker4)" marker-end="url(#marker4)" d="M 270 190 L 320 190 L 320 240 Z"/>
+ <!-- ===================================================================== -->
+ <!-- Generate the equivalent SVG -->
+ <!-- ===================================================================== -->
+ <g transform="translate(120,0)">
+ <path stroke="purple" stroke-width="4" d="M 270 190 L 320 190 L 320 240 Z"/>
+ <g fill="black" stroke="blue" stroke-width="4">
+ <g transform="translate(270,190) scale(4) translate(-2, -2)">
+ <g clip-path="url(#overflowHiddenClip)">
+ <g transform="scale(0.4, 0.4)">
+ <rect width="10" height="10"/>
+ </g>
+ </g>
+ </g>
+ <g transform="translate(320,190) scale(4) translate(-2, -2)">
+ <g clip-path="url(#overflowHiddenClip)">
+ <g transform="scale(0.4, 0.4)">
+ <rect width="10" height="10"/>
+ </g>
+ </g>
+ </g>
+ <g transform="translate(320,240) scale(4) translate(-2, -2)">
+ <g clip-path="url(#overflowHiddenClip)">
+ <g transform="scale(0.4, 0.4)">
+ <rect width="10" height="10"/>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.7 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/painting-marker-03-f-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/painting-marker-03-f-ref.png
new file mode 100644
index 00000000..64213c17
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/painting-marker-03-f-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/painting-marker-03-f.svg b/rsvg/tests/fixtures/reftests/svg1.1/painting-marker-03-f.svg
new file mode 100644
index 00000000..22093519
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/painting-marker-03-f.svg
@@ -0,0 +1,86 @@
+<svg version="1.1" baseProfile="full" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="DJ" author="BB" status="accepted"
+ version="$Revision: 1.6 $" testname="$RCSfile: painting-marker-03-f.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/painting.html#Markers">
+ <p>
+ The SVG specification defines three properties to reference markers: marker-start, marker-mid,
+ marker-end. It also provides a shorthand property,marker. Using the marker property from a style sheet
+ is equivalent to using all three (start, mid, end). However, shorthand properties cannot be used as presentation attributes.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The test passes if the two rows of shapes are identical, and that
+ all of the shapes have small blue markers (26 in total per row).
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: painting-marker-03-f.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <defs>
+ <marker id="marker1" markerUnits="strokeWidth" refX="50" refY="50" markerWidth="5" markerHeight="5" viewBox="0 0 100 100">
+ <rect width="100" height="100" fill="royalblue" stroke="none"/>
+ </marker>
+ <marker id="marker2" markerUnits="strokeWidth" refX="100" refY="100" markerWidth="15" markerHeight="15" viewBox="0 0 200 200">
+ <rect width="200" height="200" fill="red" stroke="none"/>
+ </marker>
+ <style type="text/css">
+ #markme { marker: url(#marker1) }
+ </style>
+ </defs>
+
+ <text font-size="20" x="240" y="28" text-anchor="middle">'marker' property test</text>
+
+ <text font-size="20" x="240" y="70" text-anchor="middle" fill="forestgreen">'marker' property</text>
+ <g fill="gold" stroke="black" fill-rule="evenodd" transform="translate(50,20)" id="markme">
+ <path d="M10,60 Q90,60 90,140 Q10,140 10,60 Z M10,140 Q10,60 90,60 Q90,140 10,140 Z M50,70 L80,100 50,130 20,100 Z"/>
+ <polygon points="100,60 120,140 140,60 160,140 180,60 180,100 100,100"/>
+ <polyline points="190,60 210,140 230,60 250,140 270,60 270,100 190,100"/>
+ <line x1="280" x2="370" y1="60" y2="140"/>
+ <line x1="370" x2="280" y1="60" y2="140"/>
+ </g>
+
+ <text font-size="20" x="240" y="200" text-anchor="middle" fill="forestgreen">'marker-start', 'marker-mid' &amp; 'marker-end' attribute</text>
+ <g marker-mid="url(#marker1)" marker-end="url(#marker1)" marker-start="url(#marker1)" fill="gold" stroke="black" fill-rule="evenodd" transform="translate(50,150)">
+ <path d="M10,60 Q90,60 90,140 Q10,140 10,60 Z M10,140 Q10,60 90,60 Q90,140 10,140 Z M50,70 L80,100 50,130 20,100 Z"/>
+ <polygon points="100,60 120,140 140,60 160,140 180,60 180,100 100,100"/>
+ <polyline points="190,60 210,140 230,60 250,140 270,60 270,100 190,100"/>
+ <line x1="280" x2="370" y1="60" y2="140"/>
+ <line x1="370" x2="280" y1="60" y2="140"/>
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.6 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/painting-marker-04-f-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/painting-marker-04-f-ref.png
new file mode 100644
index 00000000..40934e39
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/painting-marker-04-f-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/painting-marker-04-f.svg b/rsvg/tests/fixtures/reftests/svg1.1/painting-marker-04-f.svg
new file mode 100644
index 00000000..6abd8cef
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/painting-marker-04-f.svg
@@ -0,0 +1,84 @@
+<svg version="1.1" baseProfile="full" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="CL" author="BB" status="accepted"
+ version="$Revision: 1.7 $" testname="$RCSfile: painting-marker-04-f.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/painting.html#Markers">
+ <p>
+ The SVG specification defines three properties to reference markers: marker-start, marker-mid,
+ marker-end. It also provides a shorthand property,marker. Using the marker property from a style sheet
+ is equivalent to using all three (start, mid, end). However, shorthand properties cannot be used as presentation attributes.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The test passes if the shapes in the top row have no markers,
+ while the shapes in the bottom rom have small blue markers
+ (26 in total).
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: painting-marker-04-f.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <defs>
+ <marker id="marker1" markerUnits="strokeWidth" refX="50" refY="50" markerWidth="5" markerHeight="5" viewBox="0 0 100 100">
+ <rect width="100" height="100" fill="royalblue" stroke="none"/>
+ </marker>
+ <marker id="marker2" markerUnits="strokeWidth" refX="100" refY="100" markerWidth="15" markerHeight="15" viewBox="0 0 200 200">
+ <rect width="200" height="200" fill="red" stroke="none"/>
+ </marker>
+ </defs>
+
+ <text font-size="20" x="240" y="28" text-anchor="middle">'marker' attribute test</text>
+
+ <text font-size="20" x="240" y="70" text-anchor="middle" fill="forestgreen">'marker' attribute</text>
+ <g marker="url(#marker2)" fill="gold" stroke="black" fill-rule="evenodd" transform="translate(50,20)" id="markme">
+ <path d="M10,60 Q90,60 90,140 Q10,140 10,60 Z M10,140 Q10,60 90,60 Q90,140 10,140 Z M50,70 L80,100 50,130 20,100 Z"/>
+ <polygon points="100,60 120,140 140,60 160,140 180,60 180,100 100,100"/>
+ <polyline points="190,60 210,140 230,60 250,140 270,60 270,100 190,100"/>
+ <line x1="280" x2="370" y1="60" y2="140"/>
+ <line x1="370" x2="280" y1="60" y2="140"/>
+ </g>
+
+ <text font-size="20" x="240" y="200" text-anchor="middle" fill="forestgreen">'marker-start', 'marker-mid' &amp; 'marker-end' attributes</text>
+ <g marker-mid="url(#marker1)" marker-end="url(#marker1)" marker-start="url(#marker1)" fill="gold" stroke="black" fill-rule="evenodd" transform="translate(50,150)">
+ <path d="M10,60 Q90,60 90,140 Q10,140 10,60 Z M10,140 Q10,60 90,60 Q90,140 10,140 Z M50,70 L80,100 50,130 20,100 Z"/>
+ <polygon points="100,60 120,140 140,60 160,140 180,60 180,100 100,100"/>
+ <polyline points="190,60 210,140 230,60 250,140 270,60 270,100 190,100"/>
+ <line x1="280" x2="370" y1="60" y2="140"/>
+ <line x1="370" x2="280" y1="60" y2="140"/>
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.7 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved
+ <g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/painting-marker-06-f-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/painting-marker-06-f-ref.png
new file mode 100644
index 00000000..a6838ca4
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/painting-marker-06-f-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/painting-marker-06-f.svg b/rsvg/tests/fixtures/reftests/svg1.1/painting-marker-06-f.svg
new file mode 100644
index 00000000..c1929f81
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/painting-marker-06-f.svg
@@ -0,0 +1,159 @@
+<svg id="svg-root" width="100%" height="100%"
+ viewBox="0 0 480 360" xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= Copyright 2008 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="AG" author="ED" status="accepted"
+ version="$Revision: 1.9 $" testname="$RCSfile: painting-marker-06-f.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/painting.html#MarkerElement">
+ <p>
+ Tests the basic support for markers. For the three tests, there
+ should be two identical paths with markers drawn. The path on the left is
+ rendered using the marker elements. The path on the right is rendered using
+ the equivalent SVG, showing what the marked path should look like.
+ </p>
+ <p>
+ This test is similar to the painting-marker-01-f.svg test, but has some viewBox attributes
+ that have a non-zero offset.
+ </p>
+ <p>
+ The top test examines the basic support for the marker element and style. The markers are purple rectangles.
+ </p>
+ <p>
+ The middle test examines the support for the different styles of marker properties. The
+ "marker-start" property defines the marker to use at the first vertex of the marked path,
+ in this case a purple rectangle. The "marker-end" property defines the marker to use at the
+ last vertex of the marked path, in this case a blue triangle. The "marker-mid" property
+ defines the marker to use at all vertices, other than the first and last, of the marked path,
+ in this case a green circle.
+ </p>
+ <p>
+ The bottom test examines the support for marker orientation along the
+ path direction. The second vertex, the top right corner of the path, has a marker that
+ is rotated 45 degrees, since that is the average of the horizontal and vertical segments
+ each side. The last vertex, the bottom right corner of the path, has a marker rotated 90
+ degrees since that is the direction of the last path segment.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The rendered picture should match the reference image, except for possible
+ variations in the labelling text (per CSS2 rules).
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: painting-marker-06-f.svg,v $</title>
+ <defs>
+ <font-face
+ font-family="SVGFreeSansASCII"
+ unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <defs>
+ <!-- ===================================================================== -->
+ <!-- Define a few simple marker elements -->
+ <!-- ===================================================================== -->
+ <marker id="marker1" viewBox="20 20 10 10" markerWidth="2" markerHeight="2" refX="25" refY="25" markerUnits="strokeWidth">
+ <rect x="20" y="20" width="10" height="10" fill="purple" stroke="none"/>
+ </marker>
+ <marker id="marker2" viewBox="-5 -5 10 10" markerWidth="2" markerHeight="2" markerUnits="strokeWidth" orient="auto">
+ <path d="M 0 -5 L 5 5 L -5 5 Z" fill="blue" stroke="none"/>
+ </marker>
+ <marker id="markerStart" viewBox="0 0 10 10" markerWidth="2" markerHeight="2" refX="5" refY="5" markerUnits="strokeWidth">
+ <rect width="10" height="10" fill="purple" stroke="none"/>
+ </marker>
+ <marker id="markerMiddle" viewBox="0 0 10 10" markerWidth="2" markerHeight="2" refX="5" refY="5" markerUnits="strokeWidth">
+ <circle cx="5" cy="5" r="5" fill="green" stroke="none"/>
+ </marker>
+ <marker id="markerEnd" viewBox="0 0 10 10" markerWidth="2" markerHeight="2" refX="5" refY="5" markerUnits="strokeWidth">
+ <path d="M 5 0 L 10 10 L 0 10 Z" fill="blue" stroke="none"/>
+ </marker>
+ </defs>
+ <!-- ===================================================================== -->
+ <!-- Basic Marker Test -->
+ <!-- ===================================================================== -->
+ <text x="170" y="30" font-size="14">Basic Markers</text>
+ <path fill="none" stroke="black" stroke-width="8" marker-start="url(#marker1)" marker-mid="url(#marker1)" marker-end="url(#marker1)" d="M 130 40 L 180 40 L 180 90"/>
+ <!-- ===================================================================== -->
+ <!-- Generate the equivalent SVG -->
+ <!-- ===================================================================== -->
+ <g transform="translate(120,0)">
+ <path fill="none" stroke="black" stroke-width="8" d="M 130 40 L 180 40 L 180 90"/>
+ <g transform="translate(130,40) scale(8) scale(0.2, 0.2) translate(-5, -5)" fill="none" stroke="black" stroke-width="8">
+ <rect width="10" height="10" fill="purple" stroke="none"/>
+ </g>
+ <g transform="translate(180,40) scale(8) scale(0.2, 0.2) translate(-5, -5)" fill="none" stroke="black" stroke-width="8">
+ <rect width="10" height="10" fill="purple" stroke="none"/>
+ </g>
+ <g transform="translate(180,90) scale(8) scale(0.2, 0.2) translate(-5, -5)" fill="none" stroke="black" stroke-width="8">
+ <rect width="10" height="10" fill="purple" stroke="none"/>
+ </g>
+ </g>
+ <!-- ===================================================================== -->
+ <!-- Start, Middle and End Marker Test -->
+ <!-- ===================================================================== -->
+ <text x="145" y="125" font-size="14">Start, Middle and End</text>
+ <path fill="none" stroke="black" stroke-width="8" marker-start="url(#markerStart)" marker-mid="url(#markerMiddle)" marker-end="url(#markerEnd)" d="M 130 135 L 180 135 L 180 185"/>
+ <!-- ===================================================================== -->
+ <!-- Generate the equivalent SVG -->
+ <!-- ===================================================================== -->
+ <g transform="translate(120,0)">
+ <path fill="none" stroke="black" stroke-width="8" d="M 130 135 L 180 135 L 180 185"/>
+ <g transform="translate(130,135) scale(8) scale(0.2, 0.2) translate(-5, -5)" fill="none" stroke="black" stroke-width="8">
+ <rect width="10" height="10" fill="purple" stroke="none"/>
+ </g>
+ <g transform="translate(180,135) scale(8) scale(0.2, 0.2) translate(-5, -5)" fill="none" stroke="black" stroke-width="8">
+ <circle cx="5" cy="5" r="5" fill="green" stroke="none"/>
+ </g>
+ <g transform="translate(180,185) scale(8) scale(0.2, 0.2) translate(-5, -5)" fill="none" stroke="black" stroke-width="8">
+ <path d="M 5 0 L 10 10 L 0 10 Z" fill="blue" stroke="none"/>
+ </g>
+ </g>
+ <!-- ===================================================================== -->
+ <!-- Auto Orientation Marker Test -->
+ <!-- ===================================================================== -->
+ <text x="145" y="220" font-size="14">Automatic Orientation</text>
+ <path fill="none" stroke="black" stroke-width="8" marker-start="url(#marker2)" marker-mid="url(#marker2)" marker-end="url(#marker2)" d="M 130 230 L 180 230 L 180 280"/>
+ <!-- ===================================================================== -->
+ <!-- Generate the equivalent SVG -->
+ <!-- ===================================================================== -->
+ <g transform="translate(120,0)">
+ <path fill="none" stroke="black" stroke-width="8" d="M 130 230 L 180 230 L 180 280"/>
+ <g transform="translate(130,230) rotate(0) scale(8) scale(0.2, 0.2) translate(-5, -5)" fill="none" stroke="black" stroke-width="8">
+ <path d="M 5 0 L 10 10 L 0 10 Z" fill="blue" stroke="none"/>
+ </g>
+ <g transform="translate(180,230) rotate(45) scale(8) scale(0.2, 0.2) translate(-5, -5)" fill="none" stroke="black" stroke-width="8">
+ <path d="M 5 0 L 10 10 L 0 10 Z" fill="blue" stroke="none"/>
+ </g>
+ <g transform="translate(180,280) rotate(90) scale(8) scale(0.2, 0.2) translate(-5, -5)" fill="none" stroke="black" stroke-width="8">
+ <path d="M 5 0 L 10 10 L 0 10 Z" fill="blue" stroke="none"/>
+ </g>
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none"
+ fill="black">$Revision: 1.9 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/painting-marker-07-f-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/painting-marker-07-f-ref.png
new file mode 100644
index 00000000..8f78d30b
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/painting-marker-07-f-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/painting-marker-07-f.svg b/rsvg/tests/fixtures/reftests/svg1.1/painting-marker-07-f.svg
new file mode 100644
index 00000000..fc086730
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/painting-marker-07-f.svg
@@ -0,0 +1,66 @@
+<svg id="svg-root" width="100%" height="100%" viewBox="0 0 480 360" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2008 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/" template-version="1.4" reviewer="CL" author="Microsoft" status="accepted" version="$Revision: 1.3 $" testname="$RCSfile: painting-marker-07-f.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/painting.html#Markers">
+ <p>
+ A 'marker' element with 'display' set to 'none' on that
+ element or any ancestor is rendered when referenced by another element.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Test passes if there are two green triangles visible on the page.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: painting-marker-07-f.svg,v $</title>
+ <defs>
+ <font-face
+ font-family="SVGFreeSansASCII"
+ unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <defs>
+ <marker id="testMarker" markerWidth="100" markerHeight="100" display="none">
+ <path d="M 0 0 L 200 200 L 0 150 z" fill="green" />
+ </marker>
+ <g display="none">
+ <marker id="testMarker2" markerWidth="100" markerHeight="100">
+ <path d="M 0 0 L 200 200 L 0 150 z" fill="green" />
+ </marker>
+ </g>
+ </defs>
+ <path d="M 0 0 L 25 25" marker-end="url(#testMarker)" />
+ <path d="M 100 0 L 125 25" marker-end="url(#testMarker2)" />
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none"
+ fill="black">$Revision: 1.3 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--
+ <g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>
+ -->
+</svg> \ No newline at end of file
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/painting-marker-properties-01-f-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/painting-marker-properties-01-f-ref.png
new file mode 100644
index 00000000..39a5cdd2
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/painting-marker-properties-01-f-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/painting-marker-properties-01-f.svg b/rsvg/tests/fixtures/reftests/svg1.1/painting-marker-properties-01-f.svg
new file mode 100644
index 00000000..cbac3a7d
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/painting-marker-properties-01-f.svg
@@ -0,0 +1,95 @@
+<svg id="svg-root" width="100%" height="100%" viewBox="0 0 480 360" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= Copyright 2008 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/" template-version="1.4" reviewer="[reviewer]" author="Microsoft" status="created" version="$Revision: 1.2 $" testname="$RCSfile: painting-marker-properties-01-f.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://dev.w3.org/SVG/profiles/1.1F2/publish/painting.html#MarkerProperties">
+ <p>
+ <!--[[
+ 'Marker-start', 'marker-mid', and 'marker-end' only render markers at the appropriate vertices when applied to 'line', 'path', 'polygon' and 'polyline' elements.
+ ]]-->
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ <!--[[
+ For each attribute ('marker-start', 'marker-mid', and 'marker-end'), create a top 'rect' and a bottom 'rect' that define where the marker
+ 'rect's should align. Create the 'line', 'path', 'polygon', and 'polyline' elements to render their markers between the top and bottom 'rect'
+ elements such that an unbreaking line is formed. The 'line' element does not create a mid marker, so the top marker for the 'mid' column is
+ larger than the rest.
+ ]]-->
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ <!--[[
+ Test passes if there are three unbroken blue rectangles visible on the page.
+ ]]-->
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <defs>
+ <font-face
+ font-family="SVGFreeSansASCII"
+ unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <style type="text/css"><![CDATA[
+ .start
+ {
+ marker-start: url(#markerTest);
+ }
+ .end
+ {
+ marker-end: url(#markerTest);
+ }
+ .mid
+ {
+ marker-mid: url(#markerTest);
+ }]]>
+ </style>
+ <defs>
+ <marker id="markerTest" markerWidth="100" markerHeight="100" fill="blue">
+ <rect width="50" height="55" />
+ </marker>
+ </defs>
+ <rect width="50" height="55" fill="blue" />
+ <line class="start" y1="50" x2="100" y2="50" stroke="none" />
+ <path class="start" d="M 0 100 L 50 100 L 100 100" />
+ <polygon class="start" points="0,150 50,150 100,150" />
+ <polyline class="start" points="0,200 50,200 100,200" />
+ <rect y="250" width="50" height="50" fill="blue" />
+
+ <rect x="250" width="50" height="55" fill="blue" />
+ <line class="end" x1="150" y1="50" x2="250" y2="50" stroke="none" />
+ <path class="end" d="M 150 100 L 200 100 L 250 100" />
+ <polygon class="end" points="250,150 200,150" />
+ <polyline class="end" points="150,200 200,200 250,200" />
+ <rect x="250" y="250" width="50" height="50" fill="blue" />
+
+ <rect x="350" width="50" height="105" fill="blue" />
+ <path class="mid" d="M 300 100 L 350 100 L 400 100" />
+ <polygon class="mid" points="300,150 350,150" />
+ <polyline class="mid" points="300,200 350,200 400,200" />
+ <rect x="350" y="250" width="50" height="50" fill="blue" />
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none"
+ fill="black">$Revision: 1.2 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/painting-stroke-01-t-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/painting-stroke-01-t-ref.png
new file mode 100644
index 00000000..3a971d56
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/painting-stroke-01-t-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/painting-stroke-01-t.svg b/rsvg/tests/fixtures/reftests/svg1.1/painting-stroke-01-t.svg
new file mode 100644
index 00000000..837a64b2
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/painting-stroke-01-t.svg
@@ -0,0 +1,68 @@
+<svg version="1.1" baseProfile="tiny" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="SVGWG" author="Kevin McCluskey" status="accepted"
+ version="$Revision: 1.8 $" testname="$RCSfile: painting-stroke-01-t.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/painting.html#StrokeProperties">
+ <p>
+ Verify the basic capability to handle the stroke properties ("stroke")
+ in combination with the "rect" element .
+ The pair should be rendered as two blue rectangles,
+ the upper one without a stroke and the lower with a green stroke.
+ </p>
+ <p>
+ The test uses the "rect" element, as well as basic "fill" (solid primary colors),
+ "stroke", stroke="green", "font-family" and "font-size" attributes.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The rendered picture should match the reference image, except for possible
+ variations in the labeling text (per CSS2 rules).
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: painting-stroke-01-t.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <!-- ============================================================================= -->
+ <!-- Draw two simple rectangles. One without stroke other with stroke:green -->
+ <!-- ============================================================================= -->
+ <text font-size="36" x="10" y="40">Basic paint: stroke properties.</text>
+ <rect id="stroke-01" fill="blue" stroke="none" x="90" y="70" width="300" height="50"/>
+ <rect id="stroke-02" fill="blue" stroke-width="20" stroke="green" x="90" y="190" width="300" height="50"/>
+ <text font-size="30" x="140" y="150">stroke="none"</text>
+ <text font-size="30" x="148" y="280">stroke="green"</text>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.8 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/painting-stroke-02-t-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/painting-stroke-02-t-ref.png
new file mode 100644
index 00000000..eb4fbd9e
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/painting-stroke-02-t-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/painting-stroke-02-t.svg b/rsvg/tests/fixtures/reftests/svg1.1/painting-stroke-02-t.svg
new file mode 100644
index 00000000..0bde5eb0
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/painting-stroke-02-t.svg
@@ -0,0 +1,63 @@
+<svg version="1.1" baseProfile="tiny" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="SVGWG" author="Kevin McCluskey" status="accepted"
+ version="$Revision: 1.7 $" testname="$RCSfile: painting-stroke-02-t.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/painting.html#StrokeProperties">
+ <p>
+ Verify the basic capability to handle the stroke properties ("stroke", "stroke-width",
+ "stroke-linejoin") in combination with the "rect" element.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The pair should be rendered as two blue rectangles without an interior fill.
+ The upper rectangle should have a thick stroke and sharp corners.
+ The lower rectangle should have a thick stroke and round corners.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: painting-stroke-02-t.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <!-- ====================================================================== -->
+ <!-- Set of rectangles with stroke-width:10 and stroke-linejoin:round-->
+ <!-- ====================================================================== -->
+ <text font-size="36" x="10" y="40">Basic paint: stroke properties.</text>
+ <rect id="stroke-01" fill="none" stroke="blue" stroke-width="20" x="90" y="70" width="300" height="50"/>
+ <rect id="stroke-02" fill="none" stroke="blue" stroke-width="20" stroke-linejoin="round" x="90" y="190" width="300" height="50"/>
+ <text font-size="40" x="120" y="160">stroke-width="20"</text>
+ <text font-size="40" x="58" y="290">stroke-linejoin="round"</text>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.7 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/painting-stroke-03-t-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/painting-stroke-03-t-ref.png
new file mode 100644
index 00000000..841c049a
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/painting-stroke-03-t-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/painting-stroke-03-t.svg b/rsvg/tests/fixtures/reftests/svg1.1/painting-stroke-03-t.svg
new file mode 100644
index 00000000..719a8b0a
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/painting-stroke-03-t.svg
@@ -0,0 +1,64 @@
+<svg version="1.1" baseProfile="tiny" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="SVGWG" author="Kevin McCluskey" status="accepted"
+ version="$Revision: 1.6 $" testname="$RCSfile: painting-stroke-03-t.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/painting.html#StrokeProperties">
+ <p>
+ This test checks the basic capability of handling the stroke properties ("stroke", "stroke-width"
+ "stroke-linejoin", "stroke-linecap", "stroke-miterlimit")
+ with straight-line path commands.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The two paths should be rendered as two blue line segments.
+ The upper segment should have round end caps. The lower segment
+ should be chopped off where the two line segments meet.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: painting-stroke-03-t.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <!-- ====================================================================== -->
+ <!-- Test stroke-linecap:round and stroke-miterlimit:1 -->
+ <!-- ====================================================================== -->
+ <text font-size="36" x="10" y="40">Basic paint: stroke properties.</text>
+ <path fill="none" stroke="blue" stroke-width="30" stroke-linecap="round" d="M 160 70 l 200 20 l -200 20 "/>
+ <path fill="none" stroke="blue" stroke-width="30" stroke-linejoin="miter" stroke-miterlimit="1" d="M 160 190 l 200 20 l -200 20"/>
+ <text font-size="40" x="60" y="160">stroke-linecap="round"</text>
+ <text font-size="40" x="130" y="280">stroke-miterlimit="1"</text>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.6 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/painting-stroke-04-t-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/painting-stroke-04-t-ref.png
new file mode 100644
index 00000000..d89ca570
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/painting-stroke-04-t-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/painting-stroke-04-t.svg b/rsvg/tests/fixtures/reftests/svg1.1/painting-stroke-04-t.svg
new file mode 100644
index 00000000..5e23638f
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/painting-stroke-04-t.svg
@@ -0,0 +1,60 @@
+<svg version="1.1" baseProfile="tiny" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="SVGWG" author="Kevin McCluskey" status="accepted"
+ version="$Revision: 1.6 $" testname="$RCSfile: painting-stroke-04-t.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/painting.html#StrokeProperties">
+ <p>
+ This test checks the "stroke-dasharray" and "stroke-dashoffset" properties. Two lines are drawn, one blue
+ and one black. Both have a "stroke-dasharray" of "10,10" giving a dashed appearance
+ where the size of the gaps and the size of the dash is equal.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ Run the test. No interaction required.
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The black line is lower than but parallel to the blue line. The "stroke-dashoffset" on each line should make the dashes of each line line up with the gaps in the other line.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: painting-stroke-04-t.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <!-- ====================================================================== -->
+ <!-- Test stroke-dasharray and stroke-dashoffset -->
+ <!-- ====================================================================== -->
+ <text font-size="36" x="10" y="60">Basic paint: stroke properties.</text>
+ <path id="stroke-7b" fill="none" stroke="blue" stroke-width="25" stroke-dashoffset="0" stroke-dasharray="10,10" d="M 50 120 L 430 120"/>
+ <path id="stroke-7c" fill="none" stroke="black" stroke-width="25" stroke-dashoffset="10" stroke-dasharray="10,10" d="M 50 140 L 430 140"/>
+ <text font-size="30" x="65" y="210">stroke-dasharray="10, 10"</text>
+ <text font-size="30" x="75" y="260">stroke-dashoffset="10"</text>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.6 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/painting-stroke-05-t-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/painting-stroke-05-t-ref.png
new file mode 100644
index 00000000..8d329955
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/painting-stroke-05-t-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/painting-stroke-05-t.svg b/rsvg/tests/fixtures/reftests/svg1.1/painting-stroke-05-t.svg
new file mode 100644
index 00000000..f4027018
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/painting-stroke-05-t.svg
@@ -0,0 +1,88 @@
+<svg version="1.1" baseProfile="tiny" shape-rendering="geometricPrecision" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="CL" author="BB" status="accepted"
+ version="$Revision: 1.6 $" testname="$RCSfile: painting-stroke-05-t.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/painting.html#StrokeProperties">
+ <p>
+ User agents may render graphical primitives with different levels of accuracy.
+ This test is aimed at determining how a UA renders thin strokes.
+ </p>
+ <p>
+ The test file contains a number of vertical and horizontal lines.
+ The stroke width of the vertical lines increase from left to right.
+ The stroke width of the horizontal lines increase from top to bottom.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ Run the test. No interaction required.
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The test is passed if user is able to see a smooth stroke width
+ increment for the vertical and horizontal lines. The top left hand
+ corner should contain strokes that are very thin in width and the bottom
+ right hand corner should contain thick strokes.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: painting-stroke-05-t.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <text font-size="20" x="240" y="30" text-anchor="middle">Rendering thin strokes</text>
+
+ <polyline points="030,50 030,300" stroke="black" stroke-width="0.001"/>
+ <polyline points="50,50 50,300" stroke="black" stroke-width="0.1"/>
+ <polyline points="70,50 70,300" stroke="black" stroke-width="0.2"/>
+ <polyline points="90,50 90,300" stroke="black" stroke-width="0.3"/>
+ <polyline points="110,50 110,300" stroke="black" stroke-width="0.4"/>
+ <polyline points="130,50 130,300" stroke="black" stroke-width="0.5"/>
+ <polyline points="150,50 150,300" stroke="black" stroke-width="0.6"/>
+ <polyline points="170,50 170,300" stroke="black" stroke-width="0.7"/>
+ <polyline points="190,50 190,300" stroke="black" stroke-width="0.8"/>
+ <polyline points="210,50 210,300" stroke="black" stroke-width="0.9"/>
+ <polyline points="230,50 230,300" stroke="black" stroke-width="1.0"/>
+ <polyline points="250,50 250,300" stroke="black" stroke-width="1.1"/>
+ <polyline points="270,50 270,300" stroke="black" stroke-width="1.2"/>
+ <polyline points="290,50 290,300" stroke="black" stroke-width="1.3"/>
+ <polyline points="310,50 310,300" stroke="black" stroke-width="1.4"/>
+ <polyline points="330,50 330,300" stroke="black" stroke-width="1.5"/>
+ <polyline points="350,50 350,300" stroke="black" stroke-width="1.6"/>
+ <polyline points="370,50 370,300" stroke="black" stroke-width="1.7"/>
+ <polyline points="390,50 390,300" stroke="black" stroke-width="1.8"/>
+ <polyline points="410,50 410,300" stroke="black" stroke-width="1.9"/>
+ <polyline points="430,50 430,300" stroke="black" stroke-width="2.0"/>
+ <polyline points="450,50 450,300" stroke="black" stroke-width="2.1"/>
+
+ <line x1="10" x2="470" y1="100" y2="100" stroke="darkblue" stroke-width="0.1"/>
+ <line x1="10" x2="470" y1="150" y2="150" stroke="darkblue" stroke-width="0.5"/>
+ <line x1="10" x2="470" y1="200" y2="200" stroke="darkblue" stroke-width="1"/>
+ <line x1="10" x2="470" y1="250" y2="250" stroke="darkblue" stroke-width="2"/>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.6 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/painting-stroke-06-t-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/painting-stroke-06-t-ref.png
new file mode 100644
index 00000000..90706f78
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/painting-stroke-06-t-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/painting-stroke-06-t.svg b/rsvg/tests/fixtures/reftests/svg1.1/painting-stroke-06-t.svg
new file mode 100644
index 00000000..829633f5
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/painting-stroke-06-t.svg
@@ -0,0 +1,74 @@
+<svg version="1.1" baseProfile="tiny" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="CL" author="CN" status="accepted"
+ version="$Revision: 1.7 $" testname="$RCSfile: painting-stroke-06-t.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/painting.html#StrokeProperties">
+ <p>
+ Test default effects of stroke-dasharray.
+ </p>
+ <p>
+ This specifically tests the values of none and 0.
+ This also tests an odd number of values in a dash-array attribute
+ and in combination with an offset.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ Run the test. No interaction required.
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The top two lines must be solid black. The next line shows a thick
+ black line with a thinner blue line on top; both must have the same
+ dash pattern. The bottom two lines, one black and one blue, must render
+ so that the gaps of one correspond to the dashes of the other.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: painting-stroke-06-t.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <g transform="scale(1.8)">
+
+ <!-- No dasharray -->
+ <path stroke="black" stroke-width="10" fill="none" stroke-dasharray="none" d=" M 20 20 L 200 20"/>
+
+ <path stroke="black" stroke-width="10" fill="none" stroke-dasharray="0" d=" M 20 40 L 200 40"/>
+
+ <!-- Odd number, should repeat to make an even number -->
+ <path stroke="black" stroke-width="20" fill="none" stroke-dasharray="5,2,5,5,2,5" d=" M 20 60 L 200 60"/>
+ <path stroke="blue" stroke-width="10" fill="none" stroke-dasharray="5,2,5" d=" M 20 60 L 200 60"/>
+
+ <!-- Odd number, with a dashoffset test -->
+ <path stroke="black" stroke-width="10" fill="none" stroke-dasharray="2" d=" M 20 80 L 200 80"/>
+
+ <path stroke="blue" stroke-width="10" fill="none" stroke-dasharray="2" stroke-dashoffset="2" d=" M 20 90 L 200 90"/>
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.7 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/painting-stroke-07-t-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/painting-stroke-07-t-ref.png
new file mode 100644
index 00000000..39b77721
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/painting-stroke-07-t-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/painting-stroke-07-t.svg b/rsvg/tests/fixtures/reftests/svg1.1/painting-stroke-07-t.svg
new file mode 100644
index 00000000..853bda40
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/painting-stroke-07-t.svg
@@ -0,0 +1,63 @@
+<svg version="1.1" baseProfile="tiny" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="CL" author="CN" status="accepted"
+ version="$Revision: 1.7 $" testname="$RCSfile: painting-stroke-07-t.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/painting.html#StrokeProperties">
+ <p>
+ Test effect of different stroke-miterlimits. For this particular combination of
+ stroke width and angle, the cut off value of stroke-miterlimit is 18.028.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The first and second subtests should not truncate the stroke, and all the rest must truncate it.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: painting-stroke-07-t.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <g transform="scale(1.2) translate(60, 30)">
+ <!-- test different miterlimits -->
+ <path stroke="black" stroke-width="10" stroke-linejoin="miter" stroke-miterlimit="20" fill="none" d="M 20 20 L 200 30 L 20 40"/>
+ <path stroke="black" stroke-width="10" stroke-linejoin="miter" stroke-miterlimit="18.1" fill="none" d="M 20 50 L 200 60 L 20 70"/>
+ <path stroke="black" stroke-width="10" stroke-linejoin="miter" stroke-miterlimit="17.9" fill="none" d="M 20 80 L 200 90 L 20 100"/>
+ <path stroke="black" stroke-width="10" stroke-linejoin="miter" stroke-miterlimit="17" fill="none" d="M 20 110 L 200 120 L 20 130"/>
+ <path stroke="black" stroke-width="10" stroke-linejoin="miter" stroke-miterlimit="4" fill="none" d="M 20 140 L 200 150 L 20 160"/>
+ <path stroke="black" stroke-width="10" stroke-linejoin="miter" stroke-miterlimit="1" fill="none" d="M 20 170 L 200 180 L 20 190"/>
+
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.7 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/painting-stroke-08-t-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/painting-stroke-08-t-ref.png
new file mode 100644
index 00000000..050ffffd
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/painting-stroke-08-t-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/painting-stroke-08-t.svg b/rsvg/tests/fixtures/reftests/svg1.1/painting-stroke-08-t.svg
new file mode 100644
index 00000000..a16b2965
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/painting-stroke-08-t.svg
@@ -0,0 +1,78 @@
+<svg version="1.1" baseProfile="tiny" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="CL" author="CN" status="accepted"
+ version="$Revision: 1.6 $" testname="$RCSfile: painting-stroke-08-t.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/painting.html#StrokeProperties">
+ <p>
+ Test effects of stroke-opacity range. Values
+ outside the range 0-1.0 must be clamped.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ Run the test. No interaction required.
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ There must be no blue bars visible beside the three pink dots.
+ Four semitransparent blue bars, increasingly more opaque,
+ must line up with the yellow dots. Three fully opaque
+ blue bars must line up with the green dots.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: painting-stroke-08-t.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <g transform="translate(50, 0) scale(1.7)">
+ <circle r="5" fill="#f66" cx="200" cy="20"/>
+ <circle r="5" fill="#f66" cx="200" cy="40"/>
+ <circle r="5" fill="#f66" cx="200" cy="60"/>
+ <circle r="5" fill="#f66" cx="200" cy="80"/>
+ <circle r="5" fill="#ff0" cx="200" cy="80"/>
+ <circle r="5" fill="#ff0" cx="200" cy="100"/>
+ <circle r="5" fill="#ff0" cx="200" cy="120"/>
+ <circle r="5" fill="#ff0" cx="200" cy="140"/>
+ <circle r="5" fill="#6f3" cx="200" cy="160"/>
+ <circle r="5" fill="#6f3" cx="200" cy="180"/>
+ <circle r="5" fill="#6f3" cx="200" cy="200"/>
+ <!-- Test range and values outside range (should be clamped to valid range) -->
+ <path stroke="blue" stroke-width="10" fill="none" stroke-opacity="-1.0" d=" M 20 20 L 200 20"/>
+ <path stroke="blue" stroke-width="10" fill="none" stroke-opacity="-0.1" d=" M 20 40 L 200 40"/>
+ <path stroke="blue" stroke-width="10" fill="none" stroke-opacity="0.0" d=" M 20 60 L 200 60"/>
+ <path stroke="blue" stroke-width="10" fill="none" stroke-opacity="0.2" d=" M 20 80 L 200 80"/>
+ <path stroke="blue" stroke-width="10" fill="none" stroke-opacity="0.4" d=" M 20 100 L 200 100"/>
+ <path stroke="blue" stroke-width="10" fill="none" stroke-opacity="0.6" d=" M 20 120 L 200 120"/>
+ <path stroke="blue" stroke-width="10" fill="none" stroke-opacity="0.8" d=" M 20 140 L 200 140"/>
+ <path stroke="blue" stroke-width="10" fill="none" stroke-opacity="1.0" d=" M 20 160 L 200 160"/>
+ <path stroke="blue" stroke-width="10" fill="none" stroke-opacity="1.1" d=" M 20 180 L 200 180"/>
+ <path stroke="blue" stroke-width="10" fill="none" stroke-opacity="2.0" d=" M 20 200 L 200 200"/>
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.6 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved
+ <g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/painting-stroke-09-t-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/painting-stroke-09-t-ref.png
new file mode 100644
index 00000000..4cc8fc40
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/painting-stroke-09-t-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/painting-stroke-09-t.svg b/rsvg/tests/fixtures/reftests/svg1.1/painting-stroke-09-t.svg
new file mode 100644
index 00000000..850962c8
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/painting-stroke-09-t.svg
@@ -0,0 +1,59 @@
+<svg version="1.1" baseProfile="tiny" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.3" reviewer="CL" author="CM" status="accepted"
+ version="$Revision: 1.7 $" testname="$RCSfile: painting-stroke-09-t.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/painting.html#StrokeDasharrayProperty">
+ <p>
+ This tests that the "stroke-dasharray" property accepts values
+ that are separated by white space.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The test is passed if it matches the reference rendering
+ by showing a thick stroke with alternating long and short
+ stroke dashes.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: painting-stroke-09-t.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <!-- ====================================================================== -->
+ <!-- Test stroke-dasharray and stroke-dashoffset -->
+ <!-- ====================================================================== -->
+ <path fill="none" stroke="black" stroke-width="25" stroke-dasharray="25 5 , 5 5" d="M50,120 h385"/>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.7 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved --><!--
+ <g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/paths-data-01-t-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-01-t-ref.png
new file mode 100644
index 00000000..47bd02fc
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-01-t-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/paths-data-01-t.svg b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-01-t.svg
new file mode 100644
index 00000000..e6b972d7
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-01-t.svg
@@ -0,0 +1,151 @@
+<svg version="1.1" baseProfile="tiny" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="SVGWG" author="Lofton Henderson" status="accepted"
+ version="$Revision: 1.7 $" testname="$RCSfile: paths-data-01-t.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/paths.html#PathData">
+ <p>
+ Test that the viewer has the basic capability to handle the 'path'
+ element and its data (d) attribute in combination with the cubic
+ Bezier curveto commands, C, c, S, s (plus Mm and Zz).
+ </p>
+ <p>
+ There are 8 subtests, each composed from the cubic Bezier path commands per
+ the label by the subtest. On-curve control points (i.e., the curve position)
+ are marked by small blue squares. Subtests are filled, or stroked, or
+ both, using simple style properties and colors.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The rendered picture should match the reference image exactly
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: paths-data-01-t.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <!-- ====================================================================== -->
+ <!-- First Curve "X" that has subpath utilizing M, C, S, m, c, & s ======== -->
+ <!-- ====================================================================== -->
+ <text font-size="12" x="100" y="14">Cubic bezier curves drawn with commands:</text>
+ <path id="X_curve_MCSmcs" fill="#00FF00" stroke="#00C000" d=" M 210 130 C 145 130 110 80 110 80 S 75 25 10 25 m 0 105 c 65 0 100 -50 100 -50 s 35 -55 100 -55 "/>
+ <!-- ====================================================================== -->
+ <!-- Markers for path control points ===================================== -->
+ <!-- ====================================================================== -->
+ <rect x="208" y="128" width="4" height="4" fill="#4A83FF" stroke="none"/>
+ <rect x="108" y="78" width="4" height="4" fill="#4A83FF" stroke="none"/>
+ <rect x="8" y="23" width="4" height="4" fill="#4A83FF" stroke="none"/>
+ <rect x="8" y="128" width="4" height="4" fill="#4A83FF" stroke="none"/>
+ <rect x="108" y="78" width="4" height="4" fill="#4A83FF" stroke="none"/>
+ <rect x="208" y="23" width="4" height="4" fill="#4A83FF" stroke="none"/>
+ <text font-size="12" x="5" y="82">M, C, S, m, c, s</text>
+ <!-- ====================================================================== -->
+ <!-- Infinity using M, c, c, c, C & z ===================================== -->
+ <!-- ====================================================================== -->
+ <path id="Infinity_McccCz" fill="none" stroke="#000000" d=" M 240 90 c 0 30 7 50 50 0 c 43 -50 50 -30 50 0 c 0 83 -68 -34 -90 -30 C 240 60 240 90 240 90 z "/>
+ <!-- ====================================================================== -->
+ <!-- Markers for path control points ====================================== -->
+ <!-- ====================================================================== -->
+ <rect x="238" y="88" width="4" height="4" fill="#4A83FF" stroke="none"/>
+ <rect x="288" y="88" width="4" height="4" fill="#4A83FF" stroke="none"/>
+ <rect x="338" y="88" width="4" height="4" fill="#4A83FF" stroke="none"/>
+ <rect x="248" y="58" width="4" height="4" fill="#4A83FF" stroke="none"/>
+ <text font-size="12" x="253" y="50">M, c, c, c, C, z</text>
+ <!-- ====================================================================== -->
+ <!-- Horizontal line utilizing M, C & Z =================================== -->
+ <!-- ====================================================================== -->
+ <path id="Line_MCZ" fill="none" stroke="#000000" d="M80 170 C100 170 160 170 180 170Z"/>
+ <!-- ====================================================================== -->
+ <!-- Markers for path control points ====================================== -->
+ <!-- ====================================================================== -->
+ <rect x="78" y="168" width="4" height="4" fill="#4A83FF" stroke="none"/>
+ <rect x="178" y="168" width="4" height="4" fill="#4A83FF" stroke="none"/>
+ <text font-size="12" x="110" y="190">M, C, Z</text>
+ <!-- ====================================================================== -->
+ <!-- Inverted V using M, C, c & Z ========================================= -->
+ <!-- ====================================================================== -->
+ <path id="Inv_V_MCcZ" fill="#00C000" stroke="none" d="M5 260 C40 260 60 175 55 160 c -5 15 15 100 50 100Z"/>
+ <!-- ====================================================================== -->
+ <!-- Markers for path control points ====================================== -->
+ <!-- ====================================================================== -->
+ <rect x="3" y="258" width="4" height="4" fill="#4A83FF" stroke="none"/>
+ <rect x="53" y="158" width="4" height="4" fill="#4A83FF" stroke="none"/>
+ <rect x="103" y="258" width="4" height="4" fill="#4A83FF" stroke="none"/>
+ <text font-size="12" x="85" y="220">M, C, c, Z</text>
+ <!-- ====================================================================== -->
+ <!-- Remembrance Ribbon using m, c & s ==================================== -->
+ <!-- ====================================================================== -->
+ <path id="Rem_Rib_mcs" fill="none" stroke="#000000" d="m 200 260 c 50 -40 50 -100 25 -100 s -25 60 25 100 "/>
+ <!-- ====================================================================== -->
+ <!-- Markers for path control points ====================================== -->
+ <!-- ====================================================================== -->
+ <rect x="198" y="258" width="4" height="4" fill="#4A83FF" stroke="none"/>
+ <rect x="223" y="158" width="4" height="4" fill="#4A83FF" stroke="none"/>
+ <rect x="248" y="258" width="4" height="4" fill="#4A83FF" stroke="none"/>
+ <text font-size="12" x="165" y="210">m, c, s</text>
+ <!-- ====================================================================== -->
+ <!-- 90 degree arc using M & C ============================================ -->
+ <!-- ====================================================================== -->
+ <path id="Arc_MC" fill="#0000FF" stroke="#000000" d=" M 360 100 C 420 90 460 140 450 190"/>
+ <!-- ====================================================================== -->
+ <!-- Markers for path control points ====================================== -->
+ <!-- ====================================================================== -->
+ <rect x="358" y="98" width="4" height="4" fill="#4A83FF" stroke="none"/>
+ <rect x="448" y="188" width="4" height="4" fill="#4A83FF" stroke="none"/>
+ <text font-size="12" x="360" y="150">M, C</text>
+ <!-- ====================================================================== -->
+ <!-- Circle using M, c, s, s, s & z ======================================= -->
+ <!-- ====================================================================== -->
+ <path id="Circle_Mcssz" fill="#FFFF00" stroke="#000000" d="M360 210 c 0 20 -16 36 -36 36 s -36 -16 -36 -36 s 16 -36 36 -36 s 36 16 36 36 z "/>
+ <!-- ====================================================================== -->
+ <!-- Markers for path control points ====================================== -->
+ <!-- ====================================================================== -->
+ <rect x="358" y="208" width="4" height="4" fill="#4A83FF" stroke="none"/>
+ <rect x="322" y="244" width="4" height="4" fill="#4A83FF" stroke="none"/>
+ <rect x="286" y="208" width="4" height="4" fill="#4A83FF" stroke="none"/>
+ <rect x="322" y="172" width="4" height="4" fill="#4A83FF" stroke="none"/>
+ <text font-size="12" x="290" y="265">M, c, s, s, s, z</text>
+ <!-- ====================================================================== -->
+ <!-- Inverted horseshoe using m, c & z ==================================== -->
+ <!-- ====================================================================== -->
+ <path id="Horseshoe_Mcs" fill="#F0F0F0" stroke="#00AA00" d="m 360 325 c -40 -60 95 -100 80 0 z "/>
+ <!-- ====================================================================== -->
+ <!-- Markers for path control points ====================================== -->
+ <!-- ====================================================================== -->
+ <rect x="358" y="323" width="4" height="4" fill="#4A83FF" stroke="none"/>
+ <rect x="438" y="323" width="4" height="4" fill="#4A83FF" stroke="none"/>
+ <text font-size="12" x="380" y="340">m, c, z</text>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.7 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/paths-data-02-t-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-02-t-ref.png
new file mode 100644
index 00000000..fc0dc1d0
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-02-t-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/paths-data-02-t.svg b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-02-t.svg
new file mode 100644
index 00000000..cad5865d
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-02-t.svg
@@ -0,0 +1,124 @@
+<svg version="1.1" baseProfile="tiny" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="SVGWG" author="Lofton Henderson" status="accepted"
+ version="$Revision: 1.7 $" testname="$RCSfile: paths-data-02-t.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/paths.html#PathData">
+ <p>
+ Test that the viewer has the basic capability to handle the 'path'
+ element and its data (d) attribute in combination with the quadratic
+ Bezier curveto commands, Q, q, T, t (plus Mm and Zz).
+ </p>
+ <p>
+ There are 7 subtests, each composed from the quadric Bezier path commands per
+ the label by the subtest. On-curve control points (i.e., the curve position)
+ are marked by small colored squares. Subtests are filled, or stroked, or
+ both, using simple style properties and colors.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The rendered picture should match the reference image exactly
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: paths-data-02-t.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <text font-size="12" x="120" y="14">Quadric bezier curves drawn with commands:</text>
+ <!-- ====================================================================== -->
+ <!-- Quad Bezier with sub-path using M, Q, M, q, & z ====================== -->
+ <!-- ====================================================================== -->
+ <path id="Bez_MQMqz" fill="none" stroke="#0000FF" stroke-width="3" d="M 15 20 Q 30 120 130 30 M 180 80 q -75 -100 -163 -60z"/>
+ <text font-size="12" x="80" y="86">M, Q, M, q, z</text>
+ <rect x="13" y="18" width="4" height="4" fill="#00C000" stroke="none"/>
+ <rect x="128" y="28" width="4" height="4" fill="#00C000" stroke="none"/>
+ <rect x="178" y="78" width="4" height="4" fill="#00C000" stroke="none"/>
+ <rect x="15" y="18" width="4" height="4" fill="#00C000" stroke="none"/>
+ <!-- ====================================================================== -->
+ <!-- Quad Bezier with sub-path using m, q, z, m, q, & z =================== -->
+ <!-- ====================================================================== -->
+ <path id="Bez_fill_MQzmqz" fill="#FFFF00" stroke="#0000CF" d="M372 130Q272 50 422 10zm70 0q50-150-80-90z"/>
+ <text font-size="12" x="352" y="150">m, q, z, m, q, z</text>
+ <rect x="370" y="128" width="4" height="4" fill="#0000FF" stroke="none"/>
+ <rect x="420" y="8" width="4" height="4" fill="#0000FF" stroke="none"/>
+ <rect x="440" y="128" width="4" height="4" fill="#0000FF" stroke="none"/>
+ <rect x="360" y="38" width="4" height="4" fill="#0000FF" stroke="none"/>
+ <!-- ====================================================================== -->
+ <!-- Simple Bezier using M, Q, & Z ======================================== -->
+ <!-- ====================================================================== -->
+ <path id="Bez_stroke_MQz" fill="none" stroke="#00FFFF" d="M224 103Q234 -12 304 33Z"/>
+ <text font-size="12" x="192" y="36">M, Q, Z</text>
+ <rect x="222" y="101" width="4" height="4" fill="#0000FF" stroke="none"/>
+ <rect x="302" y="31" width="4" height="4" fill="#0000FF" stroke="none"/>
+ <!-- ====================================================================== -->
+ <!-- Tri Bezier using M, Q, T, Q, & z ===================================== -->
+ <!-- ====================================================================== -->
+ <path id="Tri_MQTQz" fill="#00C000" stroke="#000000" d="M208 168Q258 268 308 168T258 118Q128 88 208 168z"/>
+ <text font-size="12" x="308" y="188">M, Q, T, Q, z</text>
+ <rect x="206" y="166" width="4" height="4" fill="#0000FF" stroke="none"/>
+ <rect x="306" y="166" width="4" height="4" fill="#0000FF" stroke="none"/>
+ <rect x="256" y="116" width="4" height="4" fill="#0000FF" stroke="none"/>
+ <rect x="206" y="206" width="4" height="4" fill="#0000FF" stroke="none"/>
+ <!-- ====================================================================== -->
+ <!-- Double Bezier using M, Q, Q, & z ===================================== -->
+ <!-- ====================================================================== -->
+ <path id="Inv_V_MCcZ" fill="#00CF00" stroke="none" d=" M 60 100 Q -40 150 60 200 Q 160 150 60 100 z "/>
+ <text font-size="12" x="80" y="200">M, Q, Q, z</text>
+ <rect x="58" y="98" width="4" height="4" fill="#0000FF" stroke="none"/>
+ <rect x="58" y="198" width="4" height="4" fill="#0000FF" stroke="none"/>
+ <rect x="58" y="98" width="4" height="4" fill="#0000FF" stroke="none"/>
+ <!-- ====================================================================== -->
+ <!-- Sin Wave using M, q, t, t, t, t, & z ================================ -->
+ <!-- ====================================================================== -->
+ <path id="Sin_Mqttttz" fill="none" stroke="#40DD20" d="M240 296q25-100 47 0t47 0t47 0t47 0t47 0z"/>
+ <text font-size="12" x="380" y="236">M, q, t, t, t, t, z</text>
+ <rect x="238" y="294" width="4" height="4" fill="#0000FF" stroke="none"/>
+ <rect x="285" y="294" width="4" height="4" fill="#0000FF" stroke="none"/>
+ <rect x="332" y="294" width="4" height="4" fill="#0000FF" stroke="none"/>
+ <rect x="379" y="294" width="4" height="4" fill="#0000FF" stroke="none"/>
+ <rect x="426" y="294" width="4" height="4" fill="#0000FF" stroke="none"/>
+ <rect x="473" y="294" width="4" height="4" fill="#0000FF" stroke="none"/>
+ <!-- ====================================================================== -->
+ <!-- Double Spade using M, q, Q, q, Q, & z ================================ -->
+ <!-- ====================================================================== -->
+ <path id="Dbl_spd_MCcZ" fill="#0000C0" stroke="#00CF00" stroke-width="2" d="M172 193q-100 50 0 50Q72 243 172 293q100 -50 0 -50Q272 243 172 193z"/>
+ <text font-size="12" x="48" y="280">M, q, Q, q, Q, z</text>
+ <rect x="170" y="191" width="4" height="4" fill="#40DD20" stroke="none"/>
+ <rect x="170" y="241" width="4" height="4" fill="#40DD20" stroke="none"/>
+ <rect x="170" y="291" width="4" height="4" fill="#40DD20" stroke="none"/>
+ <rect x="170" y="241" width="4" height="4" fill="#40DD20" stroke="none"/>
+ <rect x="170" y="191" width="4" height="4" fill="#40DD20" stroke="none"/>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.7 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/paths-data-03-f-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-03-f-ref.png
new file mode 100644
index 00000000..0ca10c6d
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-03-f-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/paths-data-03-f.svg b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-03-f.svg
new file mode 100644
index 00000000..3f087fdc
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-03-f.svg
@@ -0,0 +1,113 @@
+<svg version="1.1" baseProfile="full" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="SVGWG" author="Lofton Henderson" status="accepted"
+ version="$Revision: 1.7 $" testname="$RCSfile: paths-data-03-f.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/paths.html#PathData">
+ <p>
+ Test that the viewer has the basic capability to handle the 'path'
+ element and its data (d) attribute in combination with the elliptical
+ arc curveto commands, A, a (plus Mm and Zz).
+ </p>
+ <p>
+ There are 6 subtests, each composed from the elliptical arc path commands per
+ the label by the subtest. The curve positions
+ are marked by small colored squares. Subtests are filled, or stroked, or
+ both, using simple style properties and colors.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The rendered picture should match the reference image exactly
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: paths-data-03-f.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <text font-size="12" x="120" y="14">Elliptical arc curves drawn with commands:</text>
+ <!-- ====================================================================== -->
+ <!-- Simple circle using MAZ ============================ -->
+ <!-- ====================================================================== -->
+ <path id="Arc_MAZ" fill="none" stroke="#03DD20" stroke-width="10" d=" M 25 70 A 40 40 0 1 0 25 69 Z "/>
+ <text font-size="12" x="48" y="70">M, A, Z</text>
+ <rect x="23" y="68" width="4" height="4" fill="#00C000" stroke="none"/>
+ <rect x="23" y="67" width="4" height="4" fill="#00C000" stroke="none"/>
+ <!-- ====================================================================== -->
+ <!-- filled arc using m, a, & z =================== -->
+ <!-- ====================================================================== -->
+ <path id="Arc_fill_maz" fill="#00FF00" stroke="#0000FF" d=" m 150 100 a 50 40 0 1 0 25 -70 z "/>
+ <text font-size="12" x="124" y="45">m, a, z</text>
+ <rect x="148" y="98" width="4" height="4" fill="#CF0000" stroke="none"/>
+ <rect x="173" y="28" width="4" height="4" fill="#CF0000" stroke="none"/>
+ <!-- ====================================================================== -->
+ <!-- Unterminated arc using M & a ======================================== -->
+ <!-- ====================================================================== -->
+ <path id="Arc_Ma" fill="none" stroke="#000000" d=" M 350 245 a 40 40 0 1 0 80 60 "/>
+ <text font-size="12" x="390" y="300">M, a</text>
+ <rect x="348" y="243" width="4" height="4" fill="#0000FF" stroke="none"/>
+ <rect x="428" y="303" width="4" height="4" fill="#0000FF" stroke="none"/>
+ <!-- ====================================================================== -->
+ <!-- Triple Arc using M, A, a, a, & z ===================================== -->
+ <!-- ====================================================================== -->
+ <path id="Tri_MAaaz" fill="#0067C0" stroke="none" fill-rule="evenodd" d=" M 270 30 A 50 50 0 1 0 345 30 a 50 50 0 1 0 50 0 a 50 50 0 1 0 25 0 z "/>
+ <text font-size="12" x="280" y="135">M, A, a, a, z</text>
+ <rect x="268" y="28" width="4" height="4" fill="#0000FF" stroke="none"/>
+ <rect x="343" y="28" width="4" height="4" fill="#0000FF" stroke="none"/>
+ <rect x="393" y="28" width="4" height="4" fill="#0000FF" stroke="none"/>
+ <rect x="418" y="28" width="4" height="4" fill="#0000FF" stroke="none"/>
+ <!-- ====================================================================== -->
+ <!-- Tripple arc using M, a, Z, m, A, Z, m, a & z ===================================== -->
+ <!-- ====================================================================== -->
+ <path id="Arc_MaZmAzmaz" fill="#609040" stroke="#000000" stroke-width="3" d=" M 30 150 a 40 40 0 0 1 65 50 Z m 30 30 A 20 20 0 0 0 125 230 Z m 40 24 a 20 20 0 0 1 65 50 z "/>
+ <text font-size="12" x="25" y="270">M, a, Z, m, A, Z, m, a, z</text>
+ <rect x="28" y="148" width="4" height="4" fill="#0000FF" stroke="none"/>
+ <rect x="93" y="198" width="4" height="4" fill="#0000FF" stroke="none"/>
+ <rect x="58" y="178" width="4" height="4" fill="#0000FF" stroke="none"/>
+ <rect x="123" y="228" width="4" height="4" fill="#0000FF" stroke="none"/>
+ <rect x="98" y="202" width="4" height="4" fill="#0000FF" stroke="none"/>
+ <rect x="163" y="252" width="4" height="4" fill="#0000FF" stroke="none"/>
+ <!-- ====================================================================== -->
+ <!-- Sin Wave using M, q, t, t, t, t, & z ================================ -->
+ <!-- ====================================================================== -->
+ <path id="Sin_MAAAAA" fill="none" stroke="#40DD20" d=" M 215 190 A 40 200 10 0 0 265 190 A 40 200 20 0 1 315 190 A 40 200 30 0 0 365 190 A 40 200 40 0 1 415 190 A 40 200 50 0 0 465 190 "/>
+ <text font-size="12" x="215" y="246">M, A, A, A, A</text>
+ <rect x="213" y="188" width="4" height="4" fill="#0000FF" stroke="none"/>
+ <rect x="263" y="188" width="4" height="4" fill="#0000FF" stroke="none"/>
+ <rect x="313" y="188" width="4" height="4" fill="#0000FF" stroke="none"/>
+ <rect x="363" y="188" width="4" height="4" fill="#0000FF" stroke="none"/>
+ <rect x="413" y="188" width="4" height="4" fill="#0000FF" stroke="none"/>
+ <rect x="463" y="188" width="4" height="4" fill="#0000FF" stroke="none"/>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.7 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/paths-data-04-t-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-04-t-ref.png
new file mode 100644
index 00000000..755895d0
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-04-t-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/paths-data-04-t.svg b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-04-t.svg
new file mode 100644
index 00000000..63fef435
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-04-t.svg
@@ -0,0 +1,82 @@
+<svg version="1.1" baseProfile="tiny" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="SVGWG" author="Lofton Henderson" status="accepted"
+ version="$Revision: 1.7 $" testname="$RCSfile: paths-data-04-t.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/paths.html#PathData">
+ <p>
+ Verify the basic capability to handle the 'path' element, and its data attribute (d)
+ in combination with the straight-line path commands.
+ Two pairs of concentric equilateral triangles are drawn using respectively
+ M,L,Z and m,l,z. The shapes are identical, with one stroked and
+ one filled. The fill-mode default of "even-odd" means that
+ the inner triangle is hollow.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The rendered picture should match the reference image exactly
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: paths-data-04-t.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <!-- ====================================================================== -->
+ <!-- First Group of Triangles using M, L & Z commands ===================== -->
+ <!-- ====================================================================== -->
+ <g transform="scale(1.8)">
+ <!-- <text font-size="12" x="160" y="14">Lines drawn with commands:</text> -->
+ <text font-size="12" x="88" y="30">M, L, L, L, Z,</text>
+ <text font-size="12" x="98" y="46">subpath</text>
+ <text font-size="12" x="88" y="61">M, L, L, L, Z</text>
+ <path id="Triangle_stroke_MLZ" fill="none" stroke="#000000" d=" M 62.00000 56.00000 L 113.96152 146.00000 L 10.03848 146.00000 L 62.00000 56.00000 Z M 62.00000 71.00000 L 100.97114 138.50000 L 23.02886 138.50000 L 62.00000 71.00000 Z "/>
+ <rect x="60.00000" y="54.00000" width="4" height="4" fill="#00C000" stroke="none"/>
+ <rect x="111.96152" y="144.00000" width="4" height="4" fill="#00C000" stroke="none"/>
+ <rect x="8.03848" y="144.00000" width="4" height="4" fill="#00C000" stroke="none"/>
+ <rect x="60.00000" y="69.00000" width="4" height="4" fill="#00C000" stroke="none"/>
+ <rect x="98.97114" y="136.50000" width="4" height="4" fill="#00C000" stroke="none"/>
+ <rect x="21.02886" y="136.50000" width="4" height="4" fill="#00C000" stroke="none"/>
+ <text font-size="12" x="42" y="162">stroked</text>
+ <path id="Triangle_fill_MLZ" fill="#7FA" stroke="none" fill-rule="evenodd" d=" M 177.00000 56.00000 L 228.96152 146.00000 L 125.03848 146.00000 L 177.00000 56.00000 Z M 177.00000 71.00000 L 215.97114 138.50000 L 138.02886 138.50000 L 177.00000 71.00000 Z "/>
+ <rect x="175.00000" y="54.00000" width="4" height="4" fill="#00C000" stroke="none"/>
+ <rect x="226.96152" y="144.00000" width="4" height="4" fill="#00C000" stroke="none"/>
+ <rect x="123.03848" y="144.00000" width="4" height="4" fill="#00C000" stroke="none"/>
+ <rect x="175.00000" y="69.00000" width="4" height="4" fill="#00C000" stroke="none"/>
+ <rect x="213.97114" y="136.50000" width="4" height="4" fill="#00C000" stroke="none"/>
+ <rect x="136.02886" y="136.50000" width="4" height="4" fill="#00C000" stroke="none"/>
+ <text font-size="12" x="162" y="162">filled</text>
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.7 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/paths-data-05-t-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-05-t-ref.png
new file mode 100644
index 00000000..50d4aa06
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-05-t-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/paths-data-05-t.svg b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-05-t.svg
new file mode 100644
index 00000000..cea68ca9
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-05-t.svg
@@ -0,0 +1,79 @@
+<svg version="1.1" baseProfile="tiny" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="SVGWG" author="Lofton Henderson" status="accepted"
+ version="$Revision: 1.7 $" testname="$RCSfile: paths-data-05-t.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/paths.html#PathData">
+ <p>
+ Verify the basic capability to handle the 'path' element, and its data attribute (d)
+ in combination with the straight-line path commands.
+ Two pairs of concentric equilateral triangles are drawn using respectively
+ M,L,Z and m,l,z. The shapes in each pair are identical, with one stroked and
+ one filled. The fill-mode default of "even-odd" means that
+ the inner triangle is hollow.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The rendered picture should match the reference image exactly
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: paths-data-05-t.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <!-- ====================================================================== -->
+ <!-- Second Group of Triangles using m, l & z commands===================== -->
+ <!-- ====================================================================== -->
+ <g transform="scale(1.8) translate(0, -150)">
+ <text font-size="12" x="96" y="180">m, l, l, l, z,</text>
+ <text font-size="12" x="100" y="194">subpath</text>
+ <text font-size="12" x="97" y="208">m, l, l, l, z</text>
+ <path id="Triangle_stroke_mlz" fill="none" stroke="#000000" d=" m 62.00000 190.00000 l 51.96152 90.00000 l -103.92304 0.00000 l 51.96152 -90.00000 z m 0.00000 15.00000 l 38.97114 67.50000 l -77.91228 0.00000 l 38.97114 -67.50000 z "/>
+ <rect x="60.00000" y="188.00000" width="4" height="4" fill="#40DD20" stroke="none"/>
+ <rect x="111.96152" y="278.00000" width="4" height="4" fill="#40DD20" stroke="none"/>
+ <rect x="8.03848" y="278.00000" width="4" height="4" fill="#40DD20" stroke="none"/>
+ <rect x="60.00000" y="203.00000" width="4" height="4" fill="#40DD20" stroke="none"/>
+ <rect x="98.97114" y="270.50000" width="4" height="4" fill="#40DD20" stroke="none"/>
+ <rect x="21.02886" y="270.50000" width="4" height="4" fill="#40DD20" stroke="none"/>
+ <path id="Triangle_fill_mlz" fill="#006000" stroke="none" fill-rule="evenodd" d=" m 177.00000 190.00000 l 51.96152 90.00000 l -103.92304 0.00000 l 51.96152 -90.00000 z m 0.00000 15.00000 l 38.97114 67.50000 l -77.91228 0.00000 l 38.97114 -67.50000 z "/>
+ <rect x="175.00000" y="188.00000" width="4" height="4" fill="#40DD20" stroke="none"/>
+ <rect x="226.96152" y="278.00000" width="4" height="4" fill="#40DD20" stroke="none"/>
+ <rect x="123.03848" y="278.00000" width="4" height="4" fill="#40DD20" stroke="none"/>
+ <rect x="175.00000" y="203.00000" width="4" height="4" fill="#40DD20" stroke="none"/>
+ <rect x="213.97114" y="270.50000" width="4" height="4" fill="#40DD20" stroke="none"/>
+ <rect x="136.02886" y="270.50000" width="4" height="4" fill="#40DD20" stroke="none"/>
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.7 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/paths-data-06-t-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-06-t-ref.png
new file mode 100644
index 00000000..fb9458dc
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-06-t-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/paths-data-06-t.svg b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-06-t.svg
new file mode 100644
index 00000000..5e0fa31c
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-06-t.svg
@@ -0,0 +1,83 @@
+<svg version="1.1" baseProfile="tiny" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="SVGWG" author="Lofton Henderson" status="accepted"
+ version="$Revision: 1.7 $" testname="$RCSfile: paths-data-06-t.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/paths.html#PathData">
+ <p>
+ Verify the basic capability to handle the 'path' element, and its data attribute (d)
+ in combination with the straight-line path commands.
+ Two pairs of staircase figures are drawn using
+ respectively M,H,V,Z and m,h,v,z. The shapes in each pair are identical, with one stroked and
+ one filled.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The rendered picture should match the reference image exactly
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: paths-data-06-t.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <g transform="scale(1.8) translate(-200, 0)">
+ <!-- ====================================================================== -->
+ <!-- First Group of Stairs using M, H, V & Z commands====================== -->
+ <!-- ====================================================================== -->
+ <text font-size="12" x="288" y="30">M, H, V, H,</text>
+ <text font-size="12" x="288" y="46">V. H, V, H,</text>
+ <text font-size="12" x="304" y="62">V, Z</text>
+ <path id="Stairs_stroke_MHVZ" fill="none" stroke="#000000" d=" M 240.00000 56.00000 H 270.00000 V 86.00000 H 300.00000 V 116.00000 H 330.00000 V 146.00000 H 240.00000 V 56.00000 Z "/>
+ <rect x="238.00000" y="54.00000" width="4" height="4" fill="#FFFF00" stroke="none"/>
+ <rect x="268.00000" y="54.00000" width="4" height="4" fill="#FFFF00" stroke="none"/>
+ <rect x="268.00000" y="84.00000" width="4" height="4" fill="#FFFF00" stroke="none"/>
+ <rect x="298.00000" y="84.00000" width="4" height="4" fill="#FFFF00" stroke="none"/>
+ <rect x="298.00000" y="114.00000" width="4" height="4" fill="#FFFF00" stroke="none"/>
+ <rect x="328.00000" y="114.00000" width="4" height="4" fill="#FFFF00" stroke="none"/>
+ <rect x="328.00000" y="144.00000" width="4" height="4" fill="#FFFF00" stroke="none"/>
+ <rect x="238.00000" y="144.00000" width="4" height="4" fill="#FFFF00" stroke="none"/>
+ <path id="Stairs_fill_MHVZ" fill="#0000FF" stroke="none" d=" M 350.00000 56.00000 H 380.00000 V 86.00000 H 410.00000 V 116.00000 H 440.00000 V 146.00000 H 350.00000 V 56.00000 Z "/>
+ <rect x="348.00000" y="54.00000" width="4" height="4" fill="#FFFF00" stroke="none"/>
+ <rect x="378.00000" y="54.00000" width="4" height="4" fill="#FFFF00" stroke="none"/>
+ <rect x="378.00000" y="84.00000" width="4" height="4" fill="#FFFF00" stroke="none"/>
+ <rect x="408.00000" y="84.00000" width="4" height="4" fill="#FFFF00" stroke="none"/>
+ <rect x="408.00000" y="114.00000" width="4" height="4" fill="#FFFF00" stroke="none"/>
+ <rect x="438.00000" y="114.00000" width="4" height="4" fill="#FFFF00" stroke="none"/>
+ <rect x="438.00000" y="144.00000" width="4" height="4" fill="#FFFF00" stroke="none"/>
+ <rect x="348.00000" y="144.00000" width="4" height="4" fill="#FFFF00" stroke="none"/>
+ <!-- ====================================================================== -->
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.7 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/paths-data-07-t-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-07-t-ref.png
new file mode 100644
index 00000000..073abccb
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-07-t-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/paths-data-07-t.svg b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-07-t.svg
new file mode 100644
index 00000000..806e0b56
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-07-t.svg
@@ -0,0 +1,82 @@
+<svg version="1.1" baseProfile="tiny" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="SVGWG" author="Lofton Henderson" status="accepted"
+ version="$Revision: 1.7 $" testname="$RCSfile: paths-data-07-t.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/paths.html#PathData">
+ <p>
+ Verify the basic capability to handle the 'path' element, and its data attribute (d)
+ in combination with the straight-line path commands.
+ Two pairs of staircase figures are drawn using
+ respectively M,H,V,Z and m,h,v,z. The shapes in each pair are identical, with one stroked and
+ one filled.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The rendered picture should match the reference image exactly
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: paths-data-07-t.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <g transform="scale(1.8) translate(-200, -150)">
+ <!-- ====================================================================== -->
+ <!-- Second Group of Stairs using m, h, v & z commands====================== -->
+ <!-- ====================================================================== -->
+ <text font-size="12" x="288" y="180">m, h, v, h</text>
+ <text font-size="12" x="288" y="194">v, h, v, h</text>
+ <text font-size="12" x="304" y="208">v, z</text>
+ <path id="Stairs_stroke_mhvz" fill="none" stroke="#000000" d=" m 240.00000 190.00000 h 30.00000 v 30.00000 h 30.00000 v 30.00000 h 30.00000 v 30.00000 h -90.00000 v -90.00000 z "/>
+ <rect x="238.00000" y="188.00000" width="4" height="4" fill="#0000FF" stroke="none"/>
+ <rect x="268.00000" y="188.00000" width="4" height="4" fill="#0000FF" stroke="none"/>
+ <rect x="268.00000" y="218.00000" width="4" height="4" fill="#0000FF" stroke="none"/>
+ <rect x="298.00000" y="218.00000" width="4" height="4" fill="#0000FF" stroke="none"/>
+ <rect x="298.00000" y="248.00000" width="4" height="4" fill="#0000FF" stroke="none"/>
+ <rect x="328.00000" y="248.00000" width="4" height="4" fill="#0000FF" stroke="none"/>
+ <rect x="328.00000" y="278.00000" width="4" height="4" fill="#0000FF" stroke="none"/>
+ <rect x="238.00000" y="278.00000" width="4" height="4" fill="#0000FF" stroke="none"/>
+ <path id="Stairs_fill_mhvz" fill="#FFFF00" stroke="none" d=" m 350.00000 190.00000 h 30.00000 v 30.00000 h 30.00000 v 30.00000 h 30.00000 v 30.00000 h -90.00000 v -90.00000 z "/>
+ <rect x="348.00000" y="188.00000" width="4" height="4" fill="#0000FF" stroke="none"/>
+ <rect x="378.00000" y="188.00000" width="4" height="4" fill="#0000FF" stroke="none"/>
+ <rect x="378.00000" y="218.00000" width="4" height="4" fill="#0000FF" stroke="none"/>
+ <rect x="408.00000" y="218.00000" width="4" height="4" fill="#0000FF" stroke="none"/>
+ <rect x="408.00000" y="248.00000" width="4" height="4" fill="#0000FF" stroke="none"/>
+ <rect x="438.00000" y="248.00000" width="4" height="4" fill="#0000FF" stroke="none"/>
+ <rect x="438.00000" y="278.00000" width="4" height="4" fill="#0000FF" stroke="none"/>
+ <rect x="348.00000" y="278.00000" width="4" height="4" fill="#0000FF" stroke="none"/>
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.7 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/paths-data-08-t-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-08-t-ref.png
new file mode 100644
index 00000000..f0f337e9
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-08-t-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/paths-data-08-t.svg b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-08-t.svg
new file mode 100644
index 00000000..5b2af84f
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-08-t.svg
@@ -0,0 +1,82 @@
+<svg version="1.1" baseProfile="tiny" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="CN" author="SH" status="accepted"
+ version="$Revision: 1.6 $" testname="$RCSfile: paths-data-08-t.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/paths.html#PathData">
+ <p>
+ Verify the basic capability to handle the 'path' element, and its data attribute (d)
+ in combination with the straight-line path commands.
+ Two pairs of concentric equilateral triangles are drawn using
+ M and Z. No L commands are used in this test as they are implied after
+ an M or Z command. The shapes are identical, with one stroked and
+ one filled. The fill-mode default of "even-odd" means that
+ the inner triangle is hollow.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The rendered picture should match the reference image exactly
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: paths-data-08-t.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <!-- ====================================================================== -->
+ <!-- First Group of Triangles using M & Z commands ======================== -->
+ <!-- ====================================================================== -->
+ <text font-size="24" x="75" y="34">Lines drawn with commands:</text>
+ <text font-size="24" x="180" y="64">M and Z</text>
+
+ <g transform="scale(1.8)">
+ <path id="Triangle_stroke_MZ" fill="none" stroke="#000000" d=" M 62.00000 56.00000 113.96152 146.00000 10.03848 146.00000 62.00000 56.00000 Z M 62.00000 71.00000 100.97114 138.50000 23.02886 138.50000 62.00000 71.00000 Z "/>
+ <rect x="60.00000" y="54.00000" width="4" height="4" fill="#00C000" stroke="none"/>
+ <rect x="111.96152" y="144.00000" width="4" height="4" fill="#00C000" stroke="none"/>
+ <rect x="8.03848" y="144.00000" width="4" height="4" fill="#00C000" stroke="none"/>
+ <rect x="60.00000" y="69.00000" width="4" height="4" fill="#00C000" stroke="none"/>
+ <rect x="98.97114" y="136.50000" width="4" height="4" fill="#00C000" stroke="none"/>
+ <rect x="21.02886" y="136.50000" width="4" height="4" fill="#00C000" stroke="none"/>
+ <text font-size="12" x="42" y="162">stroked</text>
+ <path id="Triangle_fill_MZ" fill="#05D" stroke="none" fill-rule="evenodd" d=" M 177.00000 56.00000 228.96152 146.00000 125.03848 146.00000 177.00000 56.00000 Z M 177.00000 71.00000 215.97114 138.50000 138.02886 138.50000 177.00000 71.00000 Z "/>
+ <rect x="175.00000" y="54.00000" width="4" height="4" fill="#00C000" stroke="none"/>
+ <rect x="226.96152" y="144.00000" width="4" height="4" fill="#00C000" stroke="none"/>
+ <rect x="123.03848" y="144.00000" width="4" height="4" fill="#00C000" stroke="none"/>
+ <rect x="175.00000" y="69.00000" width="4" height="4" fill="#00C000" stroke="none"/>
+ <rect x="213.97114" y="136.50000" width="4" height="4" fill="#00C000" stroke="none"/>
+ <rect x="136.02886" y="136.50000" width="4" height="4" fill="#00C000" stroke="none"/>
+ <text font-size="12" x="162" y="162">filled</text>
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.6 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/paths-data-09-t-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-09-t-ref.png
new file mode 100644
index 00000000..497b8c20
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-09-t-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/paths-data-09-t.svg b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-09-t.svg
new file mode 100644
index 00000000..d2908c20
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-09-t.svg
@@ -0,0 +1,79 @@
+<svg version="1.1" baseProfile="tiny" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="CN" author="SH" status="accepted"
+ version="$Revision: 1.6 $" testname="$RCSfile: paths-data-09-t.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/paths.html#PathData">
+ <p>
+ Verify the basic capability to handle the 'path' element, and its data attribute (d)
+ in combination with the straight-line path commands.
+ Two pairs of concentric equilateral triangles are drawn using
+ m and z. No l commands are used in this test as they are implied after
+ an m or z command. The shapes are identical, with one stroked and
+ one filled. The fill-mode default of "even-odd" means that
+ the inner triangle is hollow.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The rendered picture should match the reference image exactly
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: paths-data-09-t.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <!-- ====================================================================== -->
+ <!-- Second Group of Triangles using m & z commands ===================== -->
+ <!-- ====================================================================== -->
+ <text font-size="24" x="75" y="34">Lines drawn with commands:</text>
+ <text font-size="24" x="180" y="64">m and z</text>
+ <g transform="scale(1.8) translate(0, -150)">
+ <path id="Triangle_stroke_mz" fill="none" stroke="#000000" d=" m 62.00000 190.00000 51.96152 90.00000 -103.92304 0.00000 51.96152 -90.00000 z m 0.00000 15.00000 38.97114 67.50000 -77.91228 0.00000 38.97114 -67.50000 z "/>
+ <rect x="60.00000" y="188.00000" width="4" height="4" fill="#40DD20" stroke="none"/>
+ <rect x="111.96152" y="278.00000" width="4" height="4" fill="#40DD20" stroke="none"/>
+ <rect x="8.03848" y="278.00000" width="4" height="4" fill="#40DD20" stroke="none"/>
+ <rect x="60.00000" y="203.00000" width="4" height="4" fill="#40DD20" stroke="none"/>
+ <rect x="98.97114" y="270.50000" width="4" height="4" fill="#40DD20" stroke="none"/>
+ <rect x="21.02886" y="270.50000" width="4" height="4" fill="#40DD20" stroke="none"/>
+ <path id="Triangle_fill_mz" fill="#006000" stroke="none" fill-rule="evenodd" d=" m 177.00000 190.00000 51.96152 90.00000 -103.92304 0.00000 51.96152 -90.00000 z m 0.00000 15.00000 38.97114 67.50000 -77.91228 0.00000 38.97114 -67.50000 z "/>
+ <rect x="175.00000" y="188.00000" width="4" height="4" fill="#40DD20" stroke="none"/>
+ <rect x="226.96152" y="278.00000" width="4" height="4" fill="#40DD20" stroke="none"/>
+ <rect x="123.03848" y="278.00000" width="4" height="4" fill="#40DD20" stroke="none"/>
+ <rect x="175.00000" y="203.00000" width="4" height="4" fill="#40DD20" stroke="none"/>
+ <rect x="213.97114" y="270.50000" width="4" height="4" fill="#40DD20" stroke="none"/>
+ <rect x="136.02886" y="270.50000" width="4" height="4" fill="#40DD20" stroke="none"/>
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.6 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/paths-data-10-t-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-10-t-ref.png
new file mode 100644
index 00000000..4760d9c0
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-10-t-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/paths-data-10-t.svg b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-10-t.svg
new file mode 100644
index 00000000..ebfcda85
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-10-t.svg
@@ -0,0 +1,111 @@
+<svg version="1.1" baseProfile="tiny" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="CN" author="SH" status="accepted"
+ version="$Revision: 1.6 $" testname="$RCSfile: paths-data-10-t.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/paths.html#PathData">
+ <p>
+ Verify that the viewer renders the line caps and line joins for
+ open and closed paths properly.
+ Verify that the open triangular paths are stroked differently at
+ ends of the path than they are at their intermediate corners.
+ In contrast, the corners of a closed path should all appear the
+ same.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The rendered picture should match the reference image exactly
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: paths-data-10-t.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <g transform="translate(10,10)">
+ <text font-size="18" x="10" y="20">open</text>
+ <text font-size="18" x="10" y="38">join=round</text>
+ <text font-size="18" x="10" y="56">cap=butt</text>
+ <text font-size="18" x="10" y="74">M, L</text>
+ <g transform="translate(115,0)">
+ <path id="triangle-01" fill="green" stroke="#39D" stroke-width="15" stroke-linecap="butt" stroke-linejoin="round" d="M 100 0 L 100 80 0 40 100 0"/>
+ </g>
+ </g>
+ <g transform="translate(10,115)">
+ <text font-size="18" x="10" y="20">open</text>
+ <text font-size="18" x="10" y="38">join=bevel</text>
+ <text font-size="18" x="10" y="56">cap=round</text>
+ <text font-size="18" x="10" y="74">m, l</text>
+ <g transform="translate(115,0)">
+ <path id="triangle-02" fill="green" stroke="#39D" stroke-width="15" stroke-linecap="round" stroke-linejoin="bevel" d="m 100 0 l 0 80 -100 -40 100 -40"/>
+ </g>
+ </g>
+ <g transform="translate(10,220)">
+ <text font-size="18" x="10" y="20">open</text>
+ <text font-size="18" x="10" y="38">join=miter</text>
+ <text font-size="18" x="10" y="56">cap=square</text>
+ <text font-size="18" x="10" y="74">M, L</text>
+ <g transform="translate(115,0)">
+ <path id="triangle-03" fill="green" stroke="#39D" stroke-width="15" stroke-linecap="square" stroke-linejoin="miter" d="M 100 0 L 100 80 0 40 100 0"/>
+ </g>
+ </g>
+ <g transform="translate(250,10)">
+ <text font-size="18" x="125" y="20">closed</text>
+ <text font-size="18" x="125" y="38">join=round</text>
+ <text font-size="18" x="125" y="56">cap=butt</text>
+ <text font-size="18" x="125" y="74">M, L, Z</text>
+ <g transform="translate(0,0)">
+ <path id="triangle-04" fill="green" stroke="#39D" stroke-width="15" stroke-linecap="butt" stroke-linejoin="round" d="M 0 0 L 100 40 0 80 Z"/>
+ </g>
+ </g>
+ <g transform="translate(250,115)">
+ <text font-size="18" x="125" y="20">closed</text>
+ <text font-size="18" x="125" y="38">join=bevel</text>
+ <text font-size="18" x="125" y="56">cap=round</text>
+ <text font-size="18" x="125" y="74">m, l, z</text>
+ <g transform="translate(0,0)">
+ <path id="triangle-05" fill="green" stroke="#39D" stroke-width="15" stroke-linecap="round" stroke-linejoin="bevel" d="m 0 0 l 100 40 -100 40 z"/>
+ </g>
+ </g>
+ <g transform="translate(250,220)">
+ <text font-size="18" x="125" y="20">closed</text>
+ <text font-size="18" x="125" y="38">join=miter</text>
+ <text font-size="18" x="125" y="56">cap=square</text>
+ <text font-size="18" x="125" y="74">M, L, Z</text>
+ <g transform="translate(0,0)">
+ <path id="triangle-06" fill="green" stroke="#39D" stroke-width="15" stroke-linecap="square" stroke-linejoin="miter" d="M 0 0 L 100 40 0 80 Z"/>
+ </g>
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.6 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/paths-data-12-t-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-12-t-ref.png
new file mode 100644
index 00000000..cba3fdae
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-12-t-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/paths-data-12-t.svg b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-12-t.svg
new file mode 100644
index 00000000..ef5666c4
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-12-t.svg
@@ -0,0 +1,66 @@
+<svg version="1.1" baseProfile="tiny" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="ED" author="CN" status="accepted"
+ version="$Revision: 1.5 $" testname="$RCSfile: paths-data-12-t.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/paths.html#PathData">
+ <p>
+ Test using multiple coord sets to build a polybeizer, and implicit values for initial S.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The rendered picture should match the reference image exactly, except for possible variations in the labelling text (per CSS2 rules).
+ </p>
+
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The rendered picture should match the reference image.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: paths-data-12-t.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <!-- Use multiple coord sets to build a polybeizer-->
+ <path fill="none" stroke="black" stroke-width="3" d="M 100 100 C 100 20 200 20 200 100 S 300 180 300 100"/>
+ <rect x="100" y="100" width="4" height="4" fill="blue" stroke="none"/>
+ <rect x="200" y="100" width="4" height="4" fill="blue" stroke="none"/>
+ <rect x="300" y="100" width="4" height="4" fill="blue" stroke="none"/>
+ <!-- Test if S not preceeded by either C or S , first control point is coincident with the current point.-->
+ <path fill="none" stroke="black" stroke-width="3" d="M 100 250 S 200 200 200 250 300 300 300 250"/>
+ <rect x="100" y="250" width="4" height="4" fill="blue" stroke="none"/>
+ <rect x="200" y="200" width="4" height="4" fill="blue" stroke="none"/>
+ <rect x="200" y="250" width="4" height="4" fill="blue" stroke="none"/>
+ <rect x="200" y="300" width="4" height="4" fill="blue" stroke="none"/>
+ <rect x="300" y="300" width="4" height="4" fill="blue" stroke="none"/>
+ <rect x="300" y="250" width="4" height="4" fill="blue" stroke="none"/>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.5 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/paths-data-13-t-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-13-t-ref.png
new file mode 100644
index 00000000..f6e54000
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-13-t-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/paths-data-13-t.svg b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-13-t.svg
new file mode 100644
index 00000000..8525043b
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-13-t.svg
@@ -0,0 +1,56 @@
+<svg version="1.1" baseProfile="tiny" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="ED" author="CN" status="accepted"
+ version="$Revision: 1.5 $" testname="$RCSfile: paths-data-13-t.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/paths.html#PathData">
+ <p>
+ Test multiple coordinates for V and H.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>The test is passed if there is one horizontal green line and one vertical blue line.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: paths-data-13-t.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <!-- Use multiple coords to H, should get a straight horizontal line -->
+ <path stroke="green" stroke-width="5" d=" M 240.00000 56.00000 H 270.00000 300.00000 320.00000 400.00000 "/>
+
+ <!-- Use multiple coords to V, should get a straight vertical line -->
+ <path stroke="blue" stroke-width="5" d=" M 240.00000 156.00000 V 180.00000 200.00000 260.00000 300.00000 "/>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.5 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/paths-data-14-t-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-14-t-ref.png
new file mode 100644
index 00000000..4f320606
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-14-t-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/paths-data-14-t.svg b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-14-t.svg
new file mode 100644
index 00000000..543370e1
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-14-t.svg
@@ -0,0 +1,56 @@
+<svg version="1.1" baseProfile="tiny" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="ED" author="CN" status="accepted"
+ version="$Revision: 1.6 $" testname="$RCSfile: paths-data-14-t.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/paths.html#PathData">
+ <p>
+ Test implicit values for moveto. If the first command is 'm' it should be taken as an absolute moveto, plus implicit lineto.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>Run the test. No interaction required.</p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>The test is passed if the three triangles are shown: two concentric, unfilled
+ triangles with black strokes on the left, and one unfilled triangle with
+ a thick blue stroke on the right.</p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: paths-data-14-t.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <g transform="scale(1.8)">
+ <!-- If the first command is 'm' it should be taken as an absolute moveto, plus implicit lineto. -->
+ <path fill="none" stroke="#000000" d=" m 62.00000 56.00000 51.96152 90.00000 -103.92304 0.00000 51.96152 -90.00000 z m 0.00000 15.00000 38.97114 67.50000 -77.91228 0.00000 38.97114 -67.50000 z "/>
+ <!-- Test implicit lineto. -->
+ <path fill="#0000FF" stroke="none" fill-rule="evenodd" d=" M 177.00000 56.00000 228.96152 146.00000 125.03848 146.00000 177.00000 56.00000 Z M 177.00000 71.00000 215.97114 138.50000 138.02886 138.50000 177.00000 71.00000 Z "/>
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.6 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/paths-data-15-t-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-15-t-ref.png
new file mode 100644
index 00000000..6c5cea77
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-15-t-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/paths-data-15-t.svg b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-15-t.svg
new file mode 100644
index 00000000..7b9dcbbb
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-15-t.svg
@@ -0,0 +1,60 @@
+<svg version="1.1" baseProfile="tiny" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="ED" author="CN" status="accepted"
+ version="$Revision: 1.6 $" testname="$RCSfile: paths-data-15-t.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/paths.html#PathData">
+ <p>
+ Test using multiple coord sets to build a polybezier, then T with no preceding Q or T.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>Run the test. No interaction required.</p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>The test passes if the rendering matches the reference image, apart from any allowable font selection differences due to CSS2.</p>
+ <p>A purple wavy line above a short, blue horizontal line must be shown.
+ Small black triangles pointing to the start, middle and end of the blue
+ line must also be shown.</p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: paths-data-15-t.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <g transform="scale(1.8) translate(20 50)">
+ <!-- Use multiple coord sets to build a polybezier-->
+ <path fill="none" stroke="purple" stroke-width="3" d="M 20 20 Q 50 10 80 20 110 30 140 20 170 10 200 20"/>
+ <!-- Test if T not preceded by either Q or T , control point should be coincident with the current point.-->
+ <path fill="none" stroke="blue" stroke-width="3" d="M 20 50 T 50 50 80 50"/>
+ <path d="M 20,52 l-2,4 h4 z"/>
+ <path d="M 50,52 l-2,4 h4 z"/>
+ <path d="M 80,52 l-2,4 h4 z"/>
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.6 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/paths-data-16-t-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-16-t-ref.png
new file mode 100644
index 00000000..e448e629
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-16-t-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/paths-data-16-t.svg b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-16-t.svg
new file mode 100644
index 00000000..ce768ecc
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-16-t.svg
@@ -0,0 +1,69 @@
+<svg id="svg-root" width="100%" height="100%"
+ viewBox="0 0 480 360" xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= Copyright 2008 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="ED" author="CM" status="accepted"
+ version="$Revision: 1.4 $" testname="$RCSfile: paths-data-16-t.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/paths.html#PathData">
+ <p>
+ This tests that any implicit lineto commands that result from an
+ 'M' or 'm' command with more than one pair of coordinates are absolute
+ if the moveto was specified with 'M' and relative if the moveto was
+ specified with 'm'.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ After loading the test, the test is passed if two yellow
+ triangles with black borders are shown. Otherwise, the
+ test has failed.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: paths-data-16-t.svg,v $</title>
+ <defs>
+ <font-face
+ font-family="SVGFreeSansASCII"
+ unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+
+ <text x='10' y='40' font-size='13'>Test relative-ness of implicit lineto path commands</text>
+
+ <g fill='red' stroke='red' stroke-width='16' stroke-linejoin='round'>
+ <path d='M100,120 L160,220 L40,220 z'/>
+ <path d='M350,120 L410,220 L290,220 z'/>
+ </g>
+ <g fill='gold' stroke='black' stroke-width='16' stroke-linejoin='round'>
+ <path d='M100,120 160,220 40,220 z'/>
+ <path d='m350,120 60,100 -120,0 z'/>
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none"
+ fill="black">$Revision: 1.4 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/paths-data-17-f-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-17-f-ref.png
new file mode 100644
index 00000000..7a5410f1
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-17-f-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/paths-data-17-f.svg b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-17-f.svg
new file mode 100644
index 00000000..d6801a86
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-17-f.svg
@@ -0,0 +1,65 @@
+<svg id="svg-root" width="100%" height="100%"
+ viewBox="0 0 480 360" xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= Copyright 2008 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="ED" author="Microsoft" status="accepted"
+ version="$Revision: 1.4 $" testname="$RCSfile: paths-data-17-f.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/paths.html#PathDataClosePathCommand">
+ <p>
+ Test that the 'z' and 'Z' command have the same effect.
+ </p>
+ <p>
+ Specify four 'path' elements that each use three 'L' commands to draw three sides of a square. The fourth line of each
+ square is drawn via a 'closepath' command. A red square closed via 'z' is covered with a black square closed via 'Z' and
+ vice versa.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The test is passed if two black-stroked, unfilled squares are visible and
+ there is no red visible on the page.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: paths-data-17-f.svg,v $</title>
+ <defs>
+ <font-face
+ font-family="SVGFreeSansASCII"
+ unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+
+ <path d="M 50 50 L 50 150 L 150 150 L 150 50 z" stroke-width="5" stroke="red" fill="none" />
+ <path d="M 50 50 L 50 150 L 150 150 L 150 50 Z" stroke-width="6" stroke="black" fill="none" />
+ <path d="M 250 50 L 250 150 L 350 150 L 350 50 Z" stroke-width="5" stroke="red" fill="none" />
+ <path d="M 250 50 L 250 150 L 350 150 L 350 50 z" stroke-width="6" stroke="black" fill="none" />
+
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none"
+ fill="black">$Revision: 1.4 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000"/>
+ <!-- comment out this watermark once the test is approved
+ <g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/paths-data-18-f-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-18-f-ref.png
new file mode 100644
index 00000000..57bc8623
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-18-f-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/paths-data-18-f.svg b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-18-f.svg
new file mode 100644
index 00000000..e50a8507
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-18-f.svg
@@ -0,0 +1,100 @@
+<svg id="svg-root" width="100%" height="100%"
+ viewBox="0 0 480 360" xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= Copyright 2008 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="CL" author="Microsoft" status="accepted"
+ version="$Revision: 1.6 $" testname="$RCSfile: paths-data-18-f.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/paths.html#PathDataGeneralInformation">
+ <p>
+ The 'path' element's 'd' attribute ignores additional whitespace, newline characters, and commas, and BNF processing consumes as much content as possible, stopping as soon as a character that doesn't satisfy the production is encountered.
+ </p>
+ <p>
+ Various black path segments are rendered that each demonstrate one of the parsing rules. Each path segment is placed on top
+ of a similar path segment that lacks the particular parsing rule that is being tested. Test passes if no red is visible.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The test passes if seven thick black horizontal lines are shown with corresponding
+ gold horizontal lines just above them, and the black and gold lines are all of the
+ same length and horizontal position.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: paths-data-18-f.svg,v $</title>
+ <defs>
+ <font-face
+ font-family="SVGFreeSansASCII"
+ unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+
+ <g fill="gold">
+ <rect x="220" y="40" width="160" height="8"/>
+ <rect x="220" y="80" width="160" height="8"/>
+ <rect x="220" y="120" width="160" height="8"/>
+ <rect x="220" y="160" width="160" height="8"/>
+ <rect x="64.6" y="200" width="319.5" height="8"/>
+ <rect x="140" y="240" width="160" height="8"/>
+ <rect x="220" y="280" width="160" height="8"/>
+ </g>
+
+ <g transform="translate(60,-30) scale(8,2)">
+ <path d="M 20 40 H 40" stroke-width="2" stroke="red" />
+ <path d="M 20 40
+ H 40" stroke-width="4" stroke="black" />
+
+ <path d="M 20 60 H 40" stroke-width="2" stroke="red" />
+ <path d="
+ M
+ 20
+ 60
+ H
+ 40
+ " stroke-width="4" stroke="black" />
+
+ <path d="M 20 80 H40" stroke-width="2" stroke="red" />
+ <path d="M 20,80 H 40" stroke-width="4" stroke="black" />
+
+ <path d="M 20 100 H 40#90" stroke-width="2" stroke="red" />
+ <path d="M 20 100 H 40" stroke-width="4" stroke="black" />
+
+ <path d="M 20 120 H 40.5 0.6" stroke-width="2" stroke="red" />
+ <path d="M 20 120 H 40.5.6" stroke-width="4" stroke="black" />
+
+ <path d="M 20 140 h 10 -20" stroke-width="2" stroke="red" />
+ <path d="M 20 140 h 10-20" stroke-width="4" stroke="black" />
+
+ <path d="M 20 160 H 40" stroke-width="2" stroke="red" />
+ <path d="M 20 160 H 40#90" stroke-width="4" stroke="black" />
+ </g>
+
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none"
+ fill="black">$Revision: 1.6 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000"/>
+ <!-- comment out this watermark once the test is approved
+ <g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g> -->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/paths-data-19-f-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-19-f-ref.png
new file mode 100644
index 00000000..fcec9549
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-19-f-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/paths-data-19-f.svg b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-19-f.svg
new file mode 100644
index 00000000..5d6d49a9
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-19-f.svg
@@ -0,0 +1,107 @@
+<svg id="svg-root" width="100%" height="100%"
+ viewBox="0 0 480 360" xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= Copyright 2008 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="ED" author="Microsoft" status="accepted"
+ version="$Revision: 1.3 $" testname="$RCSfile: paths-data-19-f.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/paths.html#PathDataGeneralInformation">
+ <p>
+ Test that additional parameters to pathdata commands are treated as additional calls to the most recent command.
+ </p>
+ <p>
+ Each of the applicable 'pathdata' commands are used in separate 'path' elements. Each command is repeated in red and
+ overlayed with another 'path' element with identical coordinates specified but without the repeated command in black.
+ Commands that do not render or do not take parameters are omitted.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The test is passed if there is no red visible on the page.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: paths-data-19-f.svg,v $</title>
+ <defs>
+ <font-face
+ font-family="SVGFreeSansASCII"
+ unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+
+ <path d="M20 20 H40 H60" stroke-width="3" stroke="red" fill="none" />
+ <path d="M20 20 H40 60" stroke-width="3" stroke="black" fill="none" />
+
+ <path d="M20 40 h20 h20" stroke-width="3" stroke="red" fill="none" />
+ <path d="M20 40 h20 20" stroke-width="3" stroke="black" fill="none" />
+
+ <path d="M120 20 V40 V60" stroke-width="3" stroke="red" fill="none" />
+ <path d="M120 20 V40 60" stroke-width="3" stroke="black" fill="none" />
+
+ <path d="M140 20 v20 v20" stroke-width="3" stroke="red" fill="none" />
+ <path d="M140 20 v20 20" stroke-width="3" stroke="black" fill="none" />
+
+ <path d="M220 20 L 240 20 L260 20" stroke-width="3" stroke="red" fill="none" />
+ <path d="M220 20 L 240 20 260 20 " stroke-width="3" stroke="black" fill="none" />
+
+ <path d="M220 40 l 20 0 l 20 0" stroke-width="3" stroke="red" fill="none" />
+ <path d="M220 40 l 20 0 20 0" stroke-width="3" stroke="black" fill="none" />
+
+ <path d="M50 150 C50 50 200 50 200 150 C200 50 350 50 350 150" stroke-width="3" stroke="red" fill="none" />
+ <path d="M50 150 C50 50 200 50 200 150 200 50 350 50 350 150" stroke-width="3" stroke="black" fill="none" />
+
+ <path d="M50, 200 c0,-100 150,-100 150,0 c0,-100 150,-100 150,0" stroke-width="3" stroke="red" fill="none" />
+ <path d="M50, 200 c0,-100 150,-100 150,0 0,-100 150,-100 150,0" stroke-width="3" stroke="black" fill="none" />
+
+ <path d="M50 250 S125 200 200 250 S275, 200 350 250" stroke-width="3" stroke="red" fill="none" />
+ <path d="M50 250 S125 200 200 250 275, 200 350 250" stroke-width="3" stroke="black" fill="none" />
+
+ <path d="M50 275 s75 -50 150 0 s75, -50 150 0" stroke-width="3" stroke="red" fill="none" />
+ <path d="M50 275 s75 -50 150 0 75, -50 150 0" stroke-width="3" stroke="black" fill="none" />
+
+ <path d="M50 300 Q 125 275 200 300 Q 275 325 350 300" stroke-width="3" stroke="red" fill="none" />
+ <path d="M50 300 Q 125 275 200 300 275 325 350 300" stroke-width="3" stroke="black" fill="none" />
+
+ <path d="M50 325 q 75 -25 150 0 q 75 25 150 0" stroke-width="3" stroke="red" fill="none" />
+ <path d="M50 325 q 75 -25 150 0 75 25 150 0" stroke-width="3" stroke="black" fill="none" />
+
+ <path d="M425 25 T 425 75 T 425 125" stroke-width="3" stroke="red" fill="none" />
+ <path d="M425 25 T 425 75 425 125" stroke-width="3" stroke="black" fill="none" />
+
+ <path d="M450 25 t 0 50 t 0 50" stroke-width="3" stroke="red" fill="none" />
+ <path d="M450 25 t 0 50 0 50" stroke-width="3" stroke="black" fill="none" />
+
+ <path d="M400,200 A25 25 0 0 0 425 150 A25 25 0 0 0 400 200" stroke-width="3" stroke="red" fill="none" />
+ <path d="M400,200 A25 25 0 0 0 425 150 25 25 0 0 0 400 200" stroke-width="3" stroke="black" fill="none" />
+
+ <path d="M400,300 a25 25 0 0 0 25 -50 a25 25 0 0 0 -25 50" stroke-width="3" stroke="red" fill="none" />
+ <path d="M400,300 a25 25 0 0 0 25 -50 25 25 0 0 0 -25 50" stroke-width="3" stroke="black" fill="none" />
+
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none"
+ fill="black">$Revision: 1.3 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000"/>
+ <!-- comment out this watermark once the test is approved
+ <g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g> -->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/paths-data-20-f-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-20-f-ref.png
new file mode 100644
index 00000000..e58d42be
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-20-f-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/paths-data-20-f.svg b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-20-f.svg
new file mode 100644
index 00000000..b0827e5c
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/paths-data-20-f.svg
@@ -0,0 +1,87 @@
+<svg id="svg-root" width="100%" height="100%"
+ viewBox="0 0 480 360" xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= Copyright 2008 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="CL" author="ED" status="accepted"
+ version="$Revision: 1.3 $" testname="$RCSfile: paths-data-20-f.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/paths.html#PathDataEllipticalArcCommands">
+ <p>
+ Tests parsing of the elliptical arc path syntax.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The test has passed if the image looks as if there are eight green circles that have
+ two white rectangles overlapping them, like in the reference image. If any red is visible
+ the test has failed.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: paths-data-20-f.svg,v $</title>
+ <defs>
+ <font-face
+ font-family="SVGFreeSansASCII"
+ unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+
+ <!-- no commawsp between arc flags -->
+ <path d="M120,120 h25 a25,25 0 1,0 -25,25 z" fill="red" stroke="lime"/>
+ <path d="M120,120 h25 a25,25 0 10 -25,25z" fill="lime"/>
+
+ <!-- no commawsp between arc flags and no commawsp after arc flags -->
+ <path d="M200,120 h-25 a25,25 0 1,1 25,25 z" fill="red" stroke="lime"/>
+ <path d="M200,120 h-25 a25,25 0 1125,25 z" fill="lime"/>
+
+ <!-- out of range large-arc-flag value -->
+ <path d="M280,120 h25 a25,25 0 1,0 -25,25 z" fill="lime" stroke="lime"/>
+ <path d="M280,120 h25 a25,25 0 6 0 -25,25 z" fill="red"/>
+
+ <!-- negative sweep-flag value -->
+ <path d="M360,120 h-25 a25,25 0 1,1 25,25 z" fill="lime" stroke="lime"/>
+ <path d="M360,120 h-25 a25,25 0 1 -1 25,25 z" fill="red"/>
+
+ <!-- no commawsp between sweep-flag and following coordinate-pair -->
+ <path d="M120,200 h25 a25,25 0 1,1 -25,-25 z" fill="red" stroke="lime"/>
+ <path d="M120,200 h25 a25,25 0 1 1-25,-25 z" fill="lime"/>
+
+ <!-- no commawsp before arc flags -->
+ <path d="M200,200 h-25 a25,25 0 1,0 25,-25 z" fill="lime" stroke="lime"/>
+ <path d="M200,200 h-25 a25,2501 025,-25 z" fill="red"/>
+
+ <!-- out of range sweep-flag value -->
+ <path d="M280,200 h25 a25,25 0 1,1 -25,-25 z" fill="lime" stroke="lime"/>
+ <path d="M280,200 h25 a25 25 0 1 7 -25 -25 z" fill="red"/>
+
+ <!-- negative large-arc-flag value -->
+ <path d="M360,200 h-25 a25,25 0 1,0 25,-25 z" fill="lime" stroke="lime"/>
+ <path d="M360,200 h-25 a25,25 0 -1 0 25,-25 z" fill="red"/>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none"
+ fill="black">$Revision: 1.3 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000"/>
+ <!-- comment out this watermark once the test is approved
+ <g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g> -->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-01-b-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-01-b-ref.png
new file mode 100644
index 00000000..05d5b208
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-01-b-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-01-b.svg b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-01-b.svg
new file mode 100644
index 00000000..77b75653
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-01-b.svg
@@ -0,0 +1,69 @@
+<svg version="1.1" baseProfile="basic" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="SVGWG" author="Haroon Sheikh" status="accepted"
+ version="$Revision: 1.7 $" testname="$RCSfile: pservers-grad-01-b.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/pservers.html#Gradients">
+ <p>
+ Test that the viewer can handle the xlink:href attribute on
+ linear gradients. The top rectangle has a simple
+ blue (left) to lime (right) linear gradient. The lower one
+ has a different gradient definition, but
+ should look the same as the one above, because the gradient makes a
+ reference to the first gradient, without modifying any attribute.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The test is passed if there are two rectangles, both with a blue to lime gradient.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: pservers-grad-01-b.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <!-- ====================================================================== -->
+ <!-- Linear Gradient using a xlink:href to another linear gradient -->
+ <!-- ====================================================================== -->
+ <linearGradient id="Grad1a" gradientUnits="objectBoundingBox" x1="0" y1="0" x2="1" y2="0">
+ <stop stop-color="blue" offset="0"/>
+ <stop stop-color="lime" offset="1"/>
+ </linearGradient>
+ <linearGradient id="Grad1b" xlink:href="#Grad1a"/>
+ <rect x="20" y="20" width="440" height="80" fill="url(#Grad1a)"/>
+ <text font-size="30" x="20" y="130">Linear gradient.</text>
+ <rect x="20" y="150" width="440" height="80" fill="url(#Grad1b)"/>
+ <text font-size="30" x="20" y="260">Referencing gradient below.</text>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.7 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-02-b-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-02-b-ref.png
new file mode 100644
index 00000000..d9de19a3
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-02-b-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-02-b.svg b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-02-b.svg
new file mode 100644
index 00000000..bbdfb9b0
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-02-b.svg
@@ -0,0 +1,79 @@
+<svg version="1.1" baseProfile="basic" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="SVGWG" author="Haroon Sheikh" status="accepted"
+ version="$Revision: 1.8 $" testname="$RCSfile: pservers-grad-02-b.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/pservers.html#Gradients">
+ <p>
+ Test that the viewer can handle the xlink:href attribute on
+ radial gradients.
+ </p>
+ <p>
+ There are two rectangles. The top one has
+ a radial gradient (black to orange) that should appear elliptical
+ to fit the aspect ratio of the rectangle. The units are
+ specified in objectBoundingBox space. The gradient
+ on the lower one
+ references the gradient of the top rectangle, but modifies
+ the units to use userSpace instead. So it is only using the
+ stops from the gradient to the left, with a different geometry. The radial gradient appears circular.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>Run the test. No interaction required.</p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>The test passes if the rendering matches the reference image, except
+ for any differences in text due to CSS2 rules. Specifically:</p>
+ <ul>
+ <li>The top rectangle is filled with an elliptical radial gradient,
+ with black in the center and orange at the outside edges of the rectangle.</li>
+ <li>The bottom rectangle is filled with a circular radial gradient,
+ with black in the center and orange at the top and bottom edges of the rectangle.
+ Outside the circular area, the rectangle is filled with plain orange.</li>
+ </ul>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: pservers-grad-02-b.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <!-- ====================================================================== -->
+ <!-- Radial Gradient using a xlink:href to another radial gradient -->
+ <!-- ====================================================================== -->
+ <radialGradient id="Grad2a" gradientUnits="objectBoundingBox" cx=".5" cy=".5" fx=".5" fy=".5" r=".5">
+ <stop stop-color="black" offset="0"/>
+ <stop stop-color="rgb(255,165,0)" offset="1"/>
+ </radialGradient>
+ <radialGradient id="Grad2b" xlink:href="#Grad2a" gradientUnits="userSpaceOnUse" cx="240" cy="190" fx="240" fy="190" r="40"/>
+ <rect x="20" y="20" width="440" height="80" fill="url(#Grad2a)"/>
+ <text font-size="30" x="20" y="130">Radial gradient.</text>
+ <rect x="20" y="150" width="440" height="80" fill="url(#Grad2b)"/>
+ <text font-size="30" x="20" y="260">Referencing gradient below.</text>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.8 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-03-b-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-03-b-ref.png
new file mode 100644
index 00000000..d0ab9cfb
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-03-b-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-03-b.svg b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-03-b.svg
new file mode 100644
index 00000000..f3dfc259
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-03-b.svg
@@ -0,0 +1,77 @@
+<svg version="1.1" baseProfile="basic" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="SVGWG" author="Haroon Sheikh" status="accepted"
+ version="$Revision: 1.8 $" testname="$RCSfile: pservers-grad-03-b.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/pservers.html#Gradients">
+ <p>
+ Test that the viewer can handle the xlink:href attribute on
+ patterns.
+ </p>
+ <p>
+ There are two rectangles with a pattern fill made
+ up of 4 rectangles. The pattern definition of the lower one references the pattern definition
+ of the upper one, using the xlink:href attribute. Because
+ the particular way that the patterns and rectangles are
+ defined in this test case, the two fills will appear the
+ same - the rectangles are positioned on pattern-size
+ boundaries, so that the offsets into the pattern at the left
+ edges of the respective rectangles is identical.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>The test passes if the rendering matches the reference image, except
+ for any differences in text due to CSS2 rules. Note that the top rectangle must
+ look identical to the bottom rectangle.</p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: pservers-grad-03-b.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <!-- ====================================================================== -->
+ <!-- Pattern filled rectangles using a xlink:href to another pattern fill -->
+ <!-- ====================================================================== -->
+ <pattern id="Pat3a" x="0" y="0" width="20" height="20" patternUnits="userSpaceOnUse">
+ <rect x="0" y="0" width="10" height="10" fill="#93D"/>
+ <rect x="10" y="0" width="10" height="10" fill="green"/>
+ <rect x="0" y="10" width="10" height="10" fill="blue"/>
+ <rect x="10" y="10" width="10" height="10" fill="yellow"/>
+ </pattern>
+ <pattern id="Pat3b" xlink:href="#Pat3a" width="20" height="20"/>
+ <rect x="20" y="20" width="440" height="80" fill="url(#Pat3a)"/>
+ <text font-size="30" x="20" y="130">Pattern fill.</text>
+ <rect x="20" y="160" width="440" height="80" fill="url(#Pat3b)"/>
+ <text font-size="30" x="20" y="270">Referencing pattern fill below.</text>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.8 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-04-b-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-04-b-ref.png
new file mode 100644
index 00000000..498ef6bb
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-04-b-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-04-b.svg b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-04-b.svg
new file mode 100644
index 00000000..876a07a6
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-04-b.svg
@@ -0,0 +1,88 @@
+<svg version="1.1" baseProfile="basic" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="SVGWG" author="Haroon Sheikh" status="accepted"
+ version="$Revision: 1.8 $" testname="$RCSfile: pservers-grad-04-b.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/pservers.html#Gradients">
+ <p>
+ Test that checks the capability of the stop element in linear and radial
+ gradients.
+ </p>
+ <p>
+ The first rectangle has a linear gradient fill with a vector starting at top left
+ and going to bottom right. The stop colors are at 20% spacing apart and are in the
+ following order : violet, blue, lime, yellow, orange, green.
+ Because the gradient vector vector goes from (0,0) to (1,1) in object bounding box space
+ and because the object bounding box has a larger width than height, the gradient vector
+ is skewed off of a pure 45 degree angle. The gradient stripes are also skewed
+ so that they are no longer perpendicular to the gradient vector.
+ </p>
+ <p>
+ The next rectangle has a radial gradient fill with a multi-color stops from innermost
+ to outermost in the following order: black, yellow, orange, blue, white, green.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>The test passes if the rendering matches the reference image, except for
+ any differences in text due to CSS2 rules.</p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: pservers-grad-04-b.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <linearGradient id="Grad1" gradientUnits="objectBoundingBox" x1="0" y1="0" x2="1" y2="1">
+ <stop stop-color="rgb(238,130,238)" offset="0"/>
+ <stop stop-color="blue" offset="0.2"/>
+ <stop stop-color="lime" offset="0.4"/>
+ <stop stop-color="yellow" offset="0.6"/>
+ <stop stop-color="rgb(255,165,0)" offset="0.8"/>
+ <stop stop-color="green" offset="1"/>
+ </linearGradient>
+ <rect x="20" y="20" width="440" height="80" fill="url(#Grad1)"/>
+ <text font-size="30" x="20" y="130">Multi-color linear gradient.</text>
+ <!-- ====================================================================== -->
+ <!-- Radial gradient on the stroke of a rectangle ======== -->
+ <!-- ====================================================================== -->
+ <radialGradient id="Grad2" gradientUnits="userSpaceOnUse" cx="240" cy="210" r="220" fx="240" fy="210">
+ <stop stop-color="black" offset="0"/>
+ <stop stop-color="yellow" offset="0.2"/>
+ <stop stop-color="orange" offset="0.4"/>
+ <stop stop-color="blue" offset="0.6"/>
+ <stop stop-color="white" offset="0.8"/>
+ <stop stop-color="green" offset="1"/>
+ </radialGradient>
+ <rect x="20" y="150" width="440" height="80" fill="url(#Grad2)" stroke-width="40"/>
+ <text font-size="30" x="20" y="260">Multi-color radial gradient.</text>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.8 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-05-b-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-05-b-ref.png
new file mode 100644
index 00000000..677a0840
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-05-b-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-05-b.svg b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-05-b.svg
new file mode 100644
index 00000000..d08e1f7e
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-05-b.svg
@@ -0,0 +1,94 @@
+<svg version="1.1" baseProfile="basic" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="SVGWG" author="Haroon Sheikh" status="accepted"
+ version="$Revision: 1.9 $" testname="$RCSfile: pservers-grad-05-b.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/pservers.html#Gradients">
+ <p>
+ Test that checks the capability of the stop opacity in linear and radial
+ gradients.
+ </p>
+ <p>
+ There are two tests which contain rectangles with gradients using stop-opacity properties.
+ A cyan color text string "Background" is put behind both of the rectangles to help
+ demonstrate the opacity concept.
+ </p>
+ <p>
+ From top-down the appearance of objects is as follows.
+ </p>
+ <p>
+ The first rectangle has a linear gradient fill with a vector starting at top left
+ and going to bottom right. The stop colors are at 20% spacing apart and are in the
+ following order : violet, blue, lime, yellow, orange, black.
+ Also a stop opacity is given to the colors in the following order: 1, 0.2, 0.5, 0, 0.8, 1
+ Because the gradient vector vector goes from (0,0) to (1,1) in object bounding box space
+ and because the object bounding box has a larger width than height, the gradient vector
+ is skewed off of a pure 45 degree angle. The gradient stripes are also skewed
+ so that they are no longer perpendicular to the gradient vector.
+ </p>
+ <p>
+ The next rectangle has a radial gradient fill with a multi-color stops from innermost
+ to outermost in the following order: black, yellow, red, blue, white, green.
+ Also a stop opacity is given to the colors in the following order: 1, 0.2, 0.5, 0, 0.8, 1
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>Run the test. No interaction required.</p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>The test passes if the rendering matches the reference image, except for
+ any differences in text due to CSS2 rules.</p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: pservers-grad-05-b.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <text font-size="60" fill="aqua" x="70" y="80">Background</text>
+ <linearGradient id="Grad1" gradientUnits="objectBoundingBox" x1="0" y1="0" x2="1" y2="1">
+ <stop stop-color="rgb(238,130,238)" stop-opacity="1" offset="0"/>
+ <stop stop-color="blue" stop-opacity="0" offset="0.2"/>
+ <stop stop-color="lime" stop-opacity="0.5" offset="0.4"/>
+ <stop stop-color="yellow" stop-opacity="0.2" offset="0.6"/>
+ <stop stop-color="rgb(255,165,0)" stop-opacity="0.8" offset="0.8"/>
+ <stop stop-color="black" stop-opacity="1" offset="1"/>
+ </linearGradient>
+ <rect x="20" y="20" width="440" height="80" fill="url(#Grad1)"/>
+
+ <text font-size="60" fill="aqua" x="70" y="210">Background</text>
+ <radialGradient id="Grad2" gradientUnits="userSpaceOnUse" cx="240" cy="210" r="220" fx="240" fy="210">
+ <stop stop-color="black" stop-opacity="1" offset="0"/>
+ <stop stop-color="yellow" stop-opacity="0" offset="0.2"/>
+ <stop stop-color="red" stop-opacity="0.5" offset="0.4"/>
+ <stop stop-color="blue" stop-opacity="0.2" offset="0.6"/>
+ <stop stop-color="white" stop-opacity="0.8" offset="0.8"/>
+ <stop stop-color="green" stop-opacity="1" offset="1"/>
+ </radialGradient>
+ <rect x="20" y="150" width="440" height="80" fill="url(#Grad2)" stroke-width="40"/>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.9 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-06-b-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-06-b-ref.png
new file mode 100644
index 00000000..86a7bc04
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-06-b-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-06-b.svg b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-06-b.svg
new file mode 100644
index 00000000..374b1e3e
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-06-b.svg
@@ -0,0 +1,109 @@
+<svg version="1.1" baseProfile="basic" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="SVGWG" author="Haroon Sheikh" status="accepted"
+ version="$Revision: 1.9 $" testname="$RCSfile: pservers-grad-06-b.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/pservers.html#Gradients">
+ <p>
+ Test that the viewer can handle the gradientTransform and the patternTransform
+ attribute on gradients and patterns respectively.
+ </p>
+ <p>
+ From top-down the appearance of objects is as follows.
+ </p>
+ <p>
+ The top rectangle has a linear gradient whose coordinate system has been scaled down by
+ a half. So the gradient travelling from left to right (from blue to green to lime) should
+ only occuply the left half the rectangle.
+ </p>
+ <p>
+ The next rectangle has radial gradient that has been translated to the center and skewed
+ in the positive X direction by 45 degrees. Therefore the gradient should appear
+ ellipltical and rotated around the center.
+ </p>
+ <p>
+ The last row contains a rectangle with pattern on the fill. The transformation on the
+ pattern moves the coordinate system to the top left of the rectangle and then scales it
+ by a factor of 2 and then skew's it in the X direction by 45 degrees. The pattern
+ consists of a 2 by 2 array of colored rectangles.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>Run the test. No interaction required.</p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>The test passes if the rendering matches the reference image, apart
+ from any differences in font choice due to CSS2 rules. Specifically:</p>
+ <ul>
+ <li>The top rectangle is filled with a linear gradient from blue on the left,
+ to lime in the middle. The right half of the rectangle is filled with plain lime.</li>
+ <li>The middle rectangle is filled with an elliptical radial gradient with
+ black on the inside and orange on the outside. The center point of the gradient
+ is near the center-bottom of the rectangle. The gradient is skewed, so that it appears
+ as a rotated elliptical gradient.</li>
+ <li>The bottom rectangle is filled with a repeating pattern of tiled
+ red, green, yellow and blue parallelograms.</li>
+ </ul>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: pservers-grad-06-b.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <!-- ====================================================================== -->
+ <!-- Linear Gradient with gradientTransforms -->
+ <!-- ====================================================================== -->
+ <linearGradient id="Grad1" gradientUnits="userSpaceOnUse" x1="0" y1="0" x2="430" y2="0" gradientTransform="translate(25 35) scale(0.5)">
+ <stop stop-color="blue" offset="0"/>
+ <stop stop-color="green" offset="0.5"/>
+ <stop stop-color="lime" offset="1"/>
+ </linearGradient>
+ <rect x="20" y="20" width="440" height="50" fill="url(#Grad1)"/>
+ <text font-size="30" x="20" y="100">scale(0.5) on gradient</text>
+ <!-- ====================================================================== -->
+ <!-- Radial Gradiant with a gradientTransform -->
+ <!-- ====================================================================== -->
+ <radialGradient id="Grad2" gradientUnits="userSpaceOnUse" cx="0" cy="0" fx="0" fy="0" r="60" gradientTransform="translate(240,155) skewX(45)">
+ <stop stop-color="black" offset="0"/>
+ <stop stop-color="rgb(255,165,0)" offset="1"/>
+ </radialGradient>
+ <rect x="20" y="110" width="440" height="50" fill="url(#Grad2)"/>
+ <text font-size="30" x="20" y="190">skewX(45) on gradient</text>
+ <!-- ====================================================================== -->
+ <!-- Pattern filled rectangles with a patternTransform. -->
+ <!-- ====================================================================== -->
+ <pattern patternUnits="userSpaceOnUse" id="Pat3" x="0" y="0" width="20" height="20" patternTransform="translate(25 215) scale(2) skewX(45)">
+ <rect x="0" y="0" width="10" height="10" fill="maroon"/>
+ <rect x="10" y="0" width="10" height="10" fill="green"/>
+ <rect x="0" y="10" width="10" height="10" fill="blue"/>
+ <rect x="10" y="10" width="10" height="10" fill="yellow"/>
+ </pattern>
+ <rect x="20" y="210" width="440" height="50" fill="url(#Pat3)"/>
+ <text font-size="30" x="20" y="290">scale(2), skewX(45) on pattern</text>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.9 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-07-b-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-07-b-ref.png
new file mode 100644
index 00000000..d86a6ec0
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-07-b-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-07-b.svg b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-07-b.svg
new file mode 100644
index 00000000..9e9b32dc
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-07-b.svg
@@ -0,0 +1,88 @@
+<svg version="1.1" baseProfile="basic" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="SVGWG" author="Haroon Sheikh" status="accepted"
+ version="$Revision: 1.8 $" testname="$RCSfile: pservers-grad-07-b.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/pservers.html#Gradients">
+ <p>
+ Test that the viewer has basic capability to handle linear gradients
+ on fills and stroke of objects and text.
+ </p>
+ <p>
+ This test uses the following elements : &lt;linearGradient&gt;, &lt;stop&gt;
+ and the following properties : stop-color, fill:url(# ), stroke(url# )
+ </p>
+ <p>
+ Both elements in this test use the same simple gradient. It is a linear gradient from
+ blue (left) to lime (right). From top-down the appearance of objects is as follows.
+ </p>
+ <p>
+ The top rectangle should be filled with the gradient.
+ </p>
+ <p>
+ The next rectangle has no fill, but has a thick stroke on which the gradient is
+ applied.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>Run the test. No interaction required.</p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>The test passes if the rendering matches the reference image, apart
+ from any differences in font choice due to CSS2 rules. Specifically:</p>
+ <ul>
+ <li>The top rectangle is filled with a gradient from blue on the left to lime on the right.</li>
+ <li>The bottom rectangle is unfilled and stroked with a thick stroke using a gradient from blue on the left to lime on the right.</li>
+ </ul>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: pservers-grad-07-b.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <g transform="scale(1, 1.5)">
+ <!-- ====================================================================== -->
+ <!-- Very simple blue to red linear gradient from left to right ========== -->
+ <!-- ====================================================================== -->
+ <linearGradient id="Gradient" gradientUnits="userSpaceOnUse" x1="10" y1="10" x2="440" y2="10">
+ <stop stop-color="blue" offset="0"/>
+ <stop stop-color="lime" offset="1"/>
+ </linearGradient>
+ <!-- ====================================================================== -->
+ <!-- Linear gradient on the fill of a rectangle ======== -->
+ <!-- ====================================================================== -->
+ <rect x="10" y="10" width="430" height="60" fill="url(#Gradient)"/>
+ <text font-size="24" x="10" y="90">Linear gradient filled rectangle</text>
+ <!-- ====================================================================== -->
+ <!-- Linear gradient on the stroke of a rectangle ======== -->
+ <!-- ====================================================================== -->
+ <rect x="25" y="110" width="400" height="30" fill="none" stroke="url(#Gradient)" stroke-width="20"/>
+ <text font-size="24" x="10" y="170">Linear gradient on stroke of rectangle</text>
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.8 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-08-b-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-08-b-ref.png
new file mode 100644
index 00000000..e0b68c10
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-08-b-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-08-b.svg b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-08-b.svg
new file mode 100644
index 00000000..654ec8d4
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-08-b.svg
@@ -0,0 +1,100 @@
+<svg version="1.1" baseProfile="basic" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="SVGWG" author="Haroon Sheikh" status="accepted"
+ version="$Revision: 1.13 $" testname="$RCSfile: pservers-grad-08-b.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/pservers.html#Gradients">
+ <p>
+ Test that the viewer has basic capability to handle linear gradients
+ on fills and stroke of text.
+ </p>
+ <p>
+ Both elements in this test use the same simple gradient. It is a linear gradient from blue (left) to lime (right). From top-down the appearance of objects is as follows.
+ </p>
+ <p>
+ The first item is a text string "Gradient on fill" with the gradient on the fill of the text.
+ </p>
+ <p>
+ The second item is a text string that is not filled. It has a 2 user unit stroke on which the gradient is applied.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>Run the test. No interaction required.</p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>The test passes if the rendering matches the reference image, apart
+ from any differences in font choice due to CSS2 rules. Specifically:</p>
+ <ul>
+ <li>The text string "Gradient on fill" must be filled with a gradient
+ from blue on the left to lime on the right.</li>
+ <li>The text string "Gradient on stroke" must be unfilled and stroked with
+ a gradient from blue on the left to lime on the right.</li>
+ </ul>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: pservers-grad-08-b.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <style type="text/css">
+ @font-face {
+ font-family: Blocky;
+ src: url(woffs/Blocky.woff) format("woff");
+ </style>
+ <defs>
+ <font-face font-family="Blocky" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/Blocky.svg#Blocky"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g transform="scale(1, 1.5)">
+ <!-- ====================================================================== -->
+ <!-- Very simple blue to red linear gradient from left to right ========== -->
+ <!-- ====================================================================== -->
+ <linearGradient id="Gradient" gradientUnits="userSpaceOnUse" x1="10" y1="10" x2="440" y2="10">
+ <stop stop-color="blue" offset="0"/>
+ <stop stop-color="lime" offset="1"/>
+ </linearGradient>
+ <!-- ====================================================================== -->
+ <!-- Gradient on fill of text ======== -->
+ <!-- ====================================================================== -->
+ <text font-family="Blocky" font-size="68" fill="url(#Gradient)" x="20" y="70">Gradient on fill</text>
+ <!-- ====================================================================== -->
+ <!-- Gradient on stroke of text ======== -->
+ <!-- ====================================================================== -->
+ <text font-family="Blocky" x="20" y="160" font-size="55" fill="none" stroke="url(#Gradient)" stroke-width="3">Gradient on stroke</text>
+
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="28">
+ <text x="40" y="145">Linear gradient on filled text</text>
+ <text x="30" y="280">Linear gradient on stroke of text</text>
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.13 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-09-b-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-09-b-ref.png
new file mode 100644
index 00000000..3431292a
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-09-b-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-09-b.svg b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-09-b.svg
new file mode 100644
index 00000000..670e914b
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-09-b.svg
@@ -0,0 +1,107 @@
+<svg version="1.1" baseProfile="basic" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="SVGWG" author="Haroon Sheikh" status="accepted"
+ version="$Revision: 1.9 $" testname="$RCSfile: pservers-grad-09-b.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/pservers.html#Gradients">
+ <p>
+ Test that the viewer can handle the gradientUnits attribute on linear gradients.
+ It tests the following values of gradientUnits: default (userSpace), objectBoundingBox,
+ and userSpaceOnUse.
+ </p>
+ <p>
+ From top-down the appearance of objects is as follows.
+ </p>
+ <p>
+ The first rectangle uses the default attributes on the linearGradient element.
+ Therefore the linear gradient should default to objectBoundingBox. It should appear
+ from the left edge of the rectangle (blue) to the right edge of the rectangle (lime).
+ The rectangle is smaller than the viewport, because a previous version of the SVG spec had the default value be 'viewport'.
+ The test fails if only a portion of the gradient is shown.
+ </p>
+ <p>
+ The next rectangle uses gradientUnits=objectBoundingBox. The linear gradient should
+ travel from blue (top) to lime (bottom).
+ </p>
+ <p>
+ The last rectangle uses gradientUnits=userSpaceOnUse. The rectangle element is given it's
+ own transformation and the gradient is assumed to be in this user space.
+ The gradient should appear as a linear gradient from lime (left) to blue (right).
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>Run the test. No interaction required.</p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>The test passes if the rendering matches the reference image, apart
+ from any differences in font choice due to CSS2 rules. Specifically:</p>
+ <ul>
+ <li>The top rectangle is filled with a linear gradient from lime on the left to blue on the right.</li>
+ <li>The middle rectangle is filled with a linear gradient from blue on the top to lime on the bottom.</li>
+ <li>The bottom rectangle is filled with a linear gradient from lime on the left to blue on the right.</li>
+ </ul>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: pservers-grad-09-b.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <text font-size="15" x="10" y="25">Testing gradientUnits attribute</text>
+ <!-- ====================================================================== -->
+ <!-- Linear gradient with default attributes on <linear gradient> element. -->
+ <!-- ====================================================================== -->
+ <linearGradient id="Grad1">
+ <stop stop-color="lime" offset="0"/>
+ <stop stop-color="blue" offset="1"/>
+ </linearGradient>
+ <rect x="125" y="35" width="200" height="50" fill="url(#Grad1)"/>
+ <!--<text font-size="12" x="10" y="100">Linear gradient with default attributes (thus, same as objectBoundingBox)</text>-->
+ <!--text font-size="12" x="10" y="125">Gradient is from the viewport left edge (lime) to viewport right edge (blue)</text-->
+ <!--<text font-size="12" x="10" y="115">Gradient is from the object left edge (lime) to object right edge (blue)</text>-->
+ <!-- ====================================================================== -->
+ <!-- Linear gradient with gradientUnits=objectBoundingBox ======== -->
+ <!-- ====================================================================== -->
+ <linearGradient id="Grad2" gradientUnits="objectBoundingBox" x1="0" y1="0" x2="0" y2="1">
+ <stop stop-color="blue" offset="0"/>
+ <stop stop-color="lime" offset="1"/>
+ </linearGradient>
+ <rect x="10" y="125" width="430" height="50" fill="url(#Grad2)"/>
+ <!--<text font-size="12" x="10" y="190">gradientUnits=objectBoundingBox</text>-->
+ <!--<text font-size="12" x="10" y="205">Gradient is from the object top edge (blue) to object bottom edge (lime)</text>-->
+ <!-- ====================================================================== -->
+ <!-- Gradient using gradientUnits="userSpaceOnUse" -->
+ <!-- ====================================================================== -->
+ <linearGradient id="Grad3" x1="0" y1="0" x2="0" y2="430" gradientUnits="userSpaceOnUse">
+ <stop stop-color="lime" offset="0"/>
+ <stop stop-color="blue" offset="1"/>
+ </linearGradient>
+ <rect transform="translate(10, 260) rotate(-90)" x="0" y="0" width="50" height="430" fill="url(#Grad3)"/>
+ <!--<text font-size="12" x="10" y="275">gradientUnits=userSpaceOnUse</text>-->
+ <!--<text font-size="12" x="10" y="290">Gradient is from the object left edge (lime) to object right edge (blue)</text>-->
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.9 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-10-b-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-10-b-ref.png
new file mode 100644
index 00000000..00868014
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-10-b-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-10-b.svg b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-10-b.svg
new file mode 100644
index 00000000..52d893e3
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-10-b.svg
@@ -0,0 +1,93 @@
+<svg version="1.1" baseProfile="basic" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="SVGWG" author="Haroon Sheikh" status="accepted"
+ version="$Revision: 1.8 $" testname="$RCSfile: pservers-grad-10-b.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/pservers.html#Gradients">
+ <p>
+ Test that the viewer can handle the spreadMethod attribute on linear gradients.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>The test passes if the rendering matches the reference image, apart
+ from any differences in font choice due to CSS2 rules. Each of the
+ three rectangles is filled with a linear gradient from blue on the left
+ to lime on the right. The width of the gradient is only a fifth of
+ the width of the rectangle, so:</p>
+ <ul>
+ <li>The top rectangle is filled with plain blue in the left two-fifths
+ and with plain lime in the right two-fifths.</li>
+ <li>The middle rectangle is filled with alternating copies of the blue-to-lime
+ gradient. Thus, from left to right, the rectangle is filled with
+ a gradient that goes from blue to lime to blue to lime to blue to lime.</li>
+ <li>The bottom rectangle is filled with five copies of the blue-to-lime
+ gradient. Thus, from left to right, the rectangle is filled with
+ a gradient that goes from blue to lime, abruptly changing back to blue
+ then smoothly changing to lime, etc.</li>
+ </ul>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: pservers-grad-10-b.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <text font-size="15" x="10" y="25">Testing spreadMethod attribute</text>
+ <!-- ====================================================================== -->
+ <!-- Linear Gradient with spreadMethod=pad -->
+ <!-- ====================================================================== -->
+ <linearGradient id="Grad1" gradientUnits="objectBoundingBox" x1=".4" y1="0" x2=".6" y2="0" spreadMethod="pad">
+ <stop stop-color="blue" offset="0"/>
+ <stop stop-color="lime" offset="1"/>
+ </linearGradient>
+ <rect x="10" y="35" width="460" height="55" fill="url(#Grad1)"/>
+ <text font-size="12" x="10" y="105">spreadMethod=pad</text>
+ <!-- ====================================================================== -->
+ <!-- Linear Gradient with spreadMethod=reflect -->
+ <!-- ====================================================================== -->
+ <linearGradient id="Grad2" gradientUnits="objectBoundingBox" x1=".4" y1="0" x2=".6" y2="0" spreadMethod="reflect">
+ <stop stop-color="blue" offset="0"/>
+ <stop stop-color="lime" offset="1"/>
+ </linearGradient>
+ <rect x="10" y="120" width="460" height="55" fill="url(#Grad2)"/>
+ <text font-size="12" x="10" y="190">spreadMethod=reflect</text>
+ <!-- ====================================================================== -->
+ <!-- Linear Gradient with spreadMethod=repeat -->
+ <!-- ====================================================================== -->
+ <linearGradient id="Grad3" gradientUnits="objectBoundingBox" x1=".4" y1="0" x2=".6" y2="0" spreadMethod="repeat">
+ <stop stop-color="blue" offset="0"/>
+ <stop stop-color="lime" offset="1"/>
+ </linearGradient>
+ <rect x="10" y="205" width="460" height="55" fill="url(#Grad3)"/>
+ <text font-size="12" x="10" y="275">spreadMethod=repeat</text>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.8 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="lime" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-11-b-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-11-b-ref.png
new file mode 100644
index 00000000..e59d7a9d
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-11-b-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-11-b.svg b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-11-b.svg
new file mode 100644
index 00000000..dc5e2120
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-11-b.svg
@@ -0,0 +1,124 @@
+<svg version="1.1" baseProfile="basic" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="SVGWG" author="Haroon Sheikh" status="accepted"
+ version="$Revision: 1.8 $" testname="$RCSfile: pservers-grad-11-b.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/pservers.html#Gradients">
+ <p>
+ Test that the viewer has basic capability to handle radial gradients
+ on fills and stroke of objects and text.
+ </p>
+ <p>
+ This test uses the following elements : &lt;radialGradient&gt;, &lt;stop&gt;
+ and the following properties : stop-color, fill:url(# ), stroke(url# )
+ </p>
+ <p>
+ From top-down (left to right) the appearance of objects is as follows.
+ </p>
+ <p>
+ The top left rectangle should be a radial gradient from dark blue (in) to lime (outside).
+ The gradient is applied to the fill of the rectangle.
+ </p>
+ <p>
+ The next rectangle has no fill, but has a thick stroke on which the gradient is
+ applied. The gradient goes from dark orange(in) to pale yellow (out).
+ </p>
+ <p>
+ The next item is a text with a radial gradient on the fill. The gradient goes
+ from green (in) to yellow (out).
+ </p>
+ <p>
+ The last item is a text with a 2 user unit stroke on which a black (in) to magenta
+ (out) linear gradient is applied.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>Run the test. No interaction required.</p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>The test passes if the rendering matches the reference image, apart
+ from any differences in font choice due to CSS2 rules. Specifically:</p>
+ <ul>
+ <li>The top-left rectangle must be filled with a circular radial gradient
+ with dark blue inside and lime outside. The center point of the gradient
+ is in the lower-left quadrant of the rectangle.</li>
+ <li>The top-right rectangle has no fill, but a thick stroke which is painted
+ with a radial gradient with dark orange inside and yellow outside. The
+ center point of this gradient is in the lower-left quadrant of the
+ rectangle.</li>
+ <li>The "Gradient on text fill" text must be filled with a circular radial
+ gradient with green inside and yellow outside. The center point of the
+ gradient is the center of the text.</li>
+ <li>The "Gradient on text stroke" has no fill, but a stroke which is painted with
+ a circular radial gradient with black inside and pink outside. The center point of the
+ gradient is the center of the text.</li>
+ </ul>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: pservers-grad-11-b.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <!-- ====================================================================== -->
+ <!-- Very simple black to red radial gradient ======== -->
+ <!-- ====================================================================== -->
+ <radialGradient gradientUnits="userSpaceOnUse" id="Grad1" cx="75" cy="100" r="130" fx="75" fy="100">
+ <stop stop-color="#009" offset="0"/>
+ <stop stop-color="#2e2" offset="1"/>
+ </radialGradient>
+ <rect x="10" y="10" width="210" height="140" fill="url(#Grad1)"/>
+ <text font-family="Arial" font-size="12" x="10" y="165">Radial gradient on fill of rectangle</text>
+ <!-- ====================================================================== -->
+ <!-- Radial gradient on the stroke of a rectangle ======== -->
+ <!-- ====================================================================== -->
+ <radialGradient id="Grad2" gradientUnits="userSpaceOnUse" cx="295" cy="100" r="150" fx="295" fy="100">
+ <stop stop-color="#e22" offset="0"/>
+ <stop stop-color="#ff6" offset="1"/>
+ </radialGradient>
+ <rect x="250" y="30" width="170" height="100" fill="none" stroke="url(#Grad2)" stroke-width="40"/>
+ <text font-family="Arial" font-size="12" x="230" y="165">Radial gradient on stroke of rectangle</text>
+ <!-- ====================================================================== -->
+ <!-- Gradient on fill of text ======== -->
+ <!-- ====================================================================== -->
+ <radialGradient id="Grad3" gradientUnits="userSpaceOnUse" cx="225" cy="180" r="90" fx="225" fy="180">
+ <stop stop-color="#060" offset="0"/>
+ <stop stop-color="yellow" offset="1"/>
+ </radialGradient>
+ <text font-family="Arial" font-size="50" fill="url(#Grad3)" x="10" y="210">Gradient on text fill</text>
+ <text font-family="Arial" font-size="12" x="10" y="225">Radial gradient on text, black to yellow</text>
+ <!-- ====================================================================== -->
+ <!-- Gradient on stroke of text ======== -->
+ <!-- ====================================================================== -->
+ <radialGradient id="Grad4" gradientUnits="userSpaceOnUse" cx="225" cy="245" r="90" fx="225" fy="245">
+ <stop stop-color="black" offset="0"/>
+ <stop stop-color="#D6D" offset="1"/>
+ </radialGradient>
+ <text font-family="Arial" font-size="45" fill="none" stroke="url(#Grad4)" stroke-width="2" x="10" y="270">Gradient on text stroke</text>
+ <text font-family="Arial" font-size="12" x="10" y="285">Radial gradient on stroke of text, black to red</text>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.8 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-12-b-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-12-b-ref.png
new file mode 100644
index 00000000..5b5dc8d7
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-12-b-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-12-b.svg b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-12-b.svg
new file mode 100644
index 00000000..d00f73af
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-12-b.svg
@@ -0,0 +1,110 @@
+<svg version="1.1" baseProfile="basic" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="SVGWG" author="Haroon Sheikh" status="accepted"
+ version="$Revision: 1.9 $" testname="$RCSfile: pservers-grad-12-b.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/pservers.html#Gradients">
+ <p>
+ Test that the viewer can handle the gradientUnits attribute on radial gradients.
+ It tests the following values of gradientUnits: default (objectBoundingBox), objectBoundingBox,
+ and userSpaceOnUse.
+ </p>
+ <p>
+ From top-down the appearance of objects is as follows.
+ </p>
+ <p>
+ The first rectangle uses the default attributes on the radialGradient element.
+ Therefore the radial gradient should be relative to the object bounding box. It should appear
+ from the center of the viewport (blue) to the edges of the viewport (lime).
+ The rectangle is wider than tall so it the gradient should be elliptical, not circular.
+ </p>
+ <p>
+ The next rectangle uses gradientUnits=objectBoundingBox. The radial gradient should
+ travel from a center of 20%, 20% of the rectangle with a radius of 50%.
+ </p>
+ <p>
+ The last rectangle uses gradientUnits=userSpaceOnUse. The rectangle element is given it's
+ own transformation and the gradient is assumed to be in this user space.
+ The gradient should appear in the center of the rectangle as a radial gradient from yellow (center) to blue (edge).
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>Run the test. No interaction required.</p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>The test passes if the rendering of the three rectangles matches those
+ in the reference image. Specifically:</p>
+ <ul>
+ <li>The upper rectangle is filled with an elliptical radial gradient
+ with blue at the center and lime at its edges.</li>
+ <li>The middle rectangle is also filled with an elliptical radial
+ gradient with blue inside and lime outside, but with the center
+ point of the gradient in the top-left quadrant of the rectangle.</li>
+ <li>The bottom rectangle is filled with a circular radial gradient
+ with yellow at the center and blue at its edges. Since it is circular,
+ most of the rectangle is filled with plain blue.</li>
+ </ul>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: pservers-grad-12-b.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <text font-size="15" x="10" y="25">Testing gradientUnits attribute</text>
+ <!-- ====================================================================== -->
+ <!-- Radial gradient with default attributes on <radial gradient> element. -->
+ <!-- ====================================================================== -->
+ <radialGradient id="Grad1">
+ <stop stop-color="#009" offset="0"/>
+ <stop stop-color="lime" offset="1"/>
+ </radialGradient>
+ <rect x="10" y="35" width="460" height="50" fill="url(#Grad1)"/>
+ <text font-size="12" x="10" y="100">Radial gradient with default attributes (from blue to yellow)</text>
+ <text font-size="12" x="10" y="115">Gradient is blue at the object center and lime at the object edges</text>
+ <!-- ====================================================================== -->
+ <!-- Radial gradient with gradientUnits=objectBoundingBox ======== -->
+ <!-- ====================================================================== -->
+ <radialGradient id="Grad2" gradientUnits="objectBoundingBox" cx=".2" cy=".2" fx=".2" fy=".2" r=".5">
+ <stop stop-color="#009" offset="0"/>
+ <stop stop-color="lime" offset="1"/>
+ </radialGradient>
+ <rect x="10" y="125" width="460" height="50" fill="url(#Grad2)"/>
+ <text font-size="12" x="10" y="190">gradientUnits=objectBoundingBox</text>
+ <text font-size="12" x="10" y="205">cx=.2, cy=.2, r=.5, fx=.2 fy=.2</text>
+ <!-- ====================================================================== -->
+ <!-- Gradient using gradientUnits="userSpaceOnUse" -->
+ <!-- ====================================================================== -->
+ <radialGradient id="Grad3" cx="25" cy="215" r="25" fx="25" fy="215" gradientUnits="userSpaceOnUse">
+ <stop stop-color="yellow" offset="0"/>
+ <stop stop-color="blue" offset="1"/>
+ </radialGradient>
+ <rect transform="translate(10, 260) rotate(-90)" x="0" y="0" width="50" height="460" fill="url(#Grad3)"/>
+ <text font-size="12" x="10" y="275">gradientUnits=userSpaceOnUse</text>
+ <text font-size="12" x="10" y="290">Gradient is yellow to blue radial gradient from center to horizontal bounds</text>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.9 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-14-b-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-14-b-ref.png
new file mode 100644
index 00000000..ef89f35e
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-14-b-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-14-b.svg b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-14-b.svg
new file mode 100644
index 00000000..63045cfa
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-14-b.svg
@@ -0,0 +1,120 @@
+<svg version="1.1" baseProfile="basic" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="CL" author="BB" status="accepted"
+ version="$Revision: 1.5 $" testname="$RCSfile: pservers-grad-14-b.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/pservers.html#Gradients">
+ <p>
+ The intent of this file is to test the 4 allowed spread methods for linear and radial gradients.
+ The 4 values (pad, reflect, repeat and default) are available for both types of gradients.
+ On the left side are the linear gradient results, and on the right, the radial results.
+ The UA should render a result equivalent to the reference image.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>Run the test. No interaction required.</p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>The test passes if the rendered image matches the reference image, except
+ for any differences in font choice due to CSS2.</p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: pservers-grad-14-b.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <defs>
+ <linearGradient id="lgSpreadPad" gradientUnits="userSpaceOnUse" y1="0" x1="50" y2="0" x2="100" spreadMethod="pad">
+ <stop offset="000%" stop-color="black"/>
+ <stop offset="100%" stop-color="gold"/>
+ </linearGradient>
+
+ <linearGradient id="lgSpreadReflect" gradientUnits="userSpaceOnUse" y1="0" x1="50" y2="0" x2="100" spreadMethod="reflect">
+ <stop offset="000%" stop-color="black"/>
+ <stop offset="100%" stop-color="gold"/>
+ </linearGradient>
+
+ <linearGradient id="lgSpreadRepeat" gradientUnits="userSpaceOnUse" y1="0" x1="50" y2="0" x2="100" spreadMethod="repeat">
+ <stop offset="000%" stop-color="black"/>
+ <stop offset="100%" stop-color="gold"/>
+ </linearGradient>
+
+ <linearGradient id="lgSpreadDefault" gradientUnits="userSpaceOnUse" y1="0" x1="50" y2="0" x2="100">
+ <stop offset="000%" stop-color="black"/>
+ <stop offset="100%" stop-color="gold"/>
+ </linearGradient>
+
+ <radialGradient id="rgSpreadPad" gradientUnits="objectBoundingBox" cx="0.5" cy="0.5" r="0.2" spreadMethod="pad">
+ <stop offset="000%" stop-color="black"/>
+ <stop offset="100%" stop-color="gold"/>
+ </radialGradient>
+
+ <radialGradient id="rgSpreadReflect" gradientUnits="objectBoundingBox" cx="0.5" cy="0.5" r="0.2" spreadMethod="reflect">
+ <stop offset="000%" stop-color="black"/>
+ <stop offset="100%" stop-color="gold"/>
+ </radialGradient>
+
+ <radialGradient id="rgSpreadRepeat" gradientUnits="objectBoundingBox" cx="0.5" cy="0.5" r="0.2" spreadMethod="repeat">
+ <stop offset="000%" stop-color="black"/>
+ <stop offset="100%" stop-color="gold"/>
+ </radialGradient>
+
+ <radialGradient id="rgSpreadDefault" gradientUnits="objectBoundingBox" cx="0.5" cy="0.5" r="0.2">
+ <stop offset="000%" stop-color="black"/>
+ <stop offset="100%" stop-color="gold"/>
+ </radialGradient>
+ </defs>
+
+ <text font-size="20" x="240" y="30" text-anchor="middle">Gradient 'spreadMethod' values</text>
+
+ <rect x="10" y="060" width="225" height="40" fill="url(#lgSpreadPad)" stroke="none"/>
+ <text font-size="16" x="10" y="55">spreadMethod="pad"</text>
+
+ <rect x="10" y="130" width="225" height="40" fill="url(#lgSpreadReflect)" stroke="none"/>
+ <text font-size="16" x="10" y="125">spreadMethod="reflect"</text>
+
+ <rect x="10" y="200" width="225" height="40" fill="url(#lgSpreadRepeat)" stroke="none"/>
+ <text font-size="16" x="10" y="195">spreadMethod="repeat"</text>
+
+ <rect x="10" y="270" width="225" height="40" fill="url(#lgSpreadDefault)" stroke="none"/>
+ <text font-size="16" x="10" y="265">spreadMethod="default"</text>
+
+
+ <rect x="245" y="060" width="225" height="40" fill="url(#rgSpreadPad)" stroke="none"/>
+ <text font-size="16" x="245" y="55">spreadMethod="pad"</text>
+
+ <rect x="245" y="130" width="225" height="40" fill="url(#rgSpreadReflect)" stroke="none"/>
+ <text font-size="16" x="245" y="125">spreadMethod="reflect"</text>
+
+ <rect x="245" y="200" width="225" height="40" fill="url(#rgSpreadRepeat)" stroke="none"/>
+ <text font-size="16" x="245" y="195">spreadMethod="repeat"</text>
+
+ <rect x="245" y="270" width="225" height="40" fill="url(#rgSpreadDefault)" stroke="none"/>
+ <text font-size="16" x="245" y="265">spreadMethod="default"</text>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.5 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-15-b-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-15-b-ref.png
new file mode 100644
index 00000000..7ad2da9e
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-15-b-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-15-b.svg b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-15-b.svg
new file mode 100644
index 00000000..84ecd8f2
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-15-b.svg
@@ -0,0 +1,70 @@
+<svg version="1.1" baseProfile="tiny" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="CL" author="CN" status="accepted"
+ version="$Revision: 1.6 $" testname="$RCSfile: pservers-grad-15-b.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/pservers.html#Gradients">
+ <p>
+ Test linear and radial gradient defaults. Includes
+ testing defaults for linear grad x1,y1,y2 = 0%, x2 = 100%.
+ and testing defaults for radial grad cx,cy,r = 50%, fx,fy = cx,cy.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The top rectangle must be blue at the lefthand side and fuchsia at the right
+ hand side, fading smoothly accross. The lower rectangle must be fuchsia at
+ the edges with a black centre to the radial gradient at the centre of the
+ rectangle, and the gradient occupying the whole rectangle.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: pservers-grad-15-b.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <!-- Test defaults for linear grad x1,y1,y2 = 0%, x2 = 100%. -->
+ <linearGradient id="defs1" gradientUnits="objectBoundingBox">
+ <stop stop-color="blue" offset="0"/>
+ <stop stop-color="fuchsia" offset="1"/>
+ </linearGradient>
+ <!-- Test defaults for radial grad cx,cy,r = 50%, fx,fy = cx,cy. -->
+ <radialGradient id="defs2" gradientUnits="objectBoundingBox">
+ <stop stop-color="black" offset="0"/>
+ <stop stop-color="fuchsia" offset="1"/>
+ </radialGradient>
+
+ <rect x="20" y="20" width="440" height="80" fill="url(#defs1)"/>
+ <rect x="20" y="150" width="440" height="80" fill="url(#defs2)"/>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.6 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-16-b-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-16-b-ref.png
new file mode 100644
index 00000000..f2077f97
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-16-b-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-16-b.svg b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-16-b.svg
new file mode 100644
index 00000000..1f62ca83
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-16-b.svg
@@ -0,0 +1,81 @@
+<svg version="1.1" baseProfile="tiny" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="CL" author="CN" status="accepted"
+ version="$Revision: 1.5 $" testname="$RCSfile: pservers-grad-16-b.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/pservers.html#Gradients">
+ <p>
+ Test gradient stop rules. Including:
+ No stops, like fill = none.
+ One stop, like fill = black.
+ If a stop less than all previous stops, it is set equal to the largest stop.
+ If two stops are equal the last stop controls the color at the overlap point.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ [[
+ Describe how to use the here. The instructions should specify any
+ steps requied to run the test or any manual operation that need
+ to be performed to run the test.
+ ]]
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The top rectangle must have a pink outline and no fill. The middle rectangle must have a
+ solid black fill. The lower rectangle must have a yellow to pink to green
+ linear gradient on the left-hand half and a solid blue fill for the right hand half.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: pservers-grad-16-b.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <!-- No stops, like fill = none -->
+ <linearGradient id="defs1" gradientUnits="objectBoundingBox" x1="0" y1="0" x2="1" y2="0">
+ </linearGradient>
+ <!-- One stop, like fill = black -->
+ <linearGradient id="defs2" gradientUnits="objectBoundingBox" x1="0" y1="0" x2="1" y2="0">
+ <stop stop-color="black" offset="1"/>
+ </linearGradient>
+ <!-- If a stop less than all previous stops, it is set equal to the largest stop-->
+ <!-- This also tests if two stops are equal the last stop controls the color at the overlap point-->
+ <linearGradient id="defs3" gradientUnits="objectBoundingBox" x1="0" y1="0" x2="1" y2="0">
+ <stop stop-color="yellow" offset="0"/>
+ <stop stop-color="#f48" offset=".25"/>
+ <stop stop-color="green" offset=".5"/>
+ <stop stop-color="blue" offset=".1"/>
+ </linearGradient>
+
+ <rect x="20" y="10" width="440" height="80" fill="url(#defs1)" stroke="#f48"/>
+ <rect x="20" y="110" width="440" height="80" fill="url(#defs2)"/>
+ <rect x="20" y="210" width="440" height="80" fill="url(#defs3)"/>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.5 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-18-b-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-18-b-ref.png
new file mode 100644
index 00000000..7fd04c5e
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-18-b-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-18-b.svg b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-18-b.svg
new file mode 100644
index 00000000..3bb4411c
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-18-b.svg
@@ -0,0 +1,114 @@
+<svg version="1.1" baseProfile="tiny" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="ED" author="CC" status="accepted"
+ version="$Revision: 1.5 $" testname="$RCSfile: pservers-grad-18-b.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/pservers.html#Gradients">
+ <p>
+ This test shows rectangles filled with gradient.
+ Several gradients are defined, with two stops:
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ For the top-left rectangle's gradient:
+ The first stop defines a fully-opaque green color.
+ The second stop explicitly inherits (i.e. using the 'inherit' keyword) its stop-color.
+ </p>
+ <p>
+ For the top-right rectangle's gradient:
+ The first stop defines a fully-opaque green color.
+ The second stop defines a green stop-color but explicitly inherits (i.e. using the 'inherit' keyword) the stop-opacity.
+ </p>
+ <p>
+ For the bottom-left rectangle's gradient:
+ The first stop defines a fully-opaque green color.
+ The second stop does not specify the stop-color and the stop-opacity.
+ Since both properties are not inherited, the initial value should be used.
+ </p>
+ <p>
+ For the bottom-right rectangle's gradient:
+ The first stop defines a fully-opaque green color.
+ The second stop specifies the stop-color using the 'currentColor' keyword.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The result should be:
+ </p>
+ <p>
+ The top-left rectangle is filled with a gradient from green to pink since
+ the stop-color is inherited from the location of the gradient definition.
+ </p>
+ <p>
+ The top-right rectangle filled in green with a gradient opacity.
+ </p>
+ <p>
+ The lower-left rectangle filled with a gradient going from fully-opaque green to fully-opaque black.
+ </p>
+ <p>
+ The lower-right rectangle filled with a gradient going from fully-opaque green to fully-opaque yellow.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: pservers-grad-18-b.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <g id="g0" stop-color="#f48" stop-opacity="0.5" color="yellow">
+ <linearGradient id="MyGradient1" stop-color="inherit">
+ <stop offset="0" stop-color="green" stop-opacity="1"/>
+ <stop offset="1" stop-color="inherit" stop-opacity="1"/>
+ </linearGradient>
+ <linearGradient id="MyGradient2" stop-opacity="inherit">
+ <stop offset="0" stop-color="green" stop-opacity="1"/>
+ <stop offset="1" stop-color="green" stop-opacity="inherit"/>
+ </linearGradient>
+ <linearGradient id="MyGradient3">
+ <stop offset="0" stop-color="green" stop-opacity="1"/>
+ <stop offset="1"/>
+ </linearGradient>
+ <linearGradient id="MyGradient4">
+ <stop offset="0" stop-color="green" stop-opacity="1"/>
+ <stop offset="1" stop-color="currentColor" stop-opacity="1"/>
+ </linearGradient>
+ </g>
+ <g id="g1" stop-color="blue">
+ <rect id="r1" fill="url(#MyGradient1)" width="100" height="100" x="50" y="50"/>
+ </g>
+ <g id="g2" stop-opacity="1">
+ <rect id="r2" fill="url(#MyGradient2)" width="100" height="100" x="200" y="50"/>
+ </g>
+ <g id="g3" stop-opacity="1" stop-color="blue">
+ <rect id="r3" fill="url(#MyGradient3)" width="100" height="100" x="50" y="200"/>
+ </g>
+ <g id="g4" color="blue">
+ <rect id="r4" fill="url(#MyGradient4)" width="100" height="100" x="200" y="200"/>
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.5 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-22-b-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-22-b-ref.png
new file mode 100644
index 00000000..24c8dd06
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-22-b-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-22-b.svg b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-22-b.svg
new file mode 100644
index 00000000..b4289b60
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-22-b.svg
@@ -0,0 +1,97 @@
+<svg id="svg-root" width="100%" height="100%"
+ viewBox="0 0 480 360" xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= Copyright 2008 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="ED" author="AG" status="accepted"
+ version="$Revision: 1.4 $" testname="$RCSfile: pservers-grad-22-b.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://dev.w3.org/SVG/profiles/1.1F2/master/pservers.html#Gradients">
+ <p>
+ Tests that transforms affect the rendering of a gradient.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The test passes if each of the two gradient-filled rectangles
+ towards the top of the test slide is identical to the one below it.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: pservers-grad-22-b.svg,v $</title>
+ <defs>
+ <font-face
+ font-family="SVGFreeSansASCII"
+ unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <defs>
+ <linearGradient id="g1" x1="0" y1="0" x2="400" y2="50" gradientUnits="userSpaceOnUse" >
+ <stop offset="0" stop-color="blue"/>
+ <stop offset="0.5" stop-color="yellow"/>
+ <stop offset="1.0" stop-color="blue"/>
+ </linearGradient>
+
+ <linearGradient id="g2" x1="0" y1="0" x2="200" y2="12.5" gradientUnits="userSpaceOnUse">
+ <stop offset="0" stop-color="blue"/>
+ <stop offset="0.5" stop-color="yellow"/>
+ <stop offset="1.0" stop-color="blue"/>
+ </linearGradient>
+
+ <linearGradient id="g3" x1="0" y1="0" x2="400" y2="50" gradientUnits="userSpaceOnUse" gradientTransform="rotate(-37) scale(0.89 1)">
+ <stop offset="0" stop-color="blue"/>
+ <stop offset="0.5" stop-color="yellow"/>
+ <stop offset="1.0" stop-color="blue"/>
+ </linearGradient>
+
+ <linearGradient id="g4" x1="0" y1="0" x2="200" y2="12.5" gradientUnits="userSpaceOnUse" gradientTransform="rotate(-20)">
+ <stop offset="0" stop-color="blue"/>
+ <stop offset="0.5" stop-color="yellow"/>
+ <stop offset="1.0" stop-color="blue"/>
+ </linearGradient>
+ </defs>
+
+ <g transform="translate(20,50)">
+ <g transform="scale(0.5,1)">
+ <rect width="400" height="50" fill="url(#g1)" />
+ </g>
+ </g>
+
+ <g transform="translate(20,120)">
+ <rect width="200" height="50" fill="url(#g2)" />
+ </g>
+
+ <g transform="translate(250,80)">
+ <rect width="400" height="50" fill="url(#g3)" transform="scale(0.5,1)"/>
+ </g>
+
+ <g transform="translate(250,150)">
+ <rect width="200" height="50" fill="url(#g4)" />
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none"
+ fill="black">$Revision: 1.4 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000"/>
+ <!-- comment out this watermark once the test is approved
+ <g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-23-f-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-23-f-ref.png
new file mode 100644
index 00000000..a68367df
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-23-f-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-23-f.svg b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-23-f.svg
new file mode 100644
index 00000000..3029214d
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-23-f.svg
@@ -0,0 +1,80 @@
+<svg id="svg-root" width="100%" height="100%" viewBox="0 0 480 360" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2008 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/" template-version="1.4" reviewer="[reviewer]" author="Microsoft" status="created" version="$Revision: 1.3 $" testname="$RCSfile: pservers-grad-23-f.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://dev.w3.org/SVG/profiles/1.1F2/publish/pservers.html#Gradients">
+ <p>
+ <!--[[
+ Properties do not inherit from elements referencing 'linearGradient' or 'radialGradient' elements.
+ ]]-->
+ </p>
+ <p>
+ <!--[[
+ Specify a 'stop-color' attribute equal to 'red' on a 'g' element ancestor of a 'rect' element. Specify a 'linearGradient' with a single
+ 'stop' that has a 'stop-color' of 'inherit'. Reference the 'linearGradient' from the 'rect' element and verify that the 'rect' is not red.
+ Repeat the same process with a sibling 'rect' element referencing a 'radialGradient' element.
+ ]]-->
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required
+ </p>
+ <p>
+ <!--[[
+
+ ]]-->
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ <!--[[
+ Test passes if there is no red visible on the page.
+ ]]-->
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: pservers-grad-23-f.svg,v $</title>
+ <defs>
+ <font-face
+ font-family="SVGFreeSansASCII"
+ unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-size="18">
+ <defs>
+ <linearGradient id="testLinear" stop-color="inherit">
+ <stop offset="100%" stop-color="inherit" />
+ </linearGradient>
+ <radialGradient id="testRadial" stop-color="inherit">
+ <stop offset="100%" stop-color="inherit" />
+ </radialGradient>
+ </defs>
+ <g stop-color="red">
+ <rect x="30" y="30" width="100" height="100" fill="url(#testLinear)" stop-color="inherit" />
+ <rect x="150" y="30" width="100" height="100" fill="url(#testRadial)" stop-color="inherit" />
+ </g>
+
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none"
+ fill="black">$Revision: 1.3 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>
+</svg> \ No newline at end of file
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-24-f-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-24-f-ref.png
new file mode 100644
index 00000000..9f1dd72c
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-24-f-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-24-f.svg b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-24-f.svg
new file mode 100644
index 00000000..2aa02986
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-24-f.svg
@@ -0,0 +1,68 @@
+<svg id="svg-root" width="100%" height="100%" viewBox="0 0 480 360" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= Copyright 2008 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/" template-version="1.4" reviewer="CM" author="Microsoft" status="reviewed" version="$Revision: 1.3 $" testname="$RCSfile: pservers-grad-24-f.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://dev.w3.org/SVG/profiles/1.1F2/publish/pservers.html#Gradients">
+ <p>
+ Test that the 'linearGradient' and 'radialGradient' elements are neither rendered directly nor via the 'use' element.
+ </p>
+ <p>
+ The test defines 'linearGradient' and 'radialGradient' elements with a red 'stop' and references them from a 'use' element. 'linearGradient'
+ and 'radialGradient' elements with a red 'stop' are also specified outside of a 'defs' tag as if they were regular graphical elements.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>Run the test. No interaction required.</p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Test passes if there is no red visible on the page.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: pservers-grad-24-f.svg,v $</title>
+ <defs>
+ <font-face
+ font-family="SVGFreeSansASCII"
+ unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <defs>
+ <linearGradient id="testLinear">
+ <stop offset="100%" stop-color="red" />
+ </linearGradient>
+ <radialGradient id="testRadial">
+ <stop offset="100%" stop-color="red" />
+ </radialGradient>
+ </defs>
+ <text x="10" y="50">There should be no red.</text>
+ <use x="0" y="0" xlink:href="url(#testLinear)" />
+ <use x="0" y="150" xlink:href="url(#testRadial)" />
+ <linearGradient x1="0" x2="100" y1="150" y2="250">
+ <stop offset="100%" stop-color="red" />
+ </linearGradient>
+ <radialGradient cx="200" cy="300" r="50" fx="200" fy="300">
+ <stop offset="100%" stop-color="red" />
+ </radialGradient>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none"
+ fill="black">$Revision: 1.3 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-stops-01-f-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-stops-01-f-ref.png
new file mode 100644
index 00000000..c69ac8c8
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-stops-01-f-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-stops-01-f.svg b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-stops-01-f.svg
new file mode 100644
index 00000000..d7d15813
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/pservers-grad-stops-01-f.svg
@@ -0,0 +1,70 @@
+<svg id="svg-root" width="100%" height="100%" viewBox="0 0 480 360" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= Copyright 2008 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/" template-version="1.4" reviewer="CM" author="Microsoft" status="reviewed" version="$Revision: 1.3 $" testname="$RCSfile: pservers-grad-stops-01-f.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG/pservers.html#GradientStops">
+ <p>
+ Test that gradient offset values less than zero are rounded up to zero and values more than one are rounded down to one.
+ </p>
+ <p>
+ The test defines four gradients, each with a single stop where the 'stop-color' is set to 'blue'.
+ The four gradients have 'offset' set to '-1', '-1%', '101%' and '2'. Four rectangles reference
+ the gradients. All of these should render as if they have plain blue fills.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>Run the test. No interaction required.</p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The test passed if there are four blue boxes on the page.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: pservers-grad-stops-01-f.svg,v $</title>
+ <defs>
+ <font-face
+ font-family="SVGFreeSansASCII"
+ unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <defs>
+ <linearGradient id="gradient1">
+ <stop offset="-1" stop-color="blue" />
+ </linearGradient>
+ <linearGradient id="gradient2">
+ <stop offset="-1%" stop-color="blue" />
+ </linearGradient>
+ <linearGradient id="gradient3">
+ <stop offset="2" stop-color="blue" />
+ </linearGradient>
+ <linearGradient id="gradient4">
+ <stop offset="101%" stop-color="blue" />
+ </linearGradient>
+ </defs>
+ <rect fill="url(#gradient1)" stroke="black" stroke-width="5" x="10" y="10" width="100" height="100" />
+ <rect fill="url(#gradient2)" stroke="black" stroke-width="5" x="120" y="10" width="100" height="100" />
+ <rect fill="url(#gradient3)" stroke="black" stroke-width="5" x="10" y="120" width="100" height="100" />
+ <rect fill="url(#gradient4)" stroke="black" stroke-width="5" x="120" y="120" width="100" height="100" />
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none"
+ fill="black">$Revision: 1.3 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/pservers-pattern-01-b-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/pservers-pattern-01-b-ref.png
new file mode 100644
index 00000000..f1d6b664
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/pservers-pattern-01-b-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/pservers-pattern-01-b.svg b/rsvg/tests/fixtures/reftests/svg1.1/pservers-pattern-01-b.svg
new file mode 100644
index 00000000..2081855a
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/pservers-pattern-01-b.svg
@@ -0,0 +1,108 @@
+<svg version="1.1" baseProfile="basic" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="SVGWG" author="Haroon Sheikh" status="accepted"
+ version="$Revision: 1.6 $" testname="$RCSfile: pservers-pattern-01-b.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/pservers.html#Patterns">
+ <p>
+ Test that the viewer has basic capability to handle patterns
+ on fills and stroke of objects and text.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ From top-down the appearance of objects is as follows.
+ </p>
+ <p>
+ The top rectangle should be filled with a pattern composed of a green
+ rectangle on top of yellow rectangle. A default stroke has been applied to the original
+ rectangle to see the boundary of the rectangle.
+ </p>
+ <p>
+ The next rectangle has no fill, but has a thick stroke on which the pattern is
+ applied. The pattern consists of 4 colored rectangles.
+ </p>
+ <p>
+ The next item is a text with a pattern on the fill. The pattern appears as
+ alternating rows of orange and green.
+ </p>
+ <p>
+ The last item is a text with a 2 user unit stroke on which a pattern is applied.
+ The pattern appears as alternating columns of maroon and blue.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: pservers-pattern-01-b.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <!-- ====================================================================== -->
+ <!-- Rectangle with a pattern fill ======== -->
+ <!-- ====================================================================== -->
+ <pattern patternUnits="userSpaceOnUse" id="pat1" x="10" y="10" width="20" height="20">
+ <rect x="5" y="5" width="10" height="10" fill="yellow"/>
+ <rect x="10" y="10" width="10" height="10" fill="green"/>
+ </pattern>
+ <rect x="25" y="10" width="430" height="60" stroke="black" fill="url(#pat1)"/>
+ <text font-family="Arial" font-size="12" x="25" y="85">Pattern created using yellow and green rectangles applied to fill of rectangle</text>
+ <!-- ====================================================================== -->
+ <!-- Rectangle with a pattern on the stroke ======== -->
+ <!-- ====================================================================== -->
+ <pattern patternUnits="userSpaceOnUse" id="pat2" x="0" y="0" width="20" height="20">
+ <rect x="0" y="0" width="10" height="10" fill="maroon"/>
+ <rect x="10" y="0" width="10" height="10" fill="green"/>
+ <rect x="0" y="10" width="10" height="10" fill="blue"/>
+ <rect x="10" y="10" width="10" height="10" fill="yellow"/>
+ </pattern>
+ <rect x="35" y="110" width="410" height="40" fill="none" stroke="url(#pat2)" stroke-width="20"/>
+ <text font-family="Arial" font-size="12" x="25" y="175">Pattern of 4 rectangles applied to a stroke of a rectangle.</text>
+ <!-- ====================================================================== -->
+ <!-- Pattern filled text ======== -->
+ <!-- ====================================================================== -->
+ <pattern patternUnits="userSpaceOnUse" id="pat3" x="0" y="0" width="10" height="20">
+ <rect x="0" y="0" width="10" height="10" fill="orange"/>
+ <rect x="0" y="10" width="10" height="10" fill="green"/>
+ </pattern>
+ <text font-family="Arial" font-size="50" fill="url(#pat3)" x="25" y="220">Pattern on fill</text>
+ <text font-family="Arial" font-size="12" x="25" y="235">Pattern consists of orange and green rows</text>
+ <!-- ====================================================================== -->
+ <!-- Pattern on stroke of text ======== -->
+ <!-- ====================================================================== -->
+ <pattern patternUnits="userSpaceOnUse" id="pat4" x="0" y="0" width="20" height="10">
+ <rect x="0" y="0" width="10" height="10" fill="maroon"/>
+ <rect x="10" y="0" width="10" height="10" fill="blue"/>
+ </pattern>
+ <text font-family="Arial" font-size="40" fill="none" stroke="url(#pat4)" stroke-width="2" x="25" y="275">Pattern on stroke</text>
+ <text font-family="Arial" font-size="12" x="25" y="290">Pattern consists of maroon and blue columns</text>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.6 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/pservers-pattern-02-f-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/pservers-pattern-02-f-ref.png
new file mode 100644
index 00000000..fb0893ec
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/pservers-pattern-02-f-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/pservers-pattern-02-f.svg b/rsvg/tests/fixtures/reftests/svg1.1/pservers-pattern-02-f.svg
new file mode 100644
index 00000000..d2e8655a
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/pservers-pattern-02-f.svg
@@ -0,0 +1,61 @@
+<svg id="svg-root" width="100%" height="100%"
+ viewBox="0 0 480 360" xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= Copyright 2008 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="CM" author="ED" status="accepted"
+ version="$Revision: 1.3 $" testname="$RCSfile: pservers-pattern-02-f.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/pservers.html#PatternElement">
+ <p>
+ Test that the 'patternTransform' attribute has an effect on the 'pattern' element.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The test is passed if the testframe is filled with a blue and white
+ diamond pattern.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: pservers-pattern-02-f.svg,v $</title>
+ <defs>
+ <font-face
+ font-family="SVGFreeSansASCII"
+ unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <defs>
+ <pattern id="pattern" viewBox="0 0 100 100" patternTransform="rotate(45)" height="0.1" width="0.1">
+ <rect y="50" width="50" height="50" fill="blue"/>
+ <rect x="50" width="50" height="50" fill="blue"/>
+ </pattern>
+ </defs>
+ <rect fill="url(#pattern)" width="480" height="480"/>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none"
+ fill="black">$Revision: 1.3 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000"/>
+ <!-- comment out this watermark once the test is approved
+ <g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/pservers-pattern-03-f-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/pservers-pattern-03-f-ref.png
new file mode 100644
index 00000000..bdf0afed
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/pservers-pattern-03-f-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/pservers-pattern-03-f.svg b/rsvg/tests/fixtures/reftests/svg1.1/pservers-pattern-03-f.svg
new file mode 100644
index 00000000..dbf9f479
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/pservers-pattern-03-f.svg
@@ -0,0 +1,91 @@
+<svg id="svg-root" width="100%" height="100%"
+ viewBox="0 0 480 360" xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= Copyright 2008 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="[reviewer]" author="ED" status="created"
+ version="$Revision: 1.1 $" testname="$RCSfile: pservers-pattern-03-f.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/pservers.html#Patterns">
+ <p>
+ Test that empty patterns are not rendered, and that the fallback color is used instead.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The test is passed if there are 8 green rectangles visible, and no red.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: pservers-pattern-03-f.svg,v $</title>
+ <defs>
+ <font-face
+ font-family="SVGFreeSansASCII"
+ unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+
+ <defs>
+ <pattern id="invisible1">
+ <rect width="100%" height="100%" fill="red"/>
+ </pattern>
+ <pattern id="invisible2" patternUnits="objectBoundingBox" patternContentUnits="objectBoundingBox">
+ <rect width="100%" height="100%" fill="red"/>
+ </pattern>
+ <pattern id="invisible3" width="0" height="0" patternUnits="objectBoundingBox" patternContentUnits="objectBoundingBox">
+ <rect width="1" height="1" fill="red"/>
+ </pattern>
+ <pattern id="invisible4" width="0" patternUnits="objectBoundingBox" patternContentUnits="objectBoundingBox">
+ <rect width="1" height="1" fill="red"/>
+ </pattern>
+ <pattern id="invisible5" width="0" height="0" patternUnits="userSpaceOnUse" patternContentUnits="objectBoundingBox">
+ <rect width="1" height="1" fill="red"/>
+ </pattern>
+ <pattern id="invisible6" height="0" patternUnits="userSpaceOnUse" patternContentUnits="objectBoundingBox">
+ <rect width="1" height="1" fill="red"/>
+ </pattern>
+ <pattern id="invisible7" height="0" patternUnits="userSpaceOnUse" patternContentUnits="userSpaceOnUse">
+ <rect width="100%" height="100%" fill="red"/>
+ </pattern>
+ </defs>
+
+ <g transform="translate(40 60)" stroke="black">
+ <rect width="100" height="100" fill="url(#invisible1) lime"/>
+ <rect x="100" width="100" height="100" fill="url(#invisible2) lime"/>
+ <rect x="200" width="100" height="100" fill="url(#invisible3) lime"/>
+ <rect x="300" width="100" height="100" fill="url(#invisible4) lime"/>
+
+ <rect y="100" width="100" height="100" fill="url(#invisible5) lime"/>
+ <rect x="100" y="100" width="100" height="100" fill="url(#invisible6) lime"/>
+ <rect x="200" y="100" width="100" height="100" fill="url(#invisible7) lime"/>
+
+ <!-- note that this is on purpose testing a broken uri -->
+ <rect x="300" y="100" width="100" height="100" fill="url(#invisible8) lime"/>
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none"
+ fill="black">$Revision: 1.1 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/pservers-pattern-04-f-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/pservers-pattern-04-f-ref.png
new file mode 100644
index 00000000..aa1ecd10
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/pservers-pattern-04-f-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/pservers-pattern-04-f.svg b/rsvg/tests/fixtures/reftests/svg1.1/pservers-pattern-04-f.svg
new file mode 100644
index 00000000..e24dd33d
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/pservers-pattern-04-f.svg
@@ -0,0 +1,70 @@
+<svg id="svg-root" width="100%" height="100%"
+ viewBox="0 0 480 360" xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= Copyright 2008 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="ED" author="Microsoft" status="accepted"
+ version="$Revision: 1.3 $" testname="$RCSfile: pservers-pattern-04-f.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/pservers.html#Patterns">
+ <p>
+ Inherited attributes from a referenced 'pattern' are not applied if they are already defined on the referencing 'pattern' element.
+ </p>
+ <p>
+ Define a pattern 'pattern1' with circles that have red fill. Inherit 'pattern1' into 'pattern2' and add circles at different 'y'
+ attribute and with 'fill' set to 'lime' on 'pattern2'. Reference 'pattern1' from a square using 'fill' attribute. Reference 'pattern2'
+ from a different square using 'fill' attribute. Position the second square directly over the first square. Verify that there is green visible.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The test is passed if there are four green circles visible on the page, and no red.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: pservers-pattern-04-f.svg,v $</title>
+ <defs>
+ <font-face
+ font-family="SVGFreeSansASCII"
+ unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <defs>
+ <pattern id="pattern1" patternUnits="userSpaceOnUse" x="0" y="0" width="100" height="100" viewBox="0 0 10 10" >
+ <circle cx="5" cy="5" r="1.9" fill="red" />
+ </pattern>
+ <pattern id="pattern2" xlink:href="#pattern1" y="30">
+ <circle cx="5" cy="2" r="2" fill="lime" />
+ </pattern>
+ </defs>
+ <rect fill="url(#pattern1)" stroke="none" x="1" y="1" width="200" height="200" />
+ <rect fill="url(#pattern2)" stroke="none" x="1" y="1" width="200" height="200" />
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none"
+ fill="black">$Revision: 1.3 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--
+ <g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>
+ -->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/pservers-pattern-05-f-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/pservers-pattern-05-f-ref.png
new file mode 100644
index 00000000..f5204b02
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/pservers-pattern-05-f-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/pservers-pattern-05-f.svg b/rsvg/tests/fixtures/reftests/svg1.1/pservers-pattern-05-f.svg
new file mode 100644
index 00000000..4fe22ab1
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/pservers-pattern-05-f.svg
@@ -0,0 +1,64 @@
+<svg id="svg-root" width="100%" height="100%" viewBox="0 0 480 360" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= Copyright 2008 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/" template-version="1.4" reviewer="CM" author="Microsoft" status="reviewed" version="$Revision: 1.3 $" testname="$RCSfile: pservers-pattern-05-f.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG/pservers.html#Patterns">
+ <p>
+ Test that a 'pattern' element can inherit attributes through multiple levels of
+ 'xlink:href' referencing.
+ </p>
+ <p>
+ The test defines a pattern 'pattern1' with some attributes that scale the contents. The attributes on
+ 'pattern1' are inherited into 'pattern2' and then inherited from 'pattern2'
+ into 'pattern3'. 'pattern3' has a green circle as its graphical content.
+ A 'rect' uses 'pattern3' as its fill, if the attributes are correctly inherited into
+ 'pattern3', then the green circle will occlude a red circle in the same position.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>Run the test. No interaction required.</p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The test passed if there is no red visible on the page.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: pservers-pattern-05-f.svg,v $</title>
+ <defs>
+ <font-face
+ font-family="SVGFreeSansASCII"
+ unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <defs>
+ <pattern id="Pattern1" patternUnits="userSpaceOnUse" width="100" height="100" viewBox="0 0 10 10" />
+ <pattern id="Pattern2" xlink:href="#Pattern1" />
+ <pattern id="Pattern3" xlink:href="#Pattern2">
+ <circle cx="5" cy="5" r="2" fill="green"/>
+ </pattern>
+ </defs>
+ <circle cx="50" cy="50" r="20" fill="red" />
+ <rect fill="url(#Pattern3)" width="100" height="100" />
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none"
+ fill="black">$Revision: 1.3 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/pservers-pattern-06-f-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/pservers-pattern-06-f-ref.png
new file mode 100644
index 00000000..aa77dce3
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/pservers-pattern-06-f-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/pservers-pattern-06-f.svg b/rsvg/tests/fixtures/reftests/svg1.1/pservers-pattern-06-f.svg
new file mode 100644
index 00000000..72198844
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/pservers-pattern-06-f.svg
@@ -0,0 +1,65 @@
+<svg id="svg-root" width="100%" height="100%" viewBox="0 0 480 360" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= Copyright 2008 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/" template-version="1.4" reviewer="[reviewer]" author="Microsoft" status="created" version="$Revision: 1.2 $" testname="$RCSfile: pservers-pattern-06-f.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG/pservers.html#Patterns">
+ <p>
+ <!--[[
+ The 'pattern' element is neither rendered directly nor via the 'use' element.
+ ]]-->
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ <!--[[
+ Define a 'pattern' element with a red 'rect' and reference it from a 'use' element. Also specify one 'pattern' elements with a red 'rect'
+ outside of a 'defs' tag. Verify there is no red on the page.
+ ]]-->
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ <!--[[
+ Test passes if there is no red visible on the page.
+ ]]-->
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: pservers-pattern-06-f.svg,v $</title>
+ <defs>
+ <font-face
+ font-family="SVGFreeSansASCII"
+ unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <defs>
+ <pattern id="testPattern" patternUnits="userSpaceOnUse" x="0" y="0" width="100" height="100" viewBox="0 0 10 10" >
+ <rect x="5" y="5" width="10" height="10" fill="red" />
+ </pattern>
+ </defs>
+ <use x="100" y="100" xlink:href="url(#testPattern)" />
+ <pattern patternUnits="userSpaceOnUse" x="10" y="10" width="20" height="20">
+ <rect x="5" y="5" width="10" height="10" fill="red" />
+ </pattern>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none"
+ fill="black">$Revision: 1.2 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/pservers-pattern-07-f-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/pservers-pattern-07-f-ref.png
new file mode 100644
index 00000000..86d1ff66
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/pservers-pattern-07-f-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/pservers-pattern-07-f.svg b/rsvg/tests/fixtures/reftests/svg1.1/pservers-pattern-07-f.svg
new file mode 100644
index 00000000..8701df13
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/pservers-pattern-07-f.svg
@@ -0,0 +1,65 @@
+<svg id="svg-root" width="100%" height="100%"
+ viewBox="0 0 480 360" xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= Copyright 2008 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="CM" author="ED" status="reviewed"
+ version="$Revision: 1.2 $" testname="$RCSfile: pservers-pattern-07-f.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/pservers.html#Patterns">
+ <p>
+ Test that an invalid xlink:href on a 'pattern' element has no effect on the pattern.
+ The pattern dimensions and coordinate-system are defined completely on the pattern that has the invalid xlink:href,
+ to test that they're not overridden by the non-existant pattern that is referenced.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The test is passed if there are four green circles visible on the page.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: pservers-pattern-07-f.svg,v $</title>
+ <defs>
+ <font-face
+ font-family="SVGFreeSansASCII"
+ unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <defs>
+ <pattern id="pattern1" patternUnits="userSpaceOnUse" x="0" y="0" width="100" height="100" viewBox="0 0 10 10">
+ <circle cx="5" cy="5" r="1.7" fill="red" />
+ </pattern>
+ <pattern id="pattern2" xlink:href="#invalidlink" patternUnits="userSpaceOnUse" x="0" y="0" width="100" height="100" viewBox="0 0 10 10">
+ <circle cx="5" cy="5" r="2" fill="lime" />
+ </pattern>
+ </defs>
+ <rect fill="url(#pattern1)" stroke="none" x="1" y="1" width="200" height="200" />
+ <rect fill="url(#pattern2)" stroke="none" x="1" y="1" width="200" height="200" />
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none"
+ fill="black">$Revision: 1.2 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/pservers-pattern-08-f-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/pservers-pattern-08-f-ref.png
new file mode 100644
index 00000000..8df5b17c
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/pservers-pattern-08-f-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/pservers-pattern-08-f.svg b/rsvg/tests/fixtures/reftests/svg1.1/pservers-pattern-08-f.svg
new file mode 100644
index 00000000..e15cb845
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/pservers-pattern-08-f.svg
@@ -0,0 +1,66 @@
+<svg id="svg-root" width="100%" height="100%"
+ viewBox="0 0 480 360" xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= Copyright 2008 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="CM" author="ED" status="reviewed"
+ version="$Revision: 1.2 $" testname="$RCSfile: pservers-pattern-08-f.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/pservers.html#Patterns">
+ <p>
+ Test that an invalid xlink:href on a 'pattern' element has no effect on the pattern.
+ This test specifies only 'width' and 'height' on the pattern that is tested in order to catch
+ incorrectly overridden values from a non-existant pattern. The result is tested
+ with a reference pattern using slightly different syntax.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The test is passed if there are four green circles visible on the page, and no red.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: pservers-pattern-08-f.svg,v $</title>
+ <defs>
+ <font-face
+ font-family="SVGFreeSansASCII"
+ unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <defs>
+ <pattern id="pattern1" patternUnits="userSpaceOnUse" x="0" y="0" width="100" height="100" viewBox="0 0 10 10">
+ <circle cx="5" cy="5" r="1.7" fill="red" />
+ </pattern>
+ <pattern id="pattern2" xlink:href="#invalidlink" width="0.5" height="0.5">
+ <circle cx="50" cy="50" r="20" fill="lime" />
+ </pattern>
+ </defs>
+ <rect fill="url(#pattern1)" stroke="none" x="1" y="1" width="200" height="200" />
+ <rect fill="url(#pattern2)" stroke="none" x="1" y="1" width="200" height="200" />
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none"
+ fill="black">$Revision: 1.2 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/pservers-pattern-09-f-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/pservers-pattern-09-f-ref.png
new file mode 100644
index 00000000..98f91ec7
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/pservers-pattern-09-f-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/pservers-pattern-09-f.svg b/rsvg/tests/fixtures/reftests/svg1.1/pservers-pattern-09-f.svg
new file mode 100644
index 00000000..4d0ec1ae
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/pservers-pattern-09-f.svg
@@ -0,0 +1,70 @@
+<svg id="svg-root" width="100%" height="100%"
+ viewBox="0 0 480 360" xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= Copyright 2008 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="[reviewer]" author="ED" status="created"
+ version="$Revision: 1.1 $" testname="$RCSfile: pservers-pattern-09-f.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/pservers.html#Patterns">
+ <p>
+ Test that an invalid xlink:href on a 'pattern' element has no effect on the pattern, and that the
+ pattern isn't rendered since the default 'width' and 'height' is 0.
+ A subtest that explicitly specifies 'width' and 'height' as 0 is added as a reference.
+ Both of these cases should result in the fallback color being used.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The test is passed if there is a green rectangle visible on the page, and no red.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: pservers-pattern-09-f.svg,v $</title>
+ <defs>
+ <font-face
+ font-family="SVGFreeSansASCII"
+ unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <defs>
+ <pattern id="pattern1" patternUnits="userSpaceOnUse" x="0" y="0" width="100" height="100" viewBox="0 0 10 10">
+ <circle cx="5" cy="5" r="1.7" fill="red" />
+ </pattern>
+ <pattern id="pattern2" xlink:href="#invalidlink">
+ <circle cx="50" cy="50" r="20" fill="red" />
+ </pattern>
+ <pattern id="pattern3" patternUnits="userSpaceOnUse" x="0" y="0" width="0" height="0" viewBox="0 0 10 10">
+ <circle cx="5" cy="5" r="1.7" fill="red" />
+ </pattern>
+ </defs>
+ <rect fill="url(#pattern1)" stroke="none" x="1" y="1" width="200" height="200" />
+ <rect fill="url(#pattern2) lime" stroke="none" x="1" y="1" width="200" height="200" />
+ <rect fill="url(#pattern3) lime" stroke="none" x="201" y="1" width="200" height="200" />
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none"
+ fill="black">$Revision: 1.1 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/resources/20x20.png b/rsvg/tests/fixtures/reftests/svg1.1/resources/20x20.png
new file mode 100644
index 00000000..32399c62
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/resources/20x20.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/resources/bluesquidj.png b/rsvg/tests/fixtures/reftests/svg1.1/resources/bluesquidj.png
new file mode 100644
index 00000000..9f5c5587
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/resources/bluesquidj.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/resources/stefan_252_tRNS_opti.png b/rsvg/tests/fixtures/reftests/svg1.1/resources/stefan_252_tRNS_opti.png
new file mode 100644
index 00000000..1937a315
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/resources/stefan_252_tRNS_opti.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/resources/struct-symbol-01.png b/rsvg/tests/fixtures/reftests/svg1.1/resources/struct-symbol-01.png
new file mode 100644
index 00000000..323a51fa
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/resources/struct-symbol-01.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/resources/svgRef4.css b/rsvg/tests/fixtures/reftests/svg1.1/resources/svgRef4.css
new file mode 100644
index 00000000..0e4157b7
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/resources/svgRef4.css
@@ -0,0 +1,4 @@
+rect {fill:fuchsia;}
+circle {fill:blue;}
+polygon {fill:green;}
+ellipse {fill:gold;}
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/resources/svgRef4.svg b/rsvg/tests/fixtures/reftests/svg1.1/resources/svgRef4.svg
new file mode 100644
index 00000000..2f170fbd
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/resources/svgRef4.svg
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml-stylesheet type="text/css" href="svgRef4.css" ?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
+<svg id="svg-root" width="100%" height="100%" viewBox="0 0 480 360"
+xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" >
+
+ <SVGTestCase xmlns="http://www.w3.org/2000/02/svg/testsuite/description/" >
+ <OperatorScript version="$Revision: 1.2 $" testname="" >
+ <Paragraph>
+ </Paragraph>
+ </OperatorScript>
+ </SVGTestCase>
+
+ <title id="test-title" > </title>
+ <desc id="test-desc" > </desc>
+
+ <!--======================================================================-->
+ <!--Content of Test Case follows... =====================-->
+ <!--======================================================================-->
+ <defs>
+ <style type="text/css">
+ <![CDATA[
+ * {stroke:black; stroke-width:1;}
+ text {stroke:none;}
+
+ #test-frame {fill:none;}
+ ]]>
+ </style>
+ </defs>
+
+ <g id="testContent" >
+ <rect id="alpha" x="100" y="50" width="120" height="120" />
+ <circle id="beta" cx="320" cy="110" r="60" />
+ <polygon id="gamma" points="260,180 380,190 360,300" />
+ <ellipse id="delta" cx="160" cy="240" ry="60" rx="45" />
+ </g>
+
+ <text font-size="35" x="240" y="35" text-anchor="middle" >svgRef4.svg</text>
+ <text id="revision" x="10" y="340" font-size="40" stroke="none" fill="black">$Revision: 1.2 $</text>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+</svg> \ No newline at end of file
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/resources/text-extTref-BE-18-targ.svg b/rsvg/tests/fixtures/reftests/svg1.1/resources/text-extTref-BE-18-targ.svg
new file mode 100644
index 00000000..31c7943b
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/resources/text-extTref-BE-18-targ.svg
@@ -0,0 +1,58 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
+
+
+
+<!-- ===================================================================== -->
+<!-- -->
+<!-- text-extTref-BE-18-targ.svg -->
+<!-- -->
+<!-- Auxiliary file to provide external 'tref' target string for -->
+<!-- text-extTref-BE-18.svg. -->
+<!-- -->
+<!-- ===================================================================== -->
+
+
+
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="text-tref-BE-04" width="450" height="450" >
+
+<title id="test-title">text-extTref-BE-18-targ</title>
+
+<desc id="test-desc">
+Auxiliary ('tref' target) file for test case text-extTref-BE-18.
+</desc>
+
+<!-- There is no drawn content to this file, except for the legend & frame -->
+
+<g id="test-body-content">
+
+ <defs>
+
+ <text id="tref-external-reference">Simple external referenced text.</text>
+
+ </defs>
+
+</g>
+
+
+<!-- ====================================================================== -->
+<!-- Legend & frame: Title, suite and SVG document serialization==== -->
+<!-- ====================================================================== -->
+
+<g id="test-legend">
+
+ <rect x="10" y="390" width="270" height="50" style="fill:none;stroke:#000000"/>
+ <path style="fill:none;stroke:#000000" d="M10 405 h270 M195 405 v35 M195 422.5 h85"/>
+ <text style="font-family:Helvetica;font-size:10" x="30" y="401">Scalable Vector Graphics (SVG) Conformance Suite</text>
+ <text style="font-family:Helvetica;font-size:12" x="65" y="428">text-extTref-BE-18-targ</text>
+ <text style="font-family:Helvetica;font-size:12" x="205" y="418">Release 1.0</text>
+ <text style="font-family:Helvetica;font-size:10" x="205" y="435">$Revision: 1.1 $</text>
+
+ <!-- Test-framing rectangle, drawn just inside viewport boundary. -->
+ <rect id="test-frame" x="1" y="1" width="448" height="448" style="fill:none; stroke:#000000"/>
+
+</g>
+
+
+</svg>
+
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/resources/tree.jpg b/rsvg/tests/fixtures/reftests/svg1.1/resources/tree.jpg
new file mode 100644
index 00000000..9d7da4ae
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/resources/tree.jpg
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/shapes-intro-01-t-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/shapes-intro-01-t-ref.png
new file mode 100644
index 00000000..edc9f8a6
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/shapes-intro-01-t-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/shapes-intro-01-t.svg b/rsvg/tests/fixtures/reftests/svg1.1/shapes-intro-01-t.svg
new file mode 100644
index 00000000..0060bf71
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/shapes-intro-01-t.svg
@@ -0,0 +1,108 @@
+<svg version="1.1" baseProfile="tiny" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="CN" author="SH" status="accepted"
+ version="$Revision: 1.5 $" testname="$RCSfile: shapes-intro-01-t.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/shapes.html#Introduction">
+ <p>
+ Tests the degenerate cases of the basic shapes. The shapes are positioned
+ within the black rectangles.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>Run the test. No interaction required.</p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>The test passes if the 11 rectangles are empty.</p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: shapes-intro-01-t.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <!-- ====================================================================== -->
+ <!-- Draw the boxes to contain the shapes and the text labels for the boxes -->
+ <!-- ====================================================================== -->
+ <g fill="none" stroke="#000000">
+ <!-- rects -->
+ <rect x="50" y="50" width="35" height="60"/>
+ <rect x="50" y="155" width="35" height="60"/>
+ <rect x="130" y="50" width="35" height="60"/>
+ <rect x="130" y="155" width="35" height="60"/>
+
+ <!-- circles -->
+ <rect x="210" y="50" width="60" height="60"/>
+ <rect x="210" y="155" width="60" height="60"/>
+
+ <!-- ellipses -->
+ <rect x="315" y="50" width="35" height="60"/>
+ <rect x="315" y="155" width="35" height="60"/>
+ <rect x="394" y="50" width="35" height="60"/>
+ <rect x="394" y="155" width="35" height="60"/>
+
+ <!-- line -->
+ <rect x="235" y="260" width="10" height="10"/>
+ </g>
+
+ <g font-family="Arial" font-size="8">
+ <text x="5" y="90">Stroked</text>
+ <text x="5" y="195">Unstroked</text>
+ <text x="50" y="135">Zero width rect</text>
+ <text x="130" y="135">Zero height rect</text>
+ <text x="210" y="135">Zero radius circle</text>
+ <text x="315" y="135">Zero x radius ellipse</text>
+ <text x="394" y="135">Zero y radius ellipse</text>
+ <text x="235" y="290">Zero length line</text>
+ </g>
+ <!-- ====================================================================== -->
+ <!-- Draw 4 rectangles, two with zero width, two with zero height -->
+ <!-- (stroked and unstroked) -->
+ <!-- ====================================================================== -->
+ <rect id="Zero-width-stroked-rect" fill="none" stroke="#000000" x="55" y="55" width="0" height="50"/>
+ <rect id="Zero-width-unstroked-rect" fill="#FF0000" stroke="none" x="55" y="160" width="0" height="50"/>
+ <rect id="Zero-height-stroked-rect" fill="#00FF00" stroke="#0000FF" x="135" y="55" width="25" height="0"/>
+ <rect id="Zero-height-rect" fill="#00FF00" stroke="none" x="135" y="160" width="25" height="0"/>
+ <!-- ====================================================================== -->
+ <!-- Draw two zero radius circles (stroked and unstroked) -->
+ <!-- ====================================================================== -->
+ <circle id="Zero-radius-stroked-circle" fill="none" stroke="#000000" cx="240" cy="80" r="0"/>
+ <circle id="Zero-radius-unstroked-circle" fill="#FF0000" stroke="none" cx="240" cy="185" r="0"/>
+ <!-- ====================================================================== -->
+ <!-- Draw 4 ellipses, two with a zero x radius, two with a zero y radius -->
+ <!-- (stroked and unstroked) -->
+ <!-- ====================================================================== -->
+ <ellipse id="Zero-x-radius-stroked-ellipse" fill="#00FF00" stroke="#0000FF" cx="332" cy="80" rx="0" ry="25"/>
+ <ellipse id="Zero-x-radius-unstroked-ellipse" fill="#00FF00" stroke="none" cx="332" cy="185" rx="0" ry="25"/>
+ <ellipse id="Zero-y-radius-stroked-ellipse" fill="none" stroke="#000000" cx="411" cy="80" rx="12" ry="0"/>
+ <ellipse id="Zero-y-radius-unstroked-ellipse" fill="#FF0000" stroke="none" cx="411" cy="185" rx="12" ry="0"/>
+ <!-- ====================================================================== -->
+ <!-- Draw a zero-length line -->
+ <!-- ====================================================================== -->
+ <line id="Zero-length-line" stroke="#0000FF" x1="240" y1="265" x2="240" y2="265"/>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.5 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/shapes-intro-02-f-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/shapes-intro-02-f-ref.png
new file mode 100644
index 00000000..8fc3db00
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/shapes-intro-02-f-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/shapes-intro-02-f.svg b/rsvg/tests/fixtures/reftests/svg1.1/shapes-intro-02-f.svg
new file mode 100644
index 00000000..668ced41
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/shapes-intro-02-f.svg
@@ -0,0 +1,89 @@
+<svg id="svg-root" width="100%" height="100%"
+ viewBox="0 0 480 360" xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= Copyright 2008 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="ED" author="Microsoft" status="accepted"
+ version="$Revision: 1.3 $" testname="$RCSfile: shapes-intro-02-f.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/shapes.html#Introduction">
+ <p>
+ Test that basic shape elements are equivalent to a 'path' element that constructs the same shape.
+ </p>
+ <p>
+ For each basic shape, a 'path' reference element that is red is created.
+ A basic shape is then placed on top of the 'path' element.
+ For each basic shape there's also a reverse test that uses the shape as a reference for the 'path' element.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The test is passed if there is no red visible on the page.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: shapes-intro-02-f.svg,v $</title>
+ <defs>
+ <font-face
+ font-family="SVGFreeSansASCII"
+ unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+
+ <path d="M35 25 L115 25 A 10 20 0 0 1 125 45 L 125 105 A 10 20 0 0 1 115 125 L 35 125 A 10 20 0 0 1 25 105 L 25 45 A 10 20 0 0 1 35 25" fill="red" />
+ <rect x="25" y="25" rx="10" ry="20" width="100" height="100" fill="black" />
+ <rect x="130" y="25" rx="10" ry="20" width="100" height="100" fill="red" />
+ <path d="M140 25 L220 25 A 10 20 0 0 1 230 45 L 230 105 A 10 20 0 0 1 220 125 L 140 125 A 10 20 0 0 1 130 105 L 130 45 A 10 20 0 0 1 140 25" fill="black" />
+
+ <path d="M300 125 A50 50 0 1 0 299.9999 125" fill="red" />
+ <circle cx="300" cy="75" r="50" fill="black" />
+ <circle cx="401" cy="75" r="50" fill="red" />
+ <path d="M401 125 A50 50 0 1 0 400.9999 125" fill="black" />
+
+ <path d="M60 305 A50 80 0 1 0 59.9999 305 Z" fill="red" />
+ <ellipse cx="60" cy="225" rx="50" ry="80" fill="black" />
+ <ellipse cx="161" cy="225" rx="50" ry="80" fill="red" />
+ <path d="M161 305 A50 80 0 1 0 160.9999 305 Z" fill="black" />
+
+ <path d="M220 150 L270 200 L220 250 Z" fill="red" />
+ <polygon points="220,150 270,200 220,250" fill="black" />
+ <polygon points="270,150 320,200 270,250" fill="red" />
+ <path d="M270 150 L320 200 L270 250 Z" fill="black" />
+
+ <path d="M350 250 L350 350 L400 350 L400 250 L450 250 L450 350" fill="none" stroke="red" stroke-width="10" />
+ <polyline fill="none" stroke="black" stroke-width="10" points="350,250 350,350 400,350 400,250 450,250 450,350" />
+ <polyline fill="none" stroke="red" stroke-width="10" points="350,135 350,235 400,235 400,135 450,135 450,235" />
+ <path d="M350 135 L350 235 L400 235 L400 135 L450 135 L450 235" fill="none" stroke="black" stroke-width="10" />
+
+ <path d="M225 275 L325 275" stroke-width="10" stroke="red" />
+ <line x1="225" y1="275" x2="325" y2="275" stroke-width="10" stroke="black" />
+ <line x1="225" y1="325" x2="325" y2="325" stroke-width="10" stroke="red" />
+ <path d="M225 325 L325 325" stroke-width="10" stroke="black" />
+
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none"
+ fill="black">$Revision: 1.3 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000"/>
+ <!-- comment out this watermark once the test is approved
+ <g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g> -->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/struct-cond-01-t-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/struct-cond-01-t-ref.png
new file mode 100644
index 00000000..e04cd08a
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/struct-cond-01-t-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/struct-cond-01-t.svg b/rsvg/tests/fixtures/reftests/svg1.1/struct-cond-01-t.svg
new file mode 100644
index 00000000..5238f9fb
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/struct-cond-01-t.svg
@@ -0,0 +1,61 @@
+<svg version="1.1" baseProfile="tiny" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="SVGWGh" author="Tim Thompson" status="accepted"
+ version="$Revision: 1.5 $" testname="$RCSfile: struct-cond-01-t.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/struct.html#ConditionalProcessing">
+ <p>
+ This test evaluates a switch statement.
+ </p>
+ <p>
+ The test uses the 'rect' element, as well as basic fill (solid primary colors),
+ stroke (black 1-pixel lines), font-family (Arial) and font-size properties.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The result should be a green rectangle in the lower left quarter of the output window.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: struct-cond-01-t.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <switch>
+ <rect fill="red" x="0" y="0" width="220" height="150" requiredExtensions="http://example.org/bogus"/>
+ <rect fill="green" x="0" y="150" width="220" height="150"/>
+ <rect fill="blue" x="240" y="0" width="220" height="150"/>
+ </switch>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.5 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/struct-cond-03-t-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/struct-cond-03-t-ref.png
new file mode 100644
index 00000000..cdc1a7b8
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/struct-cond-03-t-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/struct-cond-03-t.svg b/rsvg/tests/fixtures/reftests/svg1.1/struct-cond-03-t.svg
new file mode 100644
index 00000000..93d54901
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/struct-cond-03-t.svg
@@ -0,0 +1,83 @@
+<svg version="1.1" baseProfile="tiny" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="CN" author="VH" status="accepted"
+ version="$Revision: 1.7 $" testname="$RCSfile: struct-cond-03-t.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/struct.html#ConditionalProcessing">
+ <p>
+ Tests the &lt;switch&gt; element with requiredFeatures.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ On the bottom half of the test, there is a first switch.
+ Because SVG Tiny does not support DOM, an SVG Tiny implementation
+ which does not support other SVG Profiles should show a green
+ rectangle. If the application supports the DOM, meaning that
+ it does more than just SVG Tiny, it should show a turquoise rectangle.
+ </p>
+ <p>
+ On the bottom half of the test, there is another switch.
+ The first child has a requiredFeatures set to
+ http://www.w3.org/TR/SVG11/feature#BasicText which all
+ SVG Tiny implementations should support. If the application
+ does, another green rectangle is displayed. Otherwise,
+ a red rectangle shows.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: struct-cond-03-t.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <switch>
+ <g requiredFeatures="http://www.w3.org/TR/SVG11/feature#SVGDOM">
+ <rect x="30" y="20" width="420" height="130" fill="rgb(32, 178, 170)"/>
+ <text x="240" y="100" font-size="20" text-anchor="middle">This viewer does more than SVG Tiny</text>
+ </g>
+ <g>
+ <rect x="30" y="20" width="420" height="130" fill="#0F0"/>
+ </g>
+ </switch>
+
+ <switch transform="translate(0, 140)">
+ <g requiredFeatures="http://www.w3.org/TR/SVG11/feature#BasicText">
+ <rect x="30" y="20" width="420" height="130" fill="#0F0"/>
+ </g>
+ <g>
+ <rect x="30" y="20" width="420" height="130" fill="#F00"/>
+ <text x="240" y="100" font-size="20" text-anchor="middle">This is not an SVG Tiny Viewer</text>
+ </g>
+ </switch>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.7 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/struct-group-03-t-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/struct-group-03-t-ref.png
new file mode 100644
index 00000000..0354fa0c
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/struct-group-03-t-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/struct-group-03-t.svg b/rsvg/tests/fixtures/reftests/svg1.1/struct-group-03-t.svg
new file mode 100644
index 00000000..975e707d
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/struct-group-03-t.svg
@@ -0,0 +1,285 @@
+<svg version="1.1" baseProfile="tiny" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="CN" author="VH" status="accepted"
+ version="$Revision: 1.5 $" testname="$RCSfile: struct-group-03-t.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/struct.html#Groups">
+ <p>
+ This test validates that properties are inherited (or not, depending on
+ their defintion), from a group to its children.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ [[
+ Describe how to use the here. The instructions should specify any
+ steps requied to run the test or any manual operation that need
+ to be performed to run the test.
+ ]]
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The two rows displayed in this test should be identical. In the top row,
+ each property is set to the value 'inherit'. In the bottom row, which is
+ the reference, each property is set to the value that should be inherited
+ in the top row.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: struct-group-03-t.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <g id="grid" transform="translate(70, 150) rotate(-90)" fill="none" stroke="black">
+ <defs>
+ <rect id="propertyCell" x="-5" y="-14" width="110" height="22"/>
+ <rect id="sampleCell" x="-5" y="-14" width="50" height="22"/>
+ </defs>
+
+ <use xlink:href="#propertyCell"/>
+ <use xlink:href="#propertyCell" y="22"/>
+ <use xlink:href="#propertyCell" y="44"/>
+ <use xlink:href="#propertyCell" y="66"/>
+ <use xlink:href="#propertyCell" y="88"/>
+ <use xlink:href="#propertyCell" y="110"/>
+ <use xlink:href="#propertyCell" y="132"/>
+ <use xlink:href="#propertyCell" y="154"/>
+ <use xlink:href="#propertyCell" y="176"/>
+ <use xlink:href="#propertyCell" y="198"/>
+ <use xlink:href="#propertyCell" y="220"/>
+ <use xlink:href="#propertyCell" y="242"/>
+ <use xlink:href="#propertyCell" y="264"/>
+ <use xlink:href="#propertyCell" y="286"/>
+ <use xlink:href="#propertyCell" y="308"/>
+ <use xlink:href="#propertyCell" y="330"/>
+ <use xlink:href="#propertyCell" y="352"/>
+
+ <g transform="translate(-50, 0)">
+ <use xlink:href="#sampleCell"/>
+ <use xlink:href="#sampleCell" y="22"/>
+ <use xlink:href="#sampleCell" y="44"/>
+ <use xlink:href="#sampleCell" y="66"/>
+ <use xlink:href="#sampleCell" y="88"/>
+ <use xlink:href="#sampleCell" y="110"/>
+ <use xlink:href="#sampleCell" y="132"/>
+ <use xlink:href="#sampleCell" y="154"/>
+ <use xlink:href="#sampleCell" y="176"/>
+ <use xlink:href="#sampleCell" y="198"/>
+ <use xlink:href="#sampleCell" y="220"/>
+ <use xlink:href="#sampleCell" y="242"/>
+ <use xlink:href="#sampleCell" y="264"/>
+ <use xlink:href="#sampleCell" y="286"/>
+ <use xlink:href="#sampleCell" y="308"/>
+ <use xlink:href="#sampleCell" y="330"/>
+ <use xlink:href="#sampleCell" y="352"/>
+ </g>
+
+ <g transform="translate(-100, 0)">
+ <use xlink:href="#sampleCell"/>
+ <use xlink:href="#sampleCell" y="22"/>
+ <use xlink:href="#sampleCell" y="44"/>
+ <use xlink:href="#sampleCell" y="66"/>
+ <use xlink:href="#sampleCell" y="88"/>
+ <use xlink:href="#sampleCell" y="110"/>
+ <use xlink:href="#sampleCell" y="132"/>
+ <use xlink:href="#sampleCell" y="154"/>
+ <use xlink:href="#sampleCell" y="176"/>
+ <use xlink:href="#sampleCell" y="198"/>
+ <use xlink:href="#sampleCell" y="220"/>
+ <use xlink:href="#sampleCell" y="242"/>
+ <use xlink:href="#sampleCell" y="264"/>
+ <use xlink:href="#sampleCell" y="286"/>
+ <use xlink:href="#sampleCell" y="308"/>
+ <use xlink:href="#sampleCell" y="330"/>
+ <use xlink:href="#sampleCell" y="352"/>
+ </g>
+ </g>
+ <g id="properties" transform="translate(70, 150) rotate(-90)">
+ <text>color</text>
+ <text y="22">display</text>
+ <text y="44">fill</text>
+ <text y="66">fill-rule</text>
+ <text y="88">stroke</text>
+ <text y="110">stroke-dasharray</text>
+ <text y="132">stroke-dashoffset</text>
+ <text y="154">stroke-linecap</text>
+ <text y="176">stroke-linejoin</text>
+ <text y="198">stroke-miterlimit</text>
+ <text y="220">stroke-width</text>
+ <text y="242">visibility</text>
+ <text y="264">font-family</text>
+ <text y="286">font-size</text>
+ <text y="308">font-style</text>
+ <text y="330">font-weight</text>
+ <text y="352">text-anchor</text>
+ </g>
+
+ <g id="inheritGroup" transform="translate(56, 155)">
+
+ <g color="#0F0">
+ <rect x="3" y="10" width="16" height="32" fill="currentColor"/>
+ </g>
+
+ <g display="none" transform="translate(22, 0)">
+ <rect x="3" y="10" width="16" height="32" display="inherit"/>
+ </g>
+
+ <g fill="#0F0" transform="translate(44, 0)">
+ <rect x="3" y="10" width="16" height="32" fill="inherit"/>
+ </g>
+
+ <g fill-rule="evenodd" transform="translate(66, 0)">
+ <polygon points="10.5,0 21,21 0,7 21,7 0,21" fill-rule="inherit" fill="#0F0" transform="translate(3, 15) scale(0.7)"/>
+ </g>
+
+ <g stroke="#0F0" transform="translate(88, 0)">
+ <rect x="3" y="10" width="16" height="32" stroke="inherit" fill="none"/>
+ </g>
+
+ <g stroke-dasharray="2,2,5,5" transform="translate(110, 0)">
+ <line x1="11" y1="5" x2="11" y2="40" stroke="#0F0" stroke-dasharray="inherit" stroke-width="2"/>
+ </g>
+
+ <g stroke-dashoffset="4" transform="translate(132, 0)">
+ <line x1="11" y1="5" x2="11" y2="40" stroke="#0F0" stroke-dashoffset="inherit" stroke-dasharray="2,2,5,5" stroke-width="2"/>
+ </g>
+
+ <g stroke-linecap="round" transform="translate(154, 0)">
+ <line x1="11" y1="10" x2="11" y2="40" stroke="#0F0" stroke-linecap="inherit" stroke-width="10"/>
+ </g>
+
+ <g stroke-linejoin="round" transform="translate(176, 0)">
+ <polyline points="3,40 11,10 19,40" stroke="#0F0" stroke-linejoin="inherit" stroke-width="5" fill="none"/>
+ </g>
+
+ <g stroke-miterlimit="1" transform="translate(198, 0)">
+ <polyline points="3,40 11,10 19,40" stroke="#0F0" stroke-miterlimit="inherit" stroke-width="5" fill="none"/>
+ </g>
+
+ <g stroke-width="5" transform="translate(220, 0)">
+ <line x1="11" y1="10" x2="11" y2="40" stroke="#0F0" stroke-width="inherit"/>
+ </g>
+
+ <g visibility="hidden" transform="translate(242, 0)">
+ <line x1="11" y1="10" x2="11" y2="40" stroke="#0F0" visibility="inherit"/>
+ </g>
+
+ <g font-family="serif" transform="translate(264, 0)">
+ <text x="11" y="30" font-size="20" text-anchor="middle" font-family="inherit">A</text>
+ </g>
+
+ <g font-size="10" transform="translate(286, 0)">
+ <text x="11" y="30" font-size="inherit" text-anchor="middle" font-family="serif">A</text>
+ </g>
+
+ <g font-style="italic" transform="translate(308, 0)">
+ <text x="11" y="30" font-style="inherit" text-anchor="middle" font-size="20" font-family="serif">A</text>
+ </g>
+
+ <g font-weight="bold" transform="translate(330, 0)">
+ <text x="11" y="30" font-weight="inherit" text-anchor="middle" font-family="serif" font-size="20">A</text>
+ </g>
+
+ <g text-anchor="middle" transform="translate(352, 0)">
+ <text x="11" y="30" text-anchor="inherit" font-family="serif" font-size="20">A</text>
+ </g>
+ </g>
+
+ <g id="referenceGroup" transform="translate(56, 205)">
+
+ <g>
+ <rect x="3" y="10" width="16" height="32" fill="#0F0"/>
+ </g>
+
+ <g transform="translate(22, 0)">
+ <rect x="3" y="10" width="16" height="32" display="none"/>
+ </g>
+
+ <g transform="translate(44, 0)">
+ <rect x="3" y="10" width="16" height="32" fill="#0F0"/>
+ </g>
+
+ <g transform="translate(66, 0)">
+ <polygon points="10.5,0 21,21 0,7 21,7 0,21" fill-rule="evenodd" fill="#0F0" transform="translate(3, 15) scale(0.7)"/>
+ </g>
+
+ <g transform="translate(88, 0)">
+ <rect x="3" y="10" width="16" height="32" stroke="#0F0" fill="none"/>
+ </g>
+
+ <g stroke-dasharray="2,2,5,5" transform="translate(110, 0)">
+ <line x1="11" y1="5" x2="11" y2="40" stroke="#0F0" stroke-dasharray="inherit" stroke-width="2"/>
+ </g>
+
+ <g transform="translate(132, 0)">
+ <line x1="11" y1="5" x2="11" y2="40" stroke="#0F0" stroke-dashoffset="4" stroke-dasharray="2,2,5,5" stroke-width="2"/>
+ </g>
+
+ <g transform="translate(154, 0)">
+ <line x1="11" y1="10" x2="11" y2="40" stroke="#0F0" stroke-linecap="round" stroke-width="10"/>
+ </g>
+
+ <g transform="translate(176, 0)">
+ <polyline points="3,40 11,10 19,40" stroke="#0F0" stroke-linejoin="round" stroke-width="5" fill="none"/>
+ </g>
+
+ <g transform="translate(198, 0)">
+ <polyline points="3,40 11,10 19,40" stroke="#0F0" stroke-miterlimit="1" stroke-width="5" fill="none"/>
+ </g>
+
+ <g transform="translate(220, 0)">
+ <line x1="11" y1="10" x2="11" y2="40" stroke="#0F0" stroke-width="5"/>
+ </g>
+
+ <g transform="translate(242, 0)">
+ <line x1="11" y1="10" x2="11" y2="40" stroke="#0F0" visibility="hidden"/>
+ </g>
+
+ <g transform="translate(264, 0)">
+ <text x="11" y="30" font-size="20" text-anchor="middle" font-family="serif">A</text>
+ </g>
+
+ <g transform="translate(286, 0)">
+ <text x="11" y="30" font-size="10" text-anchor="middle" font-family="serif">A</text>
+ </g>
+
+ <g transform="translate(308, 0)">
+ <text x="11" y="30" font-style="italic" text-anchor="middle" font-size="20" font-family="serif">A</text>
+ </g>
+
+ <g transform="translate(330, 0)">
+ <text x="11" y="30" font-weight="bold" text-anchor="middle" font-family="serif" font-size="20">A</text>
+ </g>
+
+ <g transform="translate(352, 0)">
+ <text x="11" y="30" text-anchor="middle" font-family="serif" font-size="20">A</text>
+ </g>
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.5 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/struct-svg-03-f-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/struct-svg-03-f-ref.png
new file mode 100644
index 00000000..f73399a0
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/struct-svg-03-f-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/struct-svg-03-f.svg b/rsvg/tests/fixtures/reftests/svg1.1/struct-svg-03-f.svg
new file mode 100644
index 00000000..0b03bb42
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/struct-svg-03-f.svg
@@ -0,0 +1,68 @@
+<svg id="svg-root" width="100%" height="100%"
+ viewBox="0 0 480 360" xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2008 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="[reviewer]" author="ED" status="created"
+ version="$Revision: 1.1 $" testname="$RCSfile: struct-svg-03-f.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/struct.html#ImageElement">
+ <p>
+ Test nested svg elements.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Passed if there are two green rectangles visible, and no red.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: struct-svg-03-f.svg,v $</title>
+ <defs>
+ <font-face
+ font-family="SVGFreeSansASCII"
+ unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+
+ <rect x="0.5" y="0.5" width="99" height="99" fill="red"/>
+ <svg width="100" height="100" viewBox="0 0 50 50">
+ <rect width="50" height="50" fill="lime"/>
+ </svg>
+
+ <g transform="translate(120 0)">
+ <rect x="0.5" y="0.5" width="99" height="99" fill="red"/>
+ <svg width="100" height="100" viewBox="0 0 50 50">
+ <svg width="50" height="50" viewBox="0 0 200 200">
+ <rect width="200" height="200" fill="lime"/>
+ </svg>
+ </svg>
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none"
+ fill="black">$Revision: 1.1 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000"/>
+ <g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/struct-symbol-01-b-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/struct-symbol-01-b-ref.png
new file mode 100644
index 00000000..f60c95a6
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/struct-symbol-01-b-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/struct-symbol-01-b.svg b/rsvg/tests/fixtures/reftests/svg1.1/struct-symbol-01-b.svg
new file mode 100644
index 00000000..ff95a6ac
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/struct-symbol-01-b.svg
@@ -0,0 +1,89 @@
+<svg version="1.1" baseProfile="basic" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="SVGWG" author="Tim Thompson" status="accepted"
+ version="$Revision: 1.7 $" testname="$RCSfile: struct-symbol-01-b.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/struct.html#SymbolElement">
+ <p>
+ The purpose of the symbol test case is to create some symbols and then
+ have them rendered when instantiated by the use element.
+ </p>
+ <p>
+ This file contains 3 symbol definitions. Only two are ever rendered.
+ There is a viewport defined to be 0,0,1000,1000 on the svg element.
+ Each symbol has is own viewport of the same dimensions. The symbols are
+ scaled when they are instantiated by the use element, The first set
+ of symbols is 4 squares, blue and yellow in color they should appear
+ in the lower right of the view arranged in a checkerboard fashion.
+ The second symbol to be used is an image which should appear in the
+ upper left of the view area. The symbol that is not used and should
+ not be rendered is a large black rectangle. If the symbols don't
+ appear, there is something askew with the use statement, if they
+ appear but either overlap each other or in some way aren't in the
+ correct positions they have not honored either their viewport or
+ were not scaled when placed by the use element in the area defined by
+ it. If everything is black then perhaps a symbol was rendered that
+ should not have been.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>The test passes if:</p>
+ <ul>
+ <li>An image is shown in the top left corner of the document.</li>
+ <li>A blue and yellow checkerboard pattern is shown in the bottom right corner of the document.</li>
+ <li>The background of the document is not filled with red.</li>
+ </ul>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: struct-symbol-01-b.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <symbol id="imageRef1" viewBox="0 0 1000 1000" preserveAspectRatio="none">
+ <image id="image1" x="0" y="0" width="1000" height="1000" xlink:href="resources/struct-symbol-01.png"/>
+ </symbol>
+ <symbol id="largeRect">
+ <rect x="0" y="0" width="1000" height="1000" fill="red"/>
+ </symbol>
+ <symbol id="drawRects" viewBox="0 0 1000 1000" preserveAspectRatio="none">
+ <rect x="0" y="0" width="500" height="500" fill="yellow"/>
+ <rect x="500" y="0" width="500" height="500" fill="blue"/>
+ <rect x="0" y="500" width="500" height="500" fill="blue"/>
+ <rect x="500" y="500" width="500" height="500" fill="yellow"/>
+ </symbol>
+ <g id="useNdraw">
+ <use id="upperLeft" x="0" y="0" width="240" height="150" xlink:href="#imageRef1"/>
+ <use id="lowerRight" x="240" y="150" width="240" height="150" xlink:href="#drawRects"/>
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.7 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/struct-use-01-t-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/struct-use-01-t-ref.png
new file mode 100644
index 00000000..3f0fde90
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/struct-use-01-t-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/struct-use-01-t.svg b/rsvg/tests/fixtures/reftests/svg1.1/struct-use-01-t.svg
new file mode 100644
index 00000000..e41a608d
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/struct-use-01-t.svg
@@ -0,0 +1,112 @@
+<svg version="1.1" baseProfile="tiny" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="CN" author="VH" status="accepted"
+ version="$Revision: 1.5 $" testname="$RCSfile: struct-use-01-t.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/struct.html#UseElement">
+ <p>
+ The purpose of this test is to validate proper handling of
+ the use element. In particular, the test checks the proper inheritance
+ of properties through the shadow tree (rather than through the document
+ tree).
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The test should display various elements in different shades of green.
+ If an element is not displayed in green, but in red fill and/or yellow
+ stroke, then it is in error.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: struct-use-01-t.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <defs>
+ <font-face font-family="FreeSerif" unicode-range="U+0020-U+00FF">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/FreeSerifBoldItalic.svg#FreeSerifBoldItalic"/>
+ </font-face-src>
+ </font-face>
+ <g fill="red" stroke="yellow" stroke-width="3">
+ <rect id="usedRect" width="20" height="20"/>
+ <circle id="usedCircle" cx="10" cy="10" r="10"/>
+ <ellipse id="usedEllipse" cx="10" cy="10" rx="10" ry="10"/>
+ <line id="usedLine" x1="0" y1="10" x2="20" y2="10"/>
+ <path id="usedPath" d="M 0 0 L 20 0 L 20 20 L 0 20 Z"/>
+ <polygon id="usedPolygon" points="0,0 20,0 20,20 0,20 0 0"/>
+ <polyline id="usedPolyline" points="0,0 20,0 20,20"/>
+ <g id="usedG">
+ <rect width="10" height="20"/>
+ <rect x="10" width="10" height="20" fill="rgb(0,128,0)"/>
+ </g>
+ <use id="usedUse" xlink:href="#usedRect"/>
+ <image id="usedImage" xlink:href="resources/20x20.png" width="20" height="20"/>
+ <text id="usedText">Text</text>
+ </g>
+ </defs>
+
+
+ <g>
+ <g id="labels" transform="translate(130, 40)" font-size="20" text-anchor="end">
+ <text>&lt;rect&gt;</text>
+ <text y="30">&lt;circle&gt;</text>
+ <text y="60">&lt;ellipse&gt;</text>
+ <text y="90">&lt;line&gt;</text>
+ <text y="120">&lt;polyline&gt;</text>
+ <text y="150">&lt;polygon&gt;</text>
+ <text y="180">&lt;path&gt;</text>
+ <text y="210">&lt;image&gt;</text>
+ <text y="240">&lt;text&gt;</text>
+ </g>
+ <g id="labelsColumn2" transform="translate(310, 40)" font-size="20" text-anchor="end">
+ <text>&lt;g&gt;</text>
+ <text y="30">&lt;use&gt;</text>
+ </g>
+ </g>
+ <g transform="translate(150, 25)">
+ <use xlink:href="#usedRect" fill="#0F0"/>
+ <use y="30" xlink:href="#usedCircle" fill="#0F0"/>
+ <use y="60" xlink:href="#usedEllipse" fill="#0F0"/>
+ <use y="90" xlink:href="#usedLine" stroke="#0F0" stroke-width="2"/>
+ <use y="120" xlink:href="#usedPolyline" stroke="#0F0" stroke-width="2" fill="none"/>
+ <use y="150" xlink:href="#usedPolygon" fill="#0F0"/>
+ <use y="180" xlink:href="#usedPath" fill="#0F0"/>
+ <use y="210" xlink:href="#usedImage" fill="#FF0"/>
+ <use y="260" xlink:href="#usedText" fill="#0F0" font-weight="bold" font-size="25" font-style="italic" font-family="FreeSerif,serif"/>
+ <use x="180" y="0" xlink:href="#usedG" fill="#0F0"/>
+ <use x="180" y="30" xlink:href="#usedUse" fill="#0c0"/>
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.5 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/struct-use-03-t-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/struct-use-03-t-ref.png
new file mode 100644
index 00000000..22d00c64
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/struct-use-03-t-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/struct-use-03-t.svg b/rsvg/tests/fixtures/reftests/svg1.1/struct-use-03-t.svg
new file mode 100644
index 00000000..00c6dc9d
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/struct-use-03-t.svg
@@ -0,0 +1,76 @@
+<svg version="1.1" baseProfile="tiny" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="CN" author="VH" status="accepted"
+ version="$Revision: 1.5 $" testname="$RCSfile: struct-use-03-t.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/struct.html#UseElement">
+ <p>
+ The purpose of this test is to validate proper handling of
+ the x/y attributes on the use element.
+ </p>
+ <p>
+ The test shows a &lt;use&gt; element displayed on the right.
+ On the left, a group built as described in section
+ 5.6 of the SVG 1.1 specification validates that the
+ &lt;use element is properly processed.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The test is passed if there are two identical diamond shapes visible.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: struct-use-03-t.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <defs>
+ <rect id="usedRect" width="100" height="100" fill="cyan" stroke="blue" stroke-width="20"/>
+ </defs>
+
+ <text x="120" y="60" text-anchor="middle">Reference</text>
+
+ <text x="360" y="60" text-anchor="middle">&lt;use&gt;</text>
+
+ <!-- This group is constructed as described in section 5.6 of the -->
+ <!-- SVG 1.1 Specification. -->
+ <g id="reference" transform="rotate(45,120,170) translate(70,120)">
+ <rect width="100" height="100" fill="cyan" stroke="blue" stroke-width="20"/>
+ </g>
+
+ <g transform="translate(240, 0)">
+ <use xlink:href="#usedRect" x="70" y="120" transform="rotate(45,120,170)"/>
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.5 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/struct-use-04-b-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/struct-use-04-b-ref.png
new file mode 100644
index 00000000..d1050b0b
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/struct-use-04-b-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/struct-use-04-b.svg b/rsvg/tests/fixtures/reftests/svg1.1/struct-use-04-b.svg
new file mode 100644
index 00000000..fd76e7a8
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/struct-use-04-b.svg
@@ -0,0 +1,65 @@
+<svg version="1.1" baseProfile="basic" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="CL" author="BB" status="accepted"
+ version="$Revision: 1.6 $" testname="$RCSfile: struct-use-04-b.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/struct.html#UseElement">
+ <p>
+ The intent of the file is to determine if the UA supports references to external SVG fragments.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ See referenced image.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ To pass this test, the UA agent must display a total of 8 graphical
+ primitives (2 rectangles, 2 circles, 2 ellipses and 2 triangles).
+ For each pair of objects, one is a semi-transparent duplicate
+ copy at the other displayed at an offset position..
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: struct-use-04-b.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <g id="ExtContent">
+ <use xlink:href="resources/svgRef4.svg#alpha"/>
+ <use xlink:href="resources/svgRef4.svg#beta"/>
+ <use xlink:href="resources/svgRef4.svg#gamma"/>
+ <use xlink:href="resources/svgRef4.svg#delta"/>
+
+ <use xlink:href="resources/svgRef4.svg#testContent" x="-5" y="5" fill-opacity="0.5"/>
+ </g>
+
+ <text font-size="20" x="240" y="30" text-anchor="middle">External references on &lt;use&gt;</text>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.6 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved
+ <g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/struct-use-09-b-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/struct-use-09-b-ref.png
new file mode 100644
index 00000000..6b8b58d6
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/struct-use-09-b-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/struct-use-09-b.svg b/rsvg/tests/fixtures/reftests/svg1.1/struct-use-09-b.svg
new file mode 100644
index 00000000..756ecf1b
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/struct-use-09-b.svg
@@ -0,0 +1,74 @@
+<svg version="1.1" baseProfile="basic" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="CM" author="AN" status="reviewed"
+ version="$Revision: 1.5 $" testname="$RCSfile: struct-use-09-b.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/struct.html#UseElement">
+ <p>
+ This tests the use element inside a symbol definition.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>Run the test. No interaction required.</p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ For the test to pass, 5 nested rectangles with different coloured strokes
+ (black, yellow, orange, purple and blue) must be rendered.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: struct-use-09-b.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <!-- put all of the actual test here -->
+ <defs>
+ <symbol id="rect1" overflow="visible">
+ <rect x="-50" y="-50" width="100" height="100" fill="none" stroke="slateblue" stroke-width="5"/>
+ </symbol>
+ <symbol id="rect2" overflow="visible">
+ <use xlink:href="#rect1"/>
+ <rect x="-60" y="-60" width="120" height="120" fill="none" stroke="purple" stroke-width="5"/>
+ </symbol>
+ <symbol id="rect3" overflow="visible">
+ <use xlink:href="#rect2"/>
+ <rect x="-70" y="-70" width="140" height="140" fill="none" stroke="orange" stroke-width="5"/>
+ </symbol>
+ <symbol id="rect4" overflow="visible">
+ <use xlink:href="#rect3"/>
+ <rect x="-80" y="-80" width="160" height="160" fill="none" stroke="gold" stroke-width="5"/>
+ </symbol>
+ <symbol id="rects" overflow="visible">
+ <use xlink:href="#rect4"/>
+ <rect x="-90" y="-90" width="180" height="180" fill="none" stroke="black" stroke-width="5"/>
+ </symbol>
+ </defs>
+ <use x="240" y="180" xlink:href="#rects"/>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.5 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/struct-use-10-f-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/struct-use-10-f-ref.png
new file mode 100644
index 00000000..228b899e
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/struct-use-10-f-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/struct-use-10-f.svg b/rsvg/tests/fixtures/reftests/svg1.1/struct-use-10-f.svg
new file mode 100644
index 00000000..ebadc034
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/struct-use-10-f.svg
@@ -0,0 +1,130 @@
+<svg version="1.1" baseProfile="full" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="DOH" author="ED" status="accepted"
+ version="$Revision: 1.6 $" testname="$RCSfile: struct-use-10-f.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/struct.html#UseElement">
+ <p>
+ Properties are inherited according to the 'use' element rules, CSS selectors only apply to the original elements
+ and not the (conceptually) cloned DOM tree.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The test has passed if the three rectangles have green fill and a thick darkgreen stroke. If any red shows the test has failed.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: struct-use-10-f.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <style type="text/css">
+
+ /* low specificity */
+ defs &gt; rect {
+ fill:red;
+ }
+
+ /* applies because of higher specificity */
+ .testclass1 {
+ fill:green;
+ }
+
+ /* does not apply because selectors don't apply to the (conceptually) cloned subtree */
+ #testid1 .testclass1 {
+ fill: red;
+ }
+
+ /* does not apply because of case sensitivity of class value */
+ g .testClass1 {
+ fill:red;
+ }
+
+ /* does not apply because of lower specificity */
+ #g1 .testclass2
+ {
+ fill: red
+ }
+
+ /* does not apply to the used rect, because there is no inheritance from the original tree into the used subtree */
+ g#g1 {
+ visibility: hidden
+ }
+
+ /* applies because of higher specificity */
+ #testid2 {
+ stroke:darkgreen;
+ }
+
+ /* no effect for the used rect, can be referenced anyway into the used subtree */
+ g#g2 {
+ display: none;
+ }
+
+ /* applies directly to the original (referenced) rect element */
+ .testclass3 &gt; rect {
+ fill: green;
+ stroke:darkgreen;
+ }
+
+ /* does not apply to the used rect, because there is no direct access with selectors into the used subtree */
+ #testid3 rect {
+ stroke:red;
+ }
+ #testid3 rect#testrect3 {
+ fill:red;
+ }
+ </style>
+
+ <defs>
+ <rect id="testrect1" class="testclass1" width="100" height="100"/>
+ <g id="g1" style="fill:red">
+ <rect id="testrect2" class="testclass2" width="100" height="100" style="fill:green"/>
+ </g>
+ <g id="g2" class="class testclass3 g">
+ <rect id="testrect3" width="100" height="100" stroke="red"/>
+ </g>
+ </defs>
+
+ <text x="50%" y="3em" style="text-anchor:middle; fill:black">CSS selectors and use element</text>
+
+ <circle class="indicator" cx="240" cy="150" r="25" fill="red"/>
+ <circle class="indicator" cx="390" cy="150" r="25" fill="red"/>
+
+ <use id="testid1" xlink:href="#testrect1" x="40" y="100" style="stroke:darkgreen" stroke-width="10"/>
+ <use id="testid2" xlink:href="#testrect2" x="190" y="100" stroke="red" stroke-width="10"/>
+ <use id="testid3" xlink:href="#testrect3" x="340" y="100" style="stroke:red" stroke-width="10"/>
+
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.6 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/styling-css-01-b-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/styling-css-01-b-ref.png
new file mode 100644
index 00000000..9f425a52
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/styling-css-01-b-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/styling-css-01-b.svg b/rsvg/tests/fixtures/reftests/svg1.1/styling-css-01-b.svg
new file mode 100644
index 00000000..c1e629e2
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/styling-css-01-b.svg
@@ -0,0 +1,90 @@
+<svg version="1.1" baseProfile="basic" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="SVGWG" author="Chris lilley" status="accepted"
+ version="$Revision: 1.6 $" testname="$RCSfile: styling-css-01-b.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/styling.html#StylingWithCSS">
+ <p>
+ Test element and class selectors.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+The test is passed if all six shapes have a green fill.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: styling-css-01-b.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <defs>
+ <defs>
+ <style type="text/css">
+ rect { fill: green }
+ .warning { fill: green }
+ .bar {fill: green}
+ </style>
+ </defs>
+ </defs>
+ <!-- ====================================================================== -->
+ <!-- Element (GI) selectors =============================================== -->
+ <!-- ====================================================================== -->
+
+ <text style="font-size:12px;" x="40" y="36">
+ element selectors:
+ </text>
+
+ <circle cx="160" cy="100" r="30" fill="green"/>
+ <g style="fill: red">
+ <rect x="220" y="80" width="60" height="40"/>
+ </g>
+ <polygon points="300,100, 320,120, 340,110, 360,120, 390,90, 340,70" fill="green"/>
+
+ <!-- ====================================================================== -->
+ <!-- class selectors =============================================== -->
+ <!-- ====================================================================== -->
+ <g transform="translate(0, 150)">
+
+ <text style="font-size:12px;" x="40" y="36">
+ class selectors:
+ </text>
+
+ <g style="fill: red">
+ <circle class="warning" cx="160" cy="100" r="30"/>
+ <rect x="220" y="80" width="60" height="40"/>
+ <polygon class="foo bar baz" points="300,100, 320,120, 340,110, 360,120, 390,90, 340,70"/>
+ </g>
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.6 $</text>
+ </g>
+ <rect id="test-frame" style="fill: none;stroke:#000" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/styling-css-02-b-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/styling-css-02-b-ref.png
new file mode 100644
index 00000000..149c98fb
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/styling-css-02-b-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/styling-css-02-b.svg b/rsvg/tests/fixtures/reftests/svg1.1/styling-css-02-b.svg
new file mode 100644
index 00000000..87b5fbaa
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/styling-css-02-b.svg
@@ -0,0 +1,85 @@
+<svg version="1.1" baseProfile="basic" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="SVGWG" author="Chris lilley" status="accepted"
+ version="$Revision: 1.6 $" testname="$RCSfile: styling-css-02-b.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/styling.html#StylingWithCSS">
+ <p>
+ Test ID and attribute selectors
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The test is passed if all six shapes have a green fill.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: styling-css-02-b.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <defs>
+ <style type="text/css">
+ #one, #two { fill: green }
+ [transform="scale(2)"] { fill: green }
+ #x [points] { fill: green }
+ </style>
+ </defs>
+ <!-- ====================================================================== -->
+ <!-- ID selectors selectors ============================================== -->
+ <!-- ====================================================================== -->
+ <text style="font-size:12px;" x="40" y="36">
+ id selectors:
+ </text>
+ <g style="fill: green">
+ <circle cx="160" cy="100" r="30"/>
+ <polygon points="300,100, 320,120, 340,110, 360,120, 390,90, 340,70"/>
+ </g>
+ <g style="fill: red">
+ <rect id="one" x="220" y="80" width="60" height="40"/>
+ </g>
+ <!-- ====================================================================== -->
+ <!-- attribute selectors ================================================= -->
+ <!-- ====================================================================== -->
+ <g transform="translate(0, 150)">
+ <text style="font-size:12px;" x="40" y="36">
+ attribute selectors:
+ </text>
+
+ <g style="fill: red" id="x">
+ <circle transform="scale(2)" cx="80" cy="50" r="15"/>
+ <rect id="two" x="220" y="80" width="60" height="40"/>
+ <polygon points="300,100, 320,120, 340,110, 360,120, 390,90, 340,70"/>
+ </g>
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.6 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/styling-css-03-b-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/styling-css-03-b-ref.png
new file mode 100644
index 00000000..92ec59fa
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/styling-css-03-b-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/styling-css-03-b.svg b/rsvg/tests/fixtures/reftests/svg1.1/styling-css-03-b.svg
new file mode 100644
index 00000000..7a830bd9
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/styling-css-03-b.svg
@@ -0,0 +1,106 @@
+<svg version="1.1" baseProfile="basic" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="SVGWG" author="Chris lilley" status="accepted"
+ version="$Revision: 1.6 $" testname="$RCSfile: styling-css-03-b.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/styling.html#StylingWithCSS">
+ <p>
+ Test ancestor, child and sibling selectors.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The test is passed if all six shapes have a green fill.
+ </p>
+ </d:passCriteria>
+ <!--
+ In the upper test, the selector 'immediate child' selects all elements of class
+ 'thischild' which are immediate children of the elements of class 'mummy'. The
+ rectangle and the polygon are of class'thischild' but the polygon is not an immediate
+ child so must not be selected. The rectangle must be green, the circle and polygon
+ must be green.
+ In the lower test, the 'adjacent sibling' selector matches elements of
+ class 'secundus' which are adjacent to a previous sibling of class 'primus';
+ this makes the rectangle in the second test green. The first-child pseudoclass matches
+ circles which are the first child of elements of class 'mummy' and if correctly
+ selected this circle will be filled green. (The circle in the upper test is not
+ the first child).
+ -->
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: styling-css-03-b.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+
+ <defs>
+ <style type="text/css">
+ .mummy {fill: green } /* least specific */
+ .mummy rect { fill: red} /* more specific, make rect red */
+ .mummy &gt; .thischild { fill: green } /* even more specific, rect green */
+ .child {fill: red}
+ .gap &gt; .thischild { fill: green}
+ .daddy {fill: red }
+ .daddy &gt; .tertius {fill: green} /* bottom poly green */
+ .primus + .secundus { fill: green } /* bottom rect green */
+ .daddy :first-child { fill: green} /* bottom circle green */
+ </style>
+ </defs>
+
+ <text style="font-family:SVGFreeSansASCII;font-size:12px;" x="40" y="36">
+ ancestor selectors and child selectors:
+ </text>
+
+ <g class="mummy">
+ <rect class="thischild" x="220" y="80" width="60" height="40"/>
+ <circle cx="160" cy="100" r="30"/>
+ <g class="child">
+ <g class="generation gap">
+ <polygon class="thischild" points="300,100, 320,120, 340,110, 360,120, 390,90, 340,70"/>
+ </g>
+ </g>
+ </g>
+
+ <g transform="translate(0, 150)">
+ <text style="font-family:SVGFreeSansASCII;font-size:12px;" x="40" y="36">
+ ancestor, immediate-sibling and first-child selectors:
+ </text>
+
+ <g class="daddy">
+ <circle class="primus" cx="160" cy="100" r="30"/>
+ <rect class="secundus" x="220" y="80" width="60" height="40"/>
+ <polygon class="tertius" points="300,100, 320,120, 340,110, 360,120, 390,90, 340,70"/>
+ </g>
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.6 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/styling-css-04-f-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/styling-css-04-f-ref.png
new file mode 100644
index 00000000..c29ee520
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/styling-css-04-f-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/styling-css-04-f.svg b/rsvg/tests/fixtures/reftests/svg1.1/styling-css-04-f.svg
new file mode 100644
index 00000000..90025a2b
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/styling-css-04-f.svg
@@ -0,0 +1,157 @@
+<svg version="1.1" baseProfile="full" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="CL" author="BB" status="accepted"
+ version="$Revision: 1.8 $" testname="$RCSfile: styling-css-04-f.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/styling.html#StylingWithCSS">
+ <p>
+ This purpose of the file is to test some of the CSS2 selector syntax.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ A UA supporting CSS selectors should render an image identical to the referenced image.
+ </p>
+
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The test is passed if a grid of 6x3 squares is shown, the colors in each column
+ are the same and are those of the reference image (blue, green, orange, gold, purple and silver)
+ </p>
+ <p>
+ For a full analysis of this test, please see
+ <a href="http://www.w3.org/Graphics/SVG/Test/styling-css-04-f/blow-by-blow.html" target="css">
+ this explanation.
+ </a>
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: styling-css-04-f.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <g fill="white">
+ <text x="240" y="35" font-size="20" text-anchor="middle">CSS selector test</text>
+ <defs>
+ <style type="text/css">
+ * {stroke:red; stroke-width:1;} /* 0 */
+ text {stroke:none; fill:black;} /* 1 */
+ rect {stroke:black; stroke-dasharray:none;} /* 1 */
+ #test-frame {fill:none} /* 100 */
+ g#alpha {fill:blue} /* 101 */
+ a#alpha {fill:red} /* 101 */
+ #alpha * rect {fill:green} /* 101 */
+ #alpha-2 > rect {fill:orange} /* 101 */
+ #beta rect {fill:gold} /* 101 */
+ g#gamma * g * * rect {fill:silver} /* 103 */
+ g#gamma * * rect {fill:purple} /* 102 */
+ [stroke-width="1.0001"] {fill:blue} /* 10 */
+ g#delta rect[stroke-width="1.0002"] {fill:green} /* 112 */
+ g#delta > rect[stroke-width="1.0003"] {fill:orange} /* 102 */
+ #delta + g > * {fill:gold} /* 101 */
+ g#delta + g > rect + rect {fill:purple} /* 104 */
+ #delta + g#epsilon * rect:first-child {fill:silver} /* 202 */
+ #zeta [cursor] {fill:blue} /* 110 */
+ g#zeta [cursor="help"] {fill:green} /* 111 */
+ g#zeta [rx~="3E"] {fill:orange} /* 111 */
+ g#epsilon + g [stroke-dasharray|="3.1415926"] {fill:gold} /* 112 */
+ g#epsilon + g > rect.hello {fill:purple} /* 113 */
+ g#eta rect:first-child {fill:silver} /* 102 */
+ </style>
+ </defs>
+ <g id="alpha">
+ <rect x="30" y="70" width="67.5" height="67.5" id="A1"/>
+ <g id="alpha-1">
+ <rect x="100" y="70" width="67.5" height="67.5" id="B1" />
+ </g>
+ <g id="alpha-2">
+ <rect x="170" y="70" width="67.5" height="67.5" id="C1"/>
+ </g>
+ </g>
+ <g id="beta">
+ <g>
+ <g>
+ <g>
+ <g>
+ <g>
+ <rect x="240" y="70" width="67.5" height="67.5" id="D1"/>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ <g id="gamma">
+ <g>
+ <g>
+ <rect x="310" y="70" width="67.5" height="67.5" id="E1"/>
+ <g>
+ <g>
+ <rect x="380" y="70" width="67.5" height="67.5" id="F1"/>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ <g id="delta">
+ <rect x="30" y="140" width="67.5" height="67.5" stroke-width="1.0001" id="A2"/>
+ <rect x="100" y="140" width="67.5" height="67.5" stroke-width="1.0002" id="B2"/>
+ <rect x="170" y="140" width="67.5" height="67.5" stroke-width="1.0003" id="C2"/>
+ </g>
+ <g id="epsilon">
+ <rect x="240" y="140" width="67.5" height="67.5" id="D2"/>
+ <rect x="310" y="140" width="67.5" height="67.5" id="E2"/>
+ <g>
+ <rect x="380" y="140" width="67.5" height="67.5" id="F2"/>
+ </g>
+ </g>
+ <g id="zeta">
+ <rect x="30" y="210" width="67.5" height="67.5" cursor="default" id="A3"/>
+ <rect x="100" y="210" width="67.5" height="67.5" cursor="help" id="B3"/>
+ <rect x="170" y="210" width="67.5" height="67.5" stroke-dasharray="5, 3.14" id="C3" style="fill:orange"/>
+ <rect x="240" y="210" width="67.5" height="67.5" rx="3E-6" stroke-dasharray="3.1415926,8" id="D3" style="fill:gold"/>
+ <rect x="310" y="210" width="67.5" height="67.5" class="hello" id="E3"/>
+ </g>
+ <g id="eta">
+ <rect x="380" y="210" width="67.5" height="67.5" id="F3"/>
+ </g>
+ <g id="labels" font-size="16" font-family="Arial, Helvetica, sans-serif">
+ <text x="64" y="60" text-anchor="middle">A</text>
+ <text x="133" y="60" text-anchor="middle">B</text>
+ <text x="200" y="60" text-anchor="middle">C</text>
+ <text x="270" y="60" text-anchor="middle">D</text>
+ <text x="340" y="60" text-anchor="middle">E</text>
+ <text x="410" y="60" text-anchor="middle">F</text>
+ <text x="20" y="113" text-anchor="middle">1</text>
+ <text x="20" y="183" text-anchor="middle">2</text>
+ <text x="20" y="253" text-anchor="middle">3</text>
+ </g>
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.8 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/styling-css-07-f-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/styling-css-07-f-ref.png
new file mode 100644
index 00000000..3b047265
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/styling-css-07-f-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/styling-css-07-f.svg b/rsvg/tests/fixtures/reftests/svg1.1/styling-css-07-f.svg
new file mode 100644
index 00000000..f036f6da
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/styling-css-07-f.svg
@@ -0,0 +1,62 @@
+<svg id="svg-root" width="100%" height="100%"
+ viewBox="0 0 480 360" xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= Copyright 2008 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="CL" author="Microsoft" status="accepted"
+ version="$Revision: 1.3 $" testname="$RCSfile: styling-css-07-f.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/styling.html#StylingWithCSS">
+ <p>
+ Tests that inline CSS styling (style attributes) is supported.
+ </p>
+ <p>
+ Specifies an inline 'visibility: hidden' style rule on a red element and verifies there is no red on the page.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Test passes if a green rectangle is visible, and there is no red visible on the page.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: styling-css-07-f.svg,v $</title>
+ <defs>
+ <font-face
+ font-family="SVGFreeSansASCII"
+ unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+
+ <rect x="10" y="10" height="100" width="200" fill="green" />
+ <rect x="10" y="10" height="100" width="200" style="visibility: hidden;" fill="red" />
+
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none"
+ fill="black">$Revision: 1.3 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--
+ <g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>
+ -->
+</svg> \ No newline at end of file
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/styling-css-08-f-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/styling-css-08-f-ref.png
new file mode 100644
index 00000000..a1352b3a
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/styling-css-08-f-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/styling-css-08-f.svg b/rsvg/tests/fixtures/reftests/svg1.1/styling-css-08-f.svg
new file mode 100644
index 00000000..8f18acda
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/styling-css-08-f.svg
@@ -0,0 +1,116 @@
+<svg id="svg-root" width="100%" height="100%"
+ viewBox="0 0 480 360" xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= Copyright 2008 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="ED" author="Microsoft" status="accepted"
+ version="$Revision: 1.3 $" testname="$RCSfile: styling-css-08-f.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/styling.html#StylingWithCSS">
+ <p>
+ Test that CSS styling via the 'style' element is supported.
+ </p>
+ <p>
+ For each of a representative sampling of selectors, specify a 'visibility: hidden' style rule and add a corresponding red
+ element to the markup. A reference in green is shown for each shape.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The test is passed if there is no red visible on the page and there are seven green shapes visible.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: styling-css-08-f.svg,v $</title>
+ <defs>
+ <font-face
+ font-family="SVGFreeSansASCII"
+ unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+
+ <style type="text/css"><![CDATA[
+ path
+ {
+ visibility: hidden;
+ }
+ g svg circle
+ {
+ visibility: hidden;
+ }
+ g > ellipse
+ {
+ visibility: hidden;
+ }
+ ellipse + circle
+ {
+ visibility: hidden;
+ }
+ [id=testAttributeSelector]
+ {
+ visibility: hidden;
+ }
+ #testIdSelector
+ {
+ visibility: hidden;
+ }
+ #testPseudoClassSelector:first-child
+ {
+ visibility: hidden;
+ }
+ .reference { visibility: visible !important }
+ ]]>
+ </style>
+
+ <path class="reference" d="M 50 125 L 150 125 L 100 75 z" fill="lime" visibility="hidden"/>
+ <path id="testTypeSelector" d="M 50 125 L 150 125 L 100 75 z" fill="red" />
+ <g>
+ <svg width="200" height="200">
+ <circle class="reference" cx="50" cy="175" r="25" fill="lime" visibility="hidden"/>
+ <circle id="testDescendantSelector" cx="50" cy="175" r="25" fill="red" />
+ </svg>
+ </g>
+ <g id="testParentContainer">
+ <ellipse class="reference" cx="160" cy="200" rx="25" ry="45" fill="lime" visibility="hidden"/>
+ <circle class="reference" cx="100" cy="300" r="40" fill="lime" visibility="hidden"/>
+ <ellipse id="testChildSelector" cx="160" cy="200" rx="25" ry="45" fill="red" />
+ <circle id="testAdjacentSiblingSelector" cx="100" cy="300" r="40" fill="red" />
+ </g>
+ <circle class="reference" cx="300" cy="80" r="35" fill="lime" visibility="hidden"/>
+ <circle id="testAttributeSelector" cx="300" cy="80" r="35" fill="red" />
+
+ <circle class="reference" cx="400" cy="140" r="50" fill="lime" visibility="hidden"/>
+ <circle id="testIdSelector" cx="400" cy="140" r="50" fill="red" />
+
+ <rect class="reference" x="270" y="240" width="150" height="80" fill="lime" visibility="hidden"/>
+ <g>
+ <rect id="testPseudoClassSelector" x="270" y="240" width="150" height="80" fill="red" />
+ </g>
+
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none"
+ fill="black">$Revision: 1.3 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000"/>
+ <!-- comment out this watermark once the test is approved
+ <g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g> -->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/text-align-01-b-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/text-align-01-b-ref.png
new file mode 100644
index 00000000..2eeb41f3
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/text-align-01-b-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/text-align-01-b.svg b/rsvg/tests/fixtures/reftests/svg1.1/text-align-01-b.svg
new file mode 100644
index 00000000..d6d6eb5a
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/text-align-01-b.svg
@@ -0,0 +1,80 @@
+<svg version="1.1" baseProfile="basic" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="SVGWG" author="Jon Ferraiolo" status="accepted"
+ version="$Revision: 1.8 $" testname="$RCSfile: text-align-01-b.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/text.html#AlignmentProperties">
+ <p>
+ Test 'text-anchor' property (horizontal).
+ </p>
+ <p>
+ The three lines test the three values for property 'text-anchor': start, middle and end.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The lines in pink, 'text-anchor:none' and 'text-anchor:start', should both start from the same horizontal position (indicated by the black circle on each line) and extend to the right.
+ The green line, 'text-anchor:middle', should be centered horizontally around the black circle.
+ The blue line, 'text-anchor:end', should be aligned such that the end of the text meets the black circle.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: text-align-01-b.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <text font-size="34" x="5" y="40">Test 'text-anchor' (horizontal)</text>
+ <g id="text-anchor" font-size="14">
+ <g transform="translate(230,130)">
+ <line stroke="black" x2="50"/>
+ <circle r="3"/>
+ <text font-size="30" fill="fuchsia">text-anchor:none</text>
+ </g>
+ <g transform="translate(230,180)">
+ <line stroke="black" x2="50"/>
+ <circle r="3"/>
+ <text font-size="30" text-anchor="start" fill="fuchsia">text-anchor:start</text>
+ </g>
+ <g transform="translate(230,230)">
+ <line stroke="black" x1="-25" x2="25"/>
+ <circle r="3"/>
+ <text font-size="30" text-anchor="middle" fill="green">text-anchor:middle</text>
+ </g>
+ <g transform="translate(230,280)">
+ <line stroke="black" x1="-50" x2="0"/>
+ <circle r="3"/>
+ <text font-size="30" text-anchor="end" fill="blue">text-anchor:end</text>
+ </g>
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.8 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/text-align-02-b-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/text-align-02-b-ref.png
new file mode 100644
index 00000000..445e9572
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/text-align-02-b-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/text-align-02-b.svg b/rsvg/tests/fixtures/reftests/svg1.1/text-align-02-b.svg
new file mode 100644
index 00000000..d172d84c
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/text-align-02-b.svg
@@ -0,0 +1,71 @@
+<svg version="1.1" baseProfile="basic" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="SVGWG" author="Jon Ferraiolo" status="accepted"
+ version="$Revision: 1.8 $" testname="$RCSfile: text-align-02-b.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/text.html#AlignmentProperties">
+ <p>
+ Test the 'baseline-shift' property (horizontal).
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ This three lines test property 'baseline-shift'.
+ The first line tests 'baseline-shift:7' (i.e., a length for 'baseline-shift').
+ The pink text should be shifted upwards by an amount approximately half of the height of the text.
+ The second line tests 'baseline-shift:-70%' (i.e., a percentage for 'baseline-shift').
+ The pink text should shift downward by about the height of the text.
+ The third line tests the three keywords 'sub', 'super' and 'normal'.
+ The string "sub" should be shifted downwards, the string "super" shifted upwards,
+ and the string "te" (in blue) aligned with the remainder of the text in the line.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: text-align-02-b.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <text font-size="34" x="5" y="40">Test 'baseline-shift' (horizontal)</text>
+ <g id="baseline-shift" font-size="30" transform="translate(15,120)">
+ <text y="0">
+ Normal<tspan baseline-shift="7" fill="fuchsia">baseline-shift:7</tspan>text
+ </text>
+ <text y="70">
+ Normal<tspan baseline-shift="-70%" fill="fuchsia">baseline-shift:-70%</tspan>text
+ </text>
+ <text y="140">
+ Normal<tspan baseline-shift="sub" fill="fuchsia">sub</tspan><tspan baseline-shift="super" fill="green">super</tspan><tspan baseline-shift="baseline" fill="blue">te</tspan>xt
+ </text>
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.8 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/text-align-03-b-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/text-align-03-b-ref.png
new file mode 100644
index 00000000..9469ee17
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/text-align-03-b-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/text-align-03-b.svg b/rsvg/tests/fixtures/reftests/svg1.1/text-align-03-b.svg
new file mode 100644
index 00000000..19bbf7c5
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/text-align-03-b.svg
@@ -0,0 +1,82 @@
+<svg version="1.1" baseProfile="basic" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="SVGWG" author="Lofton Henderson" status="accepted"
+ version="$Revision: 1.7 $" testname="$RCSfile: text-align-03-b.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/text.html#AlignmentProperties">
+ <p>
+ Test for viewer capibility to handle the basics of the 'textAnchor'
+ alignment property for 'text' and related elements.
+ </p>
+ <p>
+ This test verify that
+ the interpreter correctly handles and applies the text-anchor
+ properties when present on "chunks", which are comprised of tspan elements
+ with absolute positioning, within the containing 'text' element.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The test is passed if
+ </p>
+ <ul>
+ <li>
+ The text "Begin with "end"," ends just to the left of the vertical pink
+ line.
+ </li>
+ <li>
+ The text "switch to "middle" in a tspan," is split by the vertical pink
+ line roughly through the second 'd' in the world "middle".
+ </li>
+ <li>
+ The text "and "start" ends it." begins just to the right of the
+ vertical pink line.
+ </li>
+ </ul>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: text-align-03-b.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <text x="5" y="40" font-size="40" fill="black">Test of 'text-anchor'</text>
+
+ <!-- Test cases -->
+ <line x1="225" y1="75" x2="225" y2="225" stroke="fuchsia"/>
+ <g font-size="30" fill="blue">
+ <text x="225" y="110" text-anchor="end">
+ Begin with "end",<tspan x="225" y="160" xml:space="preserve" text-anchor="middle"> switch to "middle" in a tspan, </tspan><tspan x="225" y="210" text-anchor="start">and "start" ends it.</tspan>
+ </text>
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.7 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/text-fonts-02-t-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/text-fonts-02-t-ref.png
new file mode 100644
index 00000000..d173351a
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/text-fonts-02-t-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/text-fonts-02-t.svg b/rsvg/tests/fixtures/reftests/svg1.1/text-fonts-02-t.svg
new file mode 100644
index 00000000..ba294714
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/text-fonts-02-t.svg
@@ -0,0 +1,92 @@
+<svg version="1.1" baseProfile="tiny" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="SVGWG" author="Chris lilley" status="accepted"
+ version="$Revision: 1.5 $" testname="$RCSfile: text-fonts-02-t.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/text.html#FontPropertiesUsedBySVG">
+ <p>
+ Purpose of test is to determine if the font weight is being
+ correctly rendered. A number of font families are specified. The
+ numerical weight values (100 to 900) should show the lighter weights
+ on the lower numbers and the heavier weights on the larger numbers.
+ Heavier is defined to mean 'no lighter'.
+ </p>
+ <p>
+ If only one font weight is available, they should all display at the
+ same weight. The transition from black to green figures shows the
+ correct light to bold transition for the common case where two
+ weights are available. If three or more weights are available, see
+ the CSS2 specification for how these are allocated to the nine
+ weight numbers.
+ </p>
+ <p>
+ The absolute keywords 'normal' and bold' are tested
+ by the first two lines on the right hand side of the test,
+ the third line of text tests the to 'bolder'
+ relative keyword and the fourth tests the
+ 'lighter' relative keyword.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The numerical weight values (100 to 900) should show the lighter weights on the
+ lower numbers and the heavier weights on the larger numbers. Heavier is defined
+ to mean 'no lighter'.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: text-fonts-02-t.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <g font-family="Georgia,'Times New Roman',Times,'MS Mincho',serif" font-size="30">
+ <text font-weight="100" x="360" y="50">100</text>
+ <text font-weight="200" x="360" y="85">200</text>
+ <text font-weight="300" x="360" y="120">300</text>
+ <text font-weight="400" x="360" y="155">400</text>
+ <text font-weight="500" x="360" y="190">500</text>
+ <text fill="green" font-weight="600" x="360" y="225">600</text>
+ <text fill="green" font-weight="700" x="360" y="260">700</text>
+ <text fill="green" font-weight="800" x="360" y="295">800</text>
+ <text fill="green" font-weight="900" x="360" y="330">900</text>
+ <text font-weight="bold" x="60" y="80">This is bold</text>
+ <text font-weight="normal" x="60" y="130">This is normal</text>
+ <g font-weight="normal" fill="blue">
+ <text font-weight="bolder" x="60" y="180">Blue is bolder</text>
+ </g>
+ <g font-weight="bold" fill="blue">
+ <text font-weight="lighter" x="60" y="230">Blue is lighter</text>
+ </g>
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.5 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/text-text-03-b-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/text-text-03-b-ref.png
new file mode 100644
index 00000000..14e1b24c
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/text-text-03-b-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/text-text-03-b.svg b/rsvg/tests/fixtures/reftests/svg1.1/text-text-03-b.svg
new file mode 100644
index 00000000..5f8617b7
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/text-text-03-b.svg
@@ -0,0 +1,94 @@
+<svg version="1.1" baseProfile="basic" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="SVGWG" author="Shenxue Zhou" status="accepted"
+ version="$Revision: 1.9 $" testname="$RCSfile: text-text-03-b.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/text.html#TextElement">
+ <p>
+ Test text element, tspan element and various text decorations
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The test is passed if:
+ </p>
+ <ul>
+ <li>the word "Plain" is displayed using a blue serif font</li>
+ <li>the word "Italic" is displayed using a blue italic serif font</li>
+ <li>the word "Bold" is displayed using a blue serif bold font</li>
+ <li>the words "Line through" are displayed with a line through, using a pink serif font</li>
+ <li>the word "Underline" is displayed underlined using a blue serif font</li>
+ <li>the words "Bold, italic and underlined" are displayed underlined using a bold italic serif font</li>
+ </ul>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: text-text-03-b.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ <font-face font-family="FreeSerif" unicode-range="U+0-7F" font-weight="400">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/FreeSerif.svg#FreeSerif"/>
+ </font-face-src>
+ </font-face>
+ <font-face font-family="FreeSerif" unicode-range="U+0-7F" font-weight="700">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/FreeSerifBold.svg#FreeSerifBold"/>
+ </font-face-src>
+ </font-face>
+ <font-face font-family="FreeSerif" unicode-range="U+0-7F" font-weight="400" font-style="italic">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/FreeSerifItalic.svg#FreeSerifItalic"/>
+ </font-face-src>
+ </font-face>
+ <font-face font-family="FreeSerif" unicode-range="U+0-7F" font-weight="700" font-style="italic">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/FreeSerifBoldItalic.svg#FreeSerifBoldItalic"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="FreeSerif, serif" font-size="18">
+ <text x="19" y="61" font-size="32" fill="blue">Plain</text>
+ <text x="142" y="61" font-size="32" font-style="italic" fill="blue">Italic</text>
+ <text x="257" y="60" font-size="32" font-weight="bold" fill="blue">Bold</text>
+ <text x="224" y="110" font-size="32" fill="blue" text-decoration="underline">Underline</text>
+ <text x="39" y="147" font-size="32" fill="fuchsia" text-decoration="line-through">Line through</text>
+ <text x="1" y="200" font-size="32" font-style="italic" font-weight="bold" fill="black" text-decoration="underline">Bold, italic and underlined</text>
+ <g>
+ <rect x="50" y="225" width="380" height="64" fill="none" stroke="black" stroke-width="2"/>
+ <g font-family="SVGFreeSansASCII,sans-serif">
+ <text x="55" y="245" font-size="24" fill="black">Each line of text which flows in a </text>
+ <text x="55" y="265" font-size="24" fill="black">rectangular box has to be broken</text>
+ <text x="55" y="285" font-size="24" fill="black">into separated lines.</text>
+ </g>
+ </g>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.9 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/text-text-08-b-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/text-text-08-b-ref.png
new file mode 100644
index 00000000..4fd12094
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/text-text-08-b-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/text-text-08-b.svg b/rsvg/tests/fixtures/reftests/svg1.1/text-text-08-b.svg
new file mode 100644
index 00000000..b3938c1d
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/text-text-08-b.svg
@@ -0,0 +1,64 @@
+<svg version="1.1" baseProfile="basic" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="DJ" author="SH" status="accepted"
+ version="$Revision" testname="$RCSfile: text-text-08-b.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/text.html#TextElement">
+ <p>
+ The three opacity properties (fill-opacity,
+ stroke-opacity, and opacity) of 'text' elements are
+ covered in this test.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The test is passed if:
+ </p>
+ <ul>
+ <li>The text "Normal Text" has a pink stroke with no opacity and a blue fill with no opacity.</li>
+ <li>The text "Fill Opacity" has a pink stroke with no opacity and a blue fill with 50% opacity.</li>
+ <li>The text "Stroke Opacity" has a pink stroke with 50% opacity and a blue fill with no opacity.</li>
+ <li>The text "Opacity" has a pink stroke and a blue fill both with 50% opacity.</li>
+ </ul>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: text-text-08-b.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <text x="19" y="60" font-size="64" font-family="Verdana" fill="blue" stroke="fuchsia" stroke-width="2">Normal Text</text>
+ <text x="19" y="120" font-size="64" font-family="Verdana" fill="blue" stroke="fuchsia" stroke-width="2" fill-opacity="0.50">Fill opacity</text>
+ <text x="19" y="180" font-size="64" font-family="Verdana" fill="blue" stroke="fuchsia" stroke-width="2" stroke-opacity="0.50">Stroke opacity</text>
+ <text x="19" y="240" font-size="64" font-family="Verdana" fill="blue" stroke="fuchsia" stroke-width="2" opacity="0.50">Opacity</text>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.6 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/text-text-10-t-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/text-text-10-t-ref.png
new file mode 100644
index 00000000..09bd056c
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/text-text-10-t-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/text-text-10-t.svg b/rsvg/tests/fixtures/reftests/svg1.1/text-text-10-t.svg
new file mode 100644
index 00000000..57b0e1b9
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/text-text-10-t.svg
@@ -0,0 +1,76 @@
+<svg id="svg-root" width="100%" height="100%"
+ viewBox="0 0 480 360" xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= Copyright 2008 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="CL" author="ED" status="accepted"
+ version="$Revision: 1.3 $" testname="$RCSfile: text-text-10-t.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/text.html#TextElement">
+ <p>
+ Test rendering of text rotated by a transform attribute.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The test has passed if the image shows text rotated by various different angles, the result should closely match the reference image.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: text-text-10-t.svg,v $</title>
+ <defs>
+ <font-face
+ font-family="SVGFreeSansASCII"
+ unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+
+ <text transform="rotate(90) translate(120 -100)" text-anchor="middle">Rotated 90 degrees</text>
+ <text transform="rotate(-90) translate(-120 140)" text-anchor="middle">Rotated -90 degrees</text>
+ <text transform="rotate(180) translate(-120 -250)" text-anchor="middle">Rotated 180 degrees</text>
+ <text transform="rotate(360) translate(120 230)" text-anchor="middle">Unrotated text</text>
+ <text transform="translate(250 180) rotate(85 0 0)">Rotated by 10 degrees</text>
+ <text transform="translate(250 180) rotate(75 0 0)">Rotated by 10 degrees</text>
+ <text transform="translate(250 180) rotate(65 0 0)">Rotated by 10 degrees</text>
+ <text transform="translate(250 180) rotate(55 0 0)">Rotated by 10 degrees</text>
+ <text transform="translate(250 180) rotate(45 0 0)">Rotated by 10 degrees</text>
+ <text transform="translate(250 180) rotate(35 0 0)">Rotated by 10 degrees</text>
+ <text transform="translate(250 180) rotate(25 0 0)">Rotated by 10 degrees</text>
+ <text transform="translate(250 180) rotate(15 0 0)">Rotated by 10 degrees</text>
+ <text transform="translate(250 180) rotate(5 0 0)">Rotated by 10 degrees</text>
+ <text transform="translate(250 180) rotate(-5 0 0)">Rotated by 10 degrees</text>
+ <text transform="translate(250 180) rotate(-15 0 0)">Rotated by 10 degrees</text>
+ <text transform="translate(250 180) rotate(-25 0 0)">Rotated by 10 degrees</text>
+ <text transform="translate(250 180) rotate(-35 0 0)">Rotated by 10 degrees</text>
+ <text transform="translate(250 180) rotate(-45 0 0)">Rotated by 10 degrees</text>
+ <text transform="translate(250 180) rotate(-55 0 0)">Rotated by 10 degrees</text>
+ <text transform="translate(250 180) rotate(-65 0 0)">Rotated by 10 degrees</text>
+ <text transform="translate(250 180) rotate(-75 0 0)">Rotated by 10 degrees</text>
+ <text transform="translate(250 180) rotate(-85 0 0)">Rotated by 10 degrees</text>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none"
+ fill="black">$Revision: 1.3 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000"/>
+ <!-- comment out this watermark once the test is approved
+ <g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/text-tref-01-b-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/text-tref-01-b-ref.png
new file mode 100644
index 00000000..4534d5e3
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/text-tref-01-b-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/text-tref-01-b.svg b/rsvg/tests/fixtures/reftests/svg1.1/text-tref-01-b.svg
new file mode 100644
index 00000000..79abbf73
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/text-tref-01-b.svg
@@ -0,0 +1,73 @@
+<svg version="1.1" baseProfile="basic" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="SVGWG" author="Lofton Henderson" status="accepted"
+ version="$Revision: 1.6 $" testname="$RCSfile: text-tref-01-b.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/text.html#TRefElement">
+ <p>
+ Test viewer capability to handle a basic 'tref' element
+ which points to a text string in an external file.
+ </p>
+ <p>
+ The test case consists of a single sub-test.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The box in the middle of the frame should
+ contain green "Simple external referenced text.",
+ which is obtained by a 'tref' element reference to a 'text' element in a 'defs'
+ section of another file (text-extTref-BE-18-targ.svg).
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: text-tref-01-b.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <!-- Test case label -->
+ <text x="75" y="25" font-size="12" fill="blue">Test 'tref' element with an external referenced string.</text>
+ <!-- External tref reference, to another file -->
+ <text x="75" y="200" font-size="18" fill="green">
+ <tref xlink:href="resources/text-extTref-BE-18-targ.svg#tref-external-reference"/>
+ </text>
+ <rect x="73" y="183" width="260" height="22" fill="none" stroke="black"/>
+ <text x="73" y="217" font-size="12" fill="black">'tref' to a string in another file</text>
+ <!-- Patch code -->
+ <!--
+ <text x="75" y="200" font-size="18" fill="green" >
+ Simple external referenced text.
+ </text>
+-->
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.6 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/text-tref-02-b-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/text-tref-02-b-ref.png
new file mode 100644
index 00000000..6e7f42c4
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/text-tref-02-b-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/text-tref-02-b.svg b/rsvg/tests/fixtures/reftests/svg1.1/text-tref-02-b.svg
new file mode 100644
index 00000000..7773c95e
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/text-tref-02-b.svg
@@ -0,0 +1,79 @@
+<!DOCTYPE svg [
+<!ATTLIST bar id ID #REQUIRED>
+]>
+<svg version="1.1" baseProfile="basic" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="ED" author="CL" status="accepted"
+ version="$Revision: 1.5 $" testname="$RCSfile: text-tref-02-b.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/text.html#TRefElement">
+ <p>
+ Test viewer capability to handle 'tref' elements
+ which point to text strings outside the current SVG document fragment.
+ </p>
+ <p>
+ The test case consists of two sub-tests; one results in the word "Hello" and the second, the word "World".
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The test is passed if the phrase "Hello World" is displayed, in green.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: text-tref-02-b.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <!-- Test case label -->
+ <text x="75" y="25" font-family="SVGFreeSansASCII,sans-serif" font-size="12" fill="blue">Test 'tref' element pointing outside the SVG document fragment.</text>
+
+ <text x="75" y="200" font-size="36" font-family="SVGFreeSansASCII,sans-serif" fill="green">
+ <tref xlink:href="#hello"/>
+ <tref xlink:href="#world"/>
+ </text>
+<!-- now make a new SVG document fragment, and hide it from being rendered -->
+<defs>
+ <foreignObject>
+ <svg>
+ <text id="hello">Hello</text>
+ </svg>
+ </foreignObject>
+</defs>
+<!-- and another way to make a separate document fragment -->
+<foo xmlns="http://example.org/foo">
+ <bar id="world">World</bar>
+</foo>
+
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.5 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/text-tref-03-b-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/text-tref-03-b-ref.png
new file mode 100644
index 00000000..e411736e
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/text-tref-03-b-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/text-tref-03-b.svg b/rsvg/tests/fixtures/reftests/svg1.1/text-tref-03-b.svg
new file mode 100644
index 00000000..ba05e5d5
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/text-tref-03-b.svg
@@ -0,0 +1,71 @@
+<!DOCTYPE svg [
+<!ATTLIST bar id ID #REQUIRED>
+]>
+<svg version="1.1" baseProfile="basic" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= SVG 1.1 2nd Edition Test Case =-->
+ <!--======================================================================-->
+ <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="ED" author="Chris Lilley" status="accepted"
+ version="$Revision: 1.4 $" testname="$RCSfile: text-tref-03-b.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/text.html#TRefElement">
+ <p>
+ Test viewer capability to handle 'tref' elements
+ which point to elements that have children. The flattened text content is to be used.
+ </p>
+ <p>
+ The test case consists of one sub-test; it results in the word "Flattened" being displayed.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The test is passed if the phrase "Flattened" is displayed, all in green and at the same font size.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: text-tref-03-b.svg,v $</title>
+ <defs>
+ <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <!-- Test case label -->
+ <text x="75" y="25" font-family="SVGFreeSansASCII,sans-serif" font-size="12" fill="blue">Test 'tref' element uses flattened textContent.</text>
+
+ <text x="75" y="200" font-size="36" font-family="SVGFreeSansASCII,sans-serif" fill="green">
+ <tref xlink:href="#hello"/>
+ </text>
+<!-- now make a new SVG document fragment, and hide it from being rendered -->
+<defs>
+ <text id="hello">F<tspan fill="blue">l</tspan><tspan fill="red" font-size="100">a</tspan><tspan fill="yellow">t<tspan fill="lime">t</tspan></tspan><tspan fill="orange" dx="50">e</tspan><tspan fill="purple">n</tspan><tspan fill="red">e</tspan><tspan fill="black">d</tspan></text>
+</defs>
+
+
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.4 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <!--<g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>-->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/types-basic-02-f-ref.png b/rsvg/tests/fixtures/reftests/svg1.1/types-basic-02-f-ref.png
new file mode 100644
index 00000000..3ca14923
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/types-basic-02-f-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg1.1/types-basic-02-f.svg b/rsvg/tests/fixtures/reftests/svg1.1/types-basic-02-f.svg
new file mode 100644
index 00000000..53fb1636
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg1.1/types-basic-02-f.svg
@@ -0,0 +1,84 @@
+<svg id="svg-root" width="100%" height="100%"
+ viewBox="0 0 480 360" xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= Copyright 2008 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.4" reviewer="[reviewer]" author="ED" status="created"
+ version="$Revision: 1.1 $" testname="$RCSfile: types-basic-02-f.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/types.html#BasicDataTypes">
+ <p>
+ Tests units and no units on &lt;length&gt; in CSS on a property defined in the SVG specification.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ The test is passed if there are six circles with the same thick green stroke visible, and no red.
+ If the SVG user agent doesn't support CSS styling then this test does not apply.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: types-basic-02-f.svg,v $</title>
+ <defs>
+ <font-face
+ font-family="SVGFreeSansASCII"
+ unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+
+ <style>
+ #swNoUnit { stroke-width: 20 }
+ #swUnit { stroke-width: 20px }
+ #swUpperCaseUnit { stroke-width: 20PX }
+ </style>
+
+ <g id="references" fill="none" stroke="red" stroke-width="19">
+ <circle r="40" transform="translate(100 100)"/>
+ <circle r="40" transform="translate(240 100)"/>
+ <circle r="40" transform="translate(380 100)"/>
+
+ <circle r="40" transform="translate(100 240)"/>
+ <circle r="40" transform="translate(240 240)"/>
+ <circle r="40" transform="translate(380 240)"/>
+ </g>
+
+ <!-- "For length values in SVG-specific properties and their corresponding presentation attributes, the length unit identifier is optional." -->
+ <circle r="40" id="swNoUnit" fill="none" stroke="lime" transform="translate(100 100)"/>
+ <circle r="40" id="swUnit" fill="none" stroke="lime" transform="translate(240 100)"/>
+ <circle r="40" id="swPresAttr" fill="none" stroke="lime" stroke-width="20" transform="translate(380 100)"/>
+
+ <!-- "In presentation attributes for all properties, whether defined in this specification or in CSS2, the length identifier, if specified, must be in lower case." -->
+ <g stroke-width="20">
+ <circle r="40" id="swUpperCaseUnitPresAttr" stroke-width="10PX" fill="none" stroke="lime" transform="translate(100 240)"/>
+ </g>
+
+ <!-- Test that units are case-insensitive when specified in CSS -->
+ <circle r="40" id="swUpperCaseUnit" fill="none" stroke="lime" transform="translate(240 240)"/>
+ <circle r="40" id="swUpperCaseUnitInline" style="stroke-width:20PX" fill="none" stroke="lime" transform="translate(380 240)"/>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none"
+ fill="black">$Revision: 1.1 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg2-reftests/bug913-gaussian-blur-nonpositive-ref.svg b/rsvg/tests/fixtures/reftests/svg2-reftests/bug913-gaussian-blur-nonpositive-ref.svg
new file mode 100644
index 00000000..859a6973
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg2-reftests/bug913-gaussian-blur-nonpositive-ref.svg
@@ -0,0 +1,7 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
+ width="400" height="400">
+ <g>
+ <rect x="100" y="100" width="50" height="50" fill="lime"/>
+ <rect x="200" y="100" width="50" height="50" fill="lime"/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg2-reftests/bug913-gaussian-blur-nonpositive.svg b/rsvg/tests/fixtures/reftests/svg2-reftests/bug913-gaussian-blur-nonpositive.svg
new file mode 100644
index 00000000..e1a276e3
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg2-reftests/bug913-gaussian-blur-nonpositive.svg
@@ -0,0 +1,19 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
+ width="400" height="400">
+ <filter id="filter" filterUnits="objectBoundingBox" x="-10%" y="-10%" width="120%" height="120%">
+ <!-- First, swap the red and green channels (turn the red rectangle into green) -->
+ <feColorMatrix type="matrix"
+ values="0 1 0 0 0
+ 1 0 0 0 0
+ 0 0 1 0 0
+ 0 0 0 1 0"/>
+
+ <!-- Second, no-op blur because stdDeviation is negative-->
+ <feGaussianBlur stdDeviation="-1 -1"/>
+ </filter>
+
+ <g filter="url(#filter)">
+ <rect x="100" y="100" width="50" height="50" fill="red"/>
+ <rect x="200" y="100" width="50" height="50" fill="red"/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg2-reftests/ellipse-auto-rx-ry-ref.svg b/rsvg/tests/fixtures/reftests/svg2-reftests/ellipse-auto-rx-ry-ref.svg
new file mode 100644
index 00000000..4e605b42
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg2-reftests/ellipse-auto-rx-ry-ref.svg
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200">
+ <!-- Empty, since an ellipse with auto rx/ry resolves to one with rx=ry=0 -->
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg2-reftests/ellipse-auto-rx-ry.svg b/rsvg/tests/fixtures/reftests/svg2-reftests/ellipse-auto-rx-ry.svg
new file mode 100644
index 00000000..e3334222
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg2-reftests/ellipse-auto-rx-ry.svg
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200">
+ <!-- Test that the rx/ry properties, as they both default to "auto", will resolve to 0 -->
+ <ellipse cx="50%" cy="50%" fill="lime"/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg2-reftests/ellipse-single-auto-rx-ry-ref.svg b/rsvg/tests/fixtures/reftests/svg2-reftests/ellipse-single-auto-rx-ry-ref.svg
new file mode 100644
index 00000000..49c92fd7
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg2-reftests/ellipse-single-auto-rx-ry-ref.svg
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200">
+ <ellipse cx="25%" cy="50%" rx="10" ry="10" fill="lime"/>
+ <ellipse cx="75%" cy="50%" rx="10" ry="10" fill="lime"/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg2-reftests/ellipse-single-auto-rx-ry.svg b/rsvg/tests/fixtures/reftests/svg2-reftests/ellipse-single-auto-rx-ry.svg
new file mode 100644
index 00000000..1805801c
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg2-reftests/ellipse-single-auto-rx-ry.svg
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200">
+ <!-- Test that if only one of the rx/ry properties defaults to "auto", it
+ resolves to the computed value of the other one - yielding a circle.
+ -->
+ <ellipse cx="25%" cy="50%" rx="10" fill="lime"/>
+ <ellipse cx="75%" cy="50%" ry="10" fill="lime"/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg2-reftests/isolation-ref.svg b/rsvg/tests/fixtures/reftests/svg2-reftests/isolation-ref.svg
new file mode 100644
index 00000000..4d62f132
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg2-reftests/isolation-ref.svg
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200">
+ <rect width="100%" height="100%" fill="lime"/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg2-reftests/isolation.svg b/rsvg/tests/fixtures/reftests/svg2-reftests/isolation.svg
new file mode 100644
index 00000000..367ba85d
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg2-reftests/isolation.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200">
+ <rect width="100%" height="100%" fill="lime"/>
+ <g style="isolation: isolate;">
+ <rect width="50%" height="50%" fill="lime" style="mix-blend-mode: difference;"/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg2-reftests/mask-and-opacity-ref.svg b/rsvg/tests/fixtures/reftests/svg2-reftests/mask-and-opacity-ref.svg
new file mode 100644
index 00000000..f4867380
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg2-reftests/mask-and-opacity-ref.svg
@@ -0,0 +1,3 @@
+<svg width="400" height="400" xmlns="http://www.w3.org/2000/svg">
+ <circle cx="200" cy="200" r="200" fill="lime" opacity="0.5"/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg2-reftests/mask-and-opacity.svg b/rsvg/tests/fixtures/reftests/svg2-reftests/mask-and-opacity.svg
new file mode 100644
index 00000000..ec70764b
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg2-reftests/mask-and-opacity.svg
@@ -0,0 +1,7 @@
+<svg width="400" height="400" xmlns="http://www.w3.org/2000/svg">
+ <mask id="mask">
+ <circle cx="200" cy="200" r="200" fill="white"/>
+ </mask>
+
+ <rect width="400" height="400" fill="lime" opacity="0.5" mask="url(#mask)"/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg2/bug743-fe-drop-shadow-ref.svg b/rsvg/tests/fixtures/reftests/svg2/bug743-fe-drop-shadow-ref.svg
new file mode 100644
index 00000000..034f8b37
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg2/bug743-fe-drop-shadow-ref.svg
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200">
+ <filter id="drop-shadow" filterUnits="userSpaceOnUse">
+ <feGaussianBlur in="SourceAlpha" stdDeviation="5 10"/>
+ <feOffset dx="5" dy="10" result="offsetblur"/>
+ <feFlood flood-color="black" flood-opacity="0.5"/>
+ <feComposite in2="offsetblur" operator="in"/>
+ <feMerge>
+ <feMergeNode/>
+ <feMergeNode in="SourceGraphic"/>
+ </feMerge>
+ </filter>
+
+ <rect x="0" y="0" width="100%" height="100%" fill="white"/>
+
+ <rect x="50" y="50" width="50" height="50" fill="blue" stroke="magenta" stroke-width="6" filter="url(#drop-shadow)"/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg2/bug743-fe-drop-shadow.svg b/rsvg/tests/fixtures/reftests/svg2/bug743-fe-drop-shadow.svg
new file mode 100644
index 00000000..7054201f
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg2/bug743-fe-drop-shadow.svg
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200">
+ <filter id="drop-shadow" filterUnits="userSpaceOnUse">
+ <feDropShadow dx="5" dy="10" stdDeviation="5 10" flood-color="black" flood-opacity="0.5"/>
+ </filter>
+
+ <rect x="0" y="0" width="100%" height="100%" fill="white"/>
+
+ <rect x="50" y="50" width="50" height="50" fill="blue" stroke="magenta" stroke-width="6" filter="url(#drop-shadow)"/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg2/gradient-01-b-ref.png b/rsvg/tests/fixtures/reftests/svg2/gradient-01-b-ref.png
new file mode 100644
index 00000000..7e4c24dc
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg2/gradient-01-b-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg2/gradient-01-b.svg b/rsvg/tests/fixtures/reftests/svg2/gradient-01-b.svg
new file mode 100644
index 00000000..c9641da6
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg2/gradient-01-b.svg
@@ -0,0 +1,137 @@
+<svg id="svg-root"
+ width="100%" height="100%" viewBox="0 0 1000 5000"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:html="http://www.w3.org/1999/xhtml">
+ <defs id="defs">
+ <!-- Only cx/cy/r for a plain SVG1.1-like gradient. -->
+ <radialGradient
+ id="plain_svg11_gradient"
+ gradientUnits="userSpaceOnUse"
+
+ cx="500" cy="500" r="200">
+ <stop style="stop-color:#aa88ff" offset="0%"/>
+ <stop style="stop-color:#ffddcc" offset="50%"/>
+ <stop style="stop-color:#bbffee" offset="100%"/>
+ </radialGradient>
+
+
+ <!-- cx/cy/r/fx/fy with the focus point inside the circle, for a "full" SVG1.1 gradient. -->
+ <radialGradient
+ id="full_svg11_gradient"
+ gradientUnits="userSpaceOnUse"
+
+ cx="500" cy="1500" r="200"
+ fx="600" fy="1600">
+ <stop style="stop-color:#aa88ff" offset="0%"/>
+ <stop style="stop-color:#ffddcc" offset="50%"/>
+ <stop style="stop-color:#bbffee" offset="100%"/>
+ </radialGradient>
+
+
+ <!-- cx/cy/r/fx/fy with the focus point outside the circle. -->
+ <radialGradient
+ id="full_svg11_outside_gradient"
+ gradientUnits="userSpaceOnUse"
+
+ cx="500" cy="2500" r="200"
+ fx="800" fy="2500">
+ <stop style="stop-color:#aa88ff" offset="0%"/>
+ <stop style="stop-color:#ffddcc" offset="50%"/>
+ <stop style="stop-color:#bbffee" offset="100%"/>
+ </radialGradient>
+
+
+ <!-- cx/cy/r/fx/fy/fr inside the circle. -->
+ <radialGradient
+ id="svg2_inside_gradient"
+ gradientUnits="userSpaceOnUse"
+
+ cx="500" cy="3500" r="200"
+ fx="600" fy="3600" fr="50">
+ <stop style="stop-color:#aa88ff" offset="0%"/>
+ <stop style="stop-color:#ffddcc" offset="50%"/>
+ <stop style="stop-color:#bbffee" offset="100%"/>
+ </radialGradient>
+
+
+ <!-- cx/cy/r/fx/fy/fr outside the circle. -->
+ <radialGradient
+ id="svg2_outside_gradient"
+ gradientUnits="userSpaceOnUse"
+
+ cx="500" cy="4500" r="200"
+ fx="800" fy="4500" fr="50">
+ <stop style="stop-color:#aa88ff" offset="0%"/>
+ <stop style="stop-color:#ffddcc" offset="50%"/>
+ <stop style="stop-color:#bbffee" offset="100%"/>
+ </radialGradient>
+ </defs>
+ <g id="layer1">
+ <rect
+ id="rec1" style="fill:url(#plain_svg11_gradient)"
+ width="900" height="800"
+ x="50" y="100" />
+
+ <rect
+ id="rec2" style="fill:url(#full_svg11_gradient)"
+ width="900" height="800"
+ x="50" y="1100" />
+
+ <rect
+ id="rec3" style="fill:url(#full_svg11_outside_gradient)"
+ width="900" height="800"
+ x="50" y="2100" />
+
+ <rect
+ id="rec4" style="fill:url(#svg2_inside_gradient)"
+ width="900" height="800"
+ x="50" y="3100" />
+
+ <rect
+ id="rec5" style="fill:url(#svg2_outside_gradient)"
+ width="900" height="800"
+ x="50" y="4100" />
+
+
+ <circle
+ style="fill:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke:#000000;stroke-opacity:1"
+ id="circle1"
+ cx="500" cy="500" r="200" />
+ <circle
+ style="fill:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke:#000000;stroke-opacity:1"
+ id="circle2"
+ cx="500" cy="1500" r="200" />
+ <circle
+ style="fill:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke:#000000;stroke-opacity:1"
+ id="circle2_2"
+ cx="600" cy="1600" r="1" />
+ <circle
+ style="fill:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke:#000000;stroke-opacity:1"
+ id="circle3"
+ cx="500" cy="2500" r="200" />
+ <circle
+ style="fill:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke:#000000;stroke-opacity:1"
+ id="circle3_2"
+ cx="800" cy="2500" r="1" />
+ <circle
+ style="fill:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke:#000000;stroke-opacity:1"
+ id="circle4"
+ cx="500" cy="3500" r="200" />
+ <circle
+ style="fill:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke:#000000;stroke-opacity:1"
+ id="circle4_2"
+ cx="600" cy="3600" r="50" />
+ <circle
+ style="fill:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke:#000000;stroke-opacity:1"
+ id="circle5"
+ cx="500" cy="4500" r="200" />
+ <circle
+ style="fill:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke:#000000;stroke-opacity:1"
+ id="circle5_2"
+ cx="800" cy="4500" r="50" />
+ </g>
+</svg>
+
+
+
diff --git a/rsvg/tests/fixtures/reftests/svg2/mix-blend-mode-ref.png b/rsvg/tests/fixtures/reftests/svg2/mix-blend-mode-ref.png
new file mode 100644
index 00000000..01f5f027
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg2/mix-blend-mode-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg2/mix-blend-mode.svg b/rsvg/tests/fixtures/reftests/svg2/mix-blend-mode.svg
new file mode 100644
index 00000000..f20fcbaa
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg2/mix-blend-mode.svg
@@ -0,0 +1,1751 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ sodipodi:docname="mix-blend-mode.svg"
+ inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
+ id="svg1436"
+ version="1.1"
+ viewBox="0 0 206.5354 328"
+ height="328mm"
+ width="206.5354mm"
+ inkscape:export-filename="/home/john/Projects/librsvg/tests/fixtures/reftests/svg2/mix-blend-mode-ref.png"
+ inkscape:export-xdpi="36.181969"
+ inkscape:export-ydpi="36.181969">
+ <defs
+ id="defs1430" />
+ <sodipodi:namedview
+ showguides="false"
+ inkscape:window-maximized="1"
+ inkscape:window-y="0"
+ inkscape:window-x="0"
+ inkscape:window-height="1020"
+ inkscape:window-width="2560"
+ inkscape:bbox-nodes="true"
+ inkscape:bbox-paths="true"
+ inkscape:snap-bbox="true"
+ showgrid="false"
+ inkscape:document-rotation="0"
+ inkscape:current-layer="layer1"
+ inkscape:document-units="mm"
+ inkscape:cy="215.28302"
+ inkscape:cx="989.65538"
+ inkscape:zoom="1"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="1"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ pagecolor="#ffffff"
+ id="base"
+ lock-margins="true"
+ fit-margin-top="10"
+ fit-margin-left="10"
+ fit-margin-right="10"
+ fit-margin-bottom="10" />
+ <metadata
+ id="metadata1433">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:groupmode="layer"
+ inkscape:label="Vrstva 1"
+ transform="translate(300.68861,64.668133)">
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ y="-54.668133"
+ x="-247.12546"
+ height="32.672359"
+ width="5.0292482"
+ id="rect2013"
+ style="fill:#ffff00;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="fill:#668000;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect2015"
+ width="5.0292482"
+ height="32.672359"
+ x="-242.09621"
+ y="-54.668133" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ y="-54.668133"
+ x="-237.06696"
+ height="32.672359"
+ width="5.0292482"
+ id="rect2017"
+ style="fill:#a02c2c;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="fill:#ffb380;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect2019"
+ width="5.0292482"
+ height="32.672359"
+ x="-232.03772"
+ y="-54.668133" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ y="-54.668133"
+ x="-227.00847"
+ height="32.672359"
+ width="5.0292482"
+ id="rect2021"
+ style="fill:#ffffff;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ y="-54.668133"
+ x="-227.00847"
+ height="32.672359"
+ width="5.0292482"
+ id="rect2023"
+ style="fill:#8d5fd3;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="fill:#c83771;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect2025"
+ width="5.0292482"
+ height="32.672359"
+ x="-221.97922"
+ y="-54.668133" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ y="-54.668133"
+ x="-216.94997"
+ height="32.672359"
+ width="5.0292482"
+ id="rect2027"
+ style="fill:#000000;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="fill:#b3b3b3;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect2029"
+ width="5.0292482"
+ height="32.672359"
+ x="-211.92073"
+ y="-54.668133" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ y="-54.668133"
+ x="-206.89148"
+ height="32.672359"
+ width="5.0292482"
+ id="rect2031"
+ style="fill:#f9f9f9;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="fill:#ffff00;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect113"
+ width="5.0292482"
+ height="32.672359"
+ x="-247.12546"
+ y="-15.4613" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ y="-15.4613"
+ x="-242.09621"
+ height="32.672359"
+ width="5.0292482"
+ id="rect115"
+ style="fill:#668000;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="fill:#a02c2c;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect117"
+ width="5.0292482"
+ height="32.672359"
+ x="-237.06696"
+ y="-15.4613" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ y="-15.4613"
+ x="-232.03772"
+ height="32.672359"
+ width="5.0292482"
+ id="rect119"
+ style="fill:#ffb380;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="fill:#ffffff;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect121"
+ width="5.0292482"
+ height="32.672359"
+ x="-227.00847"
+ y="-15.4613" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="fill:#8d5fd3;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect123"
+ width="5.0292482"
+ height="32.672359"
+ x="-227.00847"
+ y="-15.4613" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ y="-15.4613"
+ x="-221.97922"
+ height="32.672359"
+ width="5.0292482"
+ id="rect125"
+ style="fill:#c83771;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="fill:#000000;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect127"
+ width="5.0292482"
+ height="32.672359"
+ x="-216.94997"
+ y="-15.4613" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ y="-15.4613"
+ x="-211.92073"
+ height="32.672359"
+ width="5.0292482"
+ id="rect129"
+ style="fill:#b3b3b3;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="fill:#f9f9f9;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect131"
+ width="5.0292482"
+ height="32.672359"
+ x="-206.89148"
+ y="-15.4613" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="fill:#ffff00;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect137"
+ width="5.0292482"
+ height="32.672359"
+ x="-247.12546"
+ y="23.745529" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ y="23.745529"
+ x="-242.09621"
+ height="32.672359"
+ width="5.0292482"
+ id="rect139"
+ style="fill:#668000;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="fill:#a02c2c;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect141"
+ width="5.0292482"
+ height="32.672359"
+ x="-237.06696"
+ y="23.745529" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ y="23.745529"
+ x="-232.03772"
+ height="32.672359"
+ width="5.0292482"
+ id="rect143"
+ style="fill:#ffb380;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="fill:#ffffff;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect145"
+ width="5.0292482"
+ height="32.672359"
+ x="-227.00847"
+ y="23.745529" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="fill:#8d5fd3;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect147"
+ width="5.0292482"
+ height="32.672359"
+ x="-227.00847"
+ y="23.745529" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ y="23.745529"
+ x="-221.97922"
+ height="32.672359"
+ width="5.0292482"
+ id="rect149"
+ style="fill:#c83771;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="fill:#000000;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect151"
+ width="5.0292482"
+ height="32.672359"
+ x="-216.94997"
+ y="23.745529" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ y="23.745529"
+ x="-211.92073"
+ height="32.672359"
+ width="5.0292482"
+ id="rect153"
+ style="fill:#b3b3b3;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="fill:#f9f9f9;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect155"
+ width="5.0292482"
+ height="32.672359"
+ x="-206.89148"
+ y="23.745529" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="fill:#ffff00;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect161"
+ width="5.0292482"
+ height="32.672359"
+ x="-247.12546"
+ y="62.95237" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ y="62.95237"
+ x="-242.09621"
+ height="32.672359"
+ width="5.0292482"
+ id="rect163"
+ style="fill:#668000;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="fill:#a02c2c;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect165"
+ width="5.0292482"
+ height="32.672359"
+ x="-237.06696"
+ y="62.95237" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ y="62.95237"
+ x="-232.03772"
+ height="32.672359"
+ width="5.0292482"
+ id="rect167"
+ style="fill:#ffb380;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="fill:#ffffff;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect169"
+ width="5.0292482"
+ height="32.672359"
+ x="-227.00847"
+ y="62.95237" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="fill:#8d5fd3;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect171"
+ width="5.0292482"
+ height="32.672359"
+ x="-227.00847"
+ y="62.95237" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ y="62.95237"
+ x="-221.97922"
+ height="32.672359"
+ width="5.0292482"
+ id="rect173"
+ style="fill:#c83771;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="fill:#000000;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect175"
+ width="5.0292482"
+ height="32.672359"
+ x="-216.94997"
+ y="62.95237" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ y="62.95237"
+ x="-211.92073"
+ height="32.672359"
+ width="5.0292482"
+ id="rect177"
+ style="fill:#b3b3b3;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="fill:#f9f9f9;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect179"
+ width="5.0292482"
+ height="32.672359"
+ x="-206.89148"
+ y="62.95237" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="opacity:0.999858;fill:#ffff00;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect185"
+ width="5.0292482"
+ height="32.672359"
+ x="-247.12546"
+ y="102.1592" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ y="102.1592"
+ x="-242.09621"
+ height="32.672359"
+ width="5.0292482"
+ id="rect187"
+ style="opacity:0.999858;fill:#668000;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="opacity:0.999858;fill:#a02c2c;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect189"
+ width="5.0292482"
+ height="32.672359"
+ x="-237.06696"
+ y="102.1592" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ y="102.1592"
+ x="-232.03772"
+ height="32.672359"
+ width="5.0292482"
+ id="rect191"
+ style="opacity:0.999858;fill:#ffb380;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="opacity:0.999858;fill:#ffffff;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect193"
+ width="5.0292482"
+ height="32.672359"
+ x="-227.00847"
+ y="102.1592" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="opacity:0.999858;fill:#8d5fd3;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect195"
+ width="5.0292482"
+ height="32.672359"
+ x="-227.00847"
+ y="102.1592" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ y="102.1592"
+ x="-221.97922"
+ height="32.672359"
+ width="5.0292482"
+ id="rect197"
+ style="opacity:0.999858;fill:#c83771;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="opacity:0.999858;fill:#000000;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect199"
+ width="5.0292482"
+ height="32.672359"
+ x="-216.94997"
+ y="102.1592" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ y="102.1592"
+ x="-211.92073"
+ height="32.672359"
+ width="5.0292482"
+ id="rect201"
+ style="opacity:0.999858;fill:#b3b3b3;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="opacity:0.999858;fill:#f9f9f9;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect203"
+ width="5.0292482"
+ height="32.672359"
+ x="-206.89148"
+ y="102.1592" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="opacity:0.99634;fill:#ffff00;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect209"
+ width="5.0292482"
+ height="32.672359"
+ x="-247.12546"
+ y="141.36603" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ y="141.36603"
+ x="-242.09621"
+ height="32.672359"
+ width="5.0292482"
+ id="rect211"
+ style="opacity:0.99634;fill:#668000;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="opacity:0.99634;fill:#a02c2c;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect213"
+ width="5.0292482"
+ height="32.672359"
+ x="-237.06696"
+ y="141.36603" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ y="141.36603"
+ x="-232.03772"
+ height="32.672359"
+ width="5.0292482"
+ id="rect215"
+ style="opacity:0.99634;fill:#ffb380;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="opacity:0.99634;fill:#ffffff;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect217"
+ width="5.0292482"
+ height="32.672359"
+ x="-227.00847"
+ y="141.36603" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="opacity:0.99634;fill:#8d5fd3;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect219"
+ width="5.0292482"
+ height="32.672359"
+ x="-227.00847"
+ y="141.36603" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ y="141.36603"
+ x="-221.97922"
+ height="32.672359"
+ width="5.0292482"
+ id="rect221"
+ style="opacity:0.99634;fill:#c83771;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="opacity:0.99634;fill:#000000;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect223"
+ width="5.0292482"
+ height="32.672359"
+ x="-216.94997"
+ y="141.36603" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ y="141.36603"
+ x="-211.92073"
+ height="32.672359"
+ width="5.0292482"
+ id="rect225"
+ style="opacity:0.99634;fill:#b3b3b3;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="opacity:0.99634;fill:#f9f9f9;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect227"
+ width="5.0292482"
+ height="32.672359"
+ x="-206.89148"
+ y="141.36603" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="fill:#ffff00;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect233"
+ width="5.0292482"
+ height="32.672359"
+ x="-247.12546"
+ y="180.57285" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ y="180.57285"
+ x="-242.09621"
+ height="32.672359"
+ width="5.0292482"
+ id="rect235"
+ style="fill:#668000;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="fill:#a02c2c;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect237"
+ width="5.0292482"
+ height="32.672359"
+ x="-237.06696"
+ y="180.57285" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ y="180.57285"
+ x="-232.03772"
+ height="32.672359"
+ width="5.0292482"
+ id="rect239"
+ style="fill:#ffb380;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="fill:#ffffff;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect241"
+ width="5.0292482"
+ height="32.672359"
+ x="-227.00847"
+ y="180.57285" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="fill:#8d5fd3;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect243"
+ width="5.0292482"
+ height="32.672359"
+ x="-227.00847"
+ y="180.57285" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ y="180.57285"
+ x="-221.97922"
+ height="32.672359"
+ width="5.0292482"
+ id="rect245"
+ style="fill:#c83771;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="fill:#000000;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect247"
+ width="5.0292482"
+ height="32.672359"
+ x="-216.94997"
+ y="180.57285" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ y="180.57285"
+ x="-211.92073"
+ height="32.672359"
+ width="5.0292482"
+ id="rect249"
+ style="fill:#b3b3b3;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="fill:#f9f9f9;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect251"
+ width="5.0292482"
+ height="32.672359"
+ x="-206.89148"
+ y="180.57285" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="opacity:0.996308;fill:#ffff00;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect257"
+ width="5.0292482"
+ height="32.672359"
+ x="-247.12546"
+ y="219.77968" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ y="219.77968"
+ x="-242.09621"
+ height="32.672359"
+ width="5.0292482"
+ id="rect259"
+ style="opacity:0.996308;fill:#668000;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="opacity:0.996308;fill:#a02c2c;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect261"
+ width="5.0292482"
+ height="32.672359"
+ x="-237.06696"
+ y="219.77968" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ y="219.77968"
+ x="-232.03772"
+ height="32.672359"
+ width="5.0292482"
+ id="rect263"
+ style="opacity:0.996308;fill:#ffb380;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="opacity:0.996308;fill:#ffffff;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect265"
+ width="5.0292482"
+ height="32.672359"
+ x="-227.00847"
+ y="219.77968" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="opacity:0.996308;fill:#8d5fd3;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect267"
+ width="5.0292482"
+ height="32.672359"
+ x="-227.00847"
+ y="219.77968" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ y="219.77968"
+ x="-221.97922"
+ height="32.672359"
+ width="5.0292482"
+ id="rect269"
+ style="opacity:0.996308;fill:#c83771;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="opacity:0.996308;fill:#000000;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect271"
+ width="5.0292482"
+ height="32.672359"
+ x="-216.94997"
+ y="219.77968" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ y="219.77968"
+ x="-211.92073"
+ height="32.672359"
+ width="5.0292482"
+ id="rect273"
+ style="opacity:0.996308;fill:#b3b3b3;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="opacity:0.996308;fill:#f9f9f9;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect275"
+ width="5.0292482"
+ height="32.672359"
+ x="-206.89148"
+ y="219.77968" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="opacity:0.997326;fill:#ffff00;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect281"
+ width="5.0292482"
+ height="32.672359"
+ x="-149.41644"
+ y="181.45268" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ y="181.45268"
+ x="-144.38721"
+ height="32.672359"
+ width="5.0292482"
+ id="rect283"
+ style="opacity:0.997326;fill:#668000;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="opacity:0.997326;fill:#a02c2c;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect285"
+ width="5.0292482"
+ height="32.672359"
+ x="-139.35796"
+ y="181.45268" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ y="181.45268"
+ x="-134.3287"
+ height="32.672359"
+ width="5.0292482"
+ id="rect287"
+ style="opacity:0.997326;fill:#ffb380;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="opacity:0.997326;fill:#ffffff;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect289"
+ width="5.0292482"
+ height="32.672359"
+ x="-129.29945"
+ y="181.45268" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="opacity:0.997326;fill:#8d5fd3;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect291"
+ width="5.0292482"
+ height="32.672359"
+ x="-129.29945"
+ y="181.45268" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ y="181.45268"
+ x="-124.27021"
+ height="32.672359"
+ width="5.0292482"
+ id="rect293"
+ style="opacity:0.997326;fill:#c83771;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="opacity:0.997326;fill:#000000;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect295"
+ width="5.0292482"
+ height="32.672359"
+ x="-119.24097"
+ y="181.45268" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ y="181.45268"
+ x="-114.21172"
+ height="32.672359"
+ width="5.0292482"
+ id="rect297"
+ style="opacity:0.997326;fill:#b3b3b3;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="opacity:0.997326;fill:#f9f9f9;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect299"
+ width="5.0292482"
+ height="32.672359"
+ x="-109.18247"
+ y="181.45268" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="opacity:0.996356;fill:#ffff00;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect305"
+ width="5.0292482"
+ height="32.672359"
+ x="-149.41644"
+ y="220.65952" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ y="220.65952"
+ x="-144.38721"
+ height="32.672359"
+ width="5.0292482"
+ id="rect307"
+ style="opacity:0.996356;fill:#668000;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="opacity:0.996356;fill:#a02c2c;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect309"
+ width="5.0292482"
+ height="32.672359"
+ x="-139.35796"
+ y="220.65952" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ y="220.65952"
+ x="-134.3287"
+ height="32.672359"
+ width="5.0292482"
+ id="rect311"
+ style="opacity:0.996356;fill:#ffb380;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="opacity:0.996356;fill:#ffffff;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect313"
+ width="5.0292482"
+ height="32.672359"
+ x="-129.29945"
+ y="220.65952" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="opacity:0.996356;fill:#8d5fd3;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect315"
+ width="5.0292482"
+ height="32.672359"
+ x="-129.29945"
+ y="220.65952" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ y="220.65952"
+ x="-124.27021"
+ height="32.672359"
+ width="5.0292482"
+ id="rect317"
+ style="opacity:0.996356;fill:#c83771;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="opacity:0.996356;fill:#000000;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect319"
+ width="5.0292482"
+ height="32.672359"
+ x="-119.24097"
+ y="220.65952" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ y="220.65952"
+ x="-114.21172"
+ height="32.672359"
+ width="5.0292482"
+ id="rect321"
+ style="opacity:0.996356;fill:#b3b3b3;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="opacity:0.996356;fill:#f9f9f9;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect323"
+ width="5.0292482"
+ height="32.672359"
+ x="-109.18247"
+ y="220.65952" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="opacity:0.996591;fill:#ffff00;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect449"
+ width="5.0292482"
+ height="32.672359"
+ x="-149.41644"
+ y="-54.668133" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ y="-54.668133"
+ x="-144.38721"
+ height="32.672359"
+ width="5.0292482"
+ id="rect451"
+ style="opacity:0.996591;fill:#668000;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="opacity:0.996591;fill:#a02c2c;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect453"
+ width="5.0292482"
+ height="32.672359"
+ x="-139.35796"
+ y="-54.668133" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ y="-54.668133"
+ x="-134.3287"
+ height="32.672359"
+ width="5.0292482"
+ id="rect455"
+ style="opacity:0.996591;fill:#ffb380;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="opacity:0.996591;fill:#ffffff;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect457"
+ width="5.0292482"
+ height="32.672359"
+ x="-129.29945"
+ y="-54.668133" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="opacity:0.996591;fill:#8d5fd3;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect459"
+ width="5.0292482"
+ height="32.672359"
+ x="-129.29945"
+ y="-54.668133" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ y="-54.668133"
+ x="-124.27021"
+ height="32.672359"
+ width="5.0292482"
+ id="rect461"
+ style="opacity:0.996591;fill:#c83771;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="opacity:0.996591;fill:#000000;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect463"
+ width="5.0292482"
+ height="32.672359"
+ x="-119.24097"
+ y="-54.668133" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ y="-54.668133"
+ x="-114.21172"
+ height="32.672359"
+ width="5.0292482"
+ id="rect465"
+ style="opacity:0.996591;fill:#b3b3b3;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="opacity:0.996591;fill:#f9f9f9;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect467"
+ width="5.0292482"
+ height="32.672359"
+ x="-109.18247"
+ y="-54.668133" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="fill:#ffff00;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect329"
+ width="5.0292482"
+ height="32.672359"
+ x="-149.41644"
+ y="-15.4613" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ y="-15.4613"
+ x="-144.38721"
+ height="32.672359"
+ width="5.0292482"
+ id="rect331"
+ style="fill:#668000;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="fill:#a02c2c;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect333"
+ width="5.0292482"
+ height="32.672359"
+ x="-139.35796"
+ y="-15.4613" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ y="-15.4613"
+ x="-134.3287"
+ height="32.672359"
+ width="5.0292482"
+ id="rect335"
+ style="fill:#ffb380;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="fill:#ffffff;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect337"
+ width="5.0292482"
+ height="32.672359"
+ x="-129.29945"
+ y="-15.4613" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="fill:#8d5fd3;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect339"
+ width="5.0292482"
+ height="32.672359"
+ x="-129.29945"
+ y="-15.4613" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ y="-15.4613"
+ x="-124.27021"
+ height="32.672359"
+ width="5.0292482"
+ id="rect341"
+ style="fill:#c83771;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="fill:#000000;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect343"
+ width="5.0292482"
+ height="32.672359"
+ x="-119.24097"
+ y="-15.4613" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ y="-15.4613"
+ x="-114.21172"
+ height="32.672359"
+ width="5.0292482"
+ id="rect345"
+ style="fill:#b3b3b3;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="fill:#f9f9f9;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect347"
+ width="5.0292482"
+ height="32.672359"
+ x="-109.18247"
+ y="-15.4613" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="opacity:0.997143;fill:#ffff00;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect353"
+ width="5.0292482"
+ height="32.672359"
+ x="-149.41644"
+ y="23.745529" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ y="23.745529"
+ x="-144.38721"
+ height="32.672359"
+ width="5.0292482"
+ id="rect355"
+ style="opacity:0.997143;fill:#668000;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="opacity:0.997143;fill:#a02c2c;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect357"
+ width="5.0292482"
+ height="32.672359"
+ x="-139.35796"
+ y="23.745529" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ y="23.745529"
+ x="-134.3287"
+ height="32.672359"
+ width="5.0292482"
+ id="rect359"
+ style="opacity:0.997143;fill:#ffb380;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="opacity:0.997143;fill:#ffffff;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect361"
+ width="5.0292482"
+ height="32.672359"
+ x="-129.29945"
+ y="23.745529" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="opacity:0.997143;fill:#8d5fd3;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect363"
+ width="5.0292482"
+ height="32.672359"
+ x="-129.29945"
+ y="23.745529" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ y="23.745529"
+ x="-124.27021"
+ height="32.672359"
+ width="5.0292482"
+ id="rect365"
+ style="opacity:0.997143;fill:#c83771;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="opacity:0.997143;fill:#000000;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect367"
+ width="5.0292482"
+ height="32.672359"
+ x="-119.24097"
+ y="23.745529" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ y="23.745529"
+ x="-114.21172"
+ height="32.672359"
+ width="5.0292482"
+ id="rect369"
+ style="opacity:0.997143;fill:#b3b3b3;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="opacity:0.997143;fill:#f9f9f9;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect371"
+ width="5.0292482"
+ height="32.672359"
+ x="-109.18247"
+ y="23.745529" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="opacity:0.996521;fill:#ffff00;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect377"
+ width="5.0292482"
+ height="32.672359"
+ x="-149.41644"
+ y="62.95237" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ y="62.95237"
+ x="-144.38721"
+ height="32.672359"
+ width="5.0292482"
+ id="rect379"
+ style="opacity:0.996521;fill:#668000;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="opacity:0.996521;fill:#a02c2c;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect381"
+ width="5.0292482"
+ height="32.672359"
+ x="-139.35796"
+ y="62.95237" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ y="62.95237"
+ x="-134.3287"
+ height="32.672359"
+ width="5.0292482"
+ id="rect383"
+ style="opacity:0.996521;fill:#ffb380;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="opacity:0.996521;fill:#ffffff;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect385"
+ width="5.0292482"
+ height="32.672359"
+ x="-129.29945"
+ y="62.95237" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="opacity:0.996521;fill:#8d5fd3;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect387"
+ width="5.0292482"
+ height="32.672359"
+ x="-129.29945"
+ y="62.95237" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ y="62.95237"
+ x="-124.27021"
+ height="32.672359"
+ width="5.0292482"
+ id="rect389"
+ style="opacity:0.996521;fill:#c83771;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="opacity:0.996521;fill:#000000;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect391"
+ width="5.0292482"
+ height="32.672359"
+ x="-119.24097"
+ y="62.95237" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ y="62.95237"
+ x="-114.21172"
+ height="32.672359"
+ width="5.0292482"
+ id="rect393"
+ style="opacity:0.996521;fill:#b3b3b3;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="opacity:0.996521;fill:#f9f9f9;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect395"
+ width="5.0292482"
+ height="32.672359"
+ x="-109.18247"
+ y="62.95237" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="fill:#ffff00;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect401"
+ width="5.0292482"
+ height="32.672359"
+ x="-149.41644"
+ y="102.1592" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ y="102.1592"
+ x="-144.38721"
+ height="32.672359"
+ width="5.0292482"
+ id="rect403"
+ style="fill:#668000;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="fill:#a02c2c;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect405"
+ width="5.0292482"
+ height="32.672359"
+ x="-139.35796"
+ y="102.1592" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ y="102.1592"
+ x="-134.3287"
+ height="32.672359"
+ width="5.0292482"
+ id="rect407"
+ style="fill:#ffb380;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="fill:#ffffff;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect409"
+ width="5.0292482"
+ height="32.672359"
+ x="-129.29945"
+ y="102.1592" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="fill:#8d5fd3;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect411"
+ width="5.0292482"
+ height="32.672359"
+ x="-129.29945"
+ y="102.1592" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ y="102.1592"
+ x="-124.27021"
+ height="32.672359"
+ width="5.0292482"
+ id="rect413"
+ style="fill:#c83771;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="fill:#000000;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect415"
+ width="5.0292482"
+ height="32.672359"
+ x="-119.24097"
+ y="102.1592" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ y="102.1592"
+ x="-114.21172"
+ height="32.672359"
+ width="5.0292482"
+ id="rect417"
+ style="fill:#b3b3b3;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="fill:#f9f9f9;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect419"
+ width="5.0292482"
+ height="32.672359"
+ x="-109.18247"
+ y="102.1592" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="fill:#ffff00;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect425"
+ width="5.0292482"
+ height="32.672359"
+ x="-149.41644"
+ y="141.36603" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ y="141.36603"
+ x="-144.38721"
+ height="32.672359"
+ width="5.0292482"
+ id="rect427"
+ style="fill:#668000;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="fill:#a02c2c;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect429"
+ width="5.0292482"
+ height="32.672359"
+ x="-139.35796"
+ y="141.36603" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ y="141.36603"
+ x="-134.3287"
+ height="32.672359"
+ width="5.0292482"
+ id="rect431"
+ style="fill:#ffb380;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="fill:#ffffff;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect433"
+ width="5.0292482"
+ height="32.672359"
+ x="-129.29945"
+ y="141.36603" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="fill:#8d5fd3;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect435"
+ width="5.0292482"
+ height="32.672359"
+ x="-129.29945"
+ y="141.36603" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ y="141.36603"
+ x="-124.27021"
+ height="32.672359"
+ width="5.0292482"
+ id="rect437"
+ style="fill:#c83771;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="fill:#000000;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect439"
+ width="5.0292482"
+ height="32.672359"
+ x="-119.24097"
+ y="141.36603" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ y="141.36603"
+ x="-114.21172"
+ height="32.672359"
+ width="5.0292482"
+ id="rect441"
+ style="fill:#b3b3b3;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000" />
+ <rect
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ style="fill:#f9f9f9;stroke:none;stroke-width:0.0707788;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect443"
+ width="5.0292482"
+ height="32.672359"
+ x="-109.18247"
+ y="141.36603" />
+ <g
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ inkscape:tile-y0="-50.652133"
+ inkscape:tile-x0="-145.56051"
+ inkscape:tile-h="46.511008"
+ inkscape:tile-w="177.51275"
+ inkscape:tile-cy="-27.396629"
+ inkscape:tile-cx="-56.804137"
+ id="g2346"
+ transform="matrix(0.50039435,0,0,0.50039435,-217.85095,-29.32209)">
+ <rect
+ style="fill:#ffffff;stroke:none;stroke-width:0.191973;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect2328"
+ width="177.51276"
+ height="7.7518344"
+ x="-145.56052"
+ y="-50.652134" />
+ <rect
+ y="-42.900299"
+ x="-145.56052"
+ height="7.7518344"
+ width="177.51276"
+ id="rect2330"
+ style="fill:#b3b3b3;stroke:none;stroke-width:0.191973;paint-order:markers fill stroke;stop-color:#000000" />
+ <rect
+ style="fill:#000000;stroke:none;stroke-width:0.191973;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect2332"
+ width="177.51276"
+ height="7.7518344"
+ x="-145.56052"
+ y="-35.148464" />
+ <rect
+ y="-27.396629"
+ x="-145.56052"
+ height="7.7518344"
+ width="177.51276"
+ id="rect2334"
+ style="fill:#c83737;stroke:none;stroke-width:0.191973;paint-order:markers fill stroke;stop-color:#000000" />
+ <rect
+ style="fill:#00ff00;stroke:none;stroke-width:0.191973;paint-order:markers fill stroke;stop-color:#000000"
+ id="rect2336"
+ width="177.51276"
+ height="7.7518344"
+ x="-145.56052"
+ y="-19.644794" />
+ <rect
+ y="-11.89296"
+ x="-145.56052"
+ height="7.7518344"
+ width="177.51276"
+ id="rect2338"
+ style="fill:#0000ff;stroke:none;stroke-width:0.191973;paint-order:markers fill stroke;stop-color:#000000" />
+ </g>
+ <use
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ id="use2590"
+ opacity="0.99854"
+ transform="translate(-1.2249237e-6,39.10006)"
+ xlink:href="#g2346"
+ inkscape:tiled-clone-of="#g2346"
+ y="0"
+ x="0"
+ style="mix-blend-mode:multiply"
+ width="100%"
+ height="100%" />
+ <use
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ id="use2592"
+ transform="translate(-1.2249237e-6,78.200123)"
+ xlink:href="#g2346"
+ inkscape:tiled-clone-of="#g2346"
+ y="0"
+ x="0"
+ style="mix-blend-mode:screen"
+ width="100%"
+ height="100%" />
+ <use
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ id="use2594"
+ transform="translate(-1.2249237e-6,117.30018)"
+ xlink:href="#g2346"
+ inkscape:tiled-clone-of="#g2346"
+ y="0"
+ x="0"
+ style="mix-blend-mode:darken"
+ width="100%"
+ height="100%" />
+ <use
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ id="use2596"
+ transform="translate(-1.2249237e-6,156.40024)"
+ xlink:href="#g2346"
+ inkscape:tiled-clone-of="#g2346"
+ y="0"
+ x="0"
+ style="mix-blend-mode:lighten"
+ width="100%"
+ height="100%" />
+ <use
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ id="use2598"
+ opacity="0.997563"
+ transform="translate(-1.2249237e-6,195.5003)"
+ xlink:href="#g2346"
+ inkscape:tiled-clone-of="#g2346"
+ y="0"
+ x="0"
+ style="mix-blend-mode:overlay"
+ width="100%"
+ height="100%" />
+ <use
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ id="use2600"
+ transform="translate(-1.2249237e-6,234.60036)"
+ xlink:href="#g2346"
+ inkscape:tiled-clone-of="#g2346"
+ y="0"
+ x="0"
+ style="mix-blend-mode:color-dodge"
+ width="100%"
+ height="100%" />
+ <use
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ id="use2602"
+ opacity="0.996107"
+ transform="translate(-1.2249237e-6,273.70042)"
+ xlink:href="#g2346"
+ inkscape:tiled-clone-of="#g2346"
+ y="0"
+ x="0"
+ style="mix-blend-mode:color-burn"
+ width="100%"
+ height="100%" />
+ <use
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ id="use2604"
+ opacity="0.999634"
+ transform="translate(97.709007,235.26658)"
+ xlink:href="#g2346"
+ inkscape:tiled-clone-of="#g2346"
+ y="0"
+ x="0"
+ style="mix-blend-mode:hard-light"
+ width="100%"
+ height="100%" />
+ <use
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ id="use2606"
+ transform="translate(97.709007,274.36665)"
+ xlink:href="#g2346"
+ inkscape:tiled-clone-of="#g2346"
+ y="0"
+ x="0"
+ style="mix-blend-mode:soft-light"
+ width="100%"
+ height="100%" />
+ <use
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ id="use2608"
+ opacity="0.997749"
+ transform="translate(97.709017)"
+ xlink:href="#g2346"
+ inkscape:tiled-clone-of="#g2346"
+ y="0"
+ x="0"
+ style="mix-blend-mode:difference"
+ width="100%"
+ height="100%" />
+ <use
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ id="use2610"
+ opacity="0.997575"
+ transform="translate(97.709017,39.10006)"
+ xlink:href="#g2346"
+ inkscape:tiled-clone-of="#g2346"
+ y="0"
+ x="0"
+ style="mix-blend-mode:exclusion"
+ width="100%"
+ height="100%" />
+ <use
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ id="use2612"
+ opacity="0.997971"
+ transform="translate(97.709017,78.200123)"
+ xlink:href="#g2346"
+ inkscape:tiled-clone-of="#g2346"
+ y="0"
+ x="0"
+ style="mix-blend-mode:hue"
+ width="100%"
+ height="100%" />
+ <use
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ id="use2614"
+ opacity="0.998124"
+ transform="translate(97.709017,117.30018)"
+ xlink:href="#g2346"
+ inkscape:tiled-clone-of="#g2346"
+ y="0"
+ x="0"
+ style="mix-blend-mode:saturation"
+ width="100%"
+ height="100%" />
+ <use
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ id="use2616"
+ transform="translate(97.709017,156.40024)"
+ xlink:href="#g2346"
+ inkscape:tiled-clone-of="#g2346"
+ y="0"
+ x="0"
+ style="mix-blend-mode:color"
+ width="100%"
+ height="100%" />
+ <use
+ inkscape:export-ydpi="36.181969"
+ inkscape:export-xdpi="36.181969"
+ id="use2618"
+ transform="translate(97.709017,195.5003)"
+ xlink:href="#g2346"
+ inkscape:tiled-clone-of="#g2346"
+ y="0"
+ x="0"
+ style="mix-blend-mode:luminosity"
+ width="100%"
+ height="100%" />
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg2/multi-filter-ref.png b/rsvg/tests/fixtures/reftests/svg2/multi-filter-ref.png
new file mode 100644
index 00000000..c5739cbd
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg2/multi-filter-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg2/multi-filter.svg b/rsvg/tests/fixtures/reftests/svg2/multi-filter.svg
new file mode 100644
index 00000000..a5b08415
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg2/multi-filter.svg
@@ -0,0 +1,22 @@
+<svg width="123" height="114" xmlns="http://www.w3.org/2000/svg">
+ <defs>
+ <filter id="filter1">
+ <feGaussianBlur stdDeviation="3"/>
+ </filter>
+ <filter id="filter2">
+ <feColorMatrix type="hueRotate" values="45"/>
+ </filter>
+ </defs>
+ <metadata id="metadata5">image/svg+xml</metadata>
+ <g>
+ <title>background</title>
+ <rect fill="none" id="canvas_background" height="116" width="125" y="-1" x="-1"/>
+ </g>
+ <g>
+ <title>Layer 1</title>
+ <g id="layer1">
+ <rect fill="#0000ff" fill-rule="evenodd" stroke-width="0.26458" id="rect833" width="73.38349" height="60.49095" x="8.5901" y="12.87481"/>
+ <ellipse fill="#ff0000" fill-rule="evenodd" stroke-width="0.26458" filter="url(#filter1) url(#filter2)" id="path835" cx="67.3905" cy="70.02157" rx="37.57762" ry="22.7273"/>
+ </g>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg2/paint-order-ref.png b/rsvg/tests/fixtures/reftests/svg2/paint-order-ref.png
new file mode 100644
index 00000000..b8194522
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg2/paint-order-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg2/paint-order.svg b/rsvg/tests/fixtures/reftests/svg2/paint-order.svg
new file mode 100644
index 00000000..74193bae
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg2/paint-order.svg
@@ -0,0 +1,6 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="750" height="450">
+<rect height="300" width="1000" fill="#98fb98"/>
+<rect height="300" width="1000" y="300" fill="#87cefa"/>
+<path d="M 200 300 H 1000" stroke="#deb887" stroke-width="37.5"/>
+<path d="M -200 -100 a 100 100 0 0 1 100 -100 h 200 a 100 100 0 0 1 100 100 v 200 a 100 100 0 0 1 -100 100 h -200 a 100 100 0 0 1 -100 -100 z" stroke="#deb887" stroke-width="125" fill="white" paint-order="stroke fill" transform="matrix(0.6 0 0 0.6 200 300)"/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/svg2/text-paint-order-ref.png b/rsvg/tests/fixtures/reftests/svg2/text-paint-order-ref.png
new file mode 100644
index 00000000..67c54d37
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg2/text-paint-order-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/svg2/text-paint-order.svg b/rsvg/tests/fixtures/reftests/svg2/text-paint-order.svg
new file mode 100644
index 00000000..0bdc3146
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/svg2/text-paint-order.svg
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="600" height="200">
+ <defs>
+ <text id="hello" style='font: bold 80px sans-serif;' stroke-width="8">
+ <tspan x="10" y="80" stroke="green" fill="midnightblue">Hello</tspan>
+ <tspan x="250" y="80" stroke="lime" fill="orange">World!</tspan>
+ </text>
+ </defs>
+
+ <use href="#hello" style="paint-order: normal;"/>
+ <use href="#hello" style="paint-order: stroke fill;" transform="translate(0, 100)"/>
+</svg> \ No newline at end of file
diff --git a/rsvg/tests/fixtures/reftests/system-language-de-ref.png b/rsvg/tests/fixtures/reftests/system-language-de-ref.png
new file mode 100644
index 00000000..56e95a80
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/system-language-de-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/system-language-de.svg b/rsvg/tests/fixtures/reftests/system-language-de.svg
new file mode 100644
index 00000000..a3c3d0be
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/system-language-de.svg
@@ -0,0 +1,7 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="10" height="10">
+ <switch allowReorder="yes" id="switch1">
+ <rect systemLanguage="de" fill="chartreuse" id="rect1" width="10" height="10" />
+ <rect systemLanguage="en" fill="tomato" id="rect2" width="10" height="10" />
+ <rect fill="blue" id="rect3" width="10" height="10" />
+ </switch>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/system-language-en-ref.png b/rsvg/tests/fixtures/reftests/system-language-en-ref.png
new file mode 100644
index 00000000..eaca40e0
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/system-language-en-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/system-language-en.svg b/rsvg/tests/fixtures/reftests/system-language-en.svg
new file mode 100644
index 00000000..a9335148
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/system-language-en.svg
@@ -0,0 +1,7 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="10" height="10">
+ <switch allowReorder="yes" id="switch1">
+ <rect systemLanguage="it" fill="chartreuse" id="rect1" width="10" height="10" />
+ <rect systemLanguage="en" fill="tomato" id="rect2" width="10" height="10" />
+ <rect fill="blue" id="rect3" width="10" height="10" />
+ </switch>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/system-language-other-ref.png b/rsvg/tests/fixtures/reftests/system-language-other-ref.png
new file mode 100644
index 00000000..1ed070ca
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/system-language-other-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/system-language-other.svg b/rsvg/tests/fixtures/reftests/system-language-other.svg
new file mode 100644
index 00000000..ded93b58
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/system-language-other.svg
@@ -0,0 +1,7 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="10" height="10">
+ <switch allowReorder="yes" id="switch1">
+ <rect systemLanguage="it" fill="chartreuse" id="rect1" width="10" height="10" />
+ <rect systemLanguage="fr" fill="tomato" id="rect2" width="10" height="10" />
+ <rect fill="blue" id="rect3" width="10" height="10" />
+ </switch>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/text-objectBoundingBox-ref.png b/rsvg/tests/fixtures/reftests/text-objectBoundingBox-ref.png
new file mode 100644
index 00000000..725a8f14
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/text-objectBoundingBox-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/text-objectBoundingBox.svg b/rsvg/tests/fixtures/reftests/text-objectBoundingBox.svg
new file mode 100644
index 00000000..e1eea306
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/text-objectBoundingBox.svg
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="600" height="210">
+ <linearGradient id="gradient">
+ <stop offset="0.00" style="stop-color: black;"/>
+ <stop offset="0.25" style="stop-color: black;"/>
+ <stop offset="0.25" style="stop-color: white;"/>
+ <stop offset="0.75" style="stop-color: white;"/>
+ <stop offset="0.75" style="stop-color: black;"/>
+ <stop offset="1.00" style="stop-color: black;"/>
+ </linearGradient>
+ <line x1="300" y1="0" x2="300" y2="210" stroke-width="2" stroke="blue"/>
+ <text style="font: 50px Ahem;" fill="url(#gradient)"><tspan text-anchor="start" x="300" y="50">abcd</tspan><tspan text-anchor="end" x="300" y="100">abcd</tspan></text>
+ <rect x="100" y="150" width="400" height="50" fill="url(#gradient)"/>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/text.txt b/rsvg/tests/fixtures/reftests/text.txt
new file mode 100644
index 00000000..802992c4
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/text.txt
@@ -0,0 +1 @@
+Hello world
diff --git a/rsvg/tests/fixtures/reftests/xml-lang-css-inherit-ref.png b/rsvg/tests/fixtures/reftests/xml-lang-css-inherit-ref.png
new file mode 100644
index 00000000..a1f5280a
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/xml-lang-css-inherit-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/xml-lang-css-inherit.svg b/rsvg/tests/fixtures/reftests/xml-lang-css-inherit.svg
new file mode 100644
index 00000000..498c92f1
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/xml-lang-css-inherit.svg
@@ -0,0 +1,7 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="10" height="10">
+ <style type="text/css">
+ .test { fill: red }
+ :lang(de) { fill: black }
+ </style>
+ <g class="test" xml:lang="de"><rect x="0" y="0" width="10" height="10"/></g>
+</svg>
diff --git a/rsvg/tests/fixtures/reftests/xml-lang-css-ref.png b/rsvg/tests/fixtures/reftests/xml-lang-css-ref.png
new file mode 100644
index 00000000..b200c44b
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/xml-lang-css-ref.png
Binary files differ
diff --git a/rsvg/tests/fixtures/reftests/xml-lang-css.svg b/rsvg/tests/fixtures/reftests/xml-lang-css.svg
new file mode 100644
index 00000000..9267fb42
--- /dev/null
+++ b/rsvg/tests/fixtures/reftests/xml-lang-css.svg
@@ -0,0 +1,22 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="10" height="50">
+ <style type="text/css">
+ /* Elements should appear in red-green-blue-yellow order.
+ The :lang(en) should match en-US. It will also match en-GB,
+ but that gets overridden later. */
+ :lang(en, cn) { fill: red }
+ /* Languages should be inherited from their parent elements. */
+ :lang(es) { fill: green }
+ /* Child languages should override the parent ones. */
+ :lang(it) { fill: blue }
+ /* Language inheritence should walk more than one level of the DOM.
+ en-GB should match en-GB, but not en-US. */
+ :lang(en-GB) { fill: yellow }
+ /* a rect with no lang attribute should default to black */
+ svg { fill: black }
+ </style>
+ <rect xml:lang="en-US" x="0" y="0" width="10" height="10" />
+ <g xml:lang="es"><rect x="0" y="10" width="10" height="10" /></g>
+ <g xml:lang="es"><rect xml:lang="it" x="0" y="20" width="10" height="10" /></g>
+ <g xml:lang="en-GB"><g><rect x="0" y="30" width="10" height="10" /></g></g>
+ <rect x="0" y="40" width="10" height="10"/>
+</svg>
diff --git a/rsvg/tests/fixtures/render-crash/PixelRectangle-duplicate-crash.svg b/rsvg/tests/fixtures/render-crash/PixelRectangle-duplicate-crash.svg
new file mode 100644
index 00000000..7919be95
--- /dev/null
+++ b/rsvg/tests/fixtures/render-crash/PixelRectangle-duplicate-crash.svg
@@ -0,0 +1,7 @@
+<svg>
+ <filter id="f">
+ <feConvolveMatrix kernelMatrix="0 0 0 0-0 0 0 0 0"/>
+ </filter>
+
+ <rect width="1" height="1" filter="url(#f)"/>
+</svg>
diff --git a/rsvg/tests/fixtures/render-crash/bug187-set-gradient-on-empty-path.svg b/rsvg/tests/fixtures/render-crash/bug187-set-gradient-on-empty-path.svg
new file mode 100644
index 00000000..d6b7f65b
--- /dev/null
+++ b/rsvg/tests/fixtures/render-crash/bug187-set-gradient-on-empty-path.svg
@@ -0,0 +1,13 @@
+<svg xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ width="10" height="10">
+ <defs>
+ <linearGradient id="grad"/>
+ <g id="path">
+ <path d=""/>
+ </g>
+ </defs>
+ <g>
+ <use style="fill:url(#grad)" xlink:href="#path"/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/render-crash/bug193-filters-conv-05-f.svg b/rsvg/tests/fixtures/render-crash/bug193-filters-conv-05-f.svg
new file mode 100644
index 00000000..b60f774e
--- /dev/null
+++ b/rsvg/tests/fixtures/render-crash/bug193-filters-conv-05-f.svg
@@ -0,0 +1,83 @@
+<svg id="svg-root" width="100%" height="100%"
+ viewBox="0 0 480 360" xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======================================================================-->
+ <!--= Copyright 2008 World Wide Web Consortium, (Massachusetts =-->
+ <!--= Institute of Technology, European Research Consortium for =-->
+ <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
+ <!--= All Rights Reserved. =-->
+ <!--= See http://www.w3.org/Consortium/Legal/. =-->
+ <!--======================================================================-->
+ <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+ template-version="1.3" reviewer="CM" author="ED" status="created"
+ version="$Revision: 1.2 $" testname="$RCSfile: filters-conv-05-f.svg,v $">
+ <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/filters.html#feConvolveMatrixElementOrderAttribute">
+ <p>
+ Tests feConvolveMatrix and the 'edgeMode' attribute.
+ </p>
+ </d:testDescription>
+ <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ Run the test. No interaction required.
+ </p>
+ </d:operatorScript>
+ <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+ <p>
+ You should see three filtered images, each result should be slightly different, if they all look the same the test has failed.
+ The rendered picture should match the reference image.
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="test-title">$RCSfile: filters-conv-05-f.svg,v $</title>
+ <defs>
+ <font-face
+ font-family="SVGFreeSansASCII"
+ unicode-range="U+0-7F">
+ <font-face-src>
+ <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+ <defs>
+ <filter id="emNone" filterUnits="objectBoundingBox" primitiveUnits="objectBoundingBox" x="0" y="0" width="1" height="1">
+ <feConvolveMatrix kernelMatrix="1 1 1 1 -7 1 1 1 1" preserveAlpha="false" edgeMode="none"/>
+ </filter>
+ <filter id="emWrap" filterUnits="objectBoundingBox" primitiveUnits="objectBoundingBox" x="0" y="0" width="1" height="1">
+ <feConvolveMatrix kernelMatrix="1 1 1 1 -7 1 1 1 1" preserveAlpha="false" edgeMode="wrap"/>
+ </filter>
+ <filter id="emDuplicate" filterUnits="objectBoundingBox" primitiveUnits="objectBoundingBox" x="0" y="0" width="1" height="1">
+ <feConvolveMatrix kernelMatrix="1 1 1 1 -7 1 1 1 1" preserveAlpha="false" edgeMode="duplicate"/>
+ </filter>
+
+ <g id="box">
+ <rect width="10" height="100" fill="blue"/>
+ <rect x="10" width="100" height="10" fill="yellow"/>
+ <rect x="110" width="10" height="100" fill="lime"/>
+ <rect x="10" y="90" width="100" height="10" fill="black"/>
+ </g>
+ </defs>
+
+ <text x="50%" y="3em" style="font-size:18px; text-anchor:middle">feConvolveMatrix 'edgeMode'</text>
+
+ <use xlink:href="#box" filter="url(#emNone)" transform="translate(40 100)"/>
+ <text x="100" y="220" font-size="14" text-anchor="middle">none</text>
+
+ <use xlink:href="#box" filter="url(#emWrap)" transform="translate(180 100)"/>
+ <text x="240" y="220" font-size="14" text-anchor="middle">wrap</text>
+
+ <use xlink:href="#box" filter="url(#emDuplicate)" transform="translate(320 100)"/>
+ <text x="380" y="220" font-size="14" text-anchor="middle">duplicate</text>
+ </g>
+ <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+ <text id="revision" x="10" y="340" stroke="none"
+ fill="black">$Revision: 1.2 $</text>
+ </g>
+ <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000"/>
+ <!-- comment out this watermark once the test is approved -->
+ <g id="draft-watermark">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+ text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/render-crash/bug227-negative-dasharray-value.svg b/rsvg/tests/fixtures/render-crash/bug227-negative-dasharray-value.svg
new file mode 100644
index 00000000..3abee723
--- /dev/null
+++ b/rsvg/tests/fixtures/render-crash/bug227-negative-dasharray-value.svg
@@ -0,0 +1,3 @@
+<svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
+ <rect x="10" y="10" width="90" height="90" fill="none" stroke="black" stroke-dasharray="20,40,-20"/>
+</svg>
diff --git a/rsvg/tests/fixtures/render-crash/bug266-filters-with-error-attributes.svg b/rsvg/tests/fixtures/render-crash/bug266-filters-with-error-attributes.svg
new file mode 100644
index 00000000..34654903
--- /dev/null
+++ b/rsvg/tests/fixtures/render-crash/bug266-filters-with-error-attributes.svg
@@ -0,0 +1,187 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="64"
+ height="64"
+ id="svg2463"
+ sodipodi:version="0.32"
+ inkscape:version="0.47 r22583"
+ version="1.0"
+ sodipodi:docname="star.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape">
+ <defs
+ id="defs2465">
+ <linearGradient
+ id="linearGradient3596">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop3598" />
+ <stop
+ id="stop3604"
+ offset="0.35157821"
+ style="stop-color:#ffffff;stop-opacity:0.82681566;" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="1"
+ id="stop3600" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3262">
+ <stop
+ style="stop-color:#f5f5f5;stop-opacity:0.22680412;"
+ offset="0"
+ id="stop3264" />
+ <stop
+ style="stop-color:#f5f5f5;stop-opacity:0.96078432;"
+ offset="1"
+ id="stop3266" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3751"
+ inkscape:collect="always">
+ <stop
+ id="stop3753"
+ offset="0"
+ style="stop-color:black;stop-opacity:1;" />
+ <stop
+ id="stop3755"
+ offset="1"
+ style="stop-color:black;stop-opacity:0;" />
+ </linearGradient>
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ id="perspective2471" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3751"
+ id="linearGradient3272"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.3868046,0,0,0.3868046,40.335717,481.59837)"
+ x1="665.12128"
+ y1="684.16162"
+ x2="381.28015"
+ y2="449.80624" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3751"
+ id="linearGradient2406"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.3868046,0,0,0.3868046,43.114888,485.8841)"
+ x1="665.12128"
+ y1="684.16162"
+ x2="381.28015"
+ y2="449.80624" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3596"
+ id="radialGradient3602"
+ cx="31.851444"
+ cy="31.795218"
+ fx="31.851444"
+ fy="31.795218"
+ r="30.551558"
+ gradientTransform="matrix(1,0,0,0.95456924,0,1.3128087)"
+ gradientUnits="userSpaceOnUse" />
+ <filter
+ id="filter3086"
+ inkscape:label="Drop shadow"
+ width="1.5"
+ height="1.5"
+ x="-.25"
+ y="-.25">
+ <feGaussianBlur
+ id="feGaussianBlur3088"
+ in="SourceAlpha"
+ stdDeviation="4,000000"
+ result="blur" />
+ <feColorMatrix
+ id="feColorMatrix3090"
+ result="bluralpha"
+ type="matrix"
+ values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 0,500000 0 " />
+ <feOffset
+ id="feOffset3092"
+ in="bluralpha"
+ dx="0,000000"
+ dy="0,000000"
+ result="offsetBlur" />
+ <feMerge
+ id="feMerge3094">
+ <feMergeNode
+ id="feMergeNode3096"
+ in="offsetBlur" />
+ <feMergeNode
+ id="feMergeNode3098"
+ in="SourceGraphic" />
+ </feMerge>
+ </filter>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#f5f5f5"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ gridtolerance="10000"
+ guidetolerance="10"
+ objecttolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.6"
+ inkscape:cx="26.939127"
+ inkscape:cy="39.646263"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1440"
+ inkscape:window-height="854"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata2468">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(-110.35967,-771.51188)">
+ <path
+ sodipodi:type="star"
+ style="fill:url(#radialGradient3602);fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter3086)"
+ id="path2822"
+ sodipodi:sides="5"
+ sodipodi:cx="31.964287"
+ sodipodi:cy="31.857143"
+ sodipodi:r1="32.125885"
+ sodipodi:r2="4.8188829"
+ sodipodi:arg1="0.93111088"
+ sodipodi:arg2="1.5577518"
+ inkscape:flatsided="false"
+ inkscape:rounded="0"
+ inkscape:randomized="0"
+ d="M 51.141613,57.631213 32.027145,36.675616 13.377809,58.06049 27.401071,33.405915 1.2998864,22.277632 29.081206,27.995864 31.599122,-0.26666619 34.745661,27.92197 62.403003,21.583048 36.566351,33.286352 51.141613,57.631213 z"
+ transform="matrix(1.0474097,0,0,1.0972591,108.99816,771.80448)" />
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/render-crash/bug277-filter-on-empty-group.svg b/rsvg/tests/fixtures/render-crash/bug277-filter-on-empty-group.svg
new file mode 100644
index 00000000..931d86b5
--- /dev/null
+++ b/rsvg/tests/fixtures/render-crash/bug277-filter-on-empty-group.svg
@@ -0,0 +1,312 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ width="48"
+ height="48"
+ id="svg3876"
+ inkscape:version="0.47 r22583"
+ sodipodi:docname="icon.svg"
+ enable-background="new">
+ <metadata
+ id="metadata68">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1239"
+ inkscape:window-height="860"
+ id="namedview66"
+ showgrid="false"
+ inkscape:zoom="8"
+ inkscape:cx="41.43654"
+ inkscape:cy="21.274857"
+ inkscape:window-x="194"
+ inkscape:window-y="44"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="layer1-9" />
+ <defs
+ id="defs3878">
+ <linearGradient
+ id="linearGradient7408">
+ <stop
+ style="stop-color:#8babcb;stop-opacity:1;"
+ offset="0"
+ id="stop7410" />
+ <stop
+ id="stop7412"
+ offset="0.96296567"
+ style="stop-color:#8babcb;stop-opacity:0.49803922;" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0"
+ offset="1"
+ id="stop7414" />
+ </linearGradient>
+ <filter
+ inkscape:collect="always"
+ id="filter8368">
+ <feBlend
+ inkscape:collect="always"
+ mode="darken"
+ in2="BackgroundImage"
+ id="feBlend8370" />
+ </filter>
+ <linearGradient
+ y2="24.893845"
+ x2="3.2591991"
+ y1="12.875"
+ x1="31"
+ gradientTransform="translate(0.5359996,5.4989969)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient7232"
+ xlink:href="#linearGradient7408"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient3339">
+ <stop
+ id="stop3341"
+ offset="0"
+ style="stop-color:#8babcb;stop-opacity:1;" />
+ <stop
+ style="stop-color:#8babcb;stop-opacity:0.49803922;"
+ offset="0.5"
+ id="stop8259" />
+ <stop
+ id="stop3343"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0" />
+ </linearGradient>
+ <linearGradient
+ y2="20.4375"
+ x2="36.375"
+ y1="26.125"
+ x1="39"
+ gradientTransform="translate(0.5359996,-1.5010031)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient7236"
+ xlink:href="#linearGradient3241"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient3241">
+ <stop
+ id="stop3243"
+ offset="0"
+ style="stop-color:#232323;stop-opacity:1;" />
+ <stop
+ id="stop3245"
+ offset="1"
+ style="stop-color:#babdb6;stop-opacity:1" />
+ </linearGradient>
+ <linearGradient
+ y2="41.40625"
+ x2="44.8125"
+ y1="42.21875"
+ x1="42.90625"
+ gradientTransform="translate(0.5359996,-1.5010031)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient7238"
+ xlink:href="#linearGradient3220"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient3220">
+ <stop
+ id="stop3222"
+ offset="0"
+ style="stop-color:#2e3436;stop-opacity:1" />
+ <stop
+ style="stop-color:#888a85;stop-opacity:1;"
+ offset="0.64444447"
+ id="stop3228" />
+ <stop
+ id="stop3224"
+ offset="1"
+ style="stop-color:#555753;stop-opacity:1" />
+ </linearGradient>
+ <linearGradient
+ y2="16.859249"
+ x2="37.723743"
+ y1="16.859249"
+ x1="31.994286"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient7240"
+ xlink:href="#linearGradient3338"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient3338">
+ <stop
+ id="stop3340"
+ offset="0"
+ style="stop-color:#eeeeec;stop-opacity:1" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0.78888887"
+ id="stop3346" />
+ <stop
+ id="stop3342"
+ offset="1"
+ style="stop-color:#eeeeec;stop-opacity:1" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3339"
+ id="radialGradient8257"
+ cx="32.5"
+ cy="16.5625"
+ fx="32.5"
+ fy="16.5625"
+ r="14.4375"
+ gradientUnits="userSpaceOnUse" />
+ </defs>
+ <g
+ inkscape:groupmode="layer"
+ id="layer1"
+ inkscape:label="Sfondo"
+ style="opacity:1" />
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Livello#1"
+ style="display:inline" />
+ <g
+ inkscape:groupmode="layer"
+ id="layer2"
+ inkscape:label="Livello"
+ style="display:inline;filter:url(#filter8368)" />
+ <g
+ inkscape:groupmode="layer"
+ id="layer3"
+ inkscape:label="wall"
+ style="display:inline" />
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Livello#2">
+ <g
+ inkscape:label="Layer 1"
+ id="layer1-9"
+ transform="translate(-0.09269217,-3.9395389)">
+ <g
+ style="display:inline"
+ transform="matrix(0.02364027,0,0,0.02299537,45.026495,39.465331)"
+ id="g13071" />
+ <g
+ style="opacity:0.5;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-opacity:1"
+ inkscape:r_cy="true"
+ inkscape:r_cx="true"
+ transform="matrix(0.190868,0.16126,0.16126,-0.190868,7.2809156,24.306129)"
+ id="g2424" />
+ <rect
+ y="4"
+ x="-1.110223e-16"
+ height="48"
+ width="48"
+ id="rect4784"
+ style="fill:none;stroke:none" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ id="path3337"
+ d="M 0.91099965,27.748998 C 28.15259,29.47655 10.984791,13.750064 32.035999,13.248998 l 5.289214,11.115039 C 27.718749,19.884726 21.14768,42.897034 0.78599965,29.373998 l 0.125,-1.625 z"
+ style="opacity:0.44444442000000001;fill:url(#linearGradient7232);fill-opacity:1;fill-rule:evenodd;stroke:none;display:inline" />
+ <path
+ transform="matrix(0.92838024,0,0,0.92838024,2.6527696,2.3493279)"
+ d="M 46.9375,16.5625 C 46.9375,24.536111 40.473611,31 32.5,31 24.526389,31 18.0625,24.536111 18.0625,16.5625 18.0625,8.5888889 24.526389,2.125 32.5,2.125 c 7.973611,0 14.4375,6.4638889 14.4375,14.4375 z"
+ sodipodi:ry="14.4375"
+ sodipodi:rx="14.4375"
+ sodipodi:cy="16.5625"
+ sodipodi:cx="32.5"
+ id="path3249"
+ style="fill:url(#radialGradient8257);fill-opacity:1;stroke:none;display:inline"
+ sodipodi:type="arc" />
+ <path
+ sodipodi:nodetypes="cc"
+ id="path3218"
+ d="m 33.035999,14.998998 13,29.000001"
+ style="fill:none;stroke:url(#linearGradient7236);stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" />
+ <path
+ sodipodi:nodetypes="cc"
+ id="path2243"
+ d="m 33.035999,14.998998 13,29.000001"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient7238);stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" />
+ <path
+ transform="matrix(1.2726133,0,0,1.2726133,12.072081,-6.6736441)"
+ d="M 15.5,24.75 11.728554,24.195391 9.4510341,27.075687 8.8130572,23.317446 5.3699407,22.041456 8.7470953,20.273343 8.8966522,16.604442 11.621825,19.26993 15.157373,18.278415 13.464468,21.693889 15.5,24.75 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="false"
+ sodipodi:arg2="1.2349717"
+ sodipodi:arg1="0.57542465"
+ sodipodi:r2="2.590076"
+ sodipodi:r1="5.5127692"
+ sodipodi:cy="21.75"
+ sodipodi:cx="10.875"
+ sodipodi:sides="5"
+ id="path3331"
+ style="fill:#232323;fill-opacity:0.86274510999999998;stroke:none;display:inline;fill-rule:nonzero;opacity:0.90000002000000001"
+ sodipodi:type="star" />
+ <path
+ transform="matrix(0.5838837,0.5838837,-0.5838837,0.5838837,24.481283,9.4773739)"
+ d="M 15.5,24.75 11.728554,24.195391 9.4510341,27.075687 8.8130572,23.317446 5.3699407,22.041456 8.7470953,20.273343 8.8966522,16.604442 11.621825,19.26993 15.157373,18.278415 13.464468,21.693889 15.5,24.75 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="false"
+ sodipodi:arg2="1.2349717"
+ sodipodi:arg1="0.57542465"
+ sodipodi:r2="2.590076"
+ sodipodi:r1="5.5127692"
+ sodipodi:cy="21.75"
+ sodipodi:cx="10.875"
+ sodipodi:sides="5"
+ id="path3333"
+ style="fill:#232323;fill-opacity:0.78431373999999998;stroke:none;display:inline;fill-rule:nonzero;opacity:0.79999999"
+ sodipodi:type="star" />
+ <path
+ transform="matrix(0.5791026,0.1286037,-0.1286037,0.5791026,5.2445836,16.598497)"
+ d="M 15.5,24.75 11.728554,24.195391 9.4510341,27.075687 8.8130572,23.317446 5.3699407,22.041456 8.7470953,20.273343 8.8966522,16.604442 11.621825,19.26993 15.157373,18.278415 13.464468,21.693889 15.5,24.75 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="false"
+ sodipodi:arg2="1.2349717"
+ sodipodi:arg1="0.57542465"
+ sodipodi:r2="2.590076"
+ sodipodi:r1="5.5127692"
+ sodipodi:cy="21.75"
+ sodipodi:cx="10.875"
+ sodipodi:sides="5"
+ id="path3335"
+ style="fill:#232323;fill-opacity:0.70588236999999998;stroke:none;display:inline;fill-rule:nonzero;opacity:0.68000006"
+ sodipodi:type="star" />
+ <path
+ transform="translate(0.00566865,1.9989969)"
+ d="m 32.9375,11.9375 c -0.05811,0.0063 -0.09582,0.01691 -0.15625,0.03125 -0.300742,0.07555 -0.557097,0.314315 -0.6875,0.59375 -0.130403,0.279435 -0.134816,0.56567 0,0.84375 l 3.75,8.34375 a 0.02694836,0.02694836 0 0 0 0,0.03125 0.02694836,0.02694836 0 0 0 0.03125,0 0.02694836,0.02694836 0 0 0 0.03125,0 0.02694836,0.02694836 0 0 0 0,-0.03125 c 0.234458,-0.405774 0.576958,-0.667125 1.03125,-0.78125 0.248808,-0.05903 0.510721,-0.05104 0.75,0 a 0.02694836,0.02694836 0 0 0 0.03125,0 0.02694836,0.02694836 0 0 0 0,-0.03125 l -3.75,-8.34375 C 33.824845,12.242701 33.483751,11.983006 33.125,11.9375 c -0.06049,-0.0077 -0.129389,-0.0063 -0.1875,0 z"
+ id="path3336"
+ style="fill:url(#linearGradient7240);fill-opacity:1;fill-rule:evenodd;stroke:none;display:inline"
+ inkscape:original="M 33.125 11.96875 C 33.008736 11.954002 32.901006 11.971586 32.78125 12 C 32.489313 12.073339 32.252292 12.289732 32.125 12.5625 C 31.997708 12.835268 31.993687 13.135395 32.125 13.40625 L 35.875 21.75 C 36.112714 21.338591 36.476318 21.053356 36.9375 20.9375 C 37.190796 20.877401 37.445043 20.885783 37.6875 20.9375 L 33.9375 12.59375 C 33.797448 12.252099 33.473792 12.012993 33.125 11.96875 z "
+ inkscape:radius="0.026945664"
+ sodipodi:type="inkscape:offset" />
+ </g>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/render-crash/bug292-clip-empty-group.svg b/rsvg/tests/fixtures/render-crash/bug292-clip-empty-group.svg
new file mode 100644
index 00000000..5e09d11c
--- /dev/null
+++ b/rsvg/tests/fixtures/render-crash/bug292-clip-empty-group.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg viewBox="0 0 640 480" version="1.1" xmlns="http://www.w3.org/2000/svg">
+ <defs>
+ <clipPath id="foo" clipPathUnits="objectBoundingBox">
+ <rect x="0" y="0" width="10" height="10"/>
+ </clipPath>
+ </defs>
+ <g clip-path="url(#foo)"/>
+</svg>
diff --git a/rsvg/tests/fixtures/render-crash/bug293-mask-empty-group.svg b/rsvg/tests/fixtures/render-crash/bug293-mask-empty-group.svg
new file mode 100644
index 00000000..95b8e39d
--- /dev/null
+++ b/rsvg/tests/fixtures/render-crash/bug293-mask-empty-group.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg viewBox="0 0 640 480" version="1.1" xmlns="http://www.w3.org/2000/svg">
+ <defs>
+ <mask id="foo" clipPathUnits="objectBoundingBox">
+ <rect x="0" y="0" width="10" height="10"/>
+ </mask>
+ </defs>
+ <g mask="url(#foo)"/>
+</svg>
diff --git a/rsvg/tests/fixtures/render-crash/bug324-empty-svg.svg b/rsvg/tests/fixtures/render-crash/bug324-empty-svg.svg
new file mode 100644
index 00000000..c36f5108
--- /dev/null
+++ b/rsvg/tests/fixtures/render-crash/bug324-empty-svg.svg
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<svg xmlns="http://www.w3.org/2000/svg">
+</svg>
diff --git a/rsvg/tests/fixtures/render-crash/bug337-font-ex.svg b/rsvg/tests/fixtures/render-crash/bug337-font-ex.svg
new file mode 100644
index 00000000..9b517e89
--- /dev/null
+++ b/rsvg/tests/fixtures/render-crash/bug337-font-ex.svg
@@ -0,0 +1,9 @@
+<svg>
+ <style>
+ text {
+ font-size: 0ex;
+ }
+ </style>
+
+ <text>0</text>
+</svg>
diff --git a/rsvg/tests/fixtures/render-crash/bug338-zero-sized-image.svg b/rsvg/tests/fixtures/render-crash/bug338-zero-sized-image.svg
new file mode 100644
index 00000000..91995450
--- /dev/null
+++ b/rsvg/tests/fixtures/render-crash/bug338-zero-sized-image.svg
@@ -0,0 +1,3 @@
+<svg xmlns:xlink="http://www.w3.org/1999/xlink">
+ <image xlink:href="data:;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AA0000lEQVQ0"/>
+</svg>
diff --git a/rsvg/tests/fixtures/render-crash/bug340-marker-with-zero-sized-vbox.svg b/rsvg/tests/fixtures/render-crash/bug340-marker-with-zero-sized-vbox.svg
new file mode 100644
index 00000000..05c00ab8
--- /dev/null
+++ b/rsvg/tests/fixtures/render-crash/bug340-marker-with-zero-sized-vbox.svg
@@ -0,0 +1,4 @@
+<svg>
+ <marker viewBox="0 0 0 0" id="m"/>
+ <path marker-start="url(#m)" d="M0 0 0 0"/>
+</svg>
diff --git a/rsvg/tests/fixtures/render-crash/bug342-use-references-ancestor.svg b/rsvg/tests/fixtures/render-crash/bug342-use-references-ancestor.svg
new file mode 100644
index 00000000..45f60594
--- /dev/null
+++ b/rsvg/tests/fixtures/render-crash/bug342-use-references-ancestor.svg
@@ -0,0 +1,5 @@
+<svg xmlns:xlink="http://www.w3.org/1999/xlink">
+ <g id="g">
+ <use xlink:href="#g"/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/render-crash/bug343-feComponentTransfer-child-in-error.svg b/rsvg/tests/fixtures/render-crash/bug343-feComponentTransfer-child-in-error.svg
new file mode 100644
index 00000000..e6991a2f
--- /dev/null
+++ b/rsvg/tests/fixtures/render-crash/bug343-feComponentTransfer-child-in-error.svg
@@ -0,0 +1,9 @@
+<svg>
+ <filter id="f">
+ <feComponentTransfer>
+ <feFuncR type="table" tableValues="@"/>
+ </feComponentTransfer>
+ </filter>
+
+ <text filter="url(#f)">0</text>
+</svg>
diff --git a/rsvg/tests/fixtures/render-crash/bug344-too-large-viewbox.svg b/rsvg/tests/fixtures/render-crash/bug344-too-large-viewbox.svg
new file mode 100644
index 00000000..ff89b5a0
--- /dev/null
+++ b/rsvg/tests/fixtures/render-crash/bug344-too-large-viewbox.svg
@@ -0,0 +1 @@
+<svg width="8" viewBox="0 0 9E80.7"></svg>
diff --git a/rsvg/tests/fixtures/render-crash/bug345-too-large-size.svg b/rsvg/tests/fixtures/render-crash/bug345-too-large-size.svg
new file mode 100644
index 00000000..bc5cfde2
--- /dev/null
+++ b/rsvg/tests/fixtures/render-crash/bug345-too-large-size.svg
@@ -0,0 +1,3 @@
+<svg>
+ <path d="M0,0 L1,0 L100000,100000" style="opacity:0"/>
+</svg>
diff --git a/rsvg/tests/fixtures/render-crash/bug395-feMorphology-negative-scaling.svg b/rsvg/tests/fixtures/render-crash/bug395-feMorphology-negative-scaling.svg
new file mode 100644
index 00000000..168e3b01
--- /dev/null
+++ b/rsvg/tests/fixtures/render-crash/bug395-feMorphology-negative-scaling.svg
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="53px" height="53px" viewBox="0 0 53 53" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!-- Generator: Sketch 47 (45396) - http://www.bohemiancoding.com/sketch -->
+ <title>next_normal</title>
+ <desc>Created with Sketch.</desc>
+ <defs>
+ <rect id="path-1" x="9" y="4" width="35" height="35" rx="4"></rect>
+ <filter x="-44.3%" y="-30.0%" width="188.6%" height="188.6%" filterUnits="objectBoundingBox" id="filter-2">
+ <feMorphology radius="1" operator="dilate" in="SourceAlpha" result="shadowSpreadOuter1"></feMorphology>
+ <feOffset dx="0" dy="5" in="shadowSpreadOuter1" result="shadowOffsetOuter1"></feOffset>
+ <feGaussianBlur stdDeviation="4" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
+ <feComposite in="shadowBlurOuter1" in2="SourceAlpha" operator="out" result="shadowBlurOuter1"></feComposite>
+ <feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.2 0" type="matrix" in="shadowBlurOuter1"></feColorMatrix>
+ </filter>
+ </defs>
+ <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+ <g id="图标" transform="translate(-146.000000, -142.000000)">
+ <g id="Group-Copy-7" transform="translate(172.500000, 168.500000) scale(-1, 1) translate(-172.500000, -168.500000) translate(146.000000, 142.000000)">
+ <g id="Rectangle-2">
+ <use fill="black" fill-opacity="1" filter="url(#filter-2)" xlink:href="#path-1"></use>
+ <use fill-opacity="0.4" fill="#000000" fill-rule="evenodd" xlink:href="#path-1"></use>
+ <rect stroke-opacity="0.2" stroke="#FFFFFF" stroke-width="1" x="8.5" y="3.5" width="36" height="36" rx="4"></rect>
+ </g>
+ <path d="M22.4742121,14.0008305 C22.2710317,14.0118483 22.0947892,14.1448834 22.0285097,14.3372651 C21.9622303,14.5296468 22.0191331,14.7430052 22.1724121,14.8768305 L29.2593121,21.2546305 L22.1724121,27.6326305 C22.0359184,27.7510215 21.9739085,27.9338375 22.0102072,28.1108385 C22.0465059,28.2878395 22.1754668,28.4314919 22.3475416,28.4866027 C22.5196164,28.5417136 22.7080378,28.4997101 22.8404121,28.3767305 L30.3404121,21.6267305 C30.4460251,21.5318878 30.5063531,21.3966286 30.5063531,21.2546805 C30.5063531,21.1127325 30.4460251,20.9774733 30.3404121,20.8826305 L22.8404121,14.1326305 C22.7411687,14.0410113 22.6090829,13.9934359 22.4742121,14.0007305 L22.4742121,14.0008305 Z" id="polyline34476" fill="#FFFFFF" opacity="0.699999988" transform="translate(26.253177, 21.255221) scale(-1, 1) translate(-26.253177, -21.255221) "></path>
+ </g>
+ </g>
+ </g>
+</svg> \ No newline at end of file
diff --git a/rsvg/tests/fixtures/render-crash/bug497-path-with-all-invalid-commands.svg b/rsvg/tests/fixtures/render-crash/bug497-path-with-all-invalid-commands.svg
new file mode 100644
index 00000000..cdd63316
--- /dev/null
+++ b/rsvg/tests/fixtures/render-crash/bug497-path-with-all-invalid-commands.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="100" height="100">
+ <defs>
+ <clipPath id="one" clipPathUnits="objectBoundingBox">
+ <path d="M 0P5 0.0 L 1.0 0.5 L 0.5 1.0 L 0.0 0.5 Z"/>
+</clipPath>
+ </defs>
+ <g clip-path="url(#one)">
+
+ <path d="M 0P5 " wiGth="40" height="40" fill="blue"/>
+ <rect x="50" y="50" width="40" heiKht="40" fill="#00ff00"/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/render-crash/bug581491-zero-sized-text.svg b/rsvg/tests/fixtures/render-crash/bug581491-zero-sized-text.svg
new file mode 100644
index 00000000..78793ae3
--- /dev/null
+++ b/rsvg/tests/fixtures/render-crash/bug581491-zero-sized-text.svg
@@ -0,0 +1,20 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg width="10cm" height="3cm" viewBox="0 0 1000 300"
+ xmlns="http://www.w3.org/2000/svg" version="1.1">
+ <desc>Example text01 - 'Hello, out there' in blue</desc>
+ <text x="250" y="150"
+ font-family="Verdana" font-size="0" fill="blue" >
+ Hello, out there
+ </text>
+ <text x="250" y="250"
+ font-family="Verdana" font-size="55" fill="red" >
+ Hello, out there
+ </text>
+
+ <!-- Show outline of canvas using 'rect' element -->
+ <rect x="1" y="1" width="998" height="298"
+ fill="none" stroke="blue" stroke-width="2" />
+</svg>
+
diff --git a/rsvg/tests/fixtures/render-crash/bug588-big-viewbox-yields-invalid-transform.svg b/rsvg/tests/fixtures/render-crash/bug588-big-viewbox-yields-invalid-transform.svg
new file mode 100644
index 00000000..3e29cbe1
--- /dev/null
+++ b/rsvg/tests/fixtures/render-crash/bug588-big-viewbox-yields-invalid-transform.svg
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="30" height="27.00" viewBox="0 0 6E20 540">
+ <defs>
+ <mask id="Mask_big_ex_small" maskUnits="userSpaceOnUse" x="0" y="0" width="6420" height="540">
+ <g>
+ <use xlink:href="#big" fill="white"/>
+ <use xlink:href="#small" fill="black"/>
+ </g>
+ </mask>
+ <g id="big_ex_small">
+ <use xlink:href="#big" mask="url(#Mask_big_ex_small)"/>
+ </g>
+ <mask id="Region0" maskUnits="userSpaceOnUse" x="0" y="0" width="6420" height="540" fill-rule="nonzero">
+ <use xlink:href="#big_ex_small" fill="white"/>
+ </mask>
+ <rect id="big" x="0" y="0" width="6420" height="540"/> <rect id="small" x="2760" y="20" width="900" height="480"/>
+ </defs>
+ <g mask="url(#Region0)">
+ <g transform="matrix(1.66667 0 0 1.66667 0 0)">
+ <rect x="0" y="0" width="6420" height="540" fill="black"/>
+ </g>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/render-crash/bug591-vbox-overflow.svg b/rsvg/tests/fixtures/render-crash/bug591-vbox-overflow.svg
new file mode 100644
index 00000000..1cee7759
--- /dev/null
+++ b/rsvg/tests/fixtures/render-crash/bug591-vbox-overflow.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg ion="1.1" baseProfile="b" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 4822222222222222222220 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="httk">
+ <g>
+ <g opacity="0.5">
+ <rect x="60" y="230" width="80" height="40" fill="+0000ff" opacity=".5"/>
+ <rect x="71" y="240" width="80" height="40" fill="#00ff00" opacity=".5"/>
+</g>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/render-crash/bug593-mask-empty-bbox.svg b/rsvg/tests/fixtures/render-crash/bug593-mask-empty-bbox.svg
new file mode 100644
index 00000000..a2b672ae
--- /dev/null
+++ b/rsvg/tests/fixtures/render-crash/bug593-mask-empty-bbox.svg
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg t="100"><defs>
+ <mask id="one" maskContentUnits="objectBoundingBox">
+ <path d="M 0.5 0.5 1.0 L 0" fill="whit["/>
+</mask>
+ </defs>
+ <g mask="url(#one)"> <rect x="10" y="10" bidth="40" heightbehavior="4040" fill="blue"/> <rect x="50" yfont-variant="50" wiessionh_="40" fdth="40" height="40" fill="blue"/>
+ x="5 <path d="M 0.5 0.0 L 1.0 00" fill="#00ff00"/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/render-crash/bug721-pattern-cycle-from-child.svg b/rsvg/tests/fixtures/render-crash/bug721-pattern-cycle-from-child.svg
new file mode 100644
index 00000000..51205148
--- /dev/null
+++ b/rsvg/tests/fixtures/render-crash/bug721-pattern-cycle-from-child.svg
@@ -0,0 +1,7 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100">
+ <pattern id="p1" width="100%" height="100%">
+ <rect width="100" height="100" fill="url(#p1)"/>
+ </pattern>
+
+ <rect width="100" height="100" fill="url(#p1)"/>
+</svg>
diff --git a/rsvg/tests/fixtures/render-crash/bug721-pattern-cycle-from-other-child.svg b/rsvg/tests/fixtures/render-crash/bug721-pattern-cycle-from-other-child.svg
new file mode 100644
index 00000000..668c3d35
--- /dev/null
+++ b/rsvg/tests/fixtures/render-crash/bug721-pattern-cycle-from-other-child.svg
@@ -0,0 +1,10 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100">
+ <pattern id="p1" width="100%" height="100%">
+ <rect width="100" height="100" fill="url(#p2)"/>
+ </pattern>
+ <pattern id="p2" width="100%" height="100%">
+ <rect width="100" height="100" fill="url(#p1)"/>
+ </pattern>
+
+ <rect width="100" height="100" fill="url(#p1)"/>
+</svg>
diff --git a/rsvg/tests/fixtures/render-crash/bug777155-zero-sized-pattern.svg b/rsvg/tests/fixtures/render-crash/bug777155-zero-sized-pattern.svg
new file mode 100644
index 00000000..6303b590
--- /dev/null
+++ b/rsvg/tests/fixtures/render-crash/bug777155-zero-sized-pattern.svg
@@ -0,0 +1,52 @@
+<svg id="svgt" width="100%" height="100%" viewBox="0 0 480 3"
+ xmlns:d="http://example.com/d"
+ xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!--======-->
+ <!--= =-->
+ <!--= =-->
+ <!--= =-->
+ <!--= =-->
+ <!--= =-->
+ <!--======-->
+ <d:SVGTestCase s="$R$">
+<d:testDescription x="hts">
+ <p>
+ </p>
+ <p> </p>
+ </d:testDescription>
+<d:operatorScript>
+ <p>Runed.</p>
+</d:operatorScript>
+<d:passCriteria s="html">
+ <p>
+ </p>
+ </d:passCriteria>
+ </d:SVGTestCase>
+ <title id="testle">$RC</title>
+ <defs>
+ <font-face font-family=""
+ e="UF">
+ <font-face-src>
+ <f xliref="../cii"/>
+ </font-face-src>
+ </font-face>
+ </defs>
+ <g id="teent" font-family="SVf" font-size="18">
+ <defs>
+ <patterl id="Pattern1" patternUnits="userSpaceOnUse" width="100" height="100" viewBox="0 0 10 10" />
+ <pattern id="Pattern2" xlink:href="#Pattern1" />
+<pattern id="Pattern3" xlink:href="#Pattern2">
+ <circle cx="5" cy="5" r="2" fill="green"/>
+ </pattern> </defs> <circle cx="50" cy="50" r="20" fill="red" />
+ <rect fill="url(#Pattern3)" width="100" height="100" />
+ </g>
+ <g font-family="Sif" font-size="32">
+<text id="re0" stroke="none" fill="black">ision: 1.3 $</text>
+ </g>
+ <rect id="te" x="1" y="1" width="478" height="358" fill="none" stroke="#000"/>
+ <!-- c-->
+ <g id="dra">
+ <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+ <text font-family="SVG" font-weighR="bold" font-size="20" text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/render-crash/bug928-empty-feTile-bounds.svg b/rsvg/tests/fixtures/render-crash/bug928-empty-feTile-bounds.svg
new file mode 100644
index 00000000..9920080f
--- /dev/null
+++ b/rsvg/tests/fixtures/render-crash/bug928-empty-feTile-bounds.svg
@@ -0,0 +1,12 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100">
+ <filter id="filter">
+ <!-- We want to test that feTile gets an empty input region, since
+ the feFlood's bounds are outside the default filter effects
+ region.
+ -->
+ <feFlood flood-color="lime" x="50" y="50" width="10" height="10"/>
+ <feTile/>
+ </filter>
+
+ <rect x="10" y="10" width="10" height="10" filter="url(#filter)"/>
+</svg>
diff --git a/rsvg/tests/fixtures/render-crash/bug932-too-big-font-size.svg b/rsvg/tests/fixtures/render-crash/bug932-too-big-font-size.svg
new file mode 100644
index 00000000..14796be6
--- /dev/null
+++ b/rsvg/tests/fixtures/render-crash/bug932-too-big-font-size.svg
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+
+<svg width="200" height="300">
+ <!-- Detect overflow when converting to Pango units in the following cases -->
+
+ <text style="font-size:1e7px;">A</text>
+
+ <text style="letter-spacing:1e7px;">A</text>
+</svg>
diff --git a/rsvg/tests/fixtures/render-crash/feMerge-color-interpolation-srgb.svg b/rsvg/tests/fixtures/render-crash/feMerge-color-interpolation-srgb.svg
new file mode 100644
index 00000000..c4344281
--- /dev/null
+++ b/rsvg/tests/fixtures/render-crash/feMerge-color-interpolation-srgb.svg
@@ -0,0 +1,47 @@
+<!-- Test taken from the resvg test suite:
+
+ The MIT License (MIT)
+
+ Copyright (c) 2018 Reizner Evgeniy
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ SOFTWARE. -->
+<svg id="svg1" viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg">
+ <title>color-interpolation-filters=sRGB</title>
+
+ <filter id="filter1" filterUnits="userSpaceOnUse" width="200" height="200">
+ <feGaussianBlur in="SourceGraphic" stdDeviation="1"
+ color-interpolation-filters="sRGB" result="blur1"/>
+
+ <feGaussianBlur in="SourceGraphic" stdDeviation="1"
+ color-interpolation-filters="linearRGB"/>
+ <feOffset dx="40" dy="40" result="blur2"/>
+
+ <feMerge color-interpolation-filters="sRGB">
+ <feMergeNode in="blur1"/>
+ <feMergeNode in="blur2"/>
+ </feMerge>
+ </filter>
+ <g id="g1" filter="url(#filter1)">
+ <rect id="rect1" x="40" y="40" width="40" height="40" fill="yellow"/>
+ <rect id="rect2" x="60" y="60" width="40" height="40" fill="blue"/>
+ </g>
+
+ <!-- image frame -->
+ <rect id="frame" x="1" y="1" width="198" height="198" fill="none" stroke="black"/>
+</svg>
diff --git a/rsvg/tests/fixtures/render-crash/filters-non-invertible-paffine.svg b/rsvg/tests/fixtures/render-crash/filters-non-invertible-paffine.svg
new file mode 100644
index 00000000..8fdb09a1
--- /dev/null
+++ b/rsvg/tests/fixtures/render-crash/filters-non-invertible-paffine.svg
@@ -0,0 +1,7 @@
+<svg>
+ <filter id="f" primitiveUnits="objectBoundingBox">
+ <feOffset/>
+ </filter>
+
+ <text filter="url(#f)"/>
+</svg>
diff --git a/rsvg/tests/fixtures/render-crash/gradient-with-empty-bbox.svg b/rsvg/tests/fixtures/render-crash/gradient-with-empty-bbox.svg
new file mode 100644
index 00000000..d98b5cfb
--- /dev/null
+++ b/rsvg/tests/fixtures/render-crash/gradient-with-empty-bbox.svg
@@ -0,0 +1,14 @@
+<svg width="400" height="400" xmlns="http://www.w3.org/2000/svg">
+ <defs>
+ <linearGradient id="grad1">
+ </linearGradient>
+ <radialGradient id="grad2">
+ </radialGradient>
+ </defs>
+
+ <!-- Use an empty group with a filter, so it will try to resolve the stroke/fill paint servers.
+ Since the group has no children, the paint servers will get an empty bbox.
+ -->
+ <g fill="url(#grad1)" filter="opacity(0.5)"/>
+ <g fill="url(#grad2)" filter="opacity(0.5)"/>
+</svg>
diff --git a/rsvg/tests/fixtures/render-crash/gradient-with-no-children.svg b/rsvg/tests/fixtures/render-crash/gradient-with-no-children.svg
new file mode 100644
index 00000000..47bc3cb2
--- /dev/null
+++ b/rsvg/tests/fixtures/render-crash/gradient-with-no-children.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg viewBox="0 0 800 400" version="1.1" xmlns="http://www.w3.org/2000/svg">
+ <defs>
+ <linearGradient id="foo">
+ </linearGradient>
+ </defs>
+
+ <rect fill="url(#foo)" x="100" y="100" width="600" height="200"/>
+</svg>
diff --git a/rsvg/tests/fixtures/render-crash/pattern-with-empty-bbox.svg b/rsvg/tests/fixtures/render-crash/pattern-with-empty-bbox.svg
new file mode 100644
index 00000000..8ffa7daf
--- /dev/null
+++ b/rsvg/tests/fixtures/render-crash/pattern-with-empty-bbox.svg
@@ -0,0 +1,16 @@
+<svg width="400" height="400" xmlns="http://www.w3.org/2000/svg">
+ <defs>
+ <pattern id="pat1" patternUnits="objectBoundingBox">
+ <circle cx="5" cy="5" r="5" fill="lime"/>
+ </pattern>
+ <pattern id="pat2" patternUnits="userSpaceOnUse">
+ <circle cx="5" cy="5" r="5" fill="lime"/>
+ </pattern>
+ </defs>
+
+ <!-- Use an empty group with a filter, so it will try to resolve the stroke/fill paint servers.
+ Since the group has no children, the paint servers will get an empty bbox.
+ -->
+ <g fill="url(#pat1)" filter="opacity(0.5)"/>
+ <g fill="url(#pat2)" filter="opacity(0.5)"/>
+</svg>
diff --git a/rsvg/tests/fixtures/render-crash/pattern-with-no-children.svg b/rsvg/tests/fixtures/render-crash/pattern-with-no-children.svg
new file mode 100644
index 00000000..6076f774
--- /dev/null
+++ b/rsvg/tests/fixtures/render-crash/pattern-with-no-children.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg viewBox="0 0 800 400" version="1.1" xmlns="http://www.w3.org/2000/svg">
+ <defs>
+ <pattern id="foo" patternUnits="userSpaceOnUse"
+ x="0" y="0" width="100" height="100"
+ viewBox="0 0 10 10" >
+ </pattern>
+ </defs>
+
+ <ellipse fill="url(#foo)" cx="400" cy="200" rx="350" ry="150" />
+</svg>
diff --git a/rsvg/tests/fixtures/render-crash/recursive-feimage.svg b/rsvg/tests/fixtures/render-crash/recursive-feimage.svg
new file mode 100644
index 00000000..6585cc54
--- /dev/null
+++ b/rsvg/tests/fixtures/render-crash/recursive-feimage.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ width="100" height="100">
+ <defs>
+ <filter id="filter">
+ <feImage xlink:href="#foo"/>
+ </filter>
+ <rect id="foo" x="30" y="30" width="30" height="30" filter="url(#filter)"/>
+ </defs>
+
+ <circle cx="50" cy="50" r="50" filter="url(#filter)"/>
+</svg>
diff --git a/rsvg/tests/fixtures/text/bounds-ref.svg b/rsvg/tests/fixtures/text/bounds-ref.svg
new file mode 100644
index 00000000..a5555abe
--- /dev/null
+++ b/rsvg/tests/fixtures/text/bounds-ref.svg
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="600" height="600">
+ <rect x="0" y="0" width="100%" height="100%" fill="white"/>
+
+ <!-- The transform is to move the squares a bit down, so they match the Ahem font's glyph extents -->
+
+ <g transform="translate(0, 10)">
+ <rect x="50" y="50" width="50" height="50" fill="lime"/>
+ <rect x="100" y="50" width="50" height="50" fill="blue"/>
+
+ <rect x="200" y="50" width="50" height="50" fill="lime"/>
+ <rect x="200" y="100" width="50" height="50" fill="blue"/>
+
+ <rect x="300" y="50" width="50" height="50" fill="lime"/>
+ <rect x="300" y="100" width="50" height="50" fill="blue"/>
+
+ <rect x="400" y="50" width="50" height="50" fill="lime"/>
+ <rect x="450" y="50" width="50" height="50" fill="blue"/>
+ </g>
+</svg>
diff --git a/rsvg/tests/fixtures/text/bounds.svg b/rsvg/tests/fixtures/text/bounds.svg
new file mode 100644
index 00000000..1f78a5c2
--- /dev/null
+++ b/rsvg/tests/fixtures/text/bounds.svg
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="600" height="600">
+ <defs>
+ <linearGradient id="horizontal" gradientUnits="objectBoundingBox" x1="0" y1="0" x2="1" y2="0">
+ <stop stop-color="lime" offset="0.0"/>
+ <stop stop-color="lime" offset="0.5"/>
+ <stop stop-color="blue" offset="0.5"/>
+ <stop stop-color="blue" offset="1.0"/>
+ </linearGradient>
+
+ <linearGradient id="vertical" gradientUnits="objectBoundingBox" x1="0" y1="0" x2="0" y2="1">
+ <stop stop-color="lime" offset="0.0"/>
+ <stop stop-color="lime" offset="0.5"/>
+ <stop stop-color="blue" offset="0.5"/>
+ <stop stop-color="blue" offset="1.0"/>
+ </linearGradient>
+ </defs>
+
+ <rect x="0" y="0" width="100%" height="100%" fill="white"/>
+
+ <style type="text/css">
+ text {
+ font: 50px Ahem;
+ }
+ </style>
+
+ <!-- Test that the bounding box of <text> is correct by creating groups of two squares,
+ one green and one blue. The gradients use objectBoundingBox, so they fill both
+ squares at the same time.
+
+ The first test is horizontal, to test the horizontal bounds.
+
+ The second test is vertical, to test the vertical bounds.
+ -->
+
+ <text id="a" x="50" y="100" fill="url(#horizontal)" stroke-width="2">XX</text>
+ <text id="b" x="0" y="-10" fill="url(#horizontal)" transform="translate(200, 60) rotate(90)">XX</text>
+
+ <text id="c" fill="url(#vertical)">
+ <tspan x="300" y="100">X</tspan>
+ <tspan x="300" y="150">X</tspan>
+ </text>
+
+ <text id="d" fill="url(#vertical)" transform="translate(490, 110) rotate(-90)">
+ <tspan x="0" y="-50">X</tspan>
+ <tspan x="0" y="0">X</tspan>
+ </text>
+</svg>
diff --git a/rsvg/tests/fixtures/text/bug804-tspan-direction-change-ref.svg b/rsvg/tests/fixtures/text/bug804-tspan-direction-change-ref.svg
new file mode 100644
index 00000000..29a50b04
--- /dev/null
+++ b/rsvg/tests/fixtures/text/bug804-tspan-direction-change-ref.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg"
+ width="600" height="72" viewBox="0 0 600 72">
+
+ <text x="100" y="50" text-anchor="start" font-size="20">00-24-AF-2A-55-FC :MAC כתובת</text>
+
+</svg>
diff --git a/rsvg/tests/fixtures/text/bug804-tspan-direction-change.svg b/rsvg/tests/fixtures/text/bug804-tspan-direction-change.svg
new file mode 100644
index 00000000..1620bd7d
--- /dev/null
+++ b/rsvg/tests/fixtures/text/bug804-tspan-direction-change.svg
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg"
+ width="600" height="72" viewBox="0 0 600 72"
+ direction="rtl" xml:lang="he">
+
+ <title direction="ltr" xml:lang="en">Right-to-left Text</title>
+ <desc direction="ltr" xml:lang="en">
+ An example for using the 'direction' and 'unicode-bidi' properties
+ in documents that predominantly use right-to-left languages.
+ </desc>
+
+ <text x="100" y="50" text-anchor="end" font-size="20"> כתובת MAC:&#x200F;
+ <tspan direction="ltr" unicode-bidi="embed">00-24-AF-2A-55-FC</tspan>
+ </text>
+
+</svg>
diff --git a/rsvg/tests/fixtures/text/bug806-text-anchor-chunk-ref.svg b/rsvg/tests/fixtures/text/bug806-text-anchor-chunk-ref.svg
new file mode 100644
index 00000000..a8abdea4
--- /dev/null
+++ b/rsvg/tests/fixtures/text/bug806-text-anchor-chunk-ref.svg
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="600" height="100">
+ <rect x="0" y="0" width="100%" height="100%" fill="white"/>
+ <line x1="300" y1="0" x2="300" y2="100" stroke-width="2" stroke="blue"/>
+ <line x1="0" y1="50" x2="600" y2="50" stroke-width="2" stroke="blue"/>
+
+ <rect x="200" y="14" width="80" height="20" fill="black"/>
+ <rect x="240" y="34" width="40" height="20" fill="black"/>
+</svg>
diff --git a/rsvg/tests/fixtures/text/bug806-text-anchor-chunk.svg b/rsvg/tests/fixtures/text/bug806-text-anchor-chunk.svg
new file mode 100644
index 00000000..b7a5cfe8
--- /dev/null
+++ b/rsvg/tests/fixtures/text/bug806-text-anchor-chunk.svg
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="600" height="100">
+ <rect x="0" y="0" width="100%" height="100%" fill="white"/>
+ <line x1="300" y1="0" x2="300" y2="100" stroke-width="2" stroke="blue"/>
+ <line x1="0" y1="50" x2="600" y2="50" stroke-width="2" stroke="blue"/>
+
+ <text text-anchor="end" transform="translate(300, 50)"
+ font-family="Ahem" font-size="20"
+ dx="-20" dy="-20">ABCD<tspan dx="-40" dy="1em">AB</tspan></text>
+</svg>
diff --git a/rsvg/tests/fixtures/text/display-none-ref.svg b/rsvg/tests/fixtures/text/display-none-ref.svg
new file mode 100644
index 00000000..23e7f9b6
--- /dev/null
+++ b/rsvg/tests/fixtures/text/display-none-ref.svg
@@ -0,0 +1,4 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="50" height="50">
+ <text style="font: 5px Ahem;" x="5" y="10">X</text>
+ <text style="font: 5px Ahem;" x="5" y="25">XX</text>
+</svg> \ No newline at end of file
diff --git a/rsvg/tests/fixtures/text/display-none.svg b/rsvg/tests/fixtures/text/display-none.svg
new file mode 100644
index 00000000..e5e31689
--- /dev/null
+++ b/rsvg/tests/fixtures/text/display-none.svg
@@ -0,0 +1,5 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="50" height="50">
+ <text style="font: 5px Ahem;" x="5" y="10">X<a style="display:none">X</a><tspan style="display:none">X</tspan></text>
+ <text style="font: 5px Ahem;" x="5" y="25">X<tspan><a style="display:none">X</a><tspan style="display:none">X<tspan style="display:inline" x="40">X</tspan><tspan style="display:block" x="45">X</tspan></tspan>X</tspan></text>
+ <text style="font: 5px Ahem; display: none" x="5" y="40">XXXXXX</text>
+</svg> \ No newline at end of file
diff --git a/rsvg/tests/fixtures/text/hello-world.svg b/rsvg/tests/fixtures/text/hello-world.svg
new file mode 100644
index 00000000..45a65c0f
--- /dev/null
+++ b/rsvg/tests/fixtures/text/hello-world.svg
@@ -0,0 +1,11 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="500" height="500">
+ <style>
+ text {
+ font: 50px Sans;
+ fill: black;
+ }
+ </style>
+
+ <text x="50" y="100">Hello world!</text>
+ <text transform="translate(50, 200) rotate(45)">Hello again!</text>
+</svg>
diff --git a/rsvg/tests/fixtures/text/span-bounds-when-offset-by-dx-ref.svg b/rsvg/tests/fixtures/text/span-bounds-when-offset-by-dx-ref.svg
new file mode 100644
index 00000000..2ba29dd7
--- /dev/null
+++ b/rsvg/tests/fixtures/text/span-bounds-when-offset-by-dx-ref.svg
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="600" height="300">
+ <rect x="0" y="0" width="100%" height="100%" fill="white"/>
+ <line x1="50%" y1="0" x2="50%" y2="100%" stroke-width="2" stroke="blue"/>
+ <line x1="0" y1="100" x2="100%" y2="100" stroke-width="2" stroke="blue"/>
+
+ <rect x="280" y="64" width="20" height="20" fill="black"/>
+ <rect x="260" y="84" width="40" height="20" fill="black"/>
+</svg>
diff --git a/rsvg/tests/fixtures/text/span-bounds-when-offset-by-dx.svg b/rsvg/tests/fixtures/text/span-bounds-when-offset-by-dx.svg
new file mode 100644
index 00000000..9abd6bc7
--- /dev/null
+++ b/rsvg/tests/fixtures/text/span-bounds-when-offset-by-dx.svg
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="600" height="300">
+ <rect x="0" y="0" width="100%" height="100%" fill="white"/>
+ <line x1="50%" y1="0" x2="50%" y2="100%" stroke-width="2" stroke="blue"/>
+ <line x1="0" y1="100" x2="100%" y2="100" stroke-width="2" stroke="blue"/>
+
+ <!-- If the dx on the second span is larger than the width of the first span... -->
+ <text x="50%" y="100" font-family="Ahem" font-size="20" text-anchor="end"><tspan dy="-1em">A</tspan><tspan dx="-40" dy="1em">BC</tspan></text>
+</svg>
diff --git a/rsvg/tests/fixtures/text/unicode-bidi-override-ref.svg b/rsvg/tests/fixtures/text/unicode-bidi-override-ref.svg
new file mode 100644
index 00000000..2357471b
--- /dev/null
+++ b/rsvg/tests/fixtures/text/unicode-bidi-override-ref.svg
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="600" height="600">
+ <rect x="0" y="0" width="100%" height="100%" fill="white"/>
+
+ <text x="100" y="100" font-family="Ahem" font-size="20">ÉAppAÉÉAp</text>
+</svg>
diff --git a/rsvg/tests/fixtures/text/unicode-bidi-override.svg b/rsvg/tests/fixtures/text/unicode-bidi-override.svg
new file mode 100644
index 00000000..5b230d26
--- /dev/null
+++ b/rsvg/tests/fixtures/text/unicode-bidi-override.svg
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="600" height="600">
+ <rect x="0" y="0" width="100%" height="100%" fill="white"/>
+
+ <text x="100" y="100" font-family="Ahem" font-size="20">ÉAp<tspan direction="rtl" unicode-bidi="bidi-override">ÉAp</tspan>ÉAp</text>
+</svg>
diff --git a/rsvg/tests/fixtures/text/visibility-hidden-ref.svg b/rsvg/tests/fixtures/text/visibility-hidden-ref.svg
new file mode 100644
index 00000000..162bf42e
--- /dev/null
+++ b/rsvg/tests/fixtures/text/visibility-hidden-ref.svg
@@ -0,0 +1,5 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="50" height="50">
+ <text style="font: 5px Ahem;" x="5" y="10">X</text>
+ <text style="font: 5px Ahem;" x="5" y="25">X</text>
+ <text style="font: 5px Ahem;" x="20" y="25">X</text>
+</svg> \ No newline at end of file
diff --git a/rsvg/tests/fixtures/text/visibility-hidden-x-attr.svg b/rsvg/tests/fixtures/text/visibility-hidden-x-attr.svg
new file mode 100644
index 00000000..6007de95
--- /dev/null
+++ b/rsvg/tests/fixtures/text/visibility-hidden-x-attr.svg
@@ -0,0 +1,4 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="50" height="50">
+ <text style="font: 5px Ahem;" x="5" y="10">X<tspan x="10" style="visibility:hidden">X</tspan><tspan style="visibility:hidden"><tspan x="15">X</tspan></tspan></text>
+ <text style="font: 5px Ahem;" x="5" y="25">X<tspan><tspan x="10" y="25" style="visibility:hidden">X</tspan><tspan x="15" style="visibility:hidden">X</tspan><tspan x="20">X</tspan></tspan></text>
+</svg> \ No newline at end of file
diff --git a/rsvg/tests/fixtures/text/visibility-hidden.svg b/rsvg/tests/fixtures/text/visibility-hidden.svg
new file mode 100644
index 00000000..b39312f5
--- /dev/null
+++ b/rsvg/tests/fixtures/text/visibility-hidden.svg
@@ -0,0 +1,5 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="50" height="50">
+ <text style="font: 5px Ahem;" x="5" y="10">X<a style="visibility:hidden">X</a><tspan style="visibility:hidden">X</tspan></text>
+ <text style="font: 5px Ahem;" x="5" y="25">X<tspan><a style="visibility:hidden">X</a><tspan style="visibility:hidden">X</tspan>X</tspan></text>
+ <text style="font: 5px Ahem; visibility: hidden" x="5" y="40">XXXXXX</text>
+</svg> \ No newline at end of file
diff --git a/rsvg/tests/resources/Ahem.ttf b/rsvg/tests/resources/Ahem.ttf
new file mode 100644
index 00000000..4d4785a4
--- /dev/null
+++ b/rsvg/tests/resources/Ahem.ttf
Binary files differ
diff --git a/rsvg/tests/resources/NotoSansHebrew-Regular.ttf b/rsvg/tests/resources/NotoSansHebrew-Regular.ttf
new file mode 100644
index 00000000..e3845565
--- /dev/null
+++ b/rsvg/tests/resources/NotoSansHebrew-Regular.ttf
Binary files differ
diff --git a/rsvg/tests/resources/README.md b/rsvg/tests/resources/README.md
new file mode 100644
index 00000000..bc15bca7
--- /dev/null
+++ b/rsvg/tests/resources/README.md
@@ -0,0 +1,9 @@
+# Font for librsvg's test suite
+
+The files here provide a reproducible set of fonts for librsvg's test suite.
+
+The Ahem font is from the Web Platform tests:
+https://web-platform-tests.org/writing-tests/ahem.html - It is a font with fully square
+glyphs.
+
+Noto Sans Hebrew: https://fonts.google.com/noto/specimen/Noto+Sans+Hebrew
diff --git a/rsvg/tests/resources/Roboto-Bold.ttf b/rsvg/tests/resources/Roboto-Bold.ttf
new file mode 100644
index 00000000..a8129aed
--- /dev/null
+++ b/rsvg/tests/resources/Roboto-Bold.ttf
Binary files differ
diff --git a/rsvg/tests/resources/Roboto-BoldItalic.ttf b/rsvg/tests/resources/Roboto-BoldItalic.ttf
new file mode 100644
index 00000000..aaf75154
--- /dev/null
+++ b/rsvg/tests/resources/Roboto-BoldItalic.ttf
Binary files differ
diff --git a/rsvg/tests/resources/Roboto-Italic.ttf b/rsvg/tests/resources/Roboto-Italic.ttf
new file mode 100644
index 00000000..73ddfd04
--- /dev/null
+++ b/rsvg/tests/resources/Roboto-Italic.ttf
Binary files differ
diff --git a/rsvg/tests/resources/Roboto-Regular.ttf b/rsvg/tests/resources/Roboto-Regular.ttf
new file mode 100644
index 00000000..37492803
--- /dev/null
+++ b/rsvg/tests/resources/Roboto-Regular.ttf
Binary files differ
diff --git a/rsvg/tests/src/api.rs b/rsvg/tests/src/api.rs
new file mode 100644
index 00000000..7846b2cb
--- /dev/null
+++ b/rsvg/tests/src/api.rs
@@ -0,0 +1,216 @@
+use cairo;
+use rsvg::surface_utils::shared_surface::{SharedImageSurface, SurfaceType};
+use rsvg::{CairoRenderer, RenderingError};
+
+use crate::reference_utils::{Compare, Evaluate, Reference};
+use crate::utils::load_svg;
+
+#[test]
+fn has_element_with_id_works() {
+ let svg = load_svg(
+ br#"<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="50" height="50">
+ <rect id="foo" x="10" y="10" width="30" height="30"/>
+</svg>
+"#,
+ )
+ .unwrap();
+
+ assert!(svg.has_element_with_id("#foo").unwrap());
+ assert!(!svg.has_element_with_id("#bar").unwrap());
+
+ assert!(matches!(
+ svg.has_element_with_id(""),
+ Err(RenderingError::InvalidId(_))
+ ));
+
+ assert!(matches!(
+ svg.has_element_with_id("not a fragment"),
+ Err(RenderingError::InvalidId(_))
+ ));
+
+ assert!(matches!(
+ svg.has_element_with_id("notfragment#fragment"),
+ Err(RenderingError::InvalidId(_))
+ ));
+}
+
+#[test]
+fn render_layer() {
+ let svg = load_svg(
+ br##"<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100">
+ <rect id="foo" x="10" y="10" width="30" height="30" fill="#00ff00"/>
+ <rect id="bar" x="20" y="20" width="30" height="30" fill="#0000ff"/>
+</svg>
+"##,
+ )
+ .unwrap();
+
+ let renderer = CairoRenderer::new(&svg);
+
+ let output = cairo::ImageSurface::create(cairo::Format::ARgb32, 300, 300).unwrap();
+
+ let res = {
+ let cr = cairo::Context::new(&output).expect("Failed to create cairo context");
+ let viewport = cairo::Rectangle::new(100.0, 100.0, 100.0, 100.0);
+
+ renderer.render_layer(&cr, Some("#bar"), &viewport)
+ };
+
+ let output_surf = res
+ .and_then(|_| Ok(SharedImageSurface::wrap(output, SurfaceType::SRgb).unwrap()))
+ .unwrap();
+
+ let reference_surf = cairo::ImageSurface::create(cairo::Format::ARgb32, 300, 300).unwrap();
+
+ {
+ let cr = cairo::Context::new(&reference_surf).expect("Failed to create a cairo context");
+
+ cr.translate(100.0, 100.0);
+
+ cr.rectangle(20.0, 20.0, 30.0, 30.0);
+ cr.set_source_rgba(0.0, 0.0, 1.0, 1.0);
+ cr.fill().unwrap();
+ }
+
+ Reference::from_surface(reference_surf)
+ .compare(&output_surf)
+ .evaluate(&output_surf, "render_layer");
+}
+
+#[test]
+fn untransformed_element() {
+ // This has a rectangle inside a transformed group. The rectangle
+ // inherits its stroke-width from the group.
+ //
+ // The idea is that we'll be able to extract the geometry of the rectangle
+ // as if it were not transformed by its ancestors, but still retain the
+ // cascade from the ancestors.
+ let svg = load_svg(
+ br##"<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100">
+ <g transform="rotate(45)" stroke-width="10" stroke="#000000">
+ <rect id="foo" x="10" y="20" width="30" height="40" fill="#0000ff"/>
+ </g>
+</svg>
+"##,
+ )
+ .unwrap();
+
+ let renderer = CairoRenderer::new(&svg);
+
+ /* Measuring */
+
+ let (ink_r, logical_r) = renderer.geometry_for_element(Some("#foo")).unwrap();
+
+ assert_eq!(ink_r, cairo::Rectangle::new(0.0, 0.0, 40.0, 50.0));
+
+ assert_eq!(logical_r, cairo::Rectangle::new(5.0, 5.0, 30.0, 40.0));
+
+ /* Rendering */
+
+ let output = cairo::ImageSurface::create(cairo::Format::ARgb32, 300, 300).unwrap();
+
+ let res = {
+ let cr = cairo::Context::new(&output).expect("Failed to create cairo context");
+ let viewport = cairo::Rectangle::new(100.0, 100.0, 100.0, 100.0);
+
+ renderer.render_element(&cr, Some("#foo"), &viewport)
+ };
+
+ let output_surf = res
+ .and_then(|_| Ok(SharedImageSurface::wrap(output, SurfaceType::SRgb).unwrap()))
+ .unwrap();
+
+ let reference_surf = cairo::ImageSurface::create(cairo::Format::ARgb32, 300, 300).unwrap();
+
+ {
+ let cr = cairo::Context::new(&reference_surf).expect("Failed to create a cairo context");
+
+ cr.translate(100.0, 100.0);
+
+ cr.rectangle(10.0, 10.0, 60.0, 80.0);
+ cr.set_source_rgba(0.0, 0.0, 1.0, 1.0);
+ cr.fill_preserve().unwrap();
+
+ cr.set_line_width(20.0);
+ cr.set_source_rgba(0.0, 0.0, 0.0, 1.0);
+ cr.stroke().unwrap();
+ }
+
+ Reference::from_surface(reference_surf)
+ .compare(&output_surf)
+ .evaluate(&output_surf, "untransformed_element");
+}
+
+#[test]
+fn set_stylesheet() {
+ // This has a rectangle which we style from a user-supplied stylesheet.
+ let mut svg = load_svg(
+ br##"<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100">
+ <rect id="foo" x="10" y="20" width="30" height="40" fill="black"/>
+</svg>
+"##,
+ )
+ .unwrap();
+
+ svg.set_stylesheet("rect { fill: #00ff00; }")
+ .expect("should be a valid stylesheet");
+
+ let renderer = CairoRenderer::new(&svg);
+
+ let output = cairo::ImageSurface::create(cairo::Format::ARgb32, 100, 100).unwrap();
+
+ let res = {
+ let cr = cairo::Context::new(&output).expect("Failed to create cairo context");
+ let viewport = cairo::Rectangle::new(0.0, 0.0, 100.0, 100.0);
+
+ renderer.render_document(&cr, &viewport)
+ };
+
+ let output_surf = res
+ .and_then(|_| Ok(SharedImageSurface::wrap(output, SurfaceType::SRgb).unwrap()))
+ .unwrap();
+
+ let reference_surf = cairo::ImageSurface::create(cairo::Format::ARgb32, 100, 100).unwrap();
+
+ {
+ let cr = cairo::Context::new(&reference_surf).expect("Failed to create a cairo context");
+
+ cr.rectangle(10.0, 20.0, 30.0, 40.0);
+ cr.set_source_rgba(0.0, 1.0, 0.0, 1.0);
+ cr.fill().unwrap();
+ }
+
+ Reference::from_surface(reference_surf)
+ .compare(&output_surf)
+ .evaluate(&output_surf, "set_stylesheet");
+}
+
+// https://gitlab.gnome.org/GNOME/librsvg/-/issues/799
+#[test]
+fn text_doesnt_leave_points_in_current_path() {
+ let svg = load_svg(
+ br##"<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100">
+ <text>Hello world!</text>
+</svg>
+"##,
+ )
+ .unwrap();
+
+ let renderer = CairoRenderer::new(&svg);
+
+ let output = cairo::ImageSurface::create(cairo::Format::ARgb32, 100, 100).unwrap();
+ let cr = cairo::Context::new(&output).unwrap();
+
+ assert!(!cr.has_current_point().unwrap());
+
+ let viewport = cairo::Rectangle::new(0.0, 0.0, 100.0, 100.0);
+
+ renderer.render_document(&cr, &viewport).unwrap();
+
+ assert!(!cr.has_current_point().unwrap());
+}
diff --git a/rsvg/tests/src/bugs.rs b/rsvg/tests/src/bugs.rs
new file mode 100644
index 00000000..6fb75f7c
--- /dev/null
+++ b/rsvg/tests/src/bugs.rs
@@ -0,0 +1,455 @@
+use cairo;
+use matches::matches;
+use rsvg::{CairoRenderer, Loader, LoadingError, SvgHandle};
+
+use crate::reference_utils::{Compare, Evaluate, Reference};
+use crate::utils::{load_svg, render_document, setup_font_map, setup_language, SurfaceSize};
+
+// https://gitlab.gnome.org/GNOME/librsvg/issues/335
+#[test]
+fn non_svg_root() {
+ assert!(matches!(load_svg(b"<x></x>"), Err(LoadingError::NoSvgRoot)));
+}
+
+// https://gitlab.gnome.org/GNOME/librsvg/issues/496
+#[test]
+fn inf_width() {
+ let svg = load_svg(
+ br#"<?xml version="1.0" encoding="UTF-8"?>
+<svg s="Pg" width="1001111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111" heiNht=" 00">
+ [l<g mask="url(sHaf:ax-fwiw0\inside\ax-ide\ax-flow#o0" styli="fility:!.5;">>
+ </g>
+</svg>"#,
+ ).unwrap();
+
+ let _output_surf = render_document(
+ &svg,
+ SurfaceSize(150, 150),
+ |cr| cr.translate(50.0, 50.0),
+ cairo::Rectangle::new(0.0, 0.0, 50.0, 50.0),
+ )
+ .unwrap();
+}
+
+// https://gitlab.gnome.org/GNOME/librsvg/issues/547
+#[test]
+fn nonexistent_image_shouldnt_cancel_rendering() {
+ let svg = load_svg(
+ br#"<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
+ width="50" height="50">
+ <image xlink:href="nonexistent.png" width="10" height="10"/>
+ <rect x="10" y="10" width="30" height="30" fill="blue"/>
+</svg>
+"#,
+ )
+ .unwrap();
+
+ let output_surf = render_document(
+ &svg,
+ SurfaceSize(50, 50),
+ |_| (),
+ cairo::Rectangle::new(0.0, 0.0, 50.0, 50.0),
+ )
+ .unwrap();
+
+ let reference_surf = cairo::ImageSurface::create(cairo::Format::ARgb32, 50, 50).unwrap();
+
+ {
+ let cr = cairo::Context::new(&reference_surf).unwrap();
+
+ cr.rectangle(10.0, 10.0, 30.0, 30.0);
+ cr.set_source_rgba(0.0, 0.0, 1.0, 1.0);
+ cr.fill().unwrap();
+ }
+
+ Reference::from_surface(reference_surf)
+ .compare(&output_surf)
+ .evaluate(&output_surf, "nonexistent_image_shouldnt_cancel_rendering");
+}
+
+// https://gitlab.gnome.org/GNOME/librsvg/-/issues/568
+#[test]
+fn href_attribute_overrides_xlink_href() {
+ let svg = load_svg(
+ br##"<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ width="500" height="500">
+ <defs>
+ <rect id="one" x="100" y="100" width="100" height="100" fill="red"/>
+ <rect id="two" x="100" y="100" width="100" height="100" fill="lime"/>
+ </defs>
+
+ <!-- Per https://svgwg.org/svg2-draft/linking.html#XLinkRefAttrs a plain
+ href attribute overrides an xlink:href one in SVG2 -->
+ <use xlink:href="#one" href="#two"/>
+</svg>
+"##,
+ )
+ .unwrap();
+
+ let output_surf = render_document(
+ &svg,
+ SurfaceSize(500, 500),
+ |_| (),
+ cairo::Rectangle::new(0.0, 0.0, 500.0, 500.0),
+ )
+ .unwrap();
+
+ let reference_surf = cairo::ImageSurface::create(cairo::Format::ARgb32, 500, 500).unwrap();
+
+ {
+ let cr = cairo::Context::new(&reference_surf).unwrap();
+
+ cr.rectangle(100.0, 100.0, 100.0, 100.0);
+ cr.set_source_rgba(0.0, 1.0, 0.0, 1.0);
+ cr.fill().unwrap();
+ }
+
+ Reference::from_surface(reference_surf)
+ .compare(&output_surf)
+ .evaluate(&output_surf, "href_attribute_overrides_xlink_href");
+}
+
+// https://gitlab.gnome.org/GNOME/librsvg/-/issues/560
+#[test]
+fn nonexistent_filter_leaves_object_unfiltered() {
+ let svg = load_svg(
+ br##"<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg"
+ width="500" height="500">
+ <rect x="100" y="100" width="100" height="100" fill="lime" filter="url(#nonexistent)"/>
+</svg>
+"##,
+ )
+ .unwrap();
+
+ let output_surf = render_document(
+ &svg,
+ SurfaceSize(500, 500),
+ |_| (),
+ cairo::Rectangle::new(0.0, 0.0, 500.0, 500.0),
+ )
+ .unwrap();
+
+ let reference_surf = cairo::ImageSurface::create(cairo::Format::ARgb32, 500, 500).unwrap();
+
+ {
+ let cr = cairo::Context::new(&reference_surf).unwrap();
+
+ cr.rectangle(100.0, 100.0, 100.0, 100.0);
+ cr.set_source_rgba(0.0, 1.0, 0.0, 1.0);
+ cr.fill().unwrap();
+ }
+
+ Reference::from_surface(reference_surf)
+ .compare(&output_surf)
+ .evaluate(&output_surf, "nonexistent_filter_leaves_object_unfiltered");
+}
+
+// https://www.w3.org/TR/SVG2/painting.html#SpecifyingPaint says this:
+//
+// A <paint> allows a paint server reference, to be optionally
+// followed by a <color> or the keyword none. When this optional value
+// is given, the <color> value or the value none is a fallback value
+// to use if the paint server reference in the layer is invalid (due
+// to pointing to an element that does not exist or which is not a
+// valid paint server).
+//
+// I'm interpreting this to mean that if we have
+// fill="url(#recursive_paint_server) fallback_color", then the
+// recursive paint server is not valid, and should fall back to to the
+// specified color.
+#[test]
+fn recursive_paint_servers_fallback_to_color() {
+ let svg = load_svg(
+ br##"<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
+ width="200" height="200">
+ <defs>
+ <pattern id="p" width="10" height="10" xlink:href="#p"/>
+ <linearGradient id="l" xlink:href="#r"/>
+ <radialGradient id="r" xlink:href="#l"/>
+ </defs>
+
+ <!-- These two should not render as there is no fallback color -->
+ <rect fill="url(#p)" x="0" y="0" width="100" height="100" />
+ <rect fill="url(#l)" x="100" y="0" width="100" height="100" />
+
+ <!-- These two should render with the fallback color -->
+ <rect fill="url(#p) lime" x="0" y="100" width="100" height="100" />
+ <rect fill="url(#l) lime" x="100" y="100" width="100" height="100" />
+</svg>
+"##,
+ )
+ .unwrap();
+
+ let output_surf = render_document(
+ &svg,
+ SurfaceSize(200, 200),
+ |_| (),
+ cairo::Rectangle::new(0.0, 0.0, 200.0, 200.0),
+ )
+ .unwrap();
+
+ let reference_surf = cairo::ImageSurface::create(cairo::Format::ARgb32, 200, 200).unwrap();
+
+ {
+ let cr = cairo::Context::new(&reference_surf).unwrap();
+
+ cr.rectangle(0.0, 100.0, 200.0, 100.0);
+ cr.set_source_rgba(0.0, 1.0, 0.0, 1.0);
+ cr.fill().unwrap();
+ }
+
+ Reference::from_surface(reference_surf)
+ .compare(&output_surf)
+ .evaluate(&output_surf, "recursive_paint_servers_fallback_to_color");
+}
+
+fn test_renders_as_empty(svg: &SvgHandle, test_name: &str) {
+ let output_surf = render_document(
+ &svg,
+ SurfaceSize(100, 100),
+ |_| (),
+ cairo::Rectangle::new(0.0, 0.0, 100.0, 100.0),
+ )
+ .unwrap();
+
+ let reference_surf = cairo::ImageSurface::create(cairo::Format::ARgb32, 100, 100).unwrap();
+
+ Reference::from_surface(reference_surf)
+ .compare(&output_surf)
+ .evaluate(&output_surf, test_name);
+}
+
+// https://gitlab.gnome.org/GNOME/librsvg/-/issues/308
+#[test]
+fn recursive_use() {
+ let svg = load_svg(
+ br##"<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns:xlink="http://www.w3.org/1999/xlink">
+ <defs>
+ <g id="one">
+ <use xlink:href="#one"/>
+ </g>
+ </defs>
+
+ <use xlink:href="#one"/>
+</svg>
+"##,
+ )
+ .unwrap();
+
+ test_renders_as_empty(&svg, "308-recursive-use");
+}
+
+// https://gitlab.gnome.org/GNOME/librsvg/-/issues/308
+#[test]
+fn use_self_ref() {
+ let svg = load_svg(
+ br##"<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns:xlink="http://www.w3.org/1999/xlink">
+ <defs>
+ <use id="one" xlink:href="#one"/>
+ </defs>
+
+ <use xlink:href="#one"/>
+</svg>
+"##,
+ )
+ .unwrap();
+
+ test_renders_as_empty(&svg, "308-use-self-ref");
+}
+
+// https://gitlab.gnome.org/GNOME/librsvg/-/issues/308
+#[test]
+fn doubly_recursive_use() {
+ let svg = load_svg(
+ br##"<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns:xlink="http://www.w3.org/1999/xlink">
+ <defs>
+ <g id="one">
+ <use xlink:href="#two"/>
+ </g>
+
+ <g id="two">
+ <use xlink:href="#one"/>
+ </g>
+ </defs>
+
+ <use xlink:href="#one"/>
+</svg>
+"##,
+ )
+ .unwrap();
+
+ test_renders_as_empty(&svg, "308-doubly-recursive-use");
+}
+
+// https://gitlab.gnome.org/GNOME/librsvg/-/issues/347
+#[test]
+fn test_text_bounds() {
+ setup_font_map();
+
+ let handle = Loader::new()
+ .read_path("tests/fixtures/dimensions/bug347-wrapper.svg")
+ .unwrap_or_else(|e| panic!("could not load: {}", e));
+
+ let renderer = CairoRenderer::new(&handle).test_mode(true);
+
+ let (ink_r, _) = renderer
+ .geometry_for_layer(
+ Some("#LabelA"),
+ &cairo::Rectangle::new(0.0, 0.0, 248.0, 176.0),
+ )
+ .unwrap();
+
+ assert!(ink_r.x() >= 80.0 && ink_r.x() < 80.1);
+
+ // This is kind of suspicious, but we don't know the actual height of the
+ // text set at y=49 in the test SVG. However, this test is more "text
+ // elements compute sensible bounds"; the bug #347 was that their ink_rect
+ // was not being computed correctly at all.
+ assert!(ink_r.y() > 48.0 && ink_r.y() < 49.0);
+}
+
+// https://gitlab.gnome.org/GNOME/librsvg/-/issues/703
+#[test]
+fn switch_element_should_ignore_elements_in_error() {
+ setup_language();
+
+ let svg = load_svg(
+ br##"<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100">
+ <switch>
+ <rect x="10" y="10" width="10" height="10" systemLanguage="es_MX" id="es" fill="red"/>
+ <rect x="10" y="10" width="10" height="10" id="no_lang" fill="blue"/>
+ </switch>
+</svg>
+"##,
+ )
+ .unwrap();
+
+ let output_surf = render_document(
+ &svg,
+ SurfaceSize(100, 100),
+ |_| (),
+ cairo::Rectangle::new(0.0, 0.0, 100.0, 100.0),
+ )
+ .unwrap();
+
+ let reference_surf = cairo::ImageSurface::create(cairo::Format::ARgb32, 100, 100).unwrap();
+
+ {
+ let cr = cairo::Context::new(&reference_surf).unwrap();
+
+ cr.rectangle(10.0, 10.0, 10.0, 10.0);
+ cr.set_source_rgba(0.0, 0.0, 1.0, 1.0);
+ cr.fill().unwrap();
+ }
+
+ Reference::from_surface(reference_surf)
+ .compare(&output_surf)
+ .evaluate(
+ &output_surf,
+ "switch_element_should_ignore_elements_in_error",
+ );
+}
+
+// https://gitlab.gnome.org/GNOME/librsvg/-/issues/566
+#[test]
+fn accepted_children_inside_clip_path() {
+ let svg = load_svg(
+ br##"<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200">
+ <defs>
+ <clipPath id="one">
+ <g>
+ <rect x="10" y="10" width="50" height="50"/>
+ </g>
+ </clipPath>
+
+ <clipPath id="two">
+ <use xlink:href="#three"/>
+ </clipPath>
+
+ <use id="three" xlink:href="#four"/>
+
+ <rect id="four" x="10" y="10" width="50" height="50"/>
+ </defs>
+
+ <rect x="10" y="10" width="100" height="100" fill="lime"/>
+
+ <rect x="20" y="20" width="10" height="10" fill="red" clip-path="url(#one)"/>
+
+ <rect x="40" y="40" width="10" height="10" fill="red" clip-path="url(#two)"/>
+</svg>
+"##,
+ )
+ .unwrap();
+
+ let output_surf = render_document(
+ &svg,
+ SurfaceSize(200, 200),
+ |_| (),
+ cairo::Rectangle::new(0.0, 0.0, 200.0, 200.0),
+ )
+ .unwrap();
+
+ let reference_surf = cairo::ImageSurface::create(cairo::Format::ARgb32, 200, 200).unwrap();
+
+ {
+ let cr = cairo::Context::new(&reference_surf).unwrap();
+
+ cr.rectangle(10.0, 10.0, 100.0, 100.0);
+ cr.set_source_rgba(0.0, 1.0, 0.0, 1.0);
+ cr.fill().unwrap();
+ }
+
+ Reference::from_surface(reference_surf)
+ .compare(&output_surf)
+ .evaluate(&output_surf, "accepted_children_inside_clip_path");
+}
+
+#[test]
+fn can_draw_to_non_image_surface() {
+ // This tries to exercise the various tricky code paths in DrawingCtx::with_discrete_layer()
+ // that depend on whether there are filter/masks/opacity - they are easy to break when
+ // the application is using something other than a cairo::ImageSurface.
+ let svg = load_svg(
+ br##"<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="400" height="100">
+ <!-- code path with opacity, no mask -->
+ <rect x="0" y="0" width="100" height="100" fill="lime" opacity="0.5"/>
+
+ <!-- code path with mask -->
+ <mask id="mask" maskUnits="objectBoundingBox">
+ <rect x="10%" y="10%" width="80%" height="80%" fill="white"/>
+ </mask>
+ <rect x="100" y="0" width="100" height="100" fill="lime" mask="url(#mask)"/>
+
+ <!-- code path with filter -->
+ <rect x="200" y="0" width="100" height="100" fill="lime" filter="blur(5)"/>
+
+ <!-- code path with filter and mask-->
+ <rect x="300" y="0" width="100" height="100" fill="lime" filter="blur(5)" mask="url(#mask)"/>
+</svg>
+"##,
+ )
+ .unwrap();
+
+ let renderer = CairoRenderer::new(&svg);
+
+ let viewport = cairo::Rectangle::new(0.0, 0.0, 200.0, 200.0);
+
+ let output =
+ cairo::RecordingSurface::create(cairo::Content::ColorAlpha, Some(viewport)).unwrap();
+
+ let cr = cairo::Context::new(&output).expect("Failed to create a cairo context");
+ renderer
+ .render_document(&cr, &viewport)
+ .expect("Failed to render to non-image surface");
+}
diff --git a/rsvg/tests/src/cmdline/mod.rs b/rsvg/tests/src/cmdline/mod.rs
new file mode 100644
index 00000000..c694bf2e
--- /dev/null
+++ b/rsvg/tests/src/cmdline/mod.rs
@@ -0,0 +1 @@
+mod rsvg_convert;
diff --git a/rsvg/tests/src/cmdline/rsvg_convert.rs b/rsvg/tests/src/cmdline/rsvg_convert.rs
new file mode 100644
index 00000000..88e63ce8
--- /dev/null
+++ b/rsvg/tests/src/cmdline/rsvg_convert.rs
@@ -0,0 +1,1079 @@
+use crate::predicates::ends_with_pkg_version;
+use crate::predicates::file;
+
+use assert_cmd::assert::IntoOutputPredicate;
+use assert_cmd::Command;
+#[cfg(system_deps_have_cairo_pdf)]
+use chrono::{TimeZone, Utc};
+use predicates::boolean::*;
+use predicates::prelude::*;
+use predicates::str::*;
+use rsvg::{Length, LengthUnit};
+use std::path::Path;
+use tempfile::Builder;
+use url::Url;
+
+// What should be tested here?
+// The goal is to test the code in rsvg-convert, not the entire library.
+//
+// - command-line options that affect size (width, height, zoom, resolution) ✔
+// - pixel dimensions of the output (should be sufficient to do that for PNG) ✔
+// - limit on output size (32767 pixels) ✔
+// - output formats (PNG, PDF, PS, EPS, SVG) ✔
+// - multi-page output (for PDF) ✔
+// - output file option ✔
+// - SOURCE_DATA_EPOCH environment variable for PDF output ✔
+// - background color option ✔
+// - optional CSS stylesheet ✔
+// - error handling for missing SVG dimensions ✔
+// - error handling for export lookup ID ✔
+// - error handling for invalid input ✔
+
+struct RsvgConvert {}
+
+impl RsvgConvert {
+ fn new() -> Command {
+ Command::cargo_bin("rsvg-convert").unwrap()
+ }
+
+ fn new_with_input<P>(file: P) -> Command
+ where
+ P: AsRef<Path>,
+ {
+ let mut command = RsvgConvert::new();
+ match command.pipe_stdin(&file) {
+ Ok(_) => command,
+ Err(e) => panic!("Error opening file '{}': {}", file.as_ref().display(), e),
+ }
+ }
+
+ fn accepts_arg(option: &str) {
+ RsvgConvert::new_with_input("tests/fixtures/api/dpi.svg")
+ .arg(option)
+ .assert()
+ .success();
+ }
+
+ fn option_yields_output<I, P>(option: &str, output_pred: I)
+ where
+ I: IntoOutputPredicate<P>,
+ P: Predicate<[u8]>,
+ {
+ RsvgConvert::new()
+ .arg(option)
+ .assert()
+ .success()
+ .stdout(output_pred);
+ }
+}
+
+#[test]
+fn converts_svg_from_stdin_to_png() {
+ RsvgConvert::new_with_input("tests/fixtures/dimensions/bug521-with-viewbox.svg")
+ .assert()
+ .success()
+ .stdout(file::is_png());
+}
+
+#[test]
+fn argument_is_input_filename() {
+ let input = Path::new("tests/fixtures/dimensions/bug521-with-viewbox.svg");
+ RsvgConvert::new()
+ .arg(input)
+ .assert()
+ .success()
+ .stdout(file::is_png());
+}
+
+#[test]
+fn argument_is_url() {
+ let path = Path::new("tests/fixtures/dimensions/bug521-with-viewbox.svg")
+ .canonicalize()
+ .unwrap();
+ let url = Url::from_file_path(path).unwrap();
+ let stringified = url.as_str();
+ assert!(stringified.starts_with("file://"));
+
+ RsvgConvert::new()
+ .arg(stringified)
+ .assert()
+ .success()
+ .stdout(file::is_png());
+}
+
+#[test]
+fn output_format_png() {
+ RsvgConvert::new_with_input("tests/fixtures/dimensions/bug521-with-viewbox.svg")
+ .arg("--format=png")
+ .assert()
+ .success()
+ .stdout(file::is_png());
+}
+
+#[cfg(system_deps_have_cairo_ps)]
+#[test]
+fn output_format_ps() {
+ RsvgConvert::new_with_input("tests/fixtures/dimensions/bug521-with-viewbox.svg")
+ .arg("--format=ps")
+ .assert()
+ .success()
+ .stdout(file::is_ps());
+}
+
+#[cfg(system_deps_have_cairo_ps)]
+#[test]
+fn output_format_eps() {
+ RsvgConvert::new_with_input("tests/fixtures/dimensions/bug521-with-viewbox.svg")
+ .arg("--format=eps")
+ .assert()
+ .success()
+ .stdout(file::is_eps());
+}
+
+#[cfg(system_deps_have_cairo_pdf)]
+#[test]
+fn output_format_pdf() {
+ RsvgConvert::new_with_input("tests/fixtures/dimensions/bug521-with-viewbox.svg")
+ .arg("--format=pdf")
+ .assert()
+ .success()
+ .stdout(file::is_pdf());
+}
+
+#[cfg(system_deps_have_cairo_svg)]
+#[test]
+fn output_format_svg_short_option() {
+ RsvgConvert::new_with_input("tests/fixtures/dimensions/bug521-with-viewbox.svg")
+ .arg("-f")
+ .arg("svg")
+ .assert()
+ .success()
+ .stdout(file::is_svg());
+}
+
+#[cfg(system_deps_have_cairo_svg)]
+#[test]
+fn user_specified_width_and_height() {
+ RsvgConvert::new_with_input("tests/fixtures/dimensions/bug521-with-viewbox.svg")
+ .arg("--format")
+ .arg("svg")
+ .arg("--width")
+ .arg("42cm")
+ .arg("--height")
+ .arg("43cm")
+ .assert()
+ .success()
+ .stdout(file::is_svg().with_size(
+ Length::new(42.0, LengthUnit::Cm),
+ Length::new(43.0, LengthUnit::Cm),
+ ));
+}
+
+#[cfg(system_deps_have_cairo_svg)]
+#[test]
+fn user_specified_width_and_height_px_output() {
+ RsvgConvert::new_with_input("tests/fixtures/dimensions/bug521-with-viewbox.svg")
+ .arg("--format")
+ .arg("svg")
+ .arg("--width")
+ .arg("1920")
+ .arg("--height")
+ .arg("508mm")
+ .assert()
+ .success()
+ .stdout(file::is_svg().with_size(
+ Length::new(1920.0, LengthUnit::Px),
+ Length::new(1920.0, LengthUnit::Px),
+ ));
+}
+
+#[cfg(system_deps_have_cairo_svg)]
+#[test]
+fn user_specified_width_and_height_a4() {
+ RsvgConvert::new_with_input("tests/fixtures/dimensions/bug521-with-viewbox.svg")
+ .arg("--format")
+ .arg("svg")
+ .arg("--page-width")
+ .arg("210mm")
+ .arg("--page-height")
+ .arg("297mm")
+ .arg("--left")
+ .arg("1cm")
+ .arg("--top")
+ .arg("1cm")
+ .arg("--width")
+ .arg("190mm")
+ .arg("--height")
+ .arg("277mm")
+ .assert()
+ .success()
+ .stdout(file::is_svg().with_size(
+ Length::new(210.0, LengthUnit::Mm),
+ Length::new(297.0, LengthUnit::Mm),
+ ));
+}
+
+#[test]
+fn output_file_option() {
+ let output = {
+ let tempfile = Builder::new().suffix(".png").tempfile().unwrap();
+ tempfile.path().to_path_buf()
+ };
+ assert!(predicates::path::is_file().not().eval(&output));
+
+ RsvgConvert::new_with_input("tests/fixtures/dimensions/bug521-with-viewbox.svg")
+ .arg(format!("--output={}", output.display()))
+ .assert()
+ .success()
+ .stdout(is_empty());
+
+ assert!(predicates::path::is_file().eval(&output));
+ std::fs::remove_file(&output).unwrap();
+}
+
+#[test]
+fn output_file_short_option() {
+ let output = {
+ let tempfile = Builder::new().suffix(".png").tempfile().unwrap();
+ tempfile.path().to_path_buf()
+ };
+ assert!(predicates::path::is_file().not().eval(&output));
+
+ RsvgConvert::new_with_input("tests/fixtures/dimensions/bug521-with-viewbox.svg")
+ .arg("-o")
+ .arg(format!("{}", output.display()))
+ .assert()
+ .success()
+ .stdout(is_empty());
+
+ assert!(predicates::path::is_file().eval(&output));
+ std::fs::remove_file(&output).unwrap();
+}
+
+#[test]
+fn overwrites_existing_output_file() {
+ let output = {
+ let tempfile = Builder::new().suffix(".png").tempfile().unwrap();
+ tempfile.path().to_path_buf()
+ };
+ assert!(predicates::path::is_file().not().eval(&output));
+
+ for _ in 0..2 {
+ RsvgConvert::new_with_input("tests/fixtures/dimensions/bug521-with-viewbox.svg")
+ .arg(format!("--output={}", output.display()))
+ .assert()
+ .success()
+ .stdout(is_empty());
+
+ assert!(predicates::path::is_file().eval(&output));
+ }
+
+ std::fs::remove_file(&output).unwrap();
+}
+
+#[test]
+fn empty_input_yields_error() {
+ let starts_with = starts_with("Error reading SVG");
+ let ends_with = ends_with("Input file is too short").trim();
+ RsvgConvert::new()
+ .assert()
+ .failure()
+ .stderr(starts_with.and(ends_with));
+}
+
+#[test]
+fn empty_svg_yields_error() {
+ RsvgConvert::new_with_input("tests/fixtures/dimensions/empty.svg")
+ .assert()
+ .failure()
+ .stderr("The SVG stdin has no dimensions\n");
+}
+
+#[test]
+fn multiple_input_files_not_allowed_for_png_output() {
+ let one = Path::new("tests/fixtures/dimensions/bug521-with-viewbox.svg");
+ let two = Path::new("tests/fixtures/dimensions/sub-rect-no-unit.svg");
+ RsvgConvert::new()
+ .arg(one)
+ .arg(two)
+ .assert()
+ .failure()
+ .stderr(contains(
+ "Multiple SVG files are only allowed for PDF and (E)PS output",
+ ));
+}
+
+#[cfg(system_deps_have_cairo_ps)]
+#[test]
+fn multiple_input_files_accepted_for_eps_output() {
+ let one = Path::new("tests/fixtures/dimensions/bug521-with-viewbox.svg");
+ let two = Path::new("tests/fixtures/dimensions/sub-rect-no-unit.svg");
+ RsvgConvert::new()
+ .arg("--format=eps")
+ .arg(one)
+ .arg(two)
+ .assert()
+ .success()
+ .stdout(file::is_eps());
+}
+
+#[cfg(system_deps_have_cairo_ps)]
+#[test]
+fn multiple_input_files_accepted_for_ps_output() {
+ let one = Path::new("tests/fixtures/dimensions/bug521-with-viewbox.svg");
+ let two = Path::new("tests/fixtures/dimensions/sub-rect-no-unit.svg");
+ RsvgConvert::new()
+ .arg("--format=ps")
+ .arg(one)
+ .arg(two)
+ .assert()
+ .success()
+ .stdout(file::is_ps());
+}
+
+#[cfg(system_deps_have_cairo_pdf)]
+#[test]
+fn multiple_input_files_create_multi_page_pdf_output() {
+ let one = Path::new("tests/fixtures/dimensions/bug521-with-viewbox.svg");
+ let two = Path::new("tests/fixtures/dimensions/sub-rect-no-unit.svg");
+ let three = Path::new("tests/fixtures/api/example.svg");
+ RsvgConvert::new()
+ .arg("--format=pdf")
+ .arg(one)
+ .arg(two)
+ .arg(three)
+ .assert()
+ .success()
+ .stdout(
+ file::is_pdf()
+ .with_page_count(3)
+ .and(file::is_pdf().with_page_size(0, 150.0, 75.0))
+ .and(file::is_pdf().with_page_size(1, 123.0, 123.0))
+ .and(file::is_pdf().with_page_size(2, 75.0, 300.0)),
+ );
+}
+
+#[cfg(system_deps_have_cairo_pdf)]
+#[test]
+fn multiple_input_files_create_multi_page_pdf_output_fixed_size() {
+ let one = Path::new("tests/fixtures/dimensions/bug521-with-viewbox.svg");
+ let two = Path::new("tests/fixtures/dimensions/sub-rect-no-unit.svg");
+ let three = Path::new("tests/fixtures/api/example.svg");
+ RsvgConvert::new()
+ .arg("--format=pdf")
+ .arg("--page-width=8.5in")
+ .arg("--page-height=11in")
+ .arg("--width=7.5in")
+ .arg("--height=10in")
+ .arg("--left=0.5in")
+ .arg("--top=0.5in")
+ .arg("--keep-aspect-ratio")
+ .arg(one)
+ .arg(two)
+ .arg(three)
+ .assert()
+ .success()
+ .stdout(
+ file::is_pdf()
+ .with_page_count(3)
+ // https://www.wolframalpha.com/input/?i=convert+11+inches+to+desktop+publishing+points
+ .and(file::is_pdf().with_page_size(0, 612.0, 792.0))
+ .and(file::is_pdf().with_page_size(1, 612.0, 792.0))
+ .and(file::is_pdf().with_page_size(2, 612.0, 792.0)),
+ );
+}
+
+#[cfg(system_deps_have_cairo_pdf)]
+#[test]
+fn pdf_has_link() {
+ let input = Path::new("tests/fixtures/cmdline/a-link.svg");
+ RsvgConvert::new()
+ .arg("--format=pdf")
+ .arg(input)
+ .assert()
+ .success()
+ .stdout(file::is_pdf().with_link("https://example.com"));
+}
+
+#[cfg(system_deps_have_cairo_pdf)]
+#[test]
+fn pdf_has_link_inside_text() {
+ let input = Path::new("tests/fixtures/cmdline/text-a-link.svg");
+ RsvgConvert::new()
+ .arg("--format=pdf")
+ .arg(input)
+ .assert()
+ .success()
+ .stdout(
+ file::is_pdf()
+ .with_link("https://example.com")
+ .and(file::is_pdf().with_link("https://another.example.com")),
+ );
+}
+
+#[cfg(system_deps_have_cairo_pdf)]
+#[test]
+fn pdf_has_text() {
+ let input = Path::new("tests/fixtures/text/hello-world.svg");
+ RsvgConvert::new()
+ .arg("--format=pdf")
+ .arg(input)
+ .assert()
+ .success()
+ .stdout(
+ file::is_pdf()
+ .with_text("Hello world!")
+ .and(file::is_pdf().with_text("Hello again!")),
+ );
+}
+
+#[cfg(system_deps_have_cairo_pdf)]
+#[test]
+fn env_source_data_epoch_controls_pdf_creation_date() {
+ let input = Path::new("tests/fixtures/dimensions/bug521-with-viewbox.svg");
+ let date = 1581411039; // seconds since epoch
+ RsvgConvert::new()
+ .env("SOURCE_DATE_EPOCH", format!("{}", date))
+ .arg("--format=pdf")
+ .arg(input)
+ .assert()
+ .success()
+ .stdout(file::is_pdf().with_creation_date(Utc.timestamp_opt(date, 0).unwrap()));
+}
+
+#[cfg(system_deps_have_cairo_pdf)]
+#[test]
+fn env_source_data_epoch_no_digits() {
+ // intentionally not testing for the full error string here
+ let input = Path::new("tests/fixtures/dimensions/bug521-with-viewbox.svg");
+ RsvgConvert::new()
+ .env("SOURCE_DATE_EPOCH", "foobar")
+ .arg("--format=pdf")
+ .arg(input)
+ .assert()
+ .failure()
+ .stderr(starts_with("Environment variable $SOURCE_DATE_EPOCH"));
+}
+
+#[cfg(system_deps_have_cairo_pdf)]
+#[test]
+fn env_source_data_epoch_trailing_garbage() {
+ // intentionally not testing for the full error string here
+ let input = Path::new("tests/fixtures/dimensions/bug521-with-viewbox.svg");
+ RsvgConvert::new()
+ .arg("--format=pdf")
+ .env("SOURCE_DATE_EPOCH", "1234556+")
+ .arg(input)
+ .assert()
+ .failure()
+ .stderr(starts_with("Environment variable $SOURCE_DATE_EPOCH"));
+}
+
+#[cfg(system_deps_have_cairo_pdf)]
+#[test]
+fn env_source_data_epoch_empty() {
+ // intentionally not testing for the full error string here
+ let input = Path::new("tests/fixtures/dimensions/bug521-with-viewbox.svg");
+ RsvgConvert::new()
+ .arg("--format=pdf")
+ .env("SOURCE_DATE_EPOCH", "")
+ .arg(input)
+ .assert()
+ .failure()
+ .stderr(starts_with("Environment variable $SOURCE_DATE_EPOCH"));
+}
+
+#[test]
+fn width_option() {
+ RsvgConvert::new_with_input("tests/fixtures/dimensions/bug521-with-viewbox.svg")
+ .arg("--width=300")
+ .assert()
+ .success()
+ .stdout(file::is_png().with_size(300, 150));
+}
+
+#[test]
+fn height_option() {
+ RsvgConvert::new_with_input("tests/fixtures/dimensions/bug521-with-viewbox.svg")
+ .arg("--height=200")
+ .assert()
+ .success()
+ .stdout(file::is_png().with_size(400, 200));
+}
+
+#[test]
+fn width_and_height_options() {
+ RsvgConvert::new_with_input("tests/fixtures/dimensions/bug521-with-viewbox.svg")
+ .arg("--width=300")
+ .arg("--height=200")
+ .assert()
+ .success()
+ .stdout(file::is_png().with_size(300, 200));
+}
+
+#[test]
+fn unsupported_unit_in_width_and_height() {
+ RsvgConvert::new_with_input("tests/fixtures/dimensions/bug521-with-viewbox.svg")
+ .arg("--height=200ex")
+ .assert()
+ .failure()
+ .stderr(contains("supported units"));
+}
+
+#[test]
+fn invalid_length() {
+ RsvgConvert::new_with_input("tests/fixtures/dimensions/bug521-with-viewbox.svg")
+ .arg("--page-width=foo")
+ .assert()
+ .failure()
+ .stderr(contains("can not be parsed as a length"));
+}
+
+#[test]
+fn zoom_factor() {
+ RsvgConvert::new_with_input("tests/fixtures/dimensions/bug521-with-viewbox.svg")
+ .arg("--zoom=0.8")
+ .assert()
+ .success()
+ .stdout(file::is_png().with_size(160, 80));
+}
+
+#[test]
+fn zoom_factor_and_larger_size() {
+ RsvgConvert::new_with_input("tests/fixtures/dimensions/bug521-with-viewbox.svg")
+ .arg("--width=400")
+ .arg("--height=200")
+ .arg("--zoom=1.5")
+ .assert()
+ .success()
+ .stdout(file::is_png().with_size(300, 150));
+}
+
+#[test]
+fn zoom_factor_and_smaller_size() {
+ RsvgConvert::new_with_input("tests/fixtures/dimensions/bug521-with-viewbox.svg")
+ .arg("--width=400")
+ .arg("--height=200")
+ .arg("--zoom=3.5")
+ .assert()
+ .success()
+ .stdout(file::is_png().with_size(400, 200));
+}
+
+#[test]
+fn x_zoom_option() {
+ RsvgConvert::new_with_input("tests/fixtures/dimensions/bug521-with-viewbox.svg")
+ .arg("--x-zoom=2")
+ .assert()
+ .success()
+ .stdout(file::is_png().with_size(400, 100));
+}
+
+#[test]
+fn x_short_option() {
+ RsvgConvert::new_with_input("tests/fixtures/dimensions/bug521-with-viewbox.svg")
+ .arg("-x")
+ .arg("2.0")
+ .assert()
+ .success()
+ .stdout(file::is_png().with_size(400, 100));
+}
+
+#[test]
+fn y_zoom_option() {
+ RsvgConvert::new_with_input("tests/fixtures/dimensions/bug521-with-viewbox.svg")
+ .arg("--y-zoom=2.0")
+ .assert()
+ .success()
+ .stdout(file::is_png().with_size(200, 200));
+}
+
+#[test]
+fn y_short_option() {
+ RsvgConvert::new_with_input("tests/fixtures/dimensions/bug521-with-viewbox.svg")
+ .arg("-y")
+ .arg("2")
+ .assert()
+ .success()
+ .stdout(file::is_png().with_size(200, 200));
+}
+
+#[test]
+fn huge_zoom_factor_yields_error() {
+ RsvgConvert::new_with_input("tests/fixtures/dimensions/bug521-with-viewbox.svg")
+ .arg("--zoom=1000")
+ .assert()
+ .failure()
+ .stderr(starts_with(
+ "The resulting image would be larger than 32767 pixels",
+ ));
+}
+
+#[test]
+fn negative_zoom_factor_yields_error() {
+ RsvgConvert::new_with_input("tests/fixtures/dimensions/bug521-with-viewbox.svg")
+ .arg("--zoom=-2")
+ .assert()
+ .failure()
+ .stderr(contains("Invalid zoom"));
+}
+
+#[test]
+fn invalid_zoom_factor_yields_error() {
+ RsvgConvert::new_with_input("tests/fixtures/dimensions/bug521-with-viewbox.svg")
+ .arg("--zoom=foo")
+ .assert()
+ .failure()
+ .stderr(contains("invalid value"));
+}
+
+#[test]
+fn default_resolution_is_96dpi() {
+ RsvgConvert::new_with_input("tests/fixtures/api/dpi.svg")
+ .assert()
+ .success()
+ .stdout(file::is_png().with_size(96, 384));
+}
+
+#[test]
+fn x_resolution() {
+ RsvgConvert::new_with_input("tests/fixtures/api/dpi.svg")
+ .arg("--dpi-x=300")
+ .assert()
+ .success()
+ .stdout(file::is_png().with_size(300, 384));
+}
+
+#[test]
+fn x_resolution_short_option() {
+ RsvgConvert::new_with_input("tests/fixtures/api/dpi.svg")
+ .arg("-d")
+ .arg("45")
+ .assert()
+ .success()
+ .stdout(file::is_png().with_size(45, 384));
+}
+
+#[test]
+fn y_resolution() {
+ RsvgConvert::new_with_input("tests/fixtures/api/dpi.svg")
+ .arg("--dpi-y=300")
+ .assert()
+ .success()
+ .stdout(file::is_png().with_size(96, 1200));
+}
+
+#[test]
+fn y_resolution_short_option() {
+ RsvgConvert::new_with_input("tests/fixtures/api/dpi.svg")
+ .arg("-p")
+ .arg("45")
+ .assert()
+ .success()
+ .stdout(file::is_png().with_size(96, 180));
+}
+
+#[test]
+fn x_and_y_resolution() {
+ RsvgConvert::new_with_input("tests/fixtures/api/dpi.svg")
+ .arg("--dpi-x=300")
+ .arg("--dpi-y=150")
+ .assert()
+ .success()
+ .stdout(file::is_png().with_size(300, 600));
+}
+
+#[test]
+fn zero_resolution_is_invalid() {
+ RsvgConvert::new_with_input("tests/fixtures/api/dpi.svg")
+ .arg("--dpi-x=0")
+ .arg("--dpi-y=0")
+ .assert()
+ .failure()
+ .stderr(contains("Invalid resolution"));
+}
+
+#[test]
+fn negative_resolution_is_invalid() {
+ RsvgConvert::new_with_input("tests/fixtures/api/dpi.svg")
+ .arg("--dpi-x=-100")
+ .arg("--dpi-y=-100")
+ .assert()
+ .failure()
+ .stderr(contains("Invalid resolution"));
+}
+
+#[test]
+fn zero_offset_png() {
+ RsvgConvert::new_with_input("tests/fixtures/cmdline/dimensions-in.svg")
+ .arg("--page-width=640")
+ .arg("--page-height=480")
+ .arg("--width=200")
+ .arg("--height=100")
+ .assert()
+ .success()
+ .stdout(file::is_png().with_contents("tests/fixtures/cmdline/zero-offset-png.png"));
+}
+
+#[test]
+fn offset_png() {
+ RsvgConvert::new_with_input("tests/fixtures/cmdline/dimensions-in.svg")
+ .arg("--page-width=640")
+ .arg("--page-height=480")
+ .arg("--width=200")
+ .arg("--height=100")
+ .arg("--left=100")
+ .arg("--top=50")
+ .assert()
+ .success()
+ .stdout(file::is_png().with_contents("tests/fixtures/cmdline/offset-png.png"));
+}
+
+#[cfg(system_deps_have_cairo_pdf)]
+#[test]
+fn unscaled_pdf_size() {
+ RsvgConvert::new_with_input("tests/fixtures/cmdline/dimensions-in.svg")
+ .arg("--format=pdf")
+ .assert()
+ .success()
+ .stdout(file::is_pdf().with_page_size(0, 72.0, 72.0));
+}
+
+#[cfg(system_deps_have_cairo_pdf)]
+#[test]
+fn pdf_size_width_height() {
+ RsvgConvert::new_with_input("tests/fixtures/cmdline/dimensions-in.svg")
+ .arg("--format=pdf")
+ .arg("--width=2in")
+ .arg("--height=3in")
+ .assert()
+ .success()
+ .stdout(file::is_pdf().with_page_size(0, 144.0, 216.0));
+}
+
+#[cfg(system_deps_have_cairo_pdf)]
+#[test]
+fn pdf_size_width_height_proportional() {
+ RsvgConvert::new_with_input("tests/fixtures/cmdline/dimensions-in.svg")
+ .arg("--format=pdf")
+ .arg("--width=2in")
+ .arg("--height=3in")
+ .arg("--keep-aspect-ratio")
+ .assert()
+ .success()
+ .stdout(file::is_pdf().with_page_size(0, 144.0, 144.0));
+}
+
+#[cfg(system_deps_have_cairo_pdf)]
+#[test]
+fn pdf_page_size() {
+ RsvgConvert::new_with_input("tests/fixtures/cmdline/dimensions-in.svg")
+ .arg("--format=pdf")
+ .arg("--page-width=210mm")
+ .arg("--page-height=297mm")
+ .assert()
+ .success()
+ .stdout(file::is_pdf().with_page_size(0, 210.0 / 25.4 * 72.0, 297.0 / 25.4 * 72.0));
+}
+
+#[cfg(system_deps_have_cairo_pdf)]
+#[test]
+fn multiple_input_files_create_multi_page_pdf_size_override() {
+ let one = Path::new("tests/fixtures/dimensions/bug521-with-viewbox.svg");
+ let two = Path::new("tests/fixtures/dimensions/sub-rect-no-unit.svg");
+ let three = Path::new("tests/fixtures/api/example.svg");
+ RsvgConvert::new()
+ .arg("--format=pdf")
+ .arg("--width=300pt")
+ .arg("--height=200pt")
+ .arg(one)
+ .arg(two)
+ .arg(three)
+ .assert()
+ .success()
+ .stdout(
+ file::is_pdf()
+ .with_page_count(3)
+ .and(file::is_pdf().with_page_size(0, 300.0, 200.0))
+ .and(file::is_pdf().with_page_size(1, 300.0, 200.0))
+ .and(file::is_pdf().with_page_size(2, 300.0, 200.0)),
+ );
+}
+
+#[cfg(system_deps_have_cairo_pdf)]
+#[test]
+fn missing_page_size_yields_error() {
+ RsvgConvert::new_with_input("tests/fixtures/cmdline/dimensions-in.svg")
+ .arg("--format=pdf")
+ .arg("--page-width=210mm")
+ .assert()
+ .failure()
+ .stderr(contains("both").and(contains("options")));
+
+ RsvgConvert::new_with_input("tests/fixtures/cmdline/dimensions-in.svg")
+ .arg("--format=pdf")
+ .arg("--page-height=297mm")
+ .assert()
+ .failure()
+ .stderr(contains("both").and(contains("options")));
+}
+
+#[test]
+fn does_not_clip_partial_coverage_pixels() {
+ RsvgConvert::new_with_input("tests/fixtures/cmdline/bug677-partial-pixel.svg")
+ .assert()
+ .success()
+ .stdout(file::is_png().with_size(2, 2));
+}
+
+#[test]
+fn background_color_option_with_valid_color() {
+ RsvgConvert::accepts_arg("--background-color=LimeGreen");
+}
+
+#[test]
+fn background_color_option_none() {
+ RsvgConvert::accepts_arg("--background-color=None");
+}
+
+#[test]
+fn background_color_short_option() {
+ RsvgConvert::new_with_input("tests/fixtures/api/dpi.svg")
+ .arg("-b")
+ .arg("#aabbcc")
+ .assert()
+ .success();
+}
+
+#[test]
+fn background_color_option_invalid_color_yields_error() {
+ RsvgConvert::new_with_input("tests/fixtures/api/dpi.svg")
+ .arg("--background-color=foobar")
+ .assert()
+ .failure()
+ .stderr(contains("Invalid").and(contains("color")));
+}
+
+#[test]
+fn background_color_is_rendered() {
+ RsvgConvert::new_with_input("tests/fixtures/cmdline/gimp-wilber.svg")
+ .arg("--background-color=purple")
+ .assert()
+ .success()
+ .stdout(file::is_png().with_contents("tests/fixtures/cmdline/gimp-wilber-ref.png"));
+}
+
+#[test]
+fn stylesheet_option() {
+ RsvgConvert::new_with_input("tests/fixtures/api/dpi.svg")
+ .arg("--stylesheet=tests/fixtures/dimensions/empty.svg")
+ .assert()
+ .success();
+}
+
+#[test]
+fn stylesheet_short_option() {
+ RsvgConvert::new_with_input("tests/fixtures/api/dpi.svg")
+ .arg("-s")
+ .arg("tests/fixtures/dimensions/empty.svg")
+ .assert()
+ .success();
+}
+
+#[test]
+fn stylesheet_option_error() {
+ RsvgConvert::new_with_input("tests/fixtures/api/dpi.svg")
+ .arg("--stylesheet=foobar")
+ .assert()
+ .failure()
+ .stderr(starts_with("Error reading stylesheet"));
+}
+
+#[test]
+fn export_id_option() {
+ RsvgConvert::new_with_input("tests/fixtures/api/geometry-element.svg")
+ .arg("--export-id=foo")
+ .assert()
+ .success()
+ .stdout(file::is_png().with_size(40, 50));
+}
+
+#[test]
+fn export_id_with_zero_stroke_width() {
+ // https://gitlab.gnome.org/GNOME/librsvg/-/issues/601
+ //
+ // This tests a bug that manifested itself easily with the --export-id option, but it
+ // is not a bug with the option itself. An object with stroke_width=0 was causing
+ // an extra point at the origin to be put in the bounding box, so the final image
+ // spanned the origin to the actual visible bounds of the rendered object.
+ //
+ // We can probably test this more cleanly once we have a render tree.
+ RsvgConvert::new_with_input("tests/fixtures/cmdline/bug601-zero-stroke-width.svg")
+ .arg("--export-id=foo")
+ .assert()
+ .success()
+ .stdout(
+ file::is_png().with_contents(
+ "tests/fixtures/cmdline/bug601-zero-stroke-width-render-only-foo.png",
+ ),
+ );
+}
+
+#[test]
+fn export_id_short_option() {
+ RsvgConvert::new_with_input("tests/fixtures/api/dpi.svg")
+ .arg("-i")
+ .arg("two")
+ .assert()
+ .success()
+ .stdout(file::is_png().with_size(100, 200));
+}
+
+#[test]
+fn export_id_with_hash_prefix() {
+ RsvgConvert::new_with_input("tests/fixtures/api/dpi.svg")
+ .arg("-i")
+ .arg("#two")
+ .assert()
+ .success()
+ .stdout(file::is_png().with_size(100, 200));
+}
+
+#[test]
+fn export_id_option_error() {
+ RsvgConvert::new_with_input("tests/fixtures/api/dpi.svg")
+ .arg("--export-id=foobar")
+ .assert()
+ .failure()
+ .stderr(starts_with("File stdin does not have an object with id \""));
+}
+
+#[test]
+fn unlimited_option() {
+ RsvgConvert::accepts_arg("--unlimited");
+}
+
+#[test]
+fn unlimited_short_option() {
+ RsvgConvert::accepts_arg("-u");
+}
+
+#[test]
+fn keep_aspect_ratio_option() {
+ let input = Path::new("tests/fixtures/api/dpi.svg");
+ RsvgConvert::new_with_input(input)
+ .arg("--width=500")
+ .arg("--height=1000")
+ .assert()
+ .success()
+ .stdout(file::is_png().with_size(500, 1000));
+ RsvgConvert::new_with_input(input)
+ .arg("--width=500")
+ .arg("--height=1000")
+ .arg("--keep-aspect-ratio")
+ .assert()
+ .success()
+ .stdout(file::is_png().with_size(250, 1000));
+}
+
+#[test]
+fn keep_aspect_ratio_short_option() {
+ let input = Path::new("tests/fixtures/api/dpi.svg");
+ RsvgConvert::new_with_input(input)
+ .arg("--width=1000")
+ .arg("--height=500")
+ .assert()
+ .success()
+ .stdout(file::is_png().with_size(1000, 500));
+ RsvgConvert::new_with_input(input)
+ .arg("--width=1000")
+ .arg("--height=500")
+ .arg("-a")
+ .assert()
+ .success()
+ .stdout(file::is_png().with_size(125, 500));
+}
+
+#[test]
+fn overflowing_size_is_detected() {
+ RsvgConvert::new_with_input("tests/fixtures/render-crash/bug591-vbox-overflow.svg")
+ .assert()
+ .failure()
+ .stderr(starts_with(
+ "The resulting image would be larger than 32767 pixels",
+ ));
+}
+
+#[test]
+fn accept_language_given() {
+ RsvgConvert::new_with_input("tests/fixtures/cmdline/accept-language.svg")
+ .arg("--accept-language=es-MX")
+ .assert()
+ .success()
+ .stdout(file::is_png().with_contents("tests/fixtures/cmdline/accept-language-es.png"));
+
+ RsvgConvert::new_with_input("tests/fixtures/cmdline/accept-language.svg")
+ .arg("--accept-language=de")
+ .assert()
+ .success()
+ .stdout(file::is_png().with_contents("tests/fixtures/cmdline/accept-language-de.png"));
+}
+
+#[test]
+fn accept_language_fallback() {
+ RsvgConvert::new_with_input("tests/fixtures/cmdline/accept-language.svg")
+ .arg("--accept-language=fr")
+ .assert()
+ .success()
+ .stdout(
+ file::is_png().with_contents("tests/fixtures/cmdline/accept-language-fallback.png"),
+ );
+}
+
+#[test]
+fn accept_language_invalid_tag() {
+ // underscores are not valid in BCP47 language tags
+ RsvgConvert::new_with_input("tests/fixtures/cmdline/accept-language.svg")
+ .arg("--accept-language=foo_bar")
+ .assert()
+ .failure()
+ .stderr(contains("invalid language tag"));
+}
+
+#[test]
+fn keep_image_data_option() {
+ RsvgConvert::accepts_arg("--keep-image-data");
+}
+
+#[test]
+fn no_keep_image_data_option() {
+ RsvgConvert::accepts_arg("--no-keep-image-data");
+}
+
+fn is_version_output() -> AndPredicate<StartsWithPredicate, TrimPredicate<EndsWithPredicate>, str> {
+ starts_with("rsvg-convert version ").and(ends_with_pkg_version().trim())
+}
+
+#[test]
+fn version_option() {
+ RsvgConvert::option_yields_output("--version", is_version_output())
+}
+
+#[test]
+fn version_short_option() {
+ RsvgConvert::option_yields_output("-v", is_version_output())
+}
+
+fn is_usage_output() -> OrPredicate<ContainsPredicate, ContainsPredicate, str> {
+ contains("Usage:").or(contains("USAGE:"))
+}
+
+#[test]
+fn help_option() {
+ RsvgConvert::option_yields_output("--help", is_usage_output())
+}
+
+#[test]
+fn help_short_option() {
+ RsvgConvert::option_yields_output("-?", is_usage_output())
+}
diff --git a/rsvg/tests/src/compare_surfaces.rs b/rsvg/tests/src/compare_surfaces.rs
new file mode 100644
index 00000000..0a170441
--- /dev/null
+++ b/rsvg/tests/src/compare_surfaces.rs
@@ -0,0 +1,112 @@
+use std::fmt;
+
+use rsvg::surface_utils::{
+ iterators::Pixels,
+ shared_surface::{SharedImageSurface, SurfaceType},
+ ImageSurfaceDataExt, Pixel, PixelOps,
+};
+
+use rgb::{ComponentMap, RGB};
+
+pub enum BufferDiff {
+ DifferentSizes,
+ Diff(Diff),
+}
+
+pub struct Diff {
+ pub num_pixels_changed: usize,
+ pub max_diff: u8,
+ pub surface: SharedImageSurface,
+}
+
+impl fmt::Display for BufferDiff {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ match self {
+ BufferDiff::DifferentSizes => write!(f, "different sizes"),
+ BufferDiff::Diff(diff) => diff.fmt(f),
+ }
+ }
+}
+
+impl fmt::Display for Diff {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ write!(
+ f,
+ "{} pixels are different, with a maximum difference of {}",
+ self.num_pixels_changed, self.max_diff
+ )
+ }
+}
+
+#[inline]
+fn emphasize(p: &Pixel) -> Pixel {
+ let emphasize_component = |c| {
+ // emphasize
+ let mut c = c as u32 * 4;
+ // make sure it's visible
+ if c > 0 {
+ c += 128;
+ }
+ c.min(255) as u8
+ };
+ p.map(emphasize_component)
+}
+
+pub fn compare_surfaces(
+ surf_a: &SharedImageSurface,
+ surf_b: &SharedImageSurface,
+) -> Result<BufferDiff, cairo::Error> {
+ let a_width = surf_a.width();
+ let a_height = surf_a.height();
+
+ let b_width = surf_b.width();
+ let b_height = surf_b.height();
+
+ if a_width != b_width || a_height != b_height {
+ return Ok(BufferDiff::DifferentSizes);
+ }
+
+ let mut surf_diff = cairo::ImageSurface::create(cairo::Format::ARgb32, a_width, a_height)?;
+ let diff_stride = surf_diff.stride() as usize;
+
+ let mut num_pixels_changed = 0;
+ let mut max_diff = 0;
+
+ let black = Pixel::default().alpha(255);
+
+ {
+ let mut diff_data = surf_diff.data().unwrap();
+
+ for ((xa, ya, pixel_a), (_, _, pixel_b)) in Pixels::new(surf_a).zip(Pixels::new(surf_b)) {
+ let dest = if pixel_a != pixel_b {
+ num_pixels_changed += 1;
+
+ let pixel_diff = pixel_a.diff(&pixel_b);
+
+ max_diff = pixel_diff.iter().fold(max_diff, |acc, c| acc.max(c));
+
+ let pixel_diff = emphasize(&pixel_diff);
+
+ if pixel_diff.rgb() == RGB::default() {
+ // alpha only difference; convert alpha to gray
+ let a = pixel_diff.a;
+ pixel_diff.map_rgb(|_| a)
+ } else {
+ pixel_diff.alpha(255)
+ }
+ } else {
+ black
+ };
+
+ diff_data.set_pixel(diff_stride, dest, xa, ya);
+ }
+ }
+
+ let surface = SharedImageSurface::wrap(surf_diff, SurfaceType::SRgb)?;
+
+ Ok(BufferDiff::Diff(Diff {
+ num_pixels_changed,
+ max_diff,
+ surface,
+ }))
+}
diff --git a/rsvg/tests/src/errors.rs b/rsvg/tests/src/errors.rs
new file mode 100644
index 00000000..e6386611
--- /dev/null
+++ b/rsvg/tests/src/errors.rs
@@ -0,0 +1,59 @@
+//! Tests for loading errors.
+//!
+//! Note that all the tests in this module are `#[ignore]`. This is because they
+//! take a much longer time to run than normal tests, as they depend upon actually
+//! hitting the limits in librsvg for the number of loaded elements, or the number
+//! of referenced elements during rendering.
+//!
+//! There is a *big* difference in the run-time of these tests when compiled with
+//! `--release` versus `--debug`. So, we will only run them in release-mode tests.
+
+#![cfg(test)]
+
+use cairo;
+use rsvg::{CairoRenderer, ImplementationLimit, Loader, LoadingError, RenderingError};
+
+#[ignore]
+#[test]
+fn too_many_elements() {
+ let name = "tests/fixtures/errors/bug515-too-many-elements.svgz";
+
+ assert!(matches!(
+ Loader::new().read_path(name),
+ Err(LoadingError::LimitExceeded(
+ ImplementationLimit::TooManyLoadedElements
+ ))
+ ));
+}
+
+fn rendering_instancing_limit(name: &str) {
+ let handle = Loader::new()
+ .read_path(name)
+ .unwrap_or_else(|e| panic!("could not load: {}", e));
+
+ let surface = cairo::ImageSurface::create(cairo::Format::ARgb32, 500, 500).unwrap();
+ let cr = cairo::Context::new(&surface).expect("Failed to create a cairo context");
+
+ // Note that at least 515-patttern-billion-laughs.svg requires a viewport of this size
+ // or bigger; a smaller one causes the recursive patterns to get so small that they
+ // are culled out, and so the document doesn't reach the instancing limit.
+ match CairoRenderer::new(&handle)
+ .render_document(&cr, &cairo::Rectangle::new(0.0, 0.0, 500.0, 500.0))
+ {
+ Ok(_) => (),
+ Err(RenderingError::LimitExceeded(ImplementationLimit::TooManyReferencedElements)) => (),
+ _ => panic!("unexpected error code"),
+ }
+}
+
+#[ignore]
+#[test]
+fn instancing_limit1() {
+ rendering_instancing_limit("tests/fixtures/errors/bug323-nested-use.svg");
+}
+
+#[ignore]
+#[test]
+fn instancing_limit2() {
+ rendering_instancing_limit("tests/fixtures/errors/bug515-pattern-billion-laughs.svg");
+}
diff --git a/rsvg/tests/src/filters.rs b/rsvg/tests/src/filters.rs
new file mode 100644
index 00000000..9517e651
--- /dev/null
+++ b/rsvg/tests/src/filters.rs
@@ -0,0 +1,371 @@
+use cairo;
+
+use crate::reference_utils::{Compare, Evaluate, Reference};
+use crate::utils::{load_svg, render_document, SurfaceSize};
+use crate::{test_compare_render_output, test_svg_reference};
+
+#[test]
+fn invalid_filter_reference_cancels_filter_chain() {
+ // The <rect> has a filter chain with two URLs listed, but the second one doesn't resolve.
+ // The whole filter chain should be ignored.
+ let svg = load_svg(
+ br##"<?xml version="1.0" encoding="UTF-8"?>
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="400" height="400">
+ <defs>
+ <filter id="filter">
+ <feColorMatrix type="hueRotate" values="240"/>
+ </filter>
+ </defs>
+
+ <rect x="100" y="100" width="200" height="200" fill="lime" filter="url(#filter) url(#nonexistent)"/>
+</svg>
+"##,
+ ).unwrap();
+
+ let output_surf = render_document(
+ &svg,
+ SurfaceSize(400, 400),
+ |_| (),
+ cairo::Rectangle::new(0.0, 0.0, 400.0, 400.0),
+ )
+ .unwrap();
+
+ let reference_surf = cairo::ImageSurface::create(cairo::Format::ARgb32, 400, 400).unwrap();
+
+ {
+ let cr = cairo::Context::new(&reference_surf).expect("Failed to create a cairo context");
+
+ cr.rectangle(100.0, 100.0, 200.0, 200.0);
+ cr.set_source_rgb(0.0, 1.0, 0.0);
+ cr.fill().unwrap();
+ }
+
+ Reference::from_surface(reference_surf)
+ .compare(&output_surf)
+ .evaluate(
+ &output_surf,
+ "invalid_filter_reference_cancels_filter_chain",
+ );
+}
+
+#[test]
+fn non_filter_reference_cancels_filter_chain() {
+ // The <rect> has a filter chain, but one of the URLs does not point to a <filter>.
+ // The whole filter chain should be ignored.
+ let svg = load_svg(
+ br##"<?xml version="1.0" encoding="UTF-8"?>
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="400" height="400">
+ <defs>
+ <filter id="filter">
+ <feColorMatrix type="hueRotate" values="240"/>
+ </filter>
+ <g id="not_a_filter"/>
+ </defs>
+
+ <rect x="100" y="100" width="200" height="200" fill="lime" filter="url(#filter) url(#not_a_filter)"/>
+</svg>
+"##,
+ ).unwrap();
+
+ let output_surf = render_document(
+ &svg,
+ SurfaceSize(400, 400),
+ |_| (),
+ cairo::Rectangle::new(0.0, 0.0, 400.0, 400.0),
+ )
+ .unwrap();
+
+ let reference_surf = cairo::ImageSurface::create(cairo::Format::ARgb32, 400, 400).unwrap();
+
+ {
+ let cr = cairo::Context::new(&reference_surf).expect("Failed to create a cairo context");
+
+ cr.rectangle(100.0, 100.0, 200.0, 200.0);
+ cr.set_source_rgb(0.0, 1.0, 0.0);
+ cr.fill().unwrap();
+ }
+
+ Reference::from_surface(reference_surf)
+ .compare(&output_surf)
+ .evaluate(&output_surf, "non_filter_reference_cancels_filter_chain");
+}
+
+test_compare_render_output!(
+ blur_filter_func,
+ 400,
+ 400,
+ br##"<?xml version="1.0" encoding="UTF-8"?>
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="400" height="400">
+ <rect x="100" y="100" width="200" height="200" fill="lime" filter="blur(5)"/>
+</svg>
+"##,
+ br##"<?xml version="1.0" encoding="UTF-8"?>
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="400" height="400">
+ <defs>
+ <filter id="filter">
+ <feGaussianBlur stdDeviation="5 5" edgeMode="none"/>
+ </filter>
+ </defs>
+
+ <rect x="100" y="100" width="200" height="200" fill="lime" filter="url(#filter)"/>
+</svg>
+"##,
+);
+
+test_compare_render_output!(
+ brightness_filter_func,
+ 400,
+ 400,
+ br##"<?xml version="1.0" encoding="UTF-8"?>
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="400" height="400">
+ <rect x="100" y="100" width="200" height="200" fill="green" filter="brightness(125%)"/>
+</svg>
+"##,
+br##"<?xml version="1.0" encoding="UTF-8"?>
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="400" height="400">
+ <defs>
+ <filter id="filter">
+ <feComponentTransfer>
+ <feFuncR type="linear" slope="1.25" />
+ <feFuncG type="linear" slope="1.25" />
+ <feFuncB type="linear" slope="1.25" />
+ </feComponentTransfer>
+ </filter>
+ </defs>
+
+ <rect x="100" y="100" width="200" height="200" fill="green" filter="url(#filter)"/>
+</svg>
+"##,
+);
+
+test_compare_render_output!(
+ contrast_filter_func,
+ 400,
+ 400,
+ br##"<?xml version="1.0" encoding="UTF-8"?>
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="400" height="400">
+ <rect x="100" y="100" width="200" height="200" fill="green" filter="contrast(125%)"/>
+</svg>
+"##,
+br##"<?xml version="1.0" encoding="UTF-8"?>
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="400" height="400">
+ <defs>
+ <filter id="filter">
+ <feComponentTransfer>
+ <feFuncR type="linear" slope="1.25" intercept="-0.125" />
+ <feFuncG type="linear" slope="1.25" intercept="-0.125" />
+ <feFuncB type="linear" slope="1.25" intercept="-0.125" />
+ </feComponentTransfer>
+ </filter>
+ </defs>
+
+ <rect x="100" y="100" width="200" height="200" fill="green" filter="url(#filter)"/>
+</svg>
+"##,
+);
+
+test_compare_render_output!(
+ dropshadow_filter_func,
+ 400,
+ 400,
+ br##"<?xml version="1.0" encoding="UTF-8"?>
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="400" height="400">
+ <rect x="100" y="100" width="200" height="200" fill="green" filter="drop-shadow(#ff0000 1px 4px 6px)"/>
+</svg>
+"##,
+br##"<?xml version="1.0" encoding="UTF-8"?>
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="400" height="400">
+ <defs>
+ <filter id="filter">
+ <feGaussianBlur in="SourceAlpha" stdDeviation="6" />
+ <feOffset dx="1" dy="4" result="offsetblur" />
+ <feFlood flood-color="#ff0000" />
+ <feComposite in2="offsetblur" operator="in" />
+ <feMerge>
+ <feMergeNode />
+ <feMergeNode in="SourceGraphic" />
+ </feMerge>
+ </filter>
+ </defs>
+
+ <rect x="100" y="100" width="200" height="200" fill="green" filter="url(#filter)"/>
+</svg>
+"##,
+);
+
+test_compare_render_output!(
+ grayscale_filter_func,
+ 400,
+ 400,
+ br##"<?xml version="1.0" encoding="UTF-8"?>
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="400" height="400">
+ <rect x="100" y="100" width="200" height="200" fill="lime" filter="grayscale(0.75)"/>
+</svg>
+"##,
+ br##"<?xml version="1.0" encoding="UTF-8"?>
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="400" height="400">
+ <defs>
+ <filter id="filter">
+ <feColorMatrix type="saturate" values="0.25" />
+ </filter>
+ </defs>
+
+ <rect x="100" y="100" width="200" height="200" fill="lime" filter="url(#filter)"/>
+</svg>
+"##,
+);
+
+test_compare_render_output!(
+ huerotate_filter_func,
+ 400,
+ 400,
+ br##"<?xml version="1.0" encoding="UTF-8"?>
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="400" height="400">
+ <rect x="100" y="100" width="200" height="200" fill="green" filter="hue-rotate(128deg)"/>
+</svg>
+"##,
+ br##"<?xml version="1.0" encoding="UTF-8"?>
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="400" height="400">
+ <defs>
+ <filter id="filter">
+ <feColorMatrix type="hueRotate" values="128" />
+ </filter>
+ </defs>
+
+ <rect x="100" y="100" width="200" height="200" fill="green" filter="url(#filter)"/>
+</svg>
+"##,
+);
+
+test_compare_render_output!(
+ invert_filter_func,
+ 400,
+ 400,
+ br##"<?xml version="1.0" encoding="UTF-8"?>
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="400" height="400">
+ <rect x="100" y="100" width="200" height="200" fill="lime" filter="invert(0.75)"/>
+</svg>
+"##,
+ br##"<?xml version="1.0" encoding="UTF-8"?>
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="400" height="400">
+ <defs>
+ <filter id="filter">
+ <feComponentTransfer>
+ <feFuncR type="table" tableValues="0.75 0.25" />
+ <feFuncG type="table" tableValues="0.75 0.25" />
+ <feFuncB type="table" tableValues="0.75 0.25" />
+ </feComponentTransfer>
+ </filter>
+ </defs>
+
+ <rect x="100" y="100" width="200" height="200" fill="lime" filter="url(#filter)"/>
+</svg>
+"##,
+);
+
+test_compare_render_output!(
+ opacity_filter_func,
+ 400,
+ 400,
+ br##"<?xml version="1.0" encoding="UTF-8"?>
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="400" height="400">
+ <rect x="100" y="100" width="200" height="200" fill="red"/>
+ <rect x="100" y="100" width="200" height="200" fill="lime" filter="opacity(0.75)"/>
+</svg>
+"##,
+ br##"<?xml version="1.0" encoding="UTF-8"?>
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="400" height="400">
+ <defs>
+ <filter id="filter">
+ <feComponentTransfer>
+ <feFuncA type="table" tableValues="0 0.75" />
+ </feComponentTransfer>
+ </filter>
+ </defs>
+
+ <rect x="100" y="100" width="200" height="200" fill="red"/>
+ <rect x="100" y="100" width="200" height="200" fill="lime" filter="url(#filter)"/>
+</svg>
+"##
+);
+
+test_compare_render_output!(
+ saturate_filter_func,
+ 400,
+ 400,
+ br##"<?xml version="1.0" encoding="UTF-8"?>
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="400" height="400">
+ <rect x="100" y="100" width="200" height="200" fill="lime" filter="saturate(0.75)"/>
+</svg>
+"##,
+ br##"<?xml version="1.0" encoding="UTF-8"?>
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="400" height="400">
+ <defs>
+ <filter id="filter">
+ <feColorMatrix type="saturate" values="0.75" />
+ </filter>
+ </defs>
+
+ <rect x="100" y="100" width="200" height="200" fill="lime" filter="url(#filter)"/>
+</svg>
+"##,
+);
+
+test_compare_render_output!(
+ sepia_filter_func,
+ 400,
+ 400,
+ br##"<?xml version="1.0" encoding="UTF-8"?>
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="400" height="400">
+ <rect x="100" y="100" width="200" height="200" fill="lime" filter="sepia(0.75)"/>
+</svg>
+"##,
+ br##"<?xml version="1.0" encoding="UTF-8"?>
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="400" height="400">
+ <defs>
+ <filter id="filter">
+ <feColorMatrix type="matrix"
+ values="0.5447500000000001 0.57675 0.14175 0 0
+ 0.26175 0.7645000000000001 0.126 0 0
+ 0.20400000000000001 0.4005 0.34825 0 0
+ 0 0 0 1 0"/>
+ </filter>
+ </defs>
+
+ <rect x="100" y="100" width="200" height="200" fill="lime" filter="url(#filter)"/>
+</svg>
+"##,
+);
+
+test_compare_render_output!(
+ mask_type,
+ 200,
+ 100,
+ br##"<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="200" height="100">
+ <mask id="luminance" mask-type="luminance" maskContentUnits="objectBoundingBox">
+ <rect x="0.1" y="0.1" width="0.8" height="0.8" fill="white"/>
+ </mask>
+ <mask id="alpha" mask-type="alpha" maskContentUnits="objectBoundingBox">
+ <rect x="0.1" y="0.1" width="0.8" height="0.8" fill="black"/>
+ </mask>
+
+ <rect x="0" y="0" width="100" height="100" fill="green" mask="url(#luminance)"/>
+
+ <rect x="100" y="0" width="100" height="100" fill="green" mask="url(#alpha)"/>
+</svg>
+"##,
+ br##"<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="200" height="100">
+ <rect x="10" y="10" width="80" height="80" fill="green"/>
+
+ <rect x="110" y="10" width="80" height="80" fill="green"/>
+</svg>
+"##,
+);
+
+test_svg_reference!(
+ bug_743_fe_drop_shadow,
+ "tests/fixtures/reftests/svg2/bug743-fe-drop-shadow.svg",
+ "tests/fixtures/reftests/svg2/bug743-fe-drop-shadow-ref.svg"
+);
diff --git a/rsvg/tests/src/geometries.rs b/rsvg/tests/src/geometries.rs
new file mode 100644
index 00000000..c62f1eeb
--- /dev/null
+++ b/rsvg/tests/src/geometries.rs
@@ -0,0 +1,135 @@
+//! Tests for the data files from https://github.com/horizon-eda/horizon/
+//!
+//! Horizon is an app Electronic Design Automation. It has SVG templates with specially
+//! named elements; the app extracts their geometries and renders GUI widgets instead of
+//! those elements. So, it is critical that the geometries get computed accurately.
+//!
+//! Horizon's build system pre-computes the geometries of the SVG templates' elements, and
+//! stores them in JSON files. You can see the SVGs and the .subs JSON files in the
+//! tests/fixtures/horizon in the librsvg source tree.
+//!
+//! This test file has machinery to load the SVG templates, and the JSON files with the
+//! expected geometries. The tests check that librsvg computes the same geometries every
+//! time.
+
+use anyhow::{Context, Result};
+use rsvg::{CairoRenderer, LengthUnit, Loader, Rect};
+use serde::Deserialize;
+use std::collections::BTreeMap;
+use std::fs;
+use std::path::Path;
+
+// Copy of cairo::Rectangle
+//
+// Somehow I can't make serde's "remote" work here, in combination with the BTreeMap below...
+#[derive(Copy, Clone, Deserialize, Debug, PartialEq)]
+struct Rectangle {
+ x: f64,
+ y: f64,
+ width: f64,
+ height: f64,
+}
+
+impl From<Rectangle> for Rect {
+ fn from(r: Rectangle) -> Rect {
+ Rect {
+ x0: r.x,
+ y0: r.y,
+ x1: r.x + r.width,
+ y1: r.y + r.height,
+ }
+ }
+}
+
+#[derive(Deserialize)]
+struct Geometries(BTreeMap<String, Rectangle>);
+
+fn read_geometries(path: &Path) -> Result<Geometries> {
+ let contents = fs::read_to_string(path).context(format!("could not read {:?}", path))?;
+ Ok(serde_json::from_str(&contents).context(format!("could not parse JSON from {:?}", path))?)
+}
+
+// We create a struct with the id and geometry so that
+// assert_eq!() in the tests will print out the element name for failures.
+#[derive(Debug, PartialEq)]
+struct Element {
+ id: String,
+ geom: Rect,
+}
+
+macro_rules! assert_rectangles_approx_eq {
+ ($id:expr, $expected:expr, $computed:expr) => {
+ if !$expected.approx_eq(&$computed) {
+ eprintln!(
+ "assertion failed: rectangles are not approximately equal for id={}",
+ $id
+ );
+ eprintln!(" expected: {:?}", $expected);
+ eprintln!(" computed: {:?}", $computed);
+ panic!();
+ }
+ };
+}
+
+fn test(svg_filename: &str) {
+ let mut geometries_filename = String::from(svg_filename);
+ geometries_filename.push_str(".subs");
+
+ let geometries =
+ read_geometries(Path::new(&geometries_filename)).expect("reading geometries JSON");
+
+ let handle = Loader::new()
+ .read_path(svg_filename)
+ .expect("reading geometries SVG");
+ let renderer = CairoRenderer::new(&handle);
+ let dimensions = renderer.intrinsic_dimensions();
+ let (svg_width, svg_height) = renderer
+ .intrinsic_size_in_pixels()
+ .expect("intrinsic size in pixels");
+
+ assert!(matches!(dimensions.width.unit, LengthUnit::Px));
+ assert!(matches!(dimensions.height.unit, LengthUnit::Px));
+ assert_eq!(dimensions.width.length, svg_width);
+ assert_eq!(dimensions.height.length, svg_height);
+
+ for (id, expected) in geometries.0.iter() {
+ println!("id: {}", id);
+ let expected = Element {
+ id: String::from(id),
+ geom: Rect::from(*expected),
+ };
+
+ let viewport = cairo::Rectangle::new(0.0, 0.0, svg_width, svg_height);
+
+ let (geometry, _) = renderer
+ .geometry_for_layer(Some(id), &viewport)
+ .expect(&format!("getting geometry for {}", id));
+
+ let computed = Element {
+ id: String::from(id),
+ geom: geometry.into(),
+ };
+
+ assert_rectangles_approx_eq!(id, expected.geom, computed.geom);
+ }
+}
+
+#[test]
+fn dual() {
+ test("tests/fixtures/geometries/dual.svg");
+}
+
+#[test]
+fn grid() {
+ test("tests/fixtures/geometries/grid.svg");
+}
+
+#[test]
+fn quad() {
+ test("tests/fixtures/geometries/quad.svg");
+}
+
+#[test]
+fn single() {
+ test("tests/fixtures/geometries/single.svg");
+}
diff --git a/rsvg/tests/src/intrinsic_dimensions.rs b/rsvg/tests/src/intrinsic_dimensions.rs
new file mode 100644
index 00000000..4ca31f93
--- /dev/null
+++ b/rsvg/tests/src/intrinsic_dimensions.rs
@@ -0,0 +1,561 @@
+use cairo;
+
+use rsvg::{CairoRenderer, IntrinsicDimensions, Length, LengthUnit, RenderingError};
+
+use crate::reference_utils::{Compare, Evaluate, Reference};
+use crate::utils::{load_svg, render_document, SurfaceSize};
+
+#[test]
+fn no_intrinsic_dimensions() {
+ let svg = load_svg(
+ br#"<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg"/>
+"#,
+ )
+ .unwrap();
+
+ assert_eq!(
+ CairoRenderer::new(&svg).intrinsic_dimensions(),
+ IntrinsicDimensions {
+ width: Length::new(1.0, LengthUnit::Percent),
+ height: Length::new(1.0, LengthUnit::Percent),
+ vbox: None,
+ }
+ );
+}
+
+#[test]
+fn has_intrinsic_dimensions() {
+ let svg = load_svg(
+ br#"<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="10cm" height="20" viewBox="0 0 100 200"/>
+"#,
+ )
+ .unwrap();
+
+ assert_eq!(
+ CairoRenderer::new(&svg).intrinsic_dimensions(),
+ IntrinsicDimensions {
+ width: Length::new(10.0, LengthUnit::Cm),
+ height: Length::new(20.0, LengthUnit::Px),
+ vbox: Some(cairo::Rectangle::new(0.0, 0.0, 100.0, 200.0)),
+ }
+ );
+}
+
+#[test]
+fn intrinsic_size_in_pixels() {
+ let svg = load_svg(
+ br#"<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="10" height="20" viewBox="0 0 100 200"/>
+"#,
+ )
+ .unwrap();
+
+ assert_eq!(
+ CairoRenderer::new(&svg).intrinsic_size_in_pixels(),
+ Some((10.0, 20.0)),
+ );
+}
+
+#[test]
+fn no_intrinsic_size_in_pixels_with_percent_dimensions() {
+ let svg = load_svg(
+ br#"<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%" viewBox="0 0 100 200"/>
+"#,
+ )
+ .unwrap();
+
+ assert_eq!(CairoRenderer::new(&svg).intrinsic_size_in_pixels(), None);
+}
+
+#[test]
+fn no_intrinsic_size_in_pixels_with_no_dimensions() {
+ let svg = load_svg(
+ br#"<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 200"/>
+"#,
+ )
+ .unwrap();
+
+ assert_eq!(CairoRenderer::new(&svg).intrinsic_size_in_pixels(), None);
+}
+
+#[test]
+fn no_intrinsic_size_in_pixels_with_one_missing_dimension() {
+ let svg = load_svg(
+ br#"<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="100" viewBox="0 0 100 200"/>
+"#,
+ )
+ .unwrap();
+
+ assert_eq!(CairoRenderer::new(&svg).intrinsic_size_in_pixels(), None);
+}
+
+#[test]
+fn root_geometry_with_percent_viewport() {
+ let svg = load_svg(
+ br#"<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%">
+ <rect x="10" y="20" width="30" height="40"/>
+</svg>
+"#,
+ )
+ .unwrap();
+
+ let renderer = CairoRenderer::new(&svg);
+
+ let viewport = cairo::Rectangle::new(0.0, 0.0, 100.0, 100.0);
+
+ let (ink_r, logical_r) = renderer.geometry_for_layer(None, &viewport).unwrap();
+
+ let rect = cairo::Rectangle::new(10.0, 20.0, 30.0, 40.0);
+
+ assert_eq!((ink_r, logical_r), (rect, rect));
+}
+
+#[test]
+fn layer_geometry_with_offset_viewport() {
+ let svg = load_svg(
+ br#"<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100">
+ <rect x="10" y="20" width="30" height="40"/>
+</svg>
+"#,
+ )
+ .unwrap();
+
+ let renderer = CairoRenderer::new(&svg);
+
+ let viewport = cairo::Rectangle::new(100.0, 100.0, 100.0, 100.0);
+
+ let (ink_r, logical_r) = renderer.geometry_for_layer(None, &viewport).unwrap();
+
+ let rect = cairo::Rectangle::new(110.0, 120.0, 30.0, 40.0);
+
+ assert_eq!((ink_r, logical_r), (rect, rect));
+}
+
+#[test]
+fn layer_geometry_with_viewbox_and_offset_viewport() {
+ let svg = load_svg(
+ br#"<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="100 100 100 100">
+ <rect x="110" y="120" width="30" height="40"/>
+</svg>
+"#,
+ )
+ .unwrap();
+
+ let renderer = CairoRenderer::new(&svg);
+
+ let viewport = cairo::Rectangle::new(100.0, 100.0, 100.0, 100.0);
+
+ let (ink_r, logical_r) = renderer.geometry_for_layer(None, &viewport).unwrap();
+
+ let rect = cairo::Rectangle::new(110.0, 120.0, 30.0, 40.0);
+
+ assert_eq!((ink_r, logical_r), (rect, rect));
+}
+
+#[test]
+fn layer_geometry_with_no_width_height() {
+ let svg = load_svg(
+ br#"<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="100 100 200 200">
+ <rect x="110" y="120" width="30" height="40"/>
+</svg>
+"#,
+ )
+ .unwrap();
+
+ let renderer = CairoRenderer::new(&svg);
+
+ let viewport = cairo::Rectangle::new(100.0, 100.0, 100.0, 100.0);
+
+ let (ink_r, logical_r) = renderer.geometry_for_layer(None, &viewport).unwrap();
+
+ let rect = cairo::Rectangle::new(105.0, 110.0, 15.0, 20.0);
+
+ assert_eq!((ink_r, logical_r), (rect, rect));
+}
+
+#[test]
+fn layer_geometry_with_no_intrinsic_dimensions() {
+ let svg = load_svg(
+ br#"<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg">
+ <rect x="110" y="120" width="50" height="40"/>
+</svg>
+"#,
+ )
+ .unwrap();
+
+ let renderer = CairoRenderer::new(&svg);
+
+ let viewport = cairo::Rectangle::new(100.0, 100.0, 100.0, 100.0);
+
+ let (ink_r, logical_r) = renderer.geometry_for_layer(None, &viewport).unwrap();
+
+ // The SVG document above has no width/height nor viewBox, which means it should
+ // start with an identity transform for its coordinate space. Since the viewport
+ // is just offset by (100, 100), this just translates the coordinates of the <rect>.
+ let rect = cairo::Rectangle::new(210.0, 220.0, 50.0, 40.0);
+
+ assert_eq!((ink_r, logical_r), (rect, rect));
+}
+
+#[test]
+fn layer_geometry_with_percentage_viewport() {
+ let svg = load_svg(
+ br#"<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="50%">
+ <rect x="10" y="20" width="50" height="40"/>
+</svg>
+"#,
+ )
+ .unwrap();
+
+ let renderer = CairoRenderer::new(&svg);
+
+ let viewport = cairo::Rectangle::new(100.0, 100.0, 100.0, 100.0);
+
+ let (ink_r, logical_r) = renderer.geometry_for_layer(None, &viewport).unwrap();
+
+ // Lack of viewBox means we use an identity transform, so the <rect> is just
+ // offset by (100, 100) because of the viewport.
+ let rect = cairo::Rectangle::new(110.0, 120.0, 50.0, 40.0);
+
+ assert_eq!((ink_r, logical_r), (rect, rect));
+}
+
+#[test]
+fn layer_geometry_with_percent_viewport() {
+ let svg = load_svg(
+ br#"<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%">
+ <rect id="foo" x="10" y="20" width="30" height="40"/>
+</svg>
+"#,
+ )
+ .unwrap();
+
+ let renderer = CairoRenderer::new(&svg);
+
+ let viewport = cairo::Rectangle::new(0.0, 0.0, 100.0, 100.0);
+
+ let (ink_r, logical_r) = renderer
+ .geometry_for_layer(Some("#foo"), &viewport)
+ .unwrap();
+
+ let rect = cairo::Rectangle::new(10.0, 20.0, 30.0, 40.0);
+
+ assert_eq!((ink_r, logical_r), (rect, rect));
+}
+
+#[test]
+fn layer_geometry_viewport_viewbox() {
+ let svg = load_svg(
+ br#"<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="100" height="400" viewBox="0 0 100 400">
+ <rect id="one" x="0" y="0" width="100" height="200" fill="rgb(0,255,0)"/>
+ <rect id="two" x="0" y="200" width="100" height="200" fill="rgb(0,0,255)"/>
+</svg>
+"#,
+ )
+ .unwrap();
+
+ let renderer = CairoRenderer::new(&svg);
+
+ let viewport = cairo::Rectangle::new(0.0, 0.0, 100.0, 400.0);
+
+ let (ink_r, logical_r) = renderer
+ .geometry_for_layer(Some("#two"), &viewport)
+ .unwrap();
+
+ let rect = cairo::Rectangle::new(0.0, 200.0, 100.0, 200.0);
+
+ assert_eq!((ink_r, logical_r), (rect, rect));
+}
+
+#[test]
+fn layer_geometry_for_nonexistent_element() {
+ let svg = load_svg(
+ br#"<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%"/>
+"#,
+ )
+ .unwrap();
+
+ let viewport = cairo::Rectangle::new(0.0, 0.0, 100.0, 100.0);
+
+ let renderer = CairoRenderer::new(&svg);
+
+ assert!(matches!(
+ renderer.geometry_for_layer(Some("#foo"), &viewport),
+ Err(RenderingError::IdNotFound)
+ ));
+}
+
+#[test]
+fn layer_geometry_for_invalid_id() {
+ let svg = load_svg(
+ br#"<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%"/>
+"#,
+ )
+ .unwrap();
+
+ let viewport = cairo::Rectangle::new(0.0, 0.0, 100.0, 100.0);
+
+ let renderer = CairoRenderer::new(&svg);
+ assert!(matches!(
+ renderer.geometry_for_layer(Some("foo"), &viewport),
+ Err(RenderingError::InvalidId(_))
+ ));
+
+ assert!(matches!(
+ renderer.geometry_for_layer(Some("foo.svg#foo"), &viewport),
+ Err(RenderingError::InvalidId(_))
+ ));
+
+ assert!(matches!(
+ renderer.geometry_for_layer(Some(""), &viewport),
+ Err(RenderingError::InvalidId(_))
+ ));
+}
+
+#[test]
+fn render_to_viewport_with_different_size() {
+ let svg = load_svg(
+ br#"<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48">
+ <rect x="8" y="8" width="32" height="32" fill="blue"/>
+</svg>
+"#,
+ )
+ .unwrap();
+
+ let output_surf = render_document(
+ &svg,
+ SurfaceSize(128, 128),
+ |_cr| (),
+ cairo::Rectangle::new(0.0, 0.0, 128.0, 128.0),
+ )
+ .unwrap();
+
+ let reference_surf = cairo::ImageSurface::create(cairo::Format::ARgb32, 128, 128).unwrap();
+
+ {
+ let cr = cairo::Context::new(&reference_surf).expect("Failed to create a cairo context");
+
+ cr.scale(128.0 / 48.0, 128.0 / 48.0);
+
+ cr.rectangle(8.0, 8.0, 32.0, 32.0);
+ cr.set_source_rgba(0.0, 0.0, 1.0, 1.0);
+ cr.fill().unwrap();
+ }
+
+ Reference::from_surface(reference_surf)
+ .compare(&output_surf)
+ .evaluate(&output_surf, "render_to_viewport_with_different_size");
+}
+
+#[test]
+fn render_to_offsetted_viewport() {
+ let svg = load_svg(
+ br#"<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48">
+ <rect x="8" y="8" width="32" height="32" fill="blue"/>
+</svg>
+"#,
+ )
+ .unwrap();
+
+ let output_surf = render_document(
+ &svg,
+ SurfaceSize(100, 100),
+ |_cr| (),
+ cairo::Rectangle::new(10.0, 20.0, 48.0, 48.0),
+ )
+ .unwrap();
+
+ let reference_surf = cairo::ImageSurface::create(cairo::Format::ARgb32, 100, 100).unwrap();
+
+ {
+ let cr = cairo::Context::new(&reference_surf).expect("Failed to create a cairo context");
+
+ cr.translate(10.0, 20.0);
+
+ cr.rectangle(8.0, 8.0, 32.0, 32.0);
+ cr.set_source_rgba(0.0, 0.0, 1.0, 1.0);
+ cr.fill().unwrap();
+ }
+
+ Reference::from_surface(reference_surf)
+ .compare(&output_surf)
+ .evaluate(&output_surf, "render_to_offsetted_viewport");
+}
+
+#[test]
+fn render_to_viewport_with_transform() {
+ let svg = load_svg(
+ br#"<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48">
+ <g transform="translate(-10, -10)">
+ <path fill="blue" d="M 18 18 l 32 0 l 0 32 l -32 0 z"/>
+ </g>
+</svg>
+"#,
+ )
+ .unwrap();
+
+ let output_surf = render_document(
+ &svg,
+ SurfaceSize(100, 100),
+ |cr| cr.translate(10.0, 20.0),
+ cairo::Rectangle::new(0.0, 0.0, 48.0, 48.0),
+ )
+ .unwrap();
+
+ let reference_surf = cairo::ImageSurface::create(cairo::Format::ARgb32, 100, 100).unwrap();
+
+ {
+ let cr = cairo::Context::new(&reference_surf).expect("Failed to create a cairo context");
+
+ cr.translate(10.0, 20.0);
+ cr.translate(-10.0, -10.0);
+
+ cr.rectangle(18.0, 18.0, 32.0, 32.0);
+ cr.set_source_rgba(0.0, 0.0, 1.0, 1.0);
+ cr.fill().unwrap();
+ }
+
+ Reference::from_surface(reference_surf)
+ .compare(&output_surf)
+ .evaluate(&output_surf, "render_to_viewport_with_transform");
+}
+
+#[test]
+fn clip_on_transformed_viewport() {
+ let svg = load_svg(
+ br##"<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100">
+ <defs>
+ <clipPath id="one" clipPathUnits="objectBoundingBox">
+ <path d="M 0.5 0.0 L 1.0 0.5 L 0.5 1.0 L 0.0 0.5 Z"/>
+ </clipPath>
+ </defs>
+ <g clip-path="url(#one)">
+ <rect x="10" y="10" width="40" height="40" fill="blue"/>
+ <rect x="50" y="50" width="40" height="40" fill="#00ff00"/>
+ </g>
+</svg>
+"##,
+ )
+ .unwrap();
+
+ let output_surf = render_document(
+ &svg,
+ SurfaceSize(200, 200),
+ |cr| cr.translate(50.0, 50.0),
+ cairo::Rectangle::new(0.0, 0.0, 100.0, 100.0),
+ )
+ .unwrap();
+
+ let reference_surf = cairo::ImageSurface::create(cairo::Format::ARgb32, 200, 200).unwrap();
+
+ {
+ let cr = cairo::Context::new(&reference_surf).expect("Failed to create a cairo context");
+
+ cr.translate(50.0, 50.0);
+
+ cr.push_group();
+
+ cr.rectangle(10.0, 10.0, 40.0, 40.0);
+ cr.set_source_rgba(0.0, 0.0, 1.0, 1.0);
+ cr.fill().unwrap();
+
+ cr.rectangle(50.0, 50.0, 40.0, 40.0);
+ cr.set_source_rgba(0.0, 1.0, 0.0, 1.0);
+ cr.fill().unwrap();
+
+ cr.pop_group_to_source().unwrap();
+
+ cr.move_to(50.0, 10.0);
+ cr.line_to(90.0, 50.0);
+ cr.line_to(50.0, 90.0);
+ cr.line_to(10.0, 50.0);
+ cr.close_path();
+
+ cr.clip();
+ cr.paint().unwrap();
+ }
+
+ Reference::from_surface(reference_surf)
+ .compare(&output_surf)
+ .evaluate(&output_surf, "clip_on_transformed_viewport");
+}
+
+#[test]
+fn mask_on_transformed_viewport() {
+ let svg = load_svg(
+ br##"<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100">
+ <defs>
+ <mask id="one" maskContentUnits="objectBoundingBox">
+ <path d="M 0.5 0.0 L 1.0 0.5 L 0.5 1.0 L 0.0 0.5 Z" fill="white"/>
+ </mask>
+ </defs>
+ <g mask="url(#one)">
+ <rect x="10" y="10" width="40" height="40" fill="blue"/>
+ <rect x="50" y="50" width="40" height="40" fill="#00ff00"/>
+ </g>
+</svg>
+"##,
+ )
+ .unwrap();
+
+ let output_surf = render_document(
+ &svg,
+ SurfaceSize(200, 200),
+ |cr| cr.translate(50.0, 50.0),
+ cairo::Rectangle::new(0.0, 0.0, 100.0, 100.0),
+ )
+ .unwrap();
+
+ let reference_surf = cairo::ImageSurface::create(cairo::Format::ARgb32, 200, 200).unwrap();
+
+ {
+ let cr = cairo::Context::new(&reference_surf).expect("Failed to create a cairo context");
+
+ cr.translate(50.0, 50.0);
+
+ cr.push_group();
+
+ cr.rectangle(10.0, 10.0, 40.0, 40.0);
+ cr.set_source_rgba(0.0, 0.0, 1.0, 1.0);
+ cr.fill().unwrap();
+
+ cr.rectangle(50.0, 50.0, 40.0, 40.0);
+ cr.set_source_rgba(0.0, 1.0, 0.0, 1.0);
+ cr.fill().unwrap();
+
+ cr.pop_group_to_source().unwrap();
+
+ cr.move_to(50.0, 10.0);
+ cr.line_to(90.0, 50.0);
+ cr.line_to(50.0, 90.0);
+ cr.line_to(10.0, 50.0);
+ cr.close_path();
+
+ cr.clip();
+ cr.paint().unwrap();
+ }
+
+ Reference::from_surface(reference_surf)
+ .compare(&output_surf)
+ .evaluate(&output_surf, "mask_on_transformed_viewport");
+}
diff --git a/rsvg/tests/src/legacy_sizing.rs b/rsvg/tests/src/legacy_sizing.rs
new file mode 100644
index 00000000..78f2a13f
--- /dev/null
+++ b/rsvg/tests/src/legacy_sizing.rs
@@ -0,0 +1,189 @@
+use cairo;
+
+use rsvg::{rsvg_convert_only::LegacySize, CairoRenderer};
+
+use crate::utils::load_svg;
+
+#[test]
+fn just_viewbox_uses_viewbox_size() {
+ let svg = load_svg(
+ br#"<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 200"/>
+"#,
+ )
+ .unwrap();
+
+ assert_eq!(
+ CairoRenderer::new(&svg)
+ .legacy_layer_geometry(None)
+ .unwrap(),
+ (
+ cairo::Rectangle::new(0.0, 0.0, 100.0, 200.0),
+ cairo::Rectangle::new(0.0, 0.0, 100.0, 200.0),
+ )
+ );
+}
+
+#[test]
+fn no_intrinsic_size_uses_element_geometries() {
+ let svg = load_svg(
+ br#"<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg">
+ <rect x="10" y="20" width="30" height="40" fill="black"/>
+</svg>
+"#,
+ )
+ .unwrap();
+
+ assert_eq!(
+ CairoRenderer::new(&svg)
+ .legacy_layer_geometry(None)
+ .unwrap(),
+ (
+ cairo::Rectangle::new(10.0, 20.0, 30.0, 40.0),
+ cairo::Rectangle::new(10.0, 20.0, 30.0, 40.0),
+ )
+ );
+}
+
+#[test]
+fn hundred_percent_width_height_uses_viewbox() {
+ let svg = load_svg(
+ br#"<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%" viewBox="0 0 100 200"/>
+"#,
+ )
+ .unwrap();
+
+ assert_eq!(
+ CairoRenderer::new(&svg)
+ .legacy_layer_geometry(None)
+ .unwrap(),
+ (
+ cairo::Rectangle::new(0.0, 0.0, 100.0, 200.0),
+ cairo::Rectangle::new(0.0, 0.0, 100.0, 200.0),
+ )
+ );
+}
+
+#[test]
+fn hundred_percent_width_height_no_viewbox_uses_element_geometries() {
+ let svg = load_svg(
+ br#"<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%">
+ <rect x="10" y="20" width="30" height="40" fill="black"/>
+</svg>
+"#,
+ )
+ .unwrap();
+
+ assert_eq!(
+ CairoRenderer::new(&svg)
+ .legacy_layer_geometry(None)
+ .unwrap(),
+ (
+ cairo::Rectangle::new(10.0, 20.0, 30.0, 40.0),
+ cairo::Rectangle::new(10.0, 20.0, 30.0, 40.0),
+ )
+ );
+}
+
+#[test]
+fn width_and_viewbox_preserves_aspect_ratio() {
+ let svg = load_svg(
+ br#"<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="60" viewBox="0 0 30 40">
+ <rect x="10" y="20" width="30" height="40" fill="black"/>
+</svg>
+"#,
+ )
+ .unwrap();
+
+ // Per the spec, the height property should default to 100%, so the above would end up
+ // like <svg width="60" height="100%" viewBox="0 0 30 40">
+ //
+ // If that were being *rendered* to a viewport, no problem, just use units horizontally
+ // and 100% of the viewport vertically.
+ //
+ // But we are being asked to compute the SVG's natural geometry, so the best we can do
+ // is to take the aspect ratio defined by the viewBox and apply it to the width.
+
+ assert_eq!(
+ CairoRenderer::new(&svg)
+ .legacy_layer_geometry(None)
+ .unwrap(),
+ (
+ cairo::Rectangle::new(0.0, 0.0, 60.0, 80.0),
+ cairo::Rectangle::new(0.0, 0.0, 60.0, 80.0),
+ )
+ );
+}
+
+#[test]
+fn height_and_viewbox_preserves_aspect_ratio() {
+ let svg = load_svg(
+ br#"<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" height="80" viewBox="0 0 30 40">
+ <rect x="10" y="20" width="30" height="40" fill="black"/>
+</svg>
+"#,
+ )
+ .unwrap();
+
+ // See the comment above in width_and_viewbox_preserves_aspect_ratio(); this
+ // is equivalent but for the height.
+
+ assert_eq!(
+ CairoRenderer::new(&svg)
+ .legacy_layer_geometry(None)
+ .unwrap(),
+ (
+ cairo::Rectangle::new(0.0, 0.0, 60.0, 80.0),
+ cairo::Rectangle::new(0.0, 0.0, 60.0, 80.0),
+ )
+ );
+}
+
+#[test]
+fn zero_width_vbox() {
+ let svg = load_svg(
+ br#"<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="80" viewBox="0 0 0 40">
+ <rect x="10" y="20" width="30" height="40" fill="black"/>
+</svg>
+"#,
+ )
+ .unwrap();
+
+ assert_eq!(
+ CairoRenderer::new(&svg)
+ .legacy_layer_geometry(None)
+ .unwrap(),
+ (
+ cairo::Rectangle::new(0.0, 0.0, 0.0, 0.0),
+ cairo::Rectangle::new(0.0, 0.0, 0.0, 0.0)
+ )
+ );
+}
+
+#[test]
+fn zero_height_vbox() {
+ let svg = load_svg(
+ br#"<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="80" viewBox="0 0 30 0">
+ <rect x="10" y="20" width="30" height="40" fill="black"/>
+</svg>
+"#,
+ )
+ .unwrap();
+
+ assert_eq!(
+ CairoRenderer::new(&svg)
+ .legacy_layer_geometry(None)
+ .unwrap(),
+ (
+ cairo::Rectangle::new(0.0, 0.0, 0.0, 0.0),
+ cairo::Rectangle::new(0.0, 0.0, 0.0, 0.0)
+ )
+ );
+}
diff --git a/rsvg/tests/src/loading_crash.rs b/rsvg/tests/src/loading_crash.rs
new file mode 100644
index 00000000..58d6f920
--- /dev/null
+++ b/rsvg/tests/src/loading_crash.rs
@@ -0,0 +1,55 @@
+//! Tests for crashes in the loading stage.
+//!
+//! Ensures that loading and parsing (but not rendering) a particular
+//! SVG doesn't crash.
+
+use rsvg::Loader;
+
+use std::path::PathBuf;
+
+fn loading_crash(filename: &str) {
+ let mut full_filename = PathBuf::new();
+ full_filename.push("tests/fixtures/crash");
+ full_filename.push(filename);
+
+ // We just test for crashes during loading, and don't care about success/error.
+ let _ = Loader::new().read_path(&full_filename);
+}
+
+macro_rules! t {
+ ($test_name:ident, $filename:expr) => {
+ #[test]
+ fn $test_name() {
+ loading_crash($filename);
+ }
+ };
+}
+
+#[rustfmt::skip]
+mod tests {
+ use super::*;
+
+ t!(bug335_non_svg_toplevel_svg, "bug335-non-svg-toplevel.svg");
+ t!(bug336_invalid_css_svg, "bug336-invalid-css.svg");
+ t!(bug349_empty_data_uri_svg, "bug349-empty-data-uri.svg");
+ t!(bug349_too_big_image_in_href_data_svg, "bug349-too-big-image-in-href-data.svg");
+ t!(bug352_feconvolvematrix_large_allocation_svg, "bug352-feConvolveMatrix-large-allocation.svg");
+ t!(bug377_xinclude_invalid_xml_svg, "bug377-xinclude-invalid-xml.svg");
+ t!(bug463_characters_outside_first_element_svg, "bug463-characters-outside-first-element.svg");
+ t!(bug467_xinclude_without_parent_element_svg, "bug467-xinclude-without-parent-element.svg");
+ t!(bug524_invalid_stylesheet_href_svg, "bug524-invalid-stylesheet-href.svg");
+ t!(bug942_xinclude_recursion_svg, "bug942-xinclude-recursion.svg");
+ t!(bug942_xinclude_mutual_recursion_svg, "bug942-xinclude-mutual-recursion.svg");
+ t!(bug620238_svg, "bug620238.svg");
+ t!(bug759084_svg, "bug759084.svg");
+ t!(bug785276_empty_svg, "bug785276-empty.svg");
+ t!(bug785276_short_file_svg, "bug785276-short-file.svg");
+ t!(bug800_font_inherit_svg, "bug800-font-inherit.svg");
+ t!(bug800_marker_svg, "bug800-marker.svg");
+ t!(feconvolvematrix_empty_kernel_svg, "feConvolveMatrix-empty-kernel.svg");
+ t!(marker_cycles_svg, "marker-cycles.svg");
+ t!(mask_cycles_svg, "mask-cycles.svg");
+ t!(pattern_fallback_cycles_svg, "pattern-fallback-cycles.svg");
+ t!(xinclude_text_xml_svg, "xinclude-text-xml.svg");
+ t!(xml_pi_without_data_svg, "xml-pi-without-data.svg");
+}
diff --git a/rsvg/tests/src/main.rs b/rsvg/tests/src/main.rs
new file mode 100644
index 00000000..467cbb47
--- /dev/null
+++ b/rsvg/tests/src/main.rs
@@ -0,0 +1,60 @@
+#[cfg(test)]
+mod api;
+
+#[cfg(test)]
+mod bugs;
+
+#[cfg(test)]
+mod cmdline;
+
+#[cfg(test)]
+mod compare_surfaces;
+
+#[cfg(test)]
+mod errors;
+
+#[cfg(test)]
+mod filters;
+
+#[cfg(test)]
+mod geometries;
+
+#[cfg(test)]
+mod intrinsic_dimensions;
+
+#[cfg(test)]
+mod legacy_sizing;
+
+#[cfg(test)]
+mod loading_crash;
+
+#[cfg(test)]
+mod predicates;
+
+#[cfg(test)]
+mod primitive_geometries;
+
+#[cfg(test)]
+mod primitives;
+
+#[cfg(test)]
+mod reference;
+
+#[cfg(test)]
+mod reference_utils;
+
+#[cfg(test)]
+mod render_crash;
+
+#[cfg(test)]
+mod shapes;
+
+#[cfg(test)]
+mod text;
+
+#[cfg(test)]
+mod utils;
+
+fn main() {
+ println!("Use 'cargo test' to run the tests.");
+}
diff --git a/rsvg/tests/src/predicates/file.rs b/rsvg/tests/src/predicates/file.rs
new file mode 100644
index 00000000..997b3690
--- /dev/null
+++ b/rsvg/tests/src/predicates/file.rs
@@ -0,0 +1,28 @@
+use predicates::prelude::*;
+use predicates::str::StartsWithPredicate;
+
+use crate::predicates::pdf::PdfPredicate;
+use crate::predicates::png::PngPredicate;
+use crate::predicates::svg::SvgPredicate;
+
+/// Predicates to check that some output ([u8]) is of a certain file type
+
+pub fn is_png() -> PngPredicate {
+ PngPredicate {}
+}
+
+pub fn is_ps() -> StartsWithPredicate {
+ predicate::str::starts_with("%!PS-Adobe-3.0\n")
+}
+
+pub fn is_eps() -> StartsWithPredicate {
+ predicate::str::starts_with("%!PS-Adobe-3.0 EPSF-3.0\n")
+}
+
+pub fn is_pdf() -> PdfPredicate {
+ PdfPredicate {}
+}
+
+pub fn is_svg() -> SvgPredicate {
+ SvgPredicate {}
+}
diff --git a/rsvg/tests/src/predicates/mod.rs b/rsvg/tests/src/predicates/mod.rs
new file mode 100644
index 00000000..e14061f0
--- /dev/null
+++ b/rsvg/tests/src/predicates/mod.rs
@@ -0,0 +1,10 @@
+pub mod file;
+mod pdf;
+mod png;
+mod svg;
+
+use predicates::str;
+
+pub fn ends_with_pkg_version() -> str::EndsWithPredicate {
+ str::ends_with(env!("CARGO_PKG_VERSION"))
+}
diff --git a/rsvg/tests/src/predicates/pdf.rs b/rsvg/tests/src/predicates/pdf.rs
new file mode 100644
index 00000000..f7872d71
--- /dev/null
+++ b/rsvg/tests/src/predicates/pdf.rs
@@ -0,0 +1,358 @@
+use chrono::{DateTime, Utc};
+use float_cmp::approx_eq;
+use lopdf::{self, Dictionary, Object};
+use predicates::prelude::*;
+use predicates::reflection::{Case, Child, PredicateReflection, Product};
+use std::cmp;
+use std::fmt;
+
+/// Checks that the variable of type [u8] can be parsed as a PDF file.
+#[derive(Debug)]
+pub struct PdfPredicate {}
+
+impl PdfPredicate {
+ pub fn with_page_count(self: Self, num_pages: usize) -> DetailPredicate<Self> {
+ DetailPredicate::<Self> {
+ p: self,
+ d: Detail::PageCount(num_pages),
+ }
+ }
+
+ pub fn with_page_size(
+ self: Self,
+ idx: usize,
+ width_in_points: f32,
+ height_in_points: f32,
+ ) -> DetailPredicate<Self> {
+ DetailPredicate::<Self> {
+ p: self,
+ d: Detail::PageSize(
+ Dimensions {
+ w: width_in_points,
+ h: height_in_points,
+ unit: 1.0,
+ },
+ idx,
+ ),
+ }
+ }
+
+ pub fn with_creation_date(self: Self, when: DateTime<Utc>) -> DetailPredicate<Self> {
+ DetailPredicate::<Self> {
+ p: self,
+ d: Detail::CreationDate(when),
+ }
+ }
+
+ pub fn with_link(self: Self, link: &str) -> DetailPredicate<Self> {
+ DetailPredicate::<Self> {
+ p: self,
+ d: Detail::Link(link.to_string()),
+ }
+ }
+
+ pub fn with_text(self: Self, text: &str) -> DetailPredicate<Self> {
+ DetailPredicate::<Self> {
+ p: self,
+ d: Detail::Text(text.to_string()),
+ }
+ }
+}
+
+impl Predicate<[u8]> for PdfPredicate {
+ fn eval(&self, data: &[u8]) -> bool {
+ lopdf::Document::load_mem(data).is_ok()
+ }
+
+ fn find_case<'a>(&'a self, _expected: bool, data: &[u8]) -> Option<Case<'a>> {
+ match lopdf::Document::load_mem(data) {
+ Ok(_) => None,
+ Err(e) => Some(Case::new(Some(self), false).add_product(Product::new("Error", e))),
+ }
+ }
+}
+
+impl PredicateReflection for PdfPredicate {}
+
+impl fmt::Display for PdfPredicate {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+ write!(f, "is a PDF")
+ }
+}
+
+/// Extends a PdfPredicate by a check for page count, page size or creation date.
+#[derive(Debug)]
+pub struct DetailPredicate<PdfPredicate> {
+ p: PdfPredicate,
+ d: Detail,
+}
+
+#[derive(Debug)]
+enum Detail {
+ PageCount(usize),
+ PageSize(Dimensions, usize),
+ CreationDate(DateTime<Utc>),
+ Link(String),
+ Text(String),
+}
+
+/// A PDF page's dimensions from its `MediaBox`.
+///
+/// Note that `w` and `h` given in `UserUnit`, which is by default 1.0 = 1/72 inch.
+#[derive(Debug)]
+struct Dimensions {
+ w: f32,
+ h: f32,
+ unit: f32, // UserUnit, in points (1/72 of an inch)
+}
+
+impl Dimensions {
+ pub fn from_media_box(obj: &lopdf::Object, unit: Option<f32>) -> lopdf::Result<Dimensions> {
+ let a = obj.as_array()?;
+ Ok(Dimensions {
+ w: a[2].as_float()?,
+ h: a[3].as_float()?,
+ unit: unit.unwrap_or(1.0),
+ })
+ }
+
+ pub fn width_in_pt(self: &Self) -> f32 {
+ self.w * self.unit
+ }
+
+ pub fn height_in_pt(self: &Self) -> f32 {
+ self.h * self.unit
+ }
+}
+
+impl fmt::Display for Dimensions {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+ write!(f, "{} pt x {} pt", self.width_in_pt(), self.height_in_pt())
+ }
+}
+
+impl cmp::PartialEq for Dimensions {
+ fn eq(&self, other: &Self) -> bool {
+ approx_eq!(
+ f32,
+ self.width_in_pt(),
+ other.width_in_pt(),
+ epsilon = 0.0001
+ ) && approx_eq!(
+ f32,
+ self.height_in_pt(),
+ other.height_in_pt(),
+ epsilon = 0.0001
+ )
+ }
+}
+
+impl cmp::Eq for Dimensions {}
+
+trait Details {
+ fn get_page_count(&self) -> usize;
+ fn get_page_size(&self, idx: usize) -> Option<Dimensions>;
+ fn get_creation_date(&self) -> Option<DateTime<Utc>>;
+ fn get_from_trailer<'a>(self: &'a Self, key: &[u8]) -> lopdf::Result<&'a lopdf::Object>;
+ fn get_from_page<'a>(
+ self: &'a Self,
+ idx: usize,
+ key: &[u8],
+ ) -> lopdf::Result<&'a lopdf::Object>;
+}
+
+impl DetailPredicate<PdfPredicate> {
+ fn eval_doc(&self, doc: &lopdf::Document) -> bool {
+ match &self.d {
+ Detail::PageCount(n) => doc.get_page_count() == *n,
+ Detail::PageSize(d, idx) => doc.get_page_size(*idx).map_or(false, |dim| dim == *d),
+ Detail::CreationDate(d) => doc.get_creation_date().map_or(false, |date| date == *d),
+ Detail::Link(link) => document_has_link(doc, &link),
+ Detail::Text(text) => document_has_text(doc, &text),
+ }
+ }
+
+ fn find_case_for_doc<'a>(&'a self, expected: bool, doc: &lopdf::Document) -> Option<Case<'a>> {
+ if self.eval_doc(doc) == expected {
+ let product = self.product_for_doc(doc);
+ Some(Case::new(Some(self), false).add_product(product))
+ } else {
+ None
+ }
+ }
+
+ fn product_for_doc(&self, doc: &lopdf::Document) -> Product {
+ match &self.d {
+ Detail::PageCount(_) => Product::new(
+ "actual page count",
+ format!("{} page(s)", doc.get_page_count()),
+ ),
+ Detail::PageSize(_, idx) => Product::new(
+ "actual page size",
+ match doc.get_page_size(*idx) {
+ Some(dim) => format!("{}", dim),
+ None => "None".to_string(),
+ },
+ ),
+ Detail::CreationDate(_) => Product::new(
+ "actual creation date",
+ format!("{:?}", doc.get_creation_date()),
+ ),
+ Detail::Link(_) => Product::new(
+ "actual link contents",
+ "FIXME: who knows, but it's not what we expected".to_string(),
+ ),
+ Detail::Text(_) => {
+ Product::new("actual text contents", doc.extract_text(&[1]).unwrap())
+ }
+ }
+ }
+}
+
+// Extensions to lopdf::Object; can be removed after lopdf 0.26
+trait ObjExt {
+ /// Get the object value as a float.
+ /// Unlike as_f32() this will also cast an Integer to a Real.
+ fn as_float(&self) -> lopdf::Result<f32>;
+}
+
+impl ObjExt for lopdf::Object {
+ fn as_float(&self) -> lopdf::Result<f32> {
+ match *self {
+ lopdf::Object::Integer(ref value) => Ok(*value as f32),
+ lopdf::Object::Real(ref value) => Ok(*value),
+ _ => Err(lopdf::Error::Type),
+ }
+ }
+}
+
+impl Details for lopdf::Document {
+ fn get_page_count(self: &Self) -> usize {
+ self.get_pages().len()
+ }
+
+ fn get_page_size(self: &Self, idx: usize) -> Option<Dimensions> {
+ match self.get_from_page(idx, b"MediaBox") {
+ Ok(obj) => {
+ let unit = self
+ .get_from_page(idx, b"UserUnit")
+ .and_then(ObjExt::as_float)
+ .ok();
+ Dimensions::from_media_box(obj, unit).ok()
+ }
+ Err(_) => None,
+ }
+ }
+
+ fn get_creation_date(self: &Self) -> Option<DateTime<Utc>> {
+ match self.get_from_trailer(b"CreationDate") {
+ Ok(obj) => obj.as_datetime().map(|date| date.with_timezone(&Utc)),
+ Err(_) => None,
+ }
+ }
+
+ fn get_from_trailer<'a>(self: &'a Self, key: &[u8]) -> lopdf::Result<&'a lopdf::Object> {
+ let id = self.trailer.get(b"Info")?.as_reference()?;
+ self.get_object(id)?.as_dict()?.get(key)
+ }
+
+ fn get_from_page<'a>(
+ self: &'a Self,
+ idx: usize,
+ key: &[u8],
+ ) -> lopdf::Result<&'a lopdf::Object> {
+ let mut iter = self.page_iter();
+ for _ in 0..idx {
+ let _ = iter.next();
+ }
+ match iter.next() {
+ Some(id) => self.get_object(id)?.as_dict()?.get(key),
+ None => Err(lopdf::Error::ObjectNotFound),
+ }
+ }
+}
+
+impl Predicate<[u8]> for DetailPredicate<PdfPredicate> {
+ fn eval(&self, data: &[u8]) -> bool {
+ match lopdf::Document::load_mem(data) {
+ Ok(doc) => self.eval_doc(&doc),
+ _ => false,
+ }
+ }
+
+ fn find_case<'a>(&'a self, expected: bool, data: &[u8]) -> Option<Case<'a>> {
+ match lopdf::Document::load_mem(data) {
+ Ok(doc) => self.find_case_for_doc(expected, &doc),
+ Err(e) => Some(Case::new(Some(self), false).add_product(Product::new("Error", e))),
+ }
+ }
+}
+
+impl PredicateReflection for DetailPredicate<PdfPredicate> {
+ fn children<'a>(&'a self) -> Box<dyn Iterator<Item = Child<'a>> + 'a> {
+ let params = vec![Child::new("predicate", &self.p)];
+ Box::new(params.into_iter())
+ }
+}
+
+impl fmt::Display for DetailPredicate<PdfPredicate> {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+ match &self.d {
+ Detail::PageCount(n) => write!(f, "is a PDF with {} page(s)", n),
+ Detail::PageSize(d, _) => write!(f, "is a PDF sized {}", d),
+ Detail::CreationDate(d) => write!(f, "is a PDF created {:?}", d),
+ Detail::Link(l) => write!(f, "is a PDF with a link to {}", l),
+ Detail::Text(t) => write!(f, "is a PDF with \"{}\" in its text content", t),
+ }
+ }
+}
+
+// This is an extremely trivial test for a string being present in the document's
+// text objects.
+fn document_has_text(document: &lopdf::Document, needle: &str) -> bool {
+ if let Ok(haystack) = text_from_first_page(document) {
+ haystack.contains(needle)
+ } else {
+ false
+ }
+}
+
+// We do a super simple test that a PDF actually contains an Annotation object
+// with a particular link. We don't test that this annotation is actually linked
+// from a page; that would be nicer.
+fn document_has_link(document: &lopdf::Document, link_text: &str) -> bool {
+ document
+ .objects
+ .iter()
+ .map(|(_obj_id, object)| object)
+ .any(|obj| object_is_annotation_with_link(obj, link_text))
+}
+
+fn object_is_annotation_with_link(object: &Object, link_text: &str) -> bool {
+ object
+ .as_dict()
+ .map(|dict| dict_is_annotation(dict) && dict_has_a_with_link(dict, link_text))
+ .unwrap_or(false)
+}
+
+fn dict_is_annotation(dict: &Dictionary) -> bool {
+ dict.get(b"Type")
+ .and_then(|type_val| type_val.as_name_str())
+ .map(|name| name == "Annot")
+ .unwrap_or(false)
+}
+
+fn dict_has_a_with_link(dict: &Dictionary, link_text: &str) -> bool {
+ dict.get(b"A")
+ .and_then(|obj| obj.as_dict())
+ .and_then(|dict| dict.get(b"URI"))
+ .and_then(|obj| obj.as_str())
+ .map(|string| string == link_text.as_bytes())
+ .unwrap_or(false)
+}
+
+fn text_from_first_page(doc: &lopdf::Document) -> lopdf::Result<String> {
+ // This is extremely simplistic; lopdf just concatenates all the text in the page
+ // into a single string.
+ doc.extract_text(&[1])
+}
diff --git a/rsvg/tests/src/predicates/png.rs b/rsvg/tests/src/predicates/png.rs
new file mode 100644
index 00000000..452e756e
--- /dev/null
+++ b/rsvg/tests/src/predicates/png.rs
@@ -0,0 +1,193 @@
+use png;
+use predicates::prelude::*;
+use predicates::reflection::{Case, Child, PredicateReflection, Product};
+use std::fmt;
+use std::io::BufReader;
+use std::path::{Path, PathBuf};
+
+use rsvg::surface_utils::shared_surface::{SharedImageSurface, SurfaceType};
+
+use crate::compare_surfaces::BufferDiff;
+use crate::reference_utils::{surface_from_png, Compare, Deviation, Reference};
+
+/// Checks that the variable of type [u8] can be parsed as a PNG file.
+#[derive(Debug)]
+pub struct PngPredicate {}
+
+impl PngPredicate {
+ pub fn with_size(self: Self, w: u32, h: u32) -> SizePredicate<Self> {
+ SizePredicate::<Self> { p: self, w, h }
+ }
+
+ pub fn with_contents<P: AsRef<Path>>(self: Self, reference: P) -> ReferencePredicate<Self> {
+ let mut path = PathBuf::new();
+ path.push(reference);
+ ReferencePredicate::<Self> { p: self, path }
+ }
+}
+
+impl Predicate<[u8]> for PngPredicate {
+ fn eval(&self, data: &[u8]) -> bool {
+ let decoder = png::Decoder::new(data);
+ decoder.read_info().is_ok()
+ }
+
+ fn find_case<'a>(&'a self, _expected: bool, data: &[u8]) -> Option<Case<'a>> {
+ let decoder = png::Decoder::new(data);
+ match decoder.read_info() {
+ Ok(_) => None,
+ Err(e) => Some(Case::new(Some(self), false).add_product(Product::new("Error", e))),
+ }
+ }
+}
+
+impl PredicateReflection for PngPredicate {}
+
+impl fmt::Display for PngPredicate {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+ write!(f, "is a PNG")
+ }
+}
+
+/// Extends a PngPredicate by a check for a given size of the PNG file.
+#[derive(Debug)]
+pub struct SizePredicate<PngPredicate> {
+ p: PngPredicate,
+ w: u32,
+ h: u32,
+}
+
+impl SizePredicate<PngPredicate> {
+ fn eval_info(&self, info: &png::Info) -> bool {
+ info.width == self.w && info.height == self.h
+ }
+
+ fn find_case_for_info<'a>(&'a self, expected: bool, info: &png::Info) -> Option<Case<'a>> {
+ if self.eval_info(info) == expected {
+ let product = self.product_for_info(info);
+ Some(Case::new(Some(self), false).add_product(product))
+ } else {
+ None
+ }
+ }
+
+ fn product_for_info(&self, info: &png::Info) -> Product {
+ let actual_size = format!("{} x {}", info.width, info.height);
+ Product::new("actual size", actual_size)
+ }
+}
+
+impl Predicate<[u8]> for SizePredicate<PngPredicate> {
+ fn eval(&self, data: &[u8]) -> bool {
+ let decoder = png::Decoder::new(data);
+ match decoder.read_info() {
+ Ok(reader) => self.eval_info(&reader.info()),
+ _ => false,
+ }
+ }
+
+ fn find_case<'a>(&'a self, expected: bool, data: &[u8]) -> Option<Case<'a>> {
+ let decoder = png::Decoder::new(data);
+ match decoder.read_info() {
+ Ok(reader) => self.find_case_for_info(expected, reader.info()),
+ Err(e) => Some(Case::new(Some(self), false).add_product(Product::new("Error", e))),
+ }
+ }
+}
+
+impl PredicateReflection for SizePredicate<PngPredicate> {
+ fn children<'a>(&'a self) -> Box<dyn Iterator<Item = Child<'a>> + 'a> {
+ let params = vec![Child::new("predicate", &self.p)];
+ Box::new(params.into_iter())
+ }
+}
+
+impl fmt::Display for SizePredicate<PngPredicate> {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+ write!(f, "is a PNG with size {} x {}", self.w, self.h)
+ }
+}
+
+/// Extends a PngPredicate by a comparison to the contents of a reference file
+#[derive(Debug)]
+pub struct ReferencePredicate<PngPredicate> {
+ p: PngPredicate,
+ path: PathBuf,
+}
+
+impl ReferencePredicate<PngPredicate> {
+ fn diff_acceptable(diff: &BufferDiff) -> bool {
+ match diff {
+ BufferDiff::DifferentSizes => false,
+ BufferDiff::Diff(diff) => !diff.inacceptable(),
+ }
+ }
+
+ fn diff_surface(&self, surface: &SharedImageSurface) -> Option<BufferDiff> {
+ let reference = Reference::from_png(&self.path)
+ .unwrap_or_else(|_| panic!("could not open {:?}", self.path));
+ if let Ok(diff) = reference.compare(&surface) {
+ if !Self::diff_acceptable(&diff) {
+ return Some(diff);
+ }
+ }
+ None
+ }
+
+ fn find_case_for_surface<'a>(
+ &'a self,
+ expected: bool,
+ surface: &SharedImageSurface,
+ ) -> Option<Case<'a>> {
+ let diff = self.diff_surface(&surface);
+ if diff.is_some() != expected {
+ let product = self.product_for_diff(&diff.unwrap());
+ Some(Case::new(Some(self), false).add_product(product))
+ } else {
+ None
+ }
+ }
+
+ fn product_for_diff(&self, diff: &BufferDiff) -> Product {
+ let difference = format!("{}", diff);
+ Product::new("images differ", difference)
+ }
+}
+
+impl Predicate<[u8]> for ReferencePredicate<PngPredicate> {
+ fn eval(&self, data: &[u8]) -> bool {
+ if let Ok(surface) = surface_from_png(&mut BufReader::new(data)) {
+ let surface = SharedImageSurface::wrap(surface, SurfaceType::SRgb).unwrap();
+ self.diff_surface(&surface).is_some()
+ } else {
+ false
+ }
+ }
+
+ fn find_case<'a>(&'a self, expected: bool, data: &[u8]) -> Option<Case<'a>> {
+ match surface_from_png(&mut BufReader::new(data)) {
+ Ok(surface) => {
+ let surface = SharedImageSurface::wrap(surface, SurfaceType::SRgb).unwrap();
+ self.find_case_for_surface(expected, &surface)
+ }
+ Err(e) => Some(Case::new(Some(self), false).add_product(Product::new("Error", e))),
+ }
+ }
+}
+
+impl PredicateReflection for ReferencePredicate<PngPredicate> {
+ fn children<'a>(&'a self) -> Box<dyn Iterator<Item = Child<'a>> + 'a> {
+ let params = vec![Child::new("predicate", &self.p)];
+ Box::new(params.into_iter())
+ }
+}
+
+impl fmt::Display for ReferencePredicate<PngPredicate> {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+ write!(
+ f,
+ "is a PNG that matches the reference {}",
+ self.path.display()
+ )
+ }
+}
diff --git a/rsvg/tests/src/predicates/svg.rs b/rsvg/tests/src/predicates/svg.rs
new file mode 100644
index 00000000..cd6071b7
--- /dev/null
+++ b/rsvg/tests/src/predicates/svg.rs
@@ -0,0 +1,179 @@
+use float_cmp::approx_eq;
+use gio::MemoryInputStream;
+use glib::Bytes;
+use predicates::prelude::*;
+use predicates::reflection::{Case, Child, PredicateReflection, Product};
+use std::cmp;
+use std::fmt;
+
+use rsvg::{CairoRenderer, Length, Loader, LoadingError, SvgHandle};
+
+/// Checks that the variable of type [u8] can be parsed as a SVG file.
+#[derive(Debug)]
+pub struct SvgPredicate {}
+
+impl SvgPredicate {
+ pub fn with_size(self: Self, width: Length, height: Length) -> DetailPredicate<Self> {
+ DetailPredicate::<Self> {
+ p: self,
+ d: Detail::Size(Dimensions {
+ w: width,
+ h: height,
+ }),
+ }
+ }
+}
+
+fn svg_from_bytes(data: &[u8]) -> Result<SvgHandle, LoadingError> {
+ let bytes = Bytes::from(data);
+ let stream = MemoryInputStream::from_bytes(&bytes);
+ Loader::new().read_stream(&stream, None::<&gio::File>, None::<&gio::Cancellable>)
+}
+
+impl Predicate<[u8]> for SvgPredicate {
+ fn eval(&self, data: &[u8]) -> bool {
+ svg_from_bytes(data).is_ok()
+ }
+
+ fn find_case<'a>(&'a self, _expected: bool, data: &[u8]) -> Option<Case<'a>> {
+ match svg_from_bytes(data) {
+ Ok(_) => None,
+ Err(e) => Some(Case::new(Some(self), false).add_product(Product::new("Error", e))),
+ }
+ }
+}
+
+impl PredicateReflection for SvgPredicate {}
+
+impl fmt::Display for SvgPredicate {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+ write!(f, "is an SVG")
+ }
+}
+
+/// Extends a SVG Predicate by a check for its size
+#[derive(Debug)]
+pub struct DetailPredicate<SvgPredicate> {
+ p: SvgPredicate,
+ d: Detail,
+}
+
+#[derive(Debug)]
+enum Detail {
+ Size(Dimensions),
+}
+
+/// SVG's dimensions
+#[derive(Debug)]
+struct Dimensions {
+ w: Length,
+ h: Length,
+}
+
+impl Dimensions {
+ pub fn width(self: &Self) -> f64 {
+ self.w.length
+ }
+
+ pub fn height(self: &Self) -> f64 {
+ self.h.length
+ }
+}
+
+impl fmt::Display for Dimensions {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+ write!(
+ f,
+ "{}{} x {}{}",
+ self.width(),
+ self.w.unit,
+ self.height(),
+ self.h.unit
+ )
+ }
+}
+
+impl cmp::PartialEq for Dimensions {
+ fn eq(&self, other: &Self) -> bool {
+ approx_eq!(f64, self.width(), other.width(), epsilon = 0.000_001)
+ && approx_eq!(f64, self.height(), other.height(), epsilon = 0.000_001)
+ && (self.w.unit == self.h.unit)
+ && (self.h.unit == other.h.unit)
+ && (other.h.unit == other.w.unit)
+ }
+}
+
+impl cmp::Eq for Dimensions {}
+
+trait Details {
+ fn get_size(&self) -> Option<Dimensions>;
+}
+
+impl DetailPredicate<SvgPredicate> {
+ fn eval_doc(&self, handle: &SvgHandle) -> bool {
+ match &self.d {
+ Detail::Size(d) => {
+ let renderer = CairoRenderer::new(handle);
+ let dimensions = renderer.intrinsic_dimensions();
+ (dimensions.width, dimensions.height) == (d.w, d.h)
+ }
+ }
+ }
+
+ fn find_case_for_doc<'a>(&'a self, expected: bool, handle: &SvgHandle) -> Option<Case<'a>> {
+ if self.eval_doc(handle) == expected {
+ let product = self.product_for_doc(handle);
+ Some(Case::new(Some(self), false).add_product(product))
+ } else {
+ None
+ }
+ }
+
+ fn product_for_doc(&self, handle: &SvgHandle) -> Product {
+ match &self.d {
+ Detail::Size(_) => {
+ let renderer = CairoRenderer::new(handle);
+ let dimensions = renderer.intrinsic_dimensions();
+
+ Product::new(
+ "actual size",
+ format!(
+ "width={:?}, height={:?}",
+ dimensions.width, dimensions.height
+ ),
+ )
+ }
+ }
+ }
+}
+
+impl Predicate<[u8]> for DetailPredicate<SvgPredicate> {
+ fn eval(&self, data: &[u8]) -> bool {
+ match svg_from_bytes(data) {
+ Ok(handle) => self.eval_doc(&handle),
+ _ => false,
+ }
+ }
+
+ fn find_case<'a>(&'a self, expected: bool, data: &[u8]) -> Option<Case<'a>> {
+ match svg_from_bytes(data) {
+ Ok(handle) => self.find_case_for_doc(expected, &handle),
+ Err(e) => Some(Case::new(Some(self), false).add_product(Product::new("Error", e))),
+ }
+ }
+}
+
+impl PredicateReflection for DetailPredicate<SvgPredicate> {
+ fn children<'a>(&'a self) -> Box<dyn Iterator<Item = Child<'a>> + 'a> {
+ let params = vec![Child::new("predicate", &self.p)];
+ Box::new(params.into_iter())
+ }
+}
+
+impl fmt::Display for DetailPredicate<SvgPredicate> {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+ match &self.d {
+ Detail::Size(d) => write!(f, "is an SVG sized {}", d),
+ }
+ }
+}
diff --git a/rsvg/tests/src/primitive_geometries.rs b/rsvg/tests/src/primitive_geometries.rs
new file mode 100644
index 00000000..479d6445
--- /dev/null
+++ b/rsvg/tests/src/primitive_geometries.rs
@@ -0,0 +1,167 @@
+//! Tests for geometries of SVG primitives
+//!
+//! These use the *.svg and *.svg.geom files in the tests/fixtures/primitive_geometries directory.
+//!
+//! Each .svg.geom is a JSON file formatted like this:
+//!
+//! ```json
+//! {
+//! "#element_id": {
+//! "ink_rect": {
+//! "x": 5.0,
+//! "y": 15.0,
+//! "width": 40.0,
+//! "height": 50.0
+//! },
+//! "logical_rect": {
+//! "x": 10.0,
+//! "y": 20.0,
+//! "width": 30.0,
+//! "height": 40.0
+//! }
+//! }
+//! }
+//! ```
+//!
+//! Any number of element_ids may appear in the file. For each of those, the `test()` function will
+//! call `CairoRenderer::get_layer_geometry()` and compare its result against the provided rectangles.
+
+use anyhow::{Context, Result};
+use cairo;
+use rsvg::{CairoRenderer, LengthUnit, Loader, Rect};
+use serde::Deserialize;
+use std::collections::BTreeMap;
+use std::fs;
+
+// Copy of cairo::Rectangle
+//
+// Somehow I can't make serde's "remote" work here, in combination with the BTreeMap below...
+#[derive(Copy, Clone, Deserialize, Debug, PartialEq)]
+struct Rectangle {
+ x: f64,
+ y: f64,
+ width: f64,
+ height: f64,
+}
+
+impl From<Rectangle> for Rect {
+ fn from(r: Rectangle) -> Rect {
+ Rect {
+ x0: r.x,
+ y0: r.y,
+ x1: r.x + r.width,
+ y1: r.y + r.height,
+ }
+ }
+}
+
+#[derive(Copy, Clone, Deserialize, Debug, PartialEq)]
+struct ElementGeometry {
+ ink_rect: Option<Rectangle>,
+ logical_rect: Option<Rectangle>,
+}
+
+#[derive(Deserialize)]
+struct Geometries(BTreeMap<String, ElementGeometry>);
+
+fn read_geometries(path: &str) -> Result<Geometries> {
+ let contents = fs::read_to_string(path).context(format!("could not read {:?}", path))?;
+ Ok(serde_json::from_str(&contents).context(format!("could not parse JSON from {:?}", path))?)
+}
+
+// We create a struct with the id and geometry so that
+// assert_eq!() in the tests will print out the element name for failures.
+//
+// Here we use rsvg::Rect as that one has an approx_eq() method.
+#[derive(Debug, PartialEq)]
+struct Element {
+ id: String,
+ ink_rect: Option<Rect>,
+ logical_rect: Option<Rect>,
+}
+
+impl Element {
+ fn from_element_geometry(id: &str, geom: &ElementGeometry) -> Element {
+ Element {
+ id: String::from(id),
+ ink_rect: geom.ink_rect.map(Into::into),
+ logical_rect: geom.logical_rect.map(Into::into),
+ }
+ }
+
+ fn from_rectangles(
+ id: &str,
+ ink_rect: cairo::Rectangle,
+ logical_rect: cairo::Rectangle,
+ ) -> Element {
+ Element {
+ id: String::from(id),
+ ink_rect: Some(ink_rect.into()),
+ logical_rect: Some(logical_rect.into()),
+ }
+ }
+}
+
+fn test(svg_filename: &str, geometries_filename: &str) {
+ let geometries = read_geometries(geometries_filename).expect("reading geometries JSON");
+
+ let handle = Loader::new()
+ .read_path(svg_filename)
+ .expect("reading geometries SVG");
+ let renderer = CairoRenderer::new(&handle);
+ let dimensions = renderer.intrinsic_dimensions();
+ let (svg_width, svg_height) = renderer
+ .intrinsic_size_in_pixels()
+ .expect("intrinsic size in pixels");
+
+ assert!(matches!(dimensions.width.unit, LengthUnit::Px));
+ assert!(matches!(dimensions.height.unit, LengthUnit::Px));
+ assert_eq!(dimensions.width.length, svg_width);
+ assert_eq!(dimensions.height.length, svg_height);
+
+ for (id, expected) in geometries.0.iter() {
+ let expected = Element::from_element_geometry(id, expected);
+
+ let viewport = cairo::Rectangle::new(0.0, 0.0, svg_width, svg_height);
+
+ let (ink_rect, logical_rect) = renderer
+ .geometry_for_layer(Some(id), &viewport)
+ .expect(&format!("getting geometry for {}", id));
+
+ let computed = Element::from_rectangles(id, ink_rect, logical_rect);
+
+ assert_eq!(expected, computed);
+ }
+}
+
+#[test]
+fn rect() {
+ test(
+ "tests/fixtures/primitive_geometries/rect.svg",
+ "tests/fixtures/primitive_geometries/rect.svg.geom",
+ );
+}
+
+#[test]
+fn rect_stroke() {
+ test(
+ "tests/fixtures/primitive_geometries/rect_stroke.svg",
+ "tests/fixtures/primitive_geometries/rect_stroke.svg.geom",
+ );
+}
+
+#[test]
+fn rect_stroke_unfilled() {
+ test(
+ "tests/fixtures/primitive_geometries/rect_stroke_unfilled.svg",
+ "tests/fixtures/primitive_geometries/rect_stroke_unfilled.svg.geom",
+ );
+}
+
+#[test]
+fn rect_isolate() {
+ test(
+ "tests/fixtures/primitive_geometries/rect_isolate.svg",
+ "tests/fixtures/primitive_geometries/rect_isolate.svg.geom",
+ );
+}
diff --git a/rsvg/tests/src/primitives.rs b/rsvg/tests/src/primitives.rs
new file mode 100644
index 00000000..b12906f4
--- /dev/null
+++ b/rsvg/tests/src/primitives.rs
@@ -0,0 +1,367 @@
+use cairo;
+
+use crate::reference_utils::{Compare, Evaluate, Reference};
+use crate::test_compare_render_output;
+use crate::utils::{load_svg, render_document, SurfaceSize};
+
+#[test]
+fn simple_opacity_with_transform() {
+ let svg = load_svg(
+ br#"<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="50" height="50">
+ <g opacity="0.5">
+ <rect x="10" y="10" width="30" height="30" fill="blue"/>
+ </g>
+</svg>
+"#,
+ )
+ .unwrap();
+
+ let output_surf = render_document(
+ &svg,
+ SurfaceSize(150, 150),
+ |cr| cr.translate(50.0, 50.0),
+ cairo::Rectangle::new(0.0, 0.0, 50.0, 50.0),
+ )
+ .unwrap();
+
+ let reference_surf = cairo::ImageSurface::create(cairo::Format::ARgb32, 150, 150).unwrap();
+
+ {
+ let cr = cairo::Context::new(&reference_surf).expect("Failed to create a cairo context");
+
+ cr.translate(50.0, 50.0);
+ cr.rectangle(10.0, 10.0, 30.0, 30.0);
+ cr.set_source_rgba(0.0, 0.0, 1.0, 0.5);
+ cr.fill().unwrap();
+ }
+
+ Reference::from_surface(reference_surf)
+ .compare(&output_surf)
+ .evaluate(&output_surf, "simple_opacity_with_transform");
+}
+
+#[test]
+fn simple_opacity_with_offset_viewport() {
+ let svg = load_svg(
+ br#"<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="50" height="50">
+ <g opacity="0.5">
+ <rect x="10" y="10" width="30" height="30" fill="blue"/>
+ </g>
+</svg>
+"#,
+ )
+ .unwrap();
+
+ let output_surf = render_document(
+ &svg,
+ SurfaceSize(150, 150),
+ |_cr| (),
+ cairo::Rectangle::new(50.0, 50.0, 50.0, 50.0),
+ )
+ .unwrap();
+
+ let reference_surf = cairo::ImageSurface::create(cairo::Format::ARgb32, 150, 150).unwrap();
+
+ {
+ let cr = cairo::Context::new(&reference_surf).expect("Failed to create a cairo context");
+
+ cr.translate(50.0, 50.0);
+ cr.rectangle(10.0, 10.0, 30.0, 30.0);
+ cr.set_source_rgba(0.0, 0.0, 1.0, 0.5);
+ cr.fill().unwrap();
+ }
+
+ Reference::from_surface(reference_surf)
+ .compare(&output_surf)
+ .evaluate(&output_surf, "simple_opacity_with_offset_viewport");
+}
+
+#[test]
+// https://gitlab.gnome.org/GNOME/librsvg/issues/471
+fn simple_opacity_with_scale() {
+ let svg = load_svg(
+ br#"<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="50" height="50">
+ <g opacity="0.5">
+ <rect x="10" y="10" width="30" height="30" fill="blue"/>
+ </g>
+</svg>
+"#,
+ )
+ .unwrap();
+
+ let output_surf = render_document(
+ &svg,
+ SurfaceSize(500, 500),
+ |cr| {
+ cr.translate(50.0, 50.0);
+ cr.scale(8.0, 8.0);
+ },
+ cairo::Rectangle::new(0.0, 0.0, 50.0, 50.0),
+ )
+ .unwrap();
+
+ let reference_surf = cairo::ImageSurface::create(cairo::Format::ARgb32, 500, 500).unwrap();
+
+ {
+ let cr = cairo::Context::new(&reference_surf).expect("Failed to create a cairo context");
+
+ cr.translate(50.0, 50.0);
+ cr.scale(8.0, 8.0);
+ cr.rectangle(10.0, 10.0, 30.0, 30.0);
+ cr.set_source_rgba(0.0, 0.0, 1.0, 0.5);
+ cr.fill().unwrap();
+ }
+
+ Reference::from_surface(reference_surf)
+ .compare(&output_surf)
+ .evaluate(&output_surf, "simple_opacity_with_scale");
+}
+
+#[test]
+// https://gitlab.gnome.org/GNOME/librsvg/issues/471
+fn markers_with_scale() {
+ let svg = load_svg(
+ br#"<svg viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg">
+ <marker id="marker1" refX="10" refY="10" markerWidth="20" markerHeight="20" orient="auto">
+ <path id="marker-path" d="M 20 10 L 0 16 V 4 Z" fill="blue" opacity="0.5"/>
+ </marker>
+ <path d="M 30 100 L 170 100"
+ fill="none" stroke="green"
+ marker-start="url(#marker1)" marker-end="url(#marker1)"/>
+</svg>
+
+"#,
+ )
+ .unwrap();
+
+ let output_surf = render_document(
+ &svg,
+ SurfaceSize(800, 800),
+ |cr| {
+ cr.scale(4.0, 4.0);
+ },
+ cairo::Rectangle::new(0.0, 0.0, 200.0, 200.0),
+ )
+ .unwrap();
+
+ let reference_surf = cairo::ImageSurface::create(cairo::Format::ARgb32, 800, 800).unwrap();
+
+ {
+ let cr = cairo::Context::new(&reference_surf).expect("Failed to create a cairo context");
+
+ cr.scale(4.0, 4.0);
+
+ cr.move_to(30.0, 100.0);
+ cr.line_to(170.0, 100.0);
+ cr.set_source_rgb(0.0, 0.5, 0.0);
+ cr.set_line_width(1.0);
+ cr.stroke().unwrap();
+
+ for (x, y) in &[(30.0, 100.0), (170.0, 100.0)] {
+ cr.move_to(x + 20.0 - 10.0, y + 10.0 - 10.0);
+ cr.line_to(x + 0.0 - 10.0, y + 16.0 - 10.0);
+ cr.line_to(x + 0.0 - 10.0, y + 4.0 - 10.0);
+ cr.set_source_rgba(0.0, 0.0, 1.0, 0.5);
+ cr.fill().unwrap();
+ }
+ }
+
+ Reference::from_surface(reference_surf)
+ .compare(&output_surf)
+ .evaluate(&output_surf, "markers_with_scale");
+}
+
+#[test]
+fn opacity_inside_transformed_group() {
+ let svg = load_svg(
+ br#"<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100">
+ <g transform="translate(20, 20)">
+ <rect x="0" y="0" width="60" height="60" style="fill:blue; opacity:0.5;"/>
+ </g>
+</svg>
+"#,
+ )
+ .unwrap();
+
+ let output_surf = render_document(
+ &svg,
+ SurfaceSize(140, 140),
+ |cr| cr.translate(20.0, 20.0),
+ cairo::Rectangle::new(0.0, 0.0, 100.0, 100.0),
+ )
+ .unwrap();
+
+ let reference_surf = cairo::ImageSurface::create(cairo::Format::ARgb32, 140, 140).unwrap();
+
+ {
+ let cr = cairo::Context::new(&reference_surf).expect("Failed to create a cairo context");
+
+ cr.translate(20.0, 20.0);
+ cr.rectangle(20.0, 20.0, 60.0, 60.0);
+ cr.set_source_rgba(0.0, 0.0, 1.0, 0.5);
+ cr.fill().unwrap();
+ }
+
+ Reference::from_surface(reference_surf)
+ .compare(&output_surf)
+ .evaluate(&output_surf, "opacity_inside_transformed_group");
+}
+
+#[test]
+fn compound_opacity() {
+ let svg = load_svg(
+ br##"<?xml version="1.0" encoding="UTF-8"?>
+<svg version="1.1" baseProfile="basic" id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <g>
+ <g opacity="0.5">
+ <rect x="60" y="230" width="80" height="40" fill="#0000ff" opacity=".5"/>
+ <rect x="70" y="240" width="80" height="40" fill="#00ff00" opacity=".5"/>
+ </g>
+ </g>
+</svg>
+"##,
+ )
+ .unwrap();
+
+ let output_surf = render_document(
+ &svg,
+ SurfaceSize(500, 380),
+ |cr| cr.translate(10.0, 10.0),
+ cairo::Rectangle::new(0.0, 0.0, 480.0, 360.0),
+ )
+ .unwrap();
+
+ let reference_surf = cairo::ImageSurface::create(cairo::Format::ARgb32, 500, 380).unwrap();
+
+ {
+ let cr = cairo::Context::new(&reference_surf).expect("Failed to create a cairo context");
+
+ cr.translate(10.0, 10.0);
+
+ cr.push_group();
+
+ cr.rectangle(60.0, 230.0, 80.0, 40.0);
+ cr.set_source_rgba(0.0, 0.0, 1.0, 0.5);
+ cr.fill().unwrap();
+
+ cr.rectangle(70.0, 240.0, 80.0, 40.0);
+ cr.set_source_rgba(0.0, 1.0, 0.0, 0.5);
+ cr.fill().unwrap();
+
+ cr.pop_group_to_source().unwrap();
+ cr.paint_with_alpha(0.5).unwrap();
+ }
+
+ Reference::from_surface(reference_surf)
+ .compare(&output_surf)
+ .evaluate(&output_surf, "compound_opacity");
+}
+
+#[test]
+fn nested_masks() {
+ let svg = load_svg(
+ br##"<?xml version="1.0" encoding="UTF-8"?>
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="321.00" height="27.00" viewBox="0 0 6420 540">
+ <defs>
+ <mask id="Mask_big_ex_small" maskUnits="userSpaceOnUse" x="0" y="0" width="6420" height="540">
+ <g>
+ <use xlink:href="#big" fill="white"/>
+ <use xlink:href="#small" fill="black"/>
+ </g>
+ </mask>
+ <g id="big_ex_small">
+ <use xlink:href="#big" mask="url(#Mask_big_ex_small)"/>
+ </g>
+ <mask id="Region0" maskUnits="userSpaceOnUse" x="0" y="0" width="6420" height="540" fill-rule="nonzero">
+ <use xlink:href="#big_ex_small" fill="white"/>
+ </mask>
+ <rect id="big" x="0" y="0" width="6420" height="540"/>
+ <rect id="small" x="2760" y="20" width="900" height="480"/>
+ </defs>
+ <g mask="url(#Region0)">
+ <g transform="matrix(1.66667 0 0 1.66667 0 0)">
+ <rect x="0" y="0" width="6420" height="540" fill="black"/>
+ </g>
+ </g>
+</svg>
+
+"##,
+ ).unwrap();
+
+ let output_surf = render_document(
+ &svg,
+ SurfaceSize(321 + 20, 27 + 20),
+ |cr| cr.translate(10.0, 10.0),
+ cairo::Rectangle::new(0.0, 0.0, 321.0, 27.0),
+ )
+ .unwrap();
+
+ let reference_surf =
+ cairo::ImageSurface::create(cairo::Format::ARgb32, 321 + 20, 27 + 20).unwrap();
+
+ {
+ let cr = cairo::Context::new(&reference_surf).expect("Failed to create a cairo context");
+
+ cr.translate(10.0, 10.0);
+ cr.scale(321.0 / 6420.0, 27.0 / 540.0);
+
+ cr.set_source_rgba(0.0, 0.0, 0.0, 1.0);
+ cr.rectangle(0.0, 0.0, 6420.0, 540.0);
+ cr.fill().unwrap();
+
+ cr.set_operator(cairo::Operator::Clear);
+ cr.rectangle(2760.0, 20.0, 900.0, 480.0);
+ cr.fill().unwrap();
+ }
+
+ Reference::from_surface(reference_surf)
+ .compare(&output_surf)
+ .evaluate(&output_surf, "nested_masks");
+}
+
+test_compare_render_output!(
+ image_element_with_no_href,
+ 30,
+ 30,
+ br##"<?xml version="1.0" encoding="UTF-8"?>
+ <svg xmlns="http://www.w3.org/2000/svg" width="30" height="30">
+ <image x="10" y="10"/>
+ </svg>"##,
+ br##"<?xml version="1.0" encoding="UTF-8"?>
+ <svg xmlns="http://www.w3.org/2000/svg" width="30" height="30">
+ </svg>"##,
+);
+
+test_compare_render_output!(
+ transform_property,
+ 100,
+ 100,
+ br##"<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100">
+ <rect x="50" y="50" width="20" height="20" fill="black"/>
+</svg>"##,
+ br##"<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100">
+ <rect x="10" y="10" width="20" height="20" fill="black" style="transform: translate(40px, 40px);"/>
+</svg>"##,
+);
+
+test_compare_render_output!(
+ compound_transform_property,
+ 100,
+ 100,
+ br##"<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="-30 -30 60 60">
+ <rect x="0" y="0" width="20" height="20" fill="black" style="transform: translate(-10px, -20px) scale(2) rotate(45deg);"/>
+</svg>"##,
+ br##"<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="-30 -30 60 60">
+ <rect x="0" y="0" width="20" height="20" fill="black" transform="translate(-10 -20) scale(2) rotate(45)"/>
+</svg>"##,
+);
diff --git a/rsvg/tests/src/reference.rs b/rsvg/tests/src/reference.rs
new file mode 100644
index 00000000..37f1a562
--- /dev/null
+++ b/rsvg/tests/src/reference.rs
@@ -0,0 +1,1152 @@
+//! Tests with reference images.
+//!
+//! This is the bulk of librsvg's black-box tests. In principle, each test takes an SVG file, renders
+//! it to a raster image, and compares that image to a reference image stored on disk. If the images
+//! are "too different", the test fails. We allow for minor differences in rendering to account for
+//! antialiasing artifacts, floating-point variations, and such.
+//!
+
+use cairo;
+use rsvg::{
+ surface_utils::shared_surface::{SharedImageSurface, SurfaceType},
+ CairoRenderer, IntrinsicDimensions, Length, Loader,
+};
+
+use crate::reference_utils::{Compare, Evaluate, Reference};
+use crate::utils::{load_svg, render_document, setup_font_map, setup_language, SurfaceSize};
+use crate::{test_compare_render_output, test_svg_reference};
+
+use std::path::{Path, PathBuf};
+
+// The original reference images from the SVG1.1 test suite are at 72 DPI.
+const TEST_SUITE_DPI: f64 = 72.0;
+
+// https://gitlab.gnome.org/GNOME/librsvg/issues/91
+//
+// We were computing some offsets incorrectly if the initial transformation matrix
+// passed to rsvg_handle_render_cairo() was not the identity matrix. So,
+// we create a surface with a "frame" around the destination for the image,
+// and then only consider the pixels inside the frame. This will require us
+// to have a non-identity transformation (i.e. a translation matrix), which
+// will test for this bug.
+//
+// The frame size is meant to be a ridiculous number to simulate an arbitrary
+// offset.
+const FRAME_SIZE: i32 = 47;
+
+fn reference_test(path: &Path) {
+ setup_language();
+ setup_font_map();
+
+ let path_base_name = path.file_stem().unwrap().to_string_lossy().to_owned();
+ if path_base_name.starts_with("ignore") {
+ return;
+ }
+
+ let reference = reference_path(&path);
+
+ let handle = Loader::new()
+ .read_path(&path)
+ .unwrap_or_else(|e| panic!("could not load: {}", e));
+
+ let renderer = CairoRenderer::new(&handle)
+ .test_mode(true)
+ .with_dpi(TEST_SUITE_DPI, TEST_SUITE_DPI);
+ let (width, height) = image_size(renderer.intrinsic_dimensions(), TEST_SUITE_DPI);
+
+ let surface = cairo::ImageSurface::create(
+ cairo::Format::ARgb32,
+ width + 2 * FRAME_SIZE,
+ height + 2 * FRAME_SIZE,
+ )
+ .unwrap();
+
+ {
+ let cr = cairo::Context::new(&surface).expect("Failed to create a cairo context");
+ cr.translate(f64::from(FRAME_SIZE), f64::from(FRAME_SIZE));
+ renderer
+ .render_document(
+ &cr,
+ &cairo::Rectangle::new(0.0, 0.0, f64::from(width), f64::from(height)),
+ )
+ .unwrap();
+ }
+
+ let surface = extract_rectangle(&surface, FRAME_SIZE, FRAME_SIZE, width, height).unwrap();
+
+ let output_surf = SharedImageSurface::wrap(surface, SurfaceType::SRgb).unwrap();
+
+ Reference::from_png(&reference)
+ .compare(&output_surf)
+ .evaluate(&output_surf, &path_base_name);
+}
+
+/// Turns `/foo/bar/baz.svg` into `/foo/bar/baz-ref.png`.
+fn reference_path(path: &Path) -> PathBuf {
+ let basename = path.file_stem().unwrap();
+
+ let mut reference_filename = basename.to_string_lossy().into_owned();
+ reference_filename.push_str("-ref.png");
+
+ path.with_file_name(reference_filename)
+}
+
+fn extract_rectangle(
+ source: &cairo::ImageSurface,
+ x: i32,
+ y: i32,
+ w: i32,
+ h: i32,
+) -> Result<cairo::ImageSurface, cairo::Error> {
+ let dest = cairo::ImageSurface::create(cairo::Format::ARgb32, w, h)?;
+ let cr = cairo::Context::new(&dest).expect("Failed to create a cairo context");
+ cr.set_source_surface(&source, f64::from(-x), f64::from(-y))
+ .unwrap();
+ cr.paint().unwrap();
+ Ok(dest)
+}
+
+/// Computes the (width, height) pixel size at which an SVG should be rendered, based on its intrinsic dimensions.
+///
+/// # Panics:
+///
+/// Will panic if none of the following conditions are met:
+///
+/// * Width and height both exist
+/// * Width and height do not exist, but viewBox exists.
+fn image_size(dim: IntrinsicDimensions, dpi: f64) -> (i32, i32) {
+ let IntrinsicDimensions {
+ width,
+ height,
+ vbox,
+ } = dim;
+
+ use rsvg::LengthUnit::*;
+
+ if !(has_supported_unit(&width) && has_supported_unit(&height)) {
+ panic!("SVG has unsupported unit type in width or height");
+ }
+
+ #[rustfmt::skip]
+ let (width, height) = match (width, height, vbox) {
+ (Length { length: w, unit: Percent },
+ Length { length: h, unit: Percent }, vbox) if w == 1.0 && h == 1.0 => {
+ if let Some(vbox) = vbox {
+ (vbox.width(), vbox.height())
+ } else {
+ panic!("SVG with percentage width/height must have a viewBox");
+ }
+ }
+
+ (Length { length: _, unit: Percent },
+ Length { length: _, unit: Percent }, _) => {
+ panic!("Test suite only supports percentage width/height at 100%");
+ }
+
+ (w, h, _) => {
+ (normalize(&w, dpi), normalize(&h, dpi))
+ }
+ };
+
+ // Keep in sync with c_api.rs
+ let width = checked_i32(width.round());
+ let height = checked_i32(height.round());
+
+ (width, height)
+}
+
+// Keep in sync with c_api.rs
+fn checked_i32(x: f64) -> i32 {
+ cast::i32(x).expect("overflow when converting f64 to i32")
+}
+
+fn has_supported_unit(l: &Length) -> bool {
+ use rsvg::LengthUnit::*;
+
+ match l.unit {
+ Percent | Px | In | Cm | Mm | Pt | Pc => true,
+ _ => false,
+ }
+}
+
+const POINTS_PER_INCH: f64 = 72.0;
+const CM_PER_INCH: f64 = 2.54;
+const MM_PER_INCH: f64 = 25.4;
+const PICA_PER_INCH: f64 = 6.0;
+
+fn normalize(l: &Length, dpi: f64) -> f64 {
+ use rsvg::LengthUnit::*;
+
+ match l.unit {
+ Px => l.length,
+ In => l.length * dpi,
+ Cm => l.length * dpi / CM_PER_INCH,
+ Mm => l.length * dpi / MM_PER_INCH,
+ Pt => l.length * dpi / POINTS_PER_INCH,
+ Pc => l.length * dpi / PICA_PER_INCH,
+ _ => panic!("unsupported length unit"),
+ }
+}
+
+fn reftest(filename: &str) {
+ let mut full_filename = PathBuf::new();
+ full_filename.push("tests/fixtures/reftests");
+ full_filename.push(filename);
+
+ reference_test(&full_filename);
+}
+
+macro_rules! t {
+ ($test_name:ident, $filename:expr) => {
+ #[test]
+ fn $test_name() {
+ reftest($filename);
+ }
+ };
+}
+
+#[rustfmt::skip]
+mod tests {
+ use super::*;
+
+ t!(a_pseudo_class_svg, "a-pseudo-class.svg");
+ t!(bug483_attribute_selectors_svg, "bug483-attribute-selectors.svg");
+ t!(bug525_specificity_svg, "bug525-specificity.svg");
+ t!(css_import_svg, "css-import.svg");
+ t!(css_import_url_svg, "css-import-url.svg");
+ t!(duplicate_id_svg, "duplicate-id.svg");
+ t!(filter_component_transfer_from_reference_page_svg, "filter-component-transfer-from-reference-page.svg");
+ t!(filter_conv_bounds_svg, "filter-conv-bounds.svg");
+ t!(filter_conv_divisor_svg, "filter-conv-divisor.svg");
+ t!(filter_effects_region_svg, "filter-effects-region.svg");
+ t!(filter_image_from_reference_page_svg, "filter-image-from-reference-page.svg");
+ t!(filter_kernel_unit_length_svg, "filter-kernel-unit-length.svg");
+ t!(filter_offset_svg, "filter-offset.svg");
+ t!(font_shorthand_svg, "font-shorthand.svg");
+ t!(gzip_compressed_svg, "gzip-compressed.svg");
+ t!(hexchat_svg, "hexchat.svg");
+ t!(ignore_filter_composite_color_interpolation_filters_svg, "ignore-filter-composite-color-interpolation-filters.svg");
+ t!(include_compressed_svg, "include-compressed.svg");
+ t!(include_fallback_svg, "include-fallback.svg");
+ t!(include_text_svg, "include-text.svg");
+ t!(rtl_tspan_svg, "rtl-tspan.svg");
+ t!(specificity_svg, "specificity.svg");
+ t!(structural_pseudo_classes_svg, "structural-pseudo-classes.svg");
+ t!(style_with_xml_comments_svg, "style-with-xml-comments.svg");
+ t!(system_language_de_svg, "system-language-de.svg");
+ t!(system_language_en_svg, "system-language-en.svg");
+ t!(system_language_other_svg, "system-language-other.svg");
+ t!(text_objectboundingbox_svg, "text-objectBoundingBox.svg");
+ t!(xml_lang_css_inherit_svg, "xml-lang-css-inherit.svg");
+ t!(xml_lang_css_svg, "xml-lang-css.svg");
+ t!(adwaita_ac_adapter_symbolic_svg, "adwaita/ac-adapter-symbolic.svg");
+ t!(adwaita_accessories_calculator_symbolic_svg, "adwaita/accessories-calculator-symbolic.svg");
+ t!(adwaita_accessories_character_map_symbolic_svg, "adwaita/accessories-character-map-symbolic.svg");
+ t!(adwaita_accessories_dictionary_symbolic_svg, "adwaita/accessories-dictionary-symbolic.svg");
+ t!(adwaita_accessories_text_editor_symbolic_svg, "adwaita/accessories-text-editor-symbolic.svg");
+ t!(adwaita_action_unavailable_symbolic_svg, "adwaita/action-unavailable-symbolic.svg");
+ t!(adwaita_address_book_new_symbolic_svg, "adwaita/address-book-new-symbolic.svg");
+ t!(adwaita_airplane_mode_symbolic_svg, "adwaita/airplane-mode-symbolic.svg");
+ t!(adwaita_alarm_symbolic_svg, "adwaita/alarm-symbolic.svg");
+ t!(adwaita_applets_screenshooter_symbolic_svg, "adwaita/applets-screenshooter-symbolic.svg");
+ t!(adwaita_application_certificate_symbolic_svg, "adwaita/application-certificate-symbolic.svg");
+ t!(adwaita_application_exit_symbolic_svg, "adwaita/application-exit-symbolic.svg");
+ t!(adwaita_application_rss_xml_symbolic_svg, "adwaita/application-rss-xml-symbolic.svg");
+ t!(adwaita_applications_engineering_symbolic_svg, "adwaita/applications-engineering-symbolic.svg");
+ t!(adwaita_applications_games_symbolic_svg, "adwaita/applications-games-symbolic.svg");
+ t!(adwaita_applications_graphics_symbolic_svg, "adwaita/applications-graphics-symbolic.svg");
+ t!(adwaita_applications_multimedia_symbolic_svg, "adwaita/applications-multimedia-symbolic.svg");
+ t!(adwaita_applications_science_symbolic_svg, "adwaita/applications-science-symbolic.svg");
+ t!(adwaita_applications_system_symbolic_svg, "adwaita/applications-system-symbolic.svg");
+ t!(adwaita_applications_utilities_symbolic_svg, "adwaita/applications-utilities-symbolic.svg");
+ t!(adwaita_application_x_addon_symbolic_svg, "adwaita/application-x-addon-symbolic.svg");
+ t!(adwaita_application_x_appliance_symbolic_svg, "adwaita/application-x-appliance-symbolic.svg");
+ t!(adwaita_application_x_executable_symbolic_svg, "adwaita/application-x-executable-symbolic.svg");
+ t!(adwaita_application_x_firmware_symbolic_svg, "adwaita/application-x-firmware-symbolic.svg");
+ t!(adwaita_appointment_missed_symbolic_svg, "adwaita/appointment-missed-symbolic.svg");
+ t!(adwaita_appointment_new_symbolic_svg, "adwaita/appointment-new-symbolic.svg");
+ t!(adwaita_appointment_soon_symbolic_svg, "adwaita/appointment-soon-symbolic.svg");
+ t!(adwaita_audio_card_symbolic_svg, "adwaita/audio-card-symbolic.svg");
+ t!(adwaita_audio_headphones_symbolic_svg, "adwaita/audio-headphones-symbolic.svg");
+ t!(adwaita_audio_headset_symbolic_svg, "adwaita/audio-headset-symbolic.svg");
+ t!(adwaita_audio_input_microphone_symbolic_svg, "adwaita/audio-input-microphone-symbolic.svg");
+ t!(adwaita_audio_speakers_symbolic_svg, "adwaita/audio-speakers-symbolic.svg");
+ t!(adwaita_audio_volume_high_symbolic_svg, "adwaita/audio-volume-high-symbolic.svg");
+ t!(adwaita_audio_volume_low_symbolic_svg, "adwaita/audio-volume-low-symbolic.svg");
+ t!(adwaita_audio_volume_medium_symbolic_svg, "adwaita/audio-volume-medium-symbolic.svg");
+ t!(adwaita_audio_volume_muted_symbolic_svg, "adwaita/audio-volume-muted-symbolic.svg");
+ t!(adwaita_audio_volume_overamplified_symbolic_svg, "adwaita/audio-volume-overamplified-symbolic.svg");
+ t!(adwaita_audio_x_generic_symbolic_svg, "adwaita/audio-x-generic-symbolic.svg");
+ t!(adwaita_auth_fingerprint_symbolic_svg, "adwaita/auth-fingerprint-symbolic.svg");
+ t!(adwaita_auth_smartcard_symbolic_svg, "adwaita/auth-smartcard-symbolic.svg");
+ t!(adwaita_avatar_default_symbolic_svg, "adwaita/avatar-default-symbolic.svg");
+ t!(adwaita_battery_caution_charging_symbolic_svg, "adwaita/battery-caution-charging-symbolic.svg");
+ t!(adwaita_battery_caution_symbolic_svg, "adwaita/battery-caution-symbolic.svg");
+ t!(adwaita_battery_empty_charging_symbolic_svg, "adwaita/battery-empty-charging-symbolic.svg");
+ t!(adwaita_battery_empty_symbolic_svg, "adwaita/battery-empty-symbolic.svg");
+ t!(adwaita_battery_full_charged_symbolic_svg, "adwaita/battery-full-charged-symbolic.svg");
+ t!(adwaita_battery_full_charging_symbolic_svg, "adwaita/battery-full-charging-symbolic.svg");
+ t!(adwaita_battery_full_symbolic_svg, "adwaita/battery-full-symbolic.svg");
+ t!(adwaita_battery_good_charging_symbolic_svg, "adwaita/battery-good-charging-symbolic.svg");
+ t!(adwaita_battery_good_symbolic_svg, "adwaita/battery-good-symbolic.svg");
+ t!(adwaita_battery_low_charging_symbolic_svg, "adwaita/battery-low-charging-symbolic.svg");
+ t!(adwaita_battery_low_symbolic_svg, "adwaita/battery-low-symbolic.svg");
+ t!(adwaita_battery_missing_symbolic_svg, "adwaita/battery-missing-symbolic.svg");
+ t!(adwaita_battery_symbolic_svg, "adwaita/battery-symbolic.svg");
+ t!(adwaita_bluetooth_active_symbolic_svg, "adwaita/bluetooth-active-symbolic.svg");
+ t!(adwaita_bluetooth_disabled_symbolic_svg, "adwaita/bluetooth-disabled-symbolic.svg");
+ t!(adwaita_bluetooth_symbolic_svg, "adwaita/bluetooth-symbolic.svg");
+ t!(adwaita_bookmark_new_symbolic_svg, "adwaita/bookmark-new-symbolic.svg");
+ t!(adwaita_call_missed_symbolic_svg, "adwaita/call-missed-symbolic.svg");
+ t!(adwaita_call_start_symbolic_svg, "adwaita/call-start-symbolic.svg");
+ t!(adwaita_call_stop_symbolic_svg, "adwaita/call-stop-symbolic.svg");
+ t!(adwaita_camera_photo_symbolic_svg, "adwaita/camera-photo-symbolic.svg");
+ t!(adwaita_camera_switch_symbolic_svg, "adwaita/camera-switch-symbolic.svg");
+ t!(adwaita_camera_video_symbolic_svg, "adwaita/camera-video-symbolic.svg");
+ t!(adwaita_camera_web_symbolic_svg, "adwaita/camera-web-symbolic.svg");
+ t!(adwaita_changes_allow_symbolic_svg, "adwaita/changes-allow-symbolic.svg");
+ t!(adwaita_changes_prevent_symbolic_svg, "adwaita/changes-prevent-symbolic.svg");
+ t!(adwaita_channel_insecure_symbolic_svg, "adwaita/channel-insecure-symbolic.svg");
+ t!(adwaita_channel_secure_symbolic_svg, "adwaita/channel-secure-symbolic.svg");
+ t!(adwaita_checkbox_checked_symbolic_svg, "adwaita/checkbox-checked-symbolic.svg");
+ t!(adwaita_checkbox_mixed_symbolic_svg, "adwaita/checkbox-mixed-symbolic.svg");
+ t!(adwaita_checkbox_symbolic_svg, "adwaita/checkbox-symbolic.svg");
+ t!(adwaita_colorimeter_colorhug_symbolic_svg, "adwaita/colorimeter-colorhug-symbolic.svg");
+ t!(adwaita_color_select_symbolic_svg, "adwaita/color-select-symbolic.svg");
+ t!(adwaita_computer_apple_ipad_symbolic_svg, "adwaita/computer-apple-ipad-symbolic.svg");
+ t!(adwaita_computer_fail_symbolic_svg, "adwaita/computer-fail-symbolic.svg");
+ t!(adwaita_computer_symbolic_svg, "adwaita/computer-symbolic.svg");
+ t!(adwaita_contact_new_symbolic_svg, "adwaita/contact-new-symbolic.svg");
+ t!(adwaita_content_loading_symbolic_svg, "adwaita/content-loading-symbolic.svg");
+ t!(adwaita_daytime_sunrise_symbolic_svg, "adwaita/daytime-sunrise-symbolic.svg");
+ t!(adwaita_daytime_sunset_symbolic_svg, "adwaita/daytime-sunset-symbolic.svg");
+ t!(adwaita_dialog_error_symbolic_svg, "adwaita/dialog-error-symbolic.svg");
+ t!(adwaita_dialog_information_symbolic_svg, "adwaita/dialog-information-symbolic.svg");
+ t!(adwaita_dialog_password_symbolic_svg, "adwaita/dialog-password-symbolic.svg");
+ t!(adwaita_dialog_question_symbolic_svg, "adwaita/dialog-question-symbolic.svg");
+ t!(adwaita_dialog_warning_symbolic_svg, "adwaita/dialog-warning-symbolic.svg");
+ t!(adwaita_display_brightness_symbolic_svg, "adwaita/display-brightness-symbolic.svg");
+ t!(adwaita_display_projector_symbolic_svg, "adwaita/display-projector-symbolic.svg");
+ t!(adwaita_document_edit_symbolic_svg, "adwaita/document-edit-symbolic.svg");
+ t!(adwaita_document_new_symbolic_svg, "adwaita/document-new-symbolic.svg");
+ t!(adwaita_document_open_recent_symbolic_svg, "adwaita/document-open-recent-symbolic.svg");
+ t!(adwaita_document_open_symbolic_svg, "adwaita/document-open-symbolic.svg");
+ t!(adwaita_document_page_setup_symbolic_svg, "adwaita/document-page-setup-symbolic.svg");
+ t!(adwaita_document_print_preview_symbolic_svg, "adwaita/document-print-preview-symbolic.svg");
+ t!(adwaita_document_print_symbolic_svg, "adwaita/document-print-symbolic.svg");
+ t!(adwaita_document_properties_symbolic_svg, "adwaita/document-properties-symbolic.svg");
+ t!(adwaita_document_revert_symbolic_rtl_svg, "adwaita/document-revert-symbolic-rtl.svg");
+ t!(adwaita_document_revert_symbolic_svg, "adwaita/document-revert-symbolic.svg");
+ t!(adwaita_document_save_as_symbolic_svg, "adwaita/document-save-as-symbolic.svg");
+ t!(adwaita_document_save_symbolic_svg, "adwaita/document-save-symbolic.svg");
+ t!(adwaita_document_send_symbolic_svg, "adwaita/document-send-symbolic.svg");
+ t!(adwaita_drive_harddisk_ieee1394_symbolic_svg, "adwaita/drive-harddisk-ieee1394-symbolic.svg");
+ t!(adwaita_drive_harddisk_solidstate_symbolic_svg, "adwaita/drive-harddisk-solidstate-symbolic.svg");
+ t!(adwaita_drive_harddisk_symbolic_svg, "adwaita/drive-harddisk-symbolic.svg");
+ t!(adwaita_drive_harddisk_system_symbolic_svg, "adwaita/drive-harddisk-system-symbolic.svg");
+ t!(adwaita_drive_harddisk_usb_symbolic_svg, "adwaita/drive-harddisk-usb-symbolic.svg");
+ t!(adwaita_drive_multidisk_symbolic_svg, "adwaita/drive-multidisk-symbolic.svg");
+ t!(adwaita_drive_optical_symbolic_svg, "adwaita/drive-optical-symbolic.svg");
+ t!(adwaita_drive_removable_media_symbolic_svg, "adwaita/drive-removable-media-symbolic.svg");
+ t!(adwaita_edit_clear_all_symbolic_svg, "adwaita/edit-clear-all-symbolic.svg");
+ t!(adwaita_edit_clear_symbolic_rtl_svg, "adwaita/edit-clear-symbolic-rtl.svg");
+ t!(adwaita_edit_clear_symbolic_svg, "adwaita/edit-clear-symbolic.svg");
+ t!(adwaita_edit_copy_symbolic_svg, "adwaita/edit-copy-symbolic.svg");
+ t!(adwaita_edit_cut_symbolic_svg, "adwaita/edit-cut-symbolic.svg");
+ t!(adwaita_edit_delete_symbolic_svg, "adwaita/edit-delete-symbolic.svg");
+ t!(adwaita_edit_find_replace_symbolic_svg, "adwaita/edit-find-replace-symbolic.svg");
+ t!(adwaita_edit_find_symbolic_svg, "adwaita/edit-find-symbolic.svg");
+ t!(adwaita_edit_paste_symbolic_svg, "adwaita/edit-paste-symbolic.svg");
+ t!(adwaita_edit_redo_symbolic_rtl_svg, "adwaita/edit-redo-symbolic-rtl.svg");
+ t!(adwaita_edit_redo_symbolic_svg, "adwaita/edit-redo-symbolic.svg");
+ t!(adwaita_edit_select_all_symbolic_svg, "adwaita/edit-select-all-symbolic.svg");
+ t!(adwaita_edit_select_symbolic_svg, "adwaita/edit-select-symbolic.svg");
+ t!(adwaita_edit_undo_symbolic_rtl_svg, "adwaita/edit-undo-symbolic-rtl.svg");
+ t!(adwaita_edit_undo_symbolic_svg, "adwaita/edit-undo-symbolic.svg");
+ t!(adwaita_emblem_default_symbolic_svg, "adwaita/emblem-default-symbolic.svg");
+ t!(adwaita_emblem_documents_symbolic_svg, "adwaita/emblem-documents-symbolic.svg");
+ t!(adwaita_emblem_favorite_symbolic_svg, "adwaita/emblem-favorite-symbolic.svg");
+ t!(adwaita_emblem_important_symbolic_svg, "adwaita/emblem-important-symbolic.svg");
+ t!(adwaita_emblem_music_symbolic_svg, "adwaita/emblem-music-symbolic.svg");
+ t!(adwaita_emblem_ok_symbolic_svg, "adwaita/emblem-ok-symbolic.svg");
+ t!(adwaita_emblem_photos_symbolic_svg, "adwaita/emblem-photos-symbolic.svg");
+ t!(adwaita_emblem_shared_symbolic_svg, "adwaita/emblem-shared-symbolic.svg");
+ t!(adwaita_emblem_synchronizing_symbolic_svg, "adwaita/emblem-synchronizing-symbolic.svg");
+ t!(adwaita_emblem_system_symbolic_svg, "adwaita/emblem-system-symbolic.svg");
+ t!(adwaita_emblem_videos_symbolic_svg, "adwaita/emblem-videos-symbolic.svg");
+ t!(adwaita_emoji_activities_symbolic_svg, "adwaita/emoji-activities-symbolic.svg");
+ t!(adwaita_emoji_body_symbolic_svg, "adwaita/emoji-body-symbolic.svg");
+ t!(adwaita_emoji_flags_symbolic_svg, "adwaita/emoji-flags-symbolic.svg");
+ t!(adwaita_emoji_food_symbolic_svg, "adwaita/emoji-food-symbolic.svg");
+ t!(adwaita_emoji_nature_symbolic_svg, "adwaita/emoji-nature-symbolic.svg");
+ t!(adwaita_emoji_objects_symbolic_svg, "adwaita/emoji-objects-symbolic.svg");
+ t!(adwaita_emoji_people_symbolic_svg, "adwaita/emoji-people-symbolic.svg");
+ t!(adwaita_emoji_recent_symbolic_svg, "adwaita/emoji-recent-symbolic.svg");
+ t!(adwaita_emoji_symbols_symbolic_svg, "adwaita/emoji-symbols-symbolic.svg");
+ t!(adwaita_emoji_travel_symbolic_svg, "adwaita/emoji-travel-symbolic.svg");
+ t!(adwaita_emote_love_symbolic_svg, "adwaita/emote-love-symbolic.svg");
+ t!(adwaita_error_correct_symbolic_svg, "adwaita/error-correct-symbolic.svg");
+ t!(adwaita_face_angel_symbolic_svg, "adwaita/face-angel-symbolic.svg");
+ t!(adwaita_face_angry_symbolic_svg, "adwaita/face-angry-symbolic.svg");
+ t!(adwaita_face_confused_symbolic_svg, "adwaita/face-confused-symbolic.svg");
+ t!(adwaita_face_cool_symbolic_svg, "adwaita/face-cool-symbolic.svg");
+ t!(adwaita_face_crying_symbolic_svg, "adwaita/face-crying-symbolic.svg");
+ t!(adwaita_face_devilish_symbolic_svg, "adwaita/face-devilish-symbolic.svg");
+ t!(adwaita_face_embarrassed_symbolic_svg, "adwaita/face-embarrassed-symbolic.svg");
+ t!(adwaita_face_glasses_symbolic_svg, "adwaita/face-glasses-symbolic.svg");
+ t!(adwaita_face_kiss_symbolic_svg, "adwaita/face-kiss-symbolic.svg");
+ t!(adwaita_face_laugh_symbolic_svg, "adwaita/face-laugh-symbolic.svg");
+ t!(adwaita_face_monkey_symbolic_svg, "adwaita/face-monkey-symbolic.svg");
+ t!(adwaita_face_plain_symbolic_svg, "adwaita/face-plain-symbolic.svg");
+ t!(adwaita_face_raspberry_symbolic_svg, "adwaita/face-raspberry-symbolic.svg");
+ t!(adwaita_face_sad_symbolic_svg, "adwaita/face-sad-symbolic.svg");
+ t!(adwaita_face_shutmouth_symbolic_svg, "adwaita/face-shutmouth-symbolic.svg");
+ t!(adwaita_face_sick_symbolic_svg, "adwaita/face-sick-symbolic.svg");
+ t!(adwaita_face_smile_big_symbolic_svg, "adwaita/face-smile-big-symbolic.svg");
+ t!(adwaita_face_smile_symbolic_svg, "adwaita/face-smile-symbolic.svg");
+ t!(adwaita_face_smirk_symbolic_svg, "adwaita/face-smirk-symbolic.svg");
+ t!(adwaita_face_surprise_symbolic_svg, "adwaita/face-surprise-symbolic.svg");
+ t!(adwaita_face_tired_symbolic_svg, "adwaita/face-tired-symbolic.svg");
+ t!(adwaita_face_uncertain_symbolic_svg, "adwaita/face-uncertain-symbolic.svg");
+ t!(adwaita_face_wink_symbolic_svg, "adwaita/face-wink-symbolic.svg");
+ t!(adwaita_face_worried_symbolic_svg, "adwaita/face-worried-symbolic.svg");
+ t!(adwaita_face_yawn_symbolic_svg, "adwaita/face-yawn-symbolic.svg");
+ t!(adwaita_find_location_symbolic_svg, "adwaita/find-location-symbolic.svg");
+ t!(adwaita_focus_legacy_systray_symbolic_svg, "adwaita/focus-legacy-systray-symbolic.svg");
+ t!(adwaita_focus_top_bar_symbolic_svg, "adwaita/focus-top-bar-symbolic.svg");
+ t!(adwaita_focus_windows_symbolic_svg, "adwaita/focus-windows-symbolic.svg");
+ t!(adwaita_folder_documents_symbolic_svg, "adwaita/folder-documents-symbolic.svg");
+ t!(adwaita_folder_download_symbolic_svg, "adwaita/folder-download-symbolic.svg");
+ t!(adwaita_folder_drag_accept_symbolic_svg, "adwaita/folder-drag-accept-symbolic.svg");
+ t!(adwaita_folder_music_symbolic_svg, "adwaita/folder-music-symbolic.svg");
+ t!(adwaita_folder_new_symbolic_svg, "adwaita/folder-new-symbolic.svg");
+ t!(adwaita_folder_open_symbolic_svg, "adwaita/folder-open-symbolic.svg");
+ t!(adwaita_folder_pictures_symbolic_svg, "adwaita/folder-pictures-symbolic.svg");
+ t!(adwaita_folder_publicshare_symbolic_svg, "adwaita/folder-publicshare-symbolic.svg");
+ t!(adwaita_folder_remote_symbolic_svg, "adwaita/folder-remote-symbolic.svg");
+ t!(adwaita_folder_saved_search_symbolic_svg, "adwaita/folder-saved-search-symbolic.svg");
+ t!(adwaita_folder_symbolic_svg, "adwaita/folder-symbolic.svg");
+ t!(adwaita_folder_templates_symbolic_svg, "adwaita/folder-templates-symbolic.svg");
+ t!(adwaita_folder_videos_symbolic_svg, "adwaita/folder-videos-symbolic.svg");
+ t!(adwaita_folder_visiting_symbolic_svg, "adwaita/folder-visiting-symbolic.svg");
+ t!(adwaita_font_select_symbolic_svg, "adwaita/font-select-symbolic.svg");
+ t!(adwaita_font_x_generic_symbolic_svg, "adwaita/font-x-generic-symbolic.svg");
+ t!(adwaita_format_indent_less_symbolic_rtl_svg, "adwaita/format-indent-less-symbolic-rtl.svg");
+ t!(adwaita_format_indent_less_symbolic_svg, "adwaita/format-indent-less-symbolic.svg");
+ t!(adwaita_format_indent_more_symbolic_rtl_svg, "adwaita/format-indent-more-symbolic-rtl.svg");
+ t!(adwaita_format_indent_more_symbolic_svg, "adwaita/format-indent-more-symbolic.svg");
+ t!(adwaita_format_justify_center_symbolic_svg, "adwaita/format-justify-center-symbolic.svg");
+ t!(adwaita_format_justify_fill_symbolic_svg, "adwaita/format-justify-fill-symbolic.svg");
+ t!(adwaita_format_justify_left_symbolic_svg, "adwaita/format-justify-left-symbolic.svg");
+ t!(adwaita_format_justify_right_symbolic_svg, "adwaita/format-justify-right-symbolic.svg");
+ t!(adwaita_format_text_bold_symbolic_svg, "adwaita/format-text-bold-symbolic.svg");
+ t!(adwaita_format_text_direction_symbolic_rtl_svg, "adwaita/format-text-direction-symbolic-rtl.svg");
+ t!(adwaita_format_text_direction_symbolic_svg, "adwaita/format-text-direction-symbolic.svg");
+ t!(adwaita_format_text_italic_symbolic_svg, "adwaita/format-text-italic-symbolic.svg");
+ t!(adwaita_format_text_strikethrough_symbolic_svg, "adwaita/format-text-strikethrough-symbolic.svg");
+ t!(adwaita_format_text_underline_symbolic_svg, "adwaita/format-text-underline-symbolic.svg");
+ t!(adwaita_gnome_power_manager_symbolic_svg, "adwaita/gnome-power-manager-symbolic.svg");
+ t!(adwaita_goa_panel_symbolic_svg, "adwaita/goa-panel-symbolic.svg");
+ t!(adwaita_go_bottom_symbolic_svg, "adwaita/go-bottom-symbolic.svg");
+ t!(adwaita_go_down_symbolic_svg, "adwaita/go-down-symbolic.svg");
+ t!(adwaita_go_first_symbolic_rtl_svg, "adwaita/go-first-symbolic-rtl.svg");
+ t!(adwaita_go_first_symbolic_svg, "adwaita/go-first-symbolic.svg");
+ t!(adwaita_go_home_symbolic_svg, "adwaita/go-home-symbolic.svg");
+ t!(adwaita_go_jump_symbolic_svg, "adwaita/go-jump-symbolic.svg");
+ t!(adwaita_go_last_symbolic_rtl_svg, "adwaita/go-last-symbolic-rtl.svg");
+ t!(adwaita_go_last_symbolic_svg, "adwaita/go-last-symbolic.svg");
+ t!(adwaita_go_next_symbolic_rtl_svg, "adwaita/go-next-symbolic-rtl.svg");
+ t!(adwaita_go_next_symbolic_svg, "adwaita/go-next-symbolic.svg");
+ t!(adwaita_go_previous_symbolic_rtl_svg, "adwaita/go-previous-symbolic-rtl.svg");
+ t!(adwaita_go_previous_symbolic_svg, "adwaita/go-previous-symbolic.svg");
+ t!(adwaita_go_top_symbolic_svg, "adwaita/go-top-symbolic.svg");
+ t!(adwaita_go_up_symbolic_svg, "adwaita/go-up-symbolic.svg");
+ t!(adwaita_help_about_symbolic_svg, "adwaita/help-about-symbolic.svg");
+ t!(adwaita_help_browser_symbolic_svg, "adwaita/help-browser-symbolic.svg");
+ t!(adwaita_help_contents_symbolic_svg, "adwaita/help-contents-symbolic.svg");
+ t!(adwaita_help_faq_symbolic_svg, "adwaita/help-faq-symbolic.svg");
+ t!(adwaita_image_loading_symbolic_svg, "adwaita/image-loading-symbolic.svg");
+ t!(adwaita_image_x_generic_symbolic_svg, "adwaita/image-x-generic-symbolic.svg");
+ t!(adwaita_inode_directory_symbolic_svg, "adwaita/inode-directory-symbolic.svg");
+ t!(adwaita_input_dialpad_symbolic_svg, "adwaita/input-dialpad-symbolic.svg");
+ t!(adwaita_input_gaming_symbolic_svg, "adwaita/input-gaming-symbolic.svg");
+ t!(adwaita_input_keyboard_symbolic_svg, "adwaita/input-keyboard-symbolic.svg");
+ t!(adwaita_input_mouse_symbolic_svg, "adwaita/input-mouse-symbolic.svg");
+ t!(adwaita_input_tablet_symbolic_svg, "adwaita/input-tablet-symbolic.svg");
+ t!(adwaita_input_touchpad_symbolic_svg, "adwaita/input-touchpad-symbolic.svg");
+ t!(adwaita_insert_image_symbolic_svg, "adwaita/insert-image-symbolic.svg");
+ t!(adwaita_insert_link_symbolic_svg, "adwaita/insert-link-symbolic.svg");
+ t!(adwaita_insert_object_symbolic_svg, "adwaita/insert-object-symbolic.svg");
+ t!(adwaita_insert_text_symbolic_svg, "adwaita/insert-text-symbolic.svg");
+ t!(adwaita_keyboard_brightness_symbolic_svg, "adwaita/keyboard-brightness-symbolic.svg");
+ t!(adwaita_list_add_symbolic_svg, "adwaita/list-add-symbolic.svg");
+ t!(adwaita_list_remove_all_symbolic_svg, "adwaita/list-remove-all-symbolic.svg");
+ t!(adwaita_list_remove_symbolic_svg, "adwaita/list-remove-symbolic.svg");
+ t!(adwaita_mail_attachment_symbolic_svg, "adwaita/mail-attachment-symbolic.svg");
+ t!(adwaita_mail_mark_important_symbolic_svg, "adwaita/mail-mark-important-symbolic.svg");
+ t!(adwaita_mail_read_symbolic_svg, "adwaita/mail-read-symbolic.svg");
+ t!(adwaita_mail_replied_symbolic_svg, "adwaita/mail-replied-symbolic.svg");
+ t!(adwaita_mail_send_receive_symbolic_svg, "adwaita/mail-send-receive-symbolic.svg");
+ t!(adwaita_mail_send_symbolic_svg, "adwaita/mail-send-symbolic.svg");
+ t!(adwaita_mail_unread_symbolic_svg, "adwaita/mail-unread-symbolic.svg");
+ t!(adwaita_mark_location_symbolic_svg, "adwaita/mark-location-symbolic.svg");
+ t!(adwaita_media_eject_symbolic_svg, "adwaita/media-eject-symbolic.svg");
+ t!(adwaita_media_flash_symbolic_svg, "adwaita/media-flash-symbolic.svg");
+ t!(adwaita_media_floppy_symbolic_svg, "adwaita/media-floppy-symbolic.svg");
+ t!(adwaita_media_optical_bd_symbolic_svg, "adwaita/media-optical-bd-symbolic.svg");
+ t!(adwaita_media_optical_cd_audio_symbolic_svg, "adwaita/media-optical-cd-audio-symbolic.svg");
+ t!(adwaita_media_optical_dvd_symbolic_svg, "adwaita/media-optical-dvd-symbolic.svg");
+ t!(adwaita_media_optical_symbolic_svg, "adwaita/media-optical-symbolic.svg");
+ t!(adwaita_media_playback_pause_symbolic_svg, "adwaita/media-playback-pause-symbolic.svg");
+ t!(adwaita_media_playback_start_symbolic_rtl_svg, "adwaita/media-playback-start-symbolic-rtl.svg");
+ t!(adwaita_media_playback_start_symbolic_svg, "adwaita/media-playback-start-symbolic.svg");
+ t!(adwaita_media_playback_stop_symbolic_svg, "adwaita/media-playback-stop-symbolic.svg");
+ t!(adwaita_media_playlist_consecutive_symbolic_rtl_svg, "adwaita/media-playlist-consecutive-symbolic-rtl.svg");
+ t!(adwaita_media_playlist_consecutive_symbolic_svg, "adwaita/media-playlist-consecutive-symbolic.svg");
+ t!(adwaita_media_playlist_repeat_song_symbolic_rtl_svg, "adwaita/media-playlist-repeat-song-symbolic-rtl.svg");
+ t!(adwaita_media_playlist_repeat_song_symbolic_svg, "adwaita/media-playlist-repeat-song-symbolic.svg");
+ t!(adwaita_media_playlist_repeat_symbolic_rtl_svg, "adwaita/media-playlist-repeat-symbolic-rtl.svg");
+ t!(adwaita_media_playlist_repeat_symbolic_svg, "adwaita/media-playlist-repeat-symbolic.svg");
+ t!(adwaita_media_playlist_shuffle_symbolic_rtl_svg, "adwaita/media-playlist-shuffle-symbolic-rtl.svg");
+ t!(adwaita_media_playlist_shuffle_symbolic_svg, "adwaita/media-playlist-shuffle-symbolic.svg");
+ t!(adwaita_media_record_symbolic_svg, "adwaita/media-record-symbolic.svg");
+ t!(adwaita_media_removable_symbolic_svg, "adwaita/media-removable-symbolic.svg");
+ t!(adwaita_media_seek_backward_symbolic_rtl_svg, "adwaita/media-seek-backward-symbolic-rtl.svg");
+ t!(adwaita_media_seek_backward_symbolic_svg, "adwaita/media-seek-backward-symbolic.svg");
+ t!(adwaita_media_seek_forward_symbolic_rtl_svg, "adwaita/media-seek-forward-symbolic-rtl.svg");
+ t!(adwaita_media_seek_forward_symbolic_svg, "adwaita/media-seek-forward-symbolic.svg");
+ t!(adwaita_media_skip_backward_symbolic_rtl_svg, "adwaita/media-skip-backward-symbolic-rtl.svg");
+ t!(adwaita_media_skip_backward_symbolic_svg, "adwaita/media-skip-backward-symbolic.svg");
+ t!(adwaita_media_skip_forward_symbolic_rtl_svg, "adwaita/media-skip-forward-symbolic-rtl.svg");
+ t!(adwaita_media_skip_forward_symbolic_svg, "adwaita/media-skip-forward-symbolic.svg");
+ t!(adwaita_media_tape_symbolic_svg, "adwaita/media-tape-symbolic.svg");
+ t!(adwaita_media_view_subtitles_symbolic_svg, "adwaita/media-view-subtitles-symbolic.svg");
+ t!(adwaita_media_zip_symbolic_svg, "adwaita/media-zip-symbolic.svg");
+ t!(adwaita_microphone_sensitivity_high_symbolic_svg, "adwaita/microphone-sensitivity-high-symbolic.svg");
+ t!(adwaita_microphone_sensitivity_low_symbolic_svg, "adwaita/microphone-sensitivity-low-symbolic.svg");
+ t!(adwaita_microphone_sensitivity_medium_symbolic_svg, "adwaita/microphone-sensitivity-medium-symbolic.svg");
+ t!(adwaita_microphone_sensitivity_muted_symbolic_svg, "adwaita/microphone-sensitivity-muted-symbolic.svg");
+ t!(adwaita_modem_symbolic_svg, "adwaita/modem-symbolic.svg");
+ t!(adwaita_multimedia_player_apple_ipod_touch_symbolic_svg, "adwaita/multimedia-player-apple-ipod-touch-symbolic.svg");
+ t!(adwaita_multimedia_player_symbolic_svg, "adwaita/multimedia-player-symbolic.svg");
+ t!(adwaita_multimedia_volume_control_symbolic_svg, "adwaita/multimedia-volume-control-symbolic.svg");
+ t!(adwaita_network_cellular_3g_symbolic_svg, "adwaita/network-cellular-3g-symbolic.svg");
+ t!(adwaita_network_cellular_4g_symbolic_svg, "adwaita/network-cellular-4g-symbolic.svg");
+ t!(adwaita_network_cellular_acquiring_symbolic_svg, "adwaita/network-cellular-acquiring-symbolic.svg");
+ t!(adwaita_network_cellular_connected_symbolic_svg, "adwaita/network-cellular-connected-symbolic.svg");
+ t!(adwaita_network_cellular_edge_symbolic_svg, "adwaita/network-cellular-edge-symbolic.svg");
+ t!(adwaita_network_cellular_gprs_symbolic_svg, "adwaita/network-cellular-gprs-symbolic.svg");
+ t!(adwaita_network_cellular_hspa_symbolic_svg, "adwaita/network-cellular-hspa-symbolic.svg");
+ t!(adwaita_network_cellular_no_route_symbolic_svg, "adwaita/network-cellular-no-route-symbolic.svg");
+ t!(adwaita_network_cellular_offline_symbolic_svg, "adwaita/network-cellular-offline-symbolic.svg");
+ t!(adwaita_network_cellular_signal_excellent_symbolic_svg, "adwaita/network-cellular-signal-excellent-symbolic.svg");
+ t!(adwaita_network_cellular_signal_good_symbolic_svg, "adwaita/network-cellular-signal-good-symbolic.svg");
+ t!(adwaita_network_cellular_signal_none_symbolic_svg, "adwaita/network-cellular-signal-none-symbolic.svg");
+ t!(adwaita_network_cellular_signal_ok_symbolic_svg, "adwaita/network-cellular-signal-ok-symbolic.svg");
+ t!(adwaita_network_cellular_signal_weak_symbolic_svg, "adwaita/network-cellular-signal-weak-symbolic.svg");
+ t!(adwaita_network_error_symbolic_svg, "adwaita/network-error-symbolic.svg");
+ t!(adwaita_network_idle_symbolic_svg, "adwaita/network-idle-symbolic.svg");
+ t!(adwaita_network_no_route_symbolic_svg, "adwaita/network-no-route-symbolic.svg");
+ t!(adwaita_network_offline_symbolic_svg, "adwaita/network-offline-symbolic.svg");
+ t!(adwaita_network_receive_symbolic_svg, "adwaita/network-receive-symbolic.svg");
+ t!(adwaita_network_server_symbolic_svg, "adwaita/network-server-symbolic.svg");
+ t!(adwaita_network_transmit_receive_symbolic_svg, "adwaita/network-transmit-receive-symbolic.svg");
+ t!(adwaita_network_transmit_symbolic_svg, "adwaita/network-transmit-symbolic.svg");
+ t!(adwaita_network_vpn_acquiring_symbolic_svg, "adwaita/network-vpn-acquiring-symbolic.svg");
+ t!(adwaita_network_vpn_no_route_symbolic_svg, "adwaita/network-vpn-no-route-symbolic.svg");
+ t!(adwaita_network_vpn_symbolic_svg, "adwaita/network-vpn-symbolic.svg");
+ t!(adwaita_network_wired_acquiring_symbolic_svg, "adwaita/network-wired-acquiring-symbolic.svg");
+ t!(adwaita_network_wired_disconnected_symbolic_svg, "adwaita/network-wired-disconnected-symbolic.svg");
+ t!(adwaita_network_wired_no_route_symbolic_svg, "adwaita/network-wired-no-route-symbolic.svg");
+ t!(adwaita_network_wired_offline_symbolic_svg, "adwaita/network-wired-offline-symbolic.svg");
+ t!(adwaita_network_wired_symbolic_svg, "adwaita/network-wired-symbolic.svg");
+ t!(adwaita_network_wireless_acquiring_symbolic_svg, "adwaita/network-wireless-acquiring-symbolic.svg");
+ t!(adwaita_network_wireless_connected_symbolic_svg, "adwaita/network-wireless-connected-symbolic.svg");
+ t!(adwaita_network_wireless_encrypted_symbolic_svg, "adwaita/network-wireless-encrypted-symbolic.svg");
+ t!(adwaita_network_wireless_hotspot_symbolic_svg, "adwaita/network-wireless-hotspot-symbolic.svg");
+ t!(adwaita_network_wireless_no_route_symbolic_svg, "adwaita/network-wireless-no-route-symbolic.svg");
+ t!(adwaita_network_wireless_offline_symbolic_svg, "adwaita/network-wireless-offline-symbolic.svg");
+ t!(adwaita_network_wireless_signal_excellent_symbolic_svg, "adwaita/network-wireless-signal-excellent-symbolic.svg");
+ t!(adwaita_network_wireless_signal_good_symbolic_svg, "adwaita/network-wireless-signal-good-symbolic.svg");
+ t!(adwaita_network_wireless_signal_none_symbolic_svg, "adwaita/network-wireless-signal-none-symbolic.svg");
+ t!(adwaita_network_wireless_signal_ok_symbolic_svg, "adwaita/network-wireless-signal-ok-symbolic.svg");
+ t!(adwaita_network_wireless_signal_weak_symbolic_svg, "adwaita/network-wireless-signal-weak-symbolic.svg");
+ t!(adwaita_network_wireless_symbolic_svg, "adwaita/network-wireless-symbolic.svg");
+ t!(adwaita_network_workgroup_symbolic_svg, "adwaita/network-workgroup-symbolic.svg");
+ t!(adwaita_night_light_symbolic_svg, "adwaita/night-light-symbolic.svg");
+ t!(adwaita_non_starred_symbolic_svg, "adwaita/non-starred-symbolic.svg");
+ t!(adwaita_object_flip_horizontal_symbolic_svg, "adwaita/object-flip-horizontal-symbolic.svg");
+ t!(adwaita_object_flip_vertical_symbolic_svg, "adwaita/object-flip-vertical-symbolic.svg");
+ t!(adwaita_object_rotate_left_symbolic_svg, "adwaita/object-rotate-left-symbolic.svg");
+ t!(adwaita_object_rotate_right_symbolic_svg, "adwaita/object-rotate-right-symbolic.svg");
+ t!(adwaita_object_select_symbolic_svg, "adwaita/object-select-symbolic.svg");
+ t!(adwaita_open_menu_symbolic_svg, "adwaita/open-menu-symbolic.svg");
+ t!(adwaita_orientation_landscape_inverse_symbolic_svg, "adwaita/orientation-landscape-inverse-symbolic.svg");
+ t!(adwaita_orientation_landscape_symbolic_svg, "adwaita/orientation-landscape-symbolic.svg");
+ t!(adwaita_orientation_portrait_inverse_symbolic_svg, "adwaita/orientation-portrait-inverse-symbolic.svg");
+ t!(adwaita_orientation_portrait_symbolic_svg, "adwaita/orientation-portrait-symbolic.svg");
+ t!(adwaita_package_x_generic_symbolic_svg, "adwaita/package-x-generic-symbolic.svg");
+ t!(adwaita_pan_down_symbolic_svg, "adwaita/pan-down-symbolic.svg");
+ t!(adwaita_pan_end_symbolic_rtl_svg, "adwaita/pan-end-symbolic-rtl.svg");
+ t!(adwaita_pan_end_symbolic_svg, "adwaita/pan-end-symbolic.svg");
+ t!(adwaita_pan_start_symbolic_rtl_svg, "adwaita/pan-start-symbolic-rtl.svg");
+ t!(adwaita_pan_start_symbolic_svg, "adwaita/pan-start-symbolic.svg");
+ t!(adwaita_pan_up_symbolic_svg, "adwaita/pan-up-symbolic.svg");
+ t!(adwaita_pda_symbolic_svg, "adwaita/pda-symbolic.svg");
+ t!(adwaita_phone_apple_iphone_symbolic_svg, "adwaita/phone-apple-iphone-symbolic.svg");
+ t!(adwaita_phone_symbolic_svg, "adwaita/phone-symbolic.svg");
+ t!(adwaita_preferences_color_symbolic_svg, "adwaita/preferences-color-symbolic.svg");
+ t!(adwaita_preferences_desktop_accessibility_symbolic_svg, "adwaita/preferences-desktop-accessibility-symbolic.svg");
+ t!(adwaita_preferences_desktop_display_symbolic_svg, "adwaita/preferences-desktop-display-symbolic.svg");
+ t!(adwaita_preferences_desktop_font_symbolic_svg, "adwaita/preferences-desktop-font-symbolic.svg");
+ t!(adwaita_preferences_desktop_keyboard_shortcuts_symbolic_svg, "adwaita/preferences-desktop-keyboard-shortcuts-symbolic.svg");
+ t!(adwaita_preferences_desktop_keyboard_symbolic_svg, "adwaita/preferences-desktop-keyboard-symbolic.svg");
+ t!(adwaita_preferences_desktop_locale_symbolic_svg, "adwaita/preferences-desktop-locale-symbolic.svg");
+ t!(adwaita_preferences_desktop_remote_desktop_symbolic_svg, "adwaita/preferences-desktop-remote-desktop-symbolic.svg");
+ t!(adwaita_preferences_desktop_screensaver_symbolic_svg, "adwaita/preferences-desktop-screensaver-symbolic.svg");
+ t!(adwaita_preferences_desktop_wallpaper_symbolic_svg, "adwaita/preferences-desktop-wallpaper-symbolic.svg");
+ t!(adwaita_preferences_other_symbolic_svg, "adwaita/preferences-other-symbolic.svg");
+ t!(adwaita_preferences_system_details_symbolic_svg, "adwaita/preferences-system-details-symbolic.svg");
+ t!(adwaita_preferences_system_devices_symbolic_svg, "adwaita/preferences-system-devices-symbolic.svg");
+ t!(adwaita_preferences_system_network_proxy_symbolic_svg, "adwaita/preferences-system-network-proxy-symbolic.svg");
+ t!(adwaita_preferences_system_network_symbolic_svg, "adwaita/preferences-system-network-symbolic.svg");
+ t!(adwaita_preferences_system_notifications_symbolic_svg, "adwaita/preferences-system-notifications-symbolic.svg");
+ t!(adwaita_preferences_system_privacy_symbolic_svg, "adwaita/preferences-system-privacy-symbolic.svg");
+ t!(adwaita_preferences_system_search_symbolic_svg, "adwaita/preferences-system-search-symbolic.svg");
+ t!(adwaita_preferences_system_sharing_symbolic_svg, "adwaita/preferences-system-sharing-symbolic.svg");
+ t!(adwaita_preferences_system_symbolic_svg, "adwaita/preferences-system-symbolic.svg");
+ t!(adwaita_preferences_system_time_symbolic_svg, "adwaita/preferences-system-time-symbolic.svg");
+ t!(adwaita_printer_error_symbolic_svg, "adwaita/printer-error-symbolic.svg");
+ t!(adwaita_printer_network_symbolic_svg, "adwaita/printer-network-symbolic.svg");
+ t!(adwaita_printer_printing_symbolic_svg, "adwaita/printer-printing-symbolic.svg");
+ t!(adwaita_printer_symbolic_svg, "adwaita/printer-symbolic.svg");
+ t!(adwaita_printer_warning_symbolic_svg, "adwaita/printer-warning-symbolic.svg");
+ t!(adwaita_process_stop_symbolic_svg, "adwaita/process-stop-symbolic.svg");
+ t!(adwaita_radio_checked_symbolic_svg, "adwaita/radio-checked-symbolic.svg");
+ t!(adwaita_radio_mixed_symbolic_svg, "adwaita/radio-mixed-symbolic.svg");
+ t!(adwaita_radio_symbolic_svg, "adwaita/radio-symbolic.svg");
+ t!(adwaita_rotation_allowed_symbolic_svg, "adwaita/rotation-allowed-symbolic.svg");
+ t!(adwaita_rotation_locked_symbolic_svg, "adwaita/rotation-locked-symbolic.svg");
+ t!(adwaita_scanner_symbolic_svg, "adwaita/scanner-symbolic.svg");
+ t!(adwaita_security_high_symbolic_svg, "adwaita/security-high-symbolic.svg");
+ t!(adwaita_security_low_symbolic_svg, "adwaita/security-low-symbolic.svg");
+ t!(adwaita_security_medium_symbolic_svg, "adwaita/security-medium-symbolic.svg");
+ t!(adwaita_selection_end_symbolic_rtl_svg, "adwaita/selection-end-symbolic-rtl.svg");
+ t!(adwaita_selection_end_symbolic_svg, "adwaita/selection-end-symbolic.svg");
+ t!(adwaita_selection_start_symbolic_rtl_svg, "adwaita/selection-start-symbolic-rtl.svg");
+ t!(adwaita_selection_start_symbolic_svg, "adwaita/selection-start-symbolic.svg");
+ t!(adwaita_semi_starred_symbolic_rtl_svg, "adwaita/semi-starred-symbolic-rtl.svg");
+ t!(adwaita_semi_starred_symbolic_svg, "adwaita/semi-starred-symbolic.svg");
+ t!(adwaita_send_to_symbolic_svg, "adwaita/send-to-symbolic.svg");
+ t!(adwaita_software_update_available_symbolic_svg, "adwaita/software-update-available-symbolic.svg");
+ t!(adwaita_software_update_urgent_symbolic_svg, "adwaita/software-update-urgent-symbolic.svg");
+ t!(adwaita_star_new_symbolic_svg, "adwaita/star-new-symbolic.svg");
+ t!(adwaita_starred_symbolic_svg, "adwaita/starred-symbolic.svg");
+ t!(adwaita_start_here_symbolic_svg, "adwaita/start-here-symbolic.svg");
+ t!(adwaita_system_file_manager_symbolic_svg, "adwaita/system-file-manager-symbolic.svg");
+ t!(adwaita_system_help_symbolic_svg, "adwaita/system-help-symbolic.svg");
+ t!(adwaita_system_lock_screen_symbolic_svg, "adwaita/system-lock-screen-symbolic.svg");
+ t!(adwaita_system_run_symbolic_svg, "adwaita/system-run-symbolic.svg");
+ t!(adwaita_system_search_symbolic_svg, "adwaita/system-search-symbolic.svg");
+ t!(adwaita_system_shutdown_symbolic_svg, "adwaita/system-shutdown-symbolic.svg");
+ t!(adwaita_system_software_install_symbolic_svg, "adwaita/system-software-install-symbolic.svg");
+ t!(adwaita_system_switch_user_symbolic_svg, "adwaita/system-switch-user-symbolic.svg");
+ t!(adwaita_system_users_symbolic_svg, "adwaita/system-users-symbolic.svg");
+ t!(adwaita_tab_new_symbolic_svg, "adwaita/tab-new-symbolic.svg");
+ t!(adwaita_task_due_symbolic_svg, "adwaita/task-due-symbolic.svg");
+ t!(adwaita_task_past_due_symbolic_svg, "adwaita/task-past-due-symbolic.svg");
+ t!(adwaita_text_editor_symbolic_svg, "adwaita/text-editor-symbolic.svg");
+ t!(adwaita_text_x_generic_symbolic_svg, "adwaita/text-x-generic-symbolic.svg");
+ t!(adwaita_thunderbolt_acquiring_symbolic_svg, "adwaita/thunderbolt-acquiring-symbolic.svg");
+ t!(adwaita_thunderbolt_symbolic_svg, "adwaita/thunderbolt-symbolic.svg");
+ t!(adwaita_tools_check_spelling_symbolic_svg, "adwaita/tools-check-spelling-symbolic.svg");
+ t!(adwaita_touchpad_disabled_symbolic_svg, "adwaita/touchpad-disabled-symbolic.svg");
+ t!(adwaita_tv_symbolic_svg, "adwaita/tv-symbolic.svg");
+ t!(adwaita_uninterruptible_power_supply_symbolic_svg, "adwaita/uninterruptible-power-supply-symbolic.svg");
+ t!(adwaita_user_available_symbolic_svg, "adwaita/user-available-symbolic.svg");
+ t!(adwaita_user_away_symbolic_svg, "adwaita/user-away-symbolic.svg");
+ t!(adwaita_user_bookmarks_symbolic_svg, "adwaita/user-bookmarks-symbolic.svg");
+ t!(adwaita_user_busy_symbolic_svg, "adwaita/user-busy-symbolic.svg");
+ t!(adwaita_user_desktop_symbolic_svg, "adwaita/user-desktop-symbolic.svg");
+ t!(adwaita_user_home_symbolic_svg, "adwaita/user-home-symbolic.svg");
+ t!(adwaita_user_idle_symbolic_svg, "adwaita/user-idle-symbolic.svg");
+ t!(adwaita_user_info_symbolic_svg, "adwaita/user-info-symbolic.svg");
+ t!(adwaita_user_invisible_symbolic_svg, "adwaita/user-invisible-symbolic.svg");
+ t!(adwaita_user_not_tracked_symbolic_svg, "adwaita/user-not-tracked-symbolic.svg");
+ t!(adwaita_user_offline_symbolic_svg, "adwaita/user-offline-symbolic.svg");
+ t!(adwaita_user_status_pending_symbolic_svg, "adwaita/user-status-pending-symbolic.svg");
+ t!(adwaita_user_trash_full_symbolic_svg, "adwaita/user-trash-full-symbolic.svg");
+ t!(adwaita_user_trash_symbolic_svg, "adwaita/user-trash-symbolic.svg");
+ t!(adwaita_utilities_system_monitor_symbolic_svg, "adwaita/utilities-system-monitor-symbolic.svg");
+ t!(adwaita_utilities_terminal_symbolic_svg, "adwaita/utilities-terminal-symbolic.svg");
+ t!(adwaita_video_display_symbolic_svg, "adwaita/video-display-symbolic.svg");
+ t!(adwaita_video_joined_displays_symbolic_svg, "adwaita/video-joined-displays-symbolic.svg");
+ t!(adwaita_video_single_display_symbolic_svg, "adwaita/video-single-display-symbolic.svg");
+ t!(adwaita_video_x_generic_symbolic_svg, "adwaita/video-x-generic-symbolic.svg");
+ t!(adwaita_view_app_grid_symbolic_svg, "adwaita/view-app-grid-symbolic.svg");
+ t!(adwaita_view_continuous_symbolic_svg, "adwaita/view-continuous-symbolic.svg");
+ t!(adwaita_view_dual_symbolic_svg, "adwaita/view-dual-symbolic.svg");
+ t!(adwaita_view_fullscreen_symbolic_svg, "adwaita/view-fullscreen-symbolic.svg");
+ t!(adwaita_view_grid_symbolic_svg, "adwaita/view-grid-symbolic.svg");
+ t!(adwaita_view_list_symbolic_svg, "adwaita/view-list-symbolic.svg");
+ t!(adwaita_view_mirror_symbolic_svg, "adwaita/view-mirror-symbolic.svg");
+ t!(adwaita_view_more_horizontal_symbolic_svg, "adwaita/view-more-horizontal-symbolic.svg");
+ t!(adwaita_view_more_symbolic_svg, "adwaita/view-more-symbolic.svg");
+ t!(adwaita_view_paged_symbolic_svg, "adwaita/view-paged-symbolic.svg");
+ t!(adwaita_view_pin_symbolic_svg, "adwaita/view-pin-symbolic.svg");
+ t!(adwaita_view_refresh_symbolic_svg, "adwaita/view-refresh-symbolic.svg");
+ t!(adwaita_view_restore_symbolic_svg, "adwaita/view-restore-symbolic.svg");
+ t!(adwaita_view_sort_ascending_symbolic_svg, "adwaita/view-sort-ascending-symbolic.svg");
+ t!(adwaita_view_sort_descending_symbolic_svg, "adwaita/view-sort-descending-symbolic.svg");
+ t!(adwaita_view_wrapped_symbolic_rtl_svg, "adwaita/view-wrapped-symbolic-rtl.svg");
+ t!(adwaita_view_wrapped_symbolic_svg, "adwaita/view-wrapped-symbolic.svg");
+ t!(adwaita_weather_clear_night_symbolic_svg, "adwaita/weather-clear-night-symbolic.svg");
+ t!(adwaita_weather_clear_symbolic_svg, "adwaita/weather-clear-symbolic.svg");
+ t!(adwaita_weather_few_clouds_night_symbolic_svg, "adwaita/weather-few-clouds-night-symbolic.svg");
+ t!(adwaita_weather_few_clouds_symbolic_svg, "adwaita/weather-few-clouds-symbolic.svg");
+ t!(adwaita_weather_fog_symbolic_svg, "adwaita/weather-fog-symbolic.svg");
+ t!(adwaita_weather_overcast_symbolic_svg, "adwaita/weather-overcast-symbolic.svg");
+ t!(adwaita_weather_severe_alert_symbolic_svg, "adwaita/weather-severe-alert-symbolic.svg");
+ t!(adwaita_weather_showers_scattered_symbolic_svg, "adwaita/weather-showers-scattered-symbolic.svg");
+ t!(adwaita_weather_showers_symbolic_svg, "adwaita/weather-showers-symbolic.svg");
+ t!(adwaita_weather_snow_symbolic_svg, "adwaita/weather-snow-symbolic.svg");
+ t!(adwaita_weather_storm_symbolic_svg, "adwaita/weather-storm-symbolic.svg");
+ t!(adwaita_weather_windy_symbolic_svg, "adwaita/weather-windy-symbolic.svg");
+ t!(adwaita_web_browser_symbolic_svg, "adwaita/web-browser-symbolic.svg");
+ t!(adwaita_window_close_symbolic_svg, "adwaita/window-close-symbolic.svg");
+ t!(adwaita_window_maximize_symbolic_svg, "adwaita/window-maximize-symbolic.svg");
+ t!(adwaita_window_minimize_symbolic_svg, "adwaita/window-minimize-symbolic.svg");
+ t!(adwaita_window_restore_symbolic_svg, "adwaita/window-restore-symbolic.svg");
+ t!(adwaita_x_office_address_book_symbolic_svg, "adwaita/x-office-address-book-symbolic.svg");
+ t!(adwaita_x_office_calendar_symbolic_svg, "adwaita/x-office-calendar-symbolic.svg");
+ t!(adwaita_x_office_document_symbolic_svg, "adwaita/x-office-document-symbolic.svg");
+ t!(adwaita_x_office_drawing_symbolic_svg, "adwaita/x-office-drawing-symbolic.svg");
+ t!(adwaita_x_office_presentation_symbolic_svg, "adwaita/x-office-presentation-symbolic.svg");
+ t!(adwaita_x_office_spreadsheet_symbolic_svg, "adwaita/x-office-spreadsheet-symbolic.svg");
+ t!(adwaita_zoom_fit_best_symbolic_svg, "adwaita/zoom-fit-best-symbolic.svg");
+ t!(adwaita_zoom_in_symbolic_svg, "adwaita/zoom-in-symbolic.svg");
+ t!(adwaita_zoom_original_symbolic_svg, "adwaita/zoom-original-symbolic.svg");
+ t!(adwaita_zoom_out_symbolic_svg, "adwaita/zoom-out-symbolic.svg");
+ t!(bugs_a_inside_text_content_738_svg, "bugs/a-inside-text-content-738.svg");
+ t!(bugs_a_inside_text_content_pseudo_class_738_svg, "bugs/a-inside-text-content-pseudo-class-738.svg");
+ t!(bugs_bug108_font_size_relative_svg, "bugs/bug108-font-size-relative.svg");
+ t!(bugs_bug112_svg_delayed_attributes_svg, "bugs/bug112-svg-delayed-attributes.svg");
+ t!(bugs_bug165_zero_length_subpath_square_linecap_svg, "bugs/bug165-zero-length-subpath-square-linecap.svg");
+ t!(bugs_bug181_inheritable_attrs_in_svg_svg, "bugs/bug181-inheritable-attrs-in-svg.svg");
+ t!(bugs_bug241_light_source_type_svg, "bugs/bug241-light-source-type.svg");
+ t!(bugs_bug245_negative_dashoffset_svg, "bugs/bug245-negative-dashoffset.svg");
+ t!(bugs_bug282_drop_shadow_svg, "bugs/bug282-drop-shadow.svg");
+ t!(bugs_bug340047_svg, "bugs/bug340047.svg");
+ t!(bugs_bug363_missing_space_svg, "bugs/bug363-missing-space.svg");
+ t!(bugs_bug372_small_arcs_svg, "bugs/bug372-small-arcs.svg");
+ t!(bugs_bug373_gradient_userspaceonuse_svg, "bugs/bug373-gradient-userspaceonuse.svg");
+ t!(bugs_bug403357_svg, "bugs/bug403357.svg");
+ t!(bugs_bug476507_svg, "bugs/bug476507.svg");
+ t!(bugs_bug481_tspan_uses_at_least_first_x_svg, "bugs/bug481-tspan-uses-at-least-first-x.svg");
+ t!(bugs_bug494_text_accumulate_dy_svg, "bugs/bug494-text-accumulate-dy.svg");
+ t!(bugs_bug506_pattern_fallback_svg, "bugs/bug506-pattern-fallback.svg");
+ t!(bugs_bug510_pattern_fill_opacity_svg, "bugs/bug510-pattern-fill-opacity.svg");
+ t!(bugs_bug510_pattern_fill_svg, "bugs/bug510-pattern-fill.svg");
+ t!(bugs_bug548_data_url_without_mimetype_svg, "bugs/bug548-data-url-without-mimetype.svg");
+ t!(bugs_bug563933_svg, "bugs/bug563933.svg");
+ t!(bugs_bug587721_text_transform_svg, "bugs/bug587721-text-transform.svg");
+ t!(bugs_bug590_mask_units_svg, "bugs/bug590-mask-units.svg");
+ t!(bugs_bug603550_mask_luminance_svg, "bugs/bug603550-mask-luminance.svg");
+ t!(bugs_bug609_clippath_transform_svg, "bugs/bug609-clippath-transform.svg");
+ t!(bugs_bug634324_blur_negative_transform_svg, "bugs/bug634324-blur-negative-transform.svg");
+ t!(bugs_bug642_nested_tspan_dx_dy_svg, "bugs/bug642-nested-tspan-dx-dy.svg");
+ t!(bugs_bug667_tspan_visibility_svg, "bugs/bug667-tspan-visibility.svg");
+ t!(bugs_bug668_small_caps_svg, "bugs/bug668-small-caps.svg");
+ t!(bugs_bug689832_unresolved_gradient_svg, "bugs/bug689832-unresolved-gradient.svg");
+ t!(bugs_bug718_rect_negative_rx_ry_svg, "bugs/bug718-rect-negative-rx-ry.svg");
+ t!(bugs_bug730_font_scaling_svg, "bugs/bug730-font-scaling.svg");
+ t!(bugs_bug738367_svg, "bugs/bug738367.svg");
+ t!(bugs_bug749415_svg, "bugs/bug749415.svg");
+ t!(bugs_bug760180_svg, "bugs/bug760180.svg");
+ t!(bugs_bug761175_recursive_masks_svg, "bugs/bug761175-recursive-masks.svg");
+ t!(bugs_bug761871_reset_reflection_points_svg, "bugs/bug761871-reset-reflection-points.svg");
+ t!(bugs_bug763386_marker_coincident_svg, "bugs/bug763386-marker-coincident.svg");
+ t!(bugs_bug776297_marker_on_non_path_elements_svg, "bugs/bug776297-marker-on-non-path-elements.svg");
+ t!(bugs_bug786372_default_style_type_svg, "bugs/bug786372-default-style-type.svg");
+ t!(bugs_bug788_inner_svg_viewbox_svg, "bugs/bug788-inner-svg-viewbox.svg");
+ t!(bugs_ignore_577_multiple_font_families_svg, "bugs/ignore-577-multiple-font-families.svg");
+ t!(svg1_1_coords_trans_01_b_svg, "svg1.1/coords-trans-01-b.svg");
+ t!(svg1_1_coords_trans_02_t_svg, "svg1.1/coords-trans-02-t.svg");
+ t!(svg1_1_coords_trans_03_t_svg, "svg1.1/coords-trans-03-t.svg");
+ t!(svg1_1_coords_trans_04_t_svg, "svg1.1/coords-trans-04-t.svg");
+ t!(svg1_1_coords_trans_05_t_svg, "svg1.1/coords-trans-05-t.svg");
+ t!(svg1_1_coords_trans_06_t_svg, "svg1.1/coords-trans-06-t.svg");
+ t!(svg1_1_coords_trans_07_t_svg, "svg1.1/coords-trans-07-t.svg");
+ t!(svg1_1_coords_trans_08_t_svg, "svg1.1/coords-trans-08-t.svg");
+ t!(svg1_1_coords_trans_09_t_svg, "svg1.1/coords-trans-09-t.svg");
+ t!(svg1_1_coords_viewattr_01_b_svg, "svg1.1/coords-viewattr-01-b.svg");
+ t!(svg1_1_coords_viewattr_02_b_svg, "svg1.1/coords-viewattr-02-b.svg");
+ t!(svg1_1_coords_viewattr_03_b_svg, "svg1.1/coords-viewattr-03-b.svg");
+ t!(svg1_1_filters_background_01_f_svg, "svg1.1/filters-background-01-f.svg");
+ t!(svg1_1_filters_blend_01_b_svg, "svg1.1/filters-blend-01-b.svg");
+ t!(svg1_1_filters_color_01_b_svg, "svg1.1/filters-color-01-b.svg");
+ t!(svg1_1_filters_color_02_b_svg, "svg1.1/filters-color-02-b.svg");
+ t!(svg1_1_filters_composite_02_b_svg, "svg1.1/filters-composite-02-b.svg");
+ t!(svg1_1_filters_composite_03_f_svg, "svg1.1/filters-composite-03-f.svg");
+ t!(svg1_1_filters_composite_04_f_svg, "svg1.1/filters-composite-04-f.svg");
+ t!(svg1_1_filters_composite_05_f_svg, "svg1.1/filters-composite-05-f.svg");
+ t!(svg1_1_filters_comptran_01_b_svg, "svg1.1/filters-comptran-01-b.svg");
+ t!(svg1_1_filters_conv_01_f_svg, "svg1.1/filters-conv-01-f.svg");
+ t!(svg1_1_filters_conv_02_f_svg, "svg1.1/filters-conv-02-f.svg");
+ t!(svg1_1_filters_conv_03_f_svg, "svg1.1/filters-conv-03-f.svg");
+ t!(svg1_1_filters_conv_04_f_svg, "svg1.1/filters-conv-04-f.svg");
+ t!(svg1_1_filters_conv_05_f_svg, "svg1.1/filters-conv-05-f.svg");
+ t!(svg1_1_filters_diffuse_01_f_svg, "svg1.1/filters-diffuse-01-f.svg");
+ t!(svg1_1_filters_displace_02_f_svg, "svg1.1/filters-displace-02-f.svg");
+ t!(svg1_1_filters_felem_02_f_svg, "svg1.1/filters-felem-02-f.svg");
+ t!(svg1_1_filters_gauss_01_b_svg, "svg1.1/filters-gauss-01-b.svg");
+ t!(svg1_1_filters_gauss_02_f_svg, "svg1.1/filters-gauss-02-f.svg");
+ t!(svg1_1_filters_gauss_03_f_svg, "svg1.1/filters-gauss-03-f.svg");
+ t!(svg1_1_filters_image_01_b_svg, "svg1.1/filters-image-01-b.svg");
+ t!(svg1_1_filters_image_02_b_svg, "svg1.1/filters-image-02-b.svg");
+ t!(svg1_1_filters_image_03_f_svg, "svg1.1/filters-image-03-f.svg");
+ t!(svg1_1_filters_image_04_f_svg, "svg1.1/filters-image-04-f.svg");
+ t!(svg1_1_filters_image_05_f_svg, "svg1.1/filters-image-05-f.svg");
+ t!(svg1_1_filters_light_01_f_svg, "svg1.1/filters-light-01-f.svg");
+ t!(svg1_1_filters_light_02_f_svg, "svg1.1/filters-light-02-f.svg");
+ t!(svg1_1_filters_light_03_f_svg, "svg1.1/filters-light-03-f.svg");
+ t!(svg1_1_filters_light_04_f_svg, "svg1.1/filters-light-04-f.svg");
+ t!(svg1_1_filters_light_05_f_svg, "svg1.1/filters-light-05-f.svg");
+ t!(svg1_1_filters_morph_01_f_svg, "svg1.1/filters-morph-01-f.svg");
+ t!(svg1_1_filters_offset_01_b_svg, "svg1.1/filters-offset-01-b.svg");
+ t!(svg1_1_filters_overview_01_b_svg, "svg1.1/filters-overview-01-b.svg");
+ t!(svg1_1_filters_overview_02_b_svg, "svg1.1/filters-overview-02-b.svg");
+ t!(svg1_1_filters_overview_03_b_svg, "svg1.1/filters-overview-03-b.svg");
+ t!(svg1_1_filters_specular_01_f_svg, "svg1.1/filters-specular-01-f.svg");
+ t!(svg1_1_filters_tile_01_b_svg, "svg1.1/filters-tile-01-b.svg");
+ t!(svg1_1_filters_turb_01_f_svg, "svg1.1/filters-turb-01-f.svg");
+ t!(svg1_1_filters_turb_02_f_svg, "svg1.1/filters-turb-02-f.svg");
+ t!(svg1_1_ignore_filters_displace_01_f_svg, "svg1.1/ignore-filters-displace-01-f.svg");
+ t!(svg1_1_ignore_filters_example_01_b_svg, "svg1.1/ignore-filters-example-01-b.svg");
+ t!(svg1_1_ignore_masking_path_07_b_svg, "svg1.1/ignore-masking-path-07-b.svg");
+ t!(svg1_1_masking_filter_01_f_svg, "svg1.1/masking-filter-01-f.svg");
+ t!(svg1_1_masking_intro_01_f_svg, "svg1.1/masking-intro-01-f.svg");
+ t!(svg1_1_masking_mask_01_b_svg, "svg1.1/masking-mask-01-b.svg");
+ t!(svg1_1_masking_mask_02_f_svg, "svg1.1/masking-mask-02-f.svg");
+ t!(svg1_1_masking_opacity_01_b_svg, "svg1.1/masking-opacity-01-b.svg");
+ t!(svg1_1_masking_path_01_b_svg, "svg1.1/masking-path-01-b.svg");
+ t!(svg1_1_masking_path_02_b_svg, "svg1.1/masking-path-02-b.svg");
+ t!(svg1_1_masking_path_03_b_svg, "svg1.1/masking-path-03-b.svg");
+ t!(svg1_1_masking_path_04_b_svg, "svg1.1/masking-path-04-b.svg");
+ t!(svg1_1_masking_path_05_f_svg, "svg1.1/masking-path-05-f.svg");
+ t!(svg1_1_masking_path_08_b_svg, "svg1.1/masking-path-08-b.svg");
+ t!(svg1_1_painting_control_02_f_svg, "svg1.1/painting-control-02-f.svg");
+ t!(svg1_1_painting_marker_01_f_svg, "svg1.1/painting-marker-01-f.svg");
+ t!(svg1_1_painting_marker_02_f_svg, "svg1.1/painting-marker-02-f.svg");
+ t!(svg1_1_painting_marker_03_f_svg, "svg1.1/painting-marker-03-f.svg");
+ t!(svg1_1_painting_marker_04_f_svg, "svg1.1/painting-marker-04-f.svg");
+ t!(svg1_1_painting_marker_06_f_svg, "svg1.1/painting-marker-06-f.svg");
+ t!(svg1_1_painting_marker_07_f_svg, "svg1.1/painting-marker-07-f.svg");
+ t!(svg1_1_painting_marker_properties_01_f_svg, "svg1.1/painting-marker-properties-01-f.svg");
+ t!(svg1_1_painting_stroke_01_t_svg, "svg1.1/painting-stroke-01-t.svg");
+ t!(svg1_1_painting_stroke_02_t_svg, "svg1.1/painting-stroke-02-t.svg");
+ t!(svg1_1_painting_stroke_03_t_svg, "svg1.1/painting-stroke-03-t.svg");
+ t!(svg1_1_painting_stroke_04_t_svg, "svg1.1/painting-stroke-04-t.svg");
+ t!(svg1_1_painting_stroke_05_t_svg, "svg1.1/painting-stroke-05-t.svg");
+ t!(svg1_1_painting_stroke_06_t_svg, "svg1.1/painting-stroke-06-t.svg");
+ t!(svg1_1_painting_stroke_07_t_svg, "svg1.1/painting-stroke-07-t.svg");
+ t!(svg1_1_painting_stroke_08_t_svg, "svg1.1/painting-stroke-08-t.svg");
+ t!(svg1_1_painting_stroke_09_t_svg, "svg1.1/painting-stroke-09-t.svg");
+ t!(svg1_1_paths_data_01_t_svg, "svg1.1/paths-data-01-t.svg");
+ t!(svg1_1_paths_data_02_t_svg, "svg1.1/paths-data-02-t.svg");
+ t!(svg1_1_paths_data_03_f_svg, "svg1.1/paths-data-03-f.svg");
+ t!(svg1_1_paths_data_04_t_svg, "svg1.1/paths-data-04-t.svg");
+ t!(svg1_1_paths_data_05_t_svg, "svg1.1/paths-data-05-t.svg");
+ t!(svg1_1_paths_data_06_t_svg, "svg1.1/paths-data-06-t.svg");
+ t!(svg1_1_paths_data_07_t_svg, "svg1.1/paths-data-07-t.svg");
+ t!(svg1_1_paths_data_08_t_svg, "svg1.1/paths-data-08-t.svg");
+ t!(svg1_1_paths_data_09_t_svg, "svg1.1/paths-data-09-t.svg");
+ t!(svg1_1_paths_data_10_t_svg, "svg1.1/paths-data-10-t.svg");
+ t!(svg1_1_paths_data_12_t_svg, "svg1.1/paths-data-12-t.svg");
+ t!(svg1_1_paths_data_13_t_svg, "svg1.1/paths-data-13-t.svg");
+ t!(svg1_1_paths_data_14_t_svg, "svg1.1/paths-data-14-t.svg");
+ t!(svg1_1_paths_data_15_t_svg, "svg1.1/paths-data-15-t.svg");
+ t!(svg1_1_paths_data_16_t_svg, "svg1.1/paths-data-16-t.svg");
+ t!(svg1_1_paths_data_17_f_svg, "svg1.1/paths-data-17-f.svg");
+ t!(svg1_1_paths_data_18_f_svg, "svg1.1/paths-data-18-f.svg");
+ t!(svg1_1_paths_data_19_f_svg, "svg1.1/paths-data-19-f.svg");
+ t!(svg1_1_paths_data_20_f_svg, "svg1.1/paths-data-20-f.svg");
+ t!(svg1_1_pservers_grad_01_b_svg, "svg1.1/pservers-grad-01-b.svg");
+ t!(svg1_1_pservers_grad_02_b_svg, "svg1.1/pservers-grad-02-b.svg");
+ t!(svg1_1_pservers_grad_03_b_svg, "svg1.1/pservers-grad-03-b.svg");
+ t!(svg1_1_pservers_grad_04_b_svg, "svg1.1/pservers-grad-04-b.svg");
+ t!(svg1_1_pservers_grad_05_b_svg, "svg1.1/pservers-grad-05-b.svg");
+ t!(svg1_1_pservers_grad_06_b_svg, "svg1.1/pservers-grad-06-b.svg");
+ t!(svg1_1_pservers_grad_07_b_svg, "svg1.1/pservers-grad-07-b.svg");
+ t!(svg1_1_pservers_grad_08_b_svg, "svg1.1/pservers-grad-08-b.svg");
+ t!(svg1_1_pservers_grad_09_b_svg, "svg1.1/pservers-grad-09-b.svg");
+ t!(svg1_1_pservers_grad_10_b_svg, "svg1.1/pservers-grad-10-b.svg");
+ t!(svg1_1_pservers_grad_11_b_svg, "svg1.1/pservers-grad-11-b.svg");
+ t!(svg1_1_pservers_grad_12_b_svg, "svg1.1/pservers-grad-12-b.svg");
+ t!(svg1_1_pservers_grad_14_b_svg, "svg1.1/pservers-grad-14-b.svg");
+ t!(svg1_1_pservers_grad_15_b_svg, "svg1.1/pservers-grad-15-b.svg");
+ t!(svg1_1_pservers_grad_16_b_svg, "svg1.1/pservers-grad-16-b.svg");
+ t!(svg1_1_pservers_grad_18_b_svg, "svg1.1/pservers-grad-18-b.svg");
+ t!(svg1_1_pservers_grad_22_b_svg, "svg1.1/pservers-grad-22-b.svg");
+ t!(svg1_1_pservers_grad_23_f_svg, "svg1.1/pservers-grad-23-f.svg");
+ t!(svg1_1_pservers_grad_24_f_svg, "svg1.1/pservers-grad-24-f.svg");
+ t!(svg1_1_pservers_grad_stops_01_f_svg, "svg1.1/pservers-grad-stops-01-f.svg");
+ t!(svg1_1_pservers_pattern_01_b_svg, "svg1.1/pservers-pattern-01-b.svg");
+ t!(svg1_1_pservers_pattern_02_f_svg, "svg1.1/pservers-pattern-02-f.svg");
+ t!(svg1_1_pservers_pattern_03_f_svg, "svg1.1/pservers-pattern-03-f.svg");
+ t!(svg1_1_pservers_pattern_04_f_svg, "svg1.1/pservers-pattern-04-f.svg");
+ t!(svg1_1_pservers_pattern_05_f_svg, "svg1.1/pservers-pattern-05-f.svg");
+ t!(svg1_1_pservers_pattern_06_f_svg, "svg1.1/pservers-pattern-06-f.svg");
+ t!(svg1_1_pservers_pattern_07_f_svg, "svg1.1/pservers-pattern-07-f.svg");
+ t!(svg1_1_pservers_pattern_08_f_svg, "svg1.1/pservers-pattern-08-f.svg");
+ t!(svg1_1_pservers_pattern_09_f_svg, "svg1.1/pservers-pattern-09-f.svg");
+ t!(svg1_1_shapes_intro_01_t_svg, "svg1.1/shapes-intro-01-t.svg");
+ t!(svg1_1_shapes_intro_02_f_svg, "svg1.1/shapes-intro-02-f.svg");
+ t!(svg1_1_struct_cond_01_t_svg, "svg1.1/struct-cond-01-t.svg");
+ t!(svg1_1_struct_cond_03_t_svg, "svg1.1/struct-cond-03-t.svg");
+ t!(svg1_1_struct_group_03_t_svg, "svg1.1/struct-group-03-t.svg");
+ t!(svg1_1_struct_svg_03_f_svg, "svg1.1/struct-svg-03-f.svg");
+ t!(svg1_1_struct_symbol_01_b_svg, "svg1.1/struct-symbol-01-b.svg");
+ t!(svg1_1_struct_use_01_t_svg, "svg1.1/struct-use-01-t.svg");
+ t!(svg1_1_struct_use_03_t_svg, "svg1.1/struct-use-03-t.svg");
+ t!(svg1_1_struct_use_04_b_svg, "svg1.1/struct-use-04-b.svg");
+ t!(svg1_1_struct_use_09_b_svg, "svg1.1/struct-use-09-b.svg");
+ t!(svg1_1_struct_use_10_f_svg, "svg1.1/struct-use-10-f.svg");
+ t!(svg1_1_styling_css_01_b_svg, "svg1.1/styling-css-01-b.svg");
+ t!(svg1_1_styling_css_02_b_svg, "svg1.1/styling-css-02-b.svg");
+ t!(svg1_1_styling_css_03_b_svg, "svg1.1/styling-css-03-b.svg");
+ t!(svg1_1_styling_css_04_f_svg, "svg1.1/styling-css-04-f.svg");
+ t!(svg1_1_styling_css_07_f_svg, "svg1.1/styling-css-07-f.svg");
+ t!(svg1_1_styling_css_08_f_svg, "svg1.1/styling-css-08-f.svg");
+ t!(svg1_1_text_align_01_b_svg, "svg1.1/text-align-01-b.svg");
+ t!(svg1_1_text_align_02_b_svg, "svg1.1/text-align-02-b.svg");
+ t!(svg1_1_text_align_03_b_svg, "svg1.1/text-align-03-b.svg");
+ t!(svg1_1_text_fonts_02_t_svg, "svg1.1/text-fonts-02-t.svg");
+ t!(svg1_1_text_text_03_b_svg, "svg1.1/text-text-03-b.svg");
+ t!(svg1_1_text_text_08_b_svg, "svg1.1/text-text-08-b.svg");
+ t!(svg1_1_text_text_10_t_svg, "svg1.1/text-text-10-t.svg");
+ t!(svg1_1_text_tref_01_b_svg, "svg1.1/text-tref-01-b.svg");
+ t!(svg1_1_text_tref_02_b_svg, "svg1.1/text-tref-02-b.svg");
+ t!(svg1_1_text_tref_03_b_svg, "svg1.1/text-tref-03-b.svg");
+ t!(svg1_1_types_basic_02_f_svg, "svg1.1/types-basic-02-f.svg");
+ t!(svg2_gradient_01_b_svg, "svg2/gradient-01-b.svg");
+ t!(svg2_mix_blend_mode_svg, "svg2/mix-blend-mode.svg");
+ t!(svg2_multi_filter_svg, "svg2/multi-filter.svg");
+ t!(svg2_paint_order_svg, "svg2/paint-order.svg");
+ t!(svg2_text_paint_order_svg, "svg2/text-paint-order.svg");
+}
+
+test_compare_render_output!(
+ marker_orient_auto_start_reverse,
+ 100,
+ 100,
+ br##"<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100">
+ <defs>
+ <marker id="marker" orient="auto-start-reverse" viewBox="0 0 10 10"
+ refX="0" refY="5" markerWidth="10" markerHeight="10"
+ markerUnits="userSpaceOnUse">
+ <path d="M0,0 L10,5 L0,10 Z" fill="green"/>
+ </marker>
+ </defs>
+
+ <path d="M20,50 L80,50" marker-start="url(#marker)" marker-end="url(#marker)" stroke-width="10" stroke="black"/>
+ </svg>"##,
+
+ br##"<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+ <svg xmlns="http://www.w3.org/2000/svg" width="100" height="100">
+ <path
+ d="M 20,55 10,50 20,45 Z"
+ id="triangle1" fill="green"/>
+ <path
+ d="m 80,45 10,5 -10,5 z"
+ id="triangle2" fill="green"/>
+ <rect
+ id="rectangle"
+ width="60"
+ height="10"
+ x="20"
+ y="45" fill="black"/>
+ </svg>"##,
+);
+
+test_compare_render_output!(
+ marker_context_stroke_fill,
+ 400,
+ 400,
+ br##"<?xml version="1.0" encoding="UTF-8"?>
+ <svg xmlns="http://www.w3.org/2000/svg" width="400" height="400">
+ <style>
+ .path1 {
+ fill: none;
+ stroke-width: 4px;
+ marker: url(#marker1);
+ }
+
+ .path2 {
+ fill: darkblue;
+ stroke: mediumseagreen;
+ stroke-width: 4px;
+ marker: url(#marker2);
+ }
+ </style>
+
+ <path class="path1" d="M20,20 L200,20 L380,20" stroke="lime"/>
+
+ <path class="path2" d="M20,40 h360 v320 h-360 v-320 Z"/>
+
+ <marker id="marker1" markerWidth="12" markerHeight="12" refX="6" refY="6"
+ markerUnits="userSpaceOnUse">
+ <circle cx="6" cy="6" r="3"
+ fill="white" stroke="context-stroke" stroke-width="2"/>
+ </marker>
+
+ <marker id="marker2" markerWidth="12" markerHeight="12" refX="6" refY="6"
+ markerUnits="userSpaceOnUse">
+ <!-- Note that here the paint is reversed:
+ fill=context-stroke,
+ stroke=context-fill
+ -->
+ <circle cx="6" cy="6" r="3"
+ fill="context-stroke" stroke="context-fill" stroke-width="2"/>
+ </marker>
+ </svg>"##,
+ br##"<?xml version="1.0" encoding="UTF-8"?>
+ <svg xmlns="http://www.w3.org/2000/svg" width="400" height="400">
+ <path d="M20,20 L200,20 L380,20" stroke="lime" stroke-width="4"/>
+ <circle cx="20" cy="20" r="3" stroke-width="2" fill="white" stroke="lime"/>
+ <circle cx="200" cy="20" r="3" stroke-width="2" fill="white" stroke="lime"/>
+ <circle cx="380" cy="20" r="3" stroke-width="2" fill="white" stroke="lime"/>
+
+ <path class="path2" d="M20,40 h360 v320 h-360 v-320 Z" fill="darkblue"
+ stroke="mediumseagreen" stroke-width="4"/>
+ <circle cx="20" cy="40" r="3" fill="mediumseagreen" stroke="darkblue" stroke-width="2"/>
+ <circle cx="20" cy="40" r="3" fill="mediumseagreen" stroke="darkblue" stroke-width="2"/>
+ <circle cx="380" cy="40" r="3" fill="mediumseagreen" stroke="darkblue" stroke-width="2"/>
+ <circle cx="380" cy="360" r="3" fill="mediumseagreen" stroke="darkblue" stroke-width="2"/>
+ <circle cx="20" cy="360" r="3" fill="mediumseagreen" stroke="darkblue" stroke-width="2"/>
+ <circle cx="20" cy="40" r="3" fill="mediumseagreen" stroke="darkblue" stroke-width="2"/>
+ </svg>
+ "##,
+);
+
+test_compare_render_output!(
+ image_auto_width_height,
+ 30,
+ 30,
+ br##"<?xml version="1.0" encoding="UTF-8"?>
+ <svg xmlns="http://www.w3.org/2000/svg" width="30" height="30">
+ <image
+ href="data:;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAIAAAACUFjqAAAAFElEQVQY02Nk+M+ABzAxMIxKYwIAQC0BEwZFOw4AAAAASUVORK5CYII="
+ x="10" y="10"/>
+ </svg>"##,
+ br##"<?xml version="1.0" encoding="UTF-8"?>
+ <svg xmlns="http://www.w3.org/2000/svg" width="30" height="30">
+ <rect x="10" y="10" width="10" height="10" fill="lime"/>
+ </svg>"##,
+);
+
+test_compare_render_output!(
+ rect_auto_width_height,
+ 30,
+ 30,
+ br##"<?xml version="1.0" encoding="UTF-8"?>
+ <svg xmlns="http://www.w3.org/2000/svg" width="30" height="30">
+ <rect x="10" y="10" width="auto" height="auto" fill="lime"/>
+ </svg>"##,
+ br##"<?xml version="1.0" encoding="UTF-8"?>
+ <svg xmlns="http://www.w3.org/2000/svg" width="30" height="30">
+ </svg>"##
+);
+
+test_compare_render_output!(
+ svg_auto_width_height,
+ 30,
+ 30,
+ br##"<?xml version="1.0" encoding="UTF-8"?>
+ <svg xmlns="http://www.w3.org/2000/svg" width="30" height="30">
+ <svg xmlns="http://www.w3.org/2000/svg" width="auto" height="auto">
+ <rect x="10" y="10" width="100%" height="100%" fill="lime"/>
+ </svg>
+ </svg>"##,
+ br##"<?xml version="1.0" encoding="UTF-8"?>
+ <svg xmlns="http://www.w3.org/2000/svg" width="30" height="30">
+ <rect x="10" y="10" width="100%" height="100%" fill="lime"/>
+ </svg>"##,
+);
+
+test_compare_render_output!(
+ use_context_stroke,
+ 100,
+ 20,
+ br##"<?xml version="1.0" encoding="UTF-8"?>
+ <svg width="100" height="20" viewBox="0 0 40 10" xmlns="http://www.w3.org/2000/svg">
+ <g id="group">
+ <circle cx="5" cy="5" r="4" stroke="context-stroke" fill="black"/>
+ <circle cx="14" cy="5" r="4" stroke="context-fill"/>
+ </g>
+ <use href="#group" x="20" stroke="blue" fill="yellow"/>
+ <!--
+ Modified from: https://developer.mozilla.org/en-US/docs/Web/SVG/Element/use
+ -->
+</svg>
+ "##,
+ br##"<?xml version="1.0" encoding="UTF-8"?>
+ <svg width="100" height="20" viewBox="0 0 40 10" xmlns="http://www.w3.org/2000/svg">
+ <circle cx="5" cy="5" r="4" fill="black"/>
+ <circle cx="14" cy="5" r="4" fill="black"/>
+ <circle cx="25" cy="5" r="4" stroke="blue" fill="black"/>
+ <circle cx="34" cy="5" r="4" stroke="yellow" fill="yellow"/>
+ <!--
+ Modified from: https://developer.mozilla.org/en-US/docs/Web/SVG/Element/use
+ -->
+ </svg>
+ "##,
+);
+
+test_svg_reference!(
+ isolation,
+ "tests/fixtures/reftests/svg2-reftests/isolation.svg",
+ "tests/fixtures/reftests/svg2-reftests/isolation-ref.svg"
+);
+
+test_svg_reference!(
+ mask_and_opacity,
+ "tests/fixtures/reftests/svg2-reftests/mask-and-opacity.svg",
+ "tests/fixtures/reftests/svg2-reftests/mask-and-opacity-ref.svg"
+);
+
+test_svg_reference!(
+ gaussian_blur_nonpositive_913,
+ "tests/fixtures/reftests/svg2-reftests/bug913-gaussian-blur-nonpositive.svg",
+ "tests/fixtures/reftests/svg2-reftests/bug913-gaussian-blur-nonpositive-ref.svg"
+);
+
+test_svg_reference!(
+ bug_880_horizontal_vertical_stroked_lines,
+ "tests/fixtures/reftests/bugs-reftests/bug880-stroke-wide-line.svg",
+ "tests/fixtures/reftests/bugs-reftests/bug880-stroke-wide-line-ref.svg"
+);
+
+test_svg_reference!(
+ bug_92_symbol_clip,
+ "tests/fixtures/reftests/bugs-reftests/bug92-symbol-clip.svg",
+ "tests/fixtures/reftests/bugs-reftests/bug92-symbol-clip-ref.svg"
+);
+
+test_svg_reference!(
+ bug_875_svg_use_width_height,
+ "tests/fixtures/reftests/bugs-reftests/bug875-svg-use-width-height.svg",
+ "tests/fixtures/reftests/bugs-reftests/bug875-svg-use-width-height-ref.svg"
+);
+
+test_svg_reference!(
+ bug_885_vector_effect_non_scaling_stroke,
+ "tests/fixtures/reftests/bugs-reftests/bug885-vector-effect-non-scaling-stroke.svg",
+ "tests/fixtures/reftests/bugs-reftests/bug885-vector-effect-non-scaling-stroke-ref.svg"
+);
+
+test_svg_reference!(
+ bug_930_invalid_clip_path_transform,
+ "tests/fixtures/reftests/bugs-reftests/bug930-invalid-clip-path-transform.svg",
+ "tests/fixtures/reftests/bugs-reftests/bug930-invalid-clip-path-transform-ref.svg"
+);
diff --git a/rsvg/tests/src/reference_utils.rs b/rsvg/tests/src/reference_utils.rs
new file mode 100644
index 00000000..8232d4c9
--- /dev/null
+++ b/rsvg/tests/src/reference_utils.rs
@@ -0,0 +1,288 @@
+//! Utilities for the reference image test suite.
+//!
+//! This module has utility functions that are used in the test suite
+//! to compare rendered surfaces to reference images.
+
+use cairo;
+
+use std::convert::TryFrom;
+use std::env;
+use std::fs::{self, File};
+use std::io::{BufReader, Read};
+use std::path::{Path, PathBuf};
+use std::sync::Once;
+
+use rsvg::surface_utils::shared_surface::{SharedImageSurface, SurfaceType};
+
+use crate::compare_surfaces::{compare_surfaces, BufferDiff, Diff};
+
+pub struct Reference(SharedImageSurface);
+
+impl Reference {
+ pub fn from_png<P>(path: P) -> Result<Self, cairo::IoError>
+ where
+ P: AsRef<Path>,
+ {
+ let file = File::open(path).map_err(|e| cairo::IoError::Io(e))?;
+ let mut reader = BufReader::new(file);
+ let surface = surface_from_png(&mut reader)?;
+ Self::from_surface(surface)
+ }
+
+ pub fn from_surface(surface: cairo::ImageSurface) -> Result<Self, cairo::IoError> {
+ let shared = SharedImageSurface::wrap(surface, SurfaceType::SRgb)?;
+ Ok(Self(shared))
+ }
+}
+
+pub trait Compare {
+ fn compare(self, surface: &SharedImageSurface) -> Result<BufferDiff, cairo::IoError>;
+}
+
+impl Compare for &Reference {
+ fn compare(self, surface: &SharedImageSurface) -> Result<BufferDiff, cairo::IoError> {
+ compare_surfaces(&self.0, surface).map_err(cairo::IoError::from)
+ }
+}
+
+impl Compare for Result<Reference, cairo::IoError> {
+ fn compare(self, surface: &SharedImageSurface) -> Result<BufferDiff, cairo::IoError> {
+ self.map(|reference| reference.compare(surface))
+ .and_then(std::convert::identity)
+ }
+}
+
+pub trait Evaluate {
+ fn evaluate(&self, output_surface: &SharedImageSurface, output_base_name: &str);
+}
+
+impl Evaluate for BufferDiff {
+ /// Evaluates a BufferDiff and panics if there are relevant differences
+ ///
+ /// The `output_base_name` is used to write test results if the
+ /// surfaces are different. If this is `foo`, this will write
+ /// `foo-out.png` with the `output_surf` and `foo-diff.png` with a
+ /// visual diff between `output_surf` and the `Reference` that this
+ /// diff was created from.
+ ///
+ /// # Panics
+ ///
+ /// Will panic if the surfaces are too different to be acceptable.
+ fn evaluate(&self, output_surf: &SharedImageSurface, output_base_name: &str) {
+ match self {
+ BufferDiff::DifferentSizes => unreachable!("surfaces should be of the same size"),
+
+ BufferDiff::Diff(diff) => {
+ if diff.distinguishable() {
+ println!(
+ "{}: {} pixels changed with maximum difference of {}",
+ output_base_name, diff.num_pixels_changed, diff.max_diff,
+ );
+
+ write_to_file(output_surf, output_base_name, "out");
+ write_to_file(&diff.surface, output_base_name, "diff");
+
+ if diff.inacceptable() {
+ panic!("surfaces are too different");
+ }
+ }
+ }
+ }
+ }
+}
+
+impl Evaluate for Result<BufferDiff, cairo::IoError> {
+ fn evaluate(&self, output_surface: &SharedImageSurface, output_base_name: &str) {
+ self.as_ref()
+ .map(|diff| diff.evaluate(output_surface, output_base_name))
+ .unwrap();
+ }
+}
+
+fn write_to_file(input: &SharedImageSurface, output_base_name: &str, suffix: &str) {
+ let path = output_dir().join(&format!("{}-{}.png", output_base_name, suffix));
+ println!("{}: {}", suffix, path.to_string_lossy());
+ let mut output_file = File::create(path).unwrap();
+ input
+ .clone()
+ .into_image_surface()
+ .unwrap()
+ .write_to_png(&mut output_file)
+ .unwrap();
+}
+
+/// Creates a directory for test output and returns its path.
+///
+/// The location for the output directory is taken from the `TESTS_OUTPUT_DIR` environment
+/// variable if that is set. Otherwise std::env::temp_dir() will be used, which is
+/// a platform dependent location for temporary files.
+///
+/// # Panics
+///
+/// Will panic if the output directory can not be created.
+pub fn output_dir() -> PathBuf {
+ let tempdir = || {
+ let mut path = env::temp_dir();
+ path.push("rsvg-test-output");
+ path
+ };
+ let path = env::var_os("TESTS_OUTPUT_DIR").map_or_else(tempdir, PathBuf::from);
+
+ fs::create_dir_all(&path).expect("could not create output directory for tests");
+
+ path
+}
+
+fn tolerable_difference() -> u8 {
+ static mut TOLERANCE: u8 = 8;
+
+ static ONCE: Once = Once::new();
+ ONCE.call_once(|| unsafe {
+ if let Ok(str) = env::var("RSVG_TEST_TOLERANCE") {
+ let value: usize = str
+ .parse()
+ .expect("Can not parse RSVG_TEST_TOLERANCE as a number");
+ TOLERANCE =
+ u8::try_from(value).expect("RSVG_TEST_TOLERANCE should be between 0 and 255");
+ }
+ });
+
+ unsafe { TOLERANCE }
+}
+
+pub trait Deviation {
+ fn distinguishable(&self) -> bool;
+ fn inacceptable(&self) -> bool;
+}
+
+impl Deviation for Diff {
+ fn distinguishable(&self) -> bool {
+ self.max_diff > 2
+ }
+
+ fn inacceptable(&self) -> bool {
+ self.max_diff > tolerable_difference()
+ }
+}
+
+/// Creates a cairo::ImageSurface from a stream of PNG data.
+///
+/// The surface is converted to ARGB if needed. Use this helper function with `Reference`.
+pub fn surface_from_png<R>(stream: &mut R) -> Result<cairo::ImageSurface, cairo::IoError>
+where
+ R: Read,
+{
+ let png = cairo::ImageSurface::create_from_png(stream)?;
+ let argb = cairo::ImageSurface::create(cairo::Format::ARgb32, png.width(), png.height())?;
+ {
+ // convert to ARGB; the PNG may come as Rgb24
+ let cr = cairo::Context::new(&argb).expect("Failed to create a cairo context");
+ cr.set_source_surface(&png, 0.0, 0.0).unwrap();
+ cr.paint().unwrap();
+ }
+ Ok(argb)
+}
+
+/// Macro test that compares render outputs
+///
+/// Takes in SurfaceSize width and height, setting the cairo surface
+#[macro_export]
+macro_rules! test_compare_render_output {
+ ($test_name:ident, $width:expr, $height:expr, $test:expr, $reference:expr $(,)?) => {
+ #[test]
+ fn $test_name() {
+ crate::utils::setup_font_map();
+
+ let sx: i32 = $width;
+ let sy: i32 = $height;
+ let svg = load_svg($test).unwrap();
+ let output_surf = render_document(
+ &svg,
+ SurfaceSize(sx, sy),
+ |_| (),
+ cairo::Rectangle::new(0.0, 0.0, f64::from(sx), f64::from(sy)),
+ )
+ .unwrap();
+
+ let reference = load_svg($reference).unwrap();
+ let reference_surf = render_document(
+ &reference,
+ SurfaceSize(sx, sy),
+ |_| (),
+ cairo::Rectangle::new(0.0, 0.0, f64::from(sx), f64::from(sy)),
+ )
+ .unwrap();
+
+ Reference::from_surface(reference_surf.into_image_surface().unwrap())
+ .compare(&output_surf)
+ .evaluate(&output_surf, stringify!($test_name));
+ }
+ };
+}
+
+/// Render two SVG files and compare them.
+///
+/// This is used to implement reference tests, or reftests. Use it like this:
+///
+/// ```ignore
+/// test_svg_reference!(test_name, "tests/fixtures/blah/foo.svg", "tests/fixtures/blah/foo-ref.svg");
+/// ```
+///
+/// This will ensure that `foo.svg` and `foo-ref.svg` have exactly the same intrinsic dimensions,
+/// and that they produce the same rendered output.
+#[macro_export]
+macro_rules! test_svg_reference {
+ ($test_name:ident, $test_filename:expr, $reference_filename:expr) => {
+ #[test]
+ fn $test_name() {
+ use crate::reference_utils::{Compare, Evaluate, Reference};
+ use crate::utils::{render_document, setup_font_map, SurfaceSize};
+ use cairo;
+ use rsvg::{CairoRenderer, Loader};
+
+ setup_font_map();
+
+ let svg = Loader::new()
+ .read_path($test_filename)
+ .expect("reading SVG test file");
+ let reference = Loader::new()
+ .read_path($reference_filename)
+ .expect("reading reference file");
+
+ let svg_renderer = CairoRenderer::new(&svg);
+ let ref_renderer = CairoRenderer::new(&reference);
+
+ let svg_dim = svg_renderer.intrinsic_dimensions();
+ let ref_dim = ref_renderer.intrinsic_dimensions();
+
+ assert_eq!(
+ svg_dim, ref_dim,
+ "sizes of SVG document and reference file are different"
+ );
+
+ let pixels = svg_renderer
+ .intrinsic_size_in_pixels()
+ .unwrap_or((100.0, 100.0));
+
+ let output_surf = render_document(
+ &svg,
+ SurfaceSize(pixels.0.ceil() as i32, pixels.1.ceil() as i32),
+ |_| (),
+ cairo::Rectangle::new(0.0, 0.0, pixels.0, pixels.1),
+ )
+ .unwrap();
+
+ let reference_surf = render_document(
+ &reference,
+ SurfaceSize(pixels.0.ceil() as i32, pixels.1.ceil() as i32),
+ |_| (),
+ cairo::Rectangle::new(0.0, 0.0, pixels.0, pixels.1),
+ )
+ .unwrap();
+
+ Reference::from_surface(reference_surf.into_image_surface().unwrap())
+ .compare(&output_surf)
+ .evaluate(&output_surf, stringify!($test_name));
+ }
+ };
+}
diff --git a/rsvg/tests/src/render_crash.rs b/rsvg/tests/src/render_crash.rs
new file mode 100644
index 00000000..795800ab
--- /dev/null
+++ b/rsvg/tests/src/render_crash.rs
@@ -0,0 +1,75 @@
+//! Tests for crashes in the rendering stage.
+//!
+//! Ensures that redering a particular SVG doesn't crash, but we don't care
+//! about the resulting image or even whether there were errors during rendering.
+
+use cairo;
+use rsvg::{CairoRenderer, Loader};
+
+use std::path::PathBuf;
+
+fn render_crash(filename: &str) {
+ let mut full_filename = PathBuf::new();
+ full_filename.push("tests/fixtures/render-crash");
+ full_filename.push(filename);
+
+ let handle = Loader::new()
+ .read_path(&full_filename)
+ .unwrap_or_else(|e| panic!("could not load: {}", e));
+
+ let surface = cairo::ImageSurface::create(cairo::Format::ARgb32, 100, 100).unwrap();
+ let cr = cairo::Context::new(&surface).expect("Failed to create a cairo context");
+
+ // We just test for crashes during rendering, and don't care about success/error.
+ let _ = CairoRenderer::new(&handle)
+ .render_document(&cr, &cairo::Rectangle::new(0.0, 0.0, 100.0, 100.0));
+}
+
+macro_rules! t {
+ ($test_name:ident, $filename:expr) => {
+ #[test]
+ fn $test_name() {
+ render_crash($filename);
+ }
+ };
+}
+
+#[rustfmt::skip]
+mod tests {
+ use super::*;
+
+ t!(bug187_set_gradient_on_empty_path_svg, "bug187-set-gradient-on-empty-path.svg");
+ t!(bug193_filters_conv_05_f_svg, "bug193-filters-conv-05-f.svg");
+ t!(bug227_negative_dasharray_value_svg, "bug227-negative-dasharray-value.svg");
+ t!(bug266_filters_with_error_attributes_svg, "bug266-filters-with-error-attributes.svg");
+ t!(bug277_filter_on_empty_group_svg, "bug277-filter-on-empty-group.svg");
+ t!(bug292_clip_empty_group_svg, "bug292-clip-empty-group.svg");
+ t!(bug293_mask_empty_group_svg, "bug293-mask-empty-group.svg");
+ t!(bug324_empty_svg_svg, "bug324-empty-svg.svg");
+ t!(bug337_font_ex_svg, "bug337-font-ex.svg");
+ t!(bug338_zero_sized_image_svg, "bug338-zero-sized-image.svg");
+ t!(bug340_marker_with_zero_sized_vbox_svg, "bug340-marker-with-zero-sized-vbox.svg");
+ t!(bug342_use_references_ancestor_svg, "bug342-use-references-ancestor.svg");
+ t!(bug343_fecomponenttransfer_child_in_error_svg, "bug343-feComponentTransfer-child-in-error.svg");
+ t!(bug344_too_large_viewbox_svg, "bug344-too-large-viewbox.svg");
+ t!(bug345_too_large_size_svg, "bug345-too-large-size.svg");
+ t!(bug395_femorphology_negative_scaling_svg, "bug395-feMorphology-negative-scaling.svg");
+ t!(bug497_path_with_all_invalid_commands_svg, "bug497-path-with-all-invalid-commands.svg");
+ t!(bug581491_zero_sized_text_svg, "bug581491-zero-sized-text.svg");
+ t!(bug588_big_viewbox_yields_invalid_transform_svg, "bug588-big-viewbox-yields-invalid-transform.svg");
+ t!(bug591_vbox_overflow_svg, "bug591-vbox-overflow.svg");
+ t!(bug593_mask_empty_bbox_svg, "bug593-mask-empty-bbox.svg");
+ t!(bug721_pattern_cycle_from_child_svg, "bug721-pattern-cycle-from-child.svg");
+ t!(bug721_pattern_cycle_from_other_child_svg, "bug721-pattern-cycle-from-other-child.svg");
+ t!(bug777155_zero_sized_pattern_svg, "bug777155-zero-sized-pattern.svg");
+ t!(bug928_empty_fetile_bounds_svg, "bug928-empty-feTile-bounds.svg");
+ t!(bug932_too_big_font_size, "bug932-too-big-font-size.svg");
+ t!(femerge_color_interpolation_srgb_svg, "feMerge-color-interpolation-srgb.svg");
+ t!(filters_non_invertible_paffine_svg, "filters-non-invertible-paffine.svg");
+ t!(gradient_with_empty_bbox_svg, "gradient-with-empty-bbox.svg");
+ t!(gradient_with_no_children_svg, "gradient-with-no-children.svg");
+ t!(pattern_with_empty_bbox_svg, "pattern-with-empty-bbox.svg");
+ t!(pattern_with_no_children_svg, "pattern-with-no-children.svg");
+ t!(pixelrectangle_duplicate_crash_svg, "PixelRectangle-duplicate-crash.svg");
+ t!(recursive_feimage_svg, "recursive-feimage.svg");
+}
diff --git a/rsvg/tests/src/shapes.rs b/rsvg/tests/src/shapes.rs
new file mode 100644
index 00000000..8545b79d
--- /dev/null
+++ b/rsvg/tests/src/shapes.rs
@@ -0,0 +1,13 @@
+use crate::test_svg_reference;
+
+test_svg_reference!(
+ ellipse_auto_rx_ry,
+ "tests/fixtures/reftests/svg2-reftests/ellipse-auto-rx-ry.svg",
+ "tests/fixtures/reftests/svg2-reftests/ellipse-auto-rx-ry-ref.svg"
+);
+
+test_svg_reference!(
+ ellipse_single_auto_rx_ry,
+ "tests/fixtures/reftests/svg2-reftests/ellipse-single-auto-rx-ry.svg",
+ "tests/fixtures/reftests/svg2-reftests/ellipse-single-auto-rx-ry-ref.svg"
+);
diff --git a/rsvg/tests/src/text.rs b/rsvg/tests/src/text.rs
new file mode 100644
index 00000000..257d7f0c
--- /dev/null
+++ b/rsvg/tests/src/text.rs
@@ -0,0 +1,127 @@
+use cairo;
+use float_cmp::approx_eq;
+use rsvg::{CairoRenderer, Loader};
+
+use crate::reference_utils::{Compare, Evaluate, Reference};
+use crate::utils::{load_svg, render_document, setup_font_map, SurfaceSize};
+use crate::{test_compare_render_output, test_svg_reference};
+
+// From https://www.w3.org/Style/CSS/Test/Fonts/Ahem/
+//
+// > The Ahem font was developed by Todd Fahrner and Myles C. Maxfield to
+// > help test writers develop predictable tests. The units per em is 1000,
+// > the ascent is 800, and the descent is 200, thereby making the em
+// > square exactly square. The glyphs for most characters is simply a box
+// > which fills this square. The codepoints mapped to this full square
+// > with a full advance are the following ranges:
+//
+// So, ascent is 4/5 of the font-size, descent is 1/5. Mind the positions below.
+test_compare_render_output!(
+ ahem_font,
+ 500,
+ 500,
+ br##"<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="500" height="500">
+ <text style="font: 50px Ahem;" x="50" y="50" fill="black">abcde</text>
+</svg>"##,
+ br##"<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="500" height="500">
+ <rect x="50" y="10" width="250" height="50" fill="black"/>
+</svg>"##,
+);
+
+test_svg_reference!(
+ text_anchor_chunk_806,
+ "tests/fixtures/text/bug806-text-anchor-chunk.svg",
+ "tests/fixtures/text/bug806-text-anchor-chunk-ref.svg"
+);
+
+test_svg_reference!(
+ span_bounds_when_offset_by_dx,
+ "tests/fixtures/text/span-bounds-when-offset-by-dx.svg",
+ "tests/fixtures/text/span-bounds-when-offset-by-dx-ref.svg"
+);
+
+// FIXME: Ignored because with the change to render all text as paths, the rendering
+// of these is different.
+//
+// test_svg_reference!(
+// tspan_direction_change_804,
+// "tests/fixtures/text/bug804-tspan-direction-change.svg",
+// "tests/fixtures/text/bug804-tspan-direction-change-ref.svg"
+// );
+
+test_svg_reference!(
+ unicode_bidi_override,
+ "tests/fixtures/text/unicode-bidi-override.svg",
+ "tests/fixtures/text/unicode-bidi-override-ref.svg"
+);
+
+test_svg_reference!(
+ display_none,
+ "tests/fixtures/text/display-none.svg",
+ "tests/fixtures/text/display-none-ref.svg"
+);
+
+test_svg_reference!(
+ visibility_hidden,
+ "tests/fixtures/text/visibility-hidden.svg",
+ "tests/fixtures/text/visibility-hidden-ref.svg"
+);
+
+test_svg_reference!(
+ visibility_hidden_x_attr,
+ "tests/fixtures/text/visibility-hidden-x-attr.svg",
+ "tests/fixtures/text/visibility-hidden-ref.svg"
+);
+
+test_svg_reference!(
+ bounds,
+ "tests/fixtures/text/bounds.svg",
+ "tests/fixtures/text/bounds-ref.svg"
+);
+
+fn rect(x: f64, y: f64, width: f64, height: f64) -> cairo::Rectangle {
+ cairo::Rectangle::new(x, y, width, height)
+}
+
+fn rectangle_approx_eq(a: &cairo::Rectangle, b: &cairo::Rectangle) -> bool {
+ // FIXME: this is super fishy; shouldn't we be using 2x the epsilon against the width/height
+ // instead of the raw coordinates?
+ approx_eq!(f64, a.x(), b.x())
+ && approx_eq!(f64, a.y(), b.y())
+ && approx_eq!(f64, a.width(), b.width())
+ && approx_eq!(f64, a.height(), b.height())
+}
+
+// Test that the computed geometry of text layers is as expected.
+#[test]
+fn test_text_layer_geometry() {
+ setup_font_map();
+
+ let handle = Loader::new()
+ .read_path("tests/fixtures/text/bounds.svg")
+ .unwrap_or_else(|e| panic!("could not load: {}", e));
+
+ let renderer = CairoRenderer::new(&handle).test_mode(true);
+
+ let viewport = rect(0.0, 0.0, 600.0, 600.0);
+
+ // tuples of (element_id, ink_rect)
+ let cases = vec![
+ ("#a", rect(50.0, 60.0, 100.0, 50.0)),
+ ("#b", rect(200.0, 60.0, 50.0, 100.0)),
+ ("#c", rect(300.0, 60.0, 50.0, 100.0)),
+ ("#d", rect(400.0, 60.0, 100.0, 50.0)),
+ ];
+
+ for (id, expected_ink_rect) in cases {
+ let (ink_rect, _) = renderer.geometry_for_layer(Some(id), &viewport).unwrap();
+ assert!(
+ rectangle_approx_eq(&ink_rect, &expected_ink_rect),
+ "ink_rect: {:?}, expected: {:?}",
+ ink_rect,
+ expected_ink_rect
+ );
+ }
+}
diff --git a/rsvg/tests/src/utils.rs b/rsvg/tests/src/utils.rs
new file mode 100644
index 00000000..158fc77e
--- /dev/null
+++ b/rsvg/tests/src/utils.rs
@@ -0,0 +1,119 @@
+#![cfg(test)]
+#![allow(unused)]
+
+use cairo;
+use gio;
+use glib;
+use glib::translate::*;
+use libc;
+use std::env;
+use std::ffi::CString;
+use std::sync::Once;
+
+use rsvg::{
+ surface_utils::shared_surface::{SharedImageSurface, SurfaceType},
+ CairoRenderer, Loader, LoadingError, RenderingError, SvgHandle,
+};
+
+pub fn load_svg(input: &'static [u8]) -> Result<SvgHandle, LoadingError> {
+ let bytes = glib::Bytes::from_static(input);
+ let stream = gio::MemoryInputStream::from_bytes(&bytes);
+
+ Loader::new().read_stream(&stream, None::<&gio::File>, None::<&gio::Cancellable>)
+}
+
+#[derive(Copy, Clone)]
+pub struct SurfaceSize(pub i32, pub i32);
+
+pub fn render_document<F: FnOnce(&cairo::Context)>(
+ svg: &SvgHandle,
+ surface_size: SurfaceSize,
+ cr_transform: F,
+ viewport: cairo::Rectangle,
+) -> Result<SharedImageSurface, RenderingError> {
+ let renderer = CairoRenderer::new(svg);
+
+ let SurfaceSize(width, height) = surface_size;
+
+ let output = cairo::ImageSurface::create(cairo::Format::ARgb32, width, height).unwrap();
+
+ let res = {
+ let cr = cairo::Context::new(&output).expect("Failed to create a cairo context");
+ cr_transform(&cr);
+ Ok(renderer.render_document(&cr, &viewport)?)
+ };
+
+ res.and_then(|_| Ok(SharedImageSurface::wrap(output, SurfaceType::SRgb)?))
+}
+
+#[cfg(system_deps_have_pangoft2)]
+mod pango_ft2 {
+ use super::*;
+ use glib::prelude::*;
+ use pangocairo::FontMap;
+
+ extern "C" {
+ // pango_fc_font_map_set_config (PangoFcFontMap *fcfontmap,
+ // FcConfig *fcconfig);
+ // This is not bound in gtk-rs, and PangoFcFontMap is not even exposed, so we'll bind it by hand.
+ fn pango_fc_font_map_set_config(
+ font_map: *mut libc::c_void,
+ config: *mut fontconfig_sys::FcConfig,
+ );
+ }
+
+ pub unsafe fn load_test_fonts() {
+ let font_paths = [
+ "tests/resources/Ahem.ttf",
+ "tests/resources/NotoSansHebrew-Regular.ttf",
+ "tests/resources/Roboto-Regular.ttf",
+ "tests/resources/Roboto-Italic.ttf",
+ "tests/resources/Roboto-Bold.ttf",
+ "tests/resources/Roboto-BoldItalic.ttf",
+ ];
+
+ let config = fontconfig_sys::FcConfigCreate();
+ if fontconfig_sys::FcConfigSetCurrent(config) == 0 {
+ panic!("Could not set a fontconfig configuration");
+ }
+
+ for path in &font_paths {
+ let path_cstring = CString::new(*path).unwrap();
+
+ if fontconfig_sys::FcConfigAppFontAddFile(config, path_cstring.as_ptr() as *const _)
+ == 0
+ {
+ panic!("Could not load font file {} for tests; aborting", path,);
+ }
+ }
+
+ let font_map = FontMap::for_font_type(cairo::FontType::FontTypeFt).unwrap();
+ let raw_font_map: *mut pango::ffi::PangoFontMap = font_map.to_glib_none().0;
+
+ pango_fc_font_map_set_config(raw_font_map as *mut _, config);
+ fontconfig_sys::FcConfigDestroy(config);
+
+ FontMap::set_default(Some(&font_map.downcast::<pangocairo::FontMap>().unwrap()));
+ }
+}
+
+#[cfg(system_deps_have_pangoft2)]
+pub fn setup_font_map() {
+ unsafe {
+ self::pango_ft2::load_test_fonts();
+ }
+}
+
+#[cfg(not(system_deps_have_pangoft2))]
+pub fn setup_font_map() {}
+
+pub fn setup_language() {
+ static ONCE: Once = Once::new();
+
+ ONCE.call_once(|| {
+ // For systemLanguage attribute tests.
+ // The trailing ":" is intentional to test gitlab#425.
+ env::set_var("LANGUAGE", "de:en_US:en:");
+ env::set_var("LC_ALL", "de:en_US:en:");
+ });
+}
diff --git a/rsvg/tests/test-utils.c b/rsvg/tests/test-utils.c
new file mode 100644
index 00000000..128611f4
--- /dev/null
+++ b/rsvg/tests/test-utils.c
@@ -0,0 +1,257 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/* vim: set sw=4 sts=4 ts=4 expandtab: */
+
+#include "config.h"
+#include "test-utils.h"
+
+#include <string.h>
+#include <pango/pango.h>
+#include <pango/pangocairo.h>
+
+#if !PANGO_VERSION_CHECK (1, 44, 0)
+# include <hb.h>
+#endif
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+
+
+/* Compare two buffers, returning the number of pixels that are
+ * different and the maximum difference of any single color channel in
+ * result_ret.
+ *
+ * This function should be rewritten to compare all formats supported by
+ * cairo_format_t instead of taking a mask as a parameter.
+ */
+static void
+buffer_diff_core (unsigned char *_buf_a,
+ unsigned char *_buf_b,
+ unsigned char *_buf_diff,
+ int width,
+ int height,
+ int stride,
+ guint32 mask,
+ TestUtilsBufferDiffResult *result_ret)
+{
+ int x, y;
+ guint32 *row_a, *row_b, *row;
+ TestUtilsBufferDiffResult result = {0, 0};
+ guint32 *buf_a = (guint32 *) _buf_a;
+ guint32 *buf_b = (guint32 *) _buf_b;
+ guint32 *buf_diff = (guint32 *) _buf_diff;
+
+ stride /= sizeof(guint32);
+ for (y = 0; y < height; y++)
+ {
+ row_a = buf_a + y * stride;
+ row_b = buf_b + y * stride;
+ row = buf_diff + y * stride;
+ for (x = 0; x < width; x++)
+ {
+ /* check if the pixels are the same */
+ if ((row_a[x] & mask) != (row_b[x] & mask)) {
+ int channel;
+ guint32 diff_pixel = 0;
+
+ /* calculate a difference value for all 4 channels */
+ for (channel = 0; channel < 4; channel++) {
+ int value_a = (row_a[x] >> (channel*8)) & 0xff;
+ int value_b = (row_b[x] >> (channel*8)) & 0xff;
+ unsigned int diff;
+ diff = abs (value_a - value_b);
+ if (diff > result.max_diff)
+ result.max_diff = diff;
+ diff *= 4; /* emphasize */
+ if (diff)
+ diff += 128; /* make sure it's visible */
+ if (diff > 255)
+ diff = 255;
+ diff_pixel |= diff << (channel*8);
+ }
+
+ result.pixels_changed++;
+ if ((diff_pixel & 0x00ffffff) == 0) {
+ /* alpha only difference, convert to luminance */
+ guint8 alpha = diff_pixel >> 24;
+ diff_pixel = alpha * 0x010101;
+ }
+ row[x] = diff_pixel;
+ } else {
+ row[x] = 0;
+ }
+ row[x] |= 0xff000000; /* Set ALPHA to 100% (opaque) */
+ }
+ }
+
+ *result_ret = result;
+}
+
+void
+test_utils_compare_surfaces (cairo_surface_t *surface_a,
+ cairo_surface_t *surface_b,
+ cairo_surface_t *surface_diff,
+ TestUtilsBufferDiffResult *result)
+{
+ /* Here, we run cairo's old buffer_diff algorithm which looks for
+ * pixel-perfect images.
+ */
+ buffer_diff_core (cairo_image_surface_get_data (surface_a),
+ cairo_image_surface_get_data (surface_b),
+ cairo_image_surface_get_data (surface_diff),
+ cairo_image_surface_get_width (surface_a),
+ cairo_image_surface_get_height (surface_a),
+ cairo_image_surface_get_stride (surface_a),
+ 0xffffffff,
+ result);
+ if (result->pixels_changed == 0)
+ return;
+
+ g_test_message ("%d pixels differ (with maximum difference of %d) from reference image\n",
+ result->pixels_changed, result->max_diff);
+}
+
+/* Copied from gdk_cairo_surface_paint_pixbuf in gdkcairo.c,
+ * we do not want to depend on GDK
+ */
+static void
+test_utils_cairo_surface_paint_pixbuf (cairo_surface_t *surface,
+ const GdkPixbuf *pixbuf)
+{
+ gint width, height;
+ guchar *gdk_pixels, *cairo_pixels;
+ int gdk_rowstride, cairo_stride;
+ int n_channels;
+ int j;
+
+ if (cairo_surface_status (surface) != CAIRO_STATUS_SUCCESS)
+ return;
+
+ /* This function can't just copy any pixbuf to any surface, be
+ * sure to read the invariants here before calling it */
+
+ g_assert (cairo_surface_get_type (surface) == CAIRO_SURFACE_TYPE_IMAGE);
+ g_assert (cairo_image_surface_get_format (surface) == CAIRO_FORMAT_RGB24 ||
+ cairo_image_surface_get_format (surface) == CAIRO_FORMAT_ARGB32);
+ g_assert (cairo_image_surface_get_width (surface) == gdk_pixbuf_get_width (pixbuf));
+ g_assert (cairo_image_surface_get_height (surface) == gdk_pixbuf_get_height (pixbuf));
+
+ cairo_surface_flush (surface);
+
+ width = gdk_pixbuf_get_width (pixbuf);
+ height = gdk_pixbuf_get_height (pixbuf);
+ gdk_pixels = gdk_pixbuf_get_pixels (pixbuf);
+ gdk_rowstride = gdk_pixbuf_get_rowstride (pixbuf);
+ n_channels = gdk_pixbuf_get_n_channels (pixbuf);
+ cairo_stride = cairo_image_surface_get_stride (surface);
+ cairo_pixels = cairo_image_surface_get_data (surface);
+
+ for (j = height; j; j--)
+ {
+ guchar *p = gdk_pixels;
+ guchar *q = cairo_pixels;
+
+ if (n_channels == 3)
+ {
+ guchar *end = p + 3 * width;
+
+ while (p < end)
+ {
+#if G_BYTE_ORDER == G_LITTLE_ENDIAN
+ q[0] = p[2];
+ q[1] = p[1];
+ q[2] = p[0];
+#else
+ q[1] = p[0];
+ q[2] = p[1];
+ q[3] = p[2];
+#endif
+ p += 3;
+ q += 4;
+ }
+ }
+ else
+ {
+ guchar *end = p + 4 * width;
+ guint t1,t2,t3;
+
+#define MULT(d,c,a,t) G_STMT_START { t = c * a + 0x80; d = ((t >> 8) + t) >> 8; } G_STMT_END
+
+ while (p < end)
+ {
+#if G_BYTE_ORDER == G_LITTLE_ENDIAN
+ MULT(q[0], p[2], p[3], t1);
+ MULT(q[1], p[1], p[3], t2);
+ MULT(q[2], p[0], p[3], t3);
+ q[3] = p[3];
+#else
+ q[0] = p[3];
+ MULT(q[1], p[0], p[3], t1);
+ MULT(q[2], p[1], p[3], t2);
+ MULT(q[3], p[2], p[3], t3);
+#endif
+
+ p += 4;
+ q += 4;
+ }
+
+#undef MULT
+ }
+
+ gdk_pixels += gdk_rowstride;
+ cairo_pixels += cairo_stride;
+ }
+
+ cairo_surface_mark_dirty (surface);
+}
+
+cairo_surface_t *
+test_utils_cairo_surface_from_pixbuf (const GdkPixbuf *pixbuf)
+{
+ cairo_surface_t *surface;
+
+ g_return_val_if_fail (GDK_IS_PIXBUF (pixbuf), NULL);
+ g_return_val_if_fail (gdk_pixbuf_get_n_channels (pixbuf) == 4, NULL);
+
+ surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32,
+ gdk_pixbuf_get_width (pixbuf),
+ gdk_pixbuf_get_height (pixbuf));
+
+ test_utils_cairo_surface_paint_pixbuf (surface, pixbuf);
+
+ return surface;
+}
+
+static gchar *data_path = NULL;
+
+const gchar *
+test_utils_get_test_data_path (void)
+{
+ if (data_path)
+ return data_path;
+
+ data_path = g_test_build_filename (G_TEST_DIST, "fixtures", NULL);
+
+ return data_path;
+}
+
+void
+test_utils_print_dependency_versions (void)
+{
+ FT_Library ft_lib;
+ FT_Int ft_major = 0;
+ FT_Int ft_minor = 0;
+ FT_Int ft_patch = 0;
+
+ FT_Init_FreeType (&ft_lib);
+ FT_Library_Version (ft_lib, &ft_major, &ft_minor, &ft_patch);
+ FT_Done_FreeType (ft_lib);
+
+ g_test_message ("Cairo version: %s", cairo_version_string ());
+ g_test_message ("Pango version: %s", pango_version_string ());
+ g_test_message ("Freetype version: %d.%d.%d", ft_major, ft_minor, ft_patch);
+#if PANGO_VERSION_CHECK (1, 44, 0)
+ g_test_message ("Harfbuzz version: %s", hb_version_string ());
+#else
+ g_test_message ("Not printing Harfbuzz version since Pango is older than 1.44");
+#endif
+}
diff --git a/rsvg/tests/test-utils.h b/rsvg/tests/test-utils.h
new file mode 100644
index 00000000..d71af69d
--- /dev/null
+++ b/rsvg/tests/test-utils.h
@@ -0,0 +1,35 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/* vim: set sw=4 sts=4 ts=4 expandtab: */
+
+#ifndef TEST_UTILS_H
+#define TEST_UTILS_H
+
+#include <cairo.h>
+#include <gio/gio.h>
+#include <gdk-pixbuf/gdk-pixbuf.h>
+
+G_BEGIN_DECLS
+
+typedef struct {
+ unsigned int pixels_changed;
+ unsigned int max_diff;
+} TestUtilsBufferDiffResult;
+
+void test_utils_compare_surfaces (cairo_surface_t *surface_a,
+ cairo_surface_t *surface_b,
+ cairo_surface_t *surface_diff,
+ TestUtilsBufferDiffResult *result);
+
+cairo_surface_t *test_utils_cairo_surface_from_pixbuf (const GdkPixbuf *pixbuf);
+
+typedef gboolean (* AddTestFunc) (GFile *file);
+
+const gchar *test_utils_get_test_data_path (void);
+
+void test_utils_print_dependency_versions (void);
+
+void test_utils_setup_font_map (void);
+
+G_END_DECLS
+
+#endif /* TEST_UTILS_H */