| Index: cc/trees/layer_tree_host_pixeltest_readback.cc
|
| diff --git a/cc/trees/layer_tree_host_pixeltest_readback.cc b/cc/trees/layer_tree_host_pixeltest_readback.cc
|
| index 25b51b827a2f744192ee9e52c0224b2a5ad257c2..6c8b094ddf67b37ab865413bd624738db38bb289 100644
|
| --- a/cc/trees/layer_tree_host_pixeltest_readback.cc
|
| +++ b/cc/trees/layer_tree_host_pixeltest_readback.cc
|
| @@ -3,10 +3,13 @@
|
| // found in the LICENSE file.
|
|
|
| #include "build/build_config.h"
|
| +#include "cc/layers/content_layer.h"
|
| #include "cc/output/copy_output_request.h"
|
| #include "cc/output/copy_output_result.h"
|
| #include "cc/test/layer_tree_pixel_test.h"
|
| #include "cc/test/paths.h"
|
| +#include "cc/test/solid_color_content_layer_client.h"
|
| +#include "cc/trees/layer_tree_impl.h"
|
|
|
| #if !defined(OS_ANDROID)
|
|
|
| @@ -338,7 +341,7 @@ TEST_F(LayerTreeHostReadbackPixelTest, ReadbackSubrect_Software) {
|
| gfx::Rect(100, 100, 50, 50), SK_ColorBLUE);
|
| green->AddChild(blue);
|
|
|
| - // Grab the middle of the viewport.
|
| + // Grab the middle of the root layer.
|
| copy_subrect_ = gfx::Rect(50, 50, 100, 100);
|
|
|
| RunPixelTest(SOFTWARE_WITH_DEFAULT,
|
| @@ -359,7 +362,7 @@ TEST_F(LayerTreeHostReadbackPixelTest, ReadbackSubrect_GL_Bitmap) {
|
| gfx::Rect(100, 100, 50, 50), SK_ColorBLUE);
|
| green->AddChild(blue);
|
|
|
| - // Grab the middle of the viewport.
|
| + // Grab the middle of the root layer.
|
| copy_subrect_ = gfx::Rect(50, 50, 100, 100);
|
|
|
| RunPixelTest(GL_WITH_BITMAP,
|
| @@ -380,7 +383,7 @@ TEST_F(LayerTreeHostReadbackPixelTest, ReadbackSubrect_GL) {
|
| gfx::Rect(100, 100, 50, 50), SK_ColorBLUE);
|
| green->AddChild(blue);
|
|
|
| - // Grab the middle of the viewport.
|
| + // Grab the middle of the root layer.
|
| copy_subrect_ = gfx::Rect(50, 50, 100, 100);
|
|
|
| RunPixelTest(GL_WITH_DEFAULT,
|
| @@ -401,7 +404,7 @@ TEST_F(LayerTreeHostReadbackPixelTest, ReadbackNonRootLayerSubrect_Software) {
|
| gfx::Rect(75, 75, 50, 50), SK_ColorBLUE);
|
| green->AddChild(blue);
|
|
|
| - // Grab the middle of the viewport.
|
| + // Grab the middle of the green layer.
|
| copy_subrect_ = gfx::Rect(25, 25, 100, 100);
|
|
|
| RunPixelTestWithReadbackTarget(SOFTWARE_WITH_DEFAULT,
|
| @@ -423,7 +426,7 @@ TEST_F(LayerTreeHostReadbackPixelTest, ReadbackNonRootLayerSubrect_GL_Bitmap) {
|
| gfx::Rect(75, 75, 50, 50), SK_ColorBLUE);
|
| green->AddChild(blue);
|
|
|
| - // Grab the middle of the viewport.
|
| + // Grab the middle of the green layer.
|
| copy_subrect_ = gfx::Rect(25, 25, 100, 100);
|
|
|
| RunPixelTestWithReadbackTarget(GL_WITH_BITMAP,
|
| @@ -445,7 +448,7 @@ TEST_F(LayerTreeHostReadbackPixelTest, ReadbackNonRootLayerSubrect_GL) {
|
| gfx::Rect(75, 75, 50, 50), SK_ColorBLUE);
|
| green->AddChild(blue);
|
|
|
| - // Grab the middle of the viewport.
|
| + // Grab the middle of the green layer.
|
| copy_subrect_ = gfx::Rect(25, 25, 100, 100);
|
|
|
| RunPixelTestWithReadbackTarget(GL_WITH_DEFAULT,
|
| @@ -455,6 +458,362 @@ TEST_F(LayerTreeHostReadbackPixelTest, ReadbackNonRootLayerSubrect_GL) {
|
| "green_small_with_blue_corner.png")));
|
| }
|
|
|
| +class LayerTreeHostReadbackDeviceScalePixelTest
|
| + : public LayerTreeHostReadbackPixelTest {
|
| + protected:
|
| + LayerTreeHostReadbackDeviceScalePixelTest()
|
| + : device_scale_factor_(1.f),
|
| + white_client_(SK_ColorWHITE),
|
| + green_client_(SK_ColorGREEN),
|
| + blue_client_(SK_ColorBLUE) {}
|
| +
|
| + virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE {
|
| + // Cause the device scale factor to be inherited by contents scales.
|
| + settings->layer_transforms_should_scale_layer_contents = true;
|
| + }
|
| +
|
| + virtual void SetupTree() OVERRIDE {
|
| + layer_tree_host()->SetDeviceScaleFactor(device_scale_factor_);
|
| + LayerTreePixelTest::SetupTree();
|
| + }
|
| +
|
| + virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
|
| + LayerImpl* root_impl = host_impl->active_tree()->root_layer();
|
| +
|
| + LayerImpl* background_impl = root_impl->children()[0];
|
| + EXPECT_EQ(device_scale_factor_, background_impl->contents_scale_x());
|
| + EXPECT_EQ(device_scale_factor_, background_impl->contents_scale_y());
|
| +
|
| + LayerImpl* green_impl = background_impl->children()[0];
|
| + EXPECT_EQ(device_scale_factor_, green_impl->contents_scale_x());
|
| + EXPECT_EQ(device_scale_factor_, green_impl->contents_scale_y());
|
| +
|
| + LayerImpl* blue_impl = green_impl->children()[0];
|
| + EXPECT_EQ(device_scale_factor_, blue_impl->contents_scale_x());
|
| + EXPECT_EQ(device_scale_factor_, blue_impl->contents_scale_y());
|
| + }
|
| +
|
| + float device_scale_factor_;
|
| + SolidColorContentLayerClient white_client_;
|
| + SolidColorContentLayerClient green_client_;
|
| + SolidColorContentLayerClient blue_client_;
|
| +};
|
| +
|
| +TEST_F(LayerTreeHostReadbackDeviceScalePixelTest,
|
| + ReadbackSubrect_Software) {
|
| + scoped_refptr<ContentLayer> background = ContentLayer::Create(&white_client_);
|
| + background->SetAnchorPoint(gfx::PointF());
|
| + background->SetBounds(gfx::Size(100, 100));
|
| + background->SetIsDrawable(true);
|
| +
|
| + scoped_refptr<ContentLayer> green = ContentLayer::Create(&green_client_);
|
| + green->SetAnchorPoint(gfx::PointF());
|
| + green->SetBounds(gfx::Size(100, 100));
|
| + green->SetIsDrawable(true);
|
| + background->AddChild(green);
|
| +
|
| + scoped_refptr<ContentLayer> blue = ContentLayer::Create(&blue_client_);
|
| + blue->SetAnchorPoint(gfx::PointF());
|
| + blue->SetPosition(gfx::Point(50, 50));
|
| + blue->SetBounds(gfx::Size(25, 25));
|
| + blue->SetIsDrawable(true);
|
| + green->AddChild(blue);
|
| +
|
| + // Grab the middle of the root layer.
|
| + copy_subrect_ = gfx::Rect(25, 25, 50, 50);
|
| + device_scale_factor_ = 2.f;
|
| +
|
| + RunPixelTest(SOFTWARE_WITH_DEFAULT,
|
| + background,
|
| + base::FilePath(FILE_PATH_LITERAL(
|
| + "green_small_with_blue_corner.png")));
|
| +}
|
| +
|
| +TEST_F(LayerTreeHostReadbackDeviceScalePixelTest,
|
| + ReadbackSubrect_GL) {
|
| + scoped_refptr<ContentLayer> background = ContentLayer::Create(&white_client_);
|
| + background->SetAnchorPoint(gfx::PointF());
|
| + background->SetBounds(gfx::Size(100, 100));
|
| + background->SetIsDrawable(true);
|
| +
|
| + scoped_refptr<ContentLayer> green = ContentLayer::Create(&green_client_);
|
| + green->SetAnchorPoint(gfx::PointF());
|
| + green->SetBounds(gfx::Size(100, 100));
|
| + green->SetIsDrawable(true);
|
| + background->AddChild(green);
|
| +
|
| + scoped_refptr<ContentLayer> blue = ContentLayer::Create(&blue_client_);
|
| + blue->SetAnchorPoint(gfx::PointF());
|
| + blue->SetPosition(gfx::Point(50, 50));
|
| + blue->SetBounds(gfx::Size(25, 25));
|
| + blue->SetIsDrawable(true);
|
| + green->AddChild(blue);
|
| +
|
| + // Grab the middle of the root layer.
|
| + copy_subrect_ = gfx::Rect(25, 25, 50, 50);
|
| + device_scale_factor_ = 2.f;
|
| +
|
| + RunPixelTest(GL_WITH_DEFAULT,
|
| + background,
|
| + base::FilePath(FILE_PATH_LITERAL(
|
| + "green_small_with_blue_corner.png")));
|
| +}
|
| +
|
| +TEST_F(LayerTreeHostReadbackDeviceScalePixelTest,
|
| + ReadbackNonRootLayerSubrect_Software) {
|
| + scoped_refptr<ContentLayer> background = ContentLayer::Create(&white_client_);
|
| + background->SetAnchorPoint(gfx::PointF());
|
| + background->SetBounds(gfx::Size(100, 100));
|
| + background->SetIsDrawable(true);
|
| +
|
| + scoped_refptr<ContentLayer> green = ContentLayer::Create(&green_client_);
|
| + green->SetAnchorPoint(gfx::PointF());
|
| + green->SetPosition(gfx::Point(10, 20));
|
| + green->SetBounds(gfx::Size(90, 80));
|
| + green->SetIsDrawable(true);
|
| + background->AddChild(green);
|
| +
|
| + scoped_refptr<ContentLayer> blue = ContentLayer::Create(&blue_client_);
|
| + blue->SetAnchorPoint(gfx::PointF());
|
| + blue->SetPosition(gfx::Point(50, 50));
|
| + blue->SetBounds(gfx::Size(25, 25));
|
| + blue->SetIsDrawable(true);
|
| + green->AddChild(blue);
|
| +
|
| + // Grab the green layer's content with blue in the bottom right.
|
| + copy_subrect_ = gfx::Rect(25, 25, 50, 50);
|
| + device_scale_factor_ = 2.f;
|
| +
|
| + RunPixelTestWithReadbackTarget(SOFTWARE_WITH_DEFAULT,
|
| + background,
|
| + green.get(),
|
| + base::FilePath(FILE_PATH_LITERAL(
|
| + "green_small_with_blue_corner.png")));
|
| +}
|
| +
|
| +TEST_F(LayerTreeHostReadbackDeviceScalePixelTest,
|
| + ReadbackNonRootLayerSubrect_GL) {
|
| + scoped_refptr<ContentLayer> background = ContentLayer::Create(&white_client_);
|
| + background->SetAnchorPoint(gfx::PointF());
|
| + background->SetBounds(gfx::Size(100, 100));
|
| + background->SetIsDrawable(true);
|
| +
|
| + scoped_refptr<ContentLayer> green = ContentLayer::Create(&green_client_);
|
| + green->SetAnchorPoint(gfx::PointF());
|
| + green->SetPosition(gfx::Point(10, 20));
|
| + green->SetBounds(gfx::Size(90, 80));
|
| + green->SetIsDrawable(true);
|
| + background->AddChild(green);
|
| +
|
| + scoped_refptr<ContentLayer> blue = ContentLayer::Create(&blue_client_);
|
| + blue->SetAnchorPoint(gfx::PointF());
|
| + blue->SetPosition(gfx::Point(50, 50));
|
| + blue->SetBounds(gfx::Size(25, 25));
|
| + blue->SetIsDrawable(true);
|
| + green->AddChild(blue);
|
| +
|
| + // Grab the green layer's content with blue in the bottom right.
|
| + copy_subrect_ = gfx::Rect(25, 25, 50, 50);
|
| + device_scale_factor_ = 2.f;
|
| +
|
| + RunPixelTestWithReadbackTarget(GL_WITH_DEFAULT,
|
| + background,
|
| + green.get(),
|
| + base::FilePath(FILE_PATH_LITERAL(
|
| + "green_small_with_blue_corner.png")));
|
| +}
|
| +
|
| +class LayerTreeHostReadbackViaCompositeAndReadbackPixelTest
|
| + : public LayerTreePixelTest {
|
| + protected:
|
| + LayerTreeHostReadbackViaCompositeAndReadbackPixelTest()
|
| + : device_scale_factor_(1.f),
|
| + white_client_(SK_ColorWHITE),
|
| + green_client_(SK_ColorGREEN),
|
| + blue_client_(SK_ColorBLUE) {}
|
| +
|
| + virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE {
|
| + // Cause the device scale factor to be inherited by contents scales.
|
| + settings->layer_transforms_should_scale_layer_contents = true;
|
| + }
|
| +
|
| + virtual void SetupTree() OVERRIDE {
|
| + layer_tree_host()->SetDeviceScaleFactor(device_scale_factor_);
|
| + LayerTreePixelTest::SetupTree();
|
| + }
|
| +
|
| + virtual void BeginTest() OVERRIDE {
|
| + EXPECT_EQ(device_scale_factor_, layer_tree_host()->device_scale_factor());
|
| + if (TestEnded())
|
| + return;
|
| +
|
| + gfx::Rect device_viewport_copy_rect(
|
| + layer_tree_host()->device_viewport_size());
|
| + if (!device_viewport_copy_subrect_.IsEmpty())
|
| + device_viewport_copy_rect.Intersect(device_viewport_copy_subrect_);
|
| +
|
| + scoped_ptr<SkBitmap> bitmap(new SkBitmap);
|
| + bitmap->setConfig(SkBitmap::kARGB_8888_Config,
|
| + device_viewport_copy_rect.width(),
|
| + device_viewport_copy_rect.height());
|
| + bitmap->allocPixels();
|
| + {
|
| + scoped_ptr<SkAutoLockPixels> lock(new SkAutoLockPixels(*bitmap));
|
| + layer_tree_host()->CompositeAndReadback(bitmap->getPixels(),
|
| + device_viewport_copy_rect);
|
| + }
|
| +
|
| + result_bitmap_ = bitmap.Pass();
|
| + EndTest();
|
| + }
|
| +
|
| + virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
|
| + LayerImpl* root_impl = host_impl->active_tree()->root_layer();
|
| +
|
| + LayerImpl* background_impl = root_impl->children()[0];
|
| + EXPECT_EQ(device_scale_factor_, background_impl->contents_scale_x());
|
| + EXPECT_EQ(device_scale_factor_, background_impl->contents_scale_y());
|
| +
|
| + LayerImpl* green_impl = background_impl->children()[0];
|
| + EXPECT_EQ(device_scale_factor_, green_impl->contents_scale_x());
|
| + EXPECT_EQ(device_scale_factor_, green_impl->contents_scale_y());
|
| +
|
| + LayerImpl* blue_impl = green_impl->children()[0];
|
| + EXPECT_EQ(device_scale_factor_, blue_impl->contents_scale_x());
|
| + EXPECT_EQ(device_scale_factor_, blue_impl->contents_scale_y());
|
| + }
|
| +
|
| + gfx::Rect device_viewport_copy_subrect_;
|
| + float device_scale_factor_;
|
| + SolidColorContentLayerClient white_client_;
|
| + SolidColorContentLayerClient green_client_;
|
| + SolidColorContentLayerClient blue_client_;
|
| +};
|
| +
|
| +TEST_F(LayerTreeHostReadbackViaCompositeAndReadbackPixelTest,
|
| + CompositeAndReadback_Software_1) {
|
| + scoped_refptr<ContentLayer> background = ContentLayer::Create(&white_client_);
|
| + background->SetAnchorPoint(gfx::PointF());
|
| + background->SetBounds(gfx::Size(200, 200));
|
| + background->SetIsDrawable(true);
|
| +
|
| + scoped_refptr<ContentLayer> green = ContentLayer::Create(&green_client_);
|
| + green->SetAnchorPoint(gfx::PointF());
|
| + green->SetBounds(gfx::Size(200, 200));
|
| + green->SetIsDrawable(true);
|
| + background->AddChild(green);
|
| +
|
| + scoped_refptr<ContentLayer> blue = ContentLayer::Create(&blue_client_);
|
| + blue->SetAnchorPoint(gfx::PointF());
|
| + blue->SetPosition(gfx::Point(100, 100));
|
| + blue->SetBounds(gfx::Size(50, 50));
|
| + blue->SetIsDrawable(true);
|
| + green->AddChild(blue);
|
| +
|
| + // Grab the middle of the device viewport.
|
| + device_viewport_copy_subrect_ = gfx::Rect(50, 50, 100, 100);
|
| + device_scale_factor_ = 1.f;
|
| +
|
| + RunPixelTestWithReadbackTarget(SOFTWARE_WITH_DEFAULT,
|
| + background,
|
| + green.get(),
|
| + base::FilePath(FILE_PATH_LITERAL(
|
| + "green_small_with_blue_corner.png")));
|
| +}
|
| +
|
| +TEST_F(LayerTreeHostReadbackViaCompositeAndReadbackPixelTest,
|
| + CompositeAndReadback_Software_2) {
|
| + scoped_refptr<ContentLayer> background = ContentLayer::Create(&white_client_);
|
| + background->SetAnchorPoint(gfx::PointF());
|
| + background->SetBounds(gfx::Size(100, 100));
|
| + background->SetIsDrawable(true);
|
| +
|
| + scoped_refptr<ContentLayer> green = ContentLayer::Create(&green_client_);
|
| + green->SetAnchorPoint(gfx::PointF());
|
| + green->SetBounds(gfx::Size(100, 100));
|
| + green->SetIsDrawable(true);
|
| + background->AddChild(green);
|
| +
|
| + scoped_refptr<ContentLayer> blue = ContentLayer::Create(&blue_client_);
|
| + blue->SetAnchorPoint(gfx::PointF());
|
| + blue->SetPosition(gfx::Point(50, 50));
|
| + blue->SetBounds(gfx::Size(25, 25));
|
| + blue->SetIsDrawable(true);
|
| + green->AddChild(blue);
|
| +
|
| + // Grab the middle of the device viewport.
|
| + device_viewport_copy_subrect_ = gfx::Rect(50, 50, 100, 100);
|
| + device_scale_factor_ = 2.f;
|
| +
|
| + RunPixelTestWithReadbackTarget(SOFTWARE_WITH_DEFAULT,
|
| + background,
|
| + green.get(),
|
| + base::FilePath(FILE_PATH_LITERAL(
|
| + "green_small_with_blue_corner.png")));
|
| +}
|
| +
|
| +TEST_F(LayerTreeHostReadbackViaCompositeAndReadbackPixelTest,
|
| + CompositeAndReadback_GL_1) {
|
| + scoped_refptr<ContentLayer> background = ContentLayer::Create(&white_client_);
|
| + background->SetAnchorPoint(gfx::PointF());
|
| + background->SetBounds(gfx::Size(200, 200));
|
| + background->SetIsDrawable(true);
|
| +
|
| + scoped_refptr<ContentLayer> green = ContentLayer::Create(&green_client_);
|
| + green->SetAnchorPoint(gfx::PointF());
|
| + green->SetBounds(gfx::Size(200, 200));
|
| + green->SetIsDrawable(true);
|
| + background->AddChild(green);
|
| +
|
| + scoped_refptr<ContentLayer> blue = ContentLayer::Create(&blue_client_);
|
| + blue->SetAnchorPoint(gfx::PointF());
|
| + blue->SetPosition(gfx::Point(100, 100));
|
| + blue->SetBounds(gfx::Size(50, 50));
|
| + blue->SetIsDrawable(true);
|
| + green->AddChild(blue);
|
| +
|
| + // Grab the middle of the device viewport.
|
| + device_viewport_copy_subrect_ = gfx::Rect(50, 50, 100, 100);
|
| + device_scale_factor_ = 1.f;
|
| +
|
| + RunPixelTestWithReadbackTarget(GL_WITH_DEFAULT,
|
| + background,
|
| + green.get(),
|
| + base::FilePath(FILE_PATH_LITERAL(
|
| + "green_small_with_blue_corner.png")));
|
| +}
|
| +
|
| +TEST_F(LayerTreeHostReadbackViaCompositeAndReadbackPixelTest,
|
| + CompositeAndReadback_GL_2) {
|
| + scoped_refptr<ContentLayer> background = ContentLayer::Create(&white_client_);
|
| + background->SetAnchorPoint(gfx::PointF());
|
| + background->SetBounds(gfx::Size(100, 100));
|
| + background->SetIsDrawable(true);
|
| +
|
| + scoped_refptr<ContentLayer> green = ContentLayer::Create(&green_client_);
|
| + green->SetAnchorPoint(gfx::PointF());
|
| + green->SetBounds(gfx::Size(100, 100));
|
| + green->SetIsDrawable(true);
|
| + background->AddChild(green);
|
| +
|
| + scoped_refptr<ContentLayer> blue = ContentLayer::Create(&blue_client_);
|
| + blue->SetAnchorPoint(gfx::PointF());
|
| + blue->SetPosition(gfx::Point(50, 50));
|
| + blue->SetBounds(gfx::Size(25, 25));
|
| + blue->SetIsDrawable(true);
|
| + green->AddChild(blue);
|
| +
|
| + // Grab the middle of the device viewport.
|
| + device_viewport_copy_subrect_ = gfx::Rect(50, 50, 100, 100);
|
| + device_scale_factor_ = 2.f;
|
| +
|
| + RunPixelTestWithReadbackTarget(GL_WITH_DEFAULT,
|
| + background,
|
| + green.get(),
|
| + base::FilePath(FILE_PATH_LITERAL(
|
| + "green_small_with_blue_corner.png")));
|
| +}
|
| +
|
| } // namespace
|
| } // namespace cc
|
|
|
|
|