| Index: src/core/SkTileGrid.cpp
|
| diff --git a/src/core/SkTileGrid.cpp b/src/core/SkTileGrid.cpp
|
| index c86e78928cbf4379a0446604c380a4fa8ccf6d77..2d6f3b1209552d48e65859d96fc98a4cb4601738 100644
|
| --- a/src/core/SkTileGrid.cpp
|
| +++ b/src/core/SkTileGrid.cpp
|
| @@ -7,9 +7,9 @@
|
| */
|
|
|
| #include "SkTileGrid.h"
|
| +#include "SkPictureStateTree.h"
|
|
|
| -SkTileGrid::SkTileGrid(int xTileCount, int yTileCount, const SkTileGridFactory::TileGridInfo& info,
|
| - SkTileGridNextDatumFunctionPtr nextDatumFunction) {
|
| +SkTileGrid::SkTileGrid(int xTileCount, int yTileCount, const SkTileGridFactory::TileGridInfo& info) {
|
| fXTileCount = xTileCount;
|
| fYTileCount = yTileCount;
|
| fInfo = info;
|
| @@ -21,7 +21,6 @@ SkTileGrid::SkTileGrid(int xTileCount, int yTileCount, const SkTileGridFactory::
|
| fInsertionCount = 0;
|
| fGridBounds = SkIRect::MakeXYWH(0, 0, fInfo.fTileInterval.width() * fXTileCount,
|
| fInfo.fTileInterval.height() * fYTileCount);
|
| - fNextDatumFunction = nextDatumFunction;
|
| fTileData = SkNEW_ARRAY(SkTDArray<void *>, fTileCount);
|
| }
|
|
|
| @@ -69,6 +68,43 @@ void SkTileGrid::insert(void* data, const SkIRect& bounds, bool) {
|
| fInsertionCount++;
|
| }
|
|
|
| +static void* next_datum(const SkTDArray<void*>** tileData,
|
| + SkAutoSTArray<SkTileGrid::kStackAllocationTileCount, int>& tileIndices) {
|
| + SkPictureStateTree::Draw* minVal = NULL;
|
| + int tileCount = tileIndices.count();
|
| + int minIndex = tileCount;
|
| + int maxIndex = 0;
|
| + // Find the next Datum; track where it's found so we reduce the size of the second loop.
|
| + for (int tile = 0; tile < tileCount; ++tile) {
|
| + int pos = tileIndices[tile];
|
| + if (pos != SkTileGrid::kTileFinished) {
|
| + SkPictureStateTree::Draw* candidate = (SkPictureStateTree::Draw*)(*tileData[tile])[pos];
|
| + if (NULL == minVal || (*candidate) < (*minVal)) {
|
| + minVal = candidate;
|
| + minIndex = tile;
|
| + maxIndex = tile;
|
| + } else if (!((*minVal) < (*candidate))) {
|
| + // We don't require operator==; if !(candidate<minVal) && !(minVal<candidate),
|
| + // candidate==minVal and we have to add this tile to the range searched.
|
| + maxIndex = tile;
|
| + }
|
| + }
|
| + }
|
| + // Increment indices past the next datum
|
| + if (minVal != NULL) {
|
| + for (int tile = minIndex; tile <= maxIndex; ++tile) {
|
| + int pos = tileIndices[tile];
|
| + if (pos != SkTileGrid::kTileFinished && (*tileData[tile])[pos] == minVal) {
|
| + if (++(tileIndices[tile]) >= tileData[tile]->count()) {
|
| + tileIndices[tile] = SkTileGrid::kTileFinished;
|
| + }
|
| + }
|
| + }
|
| + return minVal;
|
| + }
|
| + return NULL;
|
| +}
|
| +
|
| void SkTileGrid::search(const SkIRect& query, SkTDArray<void*>* results) const {
|
| SkIRect adjustedQuery = query;
|
| // The inset is to counteract the outset that was applied in 'insert'
|
| @@ -109,8 +145,7 @@ void SkTileGrid::search(const SkIRect& query, SkTDArray<void*>* results) const {
|
| ++tile;
|
| }
|
| }
|
| - void *nextElement;
|
| - while(NULL != (nextElement = fNextDatumFunction(tileRange, curPositions))) {
|
| + while(void* nextElement = next_datum(tileRange, curPositions)) {
|
| results->push(nextElement);
|
| }
|
| }
|
|
|