diff --git a/components/canvas/raqote_backend.rs b/components/canvas/raqote_backend.rs index 10d7fd47a4f..b2849219e29 100644 --- a/components/canvas/raqote_backend.rs +++ b/components/canvas/raqote_backend.rs @@ -124,6 +124,17 @@ pub enum Pattern<'a> { Surface(SurfacePattern<'a>), } +impl<'a> Pattern<'a> { + fn set_transform(&mut self, transform: Transform2D) { + match self { + Pattern::Surface(pattern) => pattern.set_transform(transform), + Pattern::LinearGradient(..) | Pattern::RadialGradient(..) | Pattern::Color(..) => { + warn!("transform not supported") + }, + } + } +} + #[derive(Clone)] pub struct LinearGradientPattern { gradient: raqote::Gradient, @@ -174,6 +185,7 @@ pub struct SurfacePattern<'a> { filter: raqote::FilterMode, extend: raqote::ExtendMode, repeat: Repetition, + transform: Transform2D, } impl<'a> SurfacePattern<'a> { @@ -189,8 +201,12 @@ impl<'a> SurfacePattern<'a> { filter: filter, extend: extend, repeat: repeat, + transform: Transform2D::identity(), } } + fn set_transform(&mut self, transform: Transform2D) { + self.transform = transform; + } } #[derive(Clone)] @@ -240,7 +256,7 @@ impl canvas_data::Pattern<'_> { pattern.image, pattern.extend, pattern.filter, - Transform2D::identity(), + pattern.transform, ), }, } @@ -426,6 +442,20 @@ impl GenericDrawTarget for raqote::DrawTarget { ) }, }; + + let mut pattern = Pattern::Surface(SurfacePattern::new( + image, + filter.to_raqote(), + Repetition::NoRepeat, + )); + let transform = + raqote::Transform::create_translation(-dest.origin.x as f32, -dest.origin.y as f32) + .post_scale( + image.width as f32 / dest.size.width as f32, + image.height as f32 / dest.size.height as f32, + ); + pattern.set_transform(transform); + let mut pb = raqote::PathBuilder::new(); pb.rect( dest.origin.x as f32, @@ -433,11 +463,7 @@ impl GenericDrawTarget for raqote::DrawTarget { dest.size.width as f32, dest.size.height as f32, ); - let pattern = Pattern::Surface(SurfacePattern::new( - image, - filter.to_raqote(), - Repetition::NoRepeat, - )); + GenericDrawTarget::fill( self, &Path::Raqote(pb.finish()),