| Index: src/core/SkTileGrid.cpp
|
| diff --git a/src/core/SkTileGrid.cpp b/src/core/SkTileGrid.cpp
|
| index 2eea6dbf36b4a274f517944bffb6bf2ac391bdd4..8cdebcb0b682e2569b235b2655f718fb2b79f395 100644
|
| --- a/src/core/SkTileGrid.cpp
|
| +++ b/src/core/SkTileGrid.cpp
|
| @@ -12,7 +12,7 @@ SkTileGrid::SkTileGrid(int xTiles, int yTiles, const SkTileGridFactory::TileGrid
|
| , fYTiles(yTiles)
|
| , fInfo(info)
|
| , fCount(0)
|
| - , fTiles(SkNEW_ARRAY(SkTDArray<Entry>, xTiles * yTiles)) {
|
| + , fTiles(SkNEW_ARRAY(SkTDArray<unsigned>, xTiles * yTiles)) {
|
| // Margin is offset by 1 as a provision for AA and
|
| // to cancel-out the outset applied by getClipDeviceBounds.
|
| fInfo.fMargin.fHeight++;
|
| @@ -23,7 +23,7 @@ SkTileGrid::~SkTileGrid() {
|
| SkDELETE_ARRAY(fTiles);
|
| }
|
|
|
| -void SkTileGrid::insert(void* data, const SkRect& fbounds, bool) {
|
| +void SkTileGrid::insert(unsigned opIndex, const SkRect& fbounds, bool) {
|
| SkASSERT(!fbounds.isEmpty());
|
| SkIRect dilatedBounds;
|
| if (fbounds.isLargest()) {
|
| @@ -51,10 +51,9 @@ void SkTileGrid::insert(void* data, const SkRect& fbounds, bool) {
|
| int maxY = SkMax32(0, SkMin32((dilatedBounds.bottom() - 1) / fInfo.fTileInterval.height(),
|
| fYTiles - 1));
|
|
|
| - Entry entry = { fCount++, data };
|
| for (int y = minY; y <= maxY; y++) {
|
| for (int x = minX; x <= maxX; x++) {
|
| - fTiles[y * fXTiles + x].push(entry);
|
| + fTiles[y * fXTiles + x].push(opIndex);
|
| }
|
| }
|
| }
|
| @@ -69,7 +68,7 @@ static int divide_ceil(int x, int y) {
|
| // require 512 tiles of size 256 x 256 pixels.
|
| static const int kStackAllocationTileCount = 1024;
|
|
|
| -void SkTileGrid::search(const SkRect& query, SkTDArray<void*>* results) const {
|
| +void SkTileGrid::search(const SkRect& query, SkTDArray<unsigned>* results) const {
|
| SkIRect adjusted;
|
| query.roundOut(&adjusted);
|
|
|
| @@ -102,24 +101,20 @@ void SkTileGrid::search(const SkRect& query, SkTDArray<void*>* results) const {
|
|
|
| if (tilesHit == 1) {
|
| // A performance shortcut. The merging code below would work fine here too.
|
| - const SkTDArray<Entry>& tile = fTiles[startY * fXTiles + startX];
|
| - results->setCount(tile.count());
|
| - for (int i = 0; i < tile.count(); i++) {
|
| - (*results)[i] = tile[i].data;
|
| - }
|
| + *results = fTiles[startY * fXTiles + startX];
|
| return;
|
| }
|
|
|
| // We've got to merge the data in many tiles into a single sorted and deduplicated stream.
|
| - // We do a simple k-way merge based on the order the data was inserted.
|
| + // We do a simple k-way merge based on the value of opIndex.
|
|
|
| // Gather pointers to the starts and ends of the tiles to merge.
|
| - SkAutoSTArray<kStackAllocationTileCount, const Entry*> starts(tilesHit), ends(tilesHit);
|
| + SkAutoSTArray<kStackAllocationTileCount, const unsigned*> starts(tilesHit), ends(tilesHit);
|
| int i = 0;
|
| for (int x = startX; x < endX; x++) {
|
| for (int y = startY; y < endY; y++) {
|
| starts[i] = fTiles[y * fXTiles + x].begin();
|
| - ends[i] = fTiles[y * fXTiles + x].end();
|
| + ends[i] = fTiles[y * fXTiles + x].end();
|
| i++;
|
| }
|
| }
|
| @@ -129,10 +124,10 @@ void SkTileGrid::search(const SkRect& query, SkTDArray<void*>* results) const {
|
| while (true) {
|
| // The tiles themselves are already ordered, so the earliest is at the front of some tile.
|
| // It may be at the front of several, even all, tiles.
|
| - const Entry* earliest = NULL;
|
| + const unsigned* earliest = NULL;
|
| for (int i = 0; i < starts.count(); i++) {
|
| if (starts[i] < ends[i]) {
|
| - if (NULL == earliest || starts[i]->order < earliest->order) {
|
| + if (NULL == earliest || *starts[i]< *earliest) {
|
| earliest = starts[i];
|
| }
|
| }
|
| @@ -144,9 +139,9 @@ void SkTileGrid::search(const SkRect& query, SkTDArray<void*>* results) const {
|
| }
|
|
|
| // We did find an earliest entry. Output it, and step forward every tile that contains it.
|
| - results->push(earliest->data);
|
| + results->push(*earliest);
|
| for (int i = 0; i < starts.count(); i++) {
|
| - if (starts[i] < ends[i] && starts[i]->order == earliest->order) {
|
| + if (starts[i] < ends[i] && *starts[i] == *earliest) {
|
| starts[i]++;
|
| }
|
| }
|
| @@ -159,11 +154,3 @@ void SkTileGrid::clear() {
|
| }
|
| }
|
|
|
| -void SkTileGrid::rewindInserts() {
|
| - SkASSERT(fClient);
|
| - for (int i = 0; i < fXTiles * fYTiles; i++) {
|
| - while (!fTiles[i].isEmpty() && fClient->shouldRewind(fTiles[i].top().data)) {
|
| - fTiles[i].pop();
|
| - }
|
| - }
|
| -}
|
|
|