Index: src/gpu/SkGpuDevice.cpp |
diff --git a/src/gpu/SkGpuDevice.cpp b/src/gpu/SkGpuDevice.cpp |
index f4a1d4ee3edf76e166404fc568daef7d415b9379..dc1edd4b9874f6e78ee1ab15e310b01e484f3fda 100644 |
--- a/src/gpu/SkGpuDevice.cpp |
+++ b/src/gpu/SkGpuDevice.cpp |
@@ -221,6 +221,38 @@ GrRenderTarget* SkGpuDevice::CreateRenderTarget( |
return texture->asRenderTarget(); |
} |
+// This method ensures that we always have a texture-backed "bitmap" when we finally |
+// call through to the base impl so that the image filtering code will take the |
+// gpu-specific paths. This mirrors SkCanvas::internalDrawDevice (the other |
+// use of SkImageFilter::filterImage) in that the source and dest will have |
+// homogenous backing (e.g., raster or gpu). |
+void SkGpuDevice::drawBitmapAsSpriteWithImageFilter(const SkDraw& draw, const SkBitmap& bitmap, |
+ int x, int y, const SkPaint& paint) { |
+ if (bitmap.getTexture()) { |
+ INHERITED::drawBitmapAsSpriteWithImageFilter(draw, bitmap, x, y, paint); |
+ return; |
+ } |
+ |
+ SkAutoLockPixels alp(bitmap, !bitmap.getTexture()); |
+ if (!bitmap.getTexture() && !bitmap.readyToDraw()) { |
+ return; |
+ } |
+ |
+ GrTexture* texture; |
+ // draw sprite neither filters nor tiles. |
+ AutoBitmapTexture abt(fContext, bitmap, GrTextureParams::ClampNoFilter(), &texture); |
+ if (!texture) { |
+ return; |
+ } |
+ |
+ SkBitmap newBitmap; |
+ |
+ GrWrapTextureInBitmap(texture, texture->width(), texture->height(), |
+ bitmap.isOpaque(), &newBitmap); |
+ |
+ INHERITED::drawBitmapAsSpriteWithImageFilter(draw, newBitmap, x, y, paint); |
+} |
+ |
/////////////////////////////////////////////////////////////////////////////// |
bool SkGpuDevice::onReadPixels(const SkImageInfo& dstInfo, void* dstPixels, size_t dstRowBytes, |