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.
5 #include "cc/test/fake_picture_pile_impl.h"
11 #include "cc/resources/picture_pile.h"
12 #include "cc/test/impl_side_painting_settings.h"
13 #include "testing/gtest/include/gtest/gtest.h"
17 FakePicturePileImpl::FakePicturePileImpl() {}
19 FakePicturePileImpl::FakePicturePileImpl(const PicturePileBase* other)
20 : PicturePileImpl(other),
21 tile_grid_info_(other->GetTileGridInfoForTesting()) {
24 FakePicturePileImpl::~FakePicturePileImpl() {}
26 scoped_refptr<FakePicturePileImpl> FakePicturePileImpl::CreateFilledPile(
27 const gfx::Size& tile_size,
28 const gfx::Size& layer_bounds) {
30 pile.tiling().SetTilingSize(layer_bounds);
31 pile.tiling().SetMaxTextureSize(tile_size);
32 pile.SetTileGridSize(ImplSidePaintingSettings().default_tile_grid_size);
33 pile.SetRecordedViewportForTesting(gfx::Rect(layer_bounds));
34 pile.SetHasAnyRecordingsForTesting(true);
36 auto pile_impl = make_scoped_refptr(new FakePicturePileImpl(&pile));
37 for (int x = 0; x < pile_impl->tiling().num_tiles_x(); ++x) {
38 for (int y = 0; y < pile_impl->tiling().num_tiles_y(); ++y)
39 pile_impl->AddRecordingAt(x, y);
44 scoped_refptr<FakePicturePileImpl> FakePicturePileImpl::CreateEmptyPile(
45 const gfx::Size& tile_size,
46 const gfx::Size& layer_bounds) {
48 pile.tiling().SetTilingSize(layer_bounds);
49 pile.tiling().SetMaxTextureSize(tile_size);
50 pile.SetTileGridSize(ImplSidePaintingSettings().default_tile_grid_size);
51 pile.SetRecordedViewportForTesting(gfx::Rect());
52 pile.SetHasAnyRecordingsForTesting(false);
53 return make_scoped_refptr(new FakePicturePileImpl(&pile));
56 scoped_refptr<FakePicturePileImpl>
57 FakePicturePileImpl::CreateEmptyPileThatThinksItHasRecordings(
58 const gfx::Size& tile_size,
59 const gfx::Size& layer_bounds) {
61 pile.tiling().SetTilingSize(layer_bounds);
62 pile.tiling().SetMaxTextureSize(tile_size);
63 pile.SetTileGridSize(ImplSidePaintingSettings().default_tile_grid_size);
64 // This simulates a false positive for this flag.
65 pile.SetRecordedViewportForTesting(gfx::Rect());
66 pile.SetHasAnyRecordingsForTesting(true);
67 return make_scoped_refptr(new FakePicturePileImpl(&pile));
70 scoped_refptr<FakePicturePileImpl>
71 FakePicturePileImpl::CreateInfiniteFilledPile() {
73 gfx::Size size(std::numeric_limits<int>::max(),
74 std::numeric_limits<int>::max());
75 pile.tiling().SetTilingSize(size);
76 pile.tiling().SetMaxTextureSize(size);
77 pile.SetTileGridSize(size);
78 pile.SetRecordedViewportForTesting(gfx::Rect(size));
79 pile.SetHasAnyRecordingsForTesting(true);
81 auto pile_impl = make_scoped_refptr(new FakePicturePileImpl(&pile));
82 pile_impl->AddRecordingAt(0, 0);
86 void FakePicturePileImpl::AddRecordingAt(int x, int y) {
89 EXPECT_LT(x, tiling_.num_tiles_x());
90 EXPECT_LT(y, tiling_.num_tiles_y());
92 if (HasRecordingAt(x, y))
94 gfx::Rect bounds(tiling().TileBounds(x, y));
95 bounds.Inset(-buffer_pixels(), -buffer_pixels());
97 scoped_refptr<Picture> picture(Picture::Create(
98 bounds, &client_, tile_grid_info_, true, Picture::RECORD_NORMALLY));
99 picture_map_[std::pair<int, int>(x, y)].SetPicture(picture);
100 EXPECT_TRUE(HasRecordingAt(x, y));
102 has_any_recordings_ = true;
105 void FakePicturePileImpl::RemoveRecordingAt(int x, int y) {
108 EXPECT_LT(x, tiling_.num_tiles_x());
109 EXPECT_LT(y, tiling_.num_tiles_y());
111 if (!HasRecordingAt(x, y))
113 picture_map_.erase(std::pair<int, int>(x, y));
114 EXPECT_FALSE(HasRecordingAt(x, y));
117 bool FakePicturePileImpl::HasRecordingAt(int x, int y) const {
118 PictureMap::const_iterator found = picture_map_.find(PictureMapKey(x, y));
119 if (found == picture_map_.end())
121 return !!found->second.GetPicture();
124 void FakePicturePileImpl::RerecordPile() {
125 for (int y = 0; y < num_tiles_y(); ++y) {
126 for (int x = 0; x < num_tiles_x(); ++x) {
127 RemoveRecordingAt(x, y);
128 AddRecordingAt(x, y);
133 void FakePicturePileImpl::SetMinContentsScale(float min_contents_scale) {
134 if (min_contents_scale_ == min_contents_scale)
137 // Picture contents are played back scaled. When the final contents scale is
138 // less than 1 (i.e. low res), then multiple recorded pixels will be used
139 // to raster one final pixel. To avoid splitting a final pixel across
140 // pictures (which would result in incorrect rasterization due to blending), a
141 // buffer margin is added so that any picture can be snapped to integral
144 // For example, if a 1/4 contents scale is used, then that would be 3 buffer
145 // pixels, since that's the minimum number of pixels to add so that resulting
146 // content can be snapped to a four pixel aligned grid.
147 int buffer_pixels = static_cast<int>(ceil(1 / min_contents_scale) - 1);
148 buffer_pixels = std::max(0, buffer_pixels);
149 SetBufferPixels(buffer_pixels);
150 min_contents_scale_ = min_contents_scale;
153 void FakePicturePileImpl::SetBufferPixels(int new_buffer_pixels) {
154 if (new_buffer_pixels == buffer_pixels())
158 tiling_.SetBorderTexels(new_buffer_pixels);
161 void FakePicturePileImpl::Clear() {
162 picture_map_.clear();
163 recorded_viewport_ = gfx::Rect();