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)
#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;
+}