@@ -74,6 +74,9 @@ Vector2 ExtractScale(const Matrix& matrix) {
7474struct BlurInfo {
7575 // / The scalar that is used to get from source space to unrotated local space.
7676 Vector2 source_space_scalar;
77+ // / The translation that is used to get from source space to unrotated local
78+ // / space.
79+ Vector2 source_space_offset;
7780 // / Sigma when considering an entity's scale and the effect transform.
7881 Vector2 scaled_sigma;
7982 // / Blur radius in source pixels based on scaled_sigma.
@@ -95,6 +98,8 @@ BlurInfo CalculateBlurInfo(const Entity& entity,
9598 // applied to the result of the blur as part of the result's transform.
9699 const Vector2 source_space_scalar =
97100 ExtractScale (entity.GetTransform ().Basis ());
101+ const Vector2 source_space_offset =
102+ Vector2 (entity.GetTransform ().m [12 ], entity.GetTransform ().m [13 ]);
98103
99104 Vector2 scaled_sigma =
100105 (effect_transform.Basis () * Matrix::MakeScale (source_space_scalar) * //
@@ -110,6 +115,7 @@ BlurInfo CalculateBlurInfo(const Entity& entity,
110115 (Matrix::MakeScale (source_space_scalar) * padding).Abs ();
111116 return {
112117 .source_space_scalar = source_space_scalar,
118+ .source_space_offset = source_space_offset,
113119 .scaled_sigma = scaled_sigma,
114120 .blur_radius = blur_radius,
115121 .padding = padding,
@@ -545,7 +551,8 @@ Entity ApplyBlurStyle(FilterContents::BlurStyle blur_style,
545551 const Snapshot& input_snapshot,
546552 Entity blur_entity,
547553 const Geometry* geometry,
548- Vector2 source_space_scalar) {
554+ Vector2 source_space_scalar,
555+ Vector2 source_space_offset) {
549556 switch (blur_style) {
550557 case FilterContents::BlurStyle::kNormal :
551558 return blur_entity;
@@ -563,9 +570,11 @@ Entity ApplyBlurStyle(FilterContents::BlurStyle blur_style,
563570 Entity::FromSnapshot (input_snapshot, entity.GetBlendMode ());
564571 Entity result;
565572 Matrix blurred_transform = blur_entity.GetTransform ();
566- Matrix snapshot_transform = entity.GetTransform () * //
567- Matrix::MakeScale (1 .f / source_space_scalar) *
568- input_snapshot.transform ;
573+ Matrix snapshot_transform =
574+ entity.GetTransform () * //
575+ Matrix::MakeScale (1 .f / source_space_scalar) *
576+ Matrix::MakeTranslation (-1 * source_space_offset) *
577+ input_snapshot.transform ;
569578 result.SetContents (Contents::MakeAnonymous (
570579 fml::MakeCopyable ([blur_entity = blur_entity.Clone (),
571580 blurred_transform, snapshot_transform,
@@ -697,11 +706,13 @@ std::optional<Entity> GaussianBlurFilterContents::RenderFilter(
697706
698707 Entity snapshot_entity = entity.Clone ();
699708 snapshot_entity.SetTransform (
709+ Matrix::MakeTranslation (blur_info.source_space_offset ) *
700710 Matrix::MakeScale (blur_info.source_space_scalar ));
701711
702712 std::optional<Rect> source_expanded_coverage_hint;
703713 if (expanded_coverage_hint.has_value ()) {
704714 source_expanded_coverage_hint = expanded_coverage_hint->TransformBounds (
715+ Matrix::MakeTranslation (blur_info.source_space_offset ) *
705716 Matrix::MakeScale (blur_info.source_space_scalar ) *
706717 entity.GetTransform ().Invert ());
707718 }
@@ -717,9 +728,11 @@ std::optional<Entity> GaussianBlurFilterContents::RenderFilter(
717728 Entity result =
718729 Entity::FromSnapshot (input_snapshot.value (),
719730 entity.GetBlendMode ()); // No blur to render.
720- result.SetTransform (entity.GetTransform () *
721- Matrix::MakeScale (1 .f / blur_info.source_space_scalar ) *
722- input_snapshot->transform );
731+ result.SetTransform (
732+ entity.GetTransform () *
733+ Matrix::MakeScale (1 .f / blur_info.source_space_scalar ) *
734+ Matrix::MakeTranslation (-1 * blur_info.source_space_offset ) *
735+ input_snapshot->transform );
723736 return result;
724737 }
725738
@@ -827,15 +840,17 @@ std::optional<Entity> GaussianBlurFilterContents::RenderFilter(
827840 .transform =
828841 entity.GetTransform () * //
829842 Matrix::MakeScale (1 .f / blur_info.source_space_scalar ) * //
830- downsample_pass_args.transform * //
843+ Matrix::MakeTranslation (-1 * blur_info.source_space_offset ) *
844+ downsample_pass_args.transform * //
831845 Matrix::MakeScale (1 / downsample_pass_args.effective_scalar ),
832846 .sampler_descriptor = sampler_desc,
833847 .opacity = input_snapshot->opacity },
834848 entity.GetBlendMode ());
835849
836850 return ApplyBlurStyle (mask_blur_style_, entity, inputs[0 ],
837851 input_snapshot.value (), std::move (blur_output_entity),
838- mask_geometry_, blur_info.source_space_scalar );
852+ mask_geometry_, blur_info.source_space_scalar ,
853+ blur_info.source_space_offset );
839854}
840855
841856Scalar GaussianBlurFilterContents::CalculateBlurRadius (Scalar sigma) {
0 commit comments