From 9ebf36b644803cb9d937c2b3673a2434c7818dcf Mon Sep 17 00:00:00 2001 From: Federico Mena Quintero Date: Fri, 21 Oct 2022 19:20:35 -0500 Subject: 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: --- src/filters/lighting.rs | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) (limited to 'src') 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, _> = 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, _> = 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(); -- cgit v1.2.1