1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file.
4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/test/fake_picture_pile_impl.h"
7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "cc/test/fake_rendering_stats_instrumentation.h"
890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "cc/test/skia_common.h"
990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "skia/ext/refptr.h"
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "third_party/skia/include/core/SkPixelRef.h"
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "third_party/skia/include/core/SkShader.h"
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/gfx/rect.h"
14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ui/gfx/size_conversions.h"
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace cc {
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace {
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(PicturePileImplTest, AnalyzeIsSolidUnscaled) {
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Size tile_size(100, 100);
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Size layer_bounds(400, 400);
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<FakePicturePileImpl> pile =
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SkColor solid_color = SkColorSetARGB(255, 12, 23, 34);
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SkPaint solid_paint;
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  solid_paint.setColor(solid_color);
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SkColor non_solid_color = SkColorSetARGB(128, 45, 56, 67);
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SkPaint non_solid_paint;
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  non_solid_paint.setColor(non_solid_color);
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pile->add_draw_rect_with_paint(gfx::Rect(0, 0, 400, 400), solid_paint);
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pile->RerecordPile();
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Ensure everything is solid
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (int y = 0; y <= 300; y += 100) {
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    for (int x = 0; x <= 300; x += 100) {
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      PicturePileImpl::Analysis analysis;
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      gfx::Rect rect(x, y, 100, 100);
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      pile->AnalyzeInRect(rect, 1.0, &analysis);
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EXPECT_TRUE(analysis.is_solid_color) << rect.ToString();
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EXPECT_EQ(analysis.solid_color, solid_color) << rect.ToString();
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // One pixel non solid
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pile->add_draw_rect_with_paint(gfx::Rect(50, 50, 1, 1), non_solid_paint);
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pile->RerecordPile();
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  PicturePileImpl::Analysis analysis;
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pile->AnalyzeInRect(gfx::Rect(0, 0, 100, 100), 1.0, &analysis);
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(analysis.is_solid_color);
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pile->AnalyzeInRect(gfx::Rect(100, 0, 100, 100), 1.0, &analysis);
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(analysis.is_solid_color);
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(analysis.solid_color, solid_color);
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Boundaries should be clipped
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  analysis.is_solid_color = false;
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pile->AnalyzeInRect(gfx::Rect(350, 0, 100, 100), 1.0, &analysis);
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(analysis.is_solid_color);
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(analysis.solid_color, solid_color);
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  analysis.is_solid_color = false;
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pile->AnalyzeInRect(gfx::Rect(0, 350, 100, 100), 1.0, &analysis);
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(analysis.is_solid_color);
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(analysis.solid_color, solid_color);
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  analysis.is_solid_color = false;
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pile->AnalyzeInRect(gfx::Rect(350, 350, 100, 100), 1.0, &analysis);
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(analysis.is_solid_color);
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(analysis.solid_color, solid_color);
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(PicturePileImplTest, AnalyzeIsSolidScaled) {
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Size tile_size(100, 100);
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Size layer_bounds(400, 400);
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<FakePicturePileImpl> pile =
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SkColor solid_color = SkColorSetARGB(255, 12, 23, 34);
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SkPaint solid_paint;
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  solid_paint.setColor(solid_color);
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SkColor non_solid_color = SkColorSetARGB(128, 45, 56, 67);
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SkPaint non_solid_paint;
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  non_solid_paint.setColor(non_solid_color);
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pile->add_draw_rect_with_paint(gfx::Rect(0, 0, 400, 400), solid_paint);
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pile->RerecordPile();
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Ensure everything is solid
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (int y = 0; y <= 30; y += 10) {
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    for (int x = 0; x <= 30; x += 10) {
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      PicturePileImpl::Analysis analysis;
99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      gfx::Rect rect(x, y, 10, 10);
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      pile->AnalyzeInRect(rect, 0.1f, &analysis);
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EXPECT_TRUE(analysis.is_solid_color) << rect.ToString();
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EXPECT_EQ(analysis.solid_color, solid_color) << rect.ToString();
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // One pixel non solid
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pile->add_draw_rect_with_paint(gfx::Rect(50, 50, 1, 1), non_solid_paint);
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pile->RerecordPile();
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  PicturePileImpl::Analysis analysis;
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pile->AnalyzeInRect(gfx::Rect(0, 0, 10, 10), 0.1f, &analysis);
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(analysis.is_solid_color);
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pile->AnalyzeInRect(gfx::Rect(10, 0, 10, 10), 0.1f, &analysis);
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(analysis.is_solid_color);
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(analysis.solid_color, solid_color);
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Boundaries should be clipped
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  analysis.is_solid_color = false;
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pile->AnalyzeInRect(gfx::Rect(35, 0, 10, 10), 0.1f, &analysis);
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(analysis.is_solid_color);
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(analysis.solid_color, solid_color);
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  analysis.is_solid_color = false;
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pile->AnalyzeInRect(gfx::Rect(0, 35, 10, 10), 0.1f, &analysis);
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(analysis.is_solid_color);
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(analysis.solid_color, solid_color);
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  analysis.is_solid_color = false;
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pile->AnalyzeInRect(gfx::Rect(35, 35, 10, 10), 0.1f, &analysis);
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(analysis.is_solid_color);
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(analysis.solid_color, solid_color);
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
13590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TEST(PicturePileImplTest, AnalyzeIsSolidEmpty) {
13690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  gfx::Size tile_size(100, 100);
13790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  gfx::Size layer_bounds(400, 400);
13890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
13990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_refptr<FakePicturePileImpl> pile =
14090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
14190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  PicturePileImpl::Analysis analysis;
14290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(analysis.is_solid_color);
14390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
14490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  pile->AnalyzeInRect(gfx::Rect(0, 0, 400, 400), 1.f, &analysis);
14590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
14690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(analysis.is_solid_color);
14790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(analysis.solid_color, SkColorSetARGB(0, 0, 0, 0));
14890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
14990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(PicturePileImplTest, PixelRefIteratorEmpty) {
151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Size tile_size(128, 128);
152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Size layer_bounds(256, 256);
153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Create a filled pile with no recording.
155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<FakePicturePileImpl> pile =
156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Tile sized iterators.
159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PicturePileImpl::PixelRefIterator iterator(
161868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        gfx::Rect(0, 0, 128, 128), 1.0, pile.get());
162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_FALSE(iterator);
163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PicturePileImpl::PixelRefIterator iterator(
166868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        gfx::Rect(0, 0, 256, 256), 2.0, pile.get());
167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_FALSE(iterator);
168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PicturePileImpl::PixelRefIterator iterator(
171868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        gfx::Rect(0, 0, 64, 64), 0.5, pile.get());
172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_FALSE(iterator);
173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Shifted tile sized iterators.
175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PicturePileImpl::PixelRefIterator iterator(
177868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        gfx::Rect(140, 140, 128, 128), 1.0, pile.get());
178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_FALSE(iterator);
179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PicturePileImpl::PixelRefIterator iterator(
182868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        gfx::Rect(280, 280, 256, 256), 2.0, pile.get());
183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_FALSE(iterator);
184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PicturePileImpl::PixelRefIterator iterator(
187868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        gfx::Rect(70, 70, 64, 64), 0.5, pile.get());
188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_FALSE(iterator);
189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Layer sized iterators.
191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PicturePileImpl::PixelRefIterator iterator(
193868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        gfx::Rect(0, 0, 256, 256), 1.0, pile.get());
194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_FALSE(iterator);
195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PicturePileImpl::PixelRefIterator iterator(
198868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        gfx::Rect(0, 0, 512, 512), 2.0, pile.get());
199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_FALSE(iterator);
200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PicturePileImpl::PixelRefIterator iterator(
203868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        gfx::Rect(0, 0, 128, 128), 0.5, pile.get());
204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_FALSE(iterator);
205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST(PicturePileImplTest, PixelRefIteratorNoDiscardableRefs) {
209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Size tile_size(128, 128);
210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Size layer_bounds(256, 256);
211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<FakePicturePileImpl> pile =
213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SkPaint simple_paint;
216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  simple_paint.setColor(SkColorSetARGB(255, 12, 23, 34));
217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SkBitmap non_discardable_bitmap;
2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CreateBitmap(gfx::Size(128, 128), "notdiscardable", &non_discardable_bitmap);
220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pile->add_draw_rect_with_paint(gfx::Rect(0, 0, 256, 256), simple_paint);
222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pile->add_draw_rect_with_paint(gfx::Rect(128, 128, 512, 512), simple_paint);
223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pile->add_draw_rect_with_paint(gfx::Rect(512, 0, 256, 256), simple_paint);
224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pile->add_draw_rect_with_paint(gfx::Rect(0, 512, 256, 256), simple_paint);
2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  pile->add_draw_bitmap(non_discardable_bitmap, gfx::Point(128, 0));
2265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  pile->add_draw_bitmap(non_discardable_bitmap, gfx::Point(0, 128));
2275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  pile->add_draw_bitmap(non_discardable_bitmap, gfx::Point(150, 150));
228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pile->RerecordPile();
230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Tile sized iterators.
232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PicturePileImpl::PixelRefIterator iterator(
234868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        gfx::Rect(0, 0, 128, 128), 1.0, pile.get());
235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_FALSE(iterator);
236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PicturePileImpl::PixelRefIterator iterator(
239868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        gfx::Rect(0, 0, 256, 256), 2.0, pile.get());
240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_FALSE(iterator);
241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PicturePileImpl::PixelRefIterator iterator(
244868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        gfx::Rect(0, 0, 64, 64), 0.5, pile.get());
245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_FALSE(iterator);
246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Shifted tile sized iterators.
248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PicturePileImpl::PixelRefIterator iterator(
250868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        gfx::Rect(140, 140, 128, 128), 1.0, pile.get());
251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_FALSE(iterator);
252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PicturePileImpl::PixelRefIterator iterator(
255868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        gfx::Rect(280, 280, 256, 256), 2.0, pile.get());
256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_FALSE(iterator);
257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PicturePileImpl::PixelRefIterator iterator(
260868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        gfx::Rect(70, 70, 64, 64), 0.5, pile.get());
261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_FALSE(iterator);
262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Layer sized iterators.
264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PicturePileImpl::PixelRefIterator iterator(
266868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        gfx::Rect(0, 0, 256, 256), 1.0, pile.get());
267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_FALSE(iterator);
268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PicturePileImpl::PixelRefIterator iterator(
271868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        gfx::Rect(0, 0, 512, 512), 2.0, pile.get());
272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_FALSE(iterator);
273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PicturePileImpl::PixelRefIterator iterator(
276868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        gfx::Rect(0, 0, 128, 128), 0.5, pile.get());
277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_FALSE(iterator);
278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST(PicturePileImplTest, PixelRefIteratorDiscardableRefs) {
282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Size tile_size(128, 128);
283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Size layer_bounds(256, 256);
284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<FakePicturePileImpl> pile =
286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SkBitmap discardable_bitmap[2][2];
2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CreateBitmap(gfx::Size(32, 32), "discardable", &discardable_bitmap[0][0]);
2905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CreateBitmap(gfx::Size(32, 32), "discardable", &discardable_bitmap[1][0]);
2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CreateBitmap(gfx::Size(32, 32), "discardable", &discardable_bitmap[1][1]);
292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Discardable pixel refs are found in the following cells:
294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // |---|---|
295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // | x |   |
296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // |---|---|
297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // | x | x |
298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // |---|---|
2995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  pile->add_draw_bitmap(discardable_bitmap[0][0], gfx::Point(0, 0));
3005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  pile->add_draw_bitmap(discardable_bitmap[1][0], gfx::Point(0, 130));
3015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  pile->add_draw_bitmap(discardable_bitmap[1][1], gfx::Point(140, 140));
302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pile->RerecordPile();
304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Tile sized iterators. These should find only one pixel ref.
306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PicturePileImpl::PixelRefIterator iterator(
308868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        gfx::Rect(0, 0, 128, 128), 1.0, pile.get());
309c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(iterator);
3105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(*iterator == discardable_bitmap[0][0].pixelRef());
311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_FALSE(++iterator);
312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PicturePileImpl::PixelRefIterator iterator(
315868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        gfx::Rect(0, 0, 256, 256), 2.0, pile.get());
316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(iterator);
3175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(*iterator == discardable_bitmap[0][0].pixelRef());
318c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_FALSE(++iterator);
319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PicturePileImpl::PixelRefIterator iterator(
322868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        gfx::Rect(0, 0, 64, 64), 0.5, pile.get());
323c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(iterator);
3245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(*iterator == discardable_bitmap[0][0].pixelRef());
325c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_FALSE(++iterator);
326c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Shifted tile sized iterators. These should find only one pixel ref.
328c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
329c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PicturePileImpl::PixelRefIterator iterator(
330868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        gfx::Rect(140, 140, 128, 128), 1.0, pile.get());
331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(iterator);
3325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(*iterator == discardable_bitmap[1][1].pixelRef());
333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_FALSE(++iterator);
334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PicturePileImpl::PixelRefIterator iterator(
337868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        gfx::Rect(280, 280, 256, 256), 2.0, pile.get());
338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(iterator);
3395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(*iterator == discardable_bitmap[1][1].pixelRef());
340c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_FALSE(++iterator);
341c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PicturePileImpl::PixelRefIterator iterator(
344868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        gfx::Rect(70, 70, 64, 64), 0.5, pile.get());
345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(iterator);
3465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(*iterator == discardable_bitmap[1][1].pixelRef());
347c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_FALSE(++iterator);
348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
3495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Ensure there's no discardable pixel refs in the empty cell
350c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
351c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PicturePileImpl::PixelRefIterator iterator(
352868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        gfx::Rect(140, 0, 128, 128), 1.0, pile.get());
353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_FALSE(iterator);
354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Layer sized iterators. These should find all 3 pixel refs.
356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PicturePileImpl::PixelRefIterator iterator(
358868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        gfx::Rect(0, 0, 256, 256), 1.0, pile.get());
359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(iterator);
3605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(*iterator == discardable_bitmap[0][0].pixelRef());
361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(++iterator);
3625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(*iterator == discardable_bitmap[1][0].pixelRef());
363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(++iterator);
3645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(*iterator == discardable_bitmap[1][1].pixelRef());
365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_FALSE(++iterator);
366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PicturePileImpl::PixelRefIterator iterator(
369868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        gfx::Rect(0, 0, 512, 512), 2.0, pile.get());
370c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(iterator);
3715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(*iterator == discardable_bitmap[0][0].pixelRef());
372c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(++iterator);
3735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(*iterator == discardable_bitmap[1][0].pixelRef());
374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(++iterator);
3755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(*iterator == discardable_bitmap[1][1].pixelRef());
376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_FALSE(++iterator);
377c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
378c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
379c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PicturePileImpl::PixelRefIterator iterator(
380868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        gfx::Rect(0, 0, 128, 128), 0.5, pile.get());
381c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(iterator);
3825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(*iterator == discardable_bitmap[0][0].pixelRef());
383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(++iterator);
3845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(*iterator == discardable_bitmap[1][0].pixelRef());
385c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(++iterator);
3865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(*iterator == discardable_bitmap[1][1].pixelRef());
387c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_FALSE(++iterator);
388c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
389c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
390c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST(PicturePileImplTest, PixelRefIteratorDiscardableRefsOneTile) {
392c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Size tile_size(256, 256);
393c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Size layer_bounds(512, 512);
394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
395c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<FakePicturePileImpl> pile =
396c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
397c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SkBitmap discardable_bitmap[2][2];
3995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CreateBitmap(gfx::Size(32, 32), "discardable", &discardable_bitmap[0][0]);
4005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CreateBitmap(gfx::Size(32, 32), "discardable", &discardable_bitmap[0][1]);
4015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CreateBitmap(gfx::Size(32, 32), "discardable", &discardable_bitmap[1][1]);
402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Discardable pixel refs are found in the following cells:
404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // |---|---|
405c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // | x | x |
406c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // |---|---|
407c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // |   | x |
408c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // |---|---|
4095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  pile->add_draw_bitmap(discardable_bitmap[0][0], gfx::Point(0, 0));
4105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  pile->add_draw_bitmap(discardable_bitmap[0][1], gfx::Point(260, 0));
4115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  pile->add_draw_bitmap(discardable_bitmap[1][1], gfx::Point(260, 260));
412c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
413c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pile->RerecordPile();
414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
415c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Tile sized iterators. These should find only one pixel ref.
416c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
417c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PicturePileImpl::PixelRefIterator iterator(
418868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        gfx::Rect(0, 0, 256, 256), 1.0, pile.get());
419c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(iterator);
4205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(*iterator == discardable_bitmap[0][0].pixelRef());
421c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_FALSE(++iterator);
422c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
423c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
424c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PicturePileImpl::PixelRefIterator iterator(
425868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        gfx::Rect(0, 0, 512, 512), 2.0, pile.get());
426c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(iterator);
4275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(*iterator == discardable_bitmap[0][0].pixelRef());
428c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_FALSE(++iterator);
429c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
430c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
431c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PicturePileImpl::PixelRefIterator iterator(
432868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        gfx::Rect(0, 0, 128, 128), 0.5, pile.get());
433c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(iterator);
4345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(*iterator == discardable_bitmap[0][0].pixelRef());
435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_FALSE(++iterator);
436c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
437c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Shifted tile sized iterators. These should find only one pixel ref.
438c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PicturePileImpl::PixelRefIterator iterator(
440868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        gfx::Rect(260, 260, 256, 256), 1.0, pile.get());
441c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(iterator);
4425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(*iterator == discardable_bitmap[1][1].pixelRef());
443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_FALSE(++iterator);
444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
445c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PicturePileImpl::PixelRefIterator iterator(
447868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        gfx::Rect(520, 520, 512, 512), 2.0, pile.get());
448c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(iterator);
4495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(*iterator == discardable_bitmap[1][1].pixelRef());
450c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_FALSE(++iterator);
451c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
452c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
453c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PicturePileImpl::PixelRefIterator iterator(
454868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        gfx::Rect(130, 130, 128, 128), 0.5, pile.get());
455c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(iterator);
4565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(*iterator == discardable_bitmap[1][1].pixelRef());
457c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_FALSE(++iterator);
458c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
4595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Ensure there's no discardable pixel refs in the empty cell
460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PicturePileImpl::PixelRefIterator iterator(
462868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        gfx::Rect(0, 256, 256, 256), 1.0, pile.get());
463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_FALSE(iterator);
464c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
465c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Layer sized iterators. These should find three pixel ref.
466c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
467c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PicturePileImpl::PixelRefIterator iterator(
468868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        gfx::Rect(0, 0, 512, 512), 1.0, pile.get());
469c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(iterator);
4705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(*iterator == discardable_bitmap[0][0].pixelRef());
471c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(++iterator);
4725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(*iterator == discardable_bitmap[0][1].pixelRef());
473c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(++iterator);
4745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(*iterator == discardable_bitmap[1][1].pixelRef());
475c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_FALSE(++iterator);
476c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
477c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
478c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PicturePileImpl::PixelRefIterator iterator(
479868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        gfx::Rect(0, 0, 1024, 1024), 2.0, pile.get());
480c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(iterator);
4815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(*iterator == discardable_bitmap[0][0].pixelRef());
482c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(++iterator);
4835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(*iterator == discardable_bitmap[0][1].pixelRef());
484c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(++iterator);
4855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(*iterator == discardable_bitmap[1][1].pixelRef());
486c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_FALSE(++iterator);
487c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
488c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
489c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PicturePileImpl::PixelRefIterator iterator(
490868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        gfx::Rect(0, 0, 256, 256), 0.5, pile.get());
491c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(iterator);
4925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(*iterator == discardable_bitmap[0][0].pixelRef());
493c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(++iterator);
4945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(*iterator == discardable_bitmap[0][1].pixelRef());
495c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(++iterator);
4965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(*iterator == discardable_bitmap[1][1].pixelRef());
497c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_FALSE(++iterator);
498c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
499c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
500c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Copy test.
501c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  PicturePileImpl::PixelRefIterator iterator(
502868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      gfx::Rect(0, 0, 512, 512), 1.0, pile.get());
503c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(iterator);
5045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(*iterator == discardable_bitmap[0][0].pixelRef());
505c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(++iterator);
5065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(*iterator == discardable_bitmap[0][1].pixelRef());
507c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
508c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // copy now points to the same spot as iterator,
509c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // but both can be incremented independently.
510c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  PicturePileImpl::PixelRefIterator copy = iterator;
511c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(++iterator);
5125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(*iterator == discardable_bitmap[1][1].pixelRef());
513c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(++iterator);
514c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
515c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(copy);
5165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(*copy == discardable_bitmap[0][1].pixelRef());
517c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(++copy);
5185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(*copy == discardable_bitmap[1][1].pixelRef());
519c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(++copy);
520c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
521c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST(PicturePileImplTest, PixelRefIteratorDiscardableRefsBaseNonDiscardable) {
523c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Size tile_size(256, 256);
524c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Size layer_bounds(512, 512);
525c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
526c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<FakePicturePileImpl> pile =
527c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
528c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SkBitmap non_discardable_bitmap;
5305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CreateBitmap(gfx::Size(512, 512), "notdiscardable", &non_discardable_bitmap);
531c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SkBitmap discardable_bitmap[2][2];
5335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CreateBitmap(gfx::Size(128, 128), "discardable", &discardable_bitmap[0][0]);
5345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CreateBitmap(gfx::Size(128, 128), "discardable", &discardable_bitmap[0][1]);
5355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CreateBitmap(gfx::Size(128, 128), "discardable", &discardable_bitmap[1][1]);
536c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // One large non-discardable bitmap covers the whole grid.
5385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Discardable pixel refs are found in the following cells:
539c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // |---|---|
540c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // | x | x |
541c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // |---|---|
542c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // |   | x |
543c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // |---|---|
5445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  pile->add_draw_bitmap(non_discardable_bitmap, gfx::Point(0, 0));
5455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  pile->add_draw_bitmap(discardable_bitmap[0][0], gfx::Point(0, 0));
5465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  pile->add_draw_bitmap(discardable_bitmap[0][1], gfx::Point(260, 0));
5475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  pile->add_draw_bitmap(discardable_bitmap[1][1], gfx::Point(260, 260));
548c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
549c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pile->RerecordPile();
550c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
551c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Tile sized iterators. These should find only one pixel ref.
552c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
553c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PicturePileImpl::PixelRefIterator iterator(
554868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        gfx::Rect(0, 0, 256, 256), 1.0, pile.get());
555c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(iterator);
5565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(*iterator == discardable_bitmap[0][0].pixelRef());
557c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_FALSE(++iterator);
558c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
559c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
560c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PicturePileImpl::PixelRefIterator iterator(
561868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        gfx::Rect(0, 0, 512, 512), 2.0, pile.get());
562c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(iterator);
5635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(*iterator == discardable_bitmap[0][0].pixelRef());
564c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_FALSE(++iterator);
565c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
566c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
567c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PicturePileImpl::PixelRefIterator iterator(
568868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        gfx::Rect(0, 0, 128, 128), 0.5, pile.get());
569c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(iterator);
5705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(*iterator == discardable_bitmap[0][0].pixelRef());
571c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_FALSE(++iterator);
572c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
573c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Shifted tile sized iterators. These should find only one pixel ref.
574c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
575c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PicturePileImpl::PixelRefIterator iterator(
576868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        gfx::Rect(260, 260, 256, 256), 1.0, pile.get());
577c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(iterator);
5785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(*iterator == discardable_bitmap[1][1].pixelRef());
579c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_FALSE(++iterator);
580c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
581c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
582c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PicturePileImpl::PixelRefIterator iterator(
583868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        gfx::Rect(520, 520, 512, 512), 2.0, pile.get());
584c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(iterator);
5855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(*iterator == discardable_bitmap[1][1].pixelRef());
586c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_FALSE(++iterator);
587c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
588c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
589c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PicturePileImpl::PixelRefIterator iterator(
590868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        gfx::Rect(130, 130, 128, 128), 0.5, pile.get());
591c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(iterator);
5925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(*iterator == discardable_bitmap[1][1].pixelRef());
593c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_FALSE(++iterator);
594c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
5955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Ensure there's no discardable pixel refs in the empty cell
596c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
597c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PicturePileImpl::PixelRefIterator iterator(
598868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        gfx::Rect(0, 256, 256, 256), 1.0, pile.get());
599c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_FALSE(iterator);
600c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
601c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Layer sized iterators. These should find three pixel ref.
602c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
603c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PicturePileImpl::PixelRefIterator iterator(
604868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        gfx::Rect(0, 0, 512, 512), 1.0, pile.get());
605c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(iterator);
6065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(*iterator == discardable_bitmap[0][0].pixelRef());
607c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(++iterator);
6085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(*iterator == discardable_bitmap[0][1].pixelRef());
609c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(++iterator);
6105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(*iterator == discardable_bitmap[1][1].pixelRef());
611c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_FALSE(++iterator);
612c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
613c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
614c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PicturePileImpl::PixelRefIterator iterator(
615868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        gfx::Rect(0, 0, 1024, 1024), 2.0, pile.get());
616c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(iterator);
6175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(*iterator == discardable_bitmap[0][0].pixelRef());
618c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(++iterator);
6195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(*iterator == discardable_bitmap[0][1].pixelRef());
620c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(++iterator);
6215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(*iterator == discardable_bitmap[1][1].pixelRef());
622c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_FALSE(++iterator);
623c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
624c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
625c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PicturePileImpl::PixelRefIterator iterator(
626868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        gfx::Rect(0, 0, 256, 256), 0.5, pile.get());
627c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(iterator);
6285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(*iterator == discardable_bitmap[0][0].pixelRef());
629c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(++iterator);
6305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(*iterator == discardable_bitmap[0][1].pixelRef());
631c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(++iterator);
6325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(*iterator == discardable_bitmap[1][1].pixelRef());
633c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_FALSE(++iterator);
634c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
635c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
636c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
637c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass FullContentsTest : public ::testing::TestWithParam<bool> {};
638c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
639c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST_P(FullContentsTest, RasterFullContents) {
640868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gfx::Size tile_size(1000, 1000);
641868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gfx::Size layer_bounds(3, 5);
642868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  float contents_scale = 1.5f;
6430f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  float raster_divisions = 2.f;
644c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Param in this case is whether the content is fully opaque
645c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // or just filled completely. For this test they should behave the same.
646c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  bool contents_opaque = GetParam();
647c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  bool fills_content = !GetParam();
648868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
649868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  scoped_refptr<FakePicturePileImpl> pile =
650868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
651868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Because the caller sets content opaque, it also promises that it
652868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // has at least filled in layer_bounds opaquely.
6530f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  SkPaint white_paint;
6540f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  white_paint.setColor(SK_ColorWHITE);
6550f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  pile->add_draw_rect_with_paint(gfx::Rect(layer_bounds), white_paint);
656868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
657868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  pile->SetMinContentsScale(contents_scale);
6580f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  pile->set_background_color(SK_ColorBLACK);
659c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  pile->set_contents_opaque(contents_opaque);
660c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  pile->set_contents_fill_bounds_completely(fills_content);
6610f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  pile->set_clear_canvas_with_debug_color(false);
662868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  pile->RerecordPile();
663868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
664868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gfx::Size content_bounds(
665868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      gfx::ToCeiledSize(gfx::ScaleSize(layer_bounds, contents_scale)));
666868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
6670f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // Simulate drawing into different tiles at different offsets.
6680f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  int step_x = std::ceil(content_bounds.width() / raster_divisions);
6690f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  int step_y = std::ceil(content_bounds.height() / raster_divisions);
6700f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  for (int offset_x = 0; offset_x < content_bounds.width();
6710f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)       offset_x += step_x) {
6720f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    for (int offset_y = 0; offset_y < content_bounds.height();
6730f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)         offset_y += step_y) {
6740f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      gfx::Rect content_rect(offset_x, offset_y, step_x, step_y);
6750f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      content_rect.Intersect(gfx::Rect(content_bounds));
6760f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
6770f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      // Simulate a canvas rect larger than the content rect.  Every pixel
6780f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      // up to one pixel outside the content rect is guaranteed to be opaque.
6790f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      // Outside of that is undefined.
6800f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      gfx::Rect canvas_rect(content_rect);
6810f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      canvas_rect.Inset(0, 0, -1, -1);
6820f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
6830f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      SkBitmap bitmap;
684effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      bitmap.allocN32Pixels(canvas_rect.width(), canvas_rect.height());
6850f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      SkCanvas canvas(bitmap);
6860f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      canvas.clear(SK_ColorTRANSPARENT);
6870f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
6880f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      FakeRenderingStatsInstrumentation rendering_stats_instrumentation;
6890f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
6900f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      pile->RasterToBitmap(&canvas,
6910f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                           canvas_rect,
6920f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                           contents_scale,
6930f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                           &rendering_stats_instrumentation);
6940f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
6950f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      SkColor* pixels = reinterpret_cast<SkColor*>(bitmap.getPixels());
6960f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      int num_pixels = bitmap.width() * bitmap.height();
6970f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      bool all_white = true;
6980f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      for (int i = 0; i < num_pixels; ++i) {
6990f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        EXPECT_EQ(SkColorGetA(pixels[i]), 255u);
7000f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        all_white &= (SkColorGetR(pixels[i]) == 255);
7010f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        all_white &= (SkColorGetG(pixels[i]) == 255);
7020f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        all_white &= (SkColorGetB(pixels[i]) == 255);
7030f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      }
7040f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
7050f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      // If the canvas doesn't extend past the edge of the content,
7060f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      // it should be entirely white. Otherwise, the edge of the content
7070f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      // will be non-white.
7080f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      EXPECT_EQ(all_white, gfx::Rect(content_bounds).Contains(canvas_rect));
7090f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    }
710868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
711868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
712868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
713c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochINSTANTIATE_TEST_CASE_P(PicturePileImpl,
714c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                        FullContentsTest,
715c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                        ::testing::Values(false, true));
716c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
717868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST(PicturePileImpl, RasterContentsTransparent) {
718868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gfx::Size tile_size(1000, 1000);
719868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gfx::Size layer_bounds(5, 3);
720868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  float contents_scale = 0.5f;
721868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
722868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  scoped_refptr<FakePicturePileImpl> pile =
723868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
724868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  pile->set_background_color(SK_ColorTRANSPARENT);
725868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  pile->set_contents_opaque(false);
726868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  pile->SetMinContentsScale(contents_scale);
7270f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  pile->set_clear_canvas_with_debug_color(false);
728868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  pile->RerecordPile();
729868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
730868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gfx::Size content_bounds(
731868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      gfx::ToCeiledSize(gfx::ScaleSize(layer_bounds, contents_scale)));
732868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
733868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gfx::Rect canvas_rect(content_bounds);
734868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  canvas_rect.Inset(0, 0, -1, -1);
735868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
736868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SkBitmap bitmap;
737effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  bitmap.allocN32Pixels(canvas_rect.width(), canvas_rect.height());
738868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SkCanvas canvas(bitmap);
739868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
7404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  FakeRenderingStatsInstrumentation rendering_stats_instrumentation;
741868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  pile->RasterToBitmap(
7424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      &canvas, canvas_rect, contents_scale, &rendering_stats_instrumentation);
743868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
744868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SkColor* pixels = reinterpret_cast<SkColor*>(bitmap.getPixels());
745868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  int num_pixels = bitmap.width() * bitmap.height();
746868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  for (int i = 0; i < num_pixels; ++i) {
747868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EXPECT_EQ(SkColorGetA(pixels[i]), 0u);
748868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
749868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
750868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
75123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)class OverlapTest : public ::testing::TestWithParam<float> {
75223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) public:
75323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  static float MinContentsScale() { return 1.f / 4.f; }
75423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)};
75523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
75623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)TEST_P(OverlapTest, NoOverlap) {
75723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  gfx::Size tile_size(10, 10);
75823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  gfx::Size layer_bounds(30, 30);
75923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  gfx::Size bigger_than_layer_bounds(300, 300);
76023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  float contents_scale = GetParam();
76123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // Pick an opaque color to not have to deal with premultiplication off-by-one.
76223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  SkColor test_color = SkColorSetARGB(255, 45, 56, 67);
76323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
76423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scoped_refptr<FakePicturePileImpl> pile =
76523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
76623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  pile->set_background_color(SK_ColorTRANSPARENT);
76723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  pile->set_contents_opaque(false);
76823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  pile->SetMinContentsScale(MinContentsScale());
76923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  pile->set_clear_canvas_with_debug_color(true);
77023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  SkPaint color_paint;
77123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  color_paint.setColor(test_color);
77223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // Additive paint, so that if two paints overlap, the color will change.
77323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  color_paint.setXfermodeMode(SkXfermode::kPlus_Mode);
77423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // Paint outside the layer to make sure that blending works.
77523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  pile->add_draw_rect_with_paint(gfx::RectF(bigger_than_layer_bounds),
77623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                                 color_paint);
77723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  pile->RerecordPile();
77823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
77923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  gfx::Size content_bounds(
78023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      gfx::ToCeiledSize(gfx::ScaleSize(layer_bounds, contents_scale)));
78123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
78223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  SkBitmap bitmap;
783116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bitmap.allocN32Pixels(content_bounds.width(), content_bounds.height());
78423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  SkCanvas canvas(bitmap);
78523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
78623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  FakeRenderingStatsInstrumentation rendering_stats_instrumentation;
78723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  pile->RasterToBitmap(&canvas,
78823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                       gfx::Rect(content_bounds),
78923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                       contents_scale,
79023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                       &rendering_stats_instrumentation);
79123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
79223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  for (int y = 0; y < bitmap.height(); y++) {
79323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    for (int x = 0; x < bitmap.width(); x++) {
79423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      SkColor color = bitmap.getColor(x, y);
79523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      EXPECT_EQ(SkColorGetR(test_color), SkColorGetR(color)) << "x: " << x
79623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                                                             << ", y: " << y;
79723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      EXPECT_EQ(SkColorGetG(test_color), SkColorGetG(color)) << "x: " << x
79823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                                                             << ", y: " << y;
79923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      EXPECT_EQ(SkColorGetB(test_color), SkColorGetB(color)) << "x: " << x
80023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                                                             << ", y: " << y;
80123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      EXPECT_EQ(SkColorGetA(test_color), SkColorGetA(color)) << "x: " << x
80223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                                                             << ", y: " << y;
80323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      if (test_color != color)
80423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        break;
80523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    }
80623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  }
80723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
80823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
80923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)INSTANTIATE_TEST_CASE_P(PicturePileImpl,
81023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                        OverlapTest,
81123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                        ::testing::Values(1.f, 0.873f, 1.f / 4.f, 4.f));
81223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
81323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)TEST(PicturePileImplTest, PixelRefIteratorBorders) {
81423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // 3 tile width / 1 tile height pile
81523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  gfx::Size tile_size(128, 128);
81623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  gfx::Size layer_bounds(320, 128);
81723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
81823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // Fake picture pile impl uses a tile grid the size of the tile.  So,
81923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // any iteration that intersects with a tile will return all pixel refs
82023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // inside of it.
82123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scoped_refptr<FakePicturePileImpl> pile =
82223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
82323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  pile->SetMinContentsScale(0.5f);
82423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
82523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // Bitmaps 0-2 are exactly on tiles 0-2, so that they overlap the borders
82623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // of adjacent tiles.
82723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  gfx::Rect bitmap_rects[] = {pile->tiling().TileBounds(0, 0),
82823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                              pile->tiling().TileBounds(1, 0),
82923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                              pile->tiling().TileBounds(2, 0), };
83023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  SkBitmap discardable_bitmap[arraysize(bitmap_rects)];
83123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
83223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  for (size_t i = 0; i < arraysize(bitmap_rects); ++i) {
83323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    CreateBitmap(bitmap_rects[i].size(), "discardable", &discardable_bitmap[i]);
83423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    pile->add_draw_bitmap(discardable_bitmap[i], bitmap_rects[i].origin());
83523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  }
83623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
83723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // Sanity check that bitmaps 0-2 intersect the borders of their adjacent
83823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // tiles, but not the actual tiles.
83923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_TRUE(
84023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      bitmap_rects[0].Intersects(pile->tiling().TileBoundsWithBorder(1, 0)));
84123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_FALSE(bitmap_rects[0].Intersects(pile->tiling().TileBounds(1, 0)));
84223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_TRUE(
84323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      bitmap_rects[1].Intersects(pile->tiling().TileBoundsWithBorder(0, 0)));
84423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_FALSE(bitmap_rects[1].Intersects(pile->tiling().TileBounds(0, 0)));
84523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_TRUE(
84623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      bitmap_rects[1].Intersects(pile->tiling().TileBoundsWithBorder(2, 0)));
84723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_FALSE(bitmap_rects[1].Intersects(pile->tiling().TileBounds(2, 0)));
84823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_TRUE(
84923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      bitmap_rects[2].Intersects(pile->tiling().TileBoundsWithBorder(1, 0)));
85023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_FALSE(bitmap_rects[2].Intersects(pile->tiling().TileBounds(1, 0)));
85123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
85223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  pile->RerecordPile();
85323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
85423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // Tile-sized iterators.
85523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  {
85623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    // Because tile 0's borders extend onto tile 1, it will include both
85723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    // bitmap 0 and 1.  However, it should *not* include bitmap 2.
85823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    PicturePileImpl::PixelRefIterator iterator(
85923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        pile->tiling().TileBounds(0, 0), 1.f, pile.get());
86023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    EXPECT_TRUE(iterator);
86123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    EXPECT_TRUE(*iterator == discardable_bitmap[0].pixelRef());
86223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    EXPECT_TRUE(++iterator);
86323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    EXPECT_TRUE(*iterator == discardable_bitmap[1].pixelRef());
86423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    EXPECT_FALSE(++iterator);
86523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  }
86623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  {
86723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    // Tile 1 + borders hits all bitmaps.
86823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    PicturePileImpl::PixelRefIterator iterator(
86923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        pile->tiling().TileBounds(1, 0), 1.f, pile.get());
87023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    EXPECT_TRUE(iterator);
87123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    EXPECT_TRUE(*iterator == discardable_bitmap[0].pixelRef());
87223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    EXPECT_TRUE(++iterator);
87323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    EXPECT_TRUE(*iterator == discardable_bitmap[1].pixelRef());
87423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    EXPECT_TRUE(++iterator);
87523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    EXPECT_TRUE(*iterator == discardable_bitmap[2].pixelRef());
87623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    EXPECT_FALSE(++iterator);
87723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  }
87823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  {
87923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    // Tile 2 should not include bitmap 0, which is only on tile 0 and the
88023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    // borders of tile 1.
88123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    PicturePileImpl::PixelRefIterator iterator(
88223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        pile->tiling().TileBounds(2, 0), 1.f, pile.get());
88323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    EXPECT_TRUE(iterator);
88423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    EXPECT_TRUE(*iterator == discardable_bitmap[1].pixelRef());
88523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    EXPECT_TRUE(++iterator);
88623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    EXPECT_TRUE(*iterator == discardable_bitmap[2].pixelRef());
88723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    EXPECT_FALSE(++iterator);
88823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  }
88923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
89023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
891c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace
892c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace cc
893