summaryrefslogtreecommitdiff
path: root/core/SkBBoxHierarchy.h
diff options
context:
space:
mode:
Diffstat (limited to 'core/SkBBoxHierarchy.h')
-rw-r--r--core/SkBBoxHierarchy.h88
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