/* * Copyright 2021 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "include/utils/SkRandom.h" #include "src/gpu/graphite/geom/IntersectionTree.h" #include "tests/Test.h" namespace skgpu::graphite { class SimpleIntersectionTree { public: bool add(SkRect rect) { for (const SkRect& r : fRects) { if (r.intersects(rect)) { return false; } } fRects.push_back(rect); return true; } private: std::vector fRects; }; #define CHECK(A) REPORTER_ASSERT(reporter, A) DEF_GRAPHITE_TEST(skgpu_IntersectionTree, reporter) { SkRandom rand; { SimpleIntersectionTree simpleTree; IntersectionTree tree; for (int i = 0; i < 1000; ++i) { Rect rect = Rect::XYWH(rand.nextRangeF(0, 500), rand.nextRangeF(0, 500), rand.nextRangeF(0, 70), rand.nextRangeF(0, 70)); CHECK(tree.add(rect) == simpleTree.add({rect.left(), rect.top(), rect.right(), rect.bot()})); } } { SimpleIntersectionTree simpleTree; IntersectionTree tree; for (int i = 0; i < 100; ++i) { Rect rect = Rect::XYWH(rand.nextRangeF(0, 500), rand.nextRangeF(0, 500), rand.nextRangeF(0, 200), rand.nextRangeF(0, 200)); CHECK(tree.add(rect) == simpleTree.add({rect.left(), rect.top(), rect.right(), rect.bot()})); } } { SimpleIntersectionTree simpleTree; IntersectionTree tree; CHECK(tree.add(Rect::Infinite())); CHECK(!tree.add(Rect::WH(1,1))); CHECK(!tree.add(Rect::WH(1,std::numeric_limits::infinity()))); CHECK(tree.add(Rect::WH(0, 0))); CHECK(tree.add(Rect::WH(-1, 1))); CHECK(tree.add(Rect::WH(1, std::numeric_limits::quiet_NaN()))); } } } // namespace skgpu::graphite