370 lines
12 KiB
Rust
370 lines
12 KiB
Rust
use rsvg::test_utils::reference_utils::{Compare, Evaluate, Reference};
|
|
use rsvg::test_utils::{SurfaceSize, load_svg, render_document};
|
|
use rsvg::{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"
|
|
);
|