blob: becc7a3889c95ea31cab060b7431bea751814a3f [file] [log] [blame]
// Copyright 2014 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.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace cc {
namespace {
TEST(OcclusionTest, HasOcclusion) {
Occlusion empty;
EXPECT_FALSE(empty.HasOcclusion());
empty = Occlusion(
gfx::Transform(), SimpleEnclosedRegion(), SimpleEnclosedRegion());
EXPECT_FALSE(empty.HasOcclusion());
Occlusion outside_nonempty(
gfx::Transform(), SimpleEnclosedRegion(10, 10), SimpleEnclosedRegion());
EXPECT_TRUE(outside_nonempty.HasOcclusion());
Occlusion inside_nonempty(
gfx::Transform(), SimpleEnclosedRegion(), SimpleEnclosedRegion(10, 10));
EXPECT_TRUE(inside_nonempty.HasOcclusion());
Occlusion both_nonempty(gfx::Transform(),
SimpleEnclosedRegion(10, 10),
SimpleEnclosedRegion(10, 10));
EXPECT_TRUE(both_nonempty.HasOcclusion());
}
#define EXPECT_OCCLUSION(occlusion, rects, ...) \
{ \
bool expected[] = {__VA_ARGS__}; \
ASSERT_EQ(arraysize(rects), arraysize(expected)); \
for (size_t i = 0; i < arraysize(rects); ++i) \
EXPECT_EQ(expected[i], occlusion.IsOccluded(rects[i])) \
<< "Test failed for index " << i << "."; \
}
TEST(OcclusionTest, IsOccludedNoTransform) {
gfx::Rect rects[] = {gfx::Rect(10, 10),
gfx::Rect(10, 0, 10, 10),
gfx::Rect(0, 10, 10, 10),
gfx::Rect(10, 10, 10, 10)};
Occlusion no_occlusion;
EXPECT_OCCLUSION(no_occlusion, rects, false, false, false, false);
Occlusion all_occluded_outside(
gfx::Transform(), SimpleEnclosedRegion(20, 20), SimpleEnclosedRegion());
EXPECT_OCCLUSION(all_occluded_outside, rects, true, true, true, true);
Occlusion all_occluded_inside(
gfx::Transform(), SimpleEnclosedRegion(), SimpleEnclosedRegion(20, 20));
EXPECT_OCCLUSION(all_occluded_inside, rects, true, true, true, true);
Occlusion all_occluded_mixed(gfx::Transform(),
SimpleEnclosedRegion(10, 20),
SimpleEnclosedRegion(10, 0, 10, 20));
EXPECT_OCCLUSION(all_occluded_mixed, rects, true, true, true, true);
Occlusion some_occluded(gfx::Transform(),
SimpleEnclosedRegion(10, 10),
SimpleEnclosedRegion(10, 10, 10, 10));
EXPECT_OCCLUSION(some_occluded, rects, true, false, false, true);
}
TEST(OcclusionTest, IsOccludedScaled) {
gfx::Rect rects[] = {gfx::Rect(10, 10),
gfx::Rect(10, 0, 10, 10),
gfx::Rect(0, 10, 10, 10),
gfx::Rect(10, 10, 10, 10)};
gfx::Transform half_scale;
half_scale.Scale(0.5, 0.5);
gfx::Transform double_scale;
double_scale.Scale(2, 2);
Occlusion all_occluded_outside_half(
half_scale, SimpleEnclosedRegion(10, 10), SimpleEnclosedRegion());
Occlusion all_occluded_outside_double(
double_scale, SimpleEnclosedRegion(40, 40), SimpleEnclosedRegion());
EXPECT_OCCLUSION(all_occluded_outside_half, rects, true, true, true, true);
EXPECT_OCCLUSION(all_occluded_outside_double, rects, true, true, true, true);
Occlusion all_occluded_inside_half(
half_scale, SimpleEnclosedRegion(), SimpleEnclosedRegion(10, 10));
Occlusion all_occluded_inside_double(
double_scale, SimpleEnclosedRegion(), SimpleEnclosedRegion(40, 40));
EXPECT_OCCLUSION(all_occluded_inside_half, rects, true, true, true, true);
EXPECT_OCCLUSION(all_occluded_inside_double, rects, true, true, true, true);
Occlusion all_occluded_mixed_half(half_scale,
SimpleEnclosedRegion(5, 10),
SimpleEnclosedRegion(5, 0, 5, 10));
Occlusion all_occluded_mixed_double(double_scale,
SimpleEnclosedRegion(20, 40),
SimpleEnclosedRegion(20, 0, 20, 40));
EXPECT_OCCLUSION(all_occluded_mixed_half, rects, true, true, true, true);
EXPECT_OCCLUSION(all_occluded_mixed_double, rects, true, true, true, true);
Occlusion some_occluded_half(
half_scale, SimpleEnclosedRegion(5, 5), SimpleEnclosedRegion(5, 5, 5, 5));
Occlusion some_occluded_double(double_scale,
SimpleEnclosedRegion(20, 20),
SimpleEnclosedRegion(20, 20, 20, 20));
EXPECT_OCCLUSION(some_occluded_half, rects, true, false, false, true);
EXPECT_OCCLUSION(some_occluded_double, rects, true, false, false, true);
}
TEST(OcclusionTest, IsOccludedTranslated) {
gfx::Rect rects[] = {gfx::Rect(10, 10),
gfx::Rect(10, 0, 10, 10),
gfx::Rect(0, 10, 10, 10),
gfx::Rect(10, 10, 10, 10)};
gfx::Transform move_left;
move_left.Translate(-100, 0);
gfx::Transform move_down;
move_down.Translate(0, 100);
Occlusion all_occluded_outside_left(
move_left, SimpleEnclosedRegion(-100, 0, 20, 20), SimpleEnclosedRegion());
Occlusion all_occluded_outside_down(
move_down, SimpleEnclosedRegion(0, 100, 20, 20), SimpleEnclosedRegion());
EXPECT_OCCLUSION(all_occluded_outside_left, rects, true, true, true, true);
EXPECT_OCCLUSION(all_occluded_outside_down, rects, true, true, true, true);
Occlusion all_occluded_inside_left(
move_left, SimpleEnclosedRegion(), SimpleEnclosedRegion(-100, 0, 20, 20));
Occlusion all_occluded_inside_down(
move_down, SimpleEnclosedRegion(), SimpleEnclosedRegion(0, 100, 20, 20));
EXPECT_OCCLUSION(all_occluded_inside_left, rects, true, true, true, true);
EXPECT_OCCLUSION(all_occluded_inside_down, rects, true, true, true, true);
Occlusion all_occluded_mixed_left(move_left,
SimpleEnclosedRegion(-100, 0, 10, 20),
SimpleEnclosedRegion(-90, 0, 10, 20));
Occlusion all_occluded_mixed_down(move_down,
SimpleEnclosedRegion(0, 100, 10, 20),
SimpleEnclosedRegion(10, 100, 10, 20));
EXPECT_OCCLUSION(all_occluded_mixed_left, rects, true, true, true, true);
EXPECT_OCCLUSION(all_occluded_mixed_down, rects, true, true, true, true);
Occlusion some_occluded_left(move_left,
SimpleEnclosedRegion(-100, 0, 10, 10),
SimpleEnclosedRegion(-90, 10, 10, 10));
Occlusion some_occluded_down(move_down,
SimpleEnclosedRegion(0, 100, 10, 10),
SimpleEnclosedRegion(10, 110, 10, 10));
EXPECT_OCCLUSION(some_occluded_left, rects, true, false, false, true);
EXPECT_OCCLUSION(some_occluded_down, rects, true, false, false, true);
}
TEST(OcclusionTest, IsOccludedScaledAfterConstruction) {
gfx::Rect rects[] = {gfx::Rect(10, 10),
gfx::Rect(10, 0, 10, 10),
gfx::Rect(0, 10, 10, 10),
gfx::Rect(10, 10, 10, 10)};
gfx::Transform half_transform;
half_transform.Scale(0.5, 0.5);
gfx::Transform double_transform;
double_transform.Scale(2, 2);
Occlusion all_occluded_outside(
gfx::Transform(), SimpleEnclosedRegion(10, 10), SimpleEnclosedRegion());
Occlusion all_occluded_outside_half =
all_occluded_outside.GetOcclusionWithGivenDrawTransform(half_transform);
all_occluded_outside = Occlusion(
gfx::Transform(), SimpleEnclosedRegion(40, 40), SimpleEnclosedRegion());
Occlusion all_occluded_outside_double =
all_occluded_outside.GetOcclusionWithGivenDrawTransform(double_transform);
EXPECT_OCCLUSION(all_occluded_outside_half, rects, true, true, true, true);
EXPECT_OCCLUSION(all_occluded_outside_double, rects, true, true, true, true);
Occlusion some_occluded(gfx::Transform(),
SimpleEnclosedRegion(5, 5),
SimpleEnclosedRegion(5, 5, 5, 5));
Occlusion some_occluded_half =
some_occluded.GetOcclusionWithGivenDrawTransform(half_transform);
some_occluded = Occlusion(gfx::Transform(),
SimpleEnclosedRegion(20, 20),
SimpleEnclosedRegion(20, 20, 20, 20));
Occlusion some_occluded_double =
some_occluded.GetOcclusionWithGivenDrawTransform(double_transform);
EXPECT_OCCLUSION(some_occluded_half, rects, true, false, false, true);
EXPECT_OCCLUSION(some_occluded_double, rects, true, false, false, true);
}
TEST(OcclusionTest, GetUnoccludedContentRectNoTransform) {
Occlusion some_occluded(gfx::Transform(),
SimpleEnclosedRegion(10, 10),
SimpleEnclosedRegion(10, 10, 10, 10));
gfx::Rect full_query_result =
some_occluded.GetUnoccludedContentRect(gfx::Rect(20, 20));
EXPECT_EQ(gfx::Rect(20, 20), full_query_result);
gfx::Rect half_query_result =
some_occluded.GetUnoccludedContentRect(gfx::Rect(10, 0, 10, 20));
EXPECT_EQ(gfx::Rect(10, 0, 10, 10), half_query_result);
}
TEST(OcclusionTest, GetUnoccludedContentRectScaled) {
gfx::Transform half_scale;
half_scale.Scale(0.5, 0.5);
gfx::Transform double_scale;
double_scale.Scale(2, 2);
Occlusion some_occluded_half(
half_scale, SimpleEnclosedRegion(5, 5), SimpleEnclosedRegion(5, 5, 5, 5));
Occlusion some_occluded_double(double_scale,
SimpleEnclosedRegion(20, 20),
SimpleEnclosedRegion(20, 20, 20, 20));
gfx::Rect full_query_result_half =
some_occluded_half.GetUnoccludedContentRect(gfx::Rect(20, 20));
gfx::Rect full_query_result_double =
some_occluded_double.GetUnoccludedContentRect(gfx::Rect(20, 20));
EXPECT_EQ(gfx::Rect(20, 20), full_query_result_half);
EXPECT_EQ(gfx::Rect(20, 20), full_query_result_double);
gfx::Rect half_query_result_half =
some_occluded_half.GetUnoccludedContentRect(gfx::Rect(10, 0, 10, 20));
gfx::Rect half_query_result_double =
some_occluded_half.GetUnoccludedContentRect(gfx::Rect(10, 0, 10, 20));
EXPECT_EQ(gfx::Rect(10, 0, 10, 10), half_query_result_half);
EXPECT_EQ(gfx::Rect(10, 0, 10, 10), half_query_result_double);
}
TEST(OcclusionTest, GetUnoccludedContentRectTranslated) {
gfx::Transform move_left;
move_left.Translate(-100, 0);
gfx::Transform move_down;
move_down.Translate(0, 100);
Occlusion some_occluded_left(move_left,
SimpleEnclosedRegion(-100, 0, 10, 10),
SimpleEnclosedRegion(-90, 10, 10, 10));
Occlusion some_occluded_down(move_down,
SimpleEnclosedRegion(0, 100, 0, 10),
SimpleEnclosedRegion(10, 110, 10, 10));
gfx::Rect full_query_result_left =
some_occluded_left.GetUnoccludedContentRect(gfx::Rect(20, 20));
gfx::Rect full_query_result_down =
some_occluded_down.GetUnoccludedContentRect(gfx::Rect(20, 20));
EXPECT_EQ(gfx::Rect(20, 20), full_query_result_left);
EXPECT_EQ(gfx::Rect(20, 20), full_query_result_down);
gfx::Rect half_query_result_left =
some_occluded_left.GetUnoccludedContentRect(gfx::Rect(10, 0, 10, 20));
gfx::Rect half_query_result_down =
some_occluded_down.GetUnoccludedContentRect(gfx::Rect(10, 0, 10, 20));
EXPECT_EQ(gfx::Rect(10, 0, 10, 10), half_query_result_left);
EXPECT_EQ(gfx::Rect(10, 0, 10, 10), half_query_result_down);
}
} // namespace
} // namespace cc