Merge pull request #2249 from abarth/shader_mask_layer

ShaderLayer should actually be ShaderMaskLayer
This commit is contained in:
Adam Barth 2016-01-11 16:49:33 -08:00
commit a862fda816
7 changed files with 34 additions and 26 deletions

View File

@ -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",
]

View File

@ -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) {

View File

@ -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

View File

@ -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<SkShader> 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_

View File

@ -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<sky::compositor::ShaderLayer> layer(new sky::compositor::ShaderLayer());
std::unique_ptr<sky::compositor::ShaderMaskLayer> 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));
}

View File

@ -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);

View File

@ -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";