| // Copyright 2019 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "ui/gfx/overlay_transform_utils.h" |
| |
| #include "cc/base/math_util.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| #include "ui/gfx/geometry/rect.h" |
| |
| namespace gfx { |
| namespace { |
| |
| struct RectInViewport { |
| Rect rect; |
| Size viewport; |
| }; |
| |
| RectInViewport ApplyOverlayTransform(OverlayTransform overlay_transform, |
| const RectInViewport& original) { |
| auto transform = |
| OverlayTransformToTransform(overlay_transform, SizeF(original.viewport)); |
| RectInViewport result; |
| result.rect = cc::MathUtil::MapEnclosedRectWith2dAxisAlignedTransform( |
| transform, original.rect); |
| result.viewport = cc::MathUtil::MapEnclosedRectWith2dAxisAlignedTransform( |
| transform, Rect(original.viewport)) |
| .size(); |
| return result; |
| } |
| |
| TEST(OverlayTransformUtilTest, All) { |
| const Size viewport_bounds(100, 200); |
| const Rect original(10, 10, 50, 100); |
| struct TestCase { |
| OverlayTransform overlay_transform; |
| Rect transformed; |
| }; |
| |
| TestCase test_cases[] = { |
| {OVERLAY_TRANSFORM_NONE, Rect(10, 10, 50, 100)}, |
| {OVERLAY_TRANSFORM_FLIP_HORIZONTAL, Rect(40, 10, 50, 100)}, |
| {OVERLAY_TRANSFORM_FLIP_VERTICAL, Rect(10, 90, 50, 100)}, |
| {OVERLAY_TRANSFORM_ROTATE_CLOCKWISE_90, Rect(90, 10, 100, 50)}, |
| {OVERLAY_TRANSFORM_ROTATE_CLOCKWISE_180, Rect(40, 90, 50, 100)}, |
| {OVERLAY_TRANSFORM_ROTATE_CLOCKWISE_270, Rect(10, 40, 100, 50)}, |
| {OVERLAY_TRANSFORM_FLIP_VERTICAL_CLOCKWISE_90, Rect(10, 10, 100, 50)}, |
| {OVERLAY_TRANSFORM_FLIP_VERTICAL_CLOCKWISE_270, Rect(90, 40, 100, 50)}, |
| }; |
| |
| for (const auto& test_case : test_cases) { |
| SCOPED_TRACE(static_cast<int>(test_case.overlay_transform)); |
| |
| RectInViewport transformed = ApplyOverlayTransform( |
| test_case.overlay_transform, {original, viewport_bounds}); |
| EXPECT_EQ(test_case.transformed, transformed.rect); |
| |
| RectInViewport inverted = ApplyOverlayTransform( |
| InvertOverlayTransform(test_case.overlay_transform), |
| {test_case.transformed, transformed.viewport}); |
| EXPECT_EQ(original, inverted.rect); |
| } |
| } |
| |
| TEST(OverlayTransformUtilTest, Concat) { |
| const std::vector<OverlayTransform> kTransforms = { |
| OVERLAY_TRANSFORM_INVALID, |
| OVERLAY_TRANSFORM_NONE, |
| OVERLAY_TRANSFORM_FLIP_HORIZONTAL, |
| OVERLAY_TRANSFORM_FLIP_VERTICAL, |
| OVERLAY_TRANSFORM_ROTATE_CLOCKWISE_90, |
| OVERLAY_TRANSFORM_ROTATE_CLOCKWISE_180, |
| OVERLAY_TRANSFORM_ROTATE_CLOCKWISE_270, |
| OVERLAY_TRANSFORM_FLIP_VERTICAL_CLOCKWISE_90, |
| OVERLAY_TRANSFORM_FLIP_VERTICAL_CLOCKWISE_270, |
| }; |
| |
| for (auto t1 : kTransforms) { |
| SCOPED_TRACE(static_cast<int>(t1)); |
| for (auto t2 : kTransforms) { |
| SCOPED_TRACE(static_cast<int>(t2)); |
| |
| OverlayTransform concat_transform = OverlayTransformsConcat(t1, t2); |
| if (t1 == OVERLAY_TRANSFORM_INVALID || t2 == OVERLAY_TRANSFORM_INVALID) { |
| EXPECT_EQ(concat_transform, OVERLAY_TRANSFORM_INVALID); |
| continue; |
| } |
| EXPECT_NE(concat_transform, OVERLAY_TRANSFORM_INVALID); |
| |
| RectInViewport original{ |
| .rect = Rect(10, 10, 50, 100), |
| .viewport = Size(100, 200), |
| }; |
| |
| RectInViewport t1_then_t2_result = |
| ApplyOverlayTransform(t2, ApplyOverlayTransform(t1, original)); |
| RectInViewport concat_result = |
| ApplyOverlayTransform(concat_transform, original); |
| |
| EXPECT_EQ(t1_then_t2_result.rect, concat_result.rect); |
| EXPECT_EQ(t1_then_t2_result.viewport, concat_result.viewport); |
| } |
| } |
| } |
| |
| } // namespace |
| } // namespace gfx |