| 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;
|
|
|
|
|