@@ -22,12 +22,23 @@ DirectionalGaussianBlurFilterContents::DirectionalGaussianBlurFilterContents() =
22
22
DirectionalGaussianBlurFilterContents::
23
23
~DirectionalGaussianBlurFilterContents () = default ;
24
24
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 };
28
32
return ;
29
33
}
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
+ }
31
42
}
32
43
33
44
void DirectionalGaussianBlurFilterContents::SetBlurStyle (BlurStyle blur_style) {
@@ -93,8 +104,8 @@ bool DirectionalGaussianBlurFilterContents::RenderFilter(
93
104
return false ;
94
105
}
95
106
96
- auto transformed_blur =
97
- entity. GetTransformation (). TransformDirection (blur_vector_ );
107
+ auto transformed_blur = entity. GetTransformation (). TransformDirection (
108
+ blur_direction_ * blur_sigma_. sigma );
98
109
99
110
// LTRB
100
111
Scalar uv[4 ] = {
@@ -142,7 +153,8 @@ bool DirectionalGaussianBlurFilterContents::RenderFilter(
142
153
143
154
VS::FrameInfo frame_info;
144
155
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 ;
146
158
frame_info.blur_direction = transformed_blur.Normalize ();
147
159
frame_info.src_factor = src_color_factor_;
148
160
frame_info.inner_blur_factor = inner_blur_factor_;
@@ -174,10 +186,14 @@ std::optional<Rect> DirectionalGaussianBlurFilterContents::GetCoverage(
174
186
return std::nullopt;
175
187
}
176
188
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 ));
181
197
}
182
198
183
199
} // namespace impeller
0 commit comments