Index: src/core/SkBitmapDevice.cpp |
diff --git a/src/core/SkBitmapDevice.cpp b/src/core/SkBitmapDevice.cpp |
index 44ce2173a34b4800cfdf319b4f262638538a48b1..0d6c4fcd7696702095ed69c3362c1a447626b83a 100644 |
--- a/src/core/SkBitmapDevice.cpp |
+++ b/src/core/SkBitmapDevice.cpp |
@@ -145,6 +145,7 @@ void* SkBitmapDevice::onAccessPixels(SkImageInfo* info, size_t* rowBytes) { |
} |
#include "SkConfig8888.h" |
+#include "SkPixelRef.h" |
bool SkBitmapDevice::onWritePixels(const SkImageInfo& srcInfo, const void* srcPixels, |
size_t srcRowBytes, int x, int y) { |
@@ -261,8 +262,14 @@ void SkBitmapDevice::drawBitmapRect(const SkDraw& draw, const SkBitmap& bitmap, |
// the bitmap, we extract a subset. |
SkIRect srcIR; |
tmpSrc.roundOut(&srcIR); |
- if (!bitmap.extractSubset(&tmpBitmap, srcIR)) { |
- return; |
+ if(bitmap.pixelRef()->getTexture()) { |
+ // Accelerated source canvas, don't use extractSubset but readPixels to get the subset. |
+ // This way, the pixels are copied in CPU memory instead of GPU memory. |
+ bitmap.pixelRef()->readPixels(&tmpBitmap, &srcIR); |
+ } else { |
+ if (!bitmap.extractSubset(&tmpBitmap, srcIR)) { |
+ return; |
+ } |
} |
bitmapPtr = &tmpBitmap; |