diff options
Diffstat (limited to 'rsvg_internals/src/filters/blend.rs')
-rw-r--r-- | rsvg_internals/src/filters/blend.rs | 57 |
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 { |