diff options
author | Federico Mena Quintero <federico@gnome.org> | 2022-10-21 19:20:35 -0500 |
---|---|---|
committer | Federico Mena Quintero <federico@gnome.org> | 2022-11-04 08:44:28 -0600 |
commit | 9ebf36b644803cb9d937c2b3673a2434c7818dcf (patch) | |
tree | 63309101b109aa7744049f70c83c799ee15d9825 /src | |
parent | f13872e413c326dc24eacb36863da804645c554a (diff) | |
download | librsvg-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.rs | 31 |
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(); |