summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorFederico Mena Quintero <federico@gnome.org>2022-10-21 19:20:35 -0500
committerFederico Mena Quintero <federico@gnome.org>2022-11-04 08:44:28 -0600
commit9ebf36b644803cb9d937c2b3673a2434c7818dcf (patch)
tree63309101b109aa7744049f70c83c799ee15d9825 /src
parentf13872e413c326dc24eacb36863da804645c554a (diff)
downloadlibrsvg-9ebf36b644803cb9d937c2b3673a2434c7818dcf.tar.gz
filters/lighting.rs: check the kernelUnitLength at render time, not at parse time
The parsing code is horrible; we'll refactor it soon. Part-of: <https://gitlab.gnome.org/GNOME/librsvg/-/merge_requests/763>
Diffstat (limited to 'src')
-rw-r--r--src/filters/lighting.rs31
1 files changed, 27 insertions, 4 deletions
diff --git a/src/filters/lighting.rs b/src/filters/lighting.rs
index 7ba499f6..ea7e3188 100644
--- a/src/filters/lighting.rs
+++ b/src/filters/lighting.rs
@@ -369,8 +369,16 @@ impl SetAttributes for FeDiffuseLighting {
set_attribute(&mut self.params.surface_scale, attr.parse(value), session);
}
expanded_name!("", "kernelUnitLength") => {
- let NumberOptionalNumber(NonNegative(x), NonNegative(y)) = attr.parse(value)?;
- self.params.kernel_unit_length = Some((x, y));
+ 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") => {
let NonNegative(c) = attr.parse(value)?;
@@ -414,8 +422,16 @@ impl SetAttributes for FeSpecularLighting {
set_attribute(&mut self.params.surface_scale, attr.parse(value), session);
}
expanded_name!("", "kernelUnitLength") => {
- let NumberOptionalNumber(NonNegative(x), NonNegative(y)) = attr.parse(value)?;
- self.params.kernel_unit_length = Some((x, y));
+ 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") => {
let NonNegative(c) = attr.parse(value)?;
@@ -492,6 +508,13 @@ macro_rules! impl_lighting_filter {
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();