xref: /aosp_15_r20/external/skia/include/core/SkBBHFactory.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
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/SkRefCnt.h"
12 #include "include/core/SkTypes.h"
13 
14 // TODO(kjlubick) fix client users and then make this a forward declare
15 #include "include/core/SkRect.h"  // IWYU pragma: keep
16 
17 #include <cstddef>
18 #include <vector>
19 
20 class SkBBoxHierarchy : public SkRefCnt {
21 public:
22     struct Metadata {
23         bool isDraw;  // The corresponding SkRect bounds a draw command, not a pure state change.
24     };
25 
26     /**
27      * Insert N bounding boxes into the hierarchy.
28      */
29     virtual void insert(const SkRect[], int N) = 0;
30     virtual void insert(const SkRect[], const Metadata[], int N);
31 
32     /**
33      * Populate results with the indices of bounding boxes intersecting that query.
34      */
35     virtual void search(const SkRect& query, std::vector<int>* results) const = 0;
36 
37     /**
38      * Return approximate size in memory of *this.
39      */
40     virtual size_t bytesUsed() const = 0;
41 
42 protected:
43     SkBBoxHierarchy() = default;
44     SkBBoxHierarchy(const SkBBoxHierarchy&) = delete;
45     SkBBoxHierarchy& operator=(const SkBBoxHierarchy&) = delete;
46 };
47 
48 class SK_API SkBBHFactory {
49 public:
50     /**
51      *  Allocate a new SkBBoxHierarchy. Return NULL on failure.
52      */
53     virtual sk_sp<SkBBoxHierarchy> operator()() const = 0;
~SkBBHFactory()54     virtual ~SkBBHFactory() {}
55 
56 protected:
57     SkBBHFactory() = default;
58     SkBBHFactory(const SkBBHFactory&) = delete;
59     SkBBHFactory& operator=(const SkBBHFactory&) = delete;
60 };
61 
62 class SK_API SkRTreeFactory : public SkBBHFactory {
63 public:
64     sk_sp<SkBBoxHierarchy> operator()() const override;
65 };
66 
67 #endif
68