diff options
-rw-r--r-- | include/gpu/GrSurface.h | 6 | ||||
-rw-r--r-- | src/gpu/GrSurface.cpp | 27 |
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; +} |