void onDraw(int loops, SkCanvas* canvas) override { SkRandom rand; SkAutoTMalloc<SkRect> rects(NUM_BUILD_RECTS); for (int i = 0; i < NUM_BUILD_RECTS; ++i) { rects[i] = fProc(rand, i, NUM_BUILD_RECTS); } for (int i = 0; i < loops; ++i) { SkRTree tree; tree.insert(rects.get(), NUM_BUILD_RECTS); SkASSERT(rects != nullptr); // It'd break this bench if the tree took ownership of rects. } }
DEF_TEST(RTree, reporter) { int expectedDepthMin = -1; int tmp = NUM_RECTS; while (tmp > 0) { tmp -= static_cast<int>(pow(static_cast<double>(SkRTree::kMaxChildren), static_cast<double>(expectedDepthMin + 1))); ++expectedDepthMin; } int expectedDepthMax = -1; tmp = NUM_RECTS; while (tmp > 0) { tmp -= static_cast<int>(pow(static_cast<double>(SkRTree::kMinChildren), static_cast<double>(expectedDepthMax + 1))); ++expectedDepthMax; } SkRandom rand; SkAutoTMalloc<SkRect> rects(NUM_RECTS); for (size_t i = 0; i < NUM_ITERATIONS; ++i) { SkRTree rtree; REPORTER_ASSERT(reporter, 0 == rtree.getCount()); for (int j = 0; j < NUM_RECTS; j++) { rects[j] = random_rect(rand); } rtree.insert(rects.get(), NUM_RECTS); SkASSERT(rects); // SkRTree doesn't take ownership of rects. run_queries(reporter, rand, rects, rtree); REPORTER_ASSERT(reporter, NUM_RECTS == rtree.getCount()); REPORTER_ASSERT(reporter, expectedDepthMin <= rtree.getDepth() && expectedDepthMax >= rtree.getDepth()); } }
static void TestRTree(skiatest::Reporter* reporter) { DataRect rects[NUM_RECTS]; SkRandom rand; SkRTree* rtree = SkRTree::Create(MIN_CHILDREN, MAX_CHILDREN); SkAutoUnref au(rtree); REPORTER_ASSERT(reporter, NULL != rtree); int expectedDepthMin = -1; int expectedDepthMax = -1; int tmp = NUM_RECTS; while (tmp > 0) { tmp -= static_cast<int>(pow(static_cast<double>(MAX_CHILDREN), static_cast<double>(expectedDepthMin + 1))); ++expectedDepthMin; } tmp = NUM_RECTS; while (tmp > 0) { tmp -= static_cast<int>(pow(static_cast<double>(MIN_CHILDREN), static_cast<double>(expectedDepthMax + 1))); ++expectedDepthMax; } for (size_t i = 0; i < NUM_ITERATIONS; ++i) { random_data_rects(rand, rects, NUM_RECTS); // First try bulk-loaded inserts for (int i = 0; i < NUM_RECTS; ++i) { rtree->insert(rects[i].data, rects[i].rect, true); } rtree->flushDeferredInserts(); runQueries(reporter, rand, rects, *rtree); REPORTER_ASSERT(reporter, NUM_RECTS == rtree->getCount()); REPORTER_ASSERT(reporter, expectedDepthMin <= rtree->getDepth() && expectedDepthMax >= rtree->getDepth()); rtree->clear(); REPORTER_ASSERT(reporter, 0 == rtree->getCount()); // Then try immediate inserts for (int i = 0; i < NUM_RECTS; ++i) { rtree->insert(rects[i].data, rects[i].rect); } runQueries(reporter, rand, rects, *rtree); REPORTER_ASSERT(reporter, NUM_RECTS == rtree->getCount()); REPORTER_ASSERT(reporter, expectedDepthMin <= rtree->getDepth() && expectedDepthMax >= rtree->getDepth()); rtree->clear(); REPORTER_ASSERT(reporter, 0 == rtree->getCount()); // And for good measure try immediate inserts, but in reversed order for (int i = NUM_RECTS - 1; i >= 0; --i) { rtree->insert(rects[i].data, rects[i].rect); } runQueries(reporter, rand, rects, *rtree); REPORTER_ASSERT(reporter, NUM_RECTS == rtree->getCount()); REPORTER_ASSERT(reporter, expectedDepthMin <= rtree->getDepth() && expectedDepthMax >= rtree->getDepth()); rtree->clear(); REPORTER_ASSERT(reporter, 0 == rtree->getCount()); } }