Index: src/gpu/GrContext.cpp |
diff --git a/src/gpu/GrContext.cpp b/src/gpu/GrContext.cpp |
index dca58745d7d04f46cbc757b156ba7e23ff9dcc05..9b980c9910319919b9d06bb9a44963cf6a8636dd 100644 |
--- a/src/gpu/GrContext.cpp |
+++ b/src/gpu/GrContext.cpp |
@@ -1238,7 +1238,6 @@ bool GrContext::readTexturePixels(GrTexture* texture, |
SK_TRACE_EVENT0("GrContext::readTexturePixels"); |
ASSERT_OWNED_RESOURCE(texture); |
- // TODO: code read pixels for textures that aren't also rendertargets |
GrRenderTarget* target = texture->asRenderTarget(); |
if (NULL != target) { |
return this->readRenderTargetPixels(target, |
@@ -1246,6 +1245,27 @@ bool GrContext::readTexturePixels(GrTexture* texture, |
config, buffer, rowBytes, |
flags); |
} else { |
+ // TODO: make this more efficient for cases where we're reading the entire |
+ // texture, i.e., use GetTexImage() instead |
+ |
+ // create scratch rendertarget and read from that |
+ GrAutoScratchTexture ast; |
+ GrTextureDesc desc; |
+ desc.fFlags = kRenderTarget_GrTextureFlagBit; |
+ desc.fWidth = width; |
+ desc.fHeight = height; |
+ desc.fConfig = config; |
+ desc.fOrigin = kTopLeft_GrSurfaceOrigin; |
+ ast.set(this, desc, kExact_ScratchTexMatch); |
+ GrTexture* dst = ast.texture(); |
+ if (NULL != dst && NULL != (target = dst->asRenderTarget())) { |
+ this->copyTexture(texture, target, NULL); |
+ return this->readRenderTargetPixels(target, |
+ left, top, width, height, |
+ config, buffer, rowBytes, |
+ flags); |
+ } |
+ |
return false; |
} |
} |