nine_patch_layer_unittest.cc revision 68043e1e95eeb07d5cae7aca370b26518b0867d6
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/nine_patch_layer.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/debug/overdraw_metrics.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/prioritized_resource_manager.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/resource_provider.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/resource_update_queue.h"
1168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "cc/resources/scoped_ui_resource.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/scheduler/texture_uploader.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_layer_tree_host_client.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_output_surface.h"
153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "cc/test/fake_output_surface_client.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/geometry_test_utils.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_host.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/occlusion_tracker.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/single_thread_proxy.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/skia/include/core/SkBitmap.h"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ::testing::Mock;
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ::testing::_;
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ::testing::AtLeast;
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ::testing::AnyNumber;
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc {
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class MockLayerTreeHost : public LayerTreeHost {
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  explicit MockLayerTreeHost(LayerTreeHostClient* client)
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : LayerTreeHost(client, LayerTreeSettings()) {
36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    Initialize(NULL);
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class NinePatchLayerTest : public testing::Test {
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NinePatchLayerTest() : fake_client_(FakeLayerTreeHostClient::DIRECT_3D) {}
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cc::Proxy* Proxy() const { return layer_tree_host_->proxy(); }
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUp() {
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_tree_host_.reset(new MockLayerTreeHost(&fake_client_));
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void TearDown() {
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Mock::VerifyAndClearExpectations(layer_tree_host_.get());
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<MockLayerTreeHost> layer_tree_host_;
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FakeLayerTreeHostClient fake_client_;
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST_F(NinePatchLayerTest, SetBitmap) {
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<NinePatchLayer> test_layer = NinePatchLayer::Create();
61868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ASSERT_TRUE(test_layer.get());
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_layer->SetIsDrawable(true);
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_layer->SetBounds(gfx::Size(100, 100));
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_tree_host_->SetRootLayer(test_layer);
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Mock::VerifyAndClearExpectations(layer_tree_host_.get());
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(test_layer->layer_tree_host(), layer_tree_host_.get());
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  layer_tree_host_->InitializeOutputSurfaceIfNeeded();
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ResourceUpdateQueue queue;
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  OcclusionTracker occlusion_tracker(gfx::Rect(), false);
73a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  test_layer->SavePaintProperties();
74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  test_layer->Update(&queue, &occlusion_tracker);
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_FALSE(test_layer->DrawsContent());
7768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SkBitmap bitmap;
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bitmap.setConfig(SkBitmap::kARGB_8888_Config, 10, 10);
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bitmap.allocPixels();
8168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  bitmap.setImmutable();
8268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
8368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  gfx::Rect aperture(5, 5, 1, 1);
8468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  bool fill_center = false;
8568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  test_layer->SetBitmap(bitmap, aperture);
8668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  test_layer->SetFillCenter(fill_center);
87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  test_layer->Update(&queue, &occlusion_tracker);
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_TRUE(test_layer->DrawsContent());
9068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
9168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
9268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST_F(NinePatchLayerTest, SetUIResourceId) {
9368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  scoped_refptr<NinePatchLayer> test_layer = NinePatchLayer::Create();
9468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ASSERT_TRUE(test_layer.get());
9568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  test_layer->SetIsDrawable(true);
9668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  test_layer->SetBounds(gfx::Size(100, 100));
9768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
9868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  layer_tree_host_->SetRootLayer(test_layer);
9968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  Mock::VerifyAndClearExpectations(layer_tree_host_.get());
10068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(test_layer->layer_tree_host(), layer_tree_host_.get());
10168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
10268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  layer_tree_host_->InitializeOutputSurfaceIfNeeded();
10368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
10468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ResourceUpdateQueue queue;
10568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  OcclusionTracker occlusion_tracker(gfx::Rect(), false);
106a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  test_layer->SavePaintProperties();
107eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  test_layer->Update(&queue, &occlusion_tracker);
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_FALSE(test_layer->DrawsContent());
11068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
11168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  SkBitmap bitmap;
11268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  bitmap.setConfig(SkBitmap::kARGB_8888_Config, 10, 10);
11368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  bitmap.allocPixels();
11468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  bitmap.setImmutable();
11568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
11668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  scoped_ptr<ScopedUIResource> resource = ScopedUIResource::Create(
11768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      layer_tree_host_.get(), UIResourceBitmap(bitmap));
11868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  gfx::Rect aperture(5, 5, 1, 1);
11968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  bool fill_center = true;
12068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  test_layer->SetUIResourceId(resource->id(), aperture);
12168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  test_layer->SetFillCenter(fill_center);
122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  test_layer->Update(&queue, &occlusion_tracker);
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_TRUE(test_layer->DrawsContent());
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace cc
129