ClipAreaTests.cpp revision 386aa031793bb037ec43b6cdbd8908c343cc86cb
1487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk/* 2487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk * Copyright (C) 2015 The Android Open Source Project 3487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk * 4487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk * Licensed under the Apache License, Version 2.0 (the "License"); 5487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk * you may not use this file except in compliance with the License. 6487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk * You may obtain a copy of the License at 7487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk * 8487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk * http://www.apache.org/licenses/LICENSE-2.0 9487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk * 10487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk * Unless required by applicable law or agreed to in writing, software 11487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk * distributed under the License is distributed on an "AS IS" BASIS, 12487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk * See the License for the specific language governing permissions and 14487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk * limitations under the License. 15487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk */ 16487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk 17487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk#include <gtest/gtest.h> 18487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk#include <SkPath.h> 19487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk#include <SkRegion.h> 20487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk 21487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk#include "ClipArea.h" 22487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk 23487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk#include "Matrix.h" 24487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk#include "Rect.h" 25487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk#include "utils/LinearAllocator.h" 26487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk 27487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuknamespace android { 28487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuknamespace uirenderer { 29487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk 30487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsukstatic Rect kViewportBounds(0, 0, 2048, 2048); 31487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk 32487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsukstatic ClipArea createClipArea() { 33487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk ClipArea area; 34487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk area.setViewportDimensions(kViewportBounds.getWidth(), kViewportBounds.getHeight()); 35487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk return area; 36487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk} 37487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk 38487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob TsukTEST(TransformedRectangle, basics) { 39487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk Rect r(0, 0, 100, 100); 40487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk Matrix4 minus90; 41487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk minus90.loadRotate(-90); 42487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk minus90.mapRect(r); 43487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk Rect r2(20, 40, 120, 60); 44487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk 45487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk Matrix4 m90; 46487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk m90.loadRotate(90); 47487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk TransformedRectangle tr(r, m90); 48487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk EXPECT_TRUE(tr.canSimplyIntersectWith(tr)); 49487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk 50487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk Matrix4 m0; 51487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk TransformedRectangle tr0(r2, m0); 52487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk EXPECT_FALSE(tr.canSimplyIntersectWith(tr0)); 53487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk 54487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk Matrix4 m45; 55487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk m45.loadRotate(45); 56487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk TransformedRectangle tr2(r, m45); 57487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk EXPECT_FALSE(tr2.canSimplyIntersectWith(tr)); 58487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk} 59487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk 60487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob TsukTEST(RectangleList, basics) { 61487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk RectangleList list; 62487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk EXPECT_TRUE(list.isEmpty()); 63487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk 64487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk Rect r(0, 0, 100, 100); 65487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk Matrix4 m45; 66487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk m45.loadRotate(45); 67487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk list.set(r, m45); 68487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk EXPECT_FALSE(list.isEmpty()); 69487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk 70487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk Rect r2(20, 20, 200, 200); 71487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk list.intersectWith(r2, m45); 72487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk EXPECT_FALSE(list.isEmpty()); 73487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk EXPECT_EQ(1, list.getTransformedRectanglesCount()); 74487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk 75487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk Rect r3(20, 20, 200, 200); 76487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk Matrix4 m30; 77487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk m30.loadRotate(30); 78487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk list.intersectWith(r2, m30); 79487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk EXPECT_FALSE(list.isEmpty()); 80487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk EXPECT_EQ(2, list.getTransformedRectanglesCount()); 81487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk 82487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk SkRegion clip; 83487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk clip.setRect(0, 0, 2000, 2000); 84487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk SkRegion rgn(list.convertToRegion(clip)); 85487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk EXPECT_FALSE(rgn.isEmpty()); 86487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk} 87487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk 88487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob TsukTEST(ClipArea, basics) { 89487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk ClipArea area(createClipArea()); 90487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk EXPECT_FALSE(area.isEmpty()); 91487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk} 92487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk 93487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob TsukTEST(ClipArea, paths) { 94487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk ClipArea area(createClipArea()); 95487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk SkPath path; 96487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk SkScalar r = 100; 97487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk path.addCircle(r, r, r); 98386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik area.clipPathWithTransform(path, &Matrix4::identity(), SkRegion::kIntersect_Op); 99487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk EXPECT_FALSE(area.isEmpty()); 100487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk EXPECT_FALSE(area.isSimple()); 101487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk EXPECT_FALSE(area.isRectangleList()); 102b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 103487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk Rect clipRect(area.getClipRect()); 104487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk Rect expected(0, 0, r * 2, r * 2); 105487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk EXPECT_EQ(expected, clipRect); 106487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk SkRegion clipRegion(area.getClipRegion()); 107487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk auto skRect(clipRegion.getBounds()); 108487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk Rect regionBounds; 109487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk regionBounds.set(skRect); 110487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk EXPECT_EQ(expected, regionBounds); 111487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk} 1128ce8f3f4d68a7750bc02b5254ebbd8658281e675Chris Craik 1138ce8f3f4d68a7750bc02b5254ebbd8658281e675Chris CraikTEST(ClipArea, replaceNegative) { 1148ce8f3f4d68a7750bc02b5254ebbd8658281e675Chris Craik ClipArea area(createClipArea()); 1158ce8f3f4d68a7750bc02b5254ebbd8658281e675Chris Craik area.setClip(0, 0, 100, 100); 1168ce8f3f4d68a7750bc02b5254ebbd8658281e675Chris Craik 1178ce8f3f4d68a7750bc02b5254ebbd8658281e675Chris Craik Rect expected(-50, -50, 50, 50); 118386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik area.clipRectWithTransform(expected, &Matrix4::identity(), SkRegion::kReplace_Op); 1198ce8f3f4d68a7750bc02b5254ebbd8658281e675Chris Craik EXPECT_EQ(expected, area.getClipRect()); 1208ce8f3f4d68a7750bc02b5254ebbd8658281e675Chris Craik} 121386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik 122487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk} 123487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk} 124