Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 169181f

Browse files
authored
Make shader mask layer code builder aware (#35622)
1 parent 6c9f6f5 commit 169181f

3 files changed

Lines changed: 35 additions & 22 deletions

File tree

flow/layers/shader_mask_layer.cc

Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,12 @@
77

88
namespace 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

flow/layers/shader_mask_layer.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ namespace flutter {
1212

1313
class ShaderMaskLayer : public CacheableContainerLayer {
1414
public:
15-
ShaderMaskLayer(std::shared_ptr<DlColorSource> shader,
15+
ShaderMaskLayer(std::shared_ptr<DlColorSource> color_source,
1616
const SkRect& mask_rect,
1717
DlBlendMode blend_mode);
1818

@@ -23,7 +23,7 @@ class ShaderMaskLayer : public CacheableContainerLayer {
2323
void Paint(PaintContext& context) const override;
2424

2525
private:
26-
std::shared_ptr<DlColorSource> shader_;
26+
std::shared_ptr<DlColorSource> color_source_;
2727
SkRect mask_rect_;
2828
DlBlendMode blend_mode_;
2929

flow/layers/shader_mask_layer_unittests.cc

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -373,17 +373,16 @@ TEST_F(ShaderMaskLayerTest, OpacityInheritance) {
373373
{
374374
expected_builder.translate(offset.fX, offset.fY);
375375
/* ShaderMaskLayer::Paint() */ {
376-
expected_builder.setColor(opacity_alpha << 24);
377-
expected_builder.saveLayer(&child_path.getBounds(), true);
376+
DlPaint sl_paint = DlPaint().setColor(opacity_alpha << 24);
377+
expected_builder.saveLayer(&child_path.getBounds(), &sl_paint);
378378
{
379379
/* child layer paint */ {
380-
expected_builder.setColor(0xFF000000);
381-
expected_builder.drawPath(child_path);
380+
expected_builder.drawPath(child_path, DlPaint());
382381
}
383382
expected_builder.translate(mask_rect.fLeft, mask_rect.fTop);
384-
expected_builder.setBlendMode(DlBlendMode::kSrc);
385383
expected_builder.drawRect(
386-
SkRect::MakeWH(mask_rect.width(), mask_rect.height()));
384+
SkRect::MakeWH(mask_rect.width(), mask_rect.height()),
385+
DlPaint().setBlendMode(DlBlendMode::kSrc));
387386
}
388387
expected_builder.restore();
389388
}

0 commit comments

Comments
 (0)