Revert r2584 (new test fails in fixed pt builds)
git-svn-id: http://skia.googlecode.com/svn/trunk@2585 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/gpu/SkGpuDevice.cpp b/src/gpu/SkGpuDevice.cpp
index 790cf6d..d758383 100644
--- a/src/gpu/SkGpuDevice.cpp
+++ b/src/gpu/SkGpuDevice.cpp
@@ -256,19 +256,36 @@
///////////////////////////////////////////////////////////////////////////////
-bool SkGpuDevice::onReadPixels(const SkBitmap* bitmap, int x, int y) {
- SkASSERT(SkBitmap::kARGB_8888_Config == bitmap->config());
- SkASSERT(!bitmap->isNull());
- SkASSERT(SkIRect::MakeWH(this->width(), this->height()).contains(SkIRect::MakeXYWH(x, y, bitmap->width(), bitmap->height())));
+bool SkGpuDevice::readPixels(const SkIRect& srcRect, SkBitmap* bitmap) {
+ SkIRect bounds;
+ bounds.set(0, 0, this->width(), this->height());
+ if (!bounds.intersect(srcRect)) {
+ return false;
+ }
- SkAutoLockPixels alp(*bitmap);
- return fContext->readRenderTargetPixels(fRenderTarget,
- x, y,
- bitmap->width(),
- bitmap->height(),
- kRGBA_8888_GrPixelConfig,
- bitmap->getPixels(),
- bitmap->rowBytes());
+ const int w = bounds.width();
+ const int h = bounds.height();
+ SkBitmap tmp;
+ // note we explicitly specify our rowBytes to be snug (no gap between rows)
+ tmp.setConfig(SkBitmap::kARGB_8888_Config, w, h, w * 4);
+ if (!tmp.allocPixels()) {
+ return false;
+ }
+
+ tmp.lockPixels();
+
+ bool read = fContext->readRenderTargetPixels(fRenderTarget,
+ bounds.fLeft, bounds.fTop,
+ bounds.width(), bounds.height(),
+ kRGBA_8888_GrPixelConfig,
+ tmp.getPixels());
+ tmp.unlockPixels();
+ if (!read) {
+ return false;
+ }
+
+ tmp.swap(*bitmap);
+ return true;
}
void SkGpuDevice::writePixels(const SkBitmap& bitmap, int x, int y) {