@@ -22,12 +22,23 @@ DirectionalGaussianBlurFilterContents::DirectionalGaussianBlurFilterContents() =
2222DirectionalGaussianBlurFilterContents::
2323 ~DirectionalGaussianBlurFilterContents () = default ;
2424
25- void DirectionalGaussianBlurFilterContents::SetBlurVector (Vector2 blur_vector) {
26- if (blur_vector.GetLengthSquared () < kEhCloseEnough ) {
27- blur_vector_ = Vector2 (0 , kEhCloseEnough );
25+ void DirectionalGaussianBlurFilterContents::SetSigma (Sigma sigma) {
26+ if (sigma.sigma < kEhCloseEnough ) {
27+ // This cutoff is an implementation detail of the blur that's tied to the
28+ // fragment shader. When the blur is set to 0, having a value slightly above
29+ // zero makes the shader do 1 finite sample to pass the image through with
30+ // no blur (while retaining correct alpha mask behavior).
31+ blur_sigma_ = Sigma{kEhCloseEnough };
2832 return ;
2933 }
30- blur_vector_ = blur_vector;
34+ blur_sigma_ = sigma;
35+ }
36+
37+ void DirectionalGaussianBlurFilterContents::SetDirection (Vector2 direction) {
38+ blur_direction_ = direction.Normalize ();
39+ if (blur_direction_.IsZero ()) {
40+ blur_direction_ = Vector2 (0 , 1 );
41+ }
3142}
3243
3344void DirectionalGaussianBlurFilterContents::SetBlurStyle (BlurStyle blur_style) {
@@ -93,8 +104,8 @@ bool DirectionalGaussianBlurFilterContents::RenderFilter(
93104 return false ;
94105 }
95106
96- auto transformed_blur =
97- entity. GetTransformation (). TransformDirection (blur_vector_ );
107+ auto transformed_blur = entity. GetTransformation (). TransformDirection (
108+ blur_direction_ * blur_sigma_. sigma );
98109
99110 // LTRB
100111 Scalar uv[4 ] = {
@@ -142,7 +153,8 @@ bool DirectionalGaussianBlurFilterContents::RenderFilter(
142153
143154 VS::FrameInfo frame_info;
144155 frame_info.texture_size = Point (input_bounds->size );
145- frame_info.blur_radius = transformed_blur.GetLength ();
156+ frame_info.blur_sigma = transformed_blur.GetLength ();
157+ frame_info.blur_radius = Radius{Sigma{frame_info.blur_sigma }}.radius ;
146158 frame_info.blur_direction = transformed_blur.Normalize ();
147159 frame_info.src_factor = src_color_factor_;
148160 frame_info.inner_blur_factor = inner_blur_factor_;
@@ -174,10 +186,14 @@ std::optional<Rect> DirectionalGaussianBlurFilterContents::GetCoverage(
174186 return std::nullopt ;
175187 }
176188
177- auto transformed_blur =
178- entity.GetTransformation ().TransformDirection (blur_vector_).Abs ();
179- auto extent = bounds->size + transformed_blur * 2 ;
180- return Rect (bounds->origin - transformed_blur, Size (extent.x , extent.y ));
189+ auto transformed_blur_vector =
190+ entity.GetTransformation ()
191+ .TransformDirection (blur_direction_ *
192+ ceil (Radius{blur_sigma_}.radius ))
193+ .Abs ();
194+ auto extent = bounds->size + transformed_blur_vector * 2 ;
195+ return Rect (bounds->origin - transformed_blur_vector,
196+ Size (extent.x , extent.y ));
181197}
182198
183199} // namespace impeller
0 commit comments