From f1e7a77e46b1773c0ce1e6e677090020d64bddc0 Mon Sep 17 00:00:00 2001 From: JsouLiang Date: Fri, 19 Aug 2022 18:29:04 +0800 Subject: [PATCH 1/5] Make ShaderMaskLayer code builder aware --- flow/layers/shader_mask_layer.cc | 24 +++++++++++++++------- flow/layers/shader_mask_layer_unittests.cc | 13 ++++++------ 2 files changed, 24 insertions(+), 13 deletions(-) diff --git a/flow/layers/shader_mask_layer.cc b/flow/layers/shader_mask_layer.cc index b7dd47e48d99e..7a1d42116793d 100644 --- a/flow/layers/shader_mask_layer.cc +++ b/flow/layers/shader_mask_layer.cc @@ -59,14 +59,24 @@ void ShaderMaskLayer::Paint(PaintContext& context) const { context, paint_bounds(), cache_paint.sk_paint()); PaintChildren(context); - SkPaint paint; - paint.setBlendMode(ToSk(blend_mode_)); - if (shader_) { - paint.setShader(shader_->skia_object()); + auto shader_rect = SkRect::MakeWH(mask_rect_.width(), mask_rect_.height()); + if (context.leaf_nodes_builder) { + DlPaint dl_paint; + dl_paint.setBlendMode(blend_mode_); + if (shader_) { + dl_paint.setColorSource(shader_.get()); + } + context.leaf_nodes_builder->translate(mask_rect_.left(), mask_rect_.top()); + context.leaf_nodes_builder->drawRect(shader_rect, dl_paint); + } else { + SkPaint paint; + paint.setBlendMode(ToSk(blend_mode_)); + if (shader_) { + paint.setShader(shader_->skia_object()); + } + context.leaf_nodes_canvas->translate(mask_rect_.left(), mask_rect_.top()); + context.leaf_nodes_canvas->drawRect(shader_rect, paint); } - context.leaf_nodes_canvas->translate(mask_rect_.left(), mask_rect_.top()); - context.leaf_nodes_canvas->drawRect( - SkRect::MakeWH(mask_rect_.width(), mask_rect_.height()), paint); } } // namespace flutter diff --git a/flow/layers/shader_mask_layer_unittests.cc b/flow/layers/shader_mask_layer_unittests.cc index 5f6c38b76a0f1..c4f863ac01eaa 100644 --- a/flow/layers/shader_mask_layer_unittests.cc +++ b/flow/layers/shader_mask_layer_unittests.cc @@ -373,17 +373,18 @@ TEST_F(ShaderMaskLayerTest, OpacityInheritance) { { expected_builder.translate(offset.fX, offset.fY); /* ShaderMaskLayer::Paint() */ { - expected_builder.setColor(opacity_alpha << 24); - expected_builder.saveLayer(&child_path.getBounds(), true); + DlPaint sl_paint; + sl_paint.setColor(opacity_alpha << 24); + expected_builder.saveLayer(&child_path.getBounds(), &sl_paint); { /* child layer paint */ { - expected_builder.setColor(0xFF000000); - expected_builder.drawPath(child_path); + expected_builder.drawPath(child_path, + DlPaint().setColor(0xFF000000)); } expected_builder.translate(mask_rect.fLeft, mask_rect.fTop); - expected_builder.setBlendMode(DlBlendMode::kSrc); expected_builder.drawRect( - SkRect::MakeWH(mask_rect.width(), mask_rect.height())); + SkRect::MakeWH(mask_rect.width(), mask_rect.height()), + DlPaint().setBlendMode(DlBlendMode::kSrc)); } expected_builder.restore(); } From 6f672a989f608abfab3b1113669f3768d63dd46e Mon Sep 17 00:00:00 2001 From: JsouLiang Date: Fri, 19 Aug 2022 18:35:23 +0800 Subject: [PATCH 2/5] DLBuilder saveLayer --- flow/layers/shader_mask_layer.cc | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/flow/layers/shader_mask_layer.cc b/flow/layers/shader_mask_layer.cc index 7a1d42116793d..9a99a807ea2fe 100644 --- a/flow/layers/shader_mask_layer.cc +++ b/flow/layers/shader_mask_layer.cc @@ -54,13 +54,13 @@ void ShaderMaskLayer::Paint(PaintContext& context) const { return; } } - - Layer::AutoSaveLayer save = Layer::AutoSaveLayer::Create( - context, paint_bounds(), cache_paint.sk_paint()); - PaintChildren(context); - auto shader_rect = SkRect::MakeWH(mask_rect_.width(), mask_rect_.height()); + if (context.leaf_nodes_builder) { + context.builder_multiplexer->saveLayer(&paint_bounds(), + cache_paint.dl_paint()); + PaintChildren(context); + DlPaint dl_paint; dl_paint.setBlendMode(blend_mode_); if (shader_) { @@ -69,6 +69,9 @@ void ShaderMaskLayer::Paint(PaintContext& context) const { context.leaf_nodes_builder->translate(mask_rect_.left(), mask_rect_.top()); context.leaf_nodes_builder->drawRect(shader_rect, dl_paint); } else { + Layer::AutoSaveLayer save = Layer::AutoSaveLayer::Create( + context, paint_bounds(), cache_paint.sk_paint()); + PaintChildren(context); SkPaint paint; paint.setBlendMode(ToSk(blend_mode_)); if (shader_) { From d86d1089d32f4e1ef6b8a258c55d60137ea0169c Mon Sep 17 00:00:00 2001 From: JsouLiang Date: Tue, 23 Aug 2022 10:48:31 +0800 Subject: [PATCH 3/5] Add forget restore --- flow/layers/shader_mask_layer.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/flow/layers/shader_mask_layer.cc b/flow/layers/shader_mask_layer.cc index 9a99a807ea2fe..559f47e100d57 100644 --- a/flow/layers/shader_mask_layer.cc +++ b/flow/layers/shader_mask_layer.cc @@ -68,6 +68,7 @@ void ShaderMaskLayer::Paint(PaintContext& context) const { } context.leaf_nodes_builder->translate(mask_rect_.left(), mask_rect_.top()); context.leaf_nodes_builder->drawRect(shader_rect, dl_paint); + context.builder_multiplexer->restore(); } else { Layer::AutoSaveLayer save = Layer::AutoSaveLayer::Create( context, paint_bounds(), cache_paint.sk_paint()); From 38312caf8841ab558fe3160ad4503dafeb573f5b Mon Sep 17 00:00:00 2001 From: JsouLiang Date: Tue, 30 Aug 2022 10:25:39 +0800 Subject: [PATCH 4/5] fix comments --- flow/layers/shader_mask_layer.cc | 16 ++++++++-------- flow/layers/shader_mask_layer.h | 4 ++-- flow/layers/shader_mask_layer_unittests.cc | 3 +-- 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/flow/layers/shader_mask_layer.cc b/flow/layers/shader_mask_layer.cc index 559f47e100d57..d4a441417e966 100644 --- a/flow/layers/shader_mask_layer.cc +++ b/flow/layers/shader_mask_layer.cc @@ -7,12 +7,12 @@ namespace flutter { -ShaderMaskLayer::ShaderMaskLayer(std::shared_ptr shader, +ShaderMaskLayer::ShaderMaskLayer(std::shared_ptr color_source, const SkRect& mask_rect, DlBlendMode blend_mode) : CacheableContainerLayer( RasterCacheUtil::kMinimumRendersBeforeCachingFilterLayer), - shader_(std::move(shader)), + color_source_(std::move(color_source)), mask_rect_(mask_rect), blend_mode_(blend_mode) {} @@ -21,8 +21,8 @@ void ShaderMaskLayer::Diff(DiffContext* context, const Layer* old_layer) { auto* prev = static_cast(old_layer); if (!context->IsSubtreeDirty()) { FML_DCHECK(prev); - if (shader_ != prev->shader_ || mask_rect_ != prev->mask_rect_ || - blend_mode_ != prev->blend_mode_) { + if (color_source_ != prev->color_source_ || + mask_rect_ != prev->mask_rect_ || blend_mode_ != prev->blend_mode_) { context->MarkSubtreeDirty(context->GetOldLayerPaintRegion(old_layer)); } } @@ -63,8 +63,8 @@ void ShaderMaskLayer::Paint(PaintContext& context) const { DlPaint dl_paint; dl_paint.setBlendMode(blend_mode_); - if (shader_) { - dl_paint.setColorSource(shader_.get()); + if (color_source_) { + dl_paint.setColorSource(color_source_.get()); } context.leaf_nodes_builder->translate(mask_rect_.left(), mask_rect_.top()); context.leaf_nodes_builder->drawRect(shader_rect, dl_paint); @@ -75,8 +75,8 @@ void ShaderMaskLayer::Paint(PaintContext& context) const { PaintChildren(context); SkPaint paint; paint.setBlendMode(ToSk(blend_mode_)); - if (shader_) { - paint.setShader(shader_->skia_object()); + if (color_source_) { + paint.setShader(color_source_->skia_object()); } context.leaf_nodes_canvas->translate(mask_rect_.left(), mask_rect_.top()); context.leaf_nodes_canvas->drawRect(shader_rect, paint); diff --git a/flow/layers/shader_mask_layer.h b/flow/layers/shader_mask_layer.h index 63ac4421d633e..491348ae66347 100644 --- a/flow/layers/shader_mask_layer.h +++ b/flow/layers/shader_mask_layer.h @@ -12,7 +12,7 @@ namespace flutter { class ShaderMaskLayer : public CacheableContainerLayer { public: - ShaderMaskLayer(std::shared_ptr shader, + ShaderMaskLayer(std::shared_ptr color_source, const SkRect& mask_rect, DlBlendMode blend_mode); @@ -23,7 +23,7 @@ class ShaderMaskLayer : public CacheableContainerLayer { void Paint(PaintContext& context) const override; private: - std::shared_ptr shader_; + std::shared_ptr color_source_; SkRect mask_rect_; DlBlendMode blend_mode_; diff --git a/flow/layers/shader_mask_layer_unittests.cc b/flow/layers/shader_mask_layer_unittests.cc index c4f863ac01eaa..68f554ea2f4bf 100644 --- a/flow/layers/shader_mask_layer_unittests.cc +++ b/flow/layers/shader_mask_layer_unittests.cc @@ -378,8 +378,7 @@ TEST_F(ShaderMaskLayerTest, OpacityInheritance) { expected_builder.saveLayer(&child_path.getBounds(), &sl_paint); { /* child layer paint */ { - expected_builder.drawPath(child_path, - DlPaint().setColor(0xFF000000)); + expected_builder.drawPath(child_path, DlPaint()); } expected_builder.translate(mask_rect.fLeft, mask_rect.fTop); expected_builder.drawRect( From e1b921681e8b5ed9424ea2b767a3c294599a236e Mon Sep 17 00:00:00 2001 From: JsouLiang Date: Wed, 31 Aug 2022 16:39:42 +0800 Subject: [PATCH 5/5] fix comments --- flow/layers/shader_mask_layer_unittests.cc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/flow/layers/shader_mask_layer_unittests.cc b/flow/layers/shader_mask_layer_unittests.cc index 68f554ea2f4bf..b6412f2497217 100644 --- a/flow/layers/shader_mask_layer_unittests.cc +++ b/flow/layers/shader_mask_layer_unittests.cc @@ -373,8 +373,7 @@ TEST_F(ShaderMaskLayerTest, OpacityInheritance) { { expected_builder.translate(offset.fX, offset.fY); /* ShaderMaskLayer::Paint() */ { - DlPaint sl_paint; - sl_paint.setColor(opacity_alpha << 24); + DlPaint sl_paint = DlPaint().setColor(opacity_alpha << 24); expected_builder.saveLayer(&child_path.getBounds(), &sl_paint); { /* child layer paint */ {