Index: src/gpu/SkGpuDevice.cpp |
diff --git a/src/gpu/SkGpuDevice.cpp b/src/gpu/SkGpuDevice.cpp |
index 47ddd521cb8fd01b3a6cde8e808516eba9a3a52f..6617989848771e231c7141dd16c4b458b3adad05 100644 |
--- a/src/gpu/SkGpuDevice.cpp |
+++ b/src/gpu/SkGpuDevice.cpp |
@@ -1164,6 +1164,8 @@ void SkGpuDevice::drawBitmapCommon(const SkDraw& draw, |
return; |
} |
+ fContext->concatMatrix(m); |
+ |
GrTextureParams params; |
SkPaint::FilterLevel paintFilterLevel = paint.getFilterLevel(); |
GrTextureParams::FilterMode textureFilterMode; |
@@ -1195,9 +1197,9 @@ void SkGpuDevice::drawBitmapCommon(const SkDraw& draw, |
if (!this->shouldTileBitmap(bitmap, params, srcRectPtr)) { |
// take the simple case |
- this->internalDrawBitmap(bitmap, srcRect, m, params, paint, flags); |
+ this->internalDrawBitmap(bitmap, srcRect, params, paint, flags); |
} else { |
- this->drawTiledBitmap(bitmap, srcRect, m, params, paint, flags); |
+ this->drawTiledBitmap(bitmap, srcRect, params, paint, flags); |
} |
} |
@@ -1205,7 +1207,6 @@ 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 SkMatrix& m, |
const GrTextureParams& params, |
const SkPaint& paint, |
SkCanvas::DrawBitmapRectFlags flags) { |
@@ -1226,9 +1227,8 @@ void SkGpuDevice::drawTiledBitmap(const SkBitmap& bitmap, |
if (!fContext->getClip()->fClipStack->intersectRectWithClip(&clipRect)) { |
return; |
} |
- SkMatrix matrix, inverse; |
- matrix.setConcat(fContext->getMatrix(), m); |
- if (!matrix.invert(&inverse)) { |
+ SkMatrix inverse; |
+ if (!fContext->getMatrix().invert(&inverse)) { |
return; |
} |
inverse.mapRect(&clipRect); |
@@ -1278,10 +1278,11 @@ void SkGpuDevice::drawTiledBitmap(const SkBitmap& bitmap, |
if (bitmap.extractSubset(&tmpB, iTileR)) { |
// now offset it to make it "local" to our tmp bitmap |
tileR.offset(-offset.fX, -offset.fY); |
- SkMatrix tmpM(m); |
- tmpM.preTranslate(offset.fX, offset.fY); |
- |
- this->internalDrawBitmap(tmpB, tileR, tmpM, params, paint, flags); |
+ SkMatrix tmpM; |
+ tmpM.setTranslate(offset.fX, offset.fY); |
+ GrContext::AutoMatrix am; |
+ am.setPreConcat(fContext, tmpM); |
+ this->internalDrawBitmap(tmpB, tileR, params, paint, flags); |
} |
} |
} |
@@ -1338,7 +1339,6 @@ static bool may_color_bleed(const SkRect& srcRect, |
*/ |
void SkGpuDevice::internalDrawBitmap(const SkBitmap& bitmap, |
const SkRect& srcRect, |
- const SkMatrix& m, |
const GrTextureParams& params, |
const SkPaint& paint, |
SkCanvas::DrawBitmapRectFlags flags) { |
@@ -1366,19 +1366,18 @@ void SkGpuDevice::internalDrawBitmap(const SkBitmap& bitmap, |
// Need texture domain if drawing a sub rect. |
needsTextureDomain = srcRect.width() < bitmap.width() || |
srcRect.height() < bitmap.height(); |
- if (needsTextureDomain && m.rectStaysRect() && fContext->getMatrix().rectStaysRect()) { |
+ if (needsTextureDomain && fContext->getMatrix().rectStaysRect()) { |
+ const SkMatrix& matrix = fContext->getMatrix(); |
// sampling is axis-aligned |
SkRect transformedRect; |
- SkMatrix srcToDeviceMatrix(m); |
- srcToDeviceMatrix.postConcat(fContext->getMatrix()); |
- srcToDeviceMatrix.mapRect(&transformedRect, srcRect); |
- |
+ matrix.mapRect(&transformedRect, srcRect); |
+ |
if (has_aligned_samples(srcRect, transformedRect)) { |
// We could also turn off filtering here (but we already did a cache lookup with |
// params). |
needsTextureDomain = false; |
} else { |
- needsTextureDomain = may_color_bleed(srcRect, transformedRect, m); |
+ needsTextureDomain = may_color_bleed(srcRect, transformedRect, matrix); |
} |
} |
} |
@@ -1421,7 +1420,7 @@ void SkGpuDevice::internalDrawBitmap(const SkBitmap& bitmap, |
return; |
} |
- fContext->drawRectToRect(grPaint, dstRect, paintRect, &m); |
+ fContext->drawRectToRect(grPaint, dstRect, paintRect, NULL); |
} |
static bool filter_texture(SkBaseDevice* device, GrContext* context, |