Make BBH::search() const.

I'd like to have SkRecordDraw() work with a const SkBBoxHierarchy*, but
can't quite today.  The only interesting change here is no longer flushing
if needed in RTree; instead we assert we've been flushed already.

BUG=skia:
R=robertphillips@google.com, mtklein@google.com

Author: mtklein@chromium.org

Review URL: https://codereview.chromium.org/452233002
This commit is contained in:
mtklein 2014-08-08 11:49:39 -07:00 committed by Commit bot
parent 6d42d9c7ff
commit 8875a04136
7 changed files with 23 additions and 17 deletions

View File

@ -59,7 +59,7 @@ public:
/** /**
* Populate 'results' with data pointers corresponding to bounding boxes that intersect 'query' * Populate 'results' with data pointers corresponding to bounding boxes that intersect 'query'
*/ */
virtual void search(const SkIRect& query, SkTDArray<void*>* results) = 0; virtual void search(const SkIRect& query, SkTDArray<void*>* results) const = 0;
virtual void clear() = 0; virtual void clear() = 0;

View File

@ -168,7 +168,7 @@ void SkQuadTree::insert(void* data, const SkIRect& bounds, bool) {
} }
} }
void SkQuadTree::search(const SkIRect& query, SkTDArray<void*>* results) { void SkQuadTree::search(const SkIRect& query, SkTDArray<void*>* results) const {
SkASSERT(NULL != fRoot); SkASSERT(NULL != fRoot);
SkASSERT(NULL != results); SkASSERT(NULL != results);
if (SkIRect::Intersects(fRootBounds, query)) { if (SkIRect::Intersects(fRootBounds, query)) {

View File

@ -54,7 +54,7 @@ public:
/** /**
* Given a query rectangle, populates the passed-in array with the elements it intersects * Given a query rectangle, populates the passed-in array with the elements it intersects
*/ */
virtual void search(const SkIRect& query, SkTDArray<void*>* results) SK_OVERRIDE; virtual void search(const SkIRect& query, SkTDArray<void*>* results) const SK_OVERRIDE;
virtual void clear() SK_OVERRIDE; virtual void clear() SK_OVERRIDE;

View File

@ -102,11 +102,9 @@ void SkRTree::flushDeferredInserts() {
this->validate(); this->validate();
} }
void SkRTree::search(const SkIRect& query, SkTDArray<void*>* results) { void SkRTree::search(const SkIRect& query, SkTDArray<void*>* results) const {
this->validate(); this->validate();
if (0 != fDeferredInserts.count()) { SkASSERT(0 == fDeferredInserts.count()); // If this fails, you should have flushed.
this->flushDeferredInserts();
}
if (!this->isEmpty() && SkIRect::IntersectsNoEmptyCheck(fRoot.fBounds, query)) { if (!this->isEmpty() && SkIRect::IntersectsNoEmptyCheck(fRoot.fBounds, query)) {
this->search(fRoot.fChild.subtree, query, results); this->search(fRoot.fChild.subtree, query, results);
} }
@ -399,7 +397,7 @@ SkRTree::Branch SkRTree::bulkLoad(SkTDArray<Branch>* branches, int level) {
} }
} }
void SkRTree::validate() { void SkRTree::validate() const {
#ifdef SK_DEBUG #ifdef SK_DEBUG
if (this->isEmpty()) { if (this->isEmpty()) {
return; return;
@ -408,7 +406,7 @@ void SkRTree::validate() {
#endif #endif
} }
int SkRTree::validateSubtree(Node* root, SkIRect bounds, bool isRoot) { int SkRTree::validateSubtree(Node* root, SkIRect bounds, bool isRoot) const {
// make sure the pointer is pointing to a valid place // make sure the pointer is pointing to a valid place
SkASSERT(fNodes.contains(static_cast<void*>(root))); SkASSERT(fNodes.contains(static_cast<void*>(root)));

View File

@ -77,7 +77,7 @@ public:
/** /**
* Given a query rectangle, populates the passed-in array with the elements it intersects * Given a query rectangle, populates the passed-in array with the elements it intersects
*/ */
virtual void search(const SkIRect& query, SkTDArray<void*>* results) SK_OVERRIDE; virtual void search(const SkIRect& query, SkTDArray<void*>* results) const SK_OVERRIDE;
virtual void clear() SK_OVERRIDE; virtual void clear() SK_OVERRIDE;
bool isEmpty() const { return 0 == fCount; } bool isEmpty() const { return 0 == fCount; }
@ -177,8 +177,8 @@ private:
*/ */
Branch bulkLoad(SkTDArray<Branch>* branches, int level = 0); Branch bulkLoad(SkTDArray<Branch>* branches, int level = 0);
void validate(); void validate() const;
int validateSubtree(Node* root, SkIRect bounds, bool isRoot = false); int validateSubtree(Node* root, SkIRect bounds, bool isRoot = false) const;
const int fMinChildren; const int fMinChildren;
const int fMaxChildren; const int fMaxChildren;

View File

@ -33,6 +33,10 @@ int SkTileGrid::tileCount(int x, int y) {
return this->tile(x, y).count(); return this->tile(x, y).count();
} }
const SkTDArray<void *>& SkTileGrid::tile(int x, int y) const {
return fTileData[y * fXTileCount + x];
}
SkTDArray<void *>& SkTileGrid::tile(int x, int y) { SkTDArray<void *>& SkTileGrid::tile(int x, int y) {
return fTileData[y * fXTileCount + x]; return fTileData[y * fXTileCount + x];
} }
@ -65,7 +69,7 @@ void SkTileGrid::insert(void* data, const SkIRect& bounds, bool) {
fInsertionCount++; fInsertionCount++;
} }
void SkTileGrid::search(const SkIRect& query, SkTDArray<void*>* results) { void SkTileGrid::search(const SkIRect& query, SkTDArray<void*>* results) const {
SkIRect adjustedQuery = query; SkIRect adjustedQuery = query;
// The inset is to counteract the outset that was applied in 'insert' // The inset is to counteract the outset that was applied in 'insert'
// The outset/inset is to optimize for lookups of size // The outset/inset is to optimize for lookups of size
@ -96,7 +100,7 @@ void SkTileGrid::search(const SkIRect& query, SkTDArray<void*>* results) {
results->reset(); results->reset();
SkAutoSTArray<kStackAllocationTileCount, int> curPositions(queryTileCount); SkAutoSTArray<kStackAllocationTileCount, int> curPositions(queryTileCount);
SkAutoSTArray<kStackAllocationTileCount, SkTDArray<void *>*> storage(queryTileCount); SkAutoSTArray<kStackAllocationTileCount, SkTDArray<void *>*> storage(queryTileCount);
SkTDArray<void *>** tileRange = storage.get(); const SkTDArray<void *>** tileRange = const_cast<const SkTDArray<void*>**>(storage.get());
int tile = 0; int tile = 0;
for (int x = tileStartX; x < tileEndX; ++x) { for (int x = tileStartX; x < tileEndX; ++x) {
for (int y = tileStartY; y < tileEndY; ++y) { for (int y = tileStartY; y < tileEndY; ++y) {

View File

@ -33,7 +33,9 @@ public:
kStackAllocationTileCount = 1024 kStackAllocationTileCount = 1024
}; };
typedef void* (*SkTileGridNextDatumFunctionPtr)(SkTDArray<void*>** tileData, SkAutoSTArray<kStackAllocationTileCount, int>& tileIndices); typedef void* (*SkTileGridNextDatumFunctionPtr)(
const SkTDArray<void*>** tileData,
SkAutoSTArray<kStackAllocationTileCount, int>& tileIndices);
SkTileGrid(int xTileCount, int yTileCount, const SkTileGridFactory::TileGridInfo& info, SkTileGrid(int xTileCount, int yTileCount, const SkTileGridFactory::TileGridInfo& info,
SkTileGridNextDatumFunctionPtr nextDatumFunction); SkTileGridNextDatumFunctionPtr nextDatumFunction);
@ -54,7 +56,7 @@ public:
* Populate 'results' with data pointers corresponding to bounding boxes that intersect 'query' * Populate 'results' with data pointers corresponding to bounding boxes that intersect 'query'
* The query argument is expected to be an exact match to a tile of the grid * The query argument is expected to be an exact match to a tile of the grid
*/ */
virtual void search(const SkIRect& query, SkTDArray<void*>* results) SK_OVERRIDE; virtual void search(const SkIRect& query, SkTDArray<void*>* results) const SK_OVERRIDE;
virtual void clear() SK_OVERRIDE; virtual void clear() SK_OVERRIDE;
@ -75,6 +77,7 @@ public:
int tileCount(int x, int y); // For testing only. int tileCount(int x, int y); // For testing only.
private: private:
const SkTDArray<void*>& tile(int x, int y) const;
SkTDArray<void*>& tile(int x, int y); SkTDArray<void*>& tile(int x, int y);
int fXTileCount, fYTileCount, fTileCount; int fXTileCount, fYTileCount, fTileCount;
@ -103,7 +106,8 @@ private:
* such that 'a < b' is true if 'a' was inserted into the tile grid before 'b'. * such that 'a < b' is true if 'a' was inserted into the tile grid before 'b'.
*/ */
template <typename T> template <typename T>
void* SkTileGridNextDatum(SkTDArray<void*>** tileData, SkAutoSTArray<SkTileGrid::kStackAllocationTileCount, int>& tileIndices) { void* SkTileGridNextDatum(const SkTDArray<void*>** tileData,
SkAutoSTArray<SkTileGrid::kStackAllocationTileCount, int>& tileIndices) {
T* minVal = NULL; T* minVal = NULL;
int tileCount = tileIndices.count(); int tileCount = tileIndices.count();
int minIndex = tileCount; int minIndex = tileCount;