Home | History | Annotate | Download | only in trees
      1 // Copyright 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "build/build_config.h"
      6 #include "cc/layers/content_layer.h"
      7 #include "cc/layers/solid_color_layer.h"
      8 #include "cc/layers/texture_layer.h"
      9 #include "cc/output/copy_output_request.h"
     10 #include "cc/output/copy_output_result.h"
     11 #include "cc/test/layer_tree_pixel_test.h"
     12 #include "cc/test/paths.h"
     13 #include "cc/test/solid_color_content_layer_client.h"
     14 #include "cc/trees/layer_tree_impl.h"
     15 
     16 #if !defined(OS_ANDROID)
     17 
     18 namespace cc {
     19 namespace {
     20 
     21 class LayerTreeHostReadbackPixelTest : public LayerTreePixelTest {
     22  protected:
     23   virtual scoped_ptr<CopyOutputRequest> CreateCopyOutputRequest() OVERRIDE {
     24     scoped_ptr<CopyOutputRequest> request;
     25 
     26     switch (test_type_) {
     27       case GL_WITH_BITMAP:
     28       case SOFTWARE_WITH_BITMAP:
     29         request = CopyOutputRequest::CreateBitmapRequest(
     30             base::Bind(&LayerTreeHostReadbackPixelTest::ReadbackResultAsBitmap,
     31                        base::Unretained(this)));
     32         break;
     33       case SOFTWARE_WITH_DEFAULT:
     34         request = CopyOutputRequest::CreateRequest(
     35             base::Bind(&LayerTreeHostReadbackPixelTest::ReadbackResultAsBitmap,
     36                        base::Unretained(this)));
     37         break;
     38       case GL_WITH_DEFAULT:
     39         request = CopyOutputRequest::CreateRequest(
     40             base::Bind(&LayerTreeHostReadbackPixelTest::ReadbackResultAsTexture,
     41                        base::Unretained(this)));
     42         break;
     43     }
     44 
     45     if (!copy_subrect_.IsEmpty())
     46       request->set_area(copy_subrect_);
     47     return request.Pass();
     48   }
     49 
     50   void ReadbackResultAsBitmap(scoped_ptr<CopyOutputResult> result) {
     51     EXPECT_TRUE(proxy()->IsMainThread());
     52     EXPECT_TRUE(result->HasBitmap());
     53     result_bitmap_ = result->TakeBitmap().Pass();
     54     EndTest();
     55   }
     56 
     57   void ReadbackResultAsTexture(scoped_ptr<CopyOutputResult> result) {
     58     EXPECT_TRUE(proxy()->IsMainThread());
     59     EXPECT_TRUE(result->HasTexture());
     60 
     61     scoped_ptr<TextureMailbox> texture_mailbox = result->TakeTexture().Pass();
     62     EXPECT_TRUE(texture_mailbox->IsValid());
     63     EXPECT_TRUE(texture_mailbox->IsTexture());
     64 
     65     scoped_ptr<SkBitmap> bitmap =
     66         CopyTextureMailboxToBitmap(result->size(), *texture_mailbox);
     67     texture_mailbox->RunReleaseCallback(0, false);
     68 
     69     ReadbackResultAsBitmap(CopyOutputResult::CreateBitmapResult(bitmap.Pass()));
     70   }
     71 
     72   gfx::Rect copy_subrect_;
     73 };
     74 
     75 TEST_F(LayerTreeHostReadbackPixelTest, ReadbackRootLayer_Software) {
     76   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
     77       gfx::Rect(200, 200), SK_ColorWHITE);
     78 
     79   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
     80       gfx::Rect(200, 200), SK_ColorGREEN);
     81   background->AddChild(green);
     82 
     83   RunPixelTest(SOFTWARE_WITH_DEFAULT,
     84                background,
     85                base::FilePath(FILE_PATH_LITERAL(
     86                    "green.png")));
     87 }
     88 
     89 TEST_F(LayerTreeHostReadbackPixelTest, ReadbackRootLayer_Software_Bitmap) {
     90   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
     91       gfx::Rect(200, 200), SK_ColorWHITE);
     92 
     93   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
     94       gfx::Rect(200, 200), SK_ColorGREEN);
     95   background->AddChild(green);
     96 
     97   RunPixelTest(SOFTWARE_WITH_BITMAP,
     98                background,
     99                base::FilePath(FILE_PATH_LITERAL(
    100                    "green.png")));
    101 }
    102 
    103 TEST_F(LayerTreeHostReadbackPixelTest, ReadbackRootLayer_GL_Bitmap) {
    104   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
    105       gfx::Rect(200, 200), SK_ColorWHITE);
    106 
    107   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
    108       gfx::Rect(200, 200), SK_ColorGREEN);
    109   background->AddChild(green);
    110 
    111   RunPixelTest(GL_WITH_BITMAP,
    112                background,
    113                base::FilePath(FILE_PATH_LITERAL(
    114                    "green.png")));
    115 }
    116 
    117 TEST_F(LayerTreeHostReadbackPixelTest, ReadbackRootLayer_GL) {
    118   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
    119       gfx::Rect(200, 200), SK_ColorWHITE);
    120 
    121   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
    122       gfx::Rect(200, 200), SK_ColorGREEN);
    123   background->AddChild(green);
    124 
    125   RunPixelTest(GL_WITH_DEFAULT,
    126                background,
    127                base::FilePath(FILE_PATH_LITERAL(
    128                    "green.png")));
    129 }
    130 
    131 TEST_F(LayerTreeHostReadbackPixelTest,
    132        ReadbackRootLayerWithChild_Software) {
    133   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
    134       gfx::Rect(200, 200), SK_ColorWHITE);
    135 
    136   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
    137       gfx::Rect(200, 200), SK_ColorGREEN);
    138   background->AddChild(green);
    139 
    140   scoped_refptr<SolidColorLayer> blue = CreateSolidColorLayer(
    141       gfx::Rect(150, 150, 50, 50), SK_ColorBLUE);
    142   green->AddChild(blue);
    143 
    144   RunPixelTest(SOFTWARE_WITH_DEFAULT,
    145                background,
    146                base::FilePath(FILE_PATH_LITERAL(
    147                    "green_with_blue_corner.png")));
    148 }
    149 
    150 TEST_F(LayerTreeHostReadbackPixelTest, ReadbackRootLayerWithChild_GL_Bitmap) {
    151   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
    152       gfx::Rect(200, 200), SK_ColorWHITE);
    153 
    154   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
    155       gfx::Rect(200, 200), SK_ColorGREEN);
    156   background->AddChild(green);
    157 
    158   scoped_refptr<SolidColorLayer> blue = CreateSolidColorLayer(
    159       gfx::Rect(150, 150, 50, 50), SK_ColorBLUE);
    160   green->AddChild(blue);
    161 
    162   RunPixelTest(GL_WITH_BITMAP,
    163                background,
    164                base::FilePath(FILE_PATH_LITERAL(
    165                    "green_with_blue_corner.png")));
    166 }
    167 
    168 TEST_F(LayerTreeHostReadbackPixelTest, ReadbackRootLayerWithChild_GL) {
    169   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
    170       gfx::Rect(200, 200), SK_ColorWHITE);
    171 
    172   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
    173       gfx::Rect(200, 200), SK_ColorGREEN);
    174   background->AddChild(green);
    175 
    176   scoped_refptr<SolidColorLayer> blue = CreateSolidColorLayer(
    177       gfx::Rect(150, 150, 50, 50), SK_ColorBLUE);
    178   green->AddChild(blue);
    179 
    180   RunPixelTest(GL_WITH_DEFAULT,
    181                background,
    182                base::FilePath(FILE_PATH_LITERAL(
    183                    "green_with_blue_corner.png")));
    184 }
    185 
    186 TEST_F(LayerTreeHostReadbackPixelTest, ReadbackNonRootLayer_Software) {
    187   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
    188       gfx::Rect(200, 200), SK_ColorWHITE);
    189 
    190   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
    191       gfx::Rect(200, 200), SK_ColorGREEN);
    192   background->AddChild(green);
    193 
    194   RunPixelTestWithReadbackTarget(SOFTWARE_WITH_DEFAULT,
    195                                  background,
    196                                  green.get(),
    197                                  base::FilePath(FILE_PATH_LITERAL(
    198                                      "green.png")));
    199 }
    200 
    201 TEST_F(LayerTreeHostReadbackPixelTest, ReadbackNonRootLayer_GL_Bitmap) {
    202   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
    203       gfx::Rect(200, 200), SK_ColorWHITE);
    204 
    205   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
    206       gfx::Rect(200, 200), SK_ColorGREEN);
    207   background->AddChild(green);
    208 
    209   RunPixelTestWithReadbackTarget(GL_WITH_BITMAP,
    210                                  background,
    211                                  green.get(),
    212                                  base::FilePath(FILE_PATH_LITERAL(
    213                                      "green.png")));
    214 }
    215 
    216 TEST_F(LayerTreeHostReadbackPixelTest, ReadbackNonRootLayer_GL) {
    217   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
    218       gfx::Rect(200, 200), SK_ColorWHITE);
    219 
    220   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
    221       gfx::Rect(200, 200), SK_ColorGREEN);
    222   background->AddChild(green);
    223 
    224   RunPixelTestWithReadbackTarget(GL_WITH_DEFAULT,
    225                                  background,
    226                                  green.get(),
    227                                  base::FilePath(FILE_PATH_LITERAL(
    228                                      "green.png")));
    229 }
    230 
    231 TEST_F(LayerTreeHostReadbackPixelTest,
    232        ReadbackSmallNonRootLayer_Software) {
    233   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
    234       gfx::Rect(200, 200), SK_ColorWHITE);
    235 
    236   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
    237       gfx::Rect(100, 100, 100, 100), SK_ColorGREEN);
    238   background->AddChild(green);
    239 
    240   RunPixelTestWithReadbackTarget(SOFTWARE_WITH_DEFAULT,
    241                                  background,
    242                                  green.get(),
    243                                  base::FilePath(FILE_PATH_LITERAL(
    244                                      "green_small.png")));
    245 }
    246 
    247 TEST_F(LayerTreeHostReadbackPixelTest, ReadbackSmallNonRootLayer_GL_Bitmap) {
    248   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
    249       gfx::Rect(200, 200), SK_ColorWHITE);
    250 
    251   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
    252       gfx::Rect(100, 100, 100, 100), SK_ColorGREEN);
    253   background->AddChild(green);
    254 
    255   RunPixelTestWithReadbackTarget(GL_WITH_BITMAP,
    256                                  background,
    257                                  green.get(),
    258                                  base::FilePath(FILE_PATH_LITERAL(
    259                                      "green_small.png")));
    260 }
    261 
    262 TEST_F(LayerTreeHostReadbackPixelTest, ReadbackSmallNonRootLayer_GL) {
    263   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
    264       gfx::Rect(200, 200), SK_ColorWHITE);
    265 
    266   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
    267       gfx::Rect(100, 100, 100, 100), SK_ColorGREEN);
    268   background->AddChild(green);
    269 
    270   RunPixelTestWithReadbackTarget(GL_WITH_DEFAULT,
    271                                  background,
    272                                  green.get(),
    273                                  base::FilePath(FILE_PATH_LITERAL(
    274                                      "green_small.png")));
    275 }
    276 
    277 TEST_F(LayerTreeHostReadbackPixelTest,
    278        ReadbackSmallNonRootLayerWithChild_Software) {
    279   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
    280       gfx::Rect(200, 200), SK_ColorWHITE);
    281 
    282   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
    283       gfx::Rect(100, 100, 100, 100), SK_ColorGREEN);
    284   background->AddChild(green);
    285 
    286   scoped_refptr<SolidColorLayer> blue = CreateSolidColorLayer(
    287       gfx::Rect(50, 50, 50, 50), SK_ColorBLUE);
    288   green->AddChild(blue);
    289 
    290   RunPixelTestWithReadbackTarget(SOFTWARE_WITH_DEFAULT,
    291                                  background,
    292                                  green.get(),
    293                                  base::FilePath(FILE_PATH_LITERAL(
    294                                      "green_small_with_blue_corner.png")));
    295 }
    296 
    297 TEST_F(LayerTreeHostReadbackPixelTest,
    298        ReadbackSmallNonRootLayerWithChild_GL_Bitmap) {
    299   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
    300       gfx::Rect(200, 200), SK_ColorWHITE);
    301 
    302   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
    303       gfx::Rect(100, 100, 100, 100), SK_ColorGREEN);
    304   background->AddChild(green);
    305 
    306   scoped_refptr<SolidColorLayer> blue = CreateSolidColorLayer(
    307       gfx::Rect(50, 50, 50, 50), SK_ColorBLUE);
    308   green->AddChild(blue);
    309 
    310   RunPixelTestWithReadbackTarget(GL_WITH_BITMAP,
    311                                  background,
    312                                  green.get(),
    313                                  base::FilePath(FILE_PATH_LITERAL(
    314                                      "green_small_with_blue_corner.png")));
    315 }
    316 
    317 TEST_F(LayerTreeHostReadbackPixelTest, ReadbackSmallNonRootLayerWithChild_GL) {
    318   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
    319       gfx::Rect(200, 200), SK_ColorWHITE);
    320 
    321   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
    322       gfx::Rect(100, 100, 100, 100), SK_ColorGREEN);
    323   background->AddChild(green);
    324 
    325   scoped_refptr<SolidColorLayer> blue = CreateSolidColorLayer(
    326       gfx::Rect(50, 50, 50, 50), SK_ColorBLUE);
    327   green->AddChild(blue);
    328 
    329   RunPixelTestWithReadbackTarget(GL_WITH_DEFAULT,
    330                                  background,
    331                                  green.get(),
    332                                  base::FilePath(FILE_PATH_LITERAL(
    333                                      "green_small_with_blue_corner.png")));
    334 }
    335 
    336 TEST_F(LayerTreeHostReadbackPixelTest, ReadbackSubrect_Software) {
    337   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
    338       gfx::Rect(200, 200), SK_ColorWHITE);
    339 
    340   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
    341       gfx::Rect(200, 200), SK_ColorGREEN);
    342   background->AddChild(green);
    343 
    344   scoped_refptr<SolidColorLayer> blue = CreateSolidColorLayer(
    345       gfx::Rect(100, 100, 50, 50), SK_ColorBLUE);
    346   green->AddChild(blue);
    347 
    348   // Grab the middle of the root layer.
    349   copy_subrect_ = gfx::Rect(50, 50, 100, 100);
    350 
    351   RunPixelTest(SOFTWARE_WITH_DEFAULT,
    352                background,
    353                base::FilePath(FILE_PATH_LITERAL(
    354                    "green_small_with_blue_corner.png")));
    355 }
    356 
    357 TEST_F(LayerTreeHostReadbackPixelTest, ReadbackSubrect_GL_Bitmap) {
    358   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
    359       gfx::Rect(200, 200), SK_ColorWHITE);
    360 
    361   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
    362       gfx::Rect(200, 200), SK_ColorGREEN);
    363   background->AddChild(green);
    364 
    365   scoped_refptr<SolidColorLayer> blue = CreateSolidColorLayer(
    366       gfx::Rect(100, 100, 50, 50), SK_ColorBLUE);
    367   green->AddChild(blue);
    368 
    369   // Grab the middle of the root layer.
    370   copy_subrect_ = gfx::Rect(50, 50, 100, 100);
    371 
    372   RunPixelTest(GL_WITH_BITMAP,
    373                background,
    374                base::FilePath(FILE_PATH_LITERAL(
    375                    "green_small_with_blue_corner.png")));
    376 }
    377 
    378 TEST_F(LayerTreeHostReadbackPixelTest, ReadbackSubrect_GL) {
    379   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
    380       gfx::Rect(200, 200), SK_ColorWHITE);
    381 
    382   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
    383       gfx::Rect(200, 200), SK_ColorGREEN);
    384   background->AddChild(green);
    385 
    386   scoped_refptr<SolidColorLayer> blue = CreateSolidColorLayer(
    387       gfx::Rect(100, 100, 50, 50), SK_ColorBLUE);
    388   green->AddChild(blue);
    389 
    390   // Grab the middle of the root layer.
    391   copy_subrect_ = gfx::Rect(50, 50, 100, 100);
    392 
    393   RunPixelTest(GL_WITH_DEFAULT,
    394                background,
    395                base::FilePath(FILE_PATH_LITERAL(
    396                    "green_small_with_blue_corner.png")));
    397 }
    398 
    399 TEST_F(LayerTreeHostReadbackPixelTest, ReadbackNonRootLayerSubrect_Software) {
    400   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
    401       gfx::Rect(200, 200), SK_ColorWHITE);
    402 
    403   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
    404       gfx::Rect(25, 25, 150, 150), SK_ColorGREEN);
    405   background->AddChild(green);
    406 
    407   scoped_refptr<SolidColorLayer> blue = CreateSolidColorLayer(
    408       gfx::Rect(75, 75, 50, 50), SK_ColorBLUE);
    409   green->AddChild(blue);
    410 
    411   // Grab the middle of the green layer.
    412   copy_subrect_ = gfx::Rect(25, 25, 100, 100);
    413 
    414   RunPixelTestWithReadbackTarget(SOFTWARE_WITH_DEFAULT,
    415                                  background,
    416                                  green.get(),
    417                                  base::FilePath(FILE_PATH_LITERAL(
    418                                      "green_small_with_blue_corner.png")));
    419 }
    420 
    421 TEST_F(LayerTreeHostReadbackPixelTest, ReadbackNonRootLayerSubrect_GL_Bitmap) {
    422   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
    423       gfx::Rect(200, 200), SK_ColorWHITE);
    424 
    425   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
    426       gfx::Rect(25, 25, 150, 150), SK_ColorGREEN);
    427   background->AddChild(green);
    428 
    429   scoped_refptr<SolidColorLayer> blue = CreateSolidColorLayer(
    430       gfx::Rect(75, 75, 50, 50), SK_ColorBLUE);
    431   green->AddChild(blue);
    432 
    433   // Grab the middle of the green layer.
    434   copy_subrect_ = gfx::Rect(25, 25, 100, 100);
    435 
    436   RunPixelTestWithReadbackTarget(GL_WITH_BITMAP,
    437                                  background,
    438                                  green.get(),
    439                                  base::FilePath(FILE_PATH_LITERAL(
    440                                      "green_small_with_blue_corner.png")));
    441 }
    442 
    443 TEST_F(LayerTreeHostReadbackPixelTest, ReadbackNonRootLayerSubrect_GL) {
    444   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
    445       gfx::Rect(200, 200), SK_ColorWHITE);
    446 
    447   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
    448       gfx::Rect(25, 25, 150, 150), SK_ColorGREEN);
    449   background->AddChild(green);
    450 
    451   scoped_refptr<SolidColorLayer> blue = CreateSolidColorLayer(
    452       gfx::Rect(75, 75, 50, 50), SK_ColorBLUE);
    453   green->AddChild(blue);
    454 
    455   // Grab the middle of the green layer.
    456   copy_subrect_ = gfx::Rect(25, 25, 100, 100);
    457 
    458   RunPixelTestWithReadbackTarget(GL_WITH_DEFAULT,
    459                                  background,
    460                                  green.get(),
    461                                  base::FilePath(FILE_PATH_LITERAL(
    462                                      "green_small_with_blue_corner.png")));
    463 }
    464 
    465 class LayerTreeHostReadbackDeviceScalePixelTest
    466     : public LayerTreeHostReadbackPixelTest {
    467  protected:
    468   LayerTreeHostReadbackDeviceScalePixelTest()
    469       : device_scale_factor_(1.f),
    470         white_client_(SK_ColorWHITE),
    471         green_client_(SK_ColorGREEN),
    472         blue_client_(SK_ColorBLUE) {}
    473 
    474   virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE {
    475     // Cause the device scale factor to be inherited by contents scales.
    476     settings->layer_transforms_should_scale_layer_contents = true;
    477   }
    478 
    479   virtual void SetupTree() OVERRIDE {
    480     layer_tree_host()->SetDeviceScaleFactor(device_scale_factor_);
    481     LayerTreePixelTest::SetupTree();
    482   }
    483 
    484   virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
    485     LayerImpl* root_impl = host_impl->active_tree()->root_layer();
    486 
    487     LayerImpl* background_impl = root_impl->children()[0];
    488     EXPECT_EQ(device_scale_factor_, background_impl->contents_scale_x());
    489     EXPECT_EQ(device_scale_factor_, background_impl->contents_scale_y());
    490 
    491     LayerImpl* green_impl = background_impl->children()[0];
    492     EXPECT_EQ(device_scale_factor_, green_impl->contents_scale_x());
    493     EXPECT_EQ(device_scale_factor_, green_impl->contents_scale_y());
    494 
    495     LayerImpl* blue_impl = green_impl->children()[0];
    496     EXPECT_EQ(device_scale_factor_, blue_impl->contents_scale_x());
    497     EXPECT_EQ(device_scale_factor_, blue_impl->contents_scale_y());
    498   }
    499 
    500   float device_scale_factor_;
    501   SolidColorContentLayerClient white_client_;
    502   SolidColorContentLayerClient green_client_;
    503   SolidColorContentLayerClient blue_client_;
    504 };
    505 
    506 TEST_F(LayerTreeHostReadbackDeviceScalePixelTest,
    507        ReadbackSubrect_Software) {
    508   scoped_refptr<ContentLayer> background = ContentLayer::Create(&white_client_);
    509   background->SetAnchorPoint(gfx::PointF());
    510   background->SetBounds(gfx::Size(100, 100));
    511   background->SetIsDrawable(true);
    512 
    513   scoped_refptr<ContentLayer> green = ContentLayer::Create(&green_client_);
    514   green->SetAnchorPoint(gfx::PointF());
    515   green->SetBounds(gfx::Size(100, 100));
    516   green->SetIsDrawable(true);
    517   background->AddChild(green);
    518 
    519   scoped_refptr<ContentLayer> blue = ContentLayer::Create(&blue_client_);
    520   blue->SetAnchorPoint(gfx::PointF());
    521   blue->SetPosition(gfx::Point(50, 50));
    522   blue->SetBounds(gfx::Size(25, 25));
    523   blue->SetIsDrawable(true);
    524   green->AddChild(blue);
    525 
    526   // Grab the middle of the root layer.
    527   copy_subrect_ = gfx::Rect(25, 25, 50, 50);
    528   device_scale_factor_ = 2.f;
    529 
    530   RunPixelTest(SOFTWARE_WITH_DEFAULT,
    531                background,
    532                base::FilePath(FILE_PATH_LITERAL(
    533                    "green_small_with_blue_corner.png")));
    534 }
    535 
    536 TEST_F(LayerTreeHostReadbackDeviceScalePixelTest,
    537        ReadbackSubrect_GL) {
    538   scoped_refptr<ContentLayer> background = ContentLayer::Create(&white_client_);
    539   background->SetAnchorPoint(gfx::PointF());
    540   background->SetBounds(gfx::Size(100, 100));
    541   background->SetIsDrawable(true);
    542 
    543   scoped_refptr<ContentLayer> green = ContentLayer::Create(&green_client_);
    544   green->SetAnchorPoint(gfx::PointF());
    545   green->SetBounds(gfx::Size(100, 100));
    546   green->SetIsDrawable(true);
    547   background->AddChild(green);
    548 
    549   scoped_refptr<ContentLayer> blue = ContentLayer::Create(&blue_client_);
    550   blue->SetAnchorPoint(gfx::PointF());
    551   blue->SetPosition(gfx::Point(50, 50));
    552   blue->SetBounds(gfx::Size(25, 25));
    553   blue->SetIsDrawable(true);
    554   green->AddChild(blue);
    555 
    556   // Grab the middle of the root layer.
    557   copy_subrect_ = gfx::Rect(25, 25, 50, 50);
    558   device_scale_factor_ = 2.f;
    559 
    560   RunPixelTest(GL_WITH_DEFAULT,
    561                background,
    562                base::FilePath(FILE_PATH_LITERAL(
    563                    "green_small_with_blue_corner.png")));
    564 }
    565 
    566 TEST_F(LayerTreeHostReadbackDeviceScalePixelTest,
    567        ReadbackNonRootLayerSubrect_Software) {
    568   scoped_refptr<ContentLayer> background = ContentLayer::Create(&white_client_);
    569   background->SetAnchorPoint(gfx::PointF());
    570   background->SetBounds(gfx::Size(100, 100));
    571   background->SetIsDrawable(true);
    572 
    573   scoped_refptr<ContentLayer> green = ContentLayer::Create(&green_client_);
    574   green->SetAnchorPoint(gfx::PointF());
    575   green->SetPosition(gfx::Point(10, 20));
    576   green->SetBounds(gfx::Size(90, 80));
    577   green->SetIsDrawable(true);
    578   background->AddChild(green);
    579 
    580   scoped_refptr<ContentLayer> blue = ContentLayer::Create(&blue_client_);
    581   blue->SetAnchorPoint(gfx::PointF());
    582   blue->SetPosition(gfx::Point(50, 50));
    583   blue->SetBounds(gfx::Size(25, 25));
    584   blue->SetIsDrawable(true);
    585   green->AddChild(blue);
    586 
    587   // Grab the green layer's content with blue in the bottom right.
    588   copy_subrect_ = gfx::Rect(25, 25, 50, 50);
    589   device_scale_factor_ = 2.f;
    590 
    591   RunPixelTestWithReadbackTarget(SOFTWARE_WITH_DEFAULT,
    592                                  background,
    593                                  green.get(),
    594                                  base::FilePath(FILE_PATH_LITERAL(
    595                                      "green_small_with_blue_corner.png")));
    596 }
    597 
    598 TEST_F(LayerTreeHostReadbackDeviceScalePixelTest,
    599        ReadbackNonRootLayerSubrect_GL) {
    600   scoped_refptr<ContentLayer> background = ContentLayer::Create(&white_client_);
    601   background->SetAnchorPoint(gfx::PointF());
    602   background->SetBounds(gfx::Size(100, 100));
    603   background->SetIsDrawable(true);
    604 
    605   scoped_refptr<ContentLayer> green = ContentLayer::Create(&green_client_);
    606   green->SetAnchorPoint(gfx::PointF());
    607   green->SetPosition(gfx::Point(10, 20));
    608   green->SetBounds(gfx::Size(90, 80));
    609   green->SetIsDrawable(true);
    610   background->AddChild(green);
    611 
    612   scoped_refptr<ContentLayer> blue = ContentLayer::Create(&blue_client_);
    613   blue->SetAnchorPoint(gfx::PointF());
    614   blue->SetPosition(gfx::Point(50, 50));
    615   blue->SetBounds(gfx::Size(25, 25));
    616   blue->SetIsDrawable(true);
    617   green->AddChild(blue);
    618 
    619   // Grab the green layer's content with blue in the bottom right.
    620   copy_subrect_ = gfx::Rect(25, 25, 50, 50);
    621   device_scale_factor_ = 2.f;
    622 
    623   RunPixelTestWithReadbackTarget(GL_WITH_DEFAULT,
    624                                  background,
    625                                  green.get(),
    626                                  base::FilePath(FILE_PATH_LITERAL(
    627                                      "green_small_with_blue_corner.png")));
    628 }
    629 
    630 class LayerTreeHostReadbackViaCompositeAndReadbackPixelTest
    631     : public LayerTreePixelTest {
    632  protected:
    633   LayerTreeHostReadbackViaCompositeAndReadbackPixelTest()
    634       : device_scale_factor_(1.f),
    635         white_client_(SK_ColorWHITE),
    636         green_client_(SK_ColorGREEN),
    637         blue_client_(SK_ColorBLUE) {}
    638 
    639   virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE {
    640     // Cause the device scale factor to be inherited by contents scales.
    641     settings->layer_transforms_should_scale_layer_contents = true;
    642   }
    643 
    644   virtual void SetupTree() OVERRIDE {
    645     layer_tree_host()->SetDeviceScaleFactor(device_scale_factor_);
    646     LayerTreePixelTest::SetupTree();
    647   }
    648 
    649   virtual void BeginTest() OVERRIDE {
    650     EXPECT_EQ(device_scale_factor_, layer_tree_host()->device_scale_factor());
    651     if (TestEnded())
    652       return;
    653 
    654     gfx::Rect device_viewport_copy_rect(
    655         layer_tree_host()->device_viewport_size());
    656     if (!device_viewport_copy_subrect_.IsEmpty())
    657       device_viewport_copy_rect.Intersect(device_viewport_copy_subrect_);
    658 
    659     scoped_ptr<SkBitmap> bitmap(new SkBitmap);
    660     bitmap->setConfig(SkBitmap::kARGB_8888_Config,
    661                       device_viewport_copy_rect.width(),
    662                       device_viewport_copy_rect.height());
    663     bitmap->allocPixels();
    664     {
    665       scoped_ptr<SkAutoLockPixels> lock(new SkAutoLockPixels(*bitmap));
    666       layer_tree_host()->CompositeAndReadback(bitmap->getPixels(),
    667                                               device_viewport_copy_rect);
    668     }
    669 
    670     result_bitmap_ = bitmap.Pass();
    671     EndTest();
    672   }
    673 
    674   virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
    675     LayerImpl* root_impl = host_impl->active_tree()->root_layer();
    676 
    677     LayerImpl* background_impl = root_impl->children()[0];
    678     EXPECT_EQ(device_scale_factor_, background_impl->contents_scale_x());
    679     EXPECT_EQ(device_scale_factor_, background_impl->contents_scale_y());
    680 
    681     LayerImpl* green_impl = background_impl->children()[0];
    682     EXPECT_EQ(device_scale_factor_, green_impl->contents_scale_x());
    683     EXPECT_EQ(device_scale_factor_, green_impl->contents_scale_y());
    684 
    685     LayerImpl* blue_impl = green_impl->children()[0];
    686     EXPECT_EQ(device_scale_factor_, blue_impl->contents_scale_x());
    687     EXPECT_EQ(device_scale_factor_, blue_impl->contents_scale_y());
    688   }
    689 
    690   gfx::Rect device_viewport_copy_subrect_;
    691   float device_scale_factor_;
    692   SolidColorContentLayerClient white_client_;
    693   SolidColorContentLayerClient green_client_;
    694   SolidColorContentLayerClient blue_client_;
    695 };
    696 
    697 TEST_F(LayerTreeHostReadbackViaCompositeAndReadbackPixelTest,
    698        CompositeAndReadback_Software_1) {
    699   scoped_refptr<ContentLayer> background = ContentLayer::Create(&white_client_);
    700   background->SetAnchorPoint(gfx::PointF());
    701   background->SetBounds(gfx::Size(200, 200));
    702   background->SetIsDrawable(true);
    703 
    704   scoped_refptr<ContentLayer> green = ContentLayer::Create(&green_client_);
    705   green->SetAnchorPoint(gfx::PointF());
    706   green->SetBounds(gfx::Size(200, 200));
    707   green->SetIsDrawable(true);
    708   background->AddChild(green);
    709 
    710   scoped_refptr<ContentLayer> blue = ContentLayer::Create(&blue_client_);
    711   blue->SetAnchorPoint(gfx::PointF());
    712   blue->SetPosition(gfx::Point(100, 100));
    713   blue->SetBounds(gfx::Size(50, 50));
    714   blue->SetIsDrawable(true);
    715   green->AddChild(blue);
    716 
    717   // Grab the middle of the device viewport.
    718   device_viewport_copy_subrect_ = gfx::Rect(50, 50, 100, 100);
    719   device_scale_factor_ = 1.f;
    720 
    721   RunPixelTestWithReadbackTarget(SOFTWARE_WITH_DEFAULT,
    722                                  background,
    723                                  green.get(),
    724                                  base::FilePath(FILE_PATH_LITERAL(
    725                                      "green_small_with_blue_corner.png")));
    726 }
    727 
    728 TEST_F(LayerTreeHostReadbackViaCompositeAndReadbackPixelTest,
    729        CompositeAndReadback_Software_2) {
    730   scoped_refptr<ContentLayer> background = ContentLayer::Create(&white_client_);
    731   background->SetAnchorPoint(gfx::PointF());
    732   background->SetBounds(gfx::Size(100, 100));
    733   background->SetIsDrawable(true);
    734 
    735   scoped_refptr<ContentLayer> green = ContentLayer::Create(&green_client_);
    736   green->SetAnchorPoint(gfx::PointF());
    737   green->SetBounds(gfx::Size(100, 100));
    738   green->SetIsDrawable(true);
    739   background->AddChild(green);
    740 
    741   scoped_refptr<ContentLayer> blue = ContentLayer::Create(&blue_client_);
    742   blue->SetAnchorPoint(gfx::PointF());
    743   blue->SetPosition(gfx::Point(50, 50));
    744   blue->SetBounds(gfx::Size(25, 25));
    745   blue->SetIsDrawable(true);
    746   green->AddChild(blue);
    747 
    748   // Grab the middle of the device viewport.
    749   device_viewport_copy_subrect_ = gfx::Rect(50, 50, 100, 100);
    750   device_scale_factor_ = 2.f;
    751 
    752   RunPixelTestWithReadbackTarget(SOFTWARE_WITH_DEFAULT,
    753                                  background,
    754                                  green.get(),
    755                                  base::FilePath(FILE_PATH_LITERAL(
    756                                      "green_small_with_blue_corner.png")));
    757 }
    758 
    759 TEST_F(LayerTreeHostReadbackViaCompositeAndReadbackPixelTest,
    760        CompositeAndReadback_GL_1) {
    761   scoped_refptr<ContentLayer> background = ContentLayer::Create(&white_client_);
    762   background->SetAnchorPoint(gfx::PointF());
    763   background->SetBounds(gfx::Size(200, 200));
    764   background->SetIsDrawable(true);
    765 
    766   scoped_refptr<ContentLayer> green = ContentLayer::Create(&green_client_);
    767   green->SetAnchorPoint(gfx::PointF());
    768   green->SetBounds(gfx::Size(200, 200));
    769   green->SetIsDrawable(true);
    770   background->AddChild(green);
    771 
    772   scoped_refptr<ContentLayer> blue = ContentLayer::Create(&blue_client_);
    773   blue->SetAnchorPoint(gfx::PointF());
    774   blue->SetPosition(gfx::Point(100, 100));
    775   blue->SetBounds(gfx::Size(50, 50));
    776   blue->SetIsDrawable(true);
    777   green->AddChild(blue);
    778 
    779   // Grab the middle of the device viewport.
    780   device_viewport_copy_subrect_ = gfx::Rect(50, 50, 100, 100);
    781   device_scale_factor_ = 1.f;
    782 
    783   RunPixelTestWithReadbackTarget(GL_WITH_DEFAULT,
    784                                  background,
    785                                  green.get(),
    786                                  base::FilePath(FILE_PATH_LITERAL(
    787                                      "green_small_with_blue_corner.png")));
    788 }
    789 
    790 TEST_F(LayerTreeHostReadbackViaCompositeAndReadbackPixelTest,
    791        CompositeAndReadback_GL_2) {
    792   scoped_refptr<ContentLayer> background = ContentLayer::Create(&white_client_);
    793   background->SetAnchorPoint(gfx::PointF());
    794   background->SetBounds(gfx::Size(100, 100));
    795   background->SetIsDrawable(true);
    796 
    797   scoped_refptr<ContentLayer> green = ContentLayer::Create(&green_client_);
    798   green->SetAnchorPoint(gfx::PointF());
    799   green->SetBounds(gfx::Size(100, 100));
    800   green->SetIsDrawable(true);
    801   background->AddChild(green);
    802 
    803   scoped_refptr<ContentLayer> blue = ContentLayer::Create(&blue_client_);
    804   blue->SetAnchorPoint(gfx::PointF());
    805   blue->SetPosition(gfx::Point(50, 50));
    806   blue->SetBounds(gfx::Size(25, 25));
    807   blue->SetIsDrawable(true);
    808   green->AddChild(blue);
    809 
    810   // Grab the middle of the device viewport.
    811   device_viewport_copy_subrect_ = gfx::Rect(50, 50, 100, 100);
    812   device_scale_factor_ = 2.f;
    813 
    814   RunPixelTestWithReadbackTarget(GL_WITH_DEFAULT,
    815                                  background,
    816                                  green.get(),
    817                                  base::FilePath(FILE_PATH_LITERAL(
    818                                      "green_small_with_blue_corner.png")));
    819 }
    820 
    821 TEST_F(LayerTreeHostReadbackPixelTest, ReadbackNonRootLayerOutsideViewport) {
    822   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
    823       gfx::Rect(200, 200), SK_ColorWHITE);
    824 
    825   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
    826       gfx::Rect(200, 200), SK_ColorGREEN);
    827   // Only the top left quarter of the layer is inside the viewport, so the
    828   // blue layer is entirely outside.
    829   green->SetPosition(gfx::Point(100, 100));
    830   background->AddChild(green);
    831 
    832   scoped_refptr<SolidColorLayer> blue = CreateSolidColorLayer(
    833       gfx::Rect(150, 150, 50, 50), SK_ColorBLUE);
    834   green->AddChild(blue);
    835 
    836   RunPixelTestWithReadbackTarget(GL_WITH_DEFAULT,
    837                                  background,
    838                                  green.get(),
    839                                  base::FilePath(FILE_PATH_LITERAL(
    840                                      "green_with_blue_corner.png")));
    841 }
    842 
    843 // TextureLayers are clipped differently than SolidColorLayers, verify they
    844 // also can be copied when outside of the viewport.
    845 TEST_F(LayerTreeHostReadbackPixelTest,
    846        ReadbackNonRootTextureLayerOutsideViewport) {
    847   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
    848       gfx::Rect(200, 200), SK_ColorWHITE);
    849 
    850   SkBitmap bitmap;
    851   bitmap.setConfig(SkBitmap::kARGB_8888_Config, 200, 200);
    852   bitmap.allocPixels();
    853   bitmap.eraseColor(SK_ColorGREEN);
    854   {
    855     SkDevice device(bitmap);
    856     skia::RefPtr<SkCanvas> canvas = skia::AdoptRef(new SkCanvas(&device));
    857     SkPaint paint;
    858     paint.setStyle(SkPaint::kFill_Style);
    859     paint.setColor(SK_ColorBLUE);
    860     canvas->drawRect(SkRect::MakeXYWH(150, 150, 50, 50), paint);
    861   }
    862 
    863   scoped_refptr<TextureLayer> texture = CreateTextureLayer(
    864       gfx::Rect(200, 200), bitmap);
    865 
    866   // Tests with solid color layers verify correctness when CanClipSelf is false.
    867   EXPECT_FALSE(background->CanClipSelf());
    868   // This test verifies correctness when CanClipSelf is true.
    869   EXPECT_TRUE(texture->CanClipSelf());
    870 
    871   // Only the top left quarter of the layer is inside the viewport, so the
    872   // blue corner is entirely outside.
    873   texture->SetPosition(gfx::Point(100, 100));
    874   background->AddChild(texture);
    875 
    876   RunPixelTestWithReadbackTarget(GL_WITH_DEFAULT,
    877                                  background,
    878                                  texture.get(),
    879                                  base::FilePath(FILE_PATH_LITERAL(
    880                                      "green_with_blue_corner.png")));
    881 }
    882 
    883 }  // namespace
    884 }  // namespace cc
    885 
    886 #endif  // OS_ANDROID
    887