Add GrSurface::savePixels().

R=bsalomon@google.com

Author: jvanverth@google.com

Review URL: https://codereview.chromium.org/25021006

git-svn-id: http://skia.googlecode.com/svn/trunk@11528 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/include/gpu/GrSurface.h b/include/gpu/GrSurface.h
index 3aa498b..c401a90 100644
--- a/include/gpu/GrSurface.h
+++ b/include/gpu/GrSurface.h
@@ -126,6 +126,12 @@
                              size_t rowBytes = 0,
                              uint32_t pixelOpsFlags = 0) = 0;
 
+    /**
+     * Write the contents of the surface to a PNG. Returns true if successful.
+     * @param filename      Full path to desired file
+     */
+    bool savePixels(const char* filename);
+
 protected:
     GrSurface(GrGpu* gpu, bool isWrapped, const GrTextureDesc& desc)
     : INHERITED(gpu, isWrapped)
diff --git a/src/gpu/GrSurface.cpp b/src/gpu/GrSurface.cpp
index 47d9959..e14987f 100644
--- a/src/gpu/GrSurface.cpp
+++ b/src/gpu/GrSurface.cpp
@@ -7,4 +7,31 @@
 
 #include "GrSurface.h"
 
+#include "SkBitmap.h"
+#include "SkImageEncoder.h"
+
 SK_DEFINE_INST_COUNT(GrSurface)
+
+bool GrSurface::savePixels(const char* filename) {
+    SkBitmap bm;
+    bm.setConfig(SkBitmap::kARGB_8888_Config, this->width(), this->height());
+    bm.allocPixels();
+
+    bool result = readPixels(0, 0, this->width(), this->height(), kSkia8888_GrPixelConfig, 
+                             bm.getPixels());
+    if (!result) {
+        SkDebugf("------ failed to read pixels for %s\n", filename);
+        return false;
+    }
+    
+    // remove any previous version of this file
+    remove(filename);
+
+    if (!SkImageEncoder::EncodeFile(filename, bm, SkImageEncoder::kPNG_Type, 100)) {
+        SkDebugf("------ failed to encode %s\n", filename);
+        remove(filename);   // remove any partial file
+        return false;
+    }
+
+    return true;
+}