Index: src/gpu/SkGpuDevice.cpp |
diff --git a/src/gpu/SkGpuDevice.cpp b/src/gpu/SkGpuDevice.cpp |
index fe81f53b9cca07613bf82f6363f876b7f79c6af3..e4736d5aef30d646d255b8f3258ffc9567e34565 100644 |
--- a/src/gpu/SkGpuDevice.cpp |
+++ b/src/gpu/SkGpuDevice.cpp |
@@ -1032,23 +1032,21 @@ static void determine_clipped_src_rect(const GrContext* context, |
} |
} |
- |
bool SkGpuDevice::shouldTileBitmap(const SkBitmap& bitmap, |
const GrTextureParams& params, |
const SkRect* srcRectPtr, |
int maxTileSize, |
- int* tileSize) const { |
+ int* tileSize, |
+ SkIRect* clippedSrcRect) const { |
// if bitmap is explictly texture backed then just use the texture |
if (NULL != bitmap.getTexture()) { |
return false; |
} |
- SkIRect clippedSrcRect; |
- |
// if it's larger than the max tile size, then we have no choice but tiling. |
if (bitmap.width() > maxTileSize || bitmap.height() > maxTileSize) { |
- determine_clipped_src_rect(fContext, bitmap, srcRectPtr, &clippedSrcRect); |
- *tileSize = determine_tile_size(bitmap, clippedSrcRect, maxTileSize); |
+ determine_clipped_src_rect(fContext, bitmap, srcRectPtr, clippedSrcRect); |
+ *tileSize = determine_tile_size(bitmap, *clippedSrcRect, maxTileSize); |
return true; |
} |
@@ -1076,9 +1074,9 @@ bool SkGpuDevice::shouldTileBitmap(const SkBitmap& bitmap, |
} |
// Figure out how much of the src we will need based on the src rect and clipping. |
- determine_clipped_src_rect(fContext, bitmap, srcRectPtr, &clippedSrcRect); |
+ determine_clipped_src_rect(fContext, bitmap, srcRectPtr, clippedSrcRect); |
*tileSize = kBmpSmallTileSize; // already know whole bitmap fits in one max sized tile. |
- size_t usedTileBytes = get_tile_count(clippedSrcRect, kBmpSmallTileSize) * |
+ size_t usedTileBytes = get_tile_count(*clippedSrcRect, kBmpSmallTileSize) * |
kBmpSmallTileSize * kBmpSmallTileSize; |
return usedTileBytes < 2 * bmpSize; |
@@ -1219,8 +1217,10 @@ void SkGpuDevice::drawBitmapCommon(const SkDraw& draw, |
} |
int tileSize; |
- if (this->shouldTileBitmap(bitmap, params, srcRectPtr, maxTileSize, &tileSize)) { |
- this->drawTiledBitmap(bitmap, srcRect, params, paint, flags, tileSize); |
+ SkIRect clippedSrcRect; |
+ if (this->shouldTileBitmap(bitmap, params, srcRectPtr, maxTileSize, &tileSize, |
+ &clippedSrcRect)) { |
+ this->drawTiledBitmap(bitmap, srcRect, clippedSrcRect, params, paint, flags, tileSize); |
} else { |
// take the simple case |
this->internalDrawBitmap(bitmap, srcRect, params, paint, flags); |
@@ -1231,25 +1231,12 @@ void SkGpuDevice::drawBitmapCommon(const SkDraw& draw, |
// been determined to be too large to fit in VRAM |
void SkGpuDevice::drawTiledBitmap(const SkBitmap& bitmap, |
const SkRect& srcRect, |
+ const SkIRect& clippedSrcIRect, |
const GrTextureParams& params, |
const SkPaint& paint, |
SkCanvas::DrawBitmapRectFlags flags, |
int tileSize) { |
- |
- // compute clip bounds in local coordinates |
- SkRect clipRect; |
- { |
- const GrRenderTarget* rt = fContext->getRenderTarget(); |
- clipRect.setWH(SkIntToScalar(rt->width()), SkIntToScalar(rt->height())); |
- if (!fContext->getClip()->fClipStack->intersectRectWithClip(&clipRect)) { |
- return; |
- } |
- SkMatrix inverse; |
- if (!fContext->getMatrix().invert(&inverse)) { |
- return; |
- } |
- inverse.mapRect(&clipRect); |
- } |
+ SkRect clippedSrcRect = SkRect::MakeFromIRect(clippedSrcIRect); |
int nx = bitmap.width() / tileSize; |
int ny = bitmap.height() / tileSize; |
@@ -1261,7 +1248,7 @@ void SkGpuDevice::drawTiledBitmap(const SkBitmap& bitmap, |
SkIntToScalar((x + 1) * tileSize), |
SkIntToScalar((y + 1) * tileSize)); |
- if (!SkRect::Intersects(tileR, clipRect)) { |
+ if (!SkRect::Intersects(tileR, clippedSrcRect)) { |
continue; |
} |