Adds read pixels to GrTexture and GrRenderTarget
Adds SkGrRenderTargetPixelRef for SkBitmaps that are backed by RTs that aren't textures.
Adds onReadPixels implementations for SkGr pixel ref types



git-svn-id: http://skia.googlecode.com/svn/trunk@1056 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/gpu/SkGrTexturePixelRef.cpp b/src/gpu/SkGrTexturePixelRef.cpp
index de19f1d..2b173f1 100644
--- a/src/gpu/SkGrTexturePixelRef.cpp
+++ b/src/gpu/SkGrTexturePixelRef.cpp
@@ -16,8 +16,12 @@
 
 
 #include "SkGrTexturePixelRef.h"
+
 #include "GrTexture.h"
 
+#include "SkRect.h"
+#include "SkBitmap.h"
+
 SkGrTexturePixelRef::SkGrTexturePixelRef(GrTexture* tex) {
     fTexture = tex;
     GrSafeRef(tex);
@@ -28,6 +32,71 @@
 }
 
 bool SkGrTexturePixelRef::onReadPixels(SkBitmap* dst, const SkIRect* subset) {
-    return false;
+    if (NULL != fTexture && fTexture->isValid()) {
+        int left, top, width, height;
+        if (NULL != subset) {
+            left = subset->fLeft;
+            width = subset->width();
+            top = subset->fTop;
+            height = subset->height();
+        } else {
+            left = 0;
+            width = fTexture->width();
+            top = 0;
+            height = fTexture->height();
+        }
+        dst->setConfig(SkBitmap::kARGB_8888_Config, width, height);
+        dst->allocPixels();
+        SkAutoLockPixels al(*dst);
+        void* buffer = dst->getPixels();
+        return fTexture->readPixels(left, top, width, height,
+                                    kRGBA_8888_GrPixelConfig,
+                                    buffer);
+    } else {
+        return false;
+    }
 }
 
+////////////////////////////////////////////////////////////////////////////////
+
+SkGrRenderTargetPixelRef::SkGrRenderTargetPixelRef(GrRenderTarget* rt) {
+    fRenderTarget = rt;
+    GrSafeRef(fRenderTarget);
+}
+
+SkGrRenderTargetPixelRef::~SkGrRenderTargetPixelRef() {
+    GrSafeUnref(fRenderTarget);
+}
+
+SkGpuTexture* SkGrRenderTargetPixelRef::getTexture() { 
+    if (NULL != fRenderTarget) {
+        return (SkGpuTexture*) fRenderTarget->asTexture();
+    }
+    return NULL;
+}
+
+bool SkGrRenderTargetPixelRef::onReadPixels(SkBitmap* dst, const SkIRect* subset) {
+    if (NULL != fRenderTarget && fRenderTarget->isValid()) {
+        int left, top, width, height;
+        if (NULL != subset) {
+            left = subset->fLeft;
+            width = subset->width();
+            top = subset->fTop;
+            height = subset->height();
+        } else {
+            left = 0;
+            width = fRenderTarget->width();
+            top = 0;
+            height = fRenderTarget->height();
+        }
+        dst->setConfig(SkBitmap::kARGB_8888_Config, width, height);
+        dst->allocPixels();
+        SkAutoLockPixels al(*dst);
+        void* buffer = dst->getPixels();
+        return fRenderTarget->readPixels(left, top, width, height,
+                                         kRGBA_8888_GrPixelConfig,
+                                         buffer);
+    } else {
+        return false;
+    }
+}
\ No newline at end of file