14e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 24e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 34e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// found in the LICENSE file. 44e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 54e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "cc/layers/append_quads_data.h" 64e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "cc/layers/ui_resource_layer_impl.h" 74e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "cc/resources/ui_resource_bitmap.h" 84e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "cc/resources/ui_resource_client.h" 94e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "cc/test/fake_impl_proxy.h" 104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "cc/test/fake_layer_tree_host_impl.h" 114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "cc/test/fake_ui_resource_layer_tree_host_impl.h" 124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "cc/test/layer_test_common.h" 134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "cc/test/mock_quad_culler.h" 144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "cc/trees/single_thread_proxy.h" 154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ui/gfx/transform.h" 184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace cc { 204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace { 214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)scoped_ptr<UIResourceLayerImpl> GenerateUIResourceLayer( 234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FakeUIResourceLayerTreeHostImpl* host_impl, 244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) gfx::Size bitmap_size, 254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) gfx::Size layer_size, 261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) bool opaque, 274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) UIResourceId uid) { 284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) gfx::Rect visible_content_rect(layer_size); 294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_ptr<UIResourceLayerImpl> layer = 304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) UIResourceLayerImpl::Create(host_impl->active_tree(), 1); 314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layer->draw_properties().visible_content_rect = visible_content_rect; 324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layer->SetBounds(layer_size); 334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layer->SetContentBounds(layer_size); 344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layer->CreateRenderSurface(); 354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layer->draw_properties().render_target = layer.get(); 364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SkBitmap skbitmap; 38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) skbitmap.setConfig(SkBitmap::kARGB_8888_Config, 39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bitmap_size.width(), 40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bitmap_size.height(), 41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 0, 42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) opaque ? kOpaque_SkAlphaType : kPremul_SkAlphaType); 434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) skbitmap.allocPixels(); 444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) skbitmap.setImmutable(); 454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) UIResourceBitmap bitmap(skbitmap); 464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) host_impl->CreateUIResource(uid, bitmap); 484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layer->SetUIResourceId(uid); 494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return layer.Pass(); 514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void QuadSizeTest(scoped_ptr<UIResourceLayerImpl> layer, 544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) size_t expected_quad_size) { 554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) MockQuadCuller quad_culler; 564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) AppendQuadsData data; 574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layer->AppendQuads(&quad_culler, &data); 584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Verify quad rects 604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const QuadList& quads = quad_culler.quad_list(); 614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(expected_quad_size, quads.size()); 624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST(UIResourceLayerImplTest, VerifyDrawQuads) { 654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FakeImplProxy proxy; 664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FakeUIResourceLayerTreeHostImpl host_impl(&proxy); 674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Make sure we're appending quads when there are valid values. 684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) gfx::Size bitmap_size(100, 100); 694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) gfx::Size layer_size(100, 100);; 704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) size_t expected_quad_size = 1; 711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) bool opaque = true; 724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) UIResourceId uid = 1; 734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_ptr<UIResourceLayerImpl> layer = GenerateUIResourceLayer(&host_impl, 744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bitmap_size, 754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layer_size, 761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) opaque, 774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) uid); 784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) QuadSizeTest(layer.Pass(), expected_quad_size); 794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Make sure we're not appending quads when there are invalid values. 814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) expected_quad_size = 0; 824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) uid = 0; 834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layer = GenerateUIResourceLayer(&host_impl, 844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bitmap_size, 854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layer_size, 861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) opaque, 874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) uid); 884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) QuadSizeTest(layer.Pass(), expected_quad_size); 894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void OpaqueBoundsTest(scoped_ptr<UIResourceLayerImpl> layer, 924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) gfx::Rect expected_opaque_bounds) { 934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) MockQuadCuller quad_culler; 944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) AppendQuadsData data; 954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layer->AppendQuads(&quad_culler, &data); 964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Verify quad rects 984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const QuadList& quads = quad_culler.quad_list(); 994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_GE(quads.size(), (size_t)0); 1004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) gfx::Rect opaque_rect = quads.at(0)->opaque_rect; 1014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(expected_opaque_bounds, opaque_rect); 1024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)TEST(UIResourceLayerImplTest, VerifySetOpaqueOnSkBitmap) { 1054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FakeImplProxy proxy; 1064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FakeUIResourceLayerTreeHostImpl host_impl(&proxy); 1074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) gfx::Size bitmap_size(100, 100); 1094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) gfx::Size layer_size(100, 100);; 1101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) bool opaque = false; 1114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) UIResourceId uid = 1; 1124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_ptr<UIResourceLayerImpl> layer = GenerateUIResourceLayer(&host_impl, 1134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bitmap_size, 1144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layer_size, 1151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) opaque, 1164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) uid); 1174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) gfx::Rect expected_opaque_bounds; 1184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) OpaqueBoundsTest(layer.Pass(), expected_opaque_bounds); 1194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) opaque = true; 1214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layer = GenerateUIResourceLayer(&host_impl, 1224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bitmap_size, 1234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layer_size, 1241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) opaque, 1254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) uid); 1261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) expected_opaque_bounds = gfx::Rect(layer->bounds()); 1271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) OpaqueBoundsTest(layer.Pass(), expected_opaque_bounds); 1281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 1291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)TEST(UIResourceLayerImplTest, VerifySetOpaqueOnLayer) { 1311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) FakeImplProxy proxy; 1321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) FakeUIResourceLayerTreeHostImpl host_impl(&proxy); 1331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) gfx::Size bitmap_size(100, 100); 1351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) gfx::Size layer_size(100, 100); 1361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) bool skbitmap_opaque = false; 1371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) UIResourceId uid = 1; 1381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) scoped_ptr<UIResourceLayerImpl> layer = GenerateUIResourceLayer( 1391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) &host_impl, bitmap_size, layer_size, skbitmap_opaque, uid); 1401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) layer->SetContentsOpaque(false); 1411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) gfx::Rect expected_opaque_bounds; 1421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) OpaqueBoundsTest(layer.Pass(), expected_opaque_bounds); 1434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) layer = GenerateUIResourceLayer( 1451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) &host_impl, bitmap_size, layer_size, skbitmap_opaque, uid); 1464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layer->SetContentsOpaque(true); 1474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) expected_opaque_bounds = gfx::Rect(layer->bounds()); 1484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) OpaqueBoundsTest(layer.Pass(), expected_opaque_bounds); 1494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} // namespace 1524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} // namespace cc 153