diff --git a/samplecode/SampleEncode.cpp b/samplecode/SampleEncode.cpp
index 594c2a1..45666a3 100644
--- a/samplecode/SampleEncode.cpp
+++ b/samplecode/SampleEncode.cpp
@@ -8,6 +8,8 @@
 #include "SampleCode.h"
 #include "SkView.h"
 #include "SkCanvas.h"
+#include "SkData.h"
+#include "SkDecodingImageGenerator.h"
 #include "SkGradientShader.h"
 #include "SkGraphics.h"
 #include "SkImageDecoder.h"
@@ -103,44 +105,43 @@
     ".jpg", ".png"
 };
 
-static const char* gPath = "/encoded/";
-
-static void make_name(SkString* name, int config, int ext) {
-    name->set(gPath);
-    name->append(gConfigLabels[config]);
-    name->append(gExt[ext]);
-}
-
 #include <sys/stat.h>
 
 class EncodeView : public SampleView {
 public:
-    SkBitmap*   fBitmaps;
-    size_t      fBitmapCount;
+    SkBitmap*        fBitmaps;
+    SkAutoDataUnref* fEncodedPNGs;
+    SkAutoDataUnref* fEncodedJPEGs;
+    size_t           fBitmapCount;
 
     EncodeView() {
     #if 1
-        (void)mkdir(gPath, S_IRWXU | S_IRWXG | S_IRWXO);
-
         fBitmapCount = SK_ARRAY_COUNT(gConfigs);
         fBitmaps = new SkBitmap[fBitmapCount];
+        fEncodedPNGs = new SkAutoDataUnref[fBitmapCount];
+        fEncodedJPEGs = new SkAutoDataUnref[fBitmapCount];
         for (size_t i = 0; i < fBitmapCount; i++) {
             make_image(&fBitmaps[i], gConfigs[i], i);
 
-            for (size_t j = 0; j < SK_ARRAY_COUNT(gExt); j++) {
-                SkString path;
-                make_name(&path, i, j);
-
-                // remove any previous run of this file
-                remove(path.c_str());
-
-                SkImageEncoder* codec = SkImageEncoder::Create(gTypes[j]);
-                if (NULL == codec ||
-                        !codec->encodeFile(path.c_str(), fBitmaps[i], 100)) {
-                    SkDebugf("------ failed to encode %s\n", path.c_str());
-                    remove(path.c_str());   // remove any partial file
+            for (size_t j = 0; j < SK_ARRAY_COUNT(gTypes); j++) {
+                SkAutoTDelete<SkImageEncoder> codec(
+                    SkImageEncoder::Create(gTypes[j]));
+                if (NULL == codec.get()) {
+                    SkDebugf("[%s:%d] failed to encode %s%s\n",
+                             __FILE__, __LINE__,gConfigLabels[i], gExt[j]);
+                    continue;
                 }
-                delete codec;
+                SkAutoDataUnref data(codec->encodeData(fBitmaps[i], 100));
+                if (NULL == data.get()) {
+                    SkDebugf("[%s:%d] failed to encode %s%s\n",
+                             __FILE__, __LINE__,gConfigLabels[i], gExt[j]);
+                    continue;
+                }
+                if (SkImageEncoder::kJPEG_Type == gTypes[j]) {
+                    fEncodedJPEGs[i].reset(data.detach());
+                } else if (SkImageEncoder::kPNG_Type == gTypes[j]) {
+                    fEncodedPNGs[i].reset(data.detach());
+                }
             }
         }
     #else
@@ -152,6 +153,8 @@
 
     virtual ~EncodeView() {
         delete[] fBitmaps;
+        delete[] fEncodedPNGs;
+        delete[] fEncodedJPEGs;
     }
 
 protected:
@@ -187,16 +190,26 @@
             canvas->drawBitmap(fBitmaps[i], x, y);
 
             SkScalar yy = y;
-            for (size_t j = 0; j < SK_ARRAY_COUNT(gExt); j++) {
+            for (size_t j = 0; j < SK_ARRAY_COUNT(gTypes); j++) {
                 yy += SkIntToScalar(fBitmaps[i].height() + 10);
 
                 SkBitmap bm;
-                SkString name;
-
-                make_name(&name, i, j);
-
-                SkImageDecoder::DecodeFile(name.c_str(), &bm);
-                canvas->drawBitmap(bm, x, yy);
+                SkData* encoded = NULL;
+                if (SkImageEncoder::kJPEG_Type == gTypes[j]) {
+                    encoded = fEncodedJPEGs[i].get();
+                } else if (SkImageEncoder::kPNG_Type == gTypes[j]) {
+                    encoded = fEncodedPNGs[i].get();
+                }
+                if (encoded) {
+                    if (!SkInstallDiscardablePixelRef(
+                            SkDecodingImageGenerator::Create(encoded,
+                                SkDecodingImageGenerator::Options()),
+                            &bm, NULL)) {
+                    SkDebugf("[%s:%d] failed to decode %s%s\n",
+                             __FILE__, __LINE__,gConfigLabels[i], gExt[j]);
+                    }
+                    canvas->drawBitmap(bm, x, yy);
+                }
             }
 
             x += SkIntToScalar(fBitmaps[i].width() + SPACER);
