summaryrefslogtreecommitdiff
path: root/rsvg_internals/src/filters/blend.rs
diff options
context:
space:
mode:
Diffstat (limited to 'rsvg_internals/src/filters/blend.rs')
-rw-r--r--rsvg_internals/src/filters/blend.rs57
1 files changed, 12 insertions, 45 deletions
diff --git a/rsvg_internals/src/filters/blend.rs b/rsvg_internals/src/filters/blend.rs
index 8f1a401f..a5b47b76 100644
--- a/rsvg_internals/src/filters/blend.rs
+++ b/rsvg_internals/src/filters/blend.rs
@@ -1,6 +1,6 @@
use std::cell::{Cell, RefCell};
-use cairo::{self, ImageSurface};
+use cairo;
use attributes::Attribute;
use error::NodeError;
@@ -8,8 +8,6 @@ use handle::RsvgHandle;
use node::{NodeResult, NodeTrait, RsvgCNodeImpl, RsvgNode};
use parsers::ParseError;
use property_bag::PropertyBag;
-use srgb::{linearize_surface, unlinearize_surface};
-use state::ColorInterpolationFilters;
use surface_utils::shared_surface::SharedImageSurface;
use super::context::{FilterContext, FilterOutput, FilterResult};
@@ -74,7 +72,7 @@ impl NodeTrait for Blend {
}
impl Filter for Blend {
- fn render(&self, node: &RsvgNode, ctx: &FilterContext) -> Result<FilterResult, FilterError> {
+ fn render(&self, _node: &RsvgNode, ctx: &FilterContext) -> Result<FilterResult, FilterError> {
let input = make_result(self.base.get_input(ctx))?;
let input_2 = make_result(ctx.get_input(self.in2.borrow().as_ref()))?;
let bounds = self
@@ -84,35 +82,10 @@ impl Filter for Blend {
.add_input(&input_2)
.into_irect();
- let cascaded = node.get_cascaded_values();
- let values = cascaded.get();
-
- let input_surface =
- if values.color_interpolation_filters == ColorInterpolationFilters::LinearRgb {
- SharedImageSurface::new(
- linearize_surface(input.surface(), bounds)
- .map_err(FilterError::BadInputSurfaceStatus)?,
- ).unwrap()
- } else {
- input.surface().clone()
- };
-
- let input_2_surface =
- if values.color_interpolation_filters == ColorInterpolationFilters::LinearRgb {
- SharedImageSurface::new(
- linearize_surface(input_2.surface(), bounds)
- .map_err(FilterError::BadInputSurfaceStatus)?,
- ).unwrap()
- } else {
- input_2.surface().clone()
- };
-
- let output_surface = ImageSurface::create(
- cairo::Format::ARgb32,
- ctx.source_graphic().width(),
- ctx.source_graphic().height(),
- ).map_err(FilterError::OutputSurfaceCreation)?;
-
+ let output_surface = input_2
+ .surface()
+ .copy_surface(bounds)
+ .map_err(FilterError::OutputSurfaceCreation)?;
{
let cr = cairo::Context::new(&output_surface);
cr.rectangle(
@@ -123,22 +96,11 @@ impl Filter for Blend {
);
cr.clip();
- input_2_surface.set_as_source_surface(&cr, 0f64, 0f64);
- cr.paint();
-
- input_surface.set_as_source_surface(&cr, 0f64, 0f64);
+ input.surface().set_as_source_surface(&cr, 0f64, 0f64);
cr.set_operator(self.mode.get().into());
cr.paint();
}
- let output_surface =
- if values.color_interpolation_filters == ColorInterpolationFilters::LinearRgb {
- unlinearize_surface(&SharedImageSurface::new(output_surface).unwrap(), bounds)
- .map_err(FilterError::OutputSurfaceCreation)?
- } else {
- output_surface
- };
-
Ok(FilterResult {
name: self.base.result.borrow().clone(),
output: FilterOutput {
@@ -147,6 +109,11 @@ impl Filter for Blend {
},
})
}
+
+ #[inline]
+ fn is_affected_by_color_interpolation_filters() -> bool {
+ true
+ }
}
impl Mode {