- add sources.
[platform/framework/web/crosswalk.git] / src / cc / trees / layer_tree_host_pixeltest_readback.cc
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     TextureMailbox texture_mailbox;
62     scoped_ptr<SingleReleaseCallback> release_callback;
63     result->TakeTexture(&texture_mailbox, &release_callback);
64     EXPECT_TRUE(texture_mailbox.IsValid());
65     EXPECT_TRUE(texture_mailbox.IsTexture());
66
67     scoped_ptr<SkBitmap> bitmap =
68         CopyTextureMailboxToBitmap(result->size(), texture_mailbox);
69     release_callback->Run(0, false);
70
71     ReadbackResultAsBitmap(CopyOutputResult::CreateBitmapResult(bitmap.Pass()));
72   }
73
74   gfx::Rect copy_subrect_;
75 };
76
77 TEST_F(LayerTreeHostReadbackPixelTest, ReadbackRootLayer_Software) {
78   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
79       gfx::Rect(200, 200), SK_ColorWHITE);
80
81   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
82       gfx::Rect(200, 200), SK_ColorGREEN);
83   background->AddChild(green);
84
85   RunPixelTest(SOFTWARE_WITH_DEFAULT,
86                background,
87                base::FilePath(FILE_PATH_LITERAL(
88                    "green.png")));
89 }
90
91 TEST_F(LayerTreeHostReadbackPixelTest, ReadbackRootLayer_Software_Bitmap) {
92   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
93       gfx::Rect(200, 200), SK_ColorWHITE);
94
95   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
96       gfx::Rect(200, 200), SK_ColorGREEN);
97   background->AddChild(green);
98
99   RunPixelTest(SOFTWARE_WITH_BITMAP,
100                background,
101                base::FilePath(FILE_PATH_LITERAL(
102                    "green.png")));
103 }
104
105 TEST_F(LayerTreeHostReadbackPixelTest, ReadbackRootLayer_GL_Bitmap) {
106   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
107       gfx::Rect(200, 200), SK_ColorWHITE);
108
109   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
110       gfx::Rect(200, 200), SK_ColorGREEN);
111   background->AddChild(green);
112
113   RunPixelTest(GL_WITH_BITMAP,
114                background,
115                base::FilePath(FILE_PATH_LITERAL(
116                    "green.png")));
117 }
118
119 TEST_F(LayerTreeHostReadbackPixelTest, ReadbackRootLayer_GL) {
120   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
121       gfx::Rect(200, 200), SK_ColorWHITE);
122
123   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
124       gfx::Rect(200, 200), SK_ColorGREEN);
125   background->AddChild(green);
126
127   RunPixelTest(GL_WITH_DEFAULT,
128                background,
129                base::FilePath(FILE_PATH_LITERAL(
130                    "green.png")));
131 }
132
133 TEST_F(LayerTreeHostReadbackPixelTest,
134        ReadbackRootLayerWithChild_Software) {
135   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
136       gfx::Rect(200, 200), SK_ColorWHITE);
137
138   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
139       gfx::Rect(200, 200), SK_ColorGREEN);
140   background->AddChild(green);
141
142   scoped_refptr<SolidColorLayer> blue = CreateSolidColorLayer(
143       gfx::Rect(150, 150, 50, 50), SK_ColorBLUE);
144   green->AddChild(blue);
145
146   RunPixelTest(SOFTWARE_WITH_DEFAULT,
147                background,
148                base::FilePath(FILE_PATH_LITERAL(
149                    "green_with_blue_corner.png")));
150 }
151
152 TEST_F(LayerTreeHostReadbackPixelTest, ReadbackRootLayerWithChild_GL_Bitmap) {
153   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
154       gfx::Rect(200, 200), SK_ColorWHITE);
155
156   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
157       gfx::Rect(200, 200), SK_ColorGREEN);
158   background->AddChild(green);
159
160   scoped_refptr<SolidColorLayer> blue = CreateSolidColorLayer(
161       gfx::Rect(150, 150, 50, 50), SK_ColorBLUE);
162   green->AddChild(blue);
163
164   RunPixelTest(GL_WITH_BITMAP,
165                background,
166                base::FilePath(FILE_PATH_LITERAL(
167                    "green_with_blue_corner.png")));
168 }
169
170 TEST_F(LayerTreeHostReadbackPixelTest, ReadbackRootLayerWithChild_GL) {
171   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
172       gfx::Rect(200, 200), SK_ColorWHITE);
173
174   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
175       gfx::Rect(200, 200), SK_ColorGREEN);
176   background->AddChild(green);
177
178   scoped_refptr<SolidColorLayer> blue = CreateSolidColorLayer(
179       gfx::Rect(150, 150, 50, 50), SK_ColorBLUE);
180   green->AddChild(blue);
181
182   RunPixelTest(GL_WITH_DEFAULT,
183                background,
184                base::FilePath(FILE_PATH_LITERAL(
185                    "green_with_blue_corner.png")));
186 }
187
188 TEST_F(LayerTreeHostReadbackPixelTest, ReadbackNonRootLayer_Software) {
189   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
190       gfx::Rect(200, 200), SK_ColorWHITE);
191
192   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
193       gfx::Rect(200, 200), SK_ColorGREEN);
194   background->AddChild(green);
195
196   RunPixelTestWithReadbackTarget(SOFTWARE_WITH_DEFAULT,
197                                  background,
198                                  green.get(),
199                                  base::FilePath(FILE_PATH_LITERAL(
200                                      "green.png")));
201 }
202
203 TEST_F(LayerTreeHostReadbackPixelTest, ReadbackNonRootLayer_GL_Bitmap) {
204   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
205       gfx::Rect(200, 200), SK_ColorWHITE);
206
207   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
208       gfx::Rect(200, 200), SK_ColorGREEN);
209   background->AddChild(green);
210
211   RunPixelTestWithReadbackTarget(GL_WITH_BITMAP,
212                                  background,
213                                  green.get(),
214                                  base::FilePath(FILE_PATH_LITERAL(
215                                      "green.png")));
216 }
217
218 TEST_F(LayerTreeHostReadbackPixelTest, ReadbackNonRootLayer_GL) {
219   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
220       gfx::Rect(200, 200), SK_ColorWHITE);
221
222   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
223       gfx::Rect(200, 200), SK_ColorGREEN);
224   background->AddChild(green);
225
226   RunPixelTestWithReadbackTarget(GL_WITH_DEFAULT,
227                                  background,
228                                  green.get(),
229                                  base::FilePath(FILE_PATH_LITERAL(
230                                      "green.png")));
231 }
232
233 TEST_F(LayerTreeHostReadbackPixelTest,
234        ReadbackSmallNonRootLayer_Software) {
235   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
236       gfx::Rect(200, 200), SK_ColorWHITE);
237
238   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
239       gfx::Rect(100, 100, 100, 100), SK_ColorGREEN);
240   background->AddChild(green);
241
242   RunPixelTestWithReadbackTarget(SOFTWARE_WITH_DEFAULT,
243                                  background,
244                                  green.get(),
245                                  base::FilePath(FILE_PATH_LITERAL(
246                                      "green_small.png")));
247 }
248
249 TEST_F(LayerTreeHostReadbackPixelTest, ReadbackSmallNonRootLayer_GL_Bitmap) {
250   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
251       gfx::Rect(200, 200), SK_ColorWHITE);
252
253   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
254       gfx::Rect(100, 100, 100, 100), SK_ColorGREEN);
255   background->AddChild(green);
256
257   RunPixelTestWithReadbackTarget(GL_WITH_BITMAP,
258                                  background,
259                                  green.get(),
260                                  base::FilePath(FILE_PATH_LITERAL(
261                                      "green_small.png")));
262 }
263
264 TEST_F(LayerTreeHostReadbackPixelTest, ReadbackSmallNonRootLayer_GL) {
265   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
266       gfx::Rect(200, 200), SK_ColorWHITE);
267
268   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
269       gfx::Rect(100, 100, 100, 100), SK_ColorGREEN);
270   background->AddChild(green);
271
272   RunPixelTestWithReadbackTarget(GL_WITH_DEFAULT,
273                                  background,
274                                  green.get(),
275                                  base::FilePath(FILE_PATH_LITERAL(
276                                      "green_small.png")));
277 }
278
279 TEST_F(LayerTreeHostReadbackPixelTest,
280        ReadbackSmallNonRootLayerWithChild_Software) {
281   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
282       gfx::Rect(200, 200), SK_ColorWHITE);
283
284   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
285       gfx::Rect(100, 100, 100, 100), SK_ColorGREEN);
286   background->AddChild(green);
287
288   scoped_refptr<SolidColorLayer> blue = CreateSolidColorLayer(
289       gfx::Rect(50, 50, 50, 50), SK_ColorBLUE);
290   green->AddChild(blue);
291
292   RunPixelTestWithReadbackTarget(SOFTWARE_WITH_DEFAULT,
293                                  background,
294                                  green.get(),
295                                  base::FilePath(FILE_PATH_LITERAL(
296                                      "green_small_with_blue_corner.png")));
297 }
298
299 TEST_F(LayerTreeHostReadbackPixelTest,
300        ReadbackSmallNonRootLayerWithChild_GL_Bitmap) {
301   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
302       gfx::Rect(200, 200), SK_ColorWHITE);
303
304   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
305       gfx::Rect(100, 100, 100, 100), SK_ColorGREEN);
306   background->AddChild(green);
307
308   scoped_refptr<SolidColorLayer> blue = CreateSolidColorLayer(
309       gfx::Rect(50, 50, 50, 50), SK_ColorBLUE);
310   green->AddChild(blue);
311
312   RunPixelTestWithReadbackTarget(GL_WITH_BITMAP,
313                                  background,
314                                  green.get(),
315                                  base::FilePath(FILE_PATH_LITERAL(
316                                      "green_small_with_blue_corner.png")));
317 }
318
319 TEST_F(LayerTreeHostReadbackPixelTest, ReadbackSmallNonRootLayerWithChild_GL) {
320   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
321       gfx::Rect(200, 200), SK_ColorWHITE);
322
323   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
324       gfx::Rect(100, 100, 100, 100), SK_ColorGREEN);
325   background->AddChild(green);
326
327   scoped_refptr<SolidColorLayer> blue = CreateSolidColorLayer(
328       gfx::Rect(50, 50, 50, 50), SK_ColorBLUE);
329   green->AddChild(blue);
330
331   RunPixelTestWithReadbackTarget(GL_WITH_DEFAULT,
332                                  background,
333                                  green.get(),
334                                  base::FilePath(FILE_PATH_LITERAL(
335                                      "green_small_with_blue_corner.png")));
336 }
337
338 TEST_F(LayerTreeHostReadbackPixelTest,
339        ReadbackSubtreeSurroundsTargetLayer_Software) {
340   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
341       gfx::Rect(0, 0, 200, 200), SK_ColorWHITE);
342
343   scoped_refptr<SolidColorLayer> target = CreateSolidColorLayer(
344       gfx::Rect(100, 100, 100, 100), SK_ColorRED);
345   background->AddChild(target);
346
347   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
348       gfx::Rect(-100, -100, 300, 300), SK_ColorGREEN);
349   target->AddChild(green);
350
351   scoped_refptr<SolidColorLayer> blue = CreateSolidColorLayer(
352       gfx::Rect(50, 50, 50, 50), SK_ColorBLUE);
353   target->AddChild(blue);
354
355   copy_subrect_ = gfx::Rect(0, 0, 100, 100);
356   RunPixelTestWithReadbackTarget(SOFTWARE_WITH_DEFAULT,
357                                  background,
358                                  target.get(),
359                                  base::FilePath(FILE_PATH_LITERAL(
360                                      "green_small_with_blue_corner.png")));
361 }
362
363 TEST_F(LayerTreeHostReadbackPixelTest,
364        ReadbackSubtreeSurroundsLayer_GL_Bitmap) {
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(GL_WITH_BITMAP,
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        ReadbackSubtreeSurroundsTargetLayer_GL) {
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_DEFAULT,
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        ReadbackSubtreeExtendsBeyondTargetLayer_Software) {
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(50, 50, 150, 150), SK_ColorRED);
420   background->AddChild(target);
421
422   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
423       gfx::Rect(50, 50, 200, 200), SK_ColorGREEN);
424   target->AddChild(green);
425
426   scoped_refptr<SolidColorLayer> blue = CreateSolidColorLayer(
427       gfx::Rect(100, 100, 50, 50), SK_ColorBLUE);
428   target->AddChild(blue);
429
430   copy_subrect_ = gfx::Rect(50, 50, 100, 100);
431   RunPixelTestWithReadbackTarget(SOFTWARE_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_GL_Bitmap) {
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(GL_WITH_BITMAP,
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) {
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_DEFAULT,
482                                  background,
483                                  target.get(),
484                                  base::FilePath(FILE_PATH_LITERAL(
485                                      "green_small_with_blue_corner.png")));
486 }
487
488 TEST_F(LayerTreeHostReadbackPixelTest, ReadbackSubrect_Software) {
489   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
490       gfx::Rect(200, 200), SK_ColorWHITE);
491
492   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
493       gfx::Rect(200, 200), SK_ColorGREEN);
494   background->AddChild(green);
495
496   scoped_refptr<SolidColorLayer> blue = CreateSolidColorLayer(
497       gfx::Rect(100, 100, 50, 50), SK_ColorBLUE);
498   green->AddChild(blue);
499
500   // Grab the middle of the root layer.
501   copy_subrect_ = gfx::Rect(50, 50, 100, 100);
502
503   RunPixelTest(SOFTWARE_WITH_DEFAULT,
504                background,
505                base::FilePath(FILE_PATH_LITERAL(
506                    "green_small_with_blue_corner.png")));
507 }
508
509 TEST_F(LayerTreeHostReadbackPixelTest, ReadbackSubrect_GL_Bitmap) {
510   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
511       gfx::Rect(200, 200), SK_ColorWHITE);
512
513   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
514       gfx::Rect(200, 200), SK_ColorGREEN);
515   background->AddChild(green);
516
517   scoped_refptr<SolidColorLayer> blue = CreateSolidColorLayer(
518       gfx::Rect(100, 100, 50, 50), SK_ColorBLUE);
519   green->AddChild(blue);
520
521   // Grab the middle of the root layer.
522   copy_subrect_ = gfx::Rect(50, 50, 100, 100);
523
524   RunPixelTest(GL_WITH_BITMAP,
525                background,
526                base::FilePath(FILE_PATH_LITERAL(
527                    "green_small_with_blue_corner.png")));
528 }
529
530 TEST_F(LayerTreeHostReadbackPixelTest, ReadbackSubrect_GL) {
531   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
532       gfx::Rect(200, 200), SK_ColorWHITE);
533
534   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
535       gfx::Rect(200, 200), SK_ColorGREEN);
536   background->AddChild(green);
537
538   scoped_refptr<SolidColorLayer> blue = CreateSolidColorLayer(
539       gfx::Rect(100, 100, 50, 50), SK_ColorBLUE);
540   green->AddChild(blue);
541
542   // Grab the middle of the root layer.
543   copy_subrect_ = gfx::Rect(50, 50, 100, 100);
544
545   RunPixelTest(GL_WITH_DEFAULT,
546                background,
547                base::FilePath(FILE_PATH_LITERAL(
548                    "green_small_with_blue_corner.png")));
549 }
550
551 TEST_F(LayerTreeHostReadbackPixelTest, ReadbackNonRootLayerSubrect_Software) {
552   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
553       gfx::Rect(200, 200), SK_ColorWHITE);
554
555   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
556       gfx::Rect(25, 25, 150, 150), SK_ColorGREEN);
557   background->AddChild(green);
558
559   scoped_refptr<SolidColorLayer> blue = CreateSolidColorLayer(
560       gfx::Rect(75, 75, 50, 50), SK_ColorBLUE);
561   green->AddChild(blue);
562
563   // Grab the middle of the green layer.
564   copy_subrect_ = gfx::Rect(25, 25, 100, 100);
565
566   RunPixelTestWithReadbackTarget(SOFTWARE_WITH_DEFAULT,
567                                  background,
568                                  green.get(),
569                                  base::FilePath(FILE_PATH_LITERAL(
570                                      "green_small_with_blue_corner.png")));
571 }
572
573 TEST_F(LayerTreeHostReadbackPixelTest, ReadbackNonRootLayerSubrect_GL_Bitmap) {
574   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
575       gfx::Rect(200, 200), SK_ColorWHITE);
576
577   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
578       gfx::Rect(25, 25, 150, 150), SK_ColorGREEN);
579   background->AddChild(green);
580
581   scoped_refptr<SolidColorLayer> blue = CreateSolidColorLayer(
582       gfx::Rect(75, 75, 50, 50), SK_ColorBLUE);
583   green->AddChild(blue);
584
585   // Grab the middle of the green layer.
586   copy_subrect_ = gfx::Rect(25, 25, 100, 100);
587
588   RunPixelTestWithReadbackTarget(GL_WITH_BITMAP,
589                                  background,
590                                  green.get(),
591                                  base::FilePath(FILE_PATH_LITERAL(
592                                      "green_small_with_blue_corner.png")));
593 }
594
595 TEST_F(LayerTreeHostReadbackPixelTest, ReadbackNonRootLayerSubrect_GL) {
596   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
597       gfx::Rect(200, 200), SK_ColorWHITE);
598
599   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
600       gfx::Rect(25, 25, 150, 150), SK_ColorGREEN);
601   background->AddChild(green);
602
603   scoped_refptr<SolidColorLayer> blue = CreateSolidColorLayer(
604       gfx::Rect(75, 75, 50, 50), SK_ColorBLUE);
605   green->AddChild(blue);
606
607   // Grab the middle of the green layer.
608   copy_subrect_ = gfx::Rect(25, 25, 100, 100);
609
610   RunPixelTestWithReadbackTarget(GL_WITH_DEFAULT,
611                                  background,
612                                  green.get(),
613                                  base::FilePath(FILE_PATH_LITERAL(
614                                      "green_small_with_blue_corner.png")));
615 }
616
617 class LayerTreeHostReadbackDeviceScalePixelTest
618     : public LayerTreeHostReadbackPixelTest {
619  protected:
620   LayerTreeHostReadbackDeviceScalePixelTest()
621       : device_scale_factor_(1.f),
622         white_client_(SK_ColorWHITE),
623         green_client_(SK_ColorGREEN),
624         blue_client_(SK_ColorBLUE) {}
625
626   virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE {
627     // Cause the device scale factor to be inherited by contents scales.
628     settings->layer_transforms_should_scale_layer_contents = true;
629   }
630
631   virtual void SetupTree() OVERRIDE {
632     layer_tree_host()->SetDeviceScaleFactor(device_scale_factor_);
633     LayerTreePixelTest::SetupTree();
634   }
635
636   virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
637     LayerImpl* root_impl = host_impl->active_tree()->root_layer();
638
639     LayerImpl* background_impl = root_impl->children()[0];
640     EXPECT_EQ(device_scale_factor_, background_impl->contents_scale_x());
641     EXPECT_EQ(device_scale_factor_, background_impl->contents_scale_y());
642
643     LayerImpl* green_impl = background_impl->children()[0];
644     EXPECT_EQ(device_scale_factor_, green_impl->contents_scale_x());
645     EXPECT_EQ(device_scale_factor_, green_impl->contents_scale_y());
646
647     LayerImpl* blue_impl = green_impl->children()[0];
648     EXPECT_EQ(device_scale_factor_, blue_impl->contents_scale_x());
649     EXPECT_EQ(device_scale_factor_, blue_impl->contents_scale_y());
650   }
651
652   float device_scale_factor_;
653   SolidColorContentLayerClient white_client_;
654   SolidColorContentLayerClient green_client_;
655   SolidColorContentLayerClient blue_client_;
656 };
657
658 TEST_F(LayerTreeHostReadbackDeviceScalePixelTest,
659        ReadbackSubrect_Software) {
660   scoped_refptr<ContentLayer> background = ContentLayer::Create(&white_client_);
661   background->SetAnchorPoint(gfx::PointF());
662   background->SetBounds(gfx::Size(100, 100));
663   background->SetIsDrawable(true);
664
665   scoped_refptr<ContentLayer> green = ContentLayer::Create(&green_client_);
666   green->SetAnchorPoint(gfx::PointF());
667   green->SetBounds(gfx::Size(100, 100));
668   green->SetIsDrawable(true);
669   background->AddChild(green);
670
671   scoped_refptr<ContentLayer> blue = ContentLayer::Create(&blue_client_);
672   blue->SetAnchorPoint(gfx::PointF());
673   blue->SetPosition(gfx::Point(50, 50));
674   blue->SetBounds(gfx::Size(25, 25));
675   blue->SetIsDrawable(true);
676   green->AddChild(blue);
677
678   // Grab the middle of the root layer.
679   copy_subrect_ = gfx::Rect(25, 25, 50, 50);
680   device_scale_factor_ = 2.f;
681
682   this->impl_side_painting_ = false;
683   RunPixelTest(SOFTWARE_WITH_DEFAULT,
684                background,
685                base::FilePath(FILE_PATH_LITERAL(
686                    "green_small_with_blue_corner.png")));
687 }
688
689 TEST_F(LayerTreeHostReadbackDeviceScalePixelTest,
690        ReadbackSubrect_GL) {
691   scoped_refptr<ContentLayer> background = ContentLayer::Create(&white_client_);
692   background->SetAnchorPoint(gfx::PointF());
693   background->SetBounds(gfx::Size(100, 100));
694   background->SetIsDrawable(true);
695
696   scoped_refptr<ContentLayer> green = ContentLayer::Create(&green_client_);
697   green->SetAnchorPoint(gfx::PointF());
698   green->SetBounds(gfx::Size(100, 100));
699   green->SetIsDrawable(true);
700   background->AddChild(green);
701
702   scoped_refptr<ContentLayer> blue = ContentLayer::Create(&blue_client_);
703   blue->SetAnchorPoint(gfx::PointF());
704   blue->SetPosition(gfx::Point(50, 50));
705   blue->SetBounds(gfx::Size(25, 25));
706   blue->SetIsDrawable(true);
707   green->AddChild(blue);
708
709   // Grab the middle of the root layer.
710   copy_subrect_ = gfx::Rect(25, 25, 50, 50);
711   device_scale_factor_ = 2.f;
712
713   this->impl_side_painting_ = false;
714   RunPixelTest(GL_WITH_DEFAULT,
715                background,
716                base::FilePath(FILE_PATH_LITERAL(
717                    "green_small_with_blue_corner.png")));
718 }
719
720 TEST_F(LayerTreeHostReadbackDeviceScalePixelTest,
721        ReadbackNonRootLayerSubrect_Software) {
722   scoped_refptr<ContentLayer> background = ContentLayer::Create(&white_client_);
723   background->SetAnchorPoint(gfx::PointF());
724   background->SetBounds(gfx::Size(100, 100));
725   background->SetIsDrawable(true);
726
727   scoped_refptr<ContentLayer> green = ContentLayer::Create(&green_client_);
728   green->SetAnchorPoint(gfx::PointF());
729   green->SetPosition(gfx::Point(10, 20));
730   green->SetBounds(gfx::Size(90, 80));
731   green->SetIsDrawable(true);
732   background->AddChild(green);
733
734   scoped_refptr<ContentLayer> blue = ContentLayer::Create(&blue_client_);
735   blue->SetAnchorPoint(gfx::PointF());
736   blue->SetPosition(gfx::Point(50, 50));
737   blue->SetBounds(gfx::Size(25, 25));
738   blue->SetIsDrawable(true);
739   green->AddChild(blue);
740
741   // Grab the green layer's content with blue in the bottom right.
742   copy_subrect_ = gfx::Rect(25, 25, 50, 50);
743   device_scale_factor_ = 2.f;
744
745   this->impl_side_painting_ = false;
746   RunPixelTestWithReadbackTarget(SOFTWARE_WITH_DEFAULT,
747                                  background,
748                                  green.get(),
749                                  base::FilePath(FILE_PATH_LITERAL(
750                                      "green_small_with_blue_corner.png")));
751 }
752
753 TEST_F(LayerTreeHostReadbackDeviceScalePixelTest,
754        ReadbackNonRootLayerSubrect_GL) {
755   scoped_refptr<ContentLayer> background = ContentLayer::Create(&white_client_);
756   background->SetAnchorPoint(gfx::PointF());
757   background->SetBounds(gfx::Size(100, 100));
758   background->SetIsDrawable(true);
759
760   scoped_refptr<ContentLayer> green = ContentLayer::Create(&green_client_);
761   green->SetAnchorPoint(gfx::PointF());
762   green->SetPosition(gfx::Point(10, 20));
763   green->SetBounds(gfx::Size(90, 80));
764   green->SetIsDrawable(true);
765   background->AddChild(green);
766
767   scoped_refptr<ContentLayer> blue = ContentLayer::Create(&blue_client_);
768   blue->SetAnchorPoint(gfx::PointF());
769   blue->SetPosition(gfx::Point(50, 50));
770   blue->SetBounds(gfx::Size(25, 25));
771   blue->SetIsDrawable(true);
772   green->AddChild(blue);
773
774   // Grab the green layer's content with blue in the bottom right.
775   copy_subrect_ = gfx::Rect(25, 25, 50, 50);
776   device_scale_factor_ = 2.f;
777
778   this->impl_side_painting_ = false;
779   RunPixelTestWithReadbackTarget(GL_WITH_DEFAULT,
780                                  background,
781                                  green.get(),
782                                  base::FilePath(FILE_PATH_LITERAL(
783                                      "green_small_with_blue_corner.png")));
784 }
785
786 class LayerTreeHostReadbackViaCompositeAndReadbackPixelTest
787     : public LayerTreePixelTest {
788  protected:
789   LayerTreeHostReadbackViaCompositeAndReadbackPixelTest()
790       : device_scale_factor_(1.f),
791         white_client_(SK_ColorWHITE),
792         green_client_(SK_ColorGREEN),
793         blue_client_(SK_ColorBLUE) {}
794
795   virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE {
796     // Cause the device scale factor to be inherited by contents scales.
797     settings->layer_transforms_should_scale_layer_contents = true;
798   }
799
800   virtual void SetupTree() OVERRIDE {
801     layer_tree_host()->SetDeviceScaleFactor(device_scale_factor_);
802     LayerTreePixelTest::SetupTree();
803   }
804
805   virtual void BeginTest() OVERRIDE {
806     EXPECT_EQ(device_scale_factor_, layer_tree_host()->device_scale_factor());
807     if (TestEnded())
808       return;
809
810     gfx::Rect device_viewport_copy_rect(
811         layer_tree_host()->device_viewport_size());
812     if (!device_viewport_copy_subrect_.IsEmpty())
813       device_viewport_copy_rect.Intersect(device_viewport_copy_subrect_);
814
815     scoped_ptr<SkBitmap> bitmap(new SkBitmap);
816     bitmap->setConfig(SkBitmap::kARGB_8888_Config,
817                       device_viewport_copy_rect.width(),
818                       device_viewport_copy_rect.height());
819     bitmap->allocPixels();
820     {
821       scoped_ptr<SkAutoLockPixels> lock(new SkAutoLockPixels(*bitmap));
822       layer_tree_host()->CompositeAndReadback(bitmap->getPixels(),
823                                               device_viewport_copy_rect);
824     }
825
826     result_bitmap_ = bitmap.Pass();
827     EndTest();
828   }
829
830   virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
831     LayerImpl* root_impl = host_impl->active_tree()->root_layer();
832
833     LayerImpl* background_impl = root_impl->children()[0];
834     EXPECT_EQ(device_scale_factor_, background_impl->contents_scale_x());
835     EXPECT_EQ(device_scale_factor_, background_impl->contents_scale_y());
836
837     LayerImpl* green_impl = background_impl->children()[0];
838     EXPECT_EQ(device_scale_factor_, green_impl->contents_scale_x());
839     EXPECT_EQ(device_scale_factor_, green_impl->contents_scale_y());
840
841     LayerImpl* blue_impl = green_impl->children()[0];
842     EXPECT_EQ(device_scale_factor_, blue_impl->contents_scale_x());
843     EXPECT_EQ(device_scale_factor_, blue_impl->contents_scale_y());
844   }
845
846   gfx::Rect device_viewport_copy_subrect_;
847   float device_scale_factor_;
848   SolidColorContentLayerClient white_client_;
849   SolidColorContentLayerClient green_client_;
850   SolidColorContentLayerClient blue_client_;
851 };
852
853 TEST_F(LayerTreeHostReadbackViaCompositeAndReadbackPixelTest,
854        CompositeAndReadback_Software_1) {
855   scoped_refptr<ContentLayer> background = ContentLayer::Create(&white_client_);
856   background->SetAnchorPoint(gfx::PointF());
857   background->SetBounds(gfx::Size(200, 200));
858   background->SetIsDrawable(true);
859
860   scoped_refptr<ContentLayer> green = ContentLayer::Create(&green_client_);
861   green->SetAnchorPoint(gfx::PointF());
862   green->SetBounds(gfx::Size(200, 200));
863   green->SetIsDrawable(true);
864   background->AddChild(green);
865
866   scoped_refptr<ContentLayer> blue = ContentLayer::Create(&blue_client_);
867   blue->SetAnchorPoint(gfx::PointF());
868   blue->SetPosition(gfx::Point(100, 100));
869   blue->SetBounds(gfx::Size(50, 50));
870   blue->SetIsDrawable(true);
871   green->AddChild(blue);
872
873   // Grab the middle of the device viewport.
874   device_viewport_copy_subrect_ = gfx::Rect(50, 50, 100, 100);
875   device_scale_factor_ = 1.f;
876
877   this->impl_side_painting_ = false;
878   RunPixelTestWithReadbackTarget(SOFTWARE_WITH_DEFAULT,
879                                  background,
880                                  green.get(),
881                                  base::FilePath(FILE_PATH_LITERAL(
882                                      "green_small_with_blue_corner.png")));
883 }
884
885 TEST_F(LayerTreeHostReadbackViaCompositeAndReadbackPixelTest,
886        CompositeAndReadback_Software_2) {
887   scoped_refptr<ContentLayer> background = ContentLayer::Create(&white_client_);
888   background->SetAnchorPoint(gfx::PointF());
889   background->SetBounds(gfx::Size(100, 100));
890   background->SetIsDrawable(true);
891
892   scoped_refptr<ContentLayer> green = ContentLayer::Create(&green_client_);
893   green->SetAnchorPoint(gfx::PointF());
894   green->SetBounds(gfx::Size(100, 100));
895   green->SetIsDrawable(true);
896   background->AddChild(green);
897
898   scoped_refptr<ContentLayer> blue = ContentLayer::Create(&blue_client_);
899   blue->SetAnchorPoint(gfx::PointF());
900   blue->SetPosition(gfx::Point(50, 50));
901   blue->SetBounds(gfx::Size(25, 25));
902   blue->SetIsDrawable(true);
903   green->AddChild(blue);
904
905   // Grab the middle of the device viewport.
906   device_viewport_copy_subrect_ = gfx::Rect(50, 50, 100, 100);
907   device_scale_factor_ = 2.f;
908
909   this->impl_side_painting_ = false;
910   RunPixelTestWithReadbackTarget(SOFTWARE_WITH_DEFAULT,
911                                  background,
912                                  green.get(),
913                                  base::FilePath(FILE_PATH_LITERAL(
914                                      "green_small_with_blue_corner.png")));
915 }
916
917 TEST_F(LayerTreeHostReadbackViaCompositeAndReadbackPixelTest,
918        CompositeAndReadback_GL_1) {
919   scoped_refptr<ContentLayer> background = ContentLayer::Create(&white_client_);
920   background->SetAnchorPoint(gfx::PointF());
921   background->SetBounds(gfx::Size(200, 200));
922   background->SetIsDrawable(true);
923
924   scoped_refptr<ContentLayer> green = ContentLayer::Create(&green_client_);
925   green->SetAnchorPoint(gfx::PointF());
926   green->SetBounds(gfx::Size(200, 200));
927   green->SetIsDrawable(true);
928   background->AddChild(green);
929
930   scoped_refptr<ContentLayer> blue = ContentLayer::Create(&blue_client_);
931   blue->SetAnchorPoint(gfx::PointF());
932   blue->SetPosition(gfx::Point(100, 100));
933   blue->SetBounds(gfx::Size(50, 50));
934   blue->SetIsDrawable(true);
935   green->AddChild(blue);
936
937   // Grab the middle of the device viewport.
938   device_viewport_copy_subrect_ = gfx::Rect(50, 50, 100, 100);
939   device_scale_factor_ = 1.f;
940
941   this->impl_side_painting_ = false;
942   RunPixelTestWithReadbackTarget(GL_WITH_DEFAULT,
943                                  background,
944                                  green.get(),
945                                  base::FilePath(FILE_PATH_LITERAL(
946                                      "green_small_with_blue_corner.png")));
947 }
948
949 TEST_F(LayerTreeHostReadbackViaCompositeAndReadbackPixelTest,
950        CompositeAndReadback_GL_2) {
951   scoped_refptr<ContentLayer> background = ContentLayer::Create(&white_client_);
952   background->SetAnchorPoint(gfx::PointF());
953   background->SetBounds(gfx::Size(100, 100));
954   background->SetIsDrawable(true);
955
956   scoped_refptr<ContentLayer> green = ContentLayer::Create(&green_client_);
957   green->SetAnchorPoint(gfx::PointF());
958   green->SetBounds(gfx::Size(100, 100));
959   green->SetIsDrawable(true);
960   background->AddChild(green);
961
962   scoped_refptr<ContentLayer> blue = ContentLayer::Create(&blue_client_);
963   blue->SetAnchorPoint(gfx::PointF());
964   blue->SetPosition(gfx::Point(50, 50));
965   blue->SetBounds(gfx::Size(25, 25));
966   blue->SetIsDrawable(true);
967   green->AddChild(blue);
968
969   // Grab the middle of the device viewport.
970   device_viewport_copy_subrect_ = gfx::Rect(50, 50, 100, 100);
971   device_scale_factor_ = 2.f;
972
973   this->impl_side_painting_ = false;
974   RunPixelTestWithReadbackTarget(GL_WITH_DEFAULT,
975                                  background,
976                                  green.get(),
977                                  base::FilePath(FILE_PATH_LITERAL(
978                                      "green_small_with_blue_corner.png")));
979 }
980
981 TEST_F(LayerTreeHostReadbackPixelTest, ReadbackNonRootLayerOutsideViewport) {
982   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
983       gfx::Rect(200, 200), SK_ColorWHITE);
984
985   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
986       gfx::Rect(200, 200), SK_ColorGREEN);
987   // Only the top left quarter of the layer is inside the viewport, so the
988   // blue layer is entirely outside.
989   green->SetPosition(gfx::Point(100, 100));
990   background->AddChild(green);
991
992   scoped_refptr<SolidColorLayer> blue = CreateSolidColorLayer(
993       gfx::Rect(150, 150, 50, 50), SK_ColorBLUE);
994   green->AddChild(blue);
995
996   RunPixelTestWithReadbackTarget(GL_WITH_DEFAULT,
997                                  background,
998                                  green.get(),
999                                  base::FilePath(FILE_PATH_LITERAL(
1000                                      "green_with_blue_corner.png")));
1001 }
1002
1003 }  // namespace
1004 }  // namespace cc
1005
1006 #endif  // OS_ANDROID