diff options
author | pylbrecht <palbrecht@mailbox.org> | 2019-11-30 21:21:07 +0100 |
---|---|---|
committer | pylbrecht <palbrecht@mailbox.org> | 2019-12-17 19:52:00 +0100 |
commit | 47ee2729ecaab55dfa9a3379feda435ab48692d6 (patch) | |
tree | 2e906076f204ad9d6517d6193c42f690c1bea644 /components/canvas/raqote_backend.rs | |
parent | 4d4e68ca6b97deb5699b00a1d40f462de160ca74 (diff) | |
download | servo-47ee2729ecaab55dfa9a3379feda435ab48692d6.tar.gz servo-47ee2729ecaab55dfa9a3379feda435ab48692d6.zip |
Make fill() draw uncovered pixels as (0,0,0,0) for certain composition ops
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(()) |