Index: src/core/SkQuadTree.cpp |
diff --git a/src/core/SkQuadTree.cpp b/src/core/SkQuadTree.cpp |
deleted file mode 100644 |
index 1fc3cd0192a26c64efe3a06ef5baf4cfd8a17aec..0000000000000000000000000000000000000000 |
--- a/src/core/SkQuadTree.cpp |
+++ /dev/null |
@@ -1,219 +0,0 @@ |
-/* |
- * Copyright 2014 Google Inc. |
- * |
- * Use of this source code is governed by a BSD-style license that can be |
- * found in the LICENSE file. |
- */ |
- |
-#include "SkQuadTree.h" |
-#include "SkTSort.h" |
-#include <stdio.h> |
- |
-static const int kSplitThreshold = 8; |
- |
-enum { |
- kTopLeft, |
- kTopRight, |
- kBottomLeft, |
- kBottomRight, |
-}; |
-enum { |
- kTopLeft_Bit = 1 << kTopLeft, |
- kTopRight_Bit = 1 << kTopRight, |
- kBottomLeft_Bit = 1 << kBottomLeft, |
- kBottomRight_Bit = 1 << kBottomRight, |
-}; |
-enum { |
- kMaskLeft = kTopLeft_Bit | kBottomLeft_Bit, |
- kMaskRight = kTopRight_Bit | kBottomRight_Bit, |
- kMaskTop = kTopLeft_Bit | kTopRight_Bit, |
- kMaskBottom = kBottomLeft_Bit | kBottomRight_Bit, |
-}; |
- |
-static U8CPU child_intersect(const SkIRect& query, const SkIPoint& split) { |
- // fast quadrant test |
- U8CPU intersect = 0xf; |
- if (query.fRight < split.fX) { |
- intersect &= ~kMaskRight; |
- } else if(query.fLeft >= split.fX) { |
- intersect &= ~kMaskLeft; |
- } |
- if (query.fBottom < split.fY) { |
- intersect &= ~kMaskBottom; |
- } else if(query.fTop >= split.fY) { |
- intersect &= ~kMaskTop; |
- } |
- return intersect; |
-} |
- |
-SkQuadTree::SkQuadTree(const SkIRect& bounds) : fRoot(NULL) { |
- SkASSERT((bounds.width() * bounds.height()) > 0); |
- fRootBounds = bounds; |
-} |
- |
-SkQuadTree::~SkQuadTree() { |
-} |
- |
-void SkQuadTree::insert(Node* node, Entry* entry) { |
- // does it belong in a child? |
- if (NULL != node->fChildren[0]) { |
- switch(child_intersect(entry->fBounds, node->fSplitPoint)) { |
- case kTopLeft_Bit: |
- this->insert(node->fChildren[kTopLeft], entry); |
- return; |
- case kTopRight_Bit: |
- this->insert(node->fChildren[kTopRight], entry); |
- return; |
- case kBottomLeft_Bit: |
- this->insert(node->fChildren[kBottomLeft], entry); |
- return; |
- case kBottomRight_Bit: |
- this->insert(node->fChildren[kBottomRight], entry); |
- return; |
- default: |
- node->fEntries.push(entry); |
- return; |
- } |
- } |
- // No children yet, add to this node |
- node->fEntries.push(entry); |
- // should I split? |
- if (node->fEntries.getCount() > kSplitThreshold) { |
- this->split(node); |
- } |
-} |
- |
-void SkQuadTree::split(Node* node) { |
- // Build all the children |
- node->fSplitPoint = SkIPoint::Make(node->fBounds.centerX(), |
- node->fBounds.centerY()); |
- for(int index=0; index<kChildCount; ++index) { |
- node->fChildren[index] = fNodePool.acquire(); |
- } |
- node->fChildren[0]->fBounds = SkIRect::MakeLTRB( |
- node->fBounds.fLeft, node->fBounds.fTop, |
- node->fSplitPoint.fX, node->fSplitPoint.fY); |
- node->fChildren[1]->fBounds = SkIRect::MakeLTRB( |
- node->fSplitPoint.fX, node->fBounds.fTop, |
- node->fBounds.fRight, node->fSplitPoint.fY); |
- node->fChildren[2]->fBounds = SkIRect::MakeLTRB( |
- node->fBounds.fLeft, node->fSplitPoint.fY, |
- node->fSplitPoint.fX, node->fBounds.fBottom); |
- node->fChildren[3]->fBounds = SkIRect::MakeLTRB( |
- node->fSplitPoint.fX, node->fSplitPoint.fY, |
- node->fBounds.fRight, node->fBounds.fBottom); |
- // reinsert all the entries of this node to allow child trickle |
- SkTInternalSList<Entry> entries; |
- entries.pushAll(&node->fEntries); |
- while(!entries.isEmpty()) { |
- this->insert(node, entries.pop()); |
- } |
-} |
- |
-void SkQuadTree::search(Node* node, const SkIRect& query, |
- SkTDArray<void*>* results) const { |
- for (Entry* entry = node->fEntries.head(); NULL != entry; |
- entry = entry->getSListNext()) { |
- if (SkIRect::IntersectsNoEmptyCheck(entry->fBounds, query)) { |
- results->push(entry->fData); |
- } |
- } |
- if (NULL == node->fChildren[0]) { |
- return; |
- } |
- U8CPU intersect = child_intersect(query, node->fSplitPoint); |
- for(int index=0; index<kChildCount; ++index) { |
- if (intersect & (1 << index)) { |
- this->search(node->fChildren[index], query, results); |
- } |
- } |
-} |
- |
-void SkQuadTree::clear(Node* node) { |
- // first clear the entries of this node |
- fEntryPool.releaseAll(&node->fEntries); |
- // recurse into and clear all child nodes |
- for(int index=0; index<kChildCount; ++index) { |
- Node* child = node->fChildren[index]; |
- node->fChildren[index] = NULL; |
- if (NULL != child) { |
- this->clear(child); |
- fNodePool.release(child); |
- } |
- } |
-} |
- |
-int SkQuadTree::getDepth(Node* node) const { |
- int maxDepth = 0; |
- if (NULL != node) { |
- for(int index=0; index<kChildCount; ++index) { |
- maxDepth = SkMax32(maxDepth, getDepth(node->fChildren[index])); |
- } |
- } |
- return maxDepth + 1; |
-} |
- |
-void SkQuadTree::insert(void* data, const SkIRect& bounds, bool) { |
- if (bounds.isEmpty()) { |
- SkASSERT(false); |
- return; |
- } |
- Entry* entry = fEntryPool.acquire(); |
- entry->fData = data; |
- entry->fBounds = bounds; |
- if (NULL == fRoot) { |
- fDeferred.push(entry); |
- } else { |
- this->insert(fRoot, entry); |
- } |
-} |
- |
-void SkQuadTree::search(const SkIRect& query, SkTDArray<void*>* results) const { |
- SkASSERT(NULL != fRoot); |
- SkASSERT(NULL != results); |
- if (SkIRect::Intersects(fRootBounds, query)) { |
- this->search(fRoot, query, results); |
- } |
-} |
- |
-void SkQuadTree::clear() { |
- this->flushDeferredInserts(); |
- if (NULL != fRoot) { |
- this->clear(fRoot); |
- fNodePool.release(fRoot); |
- fRoot = NULL; |
- } |
- SkASSERT(fEntryPool.allocated() == fEntryPool.available()); |
- SkASSERT(fNodePool.allocated() == fNodePool.available()); |
-} |
- |
-int SkQuadTree::getDepth() const { |
- return this->getDepth(fRoot); |
-} |
- |
-void SkQuadTree::rewindInserts() { |
- SkASSERT(fClient); |
- // Currently only supports deferred inserts |
- SkASSERT(NULL == fRoot); |
- SkTInternalSList<Entry> entries; |
- entries.pushAll(&fDeferred); |
- while(!entries.isEmpty()) { |
- Entry* entry = entries.pop(); |
- if (fClient->shouldRewind(entry->fData)) { |
- entry->fData = NULL; |
- fEntryPool.release(entry); |
- } else { |
- fDeferred.push(entry); |
- } |
- } |
-} |
- |
-void SkQuadTree::flushDeferredInserts() { |
- if (NULL == fRoot) { |
- fRoot = fNodePool.acquire(); |
- fRoot->fBounds = fRootBounds; |
- } |
- while(!fDeferred.isEmpty()) { |
- this->insert(fRoot, fDeferred.pop()); |
- } |
-} |