diff --git a/samplecode/SamplePictFile.cpp b/samplecode/SamplePictFile.cpp
index 2321c04..22c81d1 100644
--- a/samplecode/SamplePictFile.cpp
+++ b/samplecode/SamplePictFile.cpp
@@ -13,7 +13,6 @@
 #include "SkGradientShader.h"
 #include "SkGraphics.h"
 #include "SkImageDecoder.h"
-#include "SkOSFile.h"
 #include "SkPath.h"
 #include "SkPicture.h"
 #include "SkRandom.h"
@@ -32,10 +31,8 @@
 class PictFileView : public SampleView {
     SkString    fFilename;
     SkPicture*  fPicture;
-    SkPicture*  fBBoxPicture;
-    bool        fUseBBox;
 
-    static SkPicture* LoadPicture(const char path[], bool useBBox) {
+    static SkPicture* LoadPicture(const char path[]) {
         SkPicture* pic = NULL;
 
         SkBitmap bm;
@@ -63,30 +60,16 @@
                 p2.serialize(&writer);
             }
         }
-
-        if (useBBox) {
-            SkPicture* bboxPicture = SkNEW(SkPicture);
-            pic->draw(bboxPicture->beginRecording(pic->width(), pic->height(),
-                    SkPicture::kOptimizeForClippedPlayback_RecordingFlag));
-            bboxPicture->endRecording();
-            SkDELETE(pic);
-            return bboxPicture;
-
-        } else {
-            return pic;
-        }
+        return pic;
     }
 
 public:
     PictFileView(const char name[] = NULL) : fFilename(name) {
         fPicture = NULL;
-        fBBoxPicture = NULL;
-        fUseBBox = false;
     }
 
     virtual ~PictFileView() {
         SkSafeUnref(fPicture);
-        SkSafeUnref(fBBoxPicture);
     }
 
 protected:
@@ -94,33 +77,19 @@
     virtual bool onQuery(SkEvent* evt) {
         if (SampleCode::TitleQ(*evt)) {
             SkString name("P:");
-            char* basename = strrchr(fFilename.c_str(), SkPATH_SEPARATOR);
-            name.append(basename ? basename+1: fFilename.c_str());
-            if (fUseBBox) {
-                name.append(" <bbox>");
-            }
+            name.append(fFilename);
             SampleCode::TitleR(evt, name.c_str());
             return true;
         }
         return this->INHERITED::onQuery(evt);
     }
 
-    virtual bool onEvent(const SkEvent& evt) {
-        if (evt.isType("PictFileView::toggleBBox")) {
-            fUseBBox = !fUseBBox;
-            return true;
-        }
-        return this->INHERITED::onEvent(evt);
-    }
-
     virtual void onDrawContent(SkCanvas* canvas) {
-        SkPicture** picture = fUseBBox ? &fBBoxPicture : &fPicture;
-
-        if (!*picture) {
-            *picture = LoadPicture(fFilename.c_str(), fUseBBox);
+        if (!fPicture) {
+            fPicture = LoadPicture(fFilename.c_str());
         }
-        if (*picture) {
-            canvas->drawPicture(**picture);
+        if (fPicture) {
+            canvas->drawPicture(*fPicture);
         }
     }
 
