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 16 class SkBBoxHierarchy : public SkRefCnt { 17 public: 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 38 protected: 39 SkBBoxHierarchy() = default; 40 SkBBoxHierarchy(const SkBBoxHierarchy&) = delete; 41 SkBBoxHierarchy& operator=(const SkBBoxHierarchy&) = delete; 42 }; 43 44 class SK_API SkBBHFactory { 45 public: 46 /** 47 * Allocate a new SkBBoxHierarchy. Return NULL on failure. 48 */ 49 virtual sk_sp<SkBBoxHierarchy> operator()() const = 0; ~SkBBHFactory()50 virtual ~SkBBHFactory() {} 51 52 protected: 53 SkBBHFactory() = default; 54 SkBBHFactory(const SkBBHFactory&) = delete; 55 SkBBHFactory& operator=(const SkBBHFactory&) = delete; 56 }; 57 58 class SK_API SkRTreeFactory : public SkBBHFactory { 59 public: 60 sk_sp<SkBBoxHierarchy> operator()() const override; 61 }; 62 63 #endif 64