@@ -210,30 +210,39 @@ Entity ApplyClippedBlurStyle(Entity::ClipOperation clip_operation,
210210 const Snapshot& input_snapshot,
211211 Entity blur_entity,
212212 const std::shared_ptr<Geometry>& geometry) {
213- auto shared_blur_entity = std::make_shared<Entity>( std::move (blur_entity) );
214- shared_blur_entity-> SetNewClipDepth (entity. GetNewClipDepth () );
215- auto clipper = std::make_unique<ClipContents>( );
216- clipper-> SetClipOperation (clip_operation) ;
217- clipper-> SetGeometry (geometry );
213+ auto clip_contents = std::make_shared<ClipContents>( );
214+ clip_contents-> SetClipOperation (clip_operation );
215+ clip_contents-> SetGeometry (geometry );
216+ Entity clipper;
217+ clipper. SetContents (clip_contents );
218218 auto restore = std::make_unique<ClipRestoreContents>();
219- Entity result ;
220- result. SetTransform (entity. GetTransform () );
221- result. SetContents ( Contents::MakeAnonymous (
222- fml::MakeCopyable ([shared_blur_entity , clipper = std::move (clipper),
223- restore = std::move (restore)](
224- const ContentContext& renderer ,
225- const Entity& entity, RenderPass& pass) mutable {
219+ Matrix entity_transform = entity. GetTransform () ;
220+ Matrix blur_transform = blur_entity. GetTransform ();
221+ auto renderer = fml::MakeCopyable (
222+ [blur_entity = blur_entity. Clone () , clipper = std::move (clipper),
223+ restore = std::move (restore), entity_transform,
224+ blur_transform]( const ContentContext& renderer, const Entity& entity ,
225+ RenderPass& pass) mutable {
226226 bool result = true ;
227- result = clipper->Render (renderer, entity, pass) && result;
228- result = shared_blur_entity->Render (renderer, pass) && result;
227+ clipper.SetNewClipDepth (entity.GetNewClipDepth ());
228+ clipper.SetTransform (entity.GetTransform () * entity_transform);
229+ result = clipper.Render (renderer, pass) && result;
230+ blur_entity.SetNewClipDepth (entity.GetNewClipDepth ());
231+ blur_entity.SetTransform (entity.GetTransform () * blur_transform);
232+ result = blur_entity.Render (renderer, pass) && result;
229233 if constexpr (!ContentContext::kEnableStencilThenCover ) {
230234 result = restore->Render (renderer, entity, pass) && result;
231235 }
232236 return result;
233- }),
234- [shared_blur_entity](const Entity& entity) {
235- return shared_blur_entity->GetCoverage ();
236- }));
237+ });
238+ auto coverage =
239+ fml::MakeCopyable ([blur_entity = std::move (blur_entity),
240+ blur_transform](const Entity& entity) mutable {
241+ blur_entity.SetTransform (entity.GetTransform () * blur_transform);
242+ return blur_entity.GetCoverage ();
243+ });
244+ Entity result;
245+ result.SetContents (Contents::MakeAnonymous (renderer, coverage));
237246 return result;
238247}
239248
@@ -256,24 +265,33 @@ Entity ApplyBlurStyle(FilterContents::BlurStyle blur_style,
256265 input, input_snapshot,
257266 std::move (blur_entity), geometry);
258267 case FilterContents::BlurStyle::kSolid : {
259- Entity blurred = ApplyClippedBlurStyle (Entity::ClipOperation::kIntersect ,
260- entity, input, input_snapshot,
261- std::move (blur_entity), geometry);
262268 Entity snapshot_entity = Entity::FromSnapshot (
263269 input_snapshot, entity.GetBlendMode (), entity.GetClipDepth ());
264270 Entity result;
265- std::optional<Rect> coverage = blurred.GetCoverage ();
271+ Matrix blurred_transform = blur_entity.GetTransform ();
272+ Matrix snapshot_transform = snapshot_entity.GetTransform ();
266273 result.SetContents (Contents::MakeAnonymous (
267- fml::MakeCopyable ([blurred = std::move (blurred),
274+ fml::MakeCopyable ([blur_entity = blur_entity.Clone (),
275+ blurred_transform, snapshot_transform,
268276 snapshot_entity = std::move (snapshot_entity)](
269277 const ContentContext& renderer,
270278 const Entity& entity,
271279 RenderPass& pass) mutable {
272- return blurred.Render (renderer, pass) &&
273- snapshot_entity.Render (renderer, pass);
280+ bool result = true ;
281+ blur_entity.SetNewClipDepth (entity.GetNewClipDepth ());
282+ blur_entity.SetTransform (entity.GetTransform () * blurred_transform);
283+ result = result && blur_entity.Render (renderer, pass);
284+ snapshot_entity.SetTransform (entity.GetTransform () *
285+ snapshot_transform);
286+ snapshot_entity.SetNewClipDepth (entity.GetNewClipDepth ());
287+ result = result && snapshot_entity.Render (renderer, pass);
288+ return result;
274289 }),
275- fml::MakeCopyable (
276- [coverage](const Entity& entity) { return coverage; })));
290+ fml::MakeCopyable ([blur_entity = blur_entity.Clone (),
291+ blurred_transform](const Entity& entity) mutable {
292+ blur_entity.SetTransform (entity.GetTransform () * blurred_transform);
293+ return blur_entity.GetCoverage ();
294+ })));
277295 return result;
278296 }
279297 }
0 commit comments