| Index: cc/trees/layer_tree_host_pixeltest_masks.cc
|
| diff --git a/cc/trees/layer_tree_host_pixeltest_masks.cc b/cc/trees/layer_tree_host_pixeltest_masks.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..16cbd8d30479fea8696f9131d57f37143e0f38b9
|
| --- /dev/null
|
| +++ b/cc/trees/layer_tree_host_pixeltest_masks.cc
|
| @@ -0,0 +1,269 @@
|
| +// Copyright 2013 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "build/build_config.h"
|
| +#include "cc/layers/content_layer.h"
|
| +#include "cc/layers/content_layer_client.h"
|
| +#include "cc/layers/image_layer.h"
|
| +#include "cc/test/layer_tree_pixel_test.h"
|
| +#include "cc/test/pixel_comparator.h"
|
| +
|
| +#if !defined(OS_ANDROID)
|
| +
|
| +namespace cc {
|
| +namespace {
|
| +
|
| +class LayerTreeHostMasksPixelTest : public LayerTreePixelTest {};
|
| +
|
| +class MaskContentLayerClient : public cc::ContentLayerClient {
|
| + public:
|
| + MaskContentLayerClient() {}
|
| + virtual ~MaskContentLayerClient() {}
|
| +
|
| + virtual void DidChangeLayerCanUseLCDText() OVERRIDE {}
|
| +
|
| + virtual void PaintContents(SkCanvas* canvas,
|
| + gfx::Rect rect,
|
| + gfx::RectF* opaque_rect) OVERRIDE {
|
| + SkPaint paint;
|
| + paint.setStyle(SkPaint::kStroke_Style);
|
| + paint.setStrokeWidth(SkIntToScalar(2));
|
| + paint.setColor(SK_ColorWHITE);
|
| +
|
| + canvas->clear(SK_ColorTRANSPARENT);
|
| + while (!rect.IsEmpty()) {
|
| + rect.Inset(3, 3, 2, 2);
|
| + canvas->drawRect(
|
| + SkRect::MakeXYWH(rect.x(), rect.y(), rect.width(), rect.height()),
|
| + paint);
|
| + rect.Inset(3, 3, 2, 2);
|
| + }
|
| + }
|
| +};
|
| +
|
| +TEST_F(LayerTreeHostMasksPixelTest, MaskOfLayer) {
|
| + scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
|
| + gfx::Rect(200, 200), SK_ColorWHITE);
|
| +
|
| + scoped_refptr<SolidColorLayer> green = CreateSolidColorLayerWithBorder(
|
| + gfx::Rect(50, 50, 100, 100), kCSSGreen, 1, SK_ColorBLACK);
|
| + background->AddChild(green);
|
| +
|
| + MaskContentLayerClient client;
|
| + scoped_refptr<ContentLayer> mask = ContentLayer::Create(&client);
|
| + mask->SetBounds(gfx::Size(100, 100));
|
| + mask->SetIsDrawable(true);
|
| + mask->SetIsMask(true);
|
| + green->SetMaskLayer(mask);
|
| +
|
| + RunPixelTest(background,
|
| + base::FilePath(FILE_PATH_LITERAL(
|
| + "mask_of_layer.png")));
|
| +}
|
| +
|
| +TEST_F(LayerTreeHostMasksPixelTest, ImageMaskOfLayer) {
|
| + scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
|
| + gfx::Rect(200, 200), SK_ColorWHITE);
|
| +
|
| + scoped_refptr<ImageLayer> mask = ImageLayer::Create();
|
| + mask->SetIsDrawable(true);
|
| + mask->SetIsMask(true);
|
| + mask->SetBounds(gfx::Size(100, 100));
|
| +
|
| + SkBitmap bitmap;
|
| + bitmap.setConfig(SkBitmap::kARGB_8888_Config, 400, 400);
|
| + bitmap.allocPixels();
|
| + SkCanvas canvas(bitmap);
|
| + canvas.scale(SkIntToScalar(4), SkIntToScalar(4));
|
| + MaskContentLayerClient client;
|
| + client.PaintContents(&canvas,
|
| + gfx::Rect(100, 100),
|
| + NULL);
|
| + mask->SetBitmap(bitmap);
|
| +
|
| + scoped_refptr<SolidColorLayer> green = CreateSolidColorLayerWithBorder(
|
| + gfx::Rect(50, 50, 100, 100), kCSSGreen, 1, SK_ColorBLACK);
|
| + green->SetMaskLayer(mask);
|
| + background->AddChild(green);
|
| +
|
| + RunPixelTest(background,
|
| + base::FilePath(FILE_PATH_LITERAL(
|
| + "image_mask_of_layer.png")));
|
| +}
|
| +
|
| +TEST_F(LayerTreeHostMasksPixelTest, MaskOfClippedLayer) {
|
| + scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
|
| + gfx::Rect(200, 200), SK_ColorWHITE);
|
| +
|
| + // Clip to the top half of the green layer.
|
| + scoped_refptr<Layer> clip = Layer::Create();
|
| + clip->SetAnchorPoint(gfx::PointF(0.f, 0.f));
|
| + clip->SetPosition(gfx::Point(0, 0));
|
| + clip->SetBounds(gfx::Size(200, 100));
|
| + clip->SetMasksToBounds(true);
|
| + background->AddChild(clip);
|
| +
|
| + scoped_refptr<SolidColorLayer> green = CreateSolidColorLayerWithBorder(
|
| + gfx::Rect(50, 50, 100, 100), kCSSGreen, 1, SK_ColorBLACK);
|
| + clip->AddChild(green);
|
| +
|
| + MaskContentLayerClient client;
|
| + scoped_refptr<ContentLayer> mask = ContentLayer::Create(&client);
|
| + mask->SetBounds(gfx::Size(100, 100));
|
| + mask->SetIsDrawable(true);
|
| + mask->SetIsMask(true);
|
| + green->SetMaskLayer(mask);
|
| +
|
| + RunPixelTest(background,
|
| + base::FilePath(FILE_PATH_LITERAL(
|
| + "mask_of_clipped_layer.png")));
|
| +}
|
| +
|
| +TEST_F(LayerTreeHostMasksPixelTest, MaskWithReplica) {
|
| + scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
|
| + gfx::Rect(200, 200), SK_ColorWHITE);
|
| +
|
| + MaskContentLayerClient client;
|
| + scoped_refptr<ContentLayer> mask = ContentLayer::Create(&client);
|
| + mask->SetBounds(gfx::Size(100, 100));
|
| + mask->SetIsDrawable(true);
|
| + mask->SetIsMask(true);
|
| +
|
| + scoped_refptr<SolidColorLayer> green = CreateSolidColorLayerWithBorder(
|
| + gfx::Rect(0, 0, 100, 100), kCSSGreen, 1, SK_ColorBLACK);
|
| + background->AddChild(green);
|
| + green->SetMaskLayer(mask);
|
| +
|
| + gfx::Transform replica_transform;
|
| + replica_transform.Rotate(-90.0);
|
| +
|
| + scoped_refptr<Layer> replica = Layer::Create();
|
| + replica->SetAnchorPoint(gfx::PointF(0.5f, 0.5f));
|
| + replica->SetPosition(gfx::Point(100, 100));
|
| + replica->SetTransform(replica_transform);
|
| + green->SetReplicaLayer(replica);
|
| +
|
| + RunPixelTest(background,
|
| + base::FilePath(FILE_PATH_LITERAL(
|
| + "mask_with_replica.png")));
|
| +}
|
| +
|
| +TEST_F(LayerTreeHostMasksPixelTest, MaskWithReplicaOfClippedLayer) {
|
| + scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
|
| + gfx::Rect(200, 200), SK_ColorWHITE);
|
| +
|
| + MaskContentLayerClient client;
|
| + scoped_refptr<ContentLayer> mask = ContentLayer::Create(&client);
|
| + mask->SetBounds(gfx::Size(100, 100));
|
| + mask->SetIsDrawable(true);
|
| + mask->SetIsMask(true);
|
| +
|
| + // Clip to the bottom half of the green layer, and the left half of the
|
| + // replica.
|
| + scoped_refptr<Layer> clip = Layer::Create();
|
| + clip->SetAnchorPoint(gfx::PointF(0.f, 0.f));
|
| + clip->SetPosition(gfx::Point(0, 50));
|
| + clip->SetBounds(gfx::Size(150, 150));
|
| + clip->SetMasksToBounds(true);
|
| + background->AddChild(clip);
|
| +
|
| + scoped_refptr<SolidColorLayer> green = CreateSolidColorLayerWithBorder(
|
| + gfx::Rect(0, -50, 100, 100), kCSSGreen, 1, SK_ColorBLACK);
|
| + clip->AddChild(green);
|
| + green->SetMaskLayer(mask);
|
| +
|
| + gfx::Transform replica_transform;
|
| + replica_transform.Rotate(-90.0);
|
| +
|
| + scoped_refptr<Layer> replica = Layer::Create();
|
| + replica->SetAnchorPoint(gfx::PointF(0.5f, 0.5f));
|
| + replica->SetPosition(gfx::Point(100, 100));
|
| + replica->SetTransform(replica_transform);
|
| + green->SetReplicaLayer(replica);
|
| +
|
| + RunPixelTest(background,
|
| + base::FilePath(FILE_PATH_LITERAL(
|
| + "mask_with_replica_of_clipped_layer.png")));
|
| +}
|
| +
|
| +TEST_F(LayerTreeHostMasksPixelTest, MaskOfReplica) {
|
| + scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
|
| + gfx::Rect(200, 200), SK_ColorWHITE);
|
| +
|
| + MaskContentLayerClient client;
|
| + scoped_refptr<ContentLayer> mask = ContentLayer::Create(&client);
|
| + mask->SetBounds(gfx::Size(100, 100));
|
| + mask->SetIsDrawable(true);
|
| + mask->SetIsMask(true);
|
| +
|
| + scoped_refptr<SolidColorLayer> green = CreateSolidColorLayerWithBorder(
|
| + gfx::Rect(50, 0, 100, 100), kCSSGreen, 1, SK_ColorBLACK);
|
| + background->AddChild(green);
|
| +
|
| + scoped_refptr<SolidColorLayer> orange = CreateSolidColorLayer(
|
| + gfx::Rect(-50, 50, 50, 50), kCSSOrange);
|
| + green->AddChild(orange);
|
| +
|
| + gfx::Transform replica_transform;
|
| + replica_transform.Rotate(180.0);
|
| + replica_transform.Translate(100.0, 0.0);
|
| +
|
| + scoped_refptr<Layer> replica = Layer::Create();
|
| + replica->SetAnchorPoint(gfx::PointF(1.f, 1.f));
|
| + replica->SetPosition(gfx::Point());
|
| + replica->SetTransform(replica_transform);
|
| + replica->SetMaskLayer(mask);
|
| + green->SetReplicaLayer(replica);
|
| +
|
| + RunPixelTest(background,
|
| + base::FilePath(FILE_PATH_LITERAL(
|
| + "mask_of_replica.png")));
|
| +}
|
| +
|
| +TEST_F(LayerTreeHostMasksPixelTest, MaskOfReplicaOfClippedLayer) {
|
| + scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
|
| + gfx::Rect(200, 200), SK_ColorWHITE);
|
| +
|
| + MaskContentLayerClient client;
|
| + scoped_refptr<ContentLayer> mask = ContentLayer::Create(&client);
|
| + mask->SetBounds(gfx::Size(100, 100));
|
| + mask->SetIsDrawable(true);
|
| + mask->SetIsMask(true);
|
| +
|
| + // Clip to the bottom 3/4 of the green layer, and the top 3/4 of the replica.
|
| + scoped_refptr<Layer> clip = Layer::Create();
|
| + clip->SetAnchorPoint(gfx::PointF(0.f, 0.f));
|
| + clip->SetPosition(gfx::Point(0, 25));
|
| + clip->SetBounds(gfx::Size(200, 150));
|
| + clip->SetMasksToBounds(true);
|
| + background->AddChild(clip);
|
| +
|
| + scoped_refptr<SolidColorLayer> green = CreateSolidColorLayerWithBorder(
|
| + gfx::Rect(50, -25, 100, 100), kCSSGreen, 1, SK_ColorBLACK);
|
| + clip->AddChild(green);
|
| +
|
| + scoped_refptr<SolidColorLayer> orange = CreateSolidColorLayer(
|
| + gfx::Rect(-50, 50, 50, 50), kCSSOrange);
|
| + green->AddChild(orange);
|
| +
|
| + gfx::Transform replica_transform;
|
| + replica_transform.Rotate(180.0);
|
| + replica_transform.Translate(100.0, 0.0);
|
| +
|
| + scoped_refptr<Layer> replica = Layer::Create();
|
| + replica->SetAnchorPoint(gfx::PointF(1.f, 1.f));
|
| + replica->SetPosition(gfx::Point());
|
| + replica->SetTransform(replica_transform);
|
| + replica->SetMaskLayer(mask);
|
| + green->SetReplicaLayer(replica);
|
| +
|
| + RunPixelTest(background,
|
| + base::FilePath(FILE_PATH_LITERAL(
|
| + "mask_of_replica_of_clipped_layer.png")));
|
| +}
|
| +
|
| +} // namespace
|
| +} // namespace cc
|
| +
|
| +#endif // OS_ANDROID
|
|
|