diff options
Diffstat (limited to 'components/canvas/raqote_backend.rs')
-rw-r--r-- | components/canvas/raqote_backend.rs | 49 |
1 files changed, 42 insertions, 7 deletions
diff --git a/components/canvas/raqote_backend.rs b/components/canvas/raqote_backend.rs index 4bc4eae49fb..a7cf3bd1023 100644 --- a/components/canvas/raqote_backend.rs +++ b/components/canvas/raqote_backend.rs @@ -310,7 +310,12 @@ impl GenericDrawTarget for raqote::DrawTarget { ), ); - self.fill(&pb.finish(), &source, draw_options.as_raqote()); + GenericDrawTarget::fill( + self, + &Path::Raqote(pb.finish()), + Pattern::Raqote(source), + draw_options, + ); } fn draw_surface_with_shadow( &self, @@ -324,11 +329,36 @@ impl GenericDrawTarget for raqote::DrawTarget { warn!("no support for drawing shadows"); } fn fill(&mut self, path: &Path, pattern: Pattern, draw_options: &DrawOptions) { - self.fill( - path.as_raqote(), - pattern.as_raqote(), - draw_options.as_raqote(), - ); + match draw_options.as_raqote().blend_mode { + raqote::BlendMode::Src => { + self.clear(raqote::SolidSource::from_unpremultiplied_argb(0, 0, 0, 0)); + self.fill( + path.as_raqote(), + pattern.as_raqote(), + draw_options.as_raqote(), + ); + }, + raqote::BlendMode::DstIn | + raqote::BlendMode::DstAtop | + raqote::BlendMode::SrcIn | + raqote::BlendMode::SrcOut => { + self.push_layer(1.); + self.clear(raqote::SolidSource::from_unpremultiplied_argb(0, 0, 0, 0)); + self.fill( + path.as_raqote(), + pattern.as_raqote(), + draw_options.as_raqote(), + ); + self.pop_layer(); + }, + _ => { + self.fill( + path.as_raqote(), + pattern.as_raqote(), + draw_options.as_raqote(), + ); + }, + } } fn fill_rect( &mut self, @@ -349,7 +379,12 @@ impl GenericDrawTarget for raqote::DrawTarget { raqote::DrawOptions::new() }; - raqote::DrawTarget::fill(self, &pb.finish(), pattern.as_raqote(), &draw_options); + GenericDrawTarget::fill( + self, + &Path::Raqote(pb.finish()), + pattern, + &DrawOptions::Raqote(draw_options), + ); } fn get_format(&self) -> SurfaceFormat { SurfaceFormat::Raqote(()) |