Index: cc/trees/occlusion_tracker_unittest.cc |
diff --git a/cc/trees/occlusion_tracker_unittest.cc b/cc/trees/occlusion_tracker_unittest.cc |
deleted file mode 100644 |
index f3f218570eb52a71f989222dc88afc1ca3c53371..0000000000000000000000000000000000000000 |
--- a/cc/trees/occlusion_tracker_unittest.cc |
+++ /dev/null |
@@ -1,3332 +0,0 @@ |
-// Copyright 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "cc/trees/occlusion_tracker.h" |
- |
-#include "cc/animation/layer_animation_controller.h" |
-#include "cc/base/math_util.h" |
-#include "cc/layers/layer.h" |
-#include "cc/layers/layer_impl.h" |
-#include "cc/output/copy_output_request.h" |
-#include "cc/output/copy_output_result.h" |
-#include "cc/output/filter_operation.h" |
-#include "cc/output/filter_operations.h" |
-#include "cc/test/animation_test_common.h" |
-#include "cc/test/fake_impl_proxy.h" |
-#include "cc/test/fake_layer_tree_host.h" |
-#include "cc/test/fake_layer_tree_host_impl.h" |
-#include "cc/test/geometry_test_utils.h" |
-#include "cc/test/test_occlusion_tracker.h" |
-#include "cc/trees/layer_tree_host_common.h" |
-#include "cc/trees/single_thread_proxy.h" |
-#include "testing/gmock/include/gmock/gmock.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
-#include "ui/gfx/transform.h" |
- |
-namespace cc { |
-namespace { |
- |
-class TestContentLayer : public Layer { |
- public: |
- TestContentLayer() : Layer(), override_opaque_contents_rect_(false) { |
- SetIsDrawable(true); |
- } |
- |
- SimpleEnclosedRegion VisibleContentOpaqueRegion() const override { |
- if (override_opaque_contents_rect_) { |
- return SimpleEnclosedRegion( |
- gfx::IntersectRects(opaque_contents_rect_, visible_content_rect())); |
- } |
- return Layer::VisibleContentOpaqueRegion(); |
- } |
- void SetOpaqueContentsRect(const gfx::Rect& opaque_contents_rect) { |
- override_opaque_contents_rect_ = true; |
- opaque_contents_rect_ = opaque_contents_rect; |
- } |
- |
- private: |
- ~TestContentLayer() override {} |
- |
- bool override_opaque_contents_rect_; |
- gfx::Rect opaque_contents_rect_; |
-}; |
- |
-class TestContentLayerImpl : public LayerImpl { |
- public: |
- TestContentLayerImpl(LayerTreeImpl* tree_impl, int id) |
- : LayerImpl(tree_impl, id), override_opaque_contents_rect_(false) { |
- SetDrawsContent(true); |
- } |
- |
- SimpleEnclosedRegion VisibleContentOpaqueRegion() const override { |
- if (override_opaque_contents_rect_) { |
- return SimpleEnclosedRegion( |
- gfx::IntersectRects(opaque_contents_rect_, visible_content_rect())); |
- } |
- return LayerImpl::VisibleContentOpaqueRegion(); |
- } |
- void SetOpaqueContentsRect(const gfx::Rect& opaque_contents_rect) { |
- override_opaque_contents_rect_ = true; |
- opaque_contents_rect_ = opaque_contents_rect; |
- } |
- |
- private: |
- bool override_opaque_contents_rect_; |
- gfx::Rect opaque_contents_rect_; |
-}; |
- |
-template <typename LayerType> |
-class TestOcclusionTrackerWithClip : public TestOcclusionTracker<LayerType> { |
- public: |
- explicit TestOcclusionTrackerWithClip(const gfx::Rect& viewport_rect) |
- : TestOcclusionTracker<LayerType>(viewport_rect) {} |
- |
- bool OccludedLayer(const LayerType* layer, |
- const gfx::Rect& content_rect) const { |
- DCHECK(layer->visible_content_rect().Contains(content_rect)); |
- return this->GetCurrentOcclusionForLayer(layer->draw_transform()) |
- .IsOccluded(content_rect); |
- } |
- |
- // Gives an unoccluded sub-rect of |content_rect| in the content space of the |
- // layer. Simple wrapper around GetUnoccludedContentRect. |
- gfx::Rect UnoccludedLayerContentRect(const LayerType* layer, |
- const gfx::Rect& content_rect) const { |
- DCHECK(layer->visible_content_rect().Contains(content_rect)); |
- return this->GetCurrentOcclusionForLayer(layer->draw_transform()) |
- .GetUnoccludedContentRect(content_rect); |
- } |
- |
- gfx::Rect UnoccludedSurfaceContentRect(const LayerType* layer, |
- const gfx::Rect& content_rect) const { |
- typename LayerType::RenderSurfaceType* surface = layer->render_surface(); |
- return this->GetCurrentOcclusionForContributingSurface( |
- surface->draw_transform()) |
- .GetUnoccludedContentRect(content_rect); |
- } |
-}; |
- |
-struct OcclusionTrackerTestMainThreadTypes { |
- typedef Layer LayerType; |
- typedef FakeLayerTreeHost HostType; |
- typedef RenderSurface RenderSurfaceType; |
- typedef TestContentLayer ContentLayerType; |
- typedef scoped_refptr<Layer> LayerPtrType; |
- typedef scoped_refptr<ContentLayerType> ContentLayerPtrType; |
- typedef LayerIterator<Layer> TestLayerIterator; |
- typedef OcclusionTracker<Layer> OcclusionTrackerType; |
- |
- static LayerPtrType CreateLayer(HostType* host) { return Layer::Create(); } |
- static ContentLayerPtrType CreateContentLayer(HostType* host) { |
- return make_scoped_refptr(new ContentLayerType()); |
- } |
- |
- template <typename T> |
- static LayerPtrType PassLayerPtr(T* layer) { |
- LayerPtrType ref(*layer); |
- *layer = NULL; |
- return ref; |
- } |
- static void SetForceRenderSurface(LayerType* layer, bool force) { |
- layer->SetForceRenderSurface(force); |
- } |
- |
- static void DestroyLayer(LayerPtrType* layer) { *layer = NULL; } |
- |
- static void RecursiveUpdateNumChildren(LayerType* layerType) {} |
-}; |
- |
-struct OcclusionTrackerTestImplThreadTypes { |
- typedef LayerImpl LayerType; |
- typedef LayerTreeImpl HostType; |
- typedef RenderSurfaceImpl RenderSurfaceType; |
- typedef TestContentLayerImpl ContentLayerType; |
- typedef scoped_ptr<LayerImpl> LayerPtrType; |
- typedef scoped_ptr<ContentLayerType> ContentLayerPtrType; |
- typedef LayerIterator<LayerImpl> TestLayerIterator; |
- typedef OcclusionTracker<LayerImpl> OcclusionTrackerType; |
- |
- static LayerPtrType CreateLayer(HostType* host) { |
- return LayerImpl::Create(host, next_layer_impl_id++); |
- } |
- static ContentLayerPtrType CreateContentLayer(HostType* host) { |
- return make_scoped_ptr(new ContentLayerType(host, next_layer_impl_id++)); |
- } |
- static int next_layer_impl_id; |
- |
- template <typename T> |
- static LayerPtrType PassLayerPtr(T* layer) { |
- return layer->Pass(); |
- } |
- |
- static void SetForceRenderSurface(LayerType* layer, bool force) { |
- layer->SetHasRenderSurface(force); |
- } |
- static void DestroyLayer(LayerPtrType* layer) { layer->reset(); } |
- |
- static void RecursiveUpdateNumChildren(LayerType* layer) { |
- FakeLayerTreeHostImpl::RecursiveUpdateNumChildren(layer); |
- } |
-}; |
- |
-int OcclusionTrackerTestImplThreadTypes::next_layer_impl_id = 1; |
- |
-template <typename Types> class OcclusionTrackerTest : public testing::Test { |
- protected: |
- explicit OcclusionTrackerTest(bool opaque_layers) |
- : opaque_layers_(opaque_layers), |
- client_(FakeLayerTreeHostClient::DIRECT_3D), |
- host_(FakeLayerTreeHost::Create(&client_)) {} |
- |
- virtual void RunMyTest() = 0; |
- |
- void TearDown() override { DestroyLayers(); } |
- |
- typename Types::HostType* GetHost(); |
- |
- typename Types::ContentLayerType* CreateRoot(const gfx::Transform& transform, |
- const gfx::PointF& position, |
- const gfx::Size& bounds) { |
- typename Types::ContentLayerPtrType layer( |
- Types::CreateContentLayer(GetHost())); |
- typename Types::ContentLayerType* layer_ptr = layer.get(); |
- SetProperties(layer_ptr, transform, position, bounds); |
- |
- DCHECK(!root_.get()); |
- root_ = Types::PassLayerPtr(&layer); |
- |
- Types::SetForceRenderSurface(layer_ptr, true); |
- SetRootLayerOnMainThread(layer_ptr); |
- |
- return layer_ptr; |
- } |
- |
- typename Types::LayerType* CreateLayer(typename Types::LayerType* parent, |
- const gfx::Transform& transform, |
- const gfx::PointF& position, |
- const gfx::Size& bounds) { |
- typename Types::LayerPtrType layer(Types::CreateLayer(GetHost())); |
- typename Types::LayerType* layer_ptr = layer.get(); |
- SetProperties(layer_ptr, transform, position, bounds); |
- parent->AddChild(Types::PassLayerPtr(&layer)); |
- return layer_ptr; |
- } |
- |
- typename Types::LayerType* CreateSurface(typename Types::LayerType* parent, |
- const gfx::Transform& transform, |
- const gfx::PointF& position, |
- const gfx::Size& bounds) { |
- typename Types::LayerType* layer = |
- CreateLayer(parent, transform, position, bounds); |
- Types::SetForceRenderSurface(layer, true); |
- return layer; |
- } |
- |
- typename Types::ContentLayerType* CreateDrawingLayer( |
- typename Types::LayerType* parent, |
- const gfx::Transform& transform, |
- const gfx::PointF& position, |
- const gfx::Size& bounds, |
- bool opaque) { |
- typename Types::ContentLayerPtrType layer( |
- Types::CreateContentLayer(GetHost())); |
- typename Types::ContentLayerType* layer_ptr = layer.get(); |
- SetProperties(layer_ptr, transform, position, bounds); |
- |
- if (opaque_layers_) { |
- layer_ptr->SetContentsOpaque(opaque); |
- } else { |
- layer_ptr->SetContentsOpaque(false); |
- if (opaque) |
- layer_ptr->SetOpaqueContentsRect(gfx::Rect(bounds)); |
- else |
- layer_ptr->SetOpaqueContentsRect(gfx::Rect()); |
- } |
- |
- parent->AddChild(Types::PassLayerPtr(&layer)); |
- return layer_ptr; |
- } |
- |
- typename Types::LayerType* CreateReplicaLayer( |
- typename Types::LayerType* owning_layer, |
- const gfx::Transform& transform, |
- const gfx::PointF& position, |
- const gfx::Size& bounds) { |
- typename Types::ContentLayerPtrType layer( |
- Types::CreateContentLayer(GetHost())); |
- typename Types::ContentLayerType* layer_ptr = layer.get(); |
- SetProperties(layer_ptr, transform, position, bounds); |
- SetReplica(owning_layer, Types::PassLayerPtr(&layer)); |
- return layer_ptr; |
- } |
- |
- typename Types::LayerType* CreateMaskLayer( |
- typename Types::LayerType* owning_layer, |
- const gfx::Size& bounds) { |
- typename Types::ContentLayerPtrType layer( |
- Types::CreateContentLayer(GetHost())); |
- typename Types::ContentLayerType* layer_ptr = layer.get(); |
- SetProperties(layer_ptr, identity_matrix, gfx::PointF(), bounds); |
- SetMask(owning_layer, Types::PassLayerPtr(&layer)); |
- return layer_ptr; |
- } |
- |
- typename Types::ContentLayerType* CreateDrawingSurface( |
- typename Types::LayerType* parent, |
- const gfx::Transform& transform, |
- const gfx::PointF& position, |
- const gfx::Size& bounds, |
- bool opaque) { |
- typename Types::ContentLayerType* layer = |
- CreateDrawingLayer(parent, transform, position, bounds, opaque); |
- Types::SetForceRenderSurface(layer, true); |
- return layer; |
- } |
- |
- void DestroyLayers() { |
- Types::DestroyLayer(&root_); |
- render_surface_layer_list_ = nullptr; |
- render_surface_layer_list_impl_.clear(); |
- replica_layers_.clear(); |
- mask_layers_.clear(); |
- ResetLayerIterator(); |
- } |
- |
- void CopyOutputCallback(scoped_ptr<CopyOutputResult> result) {} |
- |
- void AddCopyRequest(Layer* layer) { |
- layer->RequestCopyOfOutput( |
- CopyOutputRequest::CreateBitmapRequest(base::Bind( |
- &OcclusionTrackerTest<Types>::CopyOutputCallback, |
- base::Unretained(this)))); |
- } |
- |
- void AddCopyRequest(LayerImpl* layer) { |
- ScopedPtrVector<CopyOutputRequest> requests; |
- requests.push_back( |
- CopyOutputRequest::CreateBitmapRequest(base::Bind( |
- &OcclusionTrackerTest<Types>::CopyOutputCallback, |
- base::Unretained(this)))); |
- layer->SetHasRenderSurface(true); |
- layer->PassCopyRequests(&requests); |
- } |
- |
- void CalcDrawEtc(TestContentLayerImpl* root) { |
- DCHECK(root == root_.get()); |
- |
- Types::RecursiveUpdateNumChildren(root); |
- LayerTreeHostCommon::CalcDrawPropsImplInputsForTesting inputs( |
- root, root->bounds(), &render_surface_layer_list_impl_); |
- inputs.can_adjust_raster_scales = true; |
- LayerTreeHostCommon::CalculateDrawProperties(&inputs); |
- |
- layer_iterator_ = layer_iterator_begin_ = |
- Types::TestLayerIterator::Begin(&render_surface_layer_list_impl_); |
- } |
- |
- void CalcDrawEtc(TestContentLayer* root) { |
- DCHECK(root == root_.get()); |
- DCHECK(!root->render_surface()); |
- |
- render_surface_layer_list_.reset(new RenderSurfaceLayerList); |
- LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs( |
- root, root->bounds(), render_surface_layer_list_.get()); |
- inputs.can_adjust_raster_scales = true; |
- LayerTreeHostCommon::CalculateDrawProperties(&inputs); |
- |
- layer_iterator_ = layer_iterator_begin_ = |
- Types::TestLayerIterator::Begin(render_surface_layer_list_.get()); |
- } |
- |
- void EnterLayer(typename Types::LayerType* layer, |
- typename Types::OcclusionTrackerType* occlusion) { |
- ASSERT_EQ(*layer_iterator_, layer); |
- ASSERT_TRUE(layer_iterator_.represents_itself()); |
- occlusion->EnterLayer(layer_iterator_); |
- } |
- |
- void LeaveLayer(typename Types::LayerType* layer, |
- typename Types::OcclusionTrackerType* occlusion) { |
- ASSERT_EQ(*layer_iterator_, layer); |
- ASSERT_TRUE(layer_iterator_.represents_itself()); |
- occlusion->LeaveLayer(layer_iterator_); |
- ++layer_iterator_; |
- } |
- |
- void VisitLayer(typename Types::LayerType* layer, |
- typename Types::OcclusionTrackerType* occlusion) { |
- EnterLayer(layer, occlusion); |
- LeaveLayer(layer, occlusion); |
- } |
- |
- void EnterContributingSurface( |
- typename Types::LayerType* layer, |
- typename Types::OcclusionTrackerType* occlusion) { |
- ASSERT_EQ(*layer_iterator_, layer); |
- ASSERT_TRUE(layer_iterator_.represents_target_render_surface()); |
- occlusion->EnterLayer(layer_iterator_); |
- occlusion->LeaveLayer(layer_iterator_); |
- ++layer_iterator_; |
- ASSERT_TRUE(layer_iterator_.represents_contributing_render_surface()); |
- occlusion->EnterLayer(layer_iterator_); |
- } |
- |
- void LeaveContributingSurface( |
- typename Types::LayerType* layer, |
- typename Types::OcclusionTrackerType* occlusion) { |
- ASSERT_EQ(*layer_iterator_, layer); |
- ASSERT_TRUE(layer_iterator_.represents_contributing_render_surface()); |
- occlusion->LeaveLayer(layer_iterator_); |
- ++layer_iterator_; |
- } |
- |
- void VisitContributingSurface( |
- typename Types::LayerType* layer, |
- typename Types::OcclusionTrackerType* occlusion) { |
- EnterContributingSurface(layer, occlusion); |
- LeaveContributingSurface(layer, occlusion); |
- } |
- |
- void ResetLayerIterator() { layer_iterator_ = layer_iterator_begin_; } |
- |
- const gfx::Transform identity_matrix; |
- |
- private: |
- void SetRootLayerOnMainThread(Layer* root) { |
- host_->SetRootLayer(scoped_refptr<Layer>(root)); |
- } |
- |
- void SetRootLayerOnMainThread(LayerImpl* root) {} |
- |
- void SetBaseProperties(typename Types::LayerType* layer, |
- const gfx::Transform& transform, |
- const gfx::PointF& position, |
- const gfx::Size& bounds) { |
- layer->SetTransform(transform); |
- layer->SetPosition(position); |
- layer->SetBounds(bounds); |
- } |
- |
- void SetProperties(Layer* layer, |
- const gfx::Transform& transform, |
- const gfx::PointF& position, |
- const gfx::Size& bounds) { |
- SetBaseProperties(layer, transform, position, bounds); |
- } |
- |
- void SetProperties(LayerImpl* layer, |
- const gfx::Transform& transform, |
- const gfx::PointF& position, |
- const gfx::Size& bounds) { |
- SetBaseProperties(layer, transform, position, bounds); |
- |
- layer->SetContentBounds(layer->bounds()); |
- } |
- |
- void SetReplica(Layer* owning_layer, scoped_refptr<Layer> layer) { |
- owning_layer->SetReplicaLayer(layer.get()); |
- replica_layers_.push_back(layer); |
- } |
- |
- void SetReplica(LayerImpl* owning_layer, scoped_ptr<LayerImpl> layer) { |
- owning_layer->SetReplicaLayer(layer.Pass()); |
- } |
- |
- void SetMask(Layer* owning_layer, scoped_refptr<Layer> layer) { |
- owning_layer->SetMaskLayer(layer.get()); |
- mask_layers_.push_back(layer); |
- } |
- |
- void SetMask(LayerImpl* owning_layer, scoped_ptr<LayerImpl> layer) { |
- owning_layer->SetMaskLayer(layer.Pass()); |
- } |
- |
- bool opaque_layers_; |
- FakeLayerTreeHostClient client_; |
- scoped_ptr<FakeLayerTreeHost> host_; |
- // These hold ownership of the layers for the duration of the test. |
- typename Types::LayerPtrType root_; |
- scoped_ptr<RenderSurfaceLayerList> render_surface_layer_list_; |
- LayerImplList render_surface_layer_list_impl_; |
- typename Types::TestLayerIterator layer_iterator_begin_; |
- typename Types::TestLayerIterator layer_iterator_; |
- typename Types::LayerType* last_layer_visited_; |
- LayerList replica_layers_; |
- LayerList mask_layers_; |
-}; |
- |
-template <> |
-FakeLayerTreeHost* |
-OcclusionTrackerTest<OcclusionTrackerTestMainThreadTypes>::GetHost() { |
- return host_.get(); |
-} |
- |
-template <> |
-LayerTreeImpl* |
-OcclusionTrackerTest<OcclusionTrackerTestImplThreadTypes>::GetHost() { |
- return host_->host_impl()->active_tree(); |
-} |
- |
-#define RUN_TEST_MAIN_THREAD_OPAQUE_LAYERS(ClassName) \ |
- class ClassName##MainThreadOpaqueLayers \ |
- : public ClassName<OcclusionTrackerTestMainThreadTypes> { \ |
- public: /* NOLINT(whitespace/indent) */ \ |
- ClassName##MainThreadOpaqueLayers() \ |
- : ClassName<OcclusionTrackerTestMainThreadTypes>(true) {} \ |
- }; \ |
- TEST_F(ClassName##MainThreadOpaqueLayers, RunTest) { RunMyTest(); } |
-#define RUN_TEST_MAIN_THREAD_OPAQUE_PAINTS(ClassName) \ |
- class ClassName##MainThreadOpaquePaints \ |
- : public ClassName<OcclusionTrackerTestMainThreadTypes> { \ |
- public: /* NOLINT(whitespace/indent) */ \ |
- ClassName##MainThreadOpaquePaints() \ |
- : ClassName<OcclusionTrackerTestMainThreadTypes>(false) {} \ |
- }; \ |
- TEST_F(ClassName##MainThreadOpaquePaints, RunTest) { RunMyTest(); } |
- |
-#define RUN_TEST_IMPL_THREAD_OPAQUE_LAYERS(ClassName) \ |
- class ClassName##ImplThreadOpaqueLayers \ |
- : public ClassName<OcclusionTrackerTestImplThreadTypes> { \ |
- public: /* NOLINT(whitespace/indent) */ \ |
- ClassName##ImplThreadOpaqueLayers() \ |
- : ClassName<OcclusionTrackerTestImplThreadTypes>(true) {} \ |
- }; \ |
- TEST_F(ClassName##ImplThreadOpaqueLayers, RunTest) { RunMyTest(); } |
-#define RUN_TEST_IMPL_THREAD_OPAQUE_PAINTS(ClassName) \ |
- class ClassName##ImplThreadOpaquePaints \ |
- : public ClassName<OcclusionTrackerTestImplThreadTypes> { \ |
- public: /* NOLINT(whitespace/indent) */ \ |
- ClassName##ImplThreadOpaquePaints() \ |
- : ClassName<OcclusionTrackerTestImplThreadTypes>(false) {} \ |
- }; \ |
- TEST_F(ClassName##ImplThreadOpaquePaints, RunTest) { RunMyTest(); } |
- |
-#define ALL_OCCLUSIONTRACKER_TEST(ClassName) \ |
- RUN_TEST_MAIN_THREAD_OPAQUE_LAYERS(ClassName) \ |
- RUN_TEST_MAIN_THREAD_OPAQUE_PAINTS(ClassName) \ |
- RUN_TEST_IMPL_THREAD_OPAQUE_LAYERS(ClassName) \ |
- RUN_TEST_IMPL_THREAD_OPAQUE_PAINTS(ClassName) |
- |
-#define MAIN_THREAD_TEST(ClassName) \ |
- RUN_TEST_MAIN_THREAD_OPAQUE_LAYERS(ClassName) |
- |
-#define IMPL_THREAD_TEST(ClassName) \ |
- RUN_TEST_IMPL_THREAD_OPAQUE_LAYERS(ClassName) |
- |
-#define MAIN_AND_IMPL_THREAD_TEST(ClassName) \ |
- RUN_TEST_MAIN_THREAD_OPAQUE_LAYERS(ClassName) \ |
- RUN_TEST_IMPL_THREAD_OPAQUE_LAYERS(ClassName) |
- |
-template <class Types> |
-class OcclusionTrackerTestIdentityTransforms |
- : public OcclusionTrackerTest<Types> { |
- protected: |
- explicit OcclusionTrackerTestIdentityTransforms(bool opaque_layers) |
- : OcclusionTrackerTest<Types>(opaque_layers) {} |
- |
- void RunMyTest() override { |
- typename Types::ContentLayerType* root = this->CreateRoot( |
- this->identity_matrix, gfx::PointF(), gfx::Size(200, 200)); |
- typename Types::ContentLayerType* parent = this->CreateDrawingLayer( |
- root, this->identity_matrix, gfx::PointF(), gfx::Size(100, 100), true); |
- typename Types::ContentLayerType* layer = |
- this->CreateDrawingLayer(parent, |
- this->identity_matrix, |
- gfx::PointF(30.f, 30.f), |
- gfx::Size(500, 500), |
- true); |
- parent->SetMasksToBounds(true); |
- this->CalcDrawEtc(root); |
- |
- TestOcclusionTrackerWithClip<typename Types::LayerType> occlusion( |
- gfx::Rect(0, 0, 1000, 1000)); |
- |
- this->VisitLayer(layer, &occlusion); |
- this->EnterLayer(parent, &occlusion); |
- |
- EXPECT_EQ(gfx::Rect().ToString(), |
- occlusion.occlusion_from_outside_target().ToString()); |
- EXPECT_EQ(gfx::Rect(30, 30, 70, 70).ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- } |
-}; |
- |
-ALL_OCCLUSIONTRACKER_TEST(OcclusionTrackerTestIdentityTransforms); |
- |
-template <class Types> |
-class OcclusionTrackerTestRotatedChild : public OcclusionTrackerTest<Types> { |
- protected: |
- explicit OcclusionTrackerTestRotatedChild(bool opaque_layers) |
- : OcclusionTrackerTest<Types>(opaque_layers) {} |
- void RunMyTest() override { |
- gfx::Transform layer_transform; |
- layer_transform.Translate(250.0, 250.0); |
- layer_transform.Rotate(90.0); |
- layer_transform.Translate(-250.0, -250.0); |
- |
- typename Types::ContentLayerType* root = this->CreateRoot( |
- this->identity_matrix, gfx::Point(0, 0), gfx::Size(200, 200)); |
- typename Types::ContentLayerType* parent = this->CreateDrawingLayer( |
- root, this->identity_matrix, gfx::PointF(), gfx::Size(100, 100), true); |
- typename Types::ContentLayerType* layer = |
- this->CreateDrawingLayer(parent, |
- layer_transform, |
- gfx::PointF(30.f, 30.f), |
- gfx::Size(500, 500), |
- true); |
- parent->SetMasksToBounds(true); |
- this->CalcDrawEtc(root); |
- |
- TestOcclusionTrackerWithClip<typename Types::LayerType> occlusion( |
- gfx::Rect(0, 0, 1000, 1000)); |
- |
- this->VisitLayer(layer, &occlusion); |
- this->EnterLayer(parent, &occlusion); |
- |
- EXPECT_EQ(gfx::Rect().ToString(), |
- occlusion.occlusion_from_outside_target().ToString()); |
- EXPECT_EQ(gfx::Rect(30, 30, 70, 70).ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- } |
-}; |
- |
-ALL_OCCLUSIONTRACKER_TEST(OcclusionTrackerTestRotatedChild); |
- |
-template <class Types> |
-class OcclusionTrackerTestTranslatedChild : public OcclusionTrackerTest<Types> { |
- protected: |
- explicit OcclusionTrackerTestTranslatedChild(bool opaque_layers) |
- : OcclusionTrackerTest<Types>(opaque_layers) {} |
- void RunMyTest() override { |
- gfx::Transform layer_transform; |
- layer_transform.Translate(20.0, 20.0); |
- |
- typename Types::ContentLayerType* root = this->CreateRoot( |
- this->identity_matrix, gfx::PointF(), gfx::Size(200, 200)); |
- typename Types::ContentLayerType* parent = this->CreateDrawingLayer( |
- root, this->identity_matrix, gfx::PointF(), gfx::Size(100, 100), true); |
- typename Types::ContentLayerType* layer = |
- this->CreateDrawingLayer(parent, |
- layer_transform, |
- gfx::PointF(30.f, 30.f), |
- gfx::Size(500, 500), |
- true); |
- parent->SetMasksToBounds(true); |
- this->CalcDrawEtc(root); |
- |
- TestOcclusionTrackerWithClip<typename Types::LayerType> occlusion( |
- gfx::Rect(0, 0, 1000, 1000)); |
- |
- this->VisitLayer(layer, &occlusion); |
- this->EnterLayer(parent, &occlusion); |
- |
- EXPECT_EQ(gfx::Rect().ToString(), |
- occlusion.occlusion_from_outside_target().ToString()); |
- EXPECT_EQ(gfx::Rect(50, 50, 50, 50).ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- } |
-}; |
- |
-ALL_OCCLUSIONTRACKER_TEST(OcclusionTrackerTestTranslatedChild); |
- |
-template <class Types> |
-class OcclusionTrackerTestChildInRotatedChild |
- : public OcclusionTrackerTest<Types> { |
- protected: |
- explicit OcclusionTrackerTestChildInRotatedChild(bool opaque_layers) |
- : OcclusionTrackerTest<Types>(opaque_layers) {} |
- void RunMyTest() override { |
- gfx::Transform child_transform; |
- child_transform.Translate(250.0, 250.0); |
- child_transform.Rotate(90.0); |
- child_transform.Translate(-250.0, -250.0); |
- |
- typename Types::ContentLayerType* parent = this->CreateRoot( |
- this->identity_matrix, gfx::PointF(), gfx::Size(100, 100)); |
- parent->SetMasksToBounds(true); |
- typename Types::LayerType* child = this->CreateSurface( |
- parent, child_transform, gfx::PointF(30.f, 30.f), gfx::Size(500, 500)); |
- child->SetMasksToBounds(true); |
- typename Types::ContentLayerType* layer = |
- this->CreateDrawingLayer(child, |
- this->identity_matrix, |
- gfx::PointF(10.f, 10.f), |
- gfx::Size(500, 500), |
- true); |
- this->CalcDrawEtc(parent); |
- |
- TestOcclusionTrackerWithClip<typename Types::LayerType> occlusion( |
- gfx::Rect(0, 0, 1000, 1000)); |
- |
- this->VisitLayer(layer, &occlusion); |
- this->EnterContributingSurface(child, &occlusion); |
- |
- EXPECT_EQ(gfx::Rect().ToString(), |
- occlusion.occlusion_from_outside_target().ToString()); |
- EXPECT_EQ(gfx::Rect(10, 430, 60, 70).ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- |
- this->LeaveContributingSurface(child, &occlusion); |
- this->EnterLayer(parent, &occlusion); |
- |
- EXPECT_EQ(gfx::Rect().ToString(), |
- occlusion.occlusion_from_outside_target().ToString()); |
- EXPECT_EQ(gfx::Rect(30, 40, 70, 60).ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- |
- /* Justification for the above occlusion from |layer|: |
- 100 |
- +---------------------+ |
- | | |
- | 30 | rotate(90) |
- | 30 + ---------------------------------+ |
- 100 | | 10 | | ==> |
- | |10+---------------------------------+ |
- | | | | | | |
- | | | | | | |
- | | | | | | |
- +----|--|-------------+ | | |
- | | | | |
- | | | | |
- | | | |500 |
- | | | | |
- | | | | |
- | | | | |
- | | | | |
- +--|-------------------------------+ | |
- | | |
- +---------------------------------+ |
- 500 |
- |
- +---------------------+ |
- | |30 Visible region of |layer|: ///// |
- | | |
- | +---------------------------------+ |
- 100| | |10 | |
- | +---------------------------------+ | |
- | | |///////////////| 420 | | |
- | | |///////////////|60 | | |
- | | |///////////////| | | |
- +--|--|---------------+ | | |
- 20|10| 70 | | |
- | | | | |
- | | | | |
- | | | | |
- | | | | |
- | | | | |
- | | |10| |
- | +------------------------------|--+ |
- | 490 | |
- +---------------------------------+ |
- 500 |
- |
- */ |
- } |
-}; |
- |
-ALL_OCCLUSIONTRACKER_TEST(OcclusionTrackerTestChildInRotatedChild); |
- |
-template <class Types> |
-class OcclusionTrackerTestScaledRenderSurface |
- : public OcclusionTrackerTest<Types> { |
- protected: |
- explicit OcclusionTrackerTestScaledRenderSurface(bool opaque_layers) |
- : OcclusionTrackerTest<Types>(opaque_layers) {} |
- |
- void RunMyTest() override { |
- typename Types::ContentLayerType* parent = this->CreateRoot( |
- this->identity_matrix, gfx::PointF(), gfx::Size(200, 200)); |
- |
- gfx::Transform layer1_matrix; |
- layer1_matrix.Scale(2.0, 2.0); |
- typename Types::ContentLayerType* layer1 = this->CreateDrawingLayer( |
- parent, layer1_matrix, gfx::PointF(), gfx::Size(100, 100), true); |
- Types::SetForceRenderSurface(layer1, true); |
- |
- gfx::Transform layer2_matrix; |
- layer2_matrix.Translate(25.0, 25.0); |
- typename Types::ContentLayerType* layer2 = this->CreateDrawingLayer( |
- layer1, layer2_matrix, gfx::PointF(), gfx::Size(50, 50), true); |
- typename Types::ContentLayerType* occluder = |
- this->CreateDrawingLayer(parent, |
- this->identity_matrix, |
- gfx::PointF(100.f, 100.f), |
- gfx::Size(500, 500), |
- true); |
- this->CalcDrawEtc(parent); |
- |
- TestOcclusionTrackerWithClip<typename Types::LayerType> occlusion( |
- gfx::Rect(0, 0, 1000, 1000)); |
- |
- this->VisitLayer(occluder, &occlusion); |
- this->EnterLayer(layer2, &occlusion); |
- |
- EXPECT_EQ(gfx::Rect(100, 100, 100, 100).ToString(), |
- occlusion.occlusion_from_outside_target().ToString()); |
- EXPECT_EQ(gfx::Rect().ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- } |
-}; |
- |
-ALL_OCCLUSIONTRACKER_TEST(OcclusionTrackerTestScaledRenderSurface); |
- |
-template <class Types> |
-class OcclusionTrackerTestVisitTargetTwoTimes |
- : public OcclusionTrackerTest<Types> { |
- protected: |
- explicit OcclusionTrackerTestVisitTargetTwoTimes(bool opaque_layers) |
- : OcclusionTrackerTest<Types>(opaque_layers) {} |
- void RunMyTest() override { |
- typename Types::ContentLayerType* root = this->CreateRoot( |
- this->identity_matrix, gfx::PointF(), gfx::Size(200, 200)); |
- typename Types::LayerType* surface = this->CreateSurface( |
- root, this->identity_matrix, gfx::PointF(30.f, 30.f), gfx::Size()); |
- typename Types::ContentLayerType* surface_child = |
- this->CreateDrawingLayer(surface, |
- this->identity_matrix, |
- gfx::PointF(10.f, 10.f), |
- gfx::Size(50, 50), |
- true); |
- // |top_layer| makes |root|'s surface get considered by OcclusionTracker |
- // first, instead of |surface|'s. This exercises different code in |
- // LeaveToRenderTarget, as the target surface has already been seen when |
- // leaving |surface| later. |
- typename Types::ContentLayerType* top_layer = |
- this->CreateDrawingLayer(root, |
- this->identity_matrix, |
- gfx::PointF(40.f, 90.f), |
- gfx::Size(50, 20), |
- true); |
- this->CalcDrawEtc(root); |
- |
- TestOcclusionTrackerWithClip<typename Types::LayerType> occlusion( |
- gfx::Rect(0, 0, 1000, 1000)); |
- |
- this->VisitLayer(top_layer, &occlusion); |
- |
- EXPECT_EQ(gfx::Rect().ToString(), |
- occlusion.occlusion_from_outside_target().ToString()); |
- EXPECT_EQ(gfx::Rect(40, 90, 50, 20).ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- |
- this->VisitLayer(surface_child, &occlusion); |
- |
- EXPECT_EQ(gfx::Rect(10, 60, 50, 20).ToString(), |
- occlusion.occlusion_from_outside_target().ToString()); |
- EXPECT_EQ(gfx::Rect(10, 10, 50, 50).ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- |
- this->EnterContributingSurface(surface, &occlusion); |
- |
- EXPECT_EQ(gfx::Rect(10, 60, 50, 20).ToString(), |
- occlusion.occlusion_from_outside_target().ToString()); |
- EXPECT_EQ(gfx::Rect(10, 10, 50, 50).ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- |
- // Occlusion from |top_layer| already in the root target should get merged |
- // with the occlusion from the |surface| we are leaving now. |
- this->LeaveContributingSurface(surface, &occlusion); |
- this->EnterLayer(root, &occlusion); |
- |
- EXPECT_TRUE(occlusion.occlusion_from_outside_target().IsEmpty()); |
- EXPECT_EQ(gfx::Rect(40, 40, 50, 70).ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- } |
-}; |
- |
-ALL_OCCLUSIONTRACKER_TEST(OcclusionTrackerTestVisitTargetTwoTimes); |
- |
-template <class Types> |
-class OcclusionTrackerTestSurfaceRotatedOffAxis |
- : public OcclusionTrackerTest<Types> { |
- protected: |
- explicit OcclusionTrackerTestSurfaceRotatedOffAxis(bool opaque_layers) |
- : OcclusionTrackerTest<Types>(opaque_layers) {} |
- void RunMyTest() override { |
- gfx::Transform child_transform; |
- child_transform.Translate(250.0, 250.0); |
- child_transform.Rotate(95.0); |
- child_transform.Translate(-250.0, -250.0); |
- |
- gfx::Transform layer_transform; |
- layer_transform.Translate(10.0, 10.0); |
- |
- typename Types::ContentLayerType* root = this->CreateRoot( |
- this->identity_matrix, gfx::PointF(), gfx::Size(1000, 1000)); |
- typename Types::ContentLayerType* parent = this->CreateDrawingLayer( |
- root, this->identity_matrix, gfx::PointF(), gfx::Size(100, 100), true); |
- typename Types::LayerType* child = this->CreateSurface( |
- parent, child_transform, gfx::PointF(30.f, 30.f), gfx::Size(500, 500)); |
- typename Types::ContentLayerType* layer = this->CreateDrawingLayer( |
- child, layer_transform, gfx::PointF(), gfx::Size(500, 500), true); |
- this->CalcDrawEtc(root); |
- |
- TestOcclusionTrackerWithClip<typename Types::LayerType> occlusion( |
- gfx::Rect(0, 0, 1000, 1000)); |
- |
- gfx::Rect clipped_layer_in_child = MathUtil::MapEnclosingClippedRect( |
- layer_transform, layer->visible_content_rect()); |
- |
- this->VisitLayer(layer, &occlusion); |
- this->EnterContributingSurface(child, &occlusion); |
- |
- EXPECT_EQ(gfx::Rect().ToString(), |
- occlusion.occlusion_from_outside_target().ToString()); |
- EXPECT_EQ(clipped_layer_in_child.ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- |
- this->LeaveContributingSurface(child, &occlusion); |
- this->EnterLayer(parent, &occlusion); |
- |
- EXPECT_EQ(gfx::Rect().ToString(), |
- occlusion.occlusion_from_outside_target().ToString()); |
- EXPECT_EQ(gfx::Rect().ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- } |
-}; |
- |
-ALL_OCCLUSIONTRACKER_TEST(OcclusionTrackerTestSurfaceRotatedOffAxis); |
- |
-template <class Types> |
-class OcclusionTrackerTestSurfaceWithTwoOpaqueChildren |
- : public OcclusionTrackerTest<Types> { |
- protected: |
- explicit OcclusionTrackerTestSurfaceWithTwoOpaqueChildren(bool opaque_layers) |
- : OcclusionTrackerTest<Types>(opaque_layers) {} |
- void RunMyTest() override { |
- gfx::Transform child_transform; |
- child_transform.Translate(250.0, 250.0); |
- child_transform.Rotate(90.0); |
- child_transform.Translate(-250.0, -250.0); |
- |
- typename Types::ContentLayerType* root = this->CreateRoot( |
- this->identity_matrix, gfx::PointF(), gfx::Size(1000, 1000)); |
- typename Types::ContentLayerType* parent = this->CreateDrawingLayer( |
- root, this->identity_matrix, gfx::PointF(), gfx::Size(100, 100), true); |
- parent->SetMasksToBounds(true); |
- typename Types::ContentLayerType* child = |
- this->CreateDrawingSurface(parent, |
- child_transform, |
- gfx::PointF(30.f, 30.f), |
- gfx::Size(500, 500), |
- false); |
- child->SetMasksToBounds(true); |
- typename Types::ContentLayerType* layer1 = |
- this->CreateDrawingLayer(child, |
- this->identity_matrix, |
- gfx::PointF(10.f, 10.f), |
- gfx::Size(500, 500), |
- true); |
- typename Types::ContentLayerType* layer2 = |
- this->CreateDrawingLayer(child, |
- this->identity_matrix, |
- gfx::PointF(10.f, 450.f), |
- gfx::Size(500, 60), |
- true); |
- this->CalcDrawEtc(root); |
- |
- TestOcclusionTrackerWithClip<typename Types::LayerType> occlusion( |
- gfx::Rect(0, 0, 1000, 1000)); |
- |
- this->VisitLayer(layer2, &occlusion); |
- this->VisitLayer(layer1, &occlusion); |
- this->VisitLayer(child, &occlusion); |
- this->EnterContributingSurface(child, &occlusion); |
- |
- EXPECT_EQ(gfx::Rect().ToString(), |
- occlusion.occlusion_from_outside_target().ToString()); |
- EXPECT_EQ(gfx::Rect(10, 430, 60, 70).ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- |
- this->LeaveContributingSurface(child, &occlusion); |
- this->EnterLayer(parent, &occlusion); |
- |
- EXPECT_EQ(gfx::Rect().ToString(), |
- occlusion.occlusion_from_outside_target().ToString()); |
- EXPECT_EQ(gfx::Rect(30, 40, 70, 60).ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- |
- /* Justification for the above occlusion from |layer1| and |layer2|: |
- |
- +---------------------+ |
- | |30 Visible region of |layer1|: ///// |
- | | Visible region of |layer2|: \\\\\ |
- | +---------------------------------+ |
- | | |10 | |
- | +---------------+-----------------+ | |
- | | |\\\\\\\\\\\\|//| 420 | | |
- | | |\\\\\\\\\\\\|//|60 | | |
- | | |\\\\\\\\\\\\|//| | | |
- +--|--|------------|--+ | | |
- 20|10| 70 | | | |
- | | | | | |
- | | | | | |
- | | | | | |
- | | | | | |
- | | | | | |
- | | | |10| |
- | +------------|-----------------|--+ |
- | | 490 | |
- +---------------+-----------------+ |
- 60 440 |
- */ |
- } |
-}; |
- |
-ALL_OCCLUSIONTRACKER_TEST(OcclusionTrackerTestSurfaceWithTwoOpaqueChildren); |
- |
-template <class Types> |
-class OcclusionTrackerTestOverlappingSurfaceSiblings |
- : public OcclusionTrackerTest<Types> { |
- protected: |
- explicit OcclusionTrackerTestOverlappingSurfaceSiblings(bool opaque_layers) |
- : OcclusionTrackerTest<Types>(opaque_layers) {} |
- void RunMyTest() override { |
- typename Types::ContentLayerType* parent = this->CreateRoot( |
- this->identity_matrix, gfx::PointF(), gfx::Size(100, 100)); |
- parent->SetMasksToBounds(true); |
- typename Types::LayerType* child1 = this->CreateSurface( |
- parent, this->identity_matrix, gfx::PointF(10.f, 0.f), gfx::Size()); |
- typename Types::LayerType* child2 = this->CreateSurface( |
- parent, this->identity_matrix, gfx::PointF(30.f, 0.f), gfx::Size()); |
- typename Types::ContentLayerType* layer1 = this->CreateDrawingLayer( |
- child1, this->identity_matrix, gfx::PointF(), gfx::Size(40, 50), true); |
- typename Types::ContentLayerType* layer2 = |
- this->CreateDrawingLayer(child2, |
- this->identity_matrix, |
- gfx::PointF(10.f, 0.f), |
- gfx::Size(40, 50), |
- true); |
- this->CalcDrawEtc(parent); |
- |
- TestOcclusionTrackerWithClip<typename Types::LayerType> occlusion( |
- gfx::Rect(0, 0, 1000, 1000)); |
- |
- this->VisitLayer(layer2, &occlusion); |
- this->EnterContributingSurface(child2, &occlusion); |
- |
- // layer2's occlusion. |
- EXPECT_EQ(gfx::Rect().ToString(), |
- occlusion.occlusion_from_outside_target().ToString()); |
- EXPECT_EQ(gfx::Rect(10, 0, 40, 50).ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- |
- this->LeaveContributingSurface(child2, &occlusion); |
- this->VisitLayer(layer1, &occlusion); |
- this->EnterContributingSurface(child1, &occlusion); |
- |
- // layer2's occlusion in the target space of layer1. |
- EXPECT_EQ(gfx::Rect(30, 0, 40, 50).ToString(), |
- occlusion.occlusion_from_outside_target().ToString()); |
- // layer1's occlusion. |
- EXPECT_EQ(gfx::Rect(0, 0, 40, 50).ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- |
- this->LeaveContributingSurface(child1, &occlusion); |
- this->EnterLayer(parent, &occlusion); |
- |
- // The occlusion from from layer1 and layer2 is merged. |
- EXPECT_TRUE(occlusion.occlusion_from_outside_target().IsEmpty()); |
- EXPECT_EQ(gfx::Rect(10, 0, 70, 50).ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- } |
-}; |
- |
-ALL_OCCLUSIONTRACKER_TEST(OcclusionTrackerTestOverlappingSurfaceSiblings); |
- |
-template <class Types> |
-class OcclusionTrackerTestOverlappingSurfaceSiblingsWithTwoTransforms |
- : public OcclusionTrackerTest<Types> { |
- protected: |
- explicit OcclusionTrackerTestOverlappingSurfaceSiblingsWithTwoTransforms( |
- bool opaque_layers) |
- : OcclusionTrackerTest<Types>(opaque_layers) {} |
- void RunMyTest() override { |
- gfx::Transform child1_transform; |
- child1_transform.Translate(250.0, 250.0); |
- child1_transform.Rotate(-90.0); |
- child1_transform.Translate(-250.0, -250.0); |
- |
- gfx::Transform child2_transform; |
- child2_transform.Translate(250.0, 250.0); |
- child2_transform.Rotate(90.0); |
- child2_transform.Translate(-250.0, -250.0); |
- |
- typename Types::ContentLayerType* parent = this->CreateRoot( |
- this->identity_matrix, gfx::PointF(), gfx::Size(100, 100)); |
- parent->SetMasksToBounds(true); |
- typename Types::LayerType* child1 = this->CreateSurface( |
- parent, child1_transform, gfx::PointF(30.f, 20.f), gfx::Size(10, 10)); |
- typename Types::LayerType* child2 = |
- this->CreateDrawingSurface(parent, |
- child2_transform, |
- gfx::PointF(20.f, 40.f), |
- gfx::Size(10, 10), |
- false); |
- typename Types::ContentLayerType* layer1 = |
- this->CreateDrawingLayer(child1, |
- this->identity_matrix, |
- gfx::PointF(-10.f, -20.f), |
- gfx::Size(510, 510), |
- true); |
- typename Types::ContentLayerType* layer2 = |
- this->CreateDrawingLayer(child2, |
- this->identity_matrix, |
- gfx::PointF(-10.f, -10.f), |
- gfx::Size(510, 510), |
- true); |
- this->CalcDrawEtc(parent); |
- |
- TestOcclusionTrackerWithClip<typename Types::LayerType> occlusion( |
- gfx::Rect(0, 0, 1000, 1000)); |
- |
- this->VisitLayer(layer2, &occlusion); |
- this->EnterLayer(child2, &occlusion); |
- |
- EXPECT_EQ(gfx::Rect().ToString(), |
- occlusion.occlusion_from_outside_target().ToString()); |
- EXPECT_EQ(gfx::Rect(-10, 420, 70, 80).ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- |
- this->LeaveLayer(child2, &occlusion); |
- this->EnterContributingSurface(child2, &occlusion); |
- |
- EXPECT_EQ(gfx::Rect().ToString(), |
- occlusion.occlusion_from_outside_target().ToString()); |
- EXPECT_EQ(gfx::Rect(-10, 420, 70, 80).ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- |
- this->LeaveContributingSurface(child2, &occlusion); |
- this->VisitLayer(layer1, &occlusion); |
- this->EnterContributingSurface(child1, &occlusion); |
- |
- EXPECT_EQ(gfx::Rect(420, -10, 70, 80).ToString(), |
- occlusion.occlusion_from_outside_target().ToString()); |
- EXPECT_EQ(gfx::Rect(420, -20, 80, 90).ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- |
- this->LeaveContributingSurface(child1, &occlusion); |
- this->EnterLayer(parent, &occlusion); |
- |
- EXPECT_EQ(gfx::Rect().ToString(), |
- occlusion.occlusion_from_outside_target().ToString()); |
- EXPECT_EQ(gfx::Rect(10, 20, 90, 80).ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- |
- /* Justification for the above occlusion: |
- 100 |
- +---------------------+ |
- |20 | layer1 |
- 10+----------------------------------+ |
- 100 || 30 | layer2 | |
- |20+----------------------------------+ |
- || | | | | |
- || | | | | |
- || | | | | |
- +|-|------------------+ | | |
- | | | | 510 |
- | | 510 | | |
- | | | | |
- | | | | |
- | | | | |
- | | | | |
- | | 520 | | |
- +----------------------------------+ | |
- | | |
- +----------------------------------+ |
- 510 |
- */ |
- } |
-}; |
- |
-ALL_OCCLUSIONTRACKER_TEST( |
- OcclusionTrackerTestOverlappingSurfaceSiblingsWithTwoTransforms); |
- |
-template <class Types> |
-class OcclusionTrackerTestFilters : public OcclusionTrackerTest<Types> { |
- protected: |
- explicit OcclusionTrackerTestFilters(bool opaque_layers) |
- : OcclusionTrackerTest<Types>(opaque_layers) {} |
- void RunMyTest() override { |
- gfx::Transform layer_transform; |
- layer_transform.Translate(250.0, 250.0); |
- layer_transform.Rotate(90.0); |
- layer_transform.Translate(-250.0, -250.0); |
- |
- typename Types::ContentLayerType* parent = this->CreateRoot( |
- this->identity_matrix, gfx::PointF(), gfx::Size(100, 100)); |
- parent->SetMasksToBounds(true); |
- typename Types::ContentLayerType* blur_layer = |
- this->CreateDrawingLayer(parent, |
- layer_transform, |
- gfx::PointF(30.f, 30.f), |
- gfx::Size(500, 500), |
- true); |
- typename Types::ContentLayerType* opaque_layer = |
- this->CreateDrawingLayer(parent, |
- layer_transform, |
- gfx::PointF(30.f, 30.f), |
- gfx::Size(500, 500), |
- true); |
- typename Types::ContentLayerType* opacity_layer = |
- this->CreateDrawingLayer(parent, |
- layer_transform, |
- gfx::PointF(30.f, 30.f), |
- gfx::Size(500, 500), |
- true); |
- |
- Types::SetForceRenderSurface(blur_layer, true); |
- FilterOperations filters; |
- filters.Append(FilterOperation::CreateBlurFilter(10.f)); |
- blur_layer->SetFilters(filters); |
- |
- Types::SetForceRenderSurface(opaque_layer, true); |
- filters.Clear(); |
- filters.Append(FilterOperation::CreateGrayscaleFilter(0.5f)); |
- opaque_layer->SetFilters(filters); |
- |
- Types::SetForceRenderSurface(opacity_layer, true); |
- filters.Clear(); |
- filters.Append(FilterOperation::CreateOpacityFilter(0.5f)); |
- opacity_layer->SetFilters(filters); |
- |
- this->CalcDrawEtc(parent); |
- |
- TestOcclusionTrackerWithClip<typename Types::LayerType> occlusion( |
- gfx::Rect(0, 0, 1000, 1000)); |
- |
- // Opacity layer won't contribute to occlusion. |
- this->VisitLayer(opacity_layer, &occlusion); |
- this->EnterContributingSurface(opacity_layer, &occlusion); |
- |
- EXPECT_TRUE(occlusion.occlusion_from_outside_target().IsEmpty()); |
- EXPECT_TRUE(occlusion.occlusion_from_inside_target().IsEmpty()); |
- |
- // And has nothing to contribute to its parent surface. |
- this->LeaveContributingSurface(opacity_layer, &occlusion); |
- EXPECT_TRUE(occlusion.occlusion_from_outside_target().IsEmpty()); |
- EXPECT_TRUE(occlusion.occlusion_from_inside_target().IsEmpty()); |
- |
- // Opaque layer will contribute to occlusion. |
- this->VisitLayer(opaque_layer, &occlusion); |
- this->EnterContributingSurface(opaque_layer, &occlusion); |
- |
- EXPECT_TRUE(occlusion.occlusion_from_outside_target().IsEmpty()); |
- EXPECT_EQ(gfx::Rect(0, 430, 70, 70).ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- |
- // And it gets translated to the parent surface. |
- this->LeaveContributingSurface(opaque_layer, &occlusion); |
- EXPECT_TRUE(occlusion.occlusion_from_outside_target().IsEmpty()); |
- EXPECT_EQ(gfx::Rect(30, 30, 70, 70).ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- |
- // The blur layer needs to throw away any occlusion from outside its |
- // subtree. |
- this->EnterLayer(blur_layer, &occlusion); |
- EXPECT_TRUE(occlusion.occlusion_from_outside_target().IsEmpty()); |
- EXPECT_TRUE(occlusion.occlusion_from_inside_target().IsEmpty()); |
- |
- // And it won't contribute to occlusion. |
- this->LeaveLayer(blur_layer, &occlusion); |
- this->EnterContributingSurface(blur_layer, &occlusion); |
- EXPECT_TRUE(occlusion.occlusion_from_outside_target().IsEmpty()); |
- EXPECT_TRUE(occlusion.occlusion_from_inside_target().IsEmpty()); |
- |
- // But the opaque layer's occlusion is preserved on the parent. |
- this->LeaveContributingSurface(blur_layer, &occlusion); |
- this->EnterLayer(parent, &occlusion); |
- EXPECT_TRUE(occlusion.occlusion_from_outside_target().IsEmpty()); |
- EXPECT_EQ(gfx::Rect(30, 30, 70, 70).ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- } |
-}; |
- |
-ALL_OCCLUSIONTRACKER_TEST(OcclusionTrackerTestFilters); |
- |
-template <class Types> |
-class OcclusionTrackerTestReplicaDoesOcclude |
- : public OcclusionTrackerTest<Types> { |
- protected: |
- explicit OcclusionTrackerTestReplicaDoesOcclude(bool opaque_layers) |
- : OcclusionTrackerTest<Types>(opaque_layers) {} |
- void RunMyTest() override { |
- typename Types::ContentLayerType* parent = this->CreateRoot( |
- this->identity_matrix, gfx::PointF(), gfx::Size(100, 200)); |
- typename Types::LayerType* surface = this->CreateDrawingSurface( |
- parent, this->identity_matrix, gfx::PointF(), gfx::Size(50, 50), true); |
- this->CreateReplicaLayer( |
- surface, this->identity_matrix, gfx::PointF(0.f, 50.f), gfx::Size()); |
- this->CalcDrawEtc(parent); |
- |
- TestOcclusionTrackerWithClip<typename Types::LayerType> occlusion( |
- gfx::Rect(0, 0, 1000, 1000)); |
- |
- this->VisitLayer(surface, &occlusion); |
- |
- EXPECT_EQ(gfx::Rect(0, 0, 50, 50).ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- |
- this->VisitContributingSurface(surface, &occlusion); |
- this->EnterLayer(parent, &occlusion); |
- |
- // The surface and replica should both be occluding the parent. |
- EXPECT_EQ(gfx::Rect(50, 100).ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- } |
-}; |
- |
-ALL_OCCLUSIONTRACKER_TEST(OcclusionTrackerTestReplicaDoesOcclude); |
- |
-template <class Types> |
-class OcclusionTrackerTestReplicaWithClipping |
- : public OcclusionTrackerTest<Types> { |
- protected: |
- explicit OcclusionTrackerTestReplicaWithClipping(bool opaque_layers) |
- : OcclusionTrackerTest<Types>(opaque_layers) {} |
- void RunMyTest() override { |
- typename Types::ContentLayerType* parent = this->CreateRoot( |
- this->identity_matrix, gfx::PointF(), gfx::Size(100, 170)); |
- parent->SetMasksToBounds(true); |
- typename Types::LayerType* surface = |
- this->CreateDrawingSurface(parent, |
- this->identity_matrix, |
- gfx::PointF(0.f, 100.f), |
- gfx::Size(50, 50), |
- true); |
- this->CreateReplicaLayer( |
- surface, this->identity_matrix, gfx::PointF(0.f, 50.f), gfx::Size()); |
- this->CalcDrawEtc(parent); |
- |
- TestOcclusionTrackerWithClip<typename Types::LayerType> occlusion( |
- gfx::Rect(0, 0, 1000, 1000)); |
- |
- this->VisitLayer(surface, &occlusion); |
- |
- // The surface layer's occlusion in its own space. |
- EXPECT_EQ(gfx::Rect(0, 0, 50, 50).ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- EXPECT_TRUE(occlusion.occlusion_from_outside_target().IsEmpty()); |
- |
- this->VisitContributingSurface(surface, &occlusion); |
- this->EnterLayer(parent, &occlusion); |
- |
- // The surface and replica should both be occluding the parent, the |
- // replica's occlusion is clipped by the parent. |
- EXPECT_EQ(gfx::Rect(0, 100, 50, 70).ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- EXPECT_TRUE(occlusion.occlusion_from_outside_target().IsEmpty()); |
- } |
-}; |
- |
-ALL_OCCLUSIONTRACKER_TEST(OcclusionTrackerTestReplicaWithClipping); |
- |
-template <class Types> |
-class OcclusionTrackerTestReplicaWithMask : public OcclusionTrackerTest<Types> { |
- protected: |
- explicit OcclusionTrackerTestReplicaWithMask(bool opaque_layers) |
- : OcclusionTrackerTest<Types>(opaque_layers) {} |
- void RunMyTest() override { |
- typename Types::ContentLayerType* parent = this->CreateRoot( |
- this->identity_matrix, gfx::PointF(), gfx::Size(100, 200)); |
- typename Types::LayerType* surface = |
- this->CreateDrawingSurface(parent, |
- this->identity_matrix, |
- gfx::PointF(0.f, 100.f), |
- gfx::Size(50, 50), |
- true); |
- typename Types::LayerType* replica = this->CreateReplicaLayer( |
- surface, this->identity_matrix, gfx::PointF(50.f, 50.f), gfx::Size()); |
- this->CreateMaskLayer(replica, gfx::Size(10, 10)); |
- this->CalcDrawEtc(parent); |
- |
- TestOcclusionTrackerWithClip<typename Types::LayerType> occlusion( |
- gfx::Rect(0, 0, 1000, 1000)); |
- |
- this->VisitLayer(surface, &occlusion); |
- |
- EXPECT_EQ(gfx::Rect(0, 0, 50, 50).ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- |
- this->VisitContributingSurface(surface, &occlusion); |
- this->EnterLayer(parent, &occlusion); |
- |
- // The replica should not be occluding the parent, since it has a mask |
- // applied to it. |
- EXPECT_EQ(gfx::Rect(0, 100, 50, 50).ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- } |
-}; |
- |
-ALL_OCCLUSIONTRACKER_TEST(OcclusionTrackerTestReplicaWithMask); |
- |
-template <class Types> |
-class OcclusionTrackerTestOpaqueContentsRegionEmpty |
- : public OcclusionTrackerTest<Types> { |
- protected: |
- explicit OcclusionTrackerTestOpaqueContentsRegionEmpty(bool opaque_layers) |
- : OcclusionTrackerTest<Types>(opaque_layers) {} |
- void RunMyTest() override { |
- typename Types::ContentLayerType* parent = this->CreateRoot( |
- this->identity_matrix, gfx::PointF(), gfx::Size(300, 300)); |
- typename Types::ContentLayerType* layer = |
- this->CreateDrawingSurface(parent, |
- this->identity_matrix, |
- gfx::PointF(), |
- gfx::Size(200, 200), |
- false); |
- this->CalcDrawEtc(parent); |
- |
- TestOcclusionTrackerWithClip<typename Types::LayerType> occlusion( |
- gfx::Rect(0, 0, 1000, 1000)); |
- this->EnterLayer(layer, &occlusion); |
- |
- EXPECT_TRUE(occlusion.occlusion_from_outside_target().IsEmpty()); |
- EXPECT_TRUE(occlusion.occlusion_from_inside_target().IsEmpty()); |
- |
- this->LeaveLayer(layer, &occlusion); |
- this->VisitContributingSurface(layer, &occlusion); |
- this->EnterLayer(parent, &occlusion); |
- |
- EXPECT_TRUE(occlusion.occlusion_from_outside_target().IsEmpty()); |
- EXPECT_TRUE(occlusion.occlusion_from_inside_target().IsEmpty()); |
- } |
-}; |
- |
-MAIN_AND_IMPL_THREAD_TEST(OcclusionTrackerTestOpaqueContentsRegionEmpty); |
- |
-template <class Types> |
-class OcclusionTrackerTestOpaqueContentsRegionNonEmpty |
- : public OcclusionTrackerTest<Types> { |
- protected: |
- explicit OcclusionTrackerTestOpaqueContentsRegionNonEmpty(bool opaque_layers) |
- : OcclusionTrackerTest<Types>(opaque_layers) {} |
- void RunMyTest() override { |
- typename Types::ContentLayerType* parent = this->CreateRoot( |
- this->identity_matrix, gfx::PointF(), gfx::Size(300, 300)); |
- typename Types::ContentLayerType* layer = |
- this->CreateDrawingLayer(parent, |
- this->identity_matrix, |
- gfx::PointF(100.f, 100.f), |
- gfx::Size(200, 200), |
- false); |
- this->CalcDrawEtc(parent); |
- { |
- TestOcclusionTrackerWithClip<typename Types::LayerType> occlusion( |
- gfx::Rect(0, 0, 1000, 1000)); |
- layer->SetOpaqueContentsRect(gfx::Rect(0, 0, 100, 100)); |
- |
- this->ResetLayerIterator(); |
- this->VisitLayer(layer, &occlusion); |
- this->EnterLayer(parent, &occlusion); |
- |
- EXPECT_EQ(gfx::Rect(100, 100, 100, 100).ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- } |
- { |
- TestOcclusionTrackerWithClip<typename Types::LayerType> occlusion( |
- gfx::Rect(0, 0, 1000, 1000)); |
- layer->SetOpaqueContentsRect(gfx::Rect(20, 20, 180, 180)); |
- |
- this->ResetLayerIterator(); |
- this->VisitLayer(layer, &occlusion); |
- this->EnterLayer(parent, &occlusion); |
- |
- EXPECT_EQ(gfx::Rect(120, 120, 180, 180).ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- } |
- { |
- TestOcclusionTrackerWithClip<typename Types::LayerType> occlusion( |
- gfx::Rect(0, 0, 1000, 1000)); |
- layer->SetOpaqueContentsRect(gfx::Rect(150, 150, 100, 100)); |
- |
- this->ResetLayerIterator(); |
- this->VisitLayer(layer, &occlusion); |
- this->EnterLayer(parent, &occlusion); |
- |
- EXPECT_EQ(gfx::Rect(250, 250, 50, 50).ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- } |
- } |
-}; |
- |
-MAIN_AND_IMPL_THREAD_TEST(OcclusionTrackerTestOpaqueContentsRegionNonEmpty); |
- |
-template <class Types> |
-class OcclusionTrackerTestUnsorted3dLayers |
- : public OcclusionTrackerTest<Types> { |
- protected: |
- explicit OcclusionTrackerTestUnsorted3dLayers(bool opaque_layers) |
- : OcclusionTrackerTest<Types>(opaque_layers) {} |
- void RunMyTest() override { |
- // Currently, The main thread layer iterator does not iterate over 3d items |
- // in sorted order, because layer sorting is not performed on the main |
- // thread. Because of this, the occlusion tracker cannot assume that a 3d |
- // layer occludes other layers that have not yet been iterated over. For |
- // now, the expected behavior is that a 3d layer simply does not add any |
- // occlusion to the occlusion tracker. |
- |
- gfx::Transform translation_to_front; |
- translation_to_front.Translate3d(0.0, 0.0, -10.0); |
- gfx::Transform translation_to_back; |
- translation_to_front.Translate3d(0.0, 0.0, -100.0); |
- |
- typename Types::ContentLayerType* parent = this->CreateRoot( |
- this->identity_matrix, gfx::PointF(), gfx::Size(300, 300)); |
- typename Types::ContentLayerType* child1 = this->CreateDrawingLayer( |
- parent, translation_to_back, gfx::PointF(), gfx::Size(100, 100), true); |
- typename Types::ContentLayerType* child2 = |
- this->CreateDrawingLayer(parent, |
- translation_to_front, |
- gfx::PointF(50.f, 50.f), |
- gfx::Size(100, 100), |
- true); |
- parent->SetShouldFlattenTransform(false); |
- parent->Set3dSortingContextId(1); |
- child1->Set3dSortingContextId(1); |
- child2->Set3dSortingContextId(1); |
- |
- this->CalcDrawEtc(parent); |
- |
- TestOcclusionTrackerWithClip<typename Types::LayerType> occlusion( |
- gfx::Rect(0, 0, 1000, 1000)); |
- this->VisitLayer(child2, &occlusion); |
- EXPECT_TRUE(occlusion.occlusion_from_outside_target().IsEmpty()); |
- EXPECT_TRUE(occlusion.occlusion_from_inside_target().IsEmpty()); |
- |
- this->VisitLayer(child1, &occlusion); |
- EXPECT_TRUE(occlusion.occlusion_from_outside_target().IsEmpty()); |
- EXPECT_TRUE(occlusion.occlusion_from_inside_target().IsEmpty()); |
- } |
-}; |
- |
-// This test will have different layer ordering on the impl thread; the test |
-// will only work on the main thread. |
-MAIN_THREAD_TEST(OcclusionTrackerTestUnsorted3dLayers); |
- |
-template <class Types> |
-class OcclusionTrackerTestLayerBehindCameraDoesNotOcclude |
- : public OcclusionTrackerTest<Types> { |
- protected: |
- explicit OcclusionTrackerTestLayerBehindCameraDoesNotOcclude( |
- bool opaque_layers) |
- : OcclusionTrackerTest<Types>(opaque_layers) {} |
- void RunMyTest() override { |
- gfx::Transform transform; |
- transform.Translate(50.0, 50.0); |
- transform.ApplyPerspectiveDepth(100.0); |
- transform.Translate3d(0.0, 0.0, 110.0); |
- transform.Translate(-50.0, -50.0); |
- |
- typename Types::ContentLayerType* parent = this->CreateRoot( |
- this->identity_matrix, gfx::PointF(), gfx::Size(100, 100)); |
- typename Types::ContentLayerType* layer = this->CreateDrawingLayer( |
- parent, transform, gfx::PointF(), gfx::Size(100, 100), true); |
- parent->SetShouldFlattenTransform(false); |
- parent->Set3dSortingContextId(1); |
- layer->SetShouldFlattenTransform(false); |
- layer->Set3dSortingContextId(1); |
- this->CalcDrawEtc(parent); |
- |
- TestOcclusionTrackerWithClip<typename Types::LayerType> occlusion( |
- gfx::Rect(0, 0, 1000, 1000)); |
- |
- // The |layer| is entirely behind the camera and should not occlude. |
- this->VisitLayer(layer, &occlusion); |
- this->EnterLayer(parent, &occlusion); |
- EXPECT_TRUE(occlusion.occlusion_from_inside_target().IsEmpty()); |
- EXPECT_TRUE(occlusion.occlusion_from_outside_target().IsEmpty()); |
- } |
-}; |
- |
-template <class Types> |
-class OcclusionTrackerTestAnimationOpacity1OnMainThread |
- : public OcclusionTrackerTest<Types> { |
- protected: |
- explicit OcclusionTrackerTestAnimationOpacity1OnMainThread(bool opaque_layers) |
- : OcclusionTrackerTest<Types>(opaque_layers) {} |
- void RunMyTest() override { |
- // parent |
- // +--layer |
- // +--surface |
- // | +--surface_child |
- // | +--surface_child2 |
- // +--parent2 |
- // +--topmost |
- |
- typename Types::ContentLayerType* parent = this->CreateRoot( |
- this->identity_matrix, gfx::PointF(), gfx::Size(300, 300)); |
- typename Types::ContentLayerType* layer = |
- this->CreateDrawingLayer(parent, |
- this->identity_matrix, |
- gfx::PointF(), |
- gfx::Size(300, 300), |
- true); |
- typename Types::ContentLayerType* surface = |
- this->CreateDrawingSurface(parent, |
- this->identity_matrix, |
- gfx::PointF(), |
- gfx::Size(300, 300), |
- true); |
- typename Types::ContentLayerType* surface_child = |
- this->CreateDrawingLayer(surface, |
- this->identity_matrix, |
- gfx::PointF(), |
- gfx::Size(200, 300), |
- true); |
- typename Types::ContentLayerType* surface_child2 = |
- this->CreateDrawingLayer(surface, |
- this->identity_matrix, |
- gfx::PointF(), |
- gfx::Size(100, 300), |
- true); |
- typename Types::ContentLayerType* parent2 = |
- this->CreateDrawingLayer(parent, |
- this->identity_matrix, |
- gfx::PointF(), |
- gfx::Size(300, 300), |
- false); |
- typename Types::ContentLayerType* topmost = |
- this->CreateDrawingLayer(parent, |
- this->identity_matrix, |
- gfx::PointF(250.f, 0.f), |
- gfx::Size(50, 300), |
- true); |
- |
- AddOpacityTransitionToController( |
- layer->layer_animation_controller(), 10.0, 0.f, 1.f, false); |
- AddOpacityTransitionToController( |
- surface->layer_animation_controller(), 10.0, 0.f, 1.f, false); |
- this->CalcDrawEtc(parent); |
- |
- EXPECT_TRUE(layer->draw_opacity_is_animating()); |
- EXPECT_FALSE(surface->draw_opacity_is_animating()); |
- EXPECT_TRUE(surface->render_surface()->draw_opacity_is_animating()); |
- |
- TestOcclusionTrackerWithClip<typename Types::LayerType> occlusion( |
- gfx::Rect(0, 0, 1000, 1000)); |
- |
- this->VisitLayer(topmost, &occlusion); |
- this->EnterLayer(parent2, &occlusion); |
- |
- // This occlusion will affect all surfaces. |
- EXPECT_EQ(gfx::Rect().ToString(), |
- occlusion.occlusion_from_outside_target().ToString()); |
- EXPECT_EQ(gfx::Rect(250, 0, 50, 300).ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- |
- this->LeaveLayer(parent2, &occlusion); |
- this->VisitLayer(surface_child2, &occlusion); |
- this->EnterLayer(surface_child, &occlusion); |
- EXPECT_EQ(gfx::Rect(250, 0, 50, 300).ToString(), |
- occlusion.occlusion_from_outside_target().ToString()); |
- EXPECT_EQ(gfx::Rect(0, 0, 100, 300).ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- |
- this->LeaveLayer(surface_child, &occlusion); |
- this->EnterLayer(surface, &occlusion); |
- EXPECT_EQ(gfx::Rect(250, 0, 50, 300).ToString(), |
- occlusion.occlusion_from_outside_target().ToString()); |
- EXPECT_EQ(gfx::Rect(0, 0, 200, 300).ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- |
- this->LeaveLayer(surface, &occlusion); |
- this->EnterContributingSurface(surface, &occlusion); |
- // Occlusion within the surface is lost when leaving the animating surface. |
- EXPECT_EQ(gfx::Rect().ToString(), |
- occlusion.occlusion_from_outside_target().ToString()); |
- EXPECT_EQ(gfx::Rect().ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- |
- this->LeaveContributingSurface(surface, &occlusion); |
- // Occlusion from outside the animating surface still exists. |
- EXPECT_EQ(gfx::Rect(250, 0, 50, 300).ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- EXPECT_EQ(gfx::Rect().ToString(), |
- occlusion.occlusion_from_outside_target().ToString()); |
- |
- this->VisitLayer(layer, &occlusion); |
- this->EnterLayer(parent, &occlusion); |
- |
- // Occlusion is not added for the animating |layer|. |
- EXPECT_EQ(gfx::Rect(250, 0, 50, 300).ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- EXPECT_EQ(gfx::Rect().ToString(), |
- occlusion.occlusion_from_outside_target().ToString()); |
- } |
-}; |
- |
-MAIN_THREAD_TEST(OcclusionTrackerTestAnimationOpacity1OnMainThread); |
- |
-template <class Types> |
-class OcclusionTrackerTestAnimationOpacity0OnMainThread |
- : public OcclusionTrackerTest<Types> { |
- protected: |
- explicit OcclusionTrackerTestAnimationOpacity0OnMainThread(bool opaque_layers) |
- : OcclusionTrackerTest<Types>(opaque_layers) {} |
- void RunMyTest() override { |
- typename Types::ContentLayerType* parent = this->CreateRoot( |
- this->identity_matrix, gfx::PointF(), gfx::Size(300, 300)); |
- typename Types::ContentLayerType* layer = |
- this->CreateDrawingLayer(parent, |
- this->identity_matrix, |
- gfx::PointF(), |
- gfx::Size(300, 300), |
- true); |
- typename Types::ContentLayerType* surface = |
- this->CreateDrawingSurface(parent, |
- this->identity_matrix, |
- gfx::PointF(), |
- gfx::Size(300, 300), |
- true); |
- typename Types::ContentLayerType* surface_child = |
- this->CreateDrawingLayer(surface, |
- this->identity_matrix, |
- gfx::PointF(), |
- gfx::Size(200, 300), |
- true); |
- typename Types::ContentLayerType* surface_child2 = |
- this->CreateDrawingLayer(surface, |
- this->identity_matrix, |
- gfx::PointF(), |
- gfx::Size(100, 300), |
- true); |
- typename Types::ContentLayerType* parent2 = |
- this->CreateDrawingLayer(parent, |
- this->identity_matrix, |
- gfx::PointF(), |
- gfx::Size(300, 300), |
- false); |
- typename Types::ContentLayerType* topmost = |
- this->CreateDrawingLayer(parent, |
- this->identity_matrix, |
- gfx::PointF(250.f, 0.f), |
- gfx::Size(50, 300), |
- true); |
- |
- AddOpacityTransitionToController( |
- layer->layer_animation_controller(), 10.0, 1.f, 0.f, false); |
- AddOpacityTransitionToController( |
- surface->layer_animation_controller(), 10.0, 1.f, 0.f, false); |
- this->CalcDrawEtc(parent); |
- |
- EXPECT_TRUE(layer->draw_opacity_is_animating()); |
- EXPECT_FALSE(surface->draw_opacity_is_animating()); |
- EXPECT_TRUE(surface->render_surface()->draw_opacity_is_animating()); |
- |
- TestOcclusionTrackerWithClip<typename Types::LayerType> occlusion( |
- gfx::Rect(0, 0, 1000, 1000)); |
- |
- this->VisitLayer(topmost, &occlusion); |
- this->EnterLayer(parent2, &occlusion); |
- // This occlusion will affect all surfaces. |
- EXPECT_EQ(gfx::Rect(250, 0, 50, 300).ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- EXPECT_EQ(gfx::Rect().ToString(), |
- occlusion.occlusion_from_outside_target().ToString()); |
- |
- this->LeaveLayer(parent2, &occlusion); |
- this->VisitLayer(surface_child2, &occlusion); |
- this->EnterLayer(surface_child, &occlusion); |
- EXPECT_EQ(gfx::Rect(0, 0, 100, 300).ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- EXPECT_EQ(gfx::Rect(250, 0, 50, 300).ToString(), |
- occlusion.occlusion_from_outside_target().ToString()); |
- |
- this->LeaveLayer(surface_child, &occlusion); |
- this->EnterLayer(surface, &occlusion); |
- EXPECT_EQ(gfx::Rect(0, 0, 200, 300).ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- EXPECT_EQ(gfx::Rect(250, 0, 50, 300).ToString(), |
- occlusion.occlusion_from_outside_target().ToString()); |
- |
- this->LeaveLayer(surface, &occlusion); |
- this->EnterContributingSurface(surface, &occlusion); |
- // Occlusion within the surface is lost when leaving the animating surface. |
- EXPECT_EQ(gfx::Rect().ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- EXPECT_EQ(gfx::Rect().ToString(), |
- occlusion.occlusion_from_outside_target().ToString()); |
- |
- this->LeaveContributingSurface(surface, &occlusion); |
- // Occlusion from outside the animating surface still exists. |
- EXPECT_EQ(gfx::Rect(250, 0, 50, 300).ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- EXPECT_EQ(gfx::Rect().ToString(), |
- occlusion.occlusion_from_outside_target().ToString()); |
- |
- this->VisitLayer(layer, &occlusion); |
- this->EnterLayer(parent, &occlusion); |
- |
- // Occlusion is not added for the animating |layer|. |
- EXPECT_EQ(gfx::Rect(250, 0, 50, 300).ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- EXPECT_EQ(gfx::Rect().ToString(), |
- occlusion.occlusion_from_outside_target().ToString()); |
- } |
-}; |
- |
-MAIN_THREAD_TEST(OcclusionTrackerTestAnimationOpacity0OnMainThread); |
- |
-template <class Types> |
-class OcclusionTrackerTestAnimationTranslateOnMainThread |
- : public OcclusionTrackerTest<Types> { |
- protected: |
- explicit OcclusionTrackerTestAnimationTranslateOnMainThread( |
- bool opaque_layers) |
- : OcclusionTrackerTest<Types>(opaque_layers) {} |
- void RunMyTest() override { |
- typename Types::ContentLayerType* parent = this->CreateRoot( |
- this->identity_matrix, gfx::PointF(), gfx::Size(300, 300)); |
- typename Types::ContentLayerType* layer = |
- this->CreateDrawingLayer(parent, |
- this->identity_matrix, |
- gfx::PointF(), |
- gfx::Size(300, 300), |
- true); |
- typename Types::ContentLayerType* surface = |
- this->CreateDrawingSurface(parent, |
- this->identity_matrix, |
- gfx::PointF(), |
- gfx::Size(300, 300), |
- true); |
- typename Types::ContentLayerType* surface_child = |
- this->CreateDrawingLayer(surface, |
- this->identity_matrix, |
- gfx::PointF(), |
- gfx::Size(200, 300), |
- true); |
- typename Types::ContentLayerType* surface_child2 = |
- this->CreateDrawingLayer(surface, |
- this->identity_matrix, |
- gfx::PointF(), |
- gfx::Size(100, 300), |
- true); |
- typename Types::ContentLayerType* surface2 = this->CreateDrawingSurface( |
- parent, this->identity_matrix, gfx::PointF(), gfx::Size(50, 300), true); |
- |
- AddAnimatedTransformToController( |
- layer->layer_animation_controller(), 10.0, 30, 0); |
- AddAnimatedTransformToController( |
- surface->layer_animation_controller(), 10.0, 30, 0); |
- AddAnimatedTransformToController( |
- surface_child->layer_animation_controller(), 10.0, 30, 0); |
- this->CalcDrawEtc(parent); |
- |
- EXPECT_TRUE(layer->draw_transform_is_animating()); |
- EXPECT_TRUE(layer->screen_space_transform_is_animating()); |
- EXPECT_TRUE( |
- surface->render_surface()->target_surface_transforms_are_animating()); |
- EXPECT_TRUE( |
- surface->render_surface()->screen_space_transforms_are_animating()); |
- // The surface owning layer doesn't animate against its own surface. |
- EXPECT_FALSE(surface->draw_transform_is_animating()); |
- EXPECT_TRUE(surface->screen_space_transform_is_animating()); |
- EXPECT_TRUE(surface_child->draw_transform_is_animating()); |
- EXPECT_TRUE(surface_child->screen_space_transform_is_animating()); |
- |
- TestOcclusionTrackerWithClip<typename Types::LayerType> occlusion( |
- gfx::Rect(0, 0, 1000, 1000)); |
- |
- this->VisitLayer(surface2, &occlusion); |
- this->EnterContributingSurface(surface2, &occlusion); |
- |
- EXPECT_EQ(gfx::Rect(0, 0, 50, 300).ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- |
- this->LeaveContributingSurface(surface2, &occlusion); |
- this->EnterLayer(surface_child2, &occlusion); |
- // surface_child2 is moving in screen space but not relative to its target, |
- // so occlusion should happen in its target space only. It also means that |
- // things occluding from outside the target (e.g. surface2) cannot occlude |
- // this layer. |
- EXPECT_EQ(gfx::Rect().ToString(), |
- occlusion.occlusion_from_outside_target().ToString()); |
- EXPECT_EQ(gfx::Rect().ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- |
- this->LeaveLayer(surface_child2, &occlusion); |
- this->EnterLayer(surface_child, &occlusion); |
- // surface_child2 added to the occlusion since it is not moving relative |
- // to its target. |
- EXPECT_EQ(gfx::Rect().ToString(), |
- occlusion.occlusion_from_outside_target().ToString()); |
- EXPECT_EQ(gfx::Rect(0, 0, 100, 300).ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- |
- this->LeaveLayer(surface_child, &occlusion); |
- // surface_child is moving relative to its target, so it does not add |
- // occlusion. |
- EXPECT_EQ(gfx::Rect().ToString(), |
- occlusion.occlusion_from_outside_target().ToString()); |
- EXPECT_EQ(gfx::Rect(0, 0, 100, 300).ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- |
- this->EnterLayer(surface, &occlusion); |
- EXPECT_EQ(gfx::Rect().ToString(), |
- occlusion.occlusion_from_outside_target().ToString()); |
- EXPECT_EQ(gfx::Rect(0, 0, 100, 300).ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- |
- this->LeaveLayer(surface, &occlusion); |
- // The surface's owning layer is moving in screen space but not relative to |
- // its target, so it adds to the occlusion. |
- EXPECT_EQ(gfx::Rect().ToString(), |
- occlusion.occlusion_from_outside_target().ToString()); |
- EXPECT_EQ(gfx::Rect(0, 0, 300, 300).ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- |
- this->EnterContributingSurface(surface, &occlusion); |
- this->LeaveContributingSurface(surface, &occlusion); |
- // The |surface| is moving in the screen and in its target, so all occlusion |
- // within the surface is lost when leaving it. Only the |surface2| occlusion |
- // is left. |
- EXPECT_EQ(gfx::Rect().ToString(), |
- occlusion.occlusion_from_outside_target().ToString()); |
- EXPECT_EQ(gfx::Rect(0, 0, 50, 300).ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- |
- this->VisitLayer(layer, &occlusion); |
- // The |layer| is animating in the screen and in its target, so no occlusion |
- // is added. |
- EXPECT_EQ(gfx::Rect().ToString(), |
- occlusion.occlusion_from_outside_target().ToString()); |
- EXPECT_EQ(gfx::Rect(0, 0, 50, 300).ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- } |
-}; |
- |
-MAIN_THREAD_TEST(OcclusionTrackerTestAnimationTranslateOnMainThread); |
- |
-template <class Types> |
-class OcclusionTrackerTestSurfaceOcclusionTranslatesToParent |
- : public OcclusionTrackerTest<Types> { |
- protected: |
- explicit OcclusionTrackerTestSurfaceOcclusionTranslatesToParent( |
- bool opaque_layers) |
- : OcclusionTrackerTest<Types>(opaque_layers) {} |
- void RunMyTest() override { |
- gfx::Transform surface_transform; |
- surface_transform.Translate(300.0, 300.0); |
- surface_transform.Scale(2.0, 2.0); |
- surface_transform.Translate(-150.0, -150.0); |
- |
- typename Types::ContentLayerType* parent = this->CreateRoot( |
- this->identity_matrix, gfx::PointF(), gfx::Size(500, 500)); |
- typename Types::ContentLayerType* surface = this->CreateDrawingSurface( |
- parent, surface_transform, gfx::PointF(), gfx::Size(300, 300), false); |
- typename Types::ContentLayerType* surface2 = |
- this->CreateDrawingSurface(parent, |
- this->identity_matrix, |
- gfx::PointF(50.f, 50.f), |
- gfx::Size(300, 300), |
- false); |
- surface->SetOpaqueContentsRect(gfx::Rect(0, 0, 200, 200)); |
- surface2->SetOpaqueContentsRect(gfx::Rect(0, 0, 200, 200)); |
- this->CalcDrawEtc(parent); |
- |
- TestOcclusionTrackerWithClip<typename Types::LayerType> occlusion( |
- gfx::Rect(0, 0, 1000, 1000)); |
- |
- this->VisitLayer(surface2, &occlusion); |
- this->VisitContributingSurface(surface2, &occlusion); |
- |
- EXPECT_EQ(gfx::Rect().ToString(), |
- occlusion.occlusion_from_outside_target().ToString()); |
- EXPECT_EQ(gfx::Rect(50, 50, 200, 200).ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- |
- // Clear any stored occlusion. |
- occlusion.set_occlusion_from_outside_target(SimpleEnclosedRegion()); |
- occlusion.set_occlusion_from_inside_target(SimpleEnclosedRegion()); |
- |
- this->VisitLayer(surface, &occlusion); |
- this->VisitContributingSurface(surface, &occlusion); |
- |
- EXPECT_EQ(gfx::Rect().ToString(), |
- occlusion.occlusion_from_outside_target().ToString()); |
- EXPECT_EQ(gfx::Rect(0, 0, 400, 400).ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- } |
-}; |
- |
-MAIN_AND_IMPL_THREAD_TEST( |
- OcclusionTrackerTestSurfaceOcclusionTranslatesToParent); |
- |
-template <class Types> |
-class OcclusionTrackerTestSurfaceOcclusionTranslatesWithClipping |
- : public OcclusionTrackerTest<Types> { |
- protected: |
- explicit OcclusionTrackerTestSurfaceOcclusionTranslatesWithClipping( |
- bool opaque_layers) |
- : OcclusionTrackerTest<Types>(opaque_layers) {} |
- void RunMyTest() override { |
- typename Types::ContentLayerType* parent = this->CreateRoot( |
- this->identity_matrix, gfx::PointF(), gfx::Size(300, 300)); |
- parent->SetMasksToBounds(true); |
- typename Types::ContentLayerType* surface = |
- this->CreateDrawingSurface(parent, |
- this->identity_matrix, |
- gfx::PointF(), |
- gfx::Size(500, 300), |
- false); |
- surface->SetOpaqueContentsRect(gfx::Rect(0, 0, 400, 200)); |
- this->CalcDrawEtc(parent); |
- |
- TestOcclusionTrackerWithClip<typename Types::LayerType> occlusion( |
- gfx::Rect(0, 0, 1000, 1000)); |
- |
- this->VisitLayer(surface, &occlusion); |
- this->VisitContributingSurface(surface, &occlusion); |
- |
- EXPECT_EQ(gfx::Rect().ToString(), |
- occlusion.occlusion_from_outside_target().ToString()); |
- EXPECT_EQ(gfx::Rect(0, 0, 300, 200).ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- } |
-}; |
- |
-MAIN_AND_IMPL_THREAD_TEST( |
- OcclusionTrackerTestSurfaceOcclusionTranslatesWithClipping); |
- |
-template <class Types> |
-class OcclusionTrackerTestSurfaceWithReplicaUnoccluded |
- : public OcclusionTrackerTest<Types> { |
- protected: |
- explicit OcclusionTrackerTestSurfaceWithReplicaUnoccluded(bool opaque_layers) |
- : OcclusionTrackerTest<Types>(opaque_layers) {} |
- void RunMyTest() override { |
- typename Types::ContentLayerType* parent = this->CreateRoot( |
- this->identity_matrix, gfx::PointF(), gfx::Size(100, 200)); |
- typename Types::LayerType* surface = |
- this->CreateDrawingSurface(parent, |
- this->identity_matrix, |
- gfx::PointF(), |
- gfx::Size(100, 100), |
- true); |
- this->CreateReplicaLayer(surface, |
- this->identity_matrix, |
- gfx::PointF(0.f, 100.f), |
- gfx::Size(100, 100)); |
- typename Types::LayerType* topmost = |
- this->CreateDrawingLayer(parent, |
- this->identity_matrix, |
- gfx::PointF(), |
- gfx::Size(100, 110), |
- true); |
- this->CalcDrawEtc(parent); |
- |
- TestOcclusionTrackerWithClip<typename Types::LayerType> occlusion( |
- gfx::Rect(0, 0, 1000, 1000)); |
- |
- // |topmost| occludes the surface, but not the entire surface's replica. |
- this->VisitLayer(topmost, &occlusion); |
- |
- EXPECT_EQ(gfx::Rect().ToString(), |
- occlusion.occlusion_from_outside_target().ToString()); |
- EXPECT_EQ(gfx::Rect(0, 0, 100, 110).ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- |
- this->VisitLayer(surface, &occlusion); |
- |
- // Render target with replica ignores occlusion from outside. |
- EXPECT_EQ(gfx::Rect().ToString(), |
- occlusion.occlusion_from_outside_target().ToString()); |
- EXPECT_EQ(gfx::Rect(0, 0, 100, 100).ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- |
- this->EnterContributingSurface(surface, &occlusion); |
- |
- // Only occlusion from outside the surface occludes the surface/replica. |
- EXPECT_EQ(gfx::Rect().ToString(), |
- occlusion.occlusion_on_contributing_surface_from_outside_target() |
- .ToString()); |
- EXPECT_EQ(gfx::Rect(0, 0, 100, 110).ToString(), |
- occlusion.occlusion_on_contributing_surface_from_inside_target() |
- .ToString()); |
- } |
-}; |
- |
-ALL_OCCLUSIONTRACKER_TEST(OcclusionTrackerTestSurfaceWithReplicaUnoccluded); |
- |
-template <class Types> |
-class OcclusionTrackerTestSurfaceChildOfSurface |
- : public OcclusionTrackerTest<Types> { |
- protected: |
- explicit OcclusionTrackerTestSurfaceChildOfSurface(bool opaque_layers) |
- : OcclusionTrackerTest<Types>(opaque_layers) {} |
- void RunMyTest() override { |
- // This test verifies that the surface cliprect does not end up empty and |
- // clip away the entire unoccluded rect. |
- |
- typename Types::ContentLayerType* parent = this->CreateRoot( |
- this->identity_matrix, gfx::PointF(), gfx::Size(100, 200)); |
- typename Types::LayerType* surface = |
- this->CreateDrawingSurface(parent, |
- this->identity_matrix, |
- gfx::PointF(), |
- gfx::Size(100, 100), |
- false); |
- typename Types::LayerType* surface_child = |
- this->CreateDrawingSurface(surface, |
- this->identity_matrix, |
- gfx::PointF(0.f, 10.f), |
- gfx::Size(100, 50), |
- true); |
- typename Types::LayerType* topmost = this->CreateDrawingLayer( |
- parent, this->identity_matrix, gfx::PointF(), gfx::Size(100, 50), true); |
- this->CalcDrawEtc(parent); |
- |
- TestOcclusionTrackerWithClip<typename Types::LayerType> occlusion( |
- gfx::Rect(-100, -100, 1000, 1000)); |
- |
- // |topmost| occludes everything partially so we know occlusion is happening |
- // at all. |
- this->VisitLayer(topmost, &occlusion); |
- |
- EXPECT_EQ(gfx::Rect().ToString(), |
- occlusion.occlusion_from_outside_target().ToString()); |
- EXPECT_EQ(gfx::Rect(0, 0, 100, 50).ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- |
- this->VisitLayer(surface_child, &occlusion); |
- |
- // surface_child increases the occlusion in the screen by a narrow sliver. |
- EXPECT_EQ(gfx::Rect(0, -10, 100, 50).ToString(), |
- occlusion.occlusion_from_outside_target().ToString()); |
- // In its own surface, surface_child is at 0,0 as is its occlusion. |
- EXPECT_EQ(gfx::Rect(0, 0, 100, 50).ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- |
- // The root layer always has a clip rect. So the parent of |surface| has a |
- // clip rect. However, the owning layer for |surface| does not mask to |
- // bounds, so it doesn't have a clip rect of its own. Thus the parent of |
- // |surface_child| exercises different code paths as its parent does not |
- // have a clip rect. |
- |
- this->EnterContributingSurface(surface_child, &occlusion); |
- // The |surface_child| can't occlude its own surface, but occlusion from |
- // |topmost| can. |
- EXPECT_EQ(gfx::Rect().ToString(), |
- occlusion.occlusion_on_contributing_surface_from_outside_target() |
- .ToString()); |
- EXPECT_EQ(gfx::Rect(0, 0, 100, 50).ToString(), |
- occlusion.occlusion_on_contributing_surface_from_inside_target() |
- .ToString()); |
- this->LeaveContributingSurface(surface_child, &occlusion); |
- |
- // When the surface_child's occlusion is transformed up to its parent, make |
- // sure it is not clipped away inappropriately. |
- this->EnterLayer(surface, &occlusion); |
- EXPECT_EQ(gfx::Rect(0, 0, 100, 50).ToString(), |
- occlusion.occlusion_from_outside_target().ToString()); |
- EXPECT_EQ(gfx::Rect(0, 10, 100, 50).ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- this->LeaveLayer(surface, &occlusion); |
- |
- this->EnterContributingSurface(surface, &occlusion); |
- // The occlusion from inside |surface| can't affect the surface, but |
- // |topmost| can. |
- EXPECT_EQ(gfx::Rect().ToString(), |
- occlusion.occlusion_on_contributing_surface_from_outside_target() |
- .ToString()); |
- EXPECT_EQ(gfx::Rect(0, 0, 100, 50).ToString(), |
- occlusion.occlusion_on_contributing_surface_from_inside_target() |
- .ToString()); |
- |
- this->LeaveContributingSurface(surface, &occlusion); |
- this->EnterLayer(parent, &occlusion); |
- // The occlusion in |surface| and without are merged into the parent. |
- EXPECT_EQ(gfx::Rect().ToString(), |
- occlusion.occlusion_from_outside_target().ToString()); |
- EXPECT_EQ(gfx::Rect(0, 0, 100, 60).ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- } |
-}; |
- |
-ALL_OCCLUSIONTRACKER_TEST(OcclusionTrackerTestSurfaceChildOfSurface); |
- |
-template <class Types> |
-class OcclusionTrackerTestDontOccludePixelsNeededForBackgroundFilter |
- : public OcclusionTrackerTest<Types> { |
- protected: |
- explicit OcclusionTrackerTestDontOccludePixelsNeededForBackgroundFilter( |
- bool opaque_layers) |
- : OcclusionTrackerTest<Types>(opaque_layers) {} |
- void RunMyTest() override { |
- gfx::Transform scale_by_half; |
- scale_by_half.Scale(0.5, 0.5); |
- |
- FilterOperations filters; |
- filters.Append(FilterOperation::CreateBlurFilter(10.f)); |
- |
- // Save the distance of influence for the blur effect. |
- int outset_top, outset_right, outset_bottom, outset_left; |
- filters.GetOutsets( |
- &outset_top, &outset_right, &outset_bottom, &outset_left); |
- |
- enum Direction { |
- LEFT, |
- RIGHT, |
- TOP, |
- BOTTOM, |
- LAST_DIRECTION = BOTTOM, |
- }; |
- |
- for (int i = 0; i <= LAST_DIRECTION; ++i) { |
- SCOPED_TRACE(i); |
- |
- // Make a 50x50 filtered surface that is adjacent to occluding layers |
- // which are above it in the z-order in various configurations. The |
- // surface is scaled to test that the pixel moving is done in the target |
- // space, where the background filter is applied. |
- typename Types::ContentLayerType* parent = this->CreateRoot( |
- this->identity_matrix, gfx::PointF(), gfx::Size(200, 200)); |
- typename Types::LayerType* filtered_surface = |
- this->CreateDrawingLayer(parent, |
- scale_by_half, |
- gfx::PointF(50.f, 50.f), |
- gfx::Size(100, 100), |
- false); |
- Types::SetForceRenderSurface(filtered_surface, true); |
- filtered_surface->SetBackgroundFilters(filters); |
- gfx::Rect occlusion_rect; |
- switch (i) { |
- case LEFT: |
- occlusion_rect = gfx::Rect(0, 0, 50, 200); |
- break; |
- case RIGHT: |
- occlusion_rect = gfx::Rect(100, 0, 50, 200); |
- break; |
- case TOP: |
- occlusion_rect = gfx::Rect(0, 0, 200, 50); |
- break; |
- case BOTTOM: |
- occlusion_rect = gfx::Rect(0, 100, 200, 50); |
- break; |
- } |
- |
- typename Types::LayerType* occluding_layer = |
- this->CreateDrawingLayer(parent, |
- this->identity_matrix, |
- occlusion_rect.origin(), |
- occlusion_rect.size(), |
- true); |
- this->CalcDrawEtc(parent); |
- |
- TestOcclusionTrackerWithClip<typename Types::LayerType> occlusion( |
- gfx::Rect(0, 0, 200, 200)); |
- |
- // This layer occludes pixels directly beside the filtered_surface. |
- // Because filtered surface blends pixels in a radius, it will need to see |
- // some of the pixels (up to radius far) underneath the occluding layers. |
- this->VisitLayer(occluding_layer, &occlusion); |
- |
- EXPECT_EQ(occlusion_rect.ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- EXPECT_TRUE(occlusion.occlusion_from_outside_target().IsEmpty()); |
- |
- this->VisitLayer(filtered_surface, &occlusion); |
- |
- // The occlusion is used fully inside the surface. |
- gfx::Rect occlusion_inside_surface = |
- occlusion_rect - gfx::Vector2d(50, 50); |
- EXPECT_TRUE(occlusion.occlusion_from_inside_target().IsEmpty()); |
- EXPECT_EQ(occlusion_inside_surface.ToString(), |
- occlusion.occlusion_from_outside_target().ToString()); |
- |
- // The surface has a background blur, so it needs pixels that are |
- // currently considered occluded in order to be drawn. So the pixels it |
- // needs should be removed some the occluded area so that when we get to |
- // the parent they are drawn. |
- this->VisitContributingSurface(filtered_surface, &occlusion); |
- this->EnterLayer(parent, &occlusion); |
- |
- gfx::Rect expected_occlusion = occlusion_rect; |
- switch (i) { |
- case LEFT: |
- expected_occlusion.Inset(0, 0, outset_right, 0); |
- break; |
- case RIGHT: |
- expected_occlusion.Inset(outset_right, 0, 0, 0); |
- break; |
- case TOP: |
- expected_occlusion.Inset(0, 0, 0, outset_right); |
- break; |
- case BOTTOM: |
- expected_occlusion.Inset(0, outset_right, 0, 0); |
- break; |
- } |
- |
- EXPECT_EQ(expected_occlusion.ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- EXPECT_TRUE(occlusion.occlusion_from_outside_target().IsEmpty()); |
- |
- this->DestroyLayers(); |
- } |
- } |
-}; |
- |
-ALL_OCCLUSIONTRACKER_TEST( |
- OcclusionTrackerTestDontOccludePixelsNeededForBackgroundFilter); |
- |
-template <class Types> |
-class OcclusionTrackerTestTwoBackgroundFiltersReduceOcclusionTwice |
- : public OcclusionTrackerTest<Types> { |
- protected: |
- explicit OcclusionTrackerTestTwoBackgroundFiltersReduceOcclusionTwice( |
- bool opaque_layers) |
- : OcclusionTrackerTest<Types>(opaque_layers) {} |
- void RunMyTest() override { |
- gfx::Transform scale_by_half; |
- scale_by_half.Scale(0.5, 0.5); |
- |
- // Makes two surfaces that completely cover |parent|. The occlusion both |
- // above and below the filters will be reduced by each of them. |
- typename Types::ContentLayerType* root = this->CreateRoot( |
- this->identity_matrix, gfx::PointF(), gfx::Size(75, 75)); |
- typename Types::LayerType* parent = this->CreateSurface( |
- root, scale_by_half, gfx::PointF(), gfx::Size(150, 150)); |
- parent->SetMasksToBounds(true); |
- typename Types::LayerType* filtered_surface1 = this->CreateDrawingLayer( |
- parent, scale_by_half, gfx::PointF(), gfx::Size(300, 300), false); |
- typename Types::LayerType* filtered_surface2 = this->CreateDrawingLayer( |
- parent, scale_by_half, gfx::PointF(), gfx::Size(300, 300), false); |
- typename Types::LayerType* occluding_layer_above = |
- this->CreateDrawingLayer(parent, |
- this->identity_matrix, |
- gfx::PointF(100.f, 100.f), |
- gfx::Size(50, 50), |
- true); |
- |
- // Filters make the layers own surfaces. |
- Types::SetForceRenderSurface(filtered_surface1, true); |
- Types::SetForceRenderSurface(filtered_surface2, true); |
- FilterOperations filters; |
- filters.Append(FilterOperation::CreateBlurFilter(1.f)); |
- filtered_surface1->SetBackgroundFilters(filters); |
- filtered_surface2->SetBackgroundFilters(filters); |
- |
- // Save the distance of influence for the blur effect. |
- int outset_top, outset_right, outset_bottom, outset_left; |
- filters.GetOutsets( |
- &outset_top, &outset_right, &outset_bottom, &outset_left); |
- |
- this->CalcDrawEtc(root); |
- |
- TestOcclusionTrackerWithClip<typename Types::LayerType> occlusion( |
- gfx::Rect(0, 0, 1000, 1000)); |
- |
- this->VisitLayer(occluding_layer_above, &occlusion); |
- EXPECT_EQ(gfx::Rect().ToString(), |
- occlusion.occlusion_from_outside_target().ToString()); |
- EXPECT_EQ(gfx::Rect(100 / 2, 100 / 2, 50 / 2, 50 / 2).ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- |
- this->VisitLayer(filtered_surface2, &occlusion); |
- this->VisitContributingSurface(filtered_surface2, &occlusion); |
- this->VisitLayer(filtered_surface1, &occlusion); |
- this->VisitContributingSurface(filtered_surface1, &occlusion); |
- |
- // Test expectations in the target. |
- gfx::Rect expected_occlusion = |
- gfx::Rect(100 / 2 + outset_right * 2, |
- 100 / 2 + outset_bottom * 2, |
- 50 / 2 - (outset_left + outset_right) * 2, |
- 50 / 2 - (outset_top + outset_bottom) * 2); |
- EXPECT_EQ(expected_occlusion.ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- |
- // Test expectations in the screen are the same as in the target, as the |
- // render surface is 1:1 with the screen. |
- EXPECT_EQ(expected_occlusion.ToString(), |
- occlusion.occlusion_from_outside_target().ToString()); |
- } |
-}; |
- |
-ALL_OCCLUSIONTRACKER_TEST( |
- OcclusionTrackerTestTwoBackgroundFiltersReduceOcclusionTwice); |
- |
-template <class Types> |
-class OcclusionTrackerTestDontReduceOcclusionBelowBackgroundFilter |
- : public OcclusionTrackerTest<Types> { |
- protected: |
- explicit OcclusionTrackerTestDontReduceOcclusionBelowBackgroundFilter( |
- bool opaque_layers) |
- : OcclusionTrackerTest<Types>(opaque_layers) {} |
- void RunMyTest() override { |
- gfx::Transform scale_by_half; |
- scale_by_half.Scale(0.5, 0.5); |
- |
- // Make a surface and its replica, each 50x50, with a smaller 30x30 layer |
- // centered below each. The surface is scaled to test that the pixel moving |
- // is done in the target space, where the background filter is applied, but |
- // the surface appears at 50, 50 and the replica at 200, 50. |
- typename Types::ContentLayerType* parent = this->CreateRoot( |
- this->identity_matrix, gfx::PointF(), gfx::Size(300, 150)); |
- typename Types::LayerType* behind_surface_layer = |
- this->CreateDrawingLayer(parent, |
- this->identity_matrix, |
- gfx::PointF(60.f, 60.f), |
- gfx::Size(30, 30), |
- true); |
- typename Types::LayerType* behind_replica_layer = |
- this->CreateDrawingLayer(parent, |
- this->identity_matrix, |
- gfx::PointF(210.f, 60.f), |
- gfx::Size(30, 30), |
- true); |
- typename Types::LayerType* filtered_surface = |
- this->CreateDrawingLayer(parent, |
- scale_by_half, |
- gfx::PointF(50.f, 50.f), |
- gfx::Size(100, 100), |
- false); |
- this->CreateReplicaLayer(filtered_surface, |
- this->identity_matrix, |
- gfx::PointF(300.f, 0.f), |
- gfx::Size()); |
- |
- // Filters make the layer own a surface. |
- Types::SetForceRenderSurface(filtered_surface, true); |
- FilterOperations filters; |
- filters.Append(FilterOperation::CreateBlurFilter(3.f)); |
- filtered_surface->SetBackgroundFilters(filters); |
- |
- this->CalcDrawEtc(parent); |
- |
- TestOcclusionTrackerWithClip<typename Types::LayerType> occlusion( |
- gfx::Rect(0, 0, 1000, 1000)); |
- |
- // The surface has a background blur, so it blurs non-opaque pixels below |
- // it. |
- this->VisitLayer(filtered_surface, &occlusion); |
- this->VisitContributingSurface(filtered_surface, &occlusion); |
- |
- this->VisitLayer(behind_replica_layer, &occlusion); |
- |
- // The layers behind the surface are not blurred, and their occlusion does |
- // not change, until we leave the surface. So it should not be modified by |
- // the filter here. |
- gfx::Rect occlusion_behind_replica = gfx::Rect(210, 60, 30, 30); |
- EXPECT_EQ(occlusion_behind_replica.ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- EXPECT_TRUE(occlusion.occlusion_from_outside_target().IsEmpty()); |
- |
- // Clear the occlusion so the |behind_surface_layer| can add its occlusion |
- // without existing occlusion interfering. |
- occlusion.set_occlusion_from_inside_target(SimpleEnclosedRegion()); |
- |
- this->VisitLayer(behind_surface_layer, &occlusion); |
- |
- // The layers behind the surface are not blurred, and their occlusion does |
- // not change, until we leave the surface. So it should not be modified by |
- // the filter here. |
- gfx::Rect occlusion_behind_surface = gfx::Rect(60, 60, 30, 30); |
- EXPECT_EQ(occlusion_behind_surface.ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- EXPECT_TRUE(occlusion.occlusion_from_outside_target().IsEmpty()); |
- } |
-}; |
- |
-ALL_OCCLUSIONTRACKER_TEST( |
- OcclusionTrackerTestDontReduceOcclusionBelowBackgroundFilter); |
- |
-template <class Types> |
-class OcclusionTrackerTestDontReduceOcclusionIfBackgroundFilterIsOccluded |
- : public OcclusionTrackerTest<Types> { |
- protected: |
- explicit OcclusionTrackerTestDontReduceOcclusionIfBackgroundFilterIsOccluded( |
- bool opaque_layers) |
- : OcclusionTrackerTest<Types>(opaque_layers) {} |
- void RunMyTest() override { |
- gfx::Transform scale_by_half; |
- scale_by_half.Scale(0.5, 0.5); |
- |
- // Make a 50x50 filtered surface that is completely occluded by an opaque |
- // layer which is above it in the z-order. The surface is |
- // scaled to test that the pixel moving is done in the target space, where |
- // the background filter is applied, but the surface appears at 50, 50. |
- typename Types::ContentLayerType* parent = this->CreateRoot( |
- this->identity_matrix, gfx::PointF(), gfx::Size(200, 150)); |
- typename Types::LayerType* filtered_surface = |
- this->CreateDrawingLayer(parent, |
- scale_by_half, |
- gfx::PointF(50.f, 50.f), |
- gfx::Size(100, 100), |
- false); |
- typename Types::LayerType* occluding_layer = |
- this->CreateDrawingLayer(parent, |
- this->identity_matrix, |
- gfx::PointF(50.f, 50.f), |
- gfx::Size(50, 50), |
- true); |
- |
- // Filters make the layer own a surface. |
- Types::SetForceRenderSurface(filtered_surface, true); |
- FilterOperations filters; |
- filters.Append(FilterOperation::CreateBlurFilter(3.f)); |
- filtered_surface->SetBackgroundFilters(filters); |
- |
- this->CalcDrawEtc(parent); |
- |
- TestOcclusionTrackerWithClip<typename Types::LayerType> occlusion( |
- gfx::Rect(0, 0, 1000, 1000)); |
- |
- this->VisitLayer(occluding_layer, &occlusion); |
- |
- this->VisitLayer(filtered_surface, &occlusion); |
- { |
- // The layers above the filtered surface occlude from outside. |
- gfx::Rect occlusion_above_surface = gfx::Rect(0, 0, 50, 50); |
- |
- EXPECT_EQ(gfx::Rect().ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- EXPECT_EQ(occlusion_above_surface.ToString(), |
- occlusion.occlusion_from_outside_target().ToString()); |
- } |
- |
- // The surface has a background blur, so it blurs non-opaque pixels below |
- // it. |
- this->VisitContributingSurface(filtered_surface, &occlusion); |
- { |
- // The filter is completely occluded, so it should not blur anything and |
- // reduce any occlusion. |
- gfx::Rect occlusion_above_surface = gfx::Rect(50, 50, 50, 50); |
- |
- EXPECT_EQ(occlusion_above_surface.ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- EXPECT_EQ(gfx::Rect().ToString(), |
- occlusion.occlusion_from_outside_target().ToString()); |
- } |
- } |
-}; |
- |
-ALL_OCCLUSIONTRACKER_TEST( |
- OcclusionTrackerTestDontReduceOcclusionIfBackgroundFilterIsOccluded); |
- |
-template <class Types> |
-class OcclusionTrackerTestReduceOcclusionWhenBackgroundFilterIsPartiallyOccluded |
- : public OcclusionTrackerTest<Types> { |
- protected: |
- explicit |
- OcclusionTrackerTestReduceOcclusionWhenBackgroundFilterIsPartiallyOccluded( |
- bool opaque_layers) |
- : OcclusionTrackerTest<Types>(opaque_layers) {} |
- void RunMyTest() override { |
- gfx::Transform scale_by_half; |
- scale_by_half.Scale(0.5, 0.5); |
- |
- // Make a surface and its replica, each 50x50, that are partially occluded |
- // by opaque layers which are above them in the z-order. The surface is |
- // scaled to test that the pixel moving is done in the target space, where |
- // the background filter is applied, but the surface appears at 50, 50 and |
- // the replica at 200, 50. |
- typename Types::ContentLayerType* parent = this->CreateRoot( |
- this->identity_matrix, gfx::PointF(), gfx::Size(300, 150)); |
- typename Types::LayerType* filtered_surface = |
- this->CreateDrawingLayer(parent, |
- scale_by_half, |
- gfx::PointF(50.f, 50.f), |
- gfx::Size(100, 100), |
- false); |
- this->CreateReplicaLayer(filtered_surface, |
- this->identity_matrix, |
- gfx::PointF(300.f, 0.f), |
- gfx::Size()); |
- typename Types::LayerType* above_surface_layer = |
- this->CreateDrawingLayer(parent, |
- this->identity_matrix, |
- gfx::PointF(70.f, 50.f), |
- gfx::Size(30, 50), |
- true); |
- typename Types::LayerType* above_replica_layer = |
- this->CreateDrawingLayer(parent, |
- this->identity_matrix, |
- gfx::PointF(200.f, 50.f), |
- gfx::Size(30, 50), |
- true); |
- typename Types::LayerType* beside_surface_layer = |
- this->CreateDrawingLayer(parent, |
- this->identity_matrix, |
- gfx::PointF(90.f, 40.f), |
- gfx::Size(10, 10), |
- true); |
- typename Types::LayerType* beside_replica_layer = |
- this->CreateDrawingLayer(parent, |
- this->identity_matrix, |
- gfx::PointF(200.f, 40.f), |
- gfx::Size(10, 10), |
- true); |
- |
- // Filters make the layer own a surface. |
- Types::SetForceRenderSurface(filtered_surface, true); |
- FilterOperations filters; |
- filters.Append(FilterOperation::CreateBlurFilter(3.f)); |
- filtered_surface->SetBackgroundFilters(filters); |
- |
- // Save the distance of influence for the blur effect. |
- int outset_top, outset_right, outset_bottom, outset_left; |
- filters.GetOutsets( |
- &outset_top, &outset_right, &outset_bottom, &outset_left); |
- |
- this->CalcDrawEtc(parent); |
- |
- TestOcclusionTrackerWithClip<typename Types::LayerType> occlusion( |
- gfx::Rect(0, 0, 1000, 1000)); |
- |
- this->VisitLayer(beside_replica_layer, &occlusion); |
- this->VisitLayer(beside_surface_layer, &occlusion); |
- this->VisitLayer(above_replica_layer, &occlusion); |
- this->VisitLayer(above_surface_layer, &occlusion); |
- |
- // The surface has a background blur, so it blurs non-opaque pixels below |
- // it. |
- this->VisitLayer(filtered_surface, &occlusion); |
- this->VisitContributingSurface(filtered_surface, &occlusion); |
- |
- // The filter in the surface and replica are partially unoccluded. Only the |
- // unoccluded parts should reduce occlusion. This means it will push back |
- // the occlusion that touches the unoccluded part (occlusion_above___), but |
- // it will not touch occlusion_beside____ since that is not beside the |
- // unoccluded part of the surface, even though it is beside the occluded |
- // part of the surface. |
- gfx::Rect occlusion_above_surface = |
- gfx::Rect(70 + outset_right, 50, 30 - outset_right, 50); |
- gfx::Rect occlusion_above_replica = |
- gfx::Rect(200, 50, 30 - outset_left, 50); |
- gfx::Rect occlusion_beside_surface = gfx::Rect(90, 40, 10, 10); |
- gfx::Rect occlusion_beside_replica = gfx::Rect(200, 40, 10, 10); |
- |
- SimpleEnclosedRegion expected_occlusion; |
- expected_occlusion.Union(occlusion_beside_replica); |
- expected_occlusion.Union(occlusion_beside_surface); |
- expected_occlusion.Union(occlusion_above_replica); |
- expected_occlusion.Union(occlusion_above_surface); |
- |
- EXPECT_EQ(expected_occlusion.ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- EXPECT_TRUE(occlusion.occlusion_from_outside_target().IsEmpty()); |
- |
- const SimpleEnclosedRegion& actual_occlusion = |
- occlusion.occlusion_from_inside_target(); |
- for (size_t i = 0; i < expected_occlusion.GetRegionComplexity(); ++i) { |
- ASSERT_LT(i, actual_occlusion.GetRegionComplexity()); |
- EXPECT_EQ(expected_occlusion.GetRect(i), actual_occlusion.GetRect(i)); |
- } |
- } |
-}; |
- |
-ALL_OCCLUSIONTRACKER_TEST( |
- OcclusionTrackerTestReduceOcclusionWhenBackgroundFilterIsPartiallyOccluded); |
- |
-template <class Types> |
-class OcclusionTrackerTestBlendModeDoesNotOcclude |
- : public OcclusionTrackerTest<Types> { |
- protected: |
- explicit OcclusionTrackerTestBlendModeDoesNotOcclude(bool opaque_layers) |
- : OcclusionTrackerTest<Types>(opaque_layers) {} |
- void RunMyTest() override { |
- typename Types::ContentLayerType* parent = this->CreateRoot( |
- this->identity_matrix, gfx::PointF(), gfx::Size(100, 100)); |
- typename Types::LayerType* blend_mode_layer = this->CreateDrawingLayer( |
- parent, this->identity_matrix, gfx::PointF(0.f, 0.f), |
- gfx::Size(100, 100), true); |
- typename Types::LayerType* top_layer = this->CreateDrawingLayer( |
- parent, this->identity_matrix, gfx::PointF(10.f, 12.f), |
- gfx::Size(20, 22), true); |
- |
- // Blend mode makes the layer own a surface. |
- Types::SetForceRenderSurface(blend_mode_layer, true); |
- blend_mode_layer->SetBlendMode(SkXfermode::kMultiply_Mode); |
- |
- this->CalcDrawEtc(parent); |
- |
- TestOcclusionTrackerWithClip<typename Types::LayerType> occlusion( |
- gfx::Rect(0, 0, 1000, 1000)); |
- |
- this->VisitLayer(top_layer, &occlusion); |
- // |top_layer| occludes. |
- EXPECT_EQ(gfx::Rect(10, 12, 20, 22).ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- EXPECT_TRUE(occlusion.occlusion_from_outside_target().IsEmpty()); |
- |
- this->VisitLayer(blend_mode_layer, &occlusion); |
- // |top_layer| occludes but not |blend_mode_layer|. |
- EXPECT_EQ(gfx::Rect(10, 12, 20, 22).ToString(), |
- occlusion.occlusion_from_outside_target().ToString()); |
- EXPECT_TRUE(occlusion.occlusion_from_inside_target().IsEmpty()); |
- |
- this->VisitContributingSurface(blend_mode_layer, &occlusion); |
- // |top_layer| occludes but not |blend_mode_layer|. |
- EXPECT_EQ(gfx::Rect(10, 12, 20, 22).ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- EXPECT_TRUE(occlusion.occlusion_from_outside_target().IsEmpty()); |
- } |
-}; |
- |
-ALL_OCCLUSIONTRACKER_TEST(OcclusionTrackerTestBlendModeDoesNotOcclude); |
- |
-template <class Types> |
-class OcclusionTrackerTestMinimumTrackingSize |
- : public OcclusionTrackerTest<Types> { |
- protected: |
- explicit OcclusionTrackerTestMinimumTrackingSize(bool opaque_layers) |
- : OcclusionTrackerTest<Types>(opaque_layers) {} |
- void RunMyTest() override { |
- gfx::Size tracking_size(100, 100); |
- gfx::Size below_tracking_size(99, 99); |
- |
- typename Types::ContentLayerType* parent = this->CreateRoot( |
- this->identity_matrix, gfx::PointF(), gfx::Size(400, 400)); |
- typename Types::LayerType* large = this->CreateDrawingLayer( |
- parent, this->identity_matrix, gfx::PointF(), tracking_size, true); |
- typename Types::LayerType* small = |
- this->CreateDrawingLayer(parent, |
- this->identity_matrix, |
- gfx::PointF(), |
- below_tracking_size, |
- true); |
- this->CalcDrawEtc(parent); |
- |
- TestOcclusionTrackerWithClip<typename Types::LayerType> occlusion( |
- gfx::Rect(0, 0, 1000, 1000)); |
- occlusion.set_minimum_tracking_size(tracking_size); |
- |
- // The small layer is not tracked because it is too small. |
- this->VisitLayer(small, &occlusion); |
- |
- EXPECT_EQ(gfx::Rect().ToString(), |
- occlusion.occlusion_from_outside_target().ToString()); |
- EXPECT_EQ(gfx::Rect().ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- |
- // The large layer is tracked as it is large enough. |
- this->VisitLayer(large, &occlusion); |
- |
- EXPECT_EQ(gfx::Rect().ToString(), |
- occlusion.occlusion_from_outside_target().ToString()); |
- EXPECT_EQ(gfx::Rect(tracking_size).ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- } |
-}; |
- |
-ALL_OCCLUSIONTRACKER_TEST(OcclusionTrackerTestMinimumTrackingSize); |
- |
-template <class Types> |
-class OcclusionTrackerTestScaledLayerIsClipped |
- : public OcclusionTrackerTest<Types> { |
- protected: |
- explicit OcclusionTrackerTestScaledLayerIsClipped(bool opaque_layers) |
- : OcclusionTrackerTest<Types>(opaque_layers) {} |
- void RunMyTest() override { |
- gfx::Transform scale_transform; |
- scale_transform.Scale(512.0, 512.0); |
- |
- typename Types::ContentLayerType* parent = this->CreateRoot( |
- this->identity_matrix, gfx::PointF(), gfx::Size(400, 400)); |
- typename Types::LayerType* clip = this->CreateLayer(parent, |
- this->identity_matrix, |
- gfx::PointF(10.f, 10.f), |
- gfx::Size(50, 50)); |
- clip->SetMasksToBounds(true); |
- typename Types::LayerType* scale = this->CreateLayer( |
- clip, scale_transform, gfx::PointF(), gfx::Size(1, 1)); |
- typename Types::LayerType* scaled = this->CreateDrawingLayer( |
- scale, this->identity_matrix, gfx::PointF(), gfx::Size(500, 500), true); |
- this->CalcDrawEtc(parent); |
- |
- TestOcclusionTrackerWithClip<typename Types::LayerType> occlusion( |
- gfx::Rect(0, 0, 1000, 1000)); |
- |
- this->VisitLayer(scaled, &occlusion); |
- |
- EXPECT_EQ(gfx::Rect().ToString(), |
- occlusion.occlusion_from_outside_target().ToString()); |
- EXPECT_EQ(gfx::Rect(10, 10, 50, 50).ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- } |
-}; |
- |
-ALL_OCCLUSIONTRACKER_TEST(OcclusionTrackerTestScaledLayerIsClipped) |
- |
-template <class Types> |
-class OcclusionTrackerTestScaledLayerInSurfaceIsClipped |
- : public OcclusionTrackerTest<Types> { |
- protected: |
- explicit OcclusionTrackerTestScaledLayerInSurfaceIsClipped(bool opaque_layers) |
- : OcclusionTrackerTest<Types>(opaque_layers) {} |
- void RunMyTest() override { |
- gfx::Transform scale_transform; |
- scale_transform.Scale(512.0, 512.0); |
- |
- typename Types::ContentLayerType* parent = this->CreateRoot( |
- this->identity_matrix, gfx::PointF(), gfx::Size(400, 400)); |
- typename Types::LayerType* clip = this->CreateLayer(parent, |
- this->identity_matrix, |
- gfx::PointF(10.f, 10.f), |
- gfx::Size(50, 50)); |
- clip->SetMasksToBounds(true); |
- typename Types::LayerType* surface = this->CreateDrawingSurface( |
- clip, this->identity_matrix, gfx::PointF(), gfx::Size(400, 30), false); |
- typename Types::LayerType* scale = this->CreateLayer( |
- surface, scale_transform, gfx::PointF(), gfx::Size(1, 1)); |
- typename Types::LayerType* scaled = this->CreateDrawingLayer( |
- scale, this->identity_matrix, gfx::PointF(), gfx::Size(500, 500), true); |
- this->CalcDrawEtc(parent); |
- |
- TestOcclusionTrackerWithClip<typename Types::LayerType> occlusion( |
- gfx::Rect(0, 0, 1000, 1000)); |
- |
- this->VisitLayer(scaled, &occlusion); |
- this->VisitLayer(surface, &occlusion); |
- this->VisitContributingSurface(surface, &occlusion); |
- |
- EXPECT_EQ(gfx::Rect().ToString(), |
- occlusion.occlusion_from_outside_target().ToString()); |
- EXPECT_EQ(gfx::Rect(10, 10, 50, 50).ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- } |
-}; |
- |
-ALL_OCCLUSIONTRACKER_TEST(OcclusionTrackerTestScaledLayerInSurfaceIsClipped) |
- |
-template <class Types> |
-class OcclusionTrackerTestCopyRequestDoesOcclude |
- : public OcclusionTrackerTest<Types> { |
- protected: |
- explicit OcclusionTrackerTestCopyRequestDoesOcclude(bool opaque_layers) |
- : OcclusionTrackerTest<Types>(opaque_layers) {} |
- void RunMyTest() override { |
- typename Types::ContentLayerType* root = this->CreateRoot( |
- this->identity_matrix, gfx::Point(), gfx::Size(400, 400)); |
- typename Types::ContentLayerType* parent = this->CreateDrawingLayer( |
- root, this->identity_matrix, gfx::Point(), gfx::Size(400, 400), true); |
- typename Types::LayerType* copy = this->CreateLayer(parent, |
- this->identity_matrix, |
- gfx::Point(100, 0), |
- gfx::Size(200, 400)); |
- this->AddCopyRequest(copy); |
- typename Types::LayerType* copy_child = this->CreateDrawingLayer( |
- copy, |
- this->identity_matrix, |
- gfx::PointF(), |
- gfx::Size(200, 400), |
- true); |
- typename Types::LayerType* top_layer = |
- this->CreateDrawingLayer(root, this->identity_matrix, |
- gfx::PointF(50, 0), gfx::Size(50, 400), true); |
- this->CalcDrawEtc(root); |
- |
- TestOcclusionTrackerWithClip<typename Types::LayerType> occlusion( |
- gfx::Rect(0, 0, 1000, 1000)); |
- |
- this->VisitLayer(top_layer, &occlusion); |
- EXPECT_EQ(gfx::Rect().ToString(), |
- occlusion.occlusion_from_outside_target().ToString()); |
- EXPECT_EQ(gfx::Rect(50, 0, 50, 400).ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- |
- this->VisitLayer(copy_child, &occlusion); |
- // Layers outside the copy request do not occlude. |
- EXPECT_EQ(gfx::Rect().ToString(), |
- occlusion.occlusion_from_outside_target().ToString()); |
- EXPECT_EQ(gfx::Rect(200, 400).ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- |
- // CopyRequests cause the layer to own a surface. |
- this->VisitContributingSurface(copy, &occlusion); |
- |
- // The occlusion from the copy should be kept. |
- EXPECT_EQ(gfx::Rect().ToString(), |
- occlusion.occlusion_from_outside_target().ToString()); |
- EXPECT_EQ(gfx::Rect(50, 0, 250, 400).ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- } |
-}; |
- |
-ALL_OCCLUSIONTRACKER_TEST(OcclusionTrackerTestCopyRequestDoesOcclude) |
- |
-template <class Types> |
-class OcclusionTrackerTestHiddenCopyRequestDoesNotOcclude |
- : public OcclusionTrackerTest<Types> { |
- protected: |
- explicit OcclusionTrackerTestHiddenCopyRequestDoesNotOcclude( |
- bool opaque_layers) |
- : OcclusionTrackerTest<Types>(opaque_layers) {} |
- void RunMyTest() override { |
- typename Types::ContentLayerType* root = this->CreateRoot( |
- this->identity_matrix, gfx::Point(), gfx::Size(400, 400)); |
- typename Types::ContentLayerType* parent = this->CreateDrawingLayer( |
- root, this->identity_matrix, gfx::Point(), gfx::Size(400, 400), true); |
- typename Types::LayerType* hide = this->CreateLayer( |
- parent, this->identity_matrix, gfx::Point(), gfx::Size()); |
- typename Types::LayerType* copy = this->CreateLayer( |
- hide, this->identity_matrix, gfx::Point(100, 0), gfx::Size(200, 400)); |
- this->AddCopyRequest(copy); |
- typename Types::LayerType* copy_child = this->CreateDrawingLayer( |
- copy, this->identity_matrix, gfx::PointF(), gfx::Size(200, 400), true); |
- |
- // The |copy| layer is hidden but since it is being copied, it will be |
- // drawn. |
- hide->SetHideLayerAndSubtree(true); |
- |
- this->CalcDrawEtc(root); |
- |
- TestOcclusionTrackerWithClip<typename Types::LayerType> occlusion( |
- gfx::Rect(0, 0, 1000, 1000)); |
- |
- this->VisitLayer(copy_child, &occlusion); |
- EXPECT_EQ(gfx::Rect().ToString(), |
- occlusion.occlusion_from_outside_target().ToString()); |
- EXPECT_EQ(gfx::Rect(200, 400).ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- |
- // CopyRequests cause the layer to own a surface. |
- this->VisitContributingSurface(copy, &occlusion); |
- |
- // The occlusion from the copy should be dropped since it is hidden. |
- EXPECT_EQ(gfx::Rect().ToString(), |
- occlusion.occlusion_from_outside_target().ToString()); |
- EXPECT_EQ(gfx::Rect().ToString(), |
- occlusion.occlusion_from_inside_target().ToString()); |
- } |
-}; |
- |
-ALL_OCCLUSIONTRACKER_TEST(OcclusionTrackerTestHiddenCopyRequestDoesNotOcclude) |
- |
-template <class Types> |
-class OcclusionTrackerTestOccludedLayer : public OcclusionTrackerTest<Types> { |
- protected: |
- explicit OcclusionTrackerTestOccludedLayer(bool opaque_layers) |
- : OcclusionTrackerTest<Types>(opaque_layers) {} |
- void RunMyTest() override { |
- gfx::Transform translate; |
- translate.Translate(10.0, 20.0); |
- typename Types::ContentLayerType* root = this->CreateRoot( |
- this->identity_matrix, gfx::Point(), gfx::Size(200, 200)); |
- typename Types::LayerType* surface = this->CreateSurface( |
- root, this->identity_matrix, gfx::Point(), gfx::Size(200, 200)); |
- typename Types::LayerType* layer = this->CreateDrawingLayer( |
- surface, translate, gfx::Point(), gfx::Size(200, 200), false); |
- typename Types::ContentLayerType* outside_layer = this->CreateDrawingLayer( |
- root, this->identity_matrix, gfx::Point(), gfx::Size(200, 200), false); |
- this->CalcDrawEtc(root); |
- |
- TestOcclusionTrackerWithClip<typename Types::LayerType> occlusion( |
- gfx::Rect(0, 0, 200, 200)); |
- this->VisitLayer(outside_layer, &occlusion); |
- this->EnterLayer(layer, &occlusion); |
- |
- // No occlusion, is not occluded. |
- occlusion.set_occlusion_from_outside_target(SimpleEnclosedRegion()); |
- occlusion.set_occlusion_from_inside_target(SimpleEnclosedRegion()); |
- EXPECT_FALSE(occlusion.OccludedLayer(layer, gfx::Rect(100, 100))); |
- |
- // Partial occlusion from outside, is not occluded. |
- occlusion.set_occlusion_from_outside_target( |
- SimpleEnclosedRegion(50, 50, 100, 100)); |
- occlusion.set_occlusion_from_inside_target(SimpleEnclosedRegion()); |
- EXPECT_FALSE(occlusion.OccludedLayer(layer, gfx::Rect(0, 0, 100, 100))); |
- EXPECT_FALSE(occlusion.OccludedLayer(layer, gfx::Rect(90, 30, 100, 100))); |
- EXPECT_FALSE(occlusion.OccludedLayer(layer, gfx::Rect(40, 0, 100, 100))); |
- EXPECT_FALSE(occlusion.OccludedLayer(layer, gfx::Rect(40, 80, 100, 100))); |
- EXPECT_FALSE(occlusion.OccludedLayer(layer, gfx::Rect(0, 0, 80, 100))); |
- EXPECT_FALSE(occlusion.OccludedLayer(layer, gfx::Rect(90, 80, 100, 100))); |
- EXPECT_FALSE(occlusion.OccludedLayer(layer, gfx::Rect(0, 80, 100, 100))); |
- EXPECT_FALSE(occlusion.OccludedLayer(layer, gfx::Rect(90, 0, 100, 100))); |
- |
- // Full occlusion from outside, is occluded. |
- EXPECT_TRUE(occlusion.OccludedLayer(layer, gfx::Rect(40, 30, 100, 100))); |
- EXPECT_TRUE(occlusion.OccludedLayer(layer, gfx::Rect(40, 30, 10, 10))); |
- EXPECT_TRUE(occlusion.OccludedLayer(layer, gfx::Rect(130, 120, 10, 10))); |
- EXPECT_TRUE(occlusion.OccludedLayer(layer, gfx::Rect(80, 70, 50, 50))); |
- |
- // Partial occlusion from inside, is not occluded. |
- occlusion.set_occlusion_from_outside_target(SimpleEnclosedRegion()); |
- occlusion.set_occlusion_from_inside_target( |
- SimpleEnclosedRegion(50, 50, 100, 100)); |
- EXPECT_FALSE(occlusion.OccludedLayer(layer, gfx::Rect(0, 0, 100, 100))); |
- EXPECT_FALSE(occlusion.OccludedLayer(layer, gfx::Rect(90, 30, 100, 100))); |
- EXPECT_FALSE(occlusion.OccludedLayer(layer, gfx::Rect(40, 0, 100, 100))); |
- EXPECT_FALSE(occlusion.OccludedLayer(layer, gfx::Rect(40, 80, 100, 100))); |
- EXPECT_FALSE(occlusion.OccludedLayer(layer, gfx::Rect(0, 0, 80, 100))); |
- EXPECT_FALSE(occlusion.OccludedLayer(layer, gfx::Rect(90, 80, 100, 100))); |
- EXPECT_FALSE(occlusion.OccludedLayer(layer, gfx::Rect(0, 80, 100, 100))); |
- EXPECT_FALSE(occlusion.OccludedLayer(layer, gfx::Rect(90, 0, 100, 100))); |
- |
- // Full occlusion from inside, is occluded. |
- EXPECT_TRUE(occlusion.OccludedLayer(layer, gfx::Rect(40, 30, 100, 100))); |
- EXPECT_TRUE(occlusion.OccludedLayer(layer, gfx::Rect(40, 30, 10, 10))); |
- EXPECT_TRUE(occlusion.OccludedLayer(layer, gfx::Rect(130, 120, 10, 10))); |
- EXPECT_TRUE(occlusion.OccludedLayer(layer, gfx::Rect(80, 70, 50, 50))); |
- |
- // Partial occlusion from both, is not occluded. |
- occlusion.set_occlusion_from_outside_target( |
- SimpleEnclosedRegion(50, 50, 100, 50)); |
- occlusion.set_occlusion_from_inside_target( |
- SimpleEnclosedRegion(50, 100, 100, 50)); |
- EXPECT_FALSE(occlusion.OccludedLayer(layer, gfx::Rect(0, 0, 100, 100))); |
- EXPECT_FALSE(occlusion.OccludedLayer(layer, gfx::Rect(90, 30, 100, 100))); |
- EXPECT_FALSE(occlusion.OccludedLayer(layer, gfx::Rect(40, 0, 100, 100))); |
- EXPECT_FALSE(occlusion.OccludedLayer(layer, gfx::Rect(40, 80, 100, 100))); |
- EXPECT_FALSE(occlusion.OccludedLayer(layer, gfx::Rect(0, 0, 80, 100))); |
- EXPECT_FALSE(occlusion.OccludedLayer(layer, gfx::Rect(90, 80, 100, 100))); |
- EXPECT_FALSE(occlusion.OccludedLayer(layer, gfx::Rect(0, 80, 100, 100))); |
- EXPECT_FALSE(occlusion.OccludedLayer(layer, gfx::Rect(90, 0, 100, 100))); |
- |
- // Full occlusion from both, is occluded. |
- EXPECT_TRUE(occlusion.OccludedLayer(layer, gfx::Rect(40, 30, 100, 100))); |
- EXPECT_TRUE(occlusion.OccludedLayer(layer, gfx::Rect(40, 30, 10, 10))); |
- EXPECT_TRUE(occlusion.OccludedLayer(layer, gfx::Rect(130, 120, 10, 10))); |
- EXPECT_TRUE(occlusion.OccludedLayer(layer, gfx::Rect(80, 70, 50, 50))); |
- } |
-}; |
- |
-ALL_OCCLUSIONTRACKER_TEST(OcclusionTrackerTestOccludedLayer) |
- |
-template <class Types> |
-class OcclusionTrackerTestUnoccludedLayerQuery |
- : public OcclusionTrackerTest<Types> { |
- protected: |
- explicit OcclusionTrackerTestUnoccludedLayerQuery(bool opaque_layers) |
- : OcclusionTrackerTest<Types>(opaque_layers) {} |
- void RunMyTest() override { |
- gfx::Transform translate; |
- translate.Translate(10.0, 20.0); |
- typename Types::ContentLayerType* root = this->CreateRoot( |
- this->identity_matrix, gfx::Point(), gfx::Size(200, 200)); |
- typename Types::LayerType* surface = this->CreateSurface( |
- root, this->identity_matrix, gfx::Point(), gfx::Size(200, 200)); |
- typename Types::LayerType* layer = this->CreateDrawingLayer( |
- surface, translate, gfx::Point(), gfx::Size(200, 200), false); |
- typename Types::ContentLayerType* outside_layer = this->CreateDrawingLayer( |
- root, this->identity_matrix, gfx::Point(), gfx::Size(200, 200), false); |
- this->CalcDrawEtc(root); |
- |
- TestOcclusionTrackerWithClip<typename Types::LayerType> occlusion( |
- gfx::Rect(0, 0, 200, 200)); |
- this->VisitLayer(outside_layer, &occlusion); |
- this->EnterLayer(layer, &occlusion); |
- |
- // No occlusion, is not occluded. |
- occlusion.set_occlusion_from_outside_target(SimpleEnclosedRegion()); |
- occlusion.set_occlusion_from_inside_target(SimpleEnclosedRegion()); |
- EXPECT_EQ(gfx::Rect(100, 100), |
- occlusion.UnoccludedLayerContentRect(layer, gfx::Rect(100, 100))); |
- |
- // Partial occlusion from outside. |
- occlusion.set_occlusion_from_outside_target( |
- SimpleEnclosedRegion(50, 50, 100, 100)); |
- occlusion.set_occlusion_from_inside_target(SimpleEnclosedRegion()); |
- EXPECT_EQ( |
- gfx::Rect(0, 0, 100, 100), |
- occlusion.UnoccludedLayerContentRect(layer, gfx::Rect(0, 0, 100, 100))); |
- EXPECT_EQ(gfx::Rect(140, 30, 50, 100), |
- occlusion.UnoccludedLayerContentRect( |
- layer, gfx::Rect(90, 30, 100, 100))); |
- EXPECT_EQ(gfx::Rect(40, 0, 100, 30), |
- occlusion.UnoccludedLayerContentRect(layer, |
- gfx::Rect(40, 0, 100, 100))); |
- EXPECT_EQ(gfx::Rect(40, 130, 100, 50), |
- occlusion.UnoccludedLayerContentRect( |
- layer, gfx::Rect(40, 80, 100, 100))); |
- EXPECT_EQ( |
- gfx::Rect(0, 0, 80, 100), |
- occlusion.UnoccludedLayerContentRect(layer, gfx::Rect(0, 0, 80, 100))); |
- EXPECT_EQ(gfx::Rect(90, 80, 100, 100), |
- occlusion.UnoccludedLayerContentRect( |
- layer, gfx::Rect(90, 80, 100, 100))); |
- EXPECT_EQ(gfx::Rect(0, 80, 100, 100), |
- occlusion.UnoccludedLayerContentRect(layer, |
- gfx::Rect(0, 80, 100, 100))); |
- EXPECT_EQ(gfx::Rect(90, 0, 100, 100), |
- occlusion.UnoccludedLayerContentRect(layer, |
- gfx::Rect(90, 0, 100, 100))); |
- |
- // Full occlusion from outside, is occluded. |
- EXPECT_EQ(gfx::Rect(), |
- occlusion.UnoccludedLayerContentRect( |
- layer, gfx::Rect(40, 30, 100, 100))); |
- EXPECT_EQ( |
- gfx::Rect(), |
- occlusion.UnoccludedLayerContentRect(layer, gfx::Rect(40, 30, 10, 10))); |
- EXPECT_EQ(gfx::Rect(), |
- occlusion.UnoccludedLayerContentRect( |
- layer, gfx::Rect(130, 120, 10, 10))); |
- EXPECT_EQ( |
- gfx::Rect(), |
- occlusion.UnoccludedLayerContentRect(layer, gfx::Rect(80, 70, 50, 50))); |
- |
- // Partial occlusion from inside, is not occluded. |
- occlusion.set_occlusion_from_outside_target(SimpleEnclosedRegion()); |
- occlusion.set_occlusion_from_inside_target( |
- SimpleEnclosedRegion(50, 50, 100, 100)); |
- EXPECT_EQ( |
- gfx::Rect(0, 0, 100, 100), |
- occlusion.UnoccludedLayerContentRect(layer, gfx::Rect(0, 0, 100, 100))); |
- EXPECT_EQ(gfx::Rect(140, 30, 50, 100), |
- occlusion.UnoccludedLayerContentRect( |
- layer, gfx::Rect(90, 30, 100, 100))); |
- EXPECT_EQ(gfx::Rect(40, 0, 100, 30), |
- occlusion.UnoccludedLayerContentRect(layer, |
- gfx::Rect(40, 0, 100, 100))); |
- EXPECT_EQ(gfx::Rect(40, 130, 100, 50), |
- occlusion.UnoccludedLayerContentRect( |
- layer, gfx::Rect(40, 80, 100, 100))); |
- EXPECT_EQ( |
- gfx::Rect(0, 0, 80, 100), |
- occlusion.UnoccludedLayerContentRect(layer, gfx::Rect(0, 0, 80, 100))); |
- EXPECT_EQ(gfx::Rect(90, 80, 100, 100), |
- occlusion.UnoccludedLayerContentRect( |
- layer, gfx::Rect(90, 80, 100, 100))); |
- EXPECT_EQ(gfx::Rect(0, 80, 100, 100), |
- occlusion.UnoccludedLayerContentRect(layer, |
- gfx::Rect(0, 80, 100, 100))); |
- EXPECT_EQ(gfx::Rect(90, 0, 100, 100), |
- occlusion.UnoccludedLayerContentRect(layer, |
- gfx::Rect(90, 0, 100, 100))); |
- |
- // Full occlusion from inside, is occluded. |
- EXPECT_EQ(gfx::Rect(), |
- occlusion.UnoccludedLayerContentRect( |
- layer, gfx::Rect(40, 30, 100, 100))); |
- EXPECT_EQ( |
- gfx::Rect(), |
- occlusion.UnoccludedLayerContentRect(layer, gfx::Rect(40, 30, 10, 10))); |
- EXPECT_EQ(gfx::Rect(), |
- occlusion.UnoccludedLayerContentRect( |
- layer, gfx::Rect(130, 120, 10, 10))); |
- EXPECT_EQ( |
- gfx::Rect(), |
- occlusion.UnoccludedLayerContentRect(layer, gfx::Rect(80, 70, 50, 50))); |
- |
- // Partial occlusion from both, is not occluded. |
- occlusion.set_occlusion_from_outside_target( |
- SimpleEnclosedRegion(50, 50, 100, 50)); |
- occlusion.set_occlusion_from_inside_target( |
- SimpleEnclosedRegion(50, 100, 100, 50)); |
- EXPECT_EQ( |
- gfx::Rect(0, 0, 100, 100), |
- occlusion.UnoccludedLayerContentRect(layer, gfx::Rect(0, 0, 100, 100))); |
- // This could be (140, 30, 50, 100). But because we do a lossy subtract, |
- // it's larger. |
- EXPECT_EQ(gfx::Rect(90, 30, 100, 100), |
- occlusion.UnoccludedLayerContentRect( |
- layer, gfx::Rect(90, 30, 100, 100))); |
- EXPECT_EQ(gfx::Rect(40, 0, 100, 30), |
- occlusion.UnoccludedLayerContentRect(layer, |
- gfx::Rect(40, 0, 100, 100))); |
- EXPECT_EQ(gfx::Rect(40, 130, 100, 50), |
- occlusion.UnoccludedLayerContentRect( |
- layer, gfx::Rect(40, 80, 100, 100))); |
- EXPECT_EQ( |
- gfx::Rect(0, 0, 80, 100), |
- occlusion.UnoccludedLayerContentRect(layer, gfx::Rect(0, 0, 80, 100))); |
- EXPECT_EQ(gfx::Rect(90, 80, 100, 100), |
- occlusion.UnoccludedLayerContentRect( |
- layer, gfx::Rect(90, 80, 100, 100))); |
- EXPECT_EQ(gfx::Rect(0, 80, 100, 100), |
- occlusion.UnoccludedLayerContentRect(layer, |
- gfx::Rect(0, 80, 100, 100))); |
- EXPECT_EQ(gfx::Rect(90, 0, 100, 100), |
- occlusion.UnoccludedLayerContentRect(layer, |
- gfx::Rect(90, 0, 100, 100))); |
- |
- // Full occlusion from both, is occluded. |
- EXPECT_EQ(gfx::Rect(), |
- occlusion.UnoccludedLayerContentRect( |
- layer, gfx::Rect(40, 30, 100, 100))); |
- EXPECT_EQ( |
- gfx::Rect(), |
- occlusion.UnoccludedLayerContentRect(layer, gfx::Rect(40, 30, 10, 10))); |
- EXPECT_EQ(gfx::Rect(), |
- occlusion.UnoccludedLayerContentRect( |
- layer, gfx::Rect(130, 120, 10, 10))); |
- EXPECT_EQ( |
- gfx::Rect(), |
- occlusion.UnoccludedLayerContentRect(layer, gfx::Rect(80, 70, 50, 50))); |
- } |
-}; |
- |
-ALL_OCCLUSIONTRACKER_TEST(OcclusionTrackerTestUnoccludedLayerQuery) |
- |
-template <class Types> |
-class OcclusionTrackerTestUnoccludedSurfaceQuery |
- : public OcclusionTrackerTest<Types> { |
- protected: |
- explicit OcclusionTrackerTestUnoccludedSurfaceQuery(bool opaque_layers) |
- : OcclusionTrackerTest<Types>(opaque_layers) {} |
- void RunMyTest() override { |
- gfx::Transform translate; |
- translate.Translate(10.0, 20.0); |
- typename Types::ContentLayerType* root = this->CreateRoot( |
- this->identity_matrix, gfx::Point(), gfx::Size(200, 200)); |
- typename Types::LayerType* surface = |
- this->CreateSurface(root, translate, gfx::Point(), gfx::Size(200, 200)); |
- typename Types::LayerType* layer = |
- this->CreateDrawingLayer(surface, |
- this->identity_matrix, |
- gfx::Point(), |
- gfx::Size(200, 200), |
- false); |
- typename Types::ContentLayerType* outside_layer = this->CreateDrawingLayer( |
- root, this->identity_matrix, gfx::Point(), gfx::Size(200, 200), false); |
- this->CalcDrawEtc(root); |
- |
- TestOcclusionTrackerWithClip<typename Types::LayerType> occlusion( |
- gfx::Rect(0, 0, 200, 200)); |
- this->VisitLayer(outside_layer, &occlusion); |
- this->VisitLayer(layer, &occlusion); |
- this->EnterContributingSurface(surface, &occlusion); |
- |
- // No occlusion, is not occluded. |
- occlusion.set_occlusion_on_contributing_surface_from_outside_target( |
- SimpleEnclosedRegion()); |
- occlusion.set_occlusion_on_contributing_surface_from_inside_target( |
- SimpleEnclosedRegion()); |
- EXPECT_EQ( |
- gfx::Rect(100, 100), |
- occlusion.UnoccludedSurfaceContentRect(surface, gfx::Rect(100, 100))); |
- |
- // Partial occlusion from outside. |
- occlusion.set_occlusion_on_contributing_surface_from_outside_target( |
- SimpleEnclosedRegion(50, 50, 100, 100)); |
- occlusion.set_occlusion_on_contributing_surface_from_inside_target( |
- SimpleEnclosedRegion()); |
- EXPECT_EQ(gfx::Rect(0, 0, 100, 100), |
- occlusion.UnoccludedSurfaceContentRect( |
- surface, gfx::Rect(0, 0, 100, 100))); |
- EXPECT_EQ(gfx::Rect(140, 30, 50, 100), |
- occlusion.UnoccludedSurfaceContentRect( |
- surface, gfx::Rect(90, 30, 100, 100))); |
- EXPECT_EQ(gfx::Rect(40, 0, 100, 30), |
- occlusion.UnoccludedSurfaceContentRect( |
- surface, gfx::Rect(40, 0, 100, 100))); |
- EXPECT_EQ(gfx::Rect(40, 130, 100, 50), |
- occlusion.UnoccludedSurfaceContentRect( |
- surface, gfx::Rect(40, 80, 100, 100))); |
- EXPECT_EQ(gfx::Rect(0, 0, 80, 100), |
- occlusion.UnoccludedSurfaceContentRect(surface, |
- gfx::Rect(0, 0, 80, 100))); |
- EXPECT_EQ(gfx::Rect(90, 80, 100, 100), |
- occlusion.UnoccludedSurfaceContentRect( |
- surface, gfx::Rect(90, 80, 100, 100))); |
- EXPECT_EQ(gfx::Rect(0, 80, 100, 100), |
- occlusion.UnoccludedSurfaceContentRect( |
- surface, gfx::Rect(0, 80, 100, 100))); |
- EXPECT_EQ(gfx::Rect(90, 0, 100, 100), |
- occlusion.UnoccludedSurfaceContentRect( |
- surface, gfx::Rect(90, 0, 100, 100))); |
- |
- // Full occlusion from outside, is occluded. |
- EXPECT_EQ(gfx::Rect(), |
- occlusion.UnoccludedSurfaceContentRect( |
- surface, gfx::Rect(40, 30, 100, 100))); |
- EXPECT_EQ(gfx::Rect(), |
- occlusion.UnoccludedSurfaceContentRect( |
- surface, gfx::Rect(40, 30, 10, 10))); |
- EXPECT_EQ(gfx::Rect(), |
- occlusion.UnoccludedSurfaceContentRect( |
- surface, gfx::Rect(130, 120, 10, 10))); |
- EXPECT_EQ(gfx::Rect(), |
- occlusion.UnoccludedSurfaceContentRect( |
- surface, gfx::Rect(80, 70, 50, 50))); |
- |
- // Partial occlusion from inside, is not occluded. |
- occlusion.set_occlusion_on_contributing_surface_from_outside_target( |
- SimpleEnclosedRegion()); |
- occlusion.set_occlusion_on_contributing_surface_from_inside_target( |
- SimpleEnclosedRegion(50, 50, 100, 100)); |
- EXPECT_EQ(gfx::Rect(0, 0, 100, 100), |
- occlusion.UnoccludedSurfaceContentRect( |
- surface, gfx::Rect(0, 0, 100, 100))); |
- EXPECT_EQ(gfx::Rect(140, 30, 50, 100), |
- occlusion.UnoccludedSurfaceContentRect( |
- surface, gfx::Rect(90, 30, 100, 100))); |
- EXPECT_EQ(gfx::Rect(40, 0, 100, 30), |
- occlusion.UnoccludedSurfaceContentRect( |
- surface, gfx::Rect(40, 0, 100, 100))); |
- EXPECT_EQ(gfx::Rect(40, 130, 100, 50), |
- occlusion.UnoccludedSurfaceContentRect( |
- surface, gfx::Rect(40, 80, 100, 100))); |
- EXPECT_EQ(gfx::Rect(0, 0, 80, 100), |
- occlusion.UnoccludedSurfaceContentRect(surface, |
- gfx::Rect(0, 0, 80, 100))); |
- EXPECT_EQ(gfx::Rect(90, 80, 100, 100), |
- occlusion.UnoccludedSurfaceContentRect( |
- surface, gfx::Rect(90, 80, 100, 100))); |
- EXPECT_EQ(gfx::Rect(0, 80, 100, 100), |
- occlusion.UnoccludedSurfaceContentRect( |
- surface, gfx::Rect(0, 80, 100, 100))); |
- EXPECT_EQ(gfx::Rect(90, 0, 100, 100), |
- occlusion.UnoccludedSurfaceContentRect( |
- surface, gfx::Rect(90, 0, 100, 100))); |
- |
- // Full occlusion from inside, is occluded. |
- EXPECT_EQ(gfx::Rect(), |
- occlusion.UnoccludedSurfaceContentRect( |
- surface, gfx::Rect(40, 30, 100, 100))); |
- EXPECT_EQ(gfx::Rect(), |
- occlusion.UnoccludedSurfaceContentRect( |
- surface, gfx::Rect(40, 30, 10, 10))); |
- EXPECT_EQ(gfx::Rect(), |
- occlusion.UnoccludedSurfaceContentRect( |
- surface, gfx::Rect(130, 120, 10, 10))); |
- EXPECT_EQ(gfx::Rect(), |
- occlusion.UnoccludedSurfaceContentRect( |
- surface, gfx::Rect(80, 70, 50, 50))); |
- |
- // Partial occlusion from both, is not occluded. |
- occlusion.set_occlusion_on_contributing_surface_from_outside_target( |
- SimpleEnclosedRegion(50, 50, 100, 50)); |
- occlusion.set_occlusion_on_contributing_surface_from_inside_target( |
- SimpleEnclosedRegion(50, 100, 100, 50)); |
- EXPECT_EQ(gfx::Rect(0, 0, 100, 100), |
- occlusion.UnoccludedSurfaceContentRect( |
- surface, gfx::Rect(0, 0, 100, 100))); |
- // This could be (140, 30, 50, 100). But because we do a lossy subtract, |
- // it's larger. |
- EXPECT_EQ(gfx::Rect(90, 30, 100, 100), |
- occlusion.UnoccludedSurfaceContentRect( |
- surface, gfx::Rect(90, 30, 100, 100))); |
- EXPECT_EQ(gfx::Rect(40, 0, 100, 30), |
- occlusion.UnoccludedSurfaceContentRect( |
- surface, gfx::Rect(40, 0, 100, 100))); |
- EXPECT_EQ(gfx::Rect(40, 130, 100, 50), |
- occlusion.UnoccludedSurfaceContentRect( |
- surface, gfx::Rect(40, 80, 100, 100))); |
- EXPECT_EQ(gfx::Rect(0, 0, 80, 100), |
- occlusion.UnoccludedSurfaceContentRect(surface, |
- gfx::Rect(0, 0, 80, 100))); |
- EXPECT_EQ(gfx::Rect(90, 80, 100, 100), |
- occlusion.UnoccludedSurfaceContentRect( |
- surface, gfx::Rect(90, 80, 100, 100))); |
- EXPECT_EQ(gfx::Rect(0, 80, 100, 100), |
- occlusion.UnoccludedSurfaceContentRect( |
- surface, gfx::Rect(0, 80, 100, 100))); |
- EXPECT_EQ(gfx::Rect(90, 0, 100, 100), |
- occlusion.UnoccludedSurfaceContentRect( |
- surface, gfx::Rect(90, 0, 100, 100))); |
- |
- // Full occlusion from both, is occluded. |
- EXPECT_EQ(gfx::Rect(), |
- occlusion.UnoccludedSurfaceContentRect( |
- surface, gfx::Rect(40, 30, 100, 100))); |
- EXPECT_EQ(gfx::Rect(), |
- occlusion.UnoccludedSurfaceContentRect( |
- surface, gfx::Rect(40, 30, 10, 10))); |
- EXPECT_EQ(gfx::Rect(), |
- occlusion.UnoccludedSurfaceContentRect( |
- surface, gfx::Rect(130, 120, 10, 10))); |
- EXPECT_EQ(gfx::Rect(), |
- occlusion.UnoccludedSurfaceContentRect( |
- surface, gfx::Rect(80, 70, 50, 50))); |
- } |
-}; |
- |
-ALL_OCCLUSIONTRACKER_TEST(OcclusionTrackerTestUnoccludedSurfaceQuery) |
- |
-} // namespace |
-} // namespace cc |