aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/SkTileGrid.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/SkTileGrid.cpp')
-rw-r--r--src/core/SkTileGrid.cpp46
1 files changed, 29 insertions, 17 deletions
diff --git a/src/core/SkTileGrid.cpp b/src/core/SkTileGrid.cpp
index 7e078517ea..8a299496ac 100644
--- a/src/core/SkTileGrid.cpp
+++ b/src/core/SkTileGrid.cpp
@@ -8,19 +8,20 @@
#include "SkTileGrid.h"
-SkTileGrid::SkTileGrid(int tileWidth, int tileHeight, int xTileCount, int yTileCount,
- int borderPixels, SkTileGridNextDatumFunctionPtr nextDatumFunction)
+SkTileGrid::SkTileGrid(int xTileCount, int yTileCount, const SkTileGridPicture::TileGridInfo& info,
+ SkTileGridNextDatumFunctionPtr nextDatumFunction)
{
- fTileWidth = tileWidth;
- fTileHeight = tileHeight;
fXTileCount = xTileCount;
fYTileCount = yTileCount;
- // Border padding is offset by 1 as a provision for AA and
+ fInfo = info;
+ // Margin is offset by 1 as a provision for AA and
// to cancel-out the outset applied by getClipDeviceBounds.
- fBorderPixels = borderPixels + 1;
+ fInfo.fMargin.fHeight++;
+ fInfo.fMargin.fWidth++;
fTileCount = fXTileCount * fYTileCount;
fInsertionCount = 0;
- fGridBounds = SkIRect::MakeXYWH(0, 0, fTileWidth * fXTileCount, fTileHeight * fYTileCount);
+ fGridBounds = SkIRect::MakeXYWH(0, 0, fInfo.fTileInterval.width() * fXTileCount,
+ fInfo.fTileInterval.height() * fYTileCount);
fNextDatumFunction = nextDatumFunction;
fTileData = SkNEW_ARRAY(SkTDArray<void *>, fTileCount);
}
@@ -36,16 +37,22 @@ SkTDArray<void *>& SkTileGrid::tile(int x, int y) {
void SkTileGrid::insert(void* data, const SkIRect& bounds, bool) {
SkASSERT(!bounds.isEmpty());
SkIRect dilatedBounds = bounds;
- dilatedBounds.outset(fBorderPixels, fBorderPixels);
-
+ dilatedBounds.outset(fInfo.fMargin.width(), fInfo.fMargin.height());
+ dilatedBounds.offset(fInfo.fOffset);
if (!SkIRect::Intersects(dilatedBounds, fGridBounds)) {
return;
}
- int minTileX = SkMax32(SkMin32(dilatedBounds.left() / fTileWidth, fXTileCount - 1), 0);
- int maxTileX = SkMax32(SkMin32(dilatedBounds.right() / fTileWidth, fXTileCount - 1), 0);
- int minTileY = SkMax32(SkMin32(dilatedBounds.top() / fTileHeight, fYTileCount -1), 0);
- int maxTileY = SkMax32(SkMin32(dilatedBounds.bottom() / fTileHeight, fYTileCount -1), 0);
+ // Note: SkIRects are non-inclusive of the right() column and bottom() row,
+ // hence the "-1"s in the computations of maxTileX and maxTileY.
+ int minTileX = SkMax32(SkMin32(dilatedBounds.left() / fInfo.fTileInterval.width(),
+ fXTileCount - 1), 0);
+ int maxTileX = SkMax32(SkMin32((dilatedBounds.right() - 1) / fInfo.fTileInterval.width(),
+ fXTileCount - 1), 0);
+ int minTileY = SkMax32(SkMin32(dilatedBounds.top() / fInfo.fTileInterval.height(),
+ fYTileCount -1), 0);
+ int maxTileY = SkMax32(SkMin32((dilatedBounds.bottom() -1) / fInfo.fTileInterval.height(),
+ fYTileCount -1), 0);
for (int x = minTileX; x <= maxTileX; x++) {
for (int y = minTileY; y <= maxTileY; y++) {
@@ -56,13 +63,18 @@ void SkTileGrid::insert(void* data, const SkIRect& bounds, bool) {
}
void SkTileGrid::search(const SkIRect& query, SkTDArray<void*>* results) {
+ SkIRect adjustedQuery = query;
+ adjustedQuery.inset(fInfo.fMargin.width(), fInfo.fMargin.height());
+ adjustedQuery.offset(fInfo.fOffset);
// Convert the query rectangle from device coordinates to tile coordinates
// by rounding outwards to the nearest tile boundary so that the resulting tile
// region includes the query rectangle. (using truncating division to "floor")
- int tileStartX = (query.left() + fBorderPixels) / fTileWidth;
- int tileEndX = (query.right() + fTileWidth - fBorderPixels) / fTileWidth;
- int tileStartY = (query.top() + fBorderPixels) / fTileHeight;
- int tileEndY = (query.bottom() + fTileHeight - fBorderPixels) / fTileHeight;
+ int tileStartX = adjustedQuery.left() / fInfo.fTileInterval.width();
+ int tileEndX = (adjustedQuery.right() + fInfo.fTileInterval.width() - 1) /
+ fInfo.fTileInterval.width();
+ int tileStartY = adjustedQuery.top() / fInfo.fTileInterval.height();
+ int tileEndY = (adjustedQuery.bottom() + fInfo.fTileInterval.height() - 1) /
+ fInfo.fTileInterval.height();
if (tileStartX >= fXTileCount || tileStartY >= fYTileCount || tileEndX <= 0 || tileEndY <= 0) {
return; // query does not intersect the grid
}