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/SkGpuDevice.cpp b/src/gpu/SkGpuDevice.cpp
index ce48be6..76777f0 100644
--- a/src/gpu/SkGpuDevice.cpp
+++ b/src/gpu/SkGpuDevice.cpp
@@ -171,11 +171,15 @@
                      this->width(), this->height());
             GrAssert(false);
         }
-    } else if (Current3DApiRenderTarget() == renderTargetOrNull) {
-        fRenderTarget = fContext->createRenderTargetFrom3DApiState();
     } else {
-        fRenderTarget = renderTargetOrNull;
-        fRenderTarget->ref();
+        if (Current3DApiRenderTarget() == renderTargetOrNull) {
+            fRenderTarget = fContext->createRenderTargetFrom3DApiState();
+        } else {
+            fRenderTarget = renderTargetOrNull;
+            fRenderTarget->ref();
+        }
+        SkGrRenderTargetPixelRef* pr = new SkGrRenderTargetPixelRef(fRenderTarget);
+        this->setPixelRef(pr, 0)->unref();
     }
 }
 
@@ -233,15 +237,12 @@
     }
 
     SkAutoLockPixels alp(tmp);
-    fContext->setRenderTarget(fRenderTarget);
-    // we aren't setting the clip or matrix, so mark as dirty
-    // we don't need to set them for this call and don't have them anyway
-    fNeedPrepareRenderTarget = true;
 
-    if (!fContext->readPixels(bounds.fLeft, bounds.fTop,
-                              bounds.width(), bounds.height(),
-                              GrTexture::kRGBA_8888_PixelConfig,
-                              tmp.getPixels())) {
+    if (!fContext->readRenderTargetPixels(fRenderTarget,
+                                          bounds.fLeft, bounds.fTop,
+                                          bounds.width(), bounds.height(),
+                                          kRGBA_8888_GrPixelConfig,
+                                          tmp.getPixels())) {
         return false;
     }
 
@@ -254,8 +255,8 @@
     if (!bitmap.readyToDraw()) {
         return;
     }
-    GrTexture::PixelConfig config = SkGr::BitmapConfig2PixelConfig(bitmap.config(),
-                                                                   bitmap.isOpaque());
+    GrPixelConfig config = SkGr::BitmapConfig2PixelConfig(bitmap.config(),
+                                                          bitmap.isOpaque());
     fContext->setRenderTarget(fRenderTarget);
     // we aren't setting the clip or matrix, so mark as dirty
     // we don't need to set them for this call and don't have them anyway
@@ -709,7 +710,7 @@
         GrGpu::kNone_AALevel,
         dstM.fBounds.width(),
         dstM.fBounds.height(),
-        GrTexture::kAlpha_8_PixelConfig
+        kAlpha_8_GrPixelConfig
     };
 
     GrTexture* texture = context->createUncachedTexture(desc, dstM.fImage,
diff --git a/src/gpu/SkGr.cpp b/src/gpu/SkGr.cpp
index 630c3f4..e7e2365 100644
--- a/src/gpu/SkGr.cpp
+++ b/src/gpu/SkGr.cpp
@@ -213,25 +213,25 @@
 
 ///////////////////////////////////////////////////////////////////////////////
 
-GrTexture::PixelConfig SkGr::BitmapConfig2PixelConfig(SkBitmap::Config config,
+GrPixelConfig SkGr::BitmapConfig2PixelConfig(SkBitmap::Config config,
                                                     bool isOpaque) {
     switch (config) {
         case SkBitmap::kA8_Config:
-            return GrTexture::kAlpha_8_PixelConfig;
+            return kAlpha_8_GrPixelConfig;
         case SkBitmap::kIndex8_Config:
-            return GrTexture::kIndex_8_PixelConfig;
+            return kIndex_8_GrPixelConfig;
         case SkBitmap::kRGB_565_Config:
-            return GrTexture::kRGB_565_PixelConfig;
+            return kRGB_565_GrPixelConfig;
         case SkBitmap::kARGB_4444_Config:
-            return GrTexture::kRGBA_4444_PixelConfig;
+            return kRGBA_4444_GrPixelConfig;
         case SkBitmap::kARGB_8888_Config:
             if (isOpaque) {
-                return GrTexture::kRGBX_8888_PixelConfig;
+                return kRGBX_8888_GrPixelConfig;
             } else {
-                return GrTexture::kRGBA_8888_PixelConfig;
+                return kRGBA_8888_GrPixelConfig;
             }
         default:
-            return GrTexture::kUnknown_PixelConfig;
+            return kUnknown_GrPixelConfig;
     }
 }
 
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