diff --git a/sky/compositor/BUILD.gn b/sky/compositor/BUILD.gn index e9dd32a6bbb..95da362d1a5 100644 --- a/sky/compositor/BUILD.gn +++ b/sky/compositor/BUILD.gn @@ -34,8 +34,8 @@ source_set("compositor") { "raster_cache.h", "performance_overlay_layer.cc", "performance_overlay_layer.h", - "shader_layer.cc", - "shader_layer.h", + "shader_mask_layer.cc", + "shader_mask_layer.h", "transform_layer.cc", "transform_layer.h", ] diff --git a/sky/compositor/picture_layer.cc b/sky/compositor/picture_layer.cc index c0478e33ff6..dec305cf3ca 100644 --- a/sky/compositor/picture_layer.cc +++ b/sky/compositor/picture_layer.cc @@ -24,7 +24,7 @@ void PictureLayer::Preroll(PrerollContext* context, const SkMatrix& matrix) { image_ = context->frame.context().raster_cache().GetPrerolledImage( context->frame.gr_context(), picture_.get(), matrix); - context->child_paint_bounds = picture_->cullRect(); + context->child_paint_bounds = picture_->cullRect().makeOffset(offset_.x(), offset_.y()); } void PictureLayer::Paint(PaintContext::ScopedFrame& frame) { diff --git a/sky/compositor/shader_layer.cc b/sky/compositor/shader_mask_layer.cc similarity index 55% rename from sky/compositor/shader_layer.cc rename to sky/compositor/shader_mask_layer.cc index a93d3a0ba55..456d505f1e8 100644 --- a/sky/compositor/shader_layer.cc +++ b/sky/compositor/shader_mask_layer.cc @@ -2,31 +2,33 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "sky/compositor/shader_layer.h" +#include "sky/compositor/shader_mask_layer.h" namespace sky { namespace compositor { -ShaderLayer::ShaderLayer() { +ShaderMaskLayer::ShaderMaskLayer() { } -ShaderLayer::~ShaderLayer() { +ShaderMaskLayer::~ShaderMaskLayer() { } -void ShaderLayer::Preroll(PrerollContext* context, const SkMatrix& matrix) { +void ShaderMaskLayer::Preroll(PrerollContext* context, const SkMatrix& matrix) { ContainerLayer::Preroll(context, matrix); set_paint_bounds(context->child_paint_bounds); } -void ShaderLayer::Paint(PaintContext::ScopedFrame& frame) { +void ShaderMaskLayer::Paint(PaintContext::ScopedFrame& frame) { + SkCanvas& canvas = frame.canvas(); + SkAutoCanvasRestore save(&canvas, false); + canvas.saveLayer(&paint_bounds(), nullptr); + PaintChildren(frame); + SkPaint paint; paint.setXfermodeMode(transfer_mode_); paint.setShader(shader_.get()); - - SkCanvas& canvas = frame.canvas(); - SkAutoCanvasRestore save(&canvas, false); - canvas.saveLayer(&paint_bounds(), &paint); - PaintChildren(frame); + canvas.translate(mask_rect_.left(), mask_rect_.top()); + canvas.drawRect(SkRect::MakeWH(mask_rect_.width(), mask_rect_.height()), paint); } } // namespace compositor diff --git a/sky/compositor/shader_layer.h b/sky/compositor/shader_mask_layer.h similarity index 66% rename from sky/compositor/shader_layer.h rename to sky/compositor/shader_mask_layer.h index 5104185b378..e905f6a88fc 100644 --- a/sky/compositor/shader_layer.h +++ b/sky/compositor/shader_mask_layer.h @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef SKY_COMPOSITOR_SHADER_LAYER_H_ -#define SKY_COMPOSITOR_SHADER_LAYER_H_ +#ifndef SKY_COMPOSITOR_SHADER_MASK_LAYER_H_ +#define SKY_COMPOSITOR_SHADER_MASK_LAYER_H_ #include "sky/compositor/container_layer.h" @@ -12,13 +12,17 @@ namespace sky { namespace compositor { -class ShaderLayer : public ContainerLayer { +class ShaderMaskLayer : public ContainerLayer { public: - ShaderLayer(); - ~ShaderLayer() override; + ShaderMaskLayer(); + ~ShaderMaskLayer() override; void set_shader(SkShader* shader) { shader_ = shader; } + void set_mask_rect(const SkRect& mask_rect) { + mask_rect_ = mask_rect; + } + void set_transfer_mode(SkXfermode::Mode transfer_mode) { transfer_mode_ = transfer_mode; } @@ -29,12 +33,13 @@ class ShaderLayer : public ContainerLayer { private: RefPtr shader_; + SkRect mask_rect_; SkXfermode::Mode transfer_mode_; - DISALLOW_COPY_AND_ASSIGN(ShaderLayer); + DISALLOW_COPY_AND_ASSIGN(ShaderMaskLayer); }; } // namespace compositor } // namespace sky -#endif // SKY_COMPOSITOR_SHADER_LAYER_H_ +#endif // SKY_COMPOSITOR_SHADER_MASK_LAYER_H_ diff --git a/sky/engine/core/compositing/SceneBuilder.cpp b/sky/engine/core/compositing/SceneBuilder.cpp index f7f80762312..901d2545687 100644 --- a/sky/engine/core/compositing/SceneBuilder.cpp +++ b/sky/engine/core/compositing/SceneBuilder.cpp @@ -15,7 +15,7 @@ #include "sky/compositor/opacity_layer.h" #include "sky/compositor/picture_layer.h" #include "sky/compositor/performance_overlay_layer.h" -#include "sky/compositor/shader_layer.h" +#include "sky/compositor/shader_mask_layer.h" #include "sky/compositor/transform_layer.h" #include "sky/engine/tonic/dart_args.h" #include "sky/engine/tonic/dart_binding_macros.h" @@ -47,7 +47,7 @@ IMPLEMENT_WRAPPERTYPEINFO(ui, SceneBuilder); V(SceneBuilder, pushClipPath) \ V(SceneBuilder, pushOpacity) \ V(SceneBuilder, pushColorFilter) \ - V(SceneBuilder, pushShader) \ + V(SceneBuilder, pushShaderMask) \ V(SceneBuilder, pop) \ V(SceneBuilder, addPicture) \ V(SceneBuilder, addPerformanceOverlay) \ @@ -120,10 +120,11 @@ void SceneBuilder::pushColorFilter(CanvasColor color, TransferMode transferMode) addLayer(std::move(layer)); } -void SceneBuilder::pushShader(Shader* shader, TransferMode transferMode) +void SceneBuilder::pushShaderMask(Shader* shader, const Rect& maskRect, TransferMode transferMode) { - std::unique_ptr layer(new sky::compositor::ShaderLayer()); + std::unique_ptr layer(new sky::compositor::ShaderMaskLayer()); layer->set_shader(shader->shader()); + layer->set_mask_rect(maskRect.sk_rect); layer->set_transfer_mode(transferMode); addLayer(std::move(layer)); } diff --git a/sky/engine/core/compositing/SceneBuilder.h b/sky/engine/core/compositing/SceneBuilder.h index 8402ee9a3c7..88b628e87fe 100644 --- a/sky/engine/core/compositing/SceneBuilder.h +++ b/sky/engine/core/compositing/SceneBuilder.h @@ -41,7 +41,7 @@ public: void pushClipPath(const CanvasPath* path); void pushOpacity(int alpha); void pushColorFilter(CanvasColor color, TransferMode transferMode); - void pushShader(Shader* shader, TransferMode transferMode); + void pushShaderMask(Shader* shader, const Rect& maskRect, TransferMode transferMode); void pop(); void addPerformanceOverlay(uint64_t enabledOptions, const Rect& bounds); diff --git a/sky/engine/core/dart/compositing.dart b/sky/engine/core/dart/compositing.dart index 219cf3f271a..ebfc681d4c0 100644 --- a/sky/engine/core/dart/compositing.dart +++ b/sky/engine/core/dart/compositing.dart @@ -18,7 +18,7 @@ class SceneBuilder extends NativeFieldWrapperClass2 { void _pushClipPath(Path path) native "SceneBuilder_pushClipPath"; void _pushOpacity(int alpha) native "SceneBuilder_pushOpacity"; void _pushColorFilter(Color color, TransferMode transferMode) native "SceneBuilder_pushColorFilter"; - void pushShader(Shader shader, TransferMode transferMode) native "SceneBuilder_pushShader"; + void pushShaderMask(Shader shader, Rect maskRect, TransferMode transferMode) native "SceneBuilder_pushShaderMask"; void pop() native "SceneBuilder_pop";