1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2021 Google Inc. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#include "experimental/graphite/src/geom/IntersectionTree.h" 9cb93a386Sopenharmony_ci#include "include/utils/SkRandom.h" 10cb93a386Sopenharmony_ci#include "tests/Test.h" 11cb93a386Sopenharmony_ci 12cb93a386Sopenharmony_cinamespace skgpu { 13cb93a386Sopenharmony_ci 14cb93a386Sopenharmony_ciclass SimpleIntersectionTree { 15cb93a386Sopenharmony_cipublic: 16cb93a386Sopenharmony_ci bool add(SkRect rect) { 17cb93a386Sopenharmony_ci for (const SkRect& r : fRects) { 18cb93a386Sopenharmony_ci if (r.intersects(rect)) { 19cb93a386Sopenharmony_ci return false; 20cb93a386Sopenharmony_ci } 21cb93a386Sopenharmony_ci } 22cb93a386Sopenharmony_ci fRects.push_back(rect); 23cb93a386Sopenharmony_ci return true; 24cb93a386Sopenharmony_ci } 25cb93a386Sopenharmony_ci 26cb93a386Sopenharmony_ciprivate: 27cb93a386Sopenharmony_ci std::vector<SkRect> fRects; 28cb93a386Sopenharmony_ci}; 29cb93a386Sopenharmony_ci 30cb93a386Sopenharmony_ci#define CHECK(A) REPORTER_ASSERT(reporter, A) 31cb93a386Sopenharmony_ci 32cb93a386Sopenharmony_ciDEF_GRAPHITE_TEST(skgpu_IntersectionTree, reporter) { 33cb93a386Sopenharmony_ci SkRandom rand; 34cb93a386Sopenharmony_ci { 35cb93a386Sopenharmony_ci SimpleIntersectionTree simpleTree; 36cb93a386Sopenharmony_ci IntersectionTree tree; 37cb93a386Sopenharmony_ci for (int i = 0; i < 1000; ++i) { 38cb93a386Sopenharmony_ci Rect rect = Rect::XYWH(rand.nextRangeF(0, 500), 39cb93a386Sopenharmony_ci rand.nextRangeF(0, 500), 40cb93a386Sopenharmony_ci rand.nextRangeF(0, 70), 41cb93a386Sopenharmony_ci rand.nextRangeF(0, 70)); 42cb93a386Sopenharmony_ci CHECK(tree.add(rect) == simpleTree.add({rect.left(), 43cb93a386Sopenharmony_ci rect.top(), 44cb93a386Sopenharmony_ci rect.right(), 45cb93a386Sopenharmony_ci rect.bot()})); 46cb93a386Sopenharmony_ci } 47cb93a386Sopenharmony_ci } 48cb93a386Sopenharmony_ci { 49cb93a386Sopenharmony_ci SimpleIntersectionTree simpleTree; 50cb93a386Sopenharmony_ci IntersectionTree tree; 51cb93a386Sopenharmony_ci for (int i = 0; i < 100; ++i) { 52cb93a386Sopenharmony_ci Rect rect = Rect::XYWH(rand.nextRangeF(0, 500), 53cb93a386Sopenharmony_ci rand.nextRangeF(0, 500), 54cb93a386Sopenharmony_ci rand.nextRangeF(0, 200), 55cb93a386Sopenharmony_ci rand.nextRangeF(0, 200)); 56cb93a386Sopenharmony_ci CHECK(tree.add(rect) == simpleTree.add({rect.left(), 57cb93a386Sopenharmony_ci rect.top(), 58cb93a386Sopenharmony_ci rect.right(), 59cb93a386Sopenharmony_ci rect.bot()})); 60cb93a386Sopenharmony_ci } 61cb93a386Sopenharmony_ci } 62cb93a386Sopenharmony_ci { 63cb93a386Sopenharmony_ci SimpleIntersectionTree simpleTree; 64cb93a386Sopenharmony_ci IntersectionTree tree; 65cb93a386Sopenharmony_ci CHECK(tree.add(Rect(float2(-std::numeric_limits<float>::infinity()), 66cb93a386Sopenharmony_ci float2(std::numeric_limits<float>::infinity())))); 67cb93a386Sopenharmony_ci CHECK(!tree.add(Rect::WH(1,1))); 68cb93a386Sopenharmony_ci CHECK(!tree.add(Rect::WH(1,std::numeric_limits<float>::infinity()))); 69cb93a386Sopenharmony_ci CHECK(tree.add(Rect::WH(0, 0))); 70cb93a386Sopenharmony_ci CHECK(tree.add(Rect::WH(-1, 1))); 71cb93a386Sopenharmony_ci CHECK(tree.add(Rect::WH(1, std::numeric_limits<float>::quiet_NaN()))); 72cb93a386Sopenharmony_ci } 73cb93a386Sopenharmony_ci} 74cb93a386Sopenharmony_ci 75cb93a386Sopenharmony_ci} // namespace skgpu 76