/* * Copyright (C) 2015 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include <gtest/gtest.h> #include <SkPath.h> #include <SkRegion.h> #include "ClipArea.h" #include "Matrix.h" #include "Rect.h" #include "utils/LinearAllocator.h" namespace android { namespace uirenderer { static Rect kViewportBounds(0, 0, 2048, 2048); static ClipArea createClipArea() { ClipArea area; area.setViewportDimensions(kViewportBounds.getWidth(), kViewportBounds.getHeight()); return area; } TEST(TransformedRectangle, basics) { Rect r(0, 0, 100, 100); Matrix4 minus90; minus90.loadRotate(-90); minus90.mapRect(r); Rect r2(20, 40, 120, 60); Matrix4 m90; m90.loadRotate(90); TransformedRectangle tr(r, m90); EXPECT_TRUE(tr.canSimplyIntersectWith(tr)); Matrix4 m0; TransformedRectangle tr0(r2, m0); EXPECT_FALSE(tr.canSimplyIntersectWith(tr0)); Matrix4 m45; m45.loadRotate(45); TransformedRectangle tr2(r, m45); EXPECT_FALSE(tr2.canSimplyIntersectWith(tr)); } TEST(RectangleList, basics) { RectangleList list; EXPECT_TRUE(list.isEmpty()); Rect r(0, 0, 100, 100); Matrix4 m45; m45.loadRotate(45); list.set(r, m45); EXPECT_FALSE(list.isEmpty()); Rect r2(20, 20, 200, 200); list.intersectWith(r2, m45); EXPECT_FALSE(list.isEmpty()); EXPECT_EQ(1, list.getTransformedRectanglesCount()); Rect r3(20, 20, 200, 200); Matrix4 m30; m30.loadRotate(30); list.intersectWith(r2, m30); EXPECT_FALSE(list.isEmpty()); EXPECT_EQ(2, list.getTransformedRectanglesCount()); SkRegion clip; clip.setRect(0, 0, 2000, 2000); SkRegion rgn(list.convertToRegion(clip)); EXPECT_FALSE(rgn.isEmpty()); } TEST(ClipArea, basics) { ClipArea area(createClipArea()); EXPECT_FALSE(area.isEmpty()); } TEST(ClipArea, paths) { ClipArea area(createClipArea()); Matrix4 transform; transform.loadIdentity(); SkPath path; SkScalar r = 100; path.addCircle(r, r, r); area.clipPathWithTransform(path, &transform, SkRegion::kIntersect_Op); EXPECT_FALSE(area.isEmpty()); EXPECT_FALSE(area.isSimple()); EXPECT_FALSE(area.isRectangleList()); Rect clipRect(area.getClipRect()); clipRect.dump("clipRect"); Rect expected(0, 0, r * 2, r * 2); expected.dump("expected"); EXPECT_EQ(expected, clipRect); SkRegion clipRegion(area.getClipRegion()); auto skRect(clipRegion.getBounds()); Rect regionBounds; regionBounds.set(skRect); EXPECT_EQ(expected, regionBounds); } TEST(ClipArea, replaceNegative) { ClipArea area(createClipArea()); area.setClip(0, 0, 100, 100); Matrix4 transform; transform.loadIdentity(); Rect expected(-50, -50, 50, 50); area.clipRectWithTransform(expected, &transform, SkRegion::kReplace_Op); EXPECT_EQ(expected, area.getClipRect()); } } }