// 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_
