|
1 |
|
2 /* |
|
3 * Copyright 2012 Google Inc. |
|
4 * |
|
5 * Use of this source code is governed by a BSD-style license that can be |
|
6 * found in the LICENSE file. |
|
7 */ |
|
8 |
|
9 #ifndef SkBBoxHierarchy_DEFINED |
|
10 #define SkBBoxHierarchy_DEFINED |
|
11 |
|
12 #include "SkRect.h" |
|
13 #include "SkTDArray.h" |
|
14 #include "SkRefCnt.h" |
|
15 |
|
16 /** |
|
17 * Interface for a client class that implements utility methods needed |
|
18 * by SkBBoxHierarchy that require intrinsic knowledge of the data |
|
19 * object type that is stored in the bounding box hierarchy. |
|
20 */ |
|
21 class SkBBoxHierarchyClient { |
|
22 public: |
|
23 virtual ~SkBBoxHierarchyClient() {} |
|
24 |
|
25 /** |
|
26 * Implements a rewind stop condition used by rewindInserts |
|
27 * Must returns true if 'data' points to an object that should be re-wound |
|
28 * by rewinfInserts. |
|
29 */ |
|
30 virtual bool shouldRewind(void* data) = 0; |
|
31 }; |
|
32 |
|
33 /** |
|
34 * Interface for a spatial data structure that associates user data pointers with axis-aligned |
|
35 * bounding boxes, and allows efficient retrieval of intersections with query rectangles. |
|
36 */ |
|
37 class SkBBoxHierarchy : public SkRefCnt { |
|
38 public: |
|
39 SK_DECLARE_INST_COUNT(SkBBoxHierarchy) |
|
40 |
|
41 SkBBoxHierarchy() : fClient(NULL) {} |
|
42 |
|
43 /** |
|
44 * Insert a data pointer and corresponding bounding box |
|
45 * @param data The data pointer, may be NULL |
|
46 * @param bounds The bounding box, should not be empty |
|
47 * @param defer Whether or not it is acceptable to delay insertion of this element (building up |
|
48 * an entire spatial data structure at once is often faster and produces better |
|
49 * structures than repeated inserts) until flushDeferredInserts is called or the first |
|
50 * search. |
|
51 */ |
|
52 virtual void insert(void* data, const SkIRect& bounds, bool defer = false) = 0; |
|
53 |
|
54 /** |
|
55 * If any insertions have been deferred, this forces them to be inserted |
|
56 */ |
|
57 virtual void flushDeferredInserts() = 0; |
|
58 |
|
59 /** |
|
60 * Populate 'results' with data pointers corresponding to bounding boxes that intersect 'query' |
|
61 */ |
|
62 virtual void search(const SkIRect& query, SkTDArray<void*>* results) = 0; |
|
63 |
|
64 virtual void clear() = 0; |
|
65 |
|
66 /** |
|
67 * Gets the number of insertions actually made (does not include deferred insertions) |
|
68 */ |
|
69 virtual int getCount() const = 0; |
|
70 |
|
71 /** |
|
72 * Returns the depth of the currently allocated tree. The root node counts for 1 level, |
|
73 * so it should be 1 or more if there's a root node. This information provides details |
|
74 * about the underlying structure, which is useful mainly for testing purposes. |
|
75 * |
|
76 * Returns 0 if there are currently no nodes in the tree. |
|
77 * Returns -1 if the structure isn't a tree. |
|
78 */ |
|
79 virtual int getDepth() const = 0; |
|
80 |
|
81 /** |
|
82 * Rewinds all the most recently inserted data elements until an element |
|
83 * is encountered for which client->shouldRewind(data) returns false. May |
|
84 * not rewind elements that were inserted prior to the last call to |
|
85 * flushDeferredInserts. |
|
86 */ |
|
87 virtual void rewindInserts() = 0; |
|
88 |
|
89 void setClient(SkBBoxHierarchyClient* client) { fClient = client; } |
|
90 |
|
91 protected: |
|
92 SkBBoxHierarchyClient* fClient; |
|
93 |
|
94 private: |
|
95 typedef SkRefCnt INHERITED; |
|
96 }; |
|
97 |
|
98 #endif |