1/*
2 * Copyright 2014 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#ifndef SkBBHFactory_DEFINED
9#define SkBBHFactory_DEFINED
10
11#include "include/core/SkRect.h"
12#include "include/core/SkRefCnt.h"
13#include "include/core/SkTypes.h"
14#include <vector>
15
16class SkBBoxHierarchy : public SkRefCnt {
17public:
18    struct Metadata {
19        bool isDraw;  // The corresponding SkRect bounds a draw command, not a pure state change.
20    };
21
22    /**
23     * Insert N bounding boxes into the hierarchy.
24     */
25    virtual void insert(const SkRect[], int N) = 0;
26    virtual void insert(const SkRect[], const Metadata[], int N);
27
28    /**
29     * Populate results with the indices of bounding boxes intersecting that query.
30     */
31    virtual void search(const SkRect& query, std::vector<int>* results) const = 0;
32
33    /**
34     * Return approximate size in memory of *this.
35     */
36    virtual size_t bytesUsed() const = 0;
37
38protected:
39    SkBBoxHierarchy() = default;
40    SkBBoxHierarchy(const SkBBoxHierarchy&) = delete;
41    SkBBoxHierarchy& operator=(const SkBBoxHierarchy&) = delete;
42};
43
44class SK_API SkBBHFactory {
45public:
46    /**
47     *  Allocate a new SkBBoxHierarchy. Return NULL on failure.
48     */
49    virtual sk_sp<SkBBoxHierarchy> operator()() const = 0;
50    virtual ~SkBBHFactory() {}
51
52protected:
53    SkBBHFactory() = default;
54    SkBBHFactory(const SkBBHFactory&) = delete;
55    SkBBHFactory& operator=(const SkBBHFactory&) = delete;
56};
57
58class SK_API SkRTreeFactory : public SkBBHFactory {
59public:
60    sk_sp<SkBBoxHierarchy> operator()() const override;
61};
62
63#endif
64