aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--include/gpu/GrSurface.h6
-rw-r--r--src/gpu/GrSurface.cpp27
2 files changed, 33 insertions, 0 deletions
diff --git a/include/gpu/GrSurface.h b/include/gpu/GrSurface.h
index 3aa498b611..c401a905ff 100644
--- a/include/gpu/GrSurface.h
+++ b/include/gpu/GrSurface.h
@@ -126,6 +126,12 @@ public:
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 47d9959d26..e14987f083 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;
+}