// Copyright 2013 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef FLUTTER_FLOW_RTREE_H_ #define FLUTTER_FLOW_RTREE_H_ #include #include #include "third_party/skia/include/core/SkBBHFactory.h" #include "third_party/skia/include/core/SkTypes.h" namespace flutter { /** * An R-Tree implementation that forwards calls to an SkRTree. * * This implementation provides a searchNonOverlappingDrawnRects method, * which can be used to query the rects for the operations recorded in the tree. */ class RTree : public SkBBoxHierarchy { public: RTree(); void insert(const SkRect[], const SkBBoxHierarchy::Metadata[], int N) override; void insert(const SkRect[], int N) override; void search(const SkRect& query, std::vector* results) const override; size_t bytesUsed() const override; // Finds the rects in the tree that represent drawing operations and intersect // with the query rect. // // When two rects intersect with each other, they are joined into a single // rect which also intersects with the query rect. In other words, the bounds // of each rect in the result list are mutually exclusive. std::list searchNonOverlappingDrawnRects(const SkRect& query) const; // Insertion count (not overall node count, which may be greater). int getCount() const { return all_ops_count_; } private: // A map containing the draw operation rects keyed off the operation index // in the insert call. std::map draw_op_; sk_sp bbh_; int all_ops_count_; }; class RTreeFactory : public SkBBHFactory { public: RTreeFactory(); // Gets the instance to the R-tree. sk_sp getInstance(); sk_sp operator()() const override; private: sk_sp r_tree_; }; } // namespace flutter #endif // FLUTTER_FLOW_RTREE_H_