Index: cc/picture_layer_impl_unittest.cc |
diff --git a/cc/picture_layer_impl_unittest.cc b/cc/picture_layer_impl_unittest.cc |
index b4b9f4c2302b813235d325b69a9ce849e48a0d93..43a72fed5d87c9e42ed3b37d709582b8b6151350 100644 |
--- a/cc/picture_layer_impl_unittest.cc |
+++ b/cc/picture_layer_impl_unittest.cc |
@@ -5,6 +5,7 @@ |
#include "cc/picture_layer_impl.h" |
#include "cc/layer_tree_impl.h" |
+#include "cc/picture_layer.h" |
#include "cc/test/fake_content_layer_client.h" |
#include "cc/test/fake_impl_proxy.h" |
#include "cc/test/fake_layer_tree_host_impl.h" |
@@ -89,8 +90,7 @@ class TestablePicturePileImpl : public PicturePileImpl { |
return; |
gfx::Rect bounds(tiling().TileBounds(x, y)); |
scoped_refptr<Picture> picture(Picture::Create(bounds)); |
- FakeContentLayerClient client; |
- picture->Record(&client, NULL); |
+ picture->Record(&client_, NULL, tile_grid_info_); |
picture_list_map_[std::pair<int, int>(x, y)].push_back(picture); |
EXPECT_TRUE(HasRecordingAt(x, y)); |
@@ -111,9 +111,15 @@ class TestablePicturePileImpl : public PicturePileImpl { |
UpdateRecordedRegion(); |
} |
+ void addDrawRect(const gfx::Rect& rect) { |
+ client_.addDrawRect(rect); |
+ } |
+ |
protected: |
virtual ~TestablePicturePileImpl() { |
} |
+ |
+ FakeContentLayerClient client_; |
}; |
class ImplSidePaintingSettings : public LayerTreeSettings { |
@@ -123,6 +129,18 @@ class ImplSidePaintingSettings : public LayerTreeSettings { |
} |
}; |
+class MockCanvas : public SkCanvas { |
+ public: |
+ explicit MockCanvas(SkDevice* device) : SkCanvas(device) { } |
+ |
+ virtual void drawRect(const SkRect& rect, const SkPaint& paint) { |
+ // Capture calls before SkCanvas quickReject kicks in |
+ rects_.push_back(rect); |
+ } |
+ |
+ std::vector<SkRect> rects_; |
+}; |
+ |
class PictureLayerImplTest : public testing::Test { |
public: |
PictureLayerImplTest() |
@@ -194,6 +212,64 @@ class PictureLayerImplTest : public testing::Test { |
} |
protected: |
+ void TestTileGridAlignmentCommon() { |
+ gfx::Size tile_size(1000, 1000); |
+ gfx::Size layer_bounds(1000, 1000); |
+ |
+ scoped_refptr<TestablePicturePileImpl> pending_pile = |
+ TestablePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); |
+ scoped_refptr<TestablePicturePileImpl> active_pile = |
+ TestablePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); |
+ pending_pile->ApplyLayerTreeSettings(&host_impl_); |
+ active_pile->ApplyLayerTreeSettings(&host_impl_); |
+ |
+ SetupTrees(pending_pile, active_pile); |
+ |
+ host_impl_.activeTree()->SetPageScaleFactorAndLimits(1.f, 1.f, 1.f); |
+ float result_scale_x, result_scale_y; |
+ gfx::Size result_bounds; |
+ active_layer_->calculateContentsScale( |
+ 1.f, false, &result_scale_x, &result_scale_y, &result_bounds); |
+ |
+ // Add 1x1 rects at the centers of each tile, then re-record pile contents |
+ std::vector<Tile*> tiles = |
+ active_layer_->tilings().tiling_at(0)->AllTilesForTesting(); |
+ EXPECT_EQ(16, tiles.size()); |
+ std::vector<SkRect> rects; |
+ std::vector<Tile*>::const_iterator tile_iter; |
+ for (tile_iter = tiles.begin(); tile_iter < tiles.end(); tile_iter++) { |
+ gfx::Point tile_center = (*tile_iter)->content_rect().CenterPoint(); |
+ gfx::Rect rect(tile_center.x(), tile_center.y(), 1, 1); |
+ active_pile->addDrawRect(rect); |
+ rects.push_back(SkRect::MakeXYWH(rect.x(), rect.y(), 1, 1)); |
+ } |
+ // Force re-record with newly injected content |
+ active_pile->RemoveRecordingAt(0, 0); |
+ active_pile->AddRecordingAt(0, 0); |
+ |
+ SkBitmap store; |
+ store.setConfig(SkBitmap::kNo_Config, 1000, 1000); |
+ SkDevice device(store); |
+ int64 pixelsRasterized; |
+ |
+ std::vector<SkRect>::const_iterator rect_iter = rects.begin(); |
+ for (tile_iter = tiles.begin(); tile_iter < tiles.end(); tile_iter++) { |
+ MockCanvas mock_canvas(&device); |
+ active_pile->Raster(&mock_canvas, (*tile_iter)->content_rect(), |
+ 1.0f, &pixelsRasterized); |
+ |
+ // This test verifies that when drawing the contents of a specific tile |
+ // at content scale 1.0, the playback canvas never receives content from |
+ // neighboring tiles which indicates that the tile grid embedded in |
+ // SkPicture is perfectly aligned with the compositor's tiles. |
+ // Note: There are two rects: the initial clear and the explicitly |
+ // recorded rect. We only care about the second one. |
+ EXPECT_EQ(2, mock_canvas.rects_.size()); |
enne (OOO)
2013/02/25 23:59:15
This is great. Thanks for the tests.
|
+ EXPECT_EQ(*rect_iter, mock_canvas.rects_[1]); |
+ rect_iter++; |
+ } |
+ } |
+ |
FakeImplProxy proxy_; |
FakeLayerTreeHostImpl host_impl_; |
int id_; |
@@ -203,6 +279,16 @@ class PictureLayerImplTest : public testing::Test { |
DISALLOW_COPY_AND_ASSIGN(PictureLayerImplTest); |
}; |
+TEST_F(PictureLayerImplTest, tileGridAlignment) { |
+ host_impl_.setDeviceScaleFactor(1.f); |
+ TestTileGridAlignmentCommon(); |
+} |
+ |
+TEST_F(PictureLayerImplTest, tileGridAlignmentHiDPI) { |
+ host_impl_.setDeviceScaleFactor(2.f); |
+ TestTileGridAlignmentCommon(); |
+} |
+ |
TEST_F(PictureLayerImplTest, cloneNoInvalidation) { |
gfx::Size tile_size(100, 100); |
gfx::Size layer_bounds(400, 400); |