diff options
author | Federico Mena Quintero <federico@gnome.org> | 2022-10-24 13:03:14 -0500 |
---|---|---|
committer | Federico Mena Quintero <federico@gnome.org> | 2022-11-04 08:44:28 -0600 |
commit | ae78d13d6cb3fb4998e3d1b65727c4cae4a3f174 (patch) | |
tree | 747d902befd254536bf388b895a64dbb13aad3bf | |
parent | f0b14e5bb219e640630535c83cb9a818d18384d3 (diff) | |
download | librsvg-ae78d13d6cb3fb4998e3d1b65727c4cae4a3f174.tar.gz |
feTurbulence: check the baseFrequency at render time, not at parse time
This lets use set_attribute() as for the other attributes.
Part-of: <https://gitlab.gnome.org/GNOME/librsvg/-/merge_requests/763>
-rw-r--r-- | src/filters/turbulence.rs | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/src/filters/turbulence.rs b/src/filters/turbulence.rs index 7919bbcb..73533a8f 100644 --- a/src/filters/turbulence.rs +++ b/src/filters/turbulence.rs @@ -6,7 +6,7 @@ use crate::drawing_ctx::DrawingCtx; use crate::element::{set_attribute, ElementResult, SetAttributes}; use crate::error::*; use crate::node::{CascadedValues, Node}; -use crate::parsers::{NonNegative, NumberOptionalNumber, Parse, ParseValue}; +use crate::parsers::{NumberOptionalNumber, Parse, ParseValue}; use crate::properties::ColorInterpolationFilters; use crate::rect::IRect; use crate::session::Session; @@ -51,7 +51,7 @@ pub struct FeTurbulence { /// Resolved `feTurbulence` primitive for rendering. #[derive(Clone)] pub struct Turbulence { - base_frequency: (f64, f64), + base_frequency: NumberOptionalNumber<f64>, num_octaves: i32, seed: f64, stitch_tiles: StitchTiles, @@ -64,7 +64,7 @@ impl Default for Turbulence { #[inline] fn default() -> Turbulence { Turbulence { - base_frequency: (0.0, 0.0), + base_frequency: NumberOptionalNumber(0.0, 0.0), num_octaves: 1, seed: 0.0, stitch_tiles: Default::default(), @@ -81,8 +81,7 @@ impl SetAttributes for FeTurbulence { for (attr, value) in attrs.iter() { match attr.expanded() { expanded_name!("", "baseFrequency") => { - let NumberOptionalNumber(NonNegative(x), NonNegative(y)) = attr.parse(value)?; - self.params.base_frequency = (x, y); + 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); @@ -358,9 +357,19 @@ impl Turbulence { 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, - self.base_frequency, + base_frequency, self.num_octaves, self.type_, self.stitch_tiles, |