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