summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFederico Mena Quintero <federico@gnome.org>2022-10-24 13:03:14 -0500
committerFederico Mena Quintero <federico@gnome.org>2022-11-04 08:44:28 -0600
commitae78d13d6cb3fb4998e3d1b65727c4cae4a3f174 (patch)
tree747d902befd254536bf388b895a64dbb13aad3bf
parentf0b14e5bb219e640630535c83cb9a818d18384d3 (diff)
downloadlibrsvg-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.rs21
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,