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