summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Borelli <pborelli@gnome.org>2019-06-30 16:41:48 +0200
committerPaolo Borelli <pborelli@gnome.org>2019-06-30 16:42:38 +0200
commit86d76d9bc79eefe6cac8e31bfaedaa394d6bd23a (patch)
treed9fcc00f2930816c63491341aa60d91cc95bf078
parent1012e1d3f4e0767fa7dbbba43e7d5e1a695c125b (diff)
downloadlibrsvg-86d76d9bc79eefe6cac8e31bfaedaa394d6bd23a.tar.gz
filters/displacement_map: remove interior mutability
-rw-r--r--rsvg_internals/src/filters/displacement_map.rs48
1 files changed, 19 insertions, 29 deletions
diff --git a/rsvg_internals/src/filters/displacement_map.rs b/rsvg_internals/src/filters/displacement_map.rs
index a47c6d07..38efd82b 100644
--- a/rsvg_internals/src/filters/displacement_map.rs
+++ b/rsvg_internals/src/filters/displacement_map.rs
@@ -1,5 +1,3 @@
-use std::cell::{Cell, RefCell};
-
use cairo::{self, ImageSurface, MatrixTrait};
use markup5ever::{local_name, LocalName};
@@ -25,10 +23,10 @@ enum ColorChannel {
/// The `feDisplacementMap` filter primitive.
pub struct DisplacementMap {
base: PrimitiveWithInput,
- in2: RefCell<Option<Input>>,
- scale: Cell<f64>,
- x_channel_selector: Cell<ColorChannel>,
- y_channel_selector: Cell<ColorChannel>,
+ in2: Option<Input>,
+ scale: f64,
+ x_channel_selector: ColorChannel,
+ y_channel_selector: ColorChannel,
}
impl Default for DisplacementMap {
@@ -37,10 +35,10 @@ impl Default for DisplacementMap {
fn default() -> DisplacementMap {
DisplacementMap {
base: PrimitiveWithInput::new::<Self>(),
- in2: RefCell::new(None),
- scale: Cell::new(0.0),
- x_channel_selector: Cell::new(ColorChannel::A),
- y_channel_selector: Cell::new(ColorChannel::A),
+ in2: None,
+ scale: 0.0,
+ x_channel_selector: ColorChannel::A,
+ y_channel_selector: ColorChannel::A,
}
}
}
@@ -53,18 +51,14 @@ impl NodeTrait for DisplacementMap {
for (attr, value) in pbag.iter() {
match attr {
- local_name!("in2") => {
- self.in2.replace(Some(Input::parse(attr, value)?));
+ local_name!("in2") => self.in2 = Some(Input::parse(attr, value)?),
+ local_name!("scale") => self.scale = parsers::number(value).attribute(attr)?,
+ local_name!("xChannelSelector") => {
+ self.x_channel_selector = ColorChannel::parse(attr, value)?
+ }
+ local_name!("yChannelSelector") => {
+ self.y_channel_selector = ColorChannel::parse(attr, value)?
}
- local_name!("scale") => self.scale.set(
- parsers::number(value).attribute(attr)?,
- ),
- local_name!("xChannelSelector") => self
- .x_channel_selector
- .set(ColorChannel::parse(attr, value)?),
- local_name!("yChannelSelector") => self
- .y_channel_selector
- .set(ColorChannel::parse(attr, value)?),
_ => (),
}
}
@@ -81,7 +75,7 @@ impl Filter for DisplacementMap {
draw_ctx: &mut DrawingCtx,
) -> Result<FilterResult, FilterError> {
let input = self.base.get_input(ctx, draw_ctx)?;
- let displacement_input = ctx.get_input(draw_ctx, self.in2.borrow().as_ref())?;
+ let displacement_input = ctx.get_input(draw_ctx, self.in2.as_ref())?;
let bounds = self
.base
.get_bounds(ctx)
@@ -92,11 +86,7 @@ impl Filter for DisplacementMap {
// Displacement map's values need to be non-premultiplied.
let displacement_surface = displacement_input.surface().unpremultiply(bounds)?;
- let scale = self.scale.get();
- let (sx, sy) = ctx.paffine().transform_distance(scale, scale);
-
- let x_channel = self.x_channel_selector.get();
- let y_channel = self.y_channel_selector.get();
+ let (sx, sy) = ctx.paffine().transform_distance(self.scale, self.scale);
let output_surface = ImageSurface::create(
cairo::Format::ARgb32,
@@ -117,8 +107,8 @@ impl Filter for DisplacementMap {
let process = |x| f64::from(x) / 255.0 - 0.5;
- let dx = process(get_value(x_channel));
- let dy = process(get_value(y_channel));
+ let dx = process(get_value(self.x_channel_selector));
+ let dy = process(get_value(self.y_channel_selector));
let x = f64::from(x);
let y = f64::from(y);