77
88namespace flutter {
99
10- ShaderMaskLayer::ShaderMaskLayer (std::shared_ptr<DlColorSource> shader ,
10+ ShaderMaskLayer::ShaderMaskLayer (std::shared_ptr<DlColorSource> color_source ,
1111 const SkRect& mask_rect,
1212 DlBlendMode blend_mode)
1313 : CacheableContainerLayer(
1414 RasterCacheUtil::kMinimumRendersBeforeCachingFilterLayer ),
15- shader_ (std::move(shader )),
15+ color_source_ (std::move(color_source )),
1616 mask_rect_(mask_rect),
1717 blend_mode_(blend_mode) {}
1818
@@ -21,8 +21,8 @@ void ShaderMaskLayer::Diff(DiffContext* context, const Layer* old_layer) {
2121 auto * prev = static_cast <const ShaderMaskLayer*>(old_layer);
2222 if (!context->IsSubtreeDirty ()) {
2323 FML_DCHECK (prev);
24- if (shader_ != prev->shader_ || mask_rect_ != prev-> mask_rect_ ||
25- blend_mode_ != prev->blend_mode_ ) {
24+ if (color_source_ != prev->color_source_ ||
25+ mask_rect_ != prev-> mask_rect_ || blend_mode_ != prev->blend_mode_ ) {
2626 context->MarkSubtreeDirty (context->GetOldLayerPaintRegion (old_layer));
2727 }
2828 }
@@ -54,19 +54,33 @@ void ShaderMaskLayer::Paint(PaintContext& context) const {
5454 return ;
5555 }
5656 }
57+ auto shader_rect = SkRect::MakeWH (mask_rect_.width (), mask_rect_.height ());
5758
58- Layer::AutoSaveLayer save = Layer::AutoSaveLayer::Create (
59- context, paint_bounds (), cache_paint.sk_paint ());
60- PaintChildren (context);
59+ if (context.leaf_nodes_builder ) {
60+ context.builder_multiplexer ->saveLayer (&paint_bounds (),
61+ cache_paint.dl_paint ());
62+ PaintChildren (context);
6163
62- SkPaint paint;
63- paint.setBlendMode (ToSk (blend_mode_));
64- if (shader_) {
65- paint.setShader (shader_->skia_object ());
64+ DlPaint dl_paint;
65+ dl_paint.setBlendMode (blend_mode_);
66+ if (color_source_) {
67+ dl_paint.setColorSource (color_source_.get ());
68+ }
69+ context.leaf_nodes_builder ->translate (mask_rect_.left (), mask_rect_.top ());
70+ context.leaf_nodes_builder ->drawRect (shader_rect, dl_paint);
71+ context.builder_multiplexer ->restore ();
72+ } else {
73+ Layer::AutoSaveLayer save = Layer::AutoSaveLayer::Create (
74+ context, paint_bounds (), cache_paint.sk_paint ());
75+ PaintChildren (context);
76+ SkPaint paint;
77+ paint.setBlendMode (ToSk (blend_mode_));
78+ if (color_source_) {
79+ paint.setShader (color_source_->skia_object ());
80+ }
81+ context.leaf_nodes_canvas ->translate (mask_rect_.left (), mask_rect_.top ());
82+ context.leaf_nodes_canvas ->drawRect (shader_rect, paint);
6683 }
67- context.leaf_nodes_canvas ->translate (mask_rect_.left (), mask_rect_.top ());
68- context.leaf_nodes_canvas ->drawRect (
69- SkRect::MakeWH (mask_rect_.width (), mask_rect_.height ()), paint);
7084}
7185
7286} // namespace flutter
0 commit comments