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/solid_color_layer.h"
      7 #include "cc/layers/texture_layer.h"
      8 #include "cc/output/copy_output_request.h"
      9 #include "cc/output/copy_output_result.h"
     10 #include "cc/test/fake_picture_layer.h"
     11 #include "cc/test/fake_picture_layer_impl.h"
     12 #include "cc/test/layer_tree_pixel_test.h"
     13 #include "cc/test/paths.h"
     14 #include "cc/test/solid_color_content_layer_client.h"
     15 #include "cc/trees/layer_tree_impl.h"
     16 
     17 #if !defined(OS_ANDROID)
     18 
     19 namespace cc {
     20 namespace {
     21 
     22 class LayerTreeHostReadbackPixelTest : public LayerTreePixelTest {
     23  protected:
     24   LayerTreeHostReadbackPixelTest()
     25       : insert_copy_request_after_frame_count_(0) {}
     26 
     27   virtual scoped_ptr<CopyOutputRequest> CreateCopyOutputRequest() OVERRIDE {
     28     scoped_ptr<CopyOutputRequest> request;
     29 
     30     switch (test_type_) {
     31       case GL_WITH_BITMAP:
     32       case SOFTWARE_WITH_BITMAP:
     33         request = CopyOutputRequest::CreateBitmapRequest(
     34             base::Bind(&LayerTreeHostReadbackPixelTest::ReadbackResultAsBitmap,
     35                        base::Unretained(this)));
     36         break;
     37       case SOFTWARE_WITH_DEFAULT:
     38         request = CopyOutputRequest::CreateRequest(
     39             base::Bind(&LayerTreeHostReadbackPixelTest::ReadbackResultAsBitmap,
     40                        base::Unretained(this)));
     41         break;
     42       case GL_WITH_DEFAULT:
     43         request = CopyOutputRequest::CreateRequest(
     44             base::Bind(&LayerTreeHostReadbackPixelTest::ReadbackResultAsTexture,
     45                        base::Unretained(this)));
     46         break;
     47     }
     48 
     49     if (!copy_subrect_.IsEmpty())
     50       request->set_area(copy_subrect_);
     51     return request.Pass();
     52   }
     53 
     54   virtual void BeginTest() OVERRIDE {
     55     if (insert_copy_request_after_frame_count_ == 0) {
     56       Layer* const target =
     57           readback_target_ ? readback_target_ : layer_tree_host()->root_layer();
     58       target->RequestCopyOfOutput(CreateCopyOutputRequest().Pass());
     59     }
     60     PostSetNeedsCommitToMainThread();
     61   }
     62 
     63   virtual void DidCommitAndDrawFrame() OVERRIDE {
     64     if (insert_copy_request_after_frame_count_ ==
     65         layer_tree_host()->source_frame_number()) {
     66       Layer* const target =
     67           readback_target_ ? readback_target_ : layer_tree_host()->root_layer();
     68       target->RequestCopyOfOutput(CreateCopyOutputRequest().Pass());
     69     }
     70   }
     71 
     72   void ReadbackResultAsBitmap(scoped_ptr<CopyOutputResult> result) {
     73     EXPECT_TRUE(proxy()->IsMainThread());
     74     EXPECT_TRUE(result->HasBitmap());
     75     result_bitmap_ = result->TakeBitmap().Pass();
     76     EndTest();
     77   }
     78 
     79   void ReadbackResultAsTexture(scoped_ptr<CopyOutputResult> result) {
     80     EXPECT_TRUE(proxy()->IsMainThread());
     81     EXPECT_TRUE(result->HasTexture());
     82 
     83     TextureMailbox texture_mailbox;
     84     scoped_ptr<SingleReleaseCallback> release_callback;
     85     result->TakeTexture(&texture_mailbox, &release_callback);
     86     EXPECT_TRUE(texture_mailbox.IsValid());
     87     EXPECT_TRUE(texture_mailbox.IsTexture());
     88 
     89     scoped_ptr<SkBitmap> bitmap =
     90         CopyTextureMailboxToBitmap(result->size(), texture_mailbox);
     91     release_callback->Run(0, false);
     92 
     93     ReadbackResultAsBitmap(CopyOutputResult::CreateBitmapResult(bitmap.Pass()));
     94   }
     95 
     96   gfx::Rect copy_subrect_;
     97   int insert_copy_request_after_frame_count_;
     98 };
     99 
    100 void IgnoreReadbackResult(scoped_ptr<CopyOutputResult> result) {}
    101 
    102 TEST_F(LayerTreeHostReadbackPixelTest, ReadbackRootLayer_Software) {
    103   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
    104       gfx::Rect(200, 200), SK_ColorWHITE);
    105 
    106   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
    107       gfx::Rect(200, 200), SK_ColorGREEN);
    108   background->AddChild(green);
    109 
    110   RunPixelTest(SOFTWARE_WITH_DEFAULT,
    111                background,
    112                base::FilePath(FILE_PATH_LITERAL(
    113                    "green.png")));
    114 }
    115 
    116 TEST_F(LayerTreeHostReadbackPixelTest, ReadbackRootLayer_Software_Bitmap) {
    117   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
    118       gfx::Rect(200, 200), SK_ColorWHITE);
    119 
    120   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
    121       gfx::Rect(200, 200), SK_ColorGREEN);
    122   background->AddChild(green);
    123 
    124   RunPixelTest(SOFTWARE_WITH_BITMAP,
    125                background,
    126                base::FilePath(FILE_PATH_LITERAL(
    127                    "green.png")));
    128 }
    129 
    130 TEST_F(LayerTreeHostReadbackPixelTest, ReadbackRootLayer_GL_Bitmap) {
    131   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
    132       gfx::Rect(200, 200), SK_ColorWHITE);
    133 
    134   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
    135       gfx::Rect(200, 200), SK_ColorGREEN);
    136   background->AddChild(green);
    137 
    138   RunPixelTest(GL_WITH_BITMAP,
    139                background,
    140                base::FilePath(FILE_PATH_LITERAL(
    141                    "green.png")));
    142 }
    143 
    144 TEST_F(LayerTreeHostReadbackPixelTest, ReadbackRootLayer_GL) {
    145   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
    146       gfx::Rect(200, 200), SK_ColorWHITE);
    147 
    148   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
    149       gfx::Rect(200, 200), SK_ColorGREEN);
    150   background->AddChild(green);
    151 
    152   RunPixelTest(GL_WITH_DEFAULT,
    153                background,
    154                base::FilePath(FILE_PATH_LITERAL(
    155                    "green.png")));
    156 }
    157 
    158 TEST_F(LayerTreeHostReadbackPixelTest,
    159        ReadbackRootLayerWithChild_Software) {
    160   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
    161       gfx::Rect(200, 200), SK_ColorWHITE);
    162 
    163   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
    164       gfx::Rect(200, 200), SK_ColorGREEN);
    165   background->AddChild(green);
    166 
    167   scoped_refptr<SolidColorLayer> blue = CreateSolidColorLayer(
    168       gfx::Rect(150, 150, 50, 50), SK_ColorBLUE);
    169   green->AddChild(blue);
    170 
    171   RunPixelTest(SOFTWARE_WITH_DEFAULT,
    172                background,
    173                base::FilePath(FILE_PATH_LITERAL(
    174                    "green_with_blue_corner.png")));
    175 }
    176 
    177 TEST_F(LayerTreeHostReadbackPixelTest, ReadbackRootLayerWithChild_GL_Bitmap) {
    178   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
    179       gfx::Rect(200, 200), SK_ColorWHITE);
    180 
    181   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
    182       gfx::Rect(200, 200), SK_ColorGREEN);
    183   background->AddChild(green);
    184 
    185   scoped_refptr<SolidColorLayer> blue = CreateSolidColorLayer(
    186       gfx::Rect(150, 150, 50, 50), SK_ColorBLUE);
    187   green->AddChild(blue);
    188 
    189   RunPixelTest(GL_WITH_BITMAP,
    190                background,
    191                base::FilePath(FILE_PATH_LITERAL(
    192                    "green_with_blue_corner.png")));
    193 }
    194 
    195 TEST_F(LayerTreeHostReadbackPixelTest, ReadbackRootLayerWithChild_GL) {
    196   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
    197       gfx::Rect(200, 200), SK_ColorWHITE);
    198 
    199   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
    200       gfx::Rect(200, 200), SK_ColorGREEN);
    201   background->AddChild(green);
    202 
    203   scoped_refptr<SolidColorLayer> blue = CreateSolidColorLayer(
    204       gfx::Rect(150, 150, 50, 50), SK_ColorBLUE);
    205   green->AddChild(blue);
    206 
    207   RunPixelTest(GL_WITH_DEFAULT,
    208                background,
    209                base::FilePath(FILE_PATH_LITERAL(
    210                    "green_with_blue_corner.png")));
    211 }
    212 
    213 TEST_F(LayerTreeHostReadbackPixelTest, ReadbackNonRootLayer_Software) {
    214   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
    215       gfx::Rect(200, 200), SK_ColorWHITE);
    216 
    217   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
    218       gfx::Rect(200, 200), SK_ColorGREEN);
    219   background->AddChild(green);
    220 
    221   RunPixelTestWithReadbackTarget(SOFTWARE_WITH_DEFAULT,
    222                                  background,
    223                                  green.get(),
    224                                  base::FilePath(FILE_PATH_LITERAL(
    225                                      "green.png")));
    226 }
    227 
    228 TEST_F(LayerTreeHostReadbackPixelTest, ReadbackNonRootLayer_GL_Bitmap) {
    229   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
    230       gfx::Rect(200, 200), SK_ColorWHITE);
    231 
    232   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
    233       gfx::Rect(200, 200), SK_ColorGREEN);
    234   background->AddChild(green);
    235 
    236   RunPixelTestWithReadbackTarget(GL_WITH_BITMAP,
    237                                  background,
    238                                  green.get(),
    239                                  base::FilePath(FILE_PATH_LITERAL(
    240                                      "green.png")));
    241 }
    242 
    243 TEST_F(LayerTreeHostReadbackPixelTest, ReadbackNonRootLayer_GL) {
    244   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
    245       gfx::Rect(200, 200), SK_ColorWHITE);
    246 
    247   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
    248       gfx::Rect(200, 200), SK_ColorGREEN);
    249   background->AddChild(green);
    250 
    251   RunPixelTestWithReadbackTarget(GL_WITH_DEFAULT,
    252                                  background,
    253                                  green.get(),
    254                                  base::FilePath(FILE_PATH_LITERAL(
    255                                      "green.png")));
    256 }
    257 
    258 TEST_F(LayerTreeHostReadbackPixelTest,
    259        ReadbackSmallNonRootLayer_Software) {
    260   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
    261       gfx::Rect(200, 200), SK_ColorWHITE);
    262 
    263   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
    264       gfx::Rect(100, 100, 100, 100), SK_ColorGREEN);
    265   background->AddChild(green);
    266 
    267   RunPixelTestWithReadbackTarget(SOFTWARE_WITH_DEFAULT,
    268                                  background,
    269                                  green.get(),
    270                                  base::FilePath(FILE_PATH_LITERAL(
    271                                      "green_small.png")));
    272 }
    273 
    274 TEST_F(LayerTreeHostReadbackPixelTest, ReadbackSmallNonRootLayer_GL_Bitmap) {
    275   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
    276       gfx::Rect(200, 200), SK_ColorWHITE);
    277 
    278   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
    279       gfx::Rect(100, 100, 100, 100), SK_ColorGREEN);
    280   background->AddChild(green);
    281 
    282   RunPixelTestWithReadbackTarget(GL_WITH_BITMAP,
    283                                  background,
    284                                  green.get(),
    285                                  base::FilePath(FILE_PATH_LITERAL(
    286                                      "green_small.png")));
    287 }
    288 
    289 TEST_F(LayerTreeHostReadbackPixelTest, ReadbackSmallNonRootLayer_GL) {
    290   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
    291       gfx::Rect(200, 200), SK_ColorWHITE);
    292 
    293   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
    294       gfx::Rect(100, 100, 100, 100), SK_ColorGREEN);
    295   background->AddChild(green);
    296 
    297   RunPixelTestWithReadbackTarget(GL_WITH_DEFAULT,
    298                                  background,
    299                                  green.get(),
    300                                  base::FilePath(FILE_PATH_LITERAL(
    301                                      "green_small.png")));
    302 }
    303 
    304 TEST_F(LayerTreeHostReadbackPixelTest,
    305        ReadbackSmallNonRootLayerWithChild_Software) {
    306   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
    307       gfx::Rect(200, 200), SK_ColorWHITE);
    308 
    309   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
    310       gfx::Rect(100, 100, 100, 100), SK_ColorGREEN);
    311   background->AddChild(green);
    312 
    313   scoped_refptr<SolidColorLayer> blue = CreateSolidColorLayer(
    314       gfx::Rect(50, 50, 50, 50), SK_ColorBLUE);
    315   green->AddChild(blue);
    316 
    317   RunPixelTestWithReadbackTarget(SOFTWARE_WITH_DEFAULT,
    318                                  background,
    319                                  green.get(),
    320                                  base::FilePath(FILE_PATH_LITERAL(
    321                                      "green_small_with_blue_corner.png")));
    322 }
    323 
    324 TEST_F(LayerTreeHostReadbackPixelTest,
    325        ReadbackSmallNonRootLayerWithChild_GL_Bitmap) {
    326   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
    327       gfx::Rect(200, 200), SK_ColorWHITE);
    328 
    329   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
    330       gfx::Rect(100, 100, 100, 100), SK_ColorGREEN);
    331   background->AddChild(green);
    332 
    333   scoped_refptr<SolidColorLayer> blue = CreateSolidColorLayer(
    334       gfx::Rect(50, 50, 50, 50), SK_ColorBLUE);
    335   green->AddChild(blue);
    336 
    337   RunPixelTestWithReadbackTarget(GL_WITH_BITMAP,
    338                                  background,
    339                                  green.get(),
    340                                  base::FilePath(FILE_PATH_LITERAL(
    341                                      "green_small_with_blue_corner.png")));
    342 }
    343 
    344 TEST_F(LayerTreeHostReadbackPixelTest, ReadbackSmallNonRootLayerWithChild_GL) {
    345   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
    346       gfx::Rect(200, 200), SK_ColorWHITE);
    347 
    348   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
    349       gfx::Rect(100, 100, 100, 100), SK_ColorGREEN);
    350   background->AddChild(green);
    351 
    352   scoped_refptr<SolidColorLayer> blue = CreateSolidColorLayer(
    353       gfx::Rect(50, 50, 50, 50), SK_ColorBLUE);
    354   green->AddChild(blue);
    355 
    356   RunPixelTestWithReadbackTarget(GL_WITH_DEFAULT,
    357                                  background,
    358                                  green.get(),
    359                                  base::FilePath(FILE_PATH_LITERAL(
    360                                      "green_small_with_blue_corner.png")));
    361 }
    362 
    363 TEST_F(LayerTreeHostReadbackPixelTest,
    364        ReadbackSubtreeSurroundsTargetLayer_Software) {
    365   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
    366       gfx::Rect(0, 0, 200, 200), SK_ColorWHITE);
    367 
    368   scoped_refptr<SolidColorLayer> target = CreateSolidColorLayer(
    369       gfx::Rect(100, 100, 100, 100), SK_ColorRED);
    370   background->AddChild(target);
    371 
    372   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
    373       gfx::Rect(-100, -100, 300, 300), SK_ColorGREEN);
    374   target->AddChild(green);
    375 
    376   scoped_refptr<SolidColorLayer> blue = CreateSolidColorLayer(
    377       gfx::Rect(50, 50, 50, 50), SK_ColorBLUE);
    378   target->AddChild(blue);
    379 
    380   copy_subrect_ = gfx::Rect(0, 0, 100, 100);
    381   RunPixelTestWithReadbackTarget(SOFTWARE_WITH_DEFAULT,
    382                                  background,
    383                                  target.get(),
    384                                  base::FilePath(FILE_PATH_LITERAL(
    385                                      "green_small_with_blue_corner.png")));
    386 }
    387 
    388 TEST_F(LayerTreeHostReadbackPixelTest,
    389        ReadbackSubtreeSurroundsLayer_GL_Bitmap) {
    390   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
    391       gfx::Rect(0, 0, 200, 200), SK_ColorWHITE);
    392 
    393   scoped_refptr<SolidColorLayer> target = CreateSolidColorLayer(
    394       gfx::Rect(100, 100, 100, 100), SK_ColorRED);
    395   background->AddChild(target);
    396 
    397   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
    398       gfx::Rect(-100, -100, 300, 300), SK_ColorGREEN);
    399   target->AddChild(green);
    400 
    401   scoped_refptr<SolidColorLayer> blue = CreateSolidColorLayer(
    402       gfx::Rect(50, 50, 50, 50), SK_ColorBLUE);
    403   target->AddChild(blue);
    404 
    405   copy_subrect_ = gfx::Rect(0, 0, 100, 100);
    406   RunPixelTestWithReadbackTarget(GL_WITH_BITMAP,
    407                                  background,
    408                                  target.get(),
    409                                  base::FilePath(FILE_PATH_LITERAL(
    410                                      "green_small_with_blue_corner.png")));
    411 }
    412 
    413 TEST_F(LayerTreeHostReadbackPixelTest,
    414        ReadbackSubtreeSurroundsTargetLayer_GL) {
    415   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
    416       gfx::Rect(0, 0, 200, 200), SK_ColorWHITE);
    417 
    418   scoped_refptr<SolidColorLayer> target = CreateSolidColorLayer(
    419       gfx::Rect(100, 100, 100, 100), SK_ColorRED);
    420   background->AddChild(target);
    421 
    422   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
    423       gfx::Rect(-100, -100, 300, 300), SK_ColorGREEN);
    424   target->AddChild(green);
    425 
    426   scoped_refptr<SolidColorLayer> blue = CreateSolidColorLayer(
    427       gfx::Rect(50, 50, 50, 50), SK_ColorBLUE);
    428   target->AddChild(blue);
    429 
    430   copy_subrect_ = gfx::Rect(0, 0, 100, 100);
    431   RunPixelTestWithReadbackTarget(GL_WITH_DEFAULT,
    432                                  background,
    433                                  target.get(),
    434                                  base::FilePath(FILE_PATH_LITERAL(
    435                                      "green_small_with_blue_corner.png")));
    436 }
    437 
    438 TEST_F(LayerTreeHostReadbackPixelTest,
    439        ReadbackSubtreeExtendsBeyondTargetLayer_Software) {
    440   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
    441       gfx::Rect(0, 0, 200, 200), SK_ColorWHITE);
    442 
    443   scoped_refptr<SolidColorLayer> target = CreateSolidColorLayer(
    444       gfx::Rect(50, 50, 150, 150), SK_ColorRED);
    445   background->AddChild(target);
    446 
    447   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
    448       gfx::Rect(50, 50, 200, 200), SK_ColorGREEN);
    449   target->AddChild(green);
    450 
    451   scoped_refptr<SolidColorLayer> blue = CreateSolidColorLayer(
    452       gfx::Rect(100, 100, 50, 50), SK_ColorBLUE);
    453   target->AddChild(blue);
    454 
    455   copy_subrect_ = gfx::Rect(50, 50, 100, 100);
    456   RunPixelTestWithReadbackTarget(SOFTWARE_WITH_DEFAULT,
    457                                  background,
    458                                  target.get(),
    459                                  base::FilePath(FILE_PATH_LITERAL(
    460                                      "green_small_with_blue_corner.png")));
    461 }
    462 
    463 TEST_F(LayerTreeHostReadbackPixelTest,
    464        ReadbackSubtreeExtendsBeyondTargetLayer_GL_Bitmap) {
    465   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
    466       gfx::Rect(0, 0, 200, 200), SK_ColorWHITE);
    467 
    468   scoped_refptr<SolidColorLayer> target = CreateSolidColorLayer(
    469       gfx::Rect(50, 50, 150, 150), SK_ColorRED);
    470   background->AddChild(target);
    471 
    472   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
    473       gfx::Rect(50, 50, 200, 200), SK_ColorGREEN);
    474   target->AddChild(green);
    475 
    476   scoped_refptr<SolidColorLayer> blue = CreateSolidColorLayer(
    477       gfx::Rect(100, 100, 50, 50), SK_ColorBLUE);
    478   target->AddChild(blue);
    479 
    480   copy_subrect_ = gfx::Rect(50, 50, 100, 100);
    481   RunPixelTestWithReadbackTarget(GL_WITH_BITMAP,
    482                                  background,
    483                                  target.get(),
    484                                  base::FilePath(FILE_PATH_LITERAL(
    485                                      "green_small_with_blue_corner.png")));
    486 }
    487 
    488 TEST_F(LayerTreeHostReadbackPixelTest,
    489        ReadbackSubtreeExtendsBeyondTargetLayer_GL) {
    490   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
    491       gfx::Rect(0, 0, 200, 200), SK_ColorWHITE);
    492 
    493   scoped_refptr<SolidColorLayer> target = CreateSolidColorLayer(
    494       gfx::Rect(50, 50, 150, 150), SK_ColorRED);
    495   background->AddChild(target);
    496 
    497   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
    498       gfx::Rect(50, 50, 200, 200), SK_ColorGREEN);
    499   target->AddChild(green);
    500 
    501   scoped_refptr<SolidColorLayer> blue = CreateSolidColorLayer(
    502       gfx::Rect(100, 100, 50, 50), SK_ColorBLUE);
    503   target->AddChild(blue);
    504 
    505   copy_subrect_ = gfx::Rect(50, 50, 100, 100);
    506   RunPixelTestWithReadbackTarget(GL_WITH_DEFAULT,
    507                                  background,
    508                                  target.get(),
    509                                  base::FilePath(FILE_PATH_LITERAL(
    510                                      "green_small_with_blue_corner.png")));
    511 }
    512 
    513 TEST_F(LayerTreeHostReadbackPixelTest, ReadbackHiddenSubtree_Software) {
    514   scoped_refptr<SolidColorLayer> background =
    515       CreateSolidColorLayer(gfx::Rect(200, 200), SK_ColorBLACK);
    516 
    517   scoped_refptr<SolidColorLayer> hidden_target =
    518       CreateSolidColorLayer(gfx::Rect(200, 200), SK_ColorGREEN);
    519   hidden_target->SetHideLayerAndSubtree(true);
    520   background->AddChild(hidden_target);
    521 
    522   scoped_refptr<SolidColorLayer> blue =
    523       CreateSolidColorLayer(gfx::Rect(150, 150, 50, 50), SK_ColorBLUE);
    524   hidden_target->AddChild(blue);
    525 
    526   RunPixelTestWithReadbackTarget(
    527       SOFTWARE_WITH_DEFAULT,
    528       background,
    529       hidden_target.get(),
    530       base::FilePath(FILE_PATH_LITERAL("green_with_blue_corner.png")));
    531 }
    532 
    533 TEST_F(LayerTreeHostReadbackPixelTest, ReadbackHiddenSubtree_GL_Bitmap) {
    534   scoped_refptr<SolidColorLayer> background =
    535       CreateSolidColorLayer(gfx::Rect(200, 200), SK_ColorBLACK);
    536 
    537   scoped_refptr<SolidColorLayer> hidden_target =
    538       CreateSolidColorLayer(gfx::Rect(200, 200), SK_ColorGREEN);
    539   hidden_target->SetHideLayerAndSubtree(true);
    540   background->AddChild(hidden_target);
    541 
    542   scoped_refptr<SolidColorLayer> blue =
    543       CreateSolidColorLayer(gfx::Rect(150, 150, 50, 50), SK_ColorBLUE);
    544   hidden_target->AddChild(blue);
    545 
    546   RunPixelTestWithReadbackTarget(
    547       GL_WITH_BITMAP,
    548       background,
    549       hidden_target.get(),
    550       base::FilePath(FILE_PATH_LITERAL("green_with_blue_corner.png")));
    551 }
    552 
    553 TEST_F(LayerTreeHostReadbackPixelTest, ReadbackHiddenSubtree_GL) {
    554   scoped_refptr<SolidColorLayer> background =
    555       CreateSolidColorLayer(gfx::Rect(200, 200), SK_ColorBLACK);
    556 
    557   scoped_refptr<SolidColorLayer> hidden_target =
    558       CreateSolidColorLayer(gfx::Rect(200, 200), SK_ColorGREEN);
    559   hidden_target->SetHideLayerAndSubtree(true);
    560   background->AddChild(hidden_target);
    561 
    562   scoped_refptr<SolidColorLayer> blue =
    563       CreateSolidColorLayer(gfx::Rect(150, 150, 50, 50), SK_ColorBLUE);
    564   hidden_target->AddChild(blue);
    565 
    566   RunPixelTestWithReadbackTarget(
    567       GL_WITH_DEFAULT,
    568       background,
    569       hidden_target.get(),
    570       base::FilePath(FILE_PATH_LITERAL("green_with_blue_corner.png")));
    571 }
    572 
    573 TEST_F(LayerTreeHostReadbackPixelTest,
    574        HiddenSubtreeNotVisibleWhenDrawnForReadback_Software) {
    575   scoped_refptr<SolidColorLayer> background =
    576       CreateSolidColorLayer(gfx::Rect(200, 200), SK_ColorBLACK);
    577 
    578   scoped_refptr<SolidColorLayer> hidden_target =
    579       CreateSolidColorLayer(gfx::Rect(200, 200), SK_ColorGREEN);
    580   hidden_target->SetHideLayerAndSubtree(true);
    581   background->AddChild(hidden_target);
    582 
    583   scoped_refptr<SolidColorLayer> blue =
    584       CreateSolidColorLayer(gfx::Rect(150, 150, 50, 50), SK_ColorBLUE);
    585   hidden_target->AddChild(blue);
    586 
    587   hidden_target->RequestCopyOfOutput(CopyOutputRequest::CreateBitmapRequest(
    588       base::Bind(&IgnoreReadbackResult)));
    589   RunPixelTest(SOFTWARE_WITH_DEFAULT,
    590                background,
    591                base::FilePath(FILE_PATH_LITERAL("black.png")));
    592 }
    593 
    594 TEST_F(LayerTreeHostReadbackPixelTest,
    595        HiddenSubtreeNotVisibleWhenDrawnForReadback_GL_Bitmap) {
    596   scoped_refptr<SolidColorLayer> background =
    597       CreateSolidColorLayer(gfx::Rect(200, 200), SK_ColorBLACK);
    598 
    599   scoped_refptr<SolidColorLayer> hidden_target =
    600       CreateSolidColorLayer(gfx::Rect(200, 200), SK_ColorGREEN);
    601   hidden_target->SetHideLayerAndSubtree(true);
    602   background->AddChild(hidden_target);
    603 
    604   scoped_refptr<SolidColorLayer> blue =
    605       CreateSolidColorLayer(gfx::Rect(150, 150, 50, 50), SK_ColorBLUE);
    606   hidden_target->AddChild(blue);
    607 
    608   hidden_target->RequestCopyOfOutput(CopyOutputRequest::CreateBitmapRequest(
    609       base::Bind(&IgnoreReadbackResult)));
    610   RunPixelTest(GL_WITH_BITMAP,
    611                background,
    612                base::FilePath(FILE_PATH_LITERAL("black.png")));
    613 }
    614 
    615 TEST_F(LayerTreeHostReadbackPixelTest,
    616        HiddenSubtreeNotVisibleWhenDrawnForReadback_GL) {
    617   scoped_refptr<SolidColorLayer> background =
    618       CreateSolidColorLayer(gfx::Rect(200, 200), SK_ColorBLACK);
    619 
    620   scoped_refptr<SolidColorLayer> hidden_target =
    621       CreateSolidColorLayer(gfx::Rect(200, 200), SK_ColorGREEN);
    622   hidden_target->SetHideLayerAndSubtree(true);
    623   background->AddChild(hidden_target);
    624 
    625   scoped_refptr<SolidColorLayer> blue =
    626       CreateSolidColorLayer(gfx::Rect(150, 150, 50, 50), SK_ColorBLUE);
    627   hidden_target->AddChild(blue);
    628 
    629   hidden_target->RequestCopyOfOutput(CopyOutputRequest::CreateBitmapRequest(
    630       base::Bind(&IgnoreReadbackResult)));
    631   RunPixelTest(GL_WITH_DEFAULT,
    632                background,
    633                base::FilePath(FILE_PATH_LITERAL("black.png")));
    634 }
    635 
    636 TEST_F(LayerTreeHostReadbackPixelTest, ReadbackSubrect_Software) {
    637   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
    638       gfx::Rect(200, 200), SK_ColorWHITE);
    639 
    640   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
    641       gfx::Rect(200, 200), SK_ColorGREEN);
    642   background->AddChild(green);
    643 
    644   scoped_refptr<SolidColorLayer> blue = CreateSolidColorLayer(
    645       gfx::Rect(100, 100, 50, 50), SK_ColorBLUE);
    646   green->AddChild(blue);
    647 
    648   // Grab the middle of the root layer.
    649   copy_subrect_ = gfx::Rect(50, 50, 100, 100);
    650 
    651   RunPixelTest(SOFTWARE_WITH_DEFAULT,
    652                background,
    653                base::FilePath(FILE_PATH_LITERAL(
    654                    "green_small_with_blue_corner.png")));
    655 }
    656 
    657 TEST_F(LayerTreeHostReadbackPixelTest, ReadbackSubrect_GL_Bitmap) {
    658   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
    659       gfx::Rect(200, 200), SK_ColorWHITE);
    660 
    661   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
    662       gfx::Rect(200, 200), SK_ColorGREEN);
    663   background->AddChild(green);
    664 
    665   scoped_refptr<SolidColorLayer> blue = CreateSolidColorLayer(
    666       gfx::Rect(100, 100, 50, 50), SK_ColorBLUE);
    667   green->AddChild(blue);
    668 
    669   // Grab the middle of the root layer.
    670   copy_subrect_ = gfx::Rect(50, 50, 100, 100);
    671 
    672   RunPixelTest(GL_WITH_BITMAP,
    673                background,
    674                base::FilePath(FILE_PATH_LITERAL(
    675                    "green_small_with_blue_corner.png")));
    676 }
    677 
    678 TEST_F(LayerTreeHostReadbackPixelTest, ReadbackSubrect_GL) {
    679   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
    680       gfx::Rect(200, 200), SK_ColorWHITE);
    681 
    682   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
    683       gfx::Rect(200, 200), SK_ColorGREEN);
    684   background->AddChild(green);
    685 
    686   scoped_refptr<SolidColorLayer> blue = CreateSolidColorLayer(
    687       gfx::Rect(100, 100, 50, 50), SK_ColorBLUE);
    688   green->AddChild(blue);
    689 
    690   // Grab the middle of the root layer.
    691   copy_subrect_ = gfx::Rect(50, 50, 100, 100);
    692 
    693   RunPixelTest(GL_WITH_DEFAULT,
    694                background,
    695                base::FilePath(FILE_PATH_LITERAL(
    696                    "green_small_with_blue_corner.png")));
    697 }
    698 
    699 TEST_F(LayerTreeHostReadbackPixelTest, ReadbackNonRootLayerSubrect_Software) {
    700   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
    701       gfx::Rect(200, 200), SK_ColorWHITE);
    702 
    703   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
    704       gfx::Rect(25, 25, 150, 150), SK_ColorGREEN);
    705   background->AddChild(green);
    706 
    707   scoped_refptr<SolidColorLayer> blue = CreateSolidColorLayer(
    708       gfx::Rect(75, 75, 50, 50), SK_ColorBLUE);
    709   green->AddChild(blue);
    710 
    711   // Grab the middle of the green layer.
    712   copy_subrect_ = gfx::Rect(25, 25, 100, 100);
    713 
    714   RunPixelTestWithReadbackTarget(SOFTWARE_WITH_DEFAULT,
    715                                  background,
    716                                  green.get(),
    717                                  base::FilePath(FILE_PATH_LITERAL(
    718                                      "green_small_with_blue_corner.png")));
    719 }
    720 
    721 TEST_F(LayerTreeHostReadbackPixelTest, ReadbackNonRootLayerSubrect_GL_Bitmap) {
    722   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
    723       gfx::Rect(200, 200), SK_ColorWHITE);
    724 
    725   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
    726       gfx::Rect(25, 25, 150, 150), SK_ColorGREEN);
    727   background->AddChild(green);
    728 
    729   scoped_refptr<SolidColorLayer> blue = CreateSolidColorLayer(
    730       gfx::Rect(75, 75, 50, 50), SK_ColorBLUE);
    731   green->AddChild(blue);
    732 
    733   // Grab the middle of the green layer.
    734   copy_subrect_ = gfx::Rect(25, 25, 100, 100);
    735 
    736   RunPixelTestWithReadbackTarget(GL_WITH_BITMAP,
    737                                  background,
    738                                  green.get(),
    739                                  base::FilePath(FILE_PATH_LITERAL(
    740                                      "green_small_with_blue_corner.png")));
    741 }
    742 
    743 TEST_F(LayerTreeHostReadbackPixelTest, ReadbackNonRootLayerSubrect_GL) {
    744   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
    745       gfx::Rect(200, 200), SK_ColorWHITE);
    746 
    747   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
    748       gfx::Rect(25, 25, 150, 150), SK_ColorGREEN);
    749   background->AddChild(green);
    750 
    751   scoped_refptr<SolidColorLayer> blue = CreateSolidColorLayer(
    752       gfx::Rect(75, 75, 50, 50), SK_ColorBLUE);
    753   green->AddChild(blue);
    754 
    755   // Grab the middle of the green layer.
    756   copy_subrect_ = gfx::Rect(25, 25, 100, 100);
    757 
    758   RunPixelTestWithReadbackTarget(GL_WITH_DEFAULT,
    759                                  background,
    760                                  green.get(),
    761                                  base::FilePath(FILE_PATH_LITERAL(
    762                                      "green_small_with_blue_corner.png")));
    763 }
    764 
    765 TEST_F(LayerTreeHostReadbackPixelTest, ReadbackWhenNoDamage_Software) {
    766   scoped_refptr<SolidColorLayer> background =
    767       CreateSolidColorLayer(gfx::Rect(0, 0, 200, 200), SK_ColorWHITE);
    768 
    769   scoped_refptr<SolidColorLayer> parent =
    770       CreateSolidColorLayer(gfx::Rect(0, 0, 150, 150), SK_ColorRED);
    771   background->AddChild(parent);
    772 
    773   scoped_refptr<SolidColorLayer> target =
    774       CreateSolidColorLayer(gfx::Rect(0, 0, 100, 100), SK_ColorGREEN);
    775   parent->AddChild(target);
    776 
    777   scoped_refptr<SolidColorLayer> blue =
    778       CreateSolidColorLayer(gfx::Rect(50, 50, 50, 50), SK_ColorBLUE);
    779   target->AddChild(blue);
    780 
    781   insert_copy_request_after_frame_count_ = 1;
    782   RunPixelTestWithReadbackTarget(
    783       SOFTWARE_WITH_DEFAULT,
    784       background,
    785       target.get(),
    786       base::FilePath(FILE_PATH_LITERAL("green_small_with_blue_corner.png")));
    787 }
    788 
    789 TEST_F(LayerTreeHostReadbackPixelTest, ReadbackWhenNoDamage_GL_Bitmap) {
    790   scoped_refptr<SolidColorLayer> background =
    791       CreateSolidColorLayer(gfx::Rect(0, 0, 200, 200), SK_ColorWHITE);
    792 
    793   scoped_refptr<SolidColorLayer> parent =
    794       CreateSolidColorLayer(gfx::Rect(0, 0, 150, 150), SK_ColorRED);
    795   background->AddChild(parent);
    796 
    797   scoped_refptr<SolidColorLayer> target =
    798       CreateSolidColorLayer(gfx::Rect(0, 0, 100, 100), SK_ColorGREEN);
    799   parent->AddChild(target);
    800 
    801   scoped_refptr<SolidColorLayer> blue =
    802       CreateSolidColorLayer(gfx::Rect(50, 50, 50, 50), SK_ColorBLUE);
    803   target->AddChild(blue);
    804 
    805   insert_copy_request_after_frame_count_ = 1;
    806   RunPixelTestWithReadbackTarget(
    807       GL_WITH_BITMAP,
    808       background,
    809       target.get(),
    810       base::FilePath(FILE_PATH_LITERAL("green_small_with_blue_corner.png")));
    811 }
    812 
    813 TEST_F(LayerTreeHostReadbackPixelTest, ReadbackWhenNoDamage_GL) {
    814   scoped_refptr<SolidColorLayer> background =
    815       CreateSolidColorLayer(gfx::Rect(0, 0, 200, 200), SK_ColorWHITE);
    816 
    817   scoped_refptr<SolidColorLayer> parent =
    818       CreateSolidColorLayer(gfx::Rect(0, 0, 150, 150), SK_ColorRED);
    819   background->AddChild(parent);
    820 
    821   scoped_refptr<SolidColorLayer> target =
    822       CreateSolidColorLayer(gfx::Rect(0, 0, 100, 100), SK_ColorGREEN);
    823   parent->AddChild(target);
    824 
    825   scoped_refptr<SolidColorLayer> blue =
    826       CreateSolidColorLayer(gfx::Rect(50, 50, 50, 50), SK_ColorBLUE);
    827   target->AddChild(blue);
    828 
    829   insert_copy_request_after_frame_count_ = 1;
    830   RunPixelTestWithReadbackTarget(
    831       GL_WITH_DEFAULT,
    832       background,
    833       target.get(),
    834       base::FilePath(FILE_PATH_LITERAL("green_small_with_blue_corner.png")));
    835 }
    836 
    837 TEST_F(LayerTreeHostReadbackPixelTest,
    838        ReadbackOutsideViewportWhenNoDamage_Software) {
    839   scoped_refptr<SolidColorLayer> background =
    840       CreateSolidColorLayer(gfx::Rect(0, 0, 200, 200), SK_ColorWHITE);
    841 
    842   scoped_refptr<SolidColorLayer> parent =
    843       CreateSolidColorLayer(gfx::Rect(0, 0, 200, 200), SK_ColorRED);
    844   EXPECT_FALSE(parent->masks_to_bounds());
    845   background->AddChild(parent);
    846 
    847   scoped_refptr<SolidColorLayer> target =
    848       CreateSolidColorLayer(gfx::Rect(250, 250, 100, 100), SK_ColorGREEN);
    849   parent->AddChild(target);
    850 
    851   scoped_refptr<SolidColorLayer> blue =
    852       CreateSolidColorLayer(gfx::Rect(50, 50, 50, 50), SK_ColorBLUE);
    853   target->AddChild(blue);
    854 
    855   insert_copy_request_after_frame_count_ = 1;
    856   RunPixelTestWithReadbackTarget(
    857       SOFTWARE_WITH_DEFAULT,
    858       background,
    859       target.get(),
    860       base::FilePath(FILE_PATH_LITERAL("green_small_with_blue_corner.png")));
    861 }
    862 
    863 TEST_F(LayerTreeHostReadbackPixelTest,
    864        ReadbackOutsideViewportWhenNoDamage_GL_Bitmap) {
    865   scoped_refptr<SolidColorLayer> background =
    866       CreateSolidColorLayer(gfx::Rect(0, 0, 200, 200), SK_ColorWHITE);
    867 
    868   scoped_refptr<SolidColorLayer> parent =
    869       CreateSolidColorLayer(gfx::Rect(0, 0, 200, 200), SK_ColorRED);
    870   EXPECT_FALSE(parent->masks_to_bounds());
    871   background->AddChild(parent);
    872 
    873   scoped_refptr<SolidColorLayer> target =
    874       CreateSolidColorLayer(gfx::Rect(250, 250, 100, 100), SK_ColorGREEN);
    875   parent->AddChild(target);
    876 
    877   scoped_refptr<SolidColorLayer> blue =
    878       CreateSolidColorLayer(gfx::Rect(50, 50, 50, 50), SK_ColorBLUE);
    879   target->AddChild(blue);
    880 
    881   insert_copy_request_after_frame_count_ = 1;
    882   RunPixelTestWithReadbackTarget(
    883       GL_WITH_BITMAP,
    884       background,
    885       target.get(),
    886       base::FilePath(FILE_PATH_LITERAL("green_small_with_blue_corner.png")));
    887 }
    888 
    889 TEST_F(LayerTreeHostReadbackPixelTest, ReadbackOutsideViewportWhenNoDamage_GL) {
    890   scoped_refptr<SolidColorLayer> background =
    891       CreateSolidColorLayer(gfx::Rect(0, 0, 200, 200), SK_ColorWHITE);
    892 
    893   scoped_refptr<SolidColorLayer> parent =
    894       CreateSolidColorLayer(gfx::Rect(0, 0, 200, 200), SK_ColorRED);
    895   EXPECT_FALSE(parent->masks_to_bounds());
    896   background->AddChild(parent);
    897 
    898   scoped_refptr<SolidColorLayer> target =
    899       CreateSolidColorLayer(gfx::Rect(250, 250, 100, 100), SK_ColorGREEN);
    900   parent->AddChild(target);
    901 
    902   scoped_refptr<SolidColorLayer> blue =
    903       CreateSolidColorLayer(gfx::Rect(50, 50, 50, 50), SK_ColorBLUE);
    904   target->AddChild(blue);
    905 
    906   insert_copy_request_after_frame_count_ = 1;
    907   RunPixelTestWithReadbackTarget(
    908       GL_WITH_DEFAULT,
    909       background,
    910       target.get(),
    911       base::FilePath(FILE_PATH_LITERAL("green_small_with_blue_corner.png")));
    912 }
    913 
    914 class LayerTreeHostReadbackDeviceScalePixelTest
    915     : public LayerTreeHostReadbackPixelTest {
    916  protected:
    917   LayerTreeHostReadbackDeviceScalePixelTest()
    918       : device_scale_factor_(1.f),
    919         white_client_(SK_ColorWHITE),
    920         green_client_(SK_ColorGREEN),
    921         blue_client_(SK_ColorBLUE) {}
    922 
    923   virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE {
    924     // Cause the device scale factor to be inherited by contents scales.
    925     settings->layer_transforms_should_scale_layer_contents = true;
    926   }
    927 
    928   virtual void SetupTree() OVERRIDE {
    929     layer_tree_host()->SetDeviceScaleFactor(device_scale_factor_);
    930     LayerTreePixelTest::SetupTree();
    931   }
    932 
    933   virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
    934     EXPECT_EQ(device_scale_factor_,
    935               host_impl->active_tree()->device_scale_factor());
    936   }
    937 
    938   float device_scale_factor_;
    939   SolidColorContentLayerClient white_client_;
    940   SolidColorContentLayerClient green_client_;
    941   SolidColorContentLayerClient blue_client_;
    942 };
    943 
    944 TEST_F(LayerTreeHostReadbackDeviceScalePixelTest,
    945        ReadbackSubrect_Software) {
    946   scoped_refptr<FakePictureLayer> background =
    947       FakePictureLayer::Create(&white_client_);
    948   background->SetBounds(gfx::Size(100, 100));
    949   background->SetIsDrawable(true);
    950 
    951   scoped_refptr<FakePictureLayer> green =
    952       FakePictureLayer::Create(&green_client_);
    953   green->SetBounds(gfx::Size(100, 100));
    954   green->SetIsDrawable(true);
    955   background->AddChild(green);
    956 
    957   scoped_refptr<FakePictureLayer> blue =
    958       FakePictureLayer::Create(&blue_client_);
    959   blue->SetPosition(gfx::Point(50, 50));
    960   blue->SetBounds(gfx::Size(25, 25));
    961   blue->SetIsDrawable(true);
    962   green->AddChild(blue);
    963 
    964   // Grab the middle of the root layer.
    965   copy_subrect_ = gfx::Rect(25, 25, 50, 50);
    966   device_scale_factor_ = 2.f;
    967   RunPixelTest(SOFTWARE_WITH_DEFAULT,
    968                background,
    969                base::FilePath(FILE_PATH_LITERAL(
    970                    "green_small_with_blue_corner.png")));
    971 }
    972 
    973 TEST_F(LayerTreeHostReadbackDeviceScalePixelTest,
    974        ReadbackSubrect_GL) {
    975   scoped_refptr<FakePictureLayer> background =
    976       FakePictureLayer::Create(&white_client_);
    977   background->SetBounds(gfx::Size(100, 100));
    978   background->SetIsDrawable(true);
    979 
    980   scoped_refptr<FakePictureLayer> green =
    981       FakePictureLayer::Create(&green_client_);
    982   green->SetBounds(gfx::Size(100, 100));
    983   green->SetIsDrawable(true);
    984   background->AddChild(green);
    985 
    986   scoped_refptr<FakePictureLayer> blue =
    987       FakePictureLayer::Create(&blue_client_);
    988   blue->SetPosition(gfx::Point(50, 50));
    989   blue->SetBounds(gfx::Size(25, 25));
    990   blue->SetIsDrawable(true);
    991   green->AddChild(blue);
    992 
    993   // Grab the middle of the root layer.
    994   copy_subrect_ = gfx::Rect(25, 25, 50, 50);
    995   device_scale_factor_ = 2.f;
    996   RunPixelTest(GL_WITH_DEFAULT,
    997                background,
    998                base::FilePath(FILE_PATH_LITERAL(
    999                    "green_small_with_blue_corner.png")));
   1000 }
   1001 
   1002 TEST_F(LayerTreeHostReadbackDeviceScalePixelTest,
   1003        ReadbackNonRootLayerSubrect_Software) {
   1004   scoped_refptr<FakePictureLayer> background =
   1005       FakePictureLayer::Create(&white_client_);
   1006   background->SetBounds(gfx::Size(100, 100));
   1007   background->SetIsDrawable(true);
   1008 
   1009   scoped_refptr<FakePictureLayer> green =
   1010       FakePictureLayer::Create(&green_client_);
   1011   green->SetPosition(gfx::Point(10, 20));
   1012   green->SetBounds(gfx::Size(90, 80));
   1013   green->SetIsDrawable(true);
   1014   background->AddChild(green);
   1015 
   1016   scoped_refptr<FakePictureLayer> blue =
   1017       FakePictureLayer::Create(&blue_client_);
   1018   blue->SetPosition(gfx::Point(50, 50));
   1019   blue->SetBounds(gfx::Size(25, 25));
   1020   blue->SetIsDrawable(true);
   1021   green->AddChild(blue);
   1022 
   1023   // Grab the green layer's content with blue in the bottom right.
   1024   copy_subrect_ = gfx::Rect(25, 25, 50, 50);
   1025   device_scale_factor_ = 2.f;
   1026   RunPixelTestWithReadbackTarget(SOFTWARE_WITH_DEFAULT,
   1027                                  background,
   1028                                  green.get(),
   1029                                  base::FilePath(FILE_PATH_LITERAL(
   1030                                      "green_small_with_blue_corner.png")));
   1031 }
   1032 
   1033 TEST_F(LayerTreeHostReadbackDeviceScalePixelTest,
   1034        ReadbackNonRootLayerSubrect_GL) {
   1035   scoped_refptr<FakePictureLayer> background =
   1036       FakePictureLayer::Create(&white_client_);
   1037   background->SetBounds(gfx::Size(100, 100));
   1038   background->SetIsDrawable(true);
   1039 
   1040   scoped_refptr<FakePictureLayer> green =
   1041       FakePictureLayer::Create(&green_client_);
   1042   green->SetPosition(gfx::Point(10, 20));
   1043   green->SetBounds(gfx::Size(90, 80));
   1044   green->SetIsDrawable(true);
   1045   background->AddChild(green);
   1046 
   1047   scoped_refptr<FakePictureLayer> blue =
   1048       FakePictureLayer::Create(&blue_client_);
   1049   blue->SetPosition(gfx::Point(50, 50));
   1050   blue->SetBounds(gfx::Size(25, 25));
   1051   blue->SetIsDrawable(true);
   1052   green->AddChild(blue);
   1053 
   1054   // Grab the green layer's content with blue in the bottom right.
   1055   copy_subrect_ = gfx::Rect(25, 25, 50, 50);
   1056   device_scale_factor_ = 2.f;
   1057   RunPixelTestWithReadbackTarget(GL_WITH_DEFAULT,
   1058                                  background,
   1059                                  green.get(),
   1060                                  base::FilePath(FILE_PATH_LITERAL(
   1061                                      "green_small_with_blue_corner.png")));
   1062 }
   1063 
   1064 TEST_F(LayerTreeHostReadbackPixelTest, ReadbackNonRootLayerOutsideViewport) {
   1065   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
   1066       gfx::Rect(200, 200), SK_ColorWHITE);
   1067 
   1068   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
   1069       gfx::Rect(200, 200), SK_ColorGREEN);
   1070   // Only the top left quarter of the layer is inside the viewport, so the
   1071   // blue layer is entirely outside.
   1072   green->SetPosition(gfx::Point(100, 100));
   1073   background->AddChild(green);
   1074 
   1075   scoped_refptr<SolidColorLayer> blue = CreateSolidColorLayer(
   1076       gfx::Rect(150, 150, 50, 50), SK_ColorBLUE);
   1077   green->AddChild(blue);
   1078 
   1079   RunPixelTestWithReadbackTarget(GL_WITH_DEFAULT,
   1080                                  background,
   1081                                  green.get(),
   1082                                  base::FilePath(FILE_PATH_LITERAL(
   1083                                      "green_with_blue_corner.png")));
   1084 }
   1085 
   1086 }  // namespace
   1087 }  // namespace cc
   1088 
   1089 #endif  // OS_ANDROID
   1090