diff options
Diffstat (limited to 'core/SkBBoxHierarchy.h')
-rw-r--r-- | core/SkBBoxHierarchy.h | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/core/SkBBoxHierarchy.h b/core/SkBBoxHierarchy.h new file mode 100644 index 00000000..62b22d80 --- /dev/null +++ b/core/SkBBoxHierarchy.h @@ -0,0 +1,88 @@ + +/* + * Copyright 2012 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#ifndef SkBBoxHierarchy_DEFINED +#define SkBBoxHierarchy_DEFINED + +#include "SkRect.h" +#include "SkTDArray.h" +#include "SkRefCnt.h" + +/** + * Interface for a client class that implements utility methods needed + * by SkBBoxHierarchy that require intrinsic knowledge of the data + * object type that is stored in the bounding box hierarchy. + */ +class SkBBoxHierarchyClient { +public: + virtual ~SkBBoxHierarchyClient() {} + + /** + * Implements a rewind stop condition used by rewindInserts + * Must returns true if 'data' points to an object that should be re-wound + * by rewinfInserts. + */ + virtual bool shouldRewind(void* data) = 0; +}; + +/** + * Interface for a spatial data structure that associates user data pointers with axis-aligned + * bounding boxes, and allows efficient retrieval of intersections with query rectangles. + */ +class SkBBoxHierarchy : public SkRefCnt { +public: + SK_DECLARE_INST_COUNT(SkBBoxHierarchy) + + SkBBoxHierarchy() : fClient(NULL) {} + + /** + * Insert a data pointer and corresponding bounding box + * @param data The data pointer, may be NULL + * @param bounds The bounding box, should not be empty + * @param defer Whether or not it is acceptable to delay insertion of this element (building up + * an entire spatial data structure at once is often faster and produces better + * structures than repeated inserts) until flushDeferredInserts is called or the first + * search. + */ + virtual void insert(void* data, const SkIRect& bounds, bool defer = false) = 0; + + /** + * If any insertions have been deferred, this forces them to be inserted + */ + virtual void flushDeferredInserts() = 0; + + /** + * Populate 'results' with data pointers corresponding to bounding boxes that intersect 'query' + */ + virtual void search(const SkIRect& query, SkTDArray<void*>* results) = 0; + + virtual void clear() = 0; + + /** + * Gets the number of insertions + */ + virtual int getCount() const = 0; + + /** + * Rewinds all the most recently inserted data elements until an element + * is encountered for which client->shouldRewind(data) returns false. May + * not rewind elements that were inserted prior to the last call to + * flushDeferredInserts. + */ + virtual void rewindInserts() = 0; + + void setClient(SkBBoxHierarchyClient* client) { fClient = client; } + +protected: + SkBBoxHierarchyClient* fClient; + +private: + typedef SkRefCnt INHERITED; +}; + +#endif |