blob: 6f39bf72a6c8515b13573dd34ff64c53b0662983 [file] [log] [blame]
// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "cc/paint/clear_for_opaque_raster.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/geometry/size_f.h"
#include "ui/gfx/geometry/vector2d_f.h"
namespace cc {
TEST(ClearForOpaqueRasterTest, NoTransform) {
const gfx::Vector2dF translation;
const gfx::Vector2dF scale(1, 1);
const gfx::Size content_size(100, 100);
const gfx::Rect bitmap_rect(content_size);
gfx::Rect inner_rect;
gfx::Rect outer_rect;
EXPECT_FALSE(CalculateClearForOpaqueRasterRects(
translation, scale, content_size, bitmap_rect, bitmap_rect, outer_rect,
inner_rect));
EXPECT_FALSE(CalculateClearForOpaqueRasterRects(
translation, scale, content_size, bitmap_rect, gfx::Rect(25, 25, 50, 50),
outer_rect, inner_rect));
}
TEST(ClearForOpaqueRasterTest, WithTranslation) {
const gfx::Vector2dF translation(0.3f, 0.7f);
const gfx::Vector2dF scale(1, 1);
const gfx::Size content_size(100, 100);
const gfx::Rect bitmap_rect(content_size);
gfx::Rect inner_rect;
gfx::Rect outer_rect;
// Full playback (touching all edges).
EXPECT_TRUE(CalculateClearForOpaqueRasterRects(
translation, scale, content_size, bitmap_rect, bitmap_rect, outer_rect,
inner_rect));
EXPECT_EQ(gfx::Rect(0, 0, 100, 100), outer_rect);
EXPECT_EQ(gfx::Rect(1, 1, 99, 99), inner_rect);
// Touches the left edge only.
EXPECT_TRUE(CalculateClearForOpaqueRasterRects(
translation, scale, content_size, bitmap_rect, gfx::Rect(0, 25, 50, 50),
outer_rect, inner_rect));
EXPECT_EQ(gfx::Rect(0, 25, 50, 50), outer_rect);
EXPECT_EQ(gfx::Rect(1, 25, 49, 50), inner_rect);
// Touches the top edge only.
EXPECT_TRUE(CalculateClearForOpaqueRasterRects(
translation, scale, content_size, bitmap_rect, gfx::Rect(25, 0, 50, 50),
outer_rect, inner_rect));
EXPECT_EQ(gfx::Rect(25, 0, 50, 50), outer_rect);
EXPECT_EQ(gfx::Rect(25, 1, 50, 49), inner_rect);
// Touches the right edge only.
EXPECT_FALSE(CalculateClearForOpaqueRasterRects(
translation, scale, content_size, bitmap_rect, gfx::Rect(50, 25, 50, 50),
outer_rect, inner_rect));
// Touches the bottom edge only.
EXPECT_FALSE(CalculateClearForOpaqueRasterRects(
translation, scale, content_size, bitmap_rect, gfx::Rect(25, 50, 50, 50),
outer_rect, inner_rect));
// Touches no edges.
EXPECT_FALSE(CalculateClearForOpaqueRasterRects(
translation, scale, content_size, bitmap_rect, gfx::Rect(1, 1, 98, 98),
outer_rect, inner_rect));
}
TEST(ClearForOpaqueRasterTest, WithScale) {
const gfx::Vector2dF translation;
const gfx::Vector2dF scale(1.5f, 1.5f);
const gfx::Size content_size(100, 100);
const gfx::Rect bitmap_rect(content_size);
gfx::Rect inner_rect;
gfx::Rect outer_rect;
// Full playback (touching all edges).
EXPECT_TRUE(CalculateClearForOpaqueRasterRects(
translation, scale, content_size, bitmap_rect, bitmap_rect, outer_rect,
inner_rect));
EXPECT_EQ(gfx::Rect(0, 0, 101, 101), outer_rect);
EXPECT_EQ(gfx::Rect(0, 0, 99, 99), inner_rect);
// Touches the left edge only.
EXPECT_FALSE(CalculateClearForOpaqueRasterRects(
translation, scale, content_size, bitmap_rect, gfx::Rect(0, 25, 50, 50),
outer_rect, inner_rect));
// Touches the top edge only.
EXPECT_FALSE(CalculateClearForOpaqueRasterRects(
translation, scale, content_size, bitmap_rect, gfx::Rect(25, 0, 50, 50),
outer_rect, inner_rect));
// Touches the right edge only.
EXPECT_TRUE(CalculateClearForOpaqueRasterRects(
translation, scale, content_size, bitmap_rect, gfx::Rect(50, 25, 50, 50),
outer_rect, inner_rect));
EXPECT_EQ(gfx::Rect(50, 25, 51, 50), outer_rect);
EXPECT_EQ(gfx::Rect(50, 25, 49, 50), inner_rect);
// Touches the bottom edge only.
EXPECT_TRUE(CalculateClearForOpaqueRasterRects(
translation, scale, content_size, bitmap_rect, gfx::Rect(25, 50, 50, 50),
outer_rect, inner_rect));
EXPECT_EQ(gfx::Rect(25, 50, 50, 51), outer_rect);
EXPECT_EQ(gfx::Rect(25, 50, 50, 49), inner_rect);
// Touches no edges.
EXPECT_FALSE(CalculateClearForOpaqueRasterRects(
translation, scale, content_size, bitmap_rect, gfx::Rect(1, 1, 98, 98),
outer_rect, inner_rect));
}
TEST(ClearForOpaqueRasterTest, WithTranslationAndScale) {
const gfx::Vector2dF translation(0.3f, 0.7f);
const gfx::Vector2dF scale(1.5f, 1.5f);
const gfx::Size content_size(100, 100);
const gfx::Rect bitmap_rect(content_size);
gfx::Rect inner_rect;
gfx::Rect outer_rect;
// Full playback (touching all edges).
EXPECT_TRUE(CalculateClearForOpaqueRasterRects(
translation, scale, content_size, bitmap_rect, bitmap_rect, outer_rect,
inner_rect));
EXPECT_EQ(gfx::Rect(0, 0, 101, 101), outer_rect);
EXPECT_EQ(gfx::Rect(1, 1, 98, 98), inner_rect);
// Touches the left edge only.
EXPECT_TRUE(CalculateClearForOpaqueRasterRects(
translation, scale, content_size, bitmap_rect, gfx::Rect(0, 25, 50, 50),
outer_rect, inner_rect));
EXPECT_EQ(gfx::Rect(0, 25, 50, 50), outer_rect);
EXPECT_EQ(gfx::Rect(1, 25, 49, 50), inner_rect);
// Touches the top edge only.
EXPECT_TRUE(CalculateClearForOpaqueRasterRects(
translation, scale, content_size, bitmap_rect, gfx::Rect(25, 0, 50, 50),
outer_rect, inner_rect));
EXPECT_EQ(gfx::Rect(25, 0, 50, 50), outer_rect);
EXPECT_EQ(gfx::Rect(25, 1, 50, 49), inner_rect);
// Touches the right edge only.
EXPECT_TRUE(CalculateClearForOpaqueRasterRects(
translation, scale, content_size, bitmap_rect, gfx::Rect(50, 25, 50, 50),
outer_rect, inner_rect));
EXPECT_EQ(gfx::Rect(50, 25, 51, 50), outer_rect);
EXPECT_EQ(gfx::Rect(50, 25, 49, 50), inner_rect);
// Touches the bottom edge only.
EXPECT_TRUE(CalculateClearForOpaqueRasterRects(
translation, scale, content_size, bitmap_rect, gfx::Rect(25, 50, 50, 50),
outer_rect, inner_rect));
EXPECT_EQ(gfx::Rect(25, 50, 50, 51), outer_rect);
EXPECT_EQ(gfx::Rect(25, 50, 50, 49), inner_rect);
// Touches no edges.
EXPECT_FALSE(CalculateClearForOpaqueRasterRects(
translation, scale, content_size, bitmap_rect, gfx::Rect(1, 1, 98, 98),
outer_rect, inner_rect));
// With bitmap_rect non-zero offset.
EXPECT_TRUE(CalculateClearForOpaqueRasterRects(
translation, scale, content_size, gfx::Rect(25, 25, 75, 75),
gfx::Rect(50, 50, 50, 50), outer_rect, inner_rect));
EXPECT_EQ(gfx::Rect(25, 25, 51, 51), outer_rect);
EXPECT_EQ(gfx::Rect(25, 25, 49, 49), inner_rect);
}
TEST(ClearForOpaqueRasterTest, PlaybackRectBelowContentRect) {
const gfx::Vector2dF translation(0.0f, 0.1f);
const gfx::Vector2dF scale(1.0f, 1.0f);
const gfx::Size content_size(100, 100);
const gfx::Rect bitmap_rect(50, 50, 100, 100);
const gfx::Rect playback_rect(50, 100, 100, 3);
gfx::Rect inner_rect;
gfx::Rect outer_rect;
EXPECT_FALSE(CalculateClearForOpaqueRasterRects(
translation, scale, content_size, bitmap_rect, playback_rect, outer_rect,
inner_rect));
}
} // namespace cc