| // 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 <list> |
| #include <map> |
| |
| #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<int>* 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<SkRect> 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<int, SkRect> draw_op_; |
| sk_sp<SkBBoxHierarchy> bbh_; |
| int all_ops_count_; |
| }; |
| |
| class RTreeFactory : public SkBBHFactory { |
| public: |
| RTreeFactory(); |
| |
| // Gets the instance to the R-tree. |
| sk_sp<RTree> getInstance(); |
| sk_sp<SkBBoxHierarchy> operator()() const override; |
| |
| private: |
| sk_sp<RTree> r_tree_; |
| }; |
| |
| } // namespace flutter |
| |
| #endif // FLUTTER_FLOW_RTREE_H_ |