diff --git a/experimental/CocoaDebugger/SkDumpCanvasM.cpp b/experimental/CocoaDebugger/SkDumpCanvasM.cpp
index dae5fdb..841837d 100644
--- a/experimental/CocoaDebugger/SkDumpCanvasM.cpp
+++ b/experimental/CocoaDebugger/SkDumpCanvasM.cpp
@@ -351,14 +351,6 @@
                str.c_str(), byteLength);
 }
 
-void SkDumpCanvasM::drawShape(SkShape* shape) {
-    this->dump(kDrawShape_Verb, NULL, "drawShape(%p)", shape);
-    fNestLevel += 1;
-    this->INHERITED::drawShape(shape);
-    fNestLevel -= 1;
-    this->dump(kDrawShape_Verb, NULL, "endShape(%p)", shape);
-}
-
 void SkDumpCanvasM::drawPicture(SkPicture& picture) {
     this->dump(kDrawPicture_Verb, NULL, "drawPicture(%p) %d:%d", &picture,
                picture.width(), picture.height());
diff --git a/experimental/CocoaDebugger/SkDumpCanvasM.h b/experimental/CocoaDebugger/SkDumpCanvasM.h
index 23b62ec..24f0ca7 100644
--- a/experimental/CocoaDebugger/SkDumpCanvasM.h
+++ b/experimental/CocoaDebugger/SkDumpCanvasM.h
@@ -33,7 +33,6 @@
         kDrawBitmap_Verb,
         kDrawText_Verb,
         kDrawPicture_Verb,
-        kDrawShape_Verb,
         kDrawVertices_Verb,
         kDrawData_Verb
     };
@@ -97,7 +96,6 @@
                                 const SkPath& path, const SkMatrix* matrix,
                                 const SkPaint& paint);
     virtual void drawPicture(SkPicture&);
-    virtual void drawShape(SkShape*);
     virtual void drawVertices(VertexMode vmode, int vertexCount,
                               const SkPoint vertices[], const SkPoint texs[],
                               const SkColor colors[], SkXfermode* xmode,
diff --git a/gm/shapes.cpp b/gm/shapes.cpp
index 5daea0a..c4ba9ad 100644
--- a/gm/shapes.cpp
+++ b/gm/shapes.cpp
@@ -95,16 +95,14 @@
         matrix.preScale(SK_Scalar1*2, SK_Scalar1*2);
         gs->appendShape(&fGroup, matrix);
 
-#if 0
-        canvas->drawShape(gs);
-#else
+#if 1
         SkPicture* pict = new SkPicture;
         SkCanvas* cv = pict->beginRecording(1000, 1000);
         cv->scale(SK_ScalarHalf, SK_ScalarHalf);
-        cv->drawShape(gs);
+        gs->draw(cv);
         cv->translate(SkIntToScalar(680), SkIntToScalar(480));
         cv->scale(-SK_Scalar1, SK_Scalar1);
-        cv->drawShape(gs);
+        gs->draw(cv);
         pict->endRecording();
         canvas->drawPicture(*pict);
         pict->unref();
diff --git a/include/core/SkCanvas.h b/include/core/SkCanvas.h
index 9b96790..a7f01c4 100644
--- a/include/core/SkCanvas.h
+++ b/include/core/SkCanvas.h
@@ -34,7 +34,6 @@
 class SkDraw;
 class SkDrawFilter;
 class SkPicture;
-class SkShape;
 
 /** \class SkCanvas
 
@@ -63,7 +62,7 @@
     */
     explicit SkCanvas(SkDeviceFactory* factory = NULL);
 
-    /** Construct a canvas with the specified device to draw into.  The device
+    /** Construct a canvas with the specified device to draw into.  The device
         factory will be retrieved from the passed device.
 
         @param device   Specifies a device for the canvas to draw into.
@@ -677,10 +676,6 @@
     */
     virtual void drawPicture(SkPicture& picture);
 
-    /** Draws the specified shape
-     */
-    virtual void drawShape(SkShape*);
-
     enum VertexMode {
         kTriangles_VertexMode,
         kTriangleStrip_VertexMode,
diff --git a/include/pdf/SkPDFDevice.h b/include/pdf/SkPDFDevice.h
index 2205f6c..afe0fff 100644
--- a/include/pdf/SkPDFDevice.h
+++ b/include/pdf/SkPDFDevice.h
@@ -137,9 +137,15 @@
 
     /** Returns a SkStream with the page contents.  The caller is responsible
         for a reference to the returned value.
+        DEPRECATED: use copyContentToData()
      */
     SK_API SkStream* content() const;
 
+    /** Returns a SkStream with the page contents.  The caller is responsible
+     *  for calling data->unref() when it is finished.
+     */
+    SK_API SkData* copyContentToData() const;
+    
     SK_API const SkMatrix& initialTransform() const {
         return fInitialTransform;
     }
diff --git a/include/utils/SkDumpCanvas.h b/include/utils/SkDumpCanvas.h
index 3731bef..3d2805c 100644
--- a/include/utils/SkDumpCanvas.h
+++ b/include/utils/SkDumpCanvas.h
@@ -33,7 +33,6 @@
         kDrawBitmap_Verb,
         kDrawText_Verb,
         kDrawPicture_Verb,
-        kDrawShape_Verb,
         kDrawVertices_Verb,
         kDrawData_Verb
     };
@@ -97,7 +96,6 @@
                                 const SkPath& path, const SkMatrix* matrix,
                                 const SkPaint& paint);
     virtual void drawPicture(SkPicture&);
-    virtual void drawShape(SkShape*);
     virtual void drawVertices(VertexMode vmode, int vertexCount,
                               const SkPoint vertices[], const SkPoint texs[],
                               const SkColor colors[], SkXfermode* xmode,
diff --git a/include/utils/SkNWayCanvas.h b/include/utils/SkNWayCanvas.h
index 03bd6d1..21d1ba6 100644
--- a/include/utils/SkNWayCanvas.h
+++ b/include/utils/SkNWayCanvas.h
@@ -57,7 +57,6 @@
                                 const SkPath& path, const SkMatrix* matrix,
                                 const SkPaint& paint);
     virtual void drawPicture(SkPicture&);
-    virtual void drawShape(SkShape*);
     virtual void drawVertices(VertexMode vmode, int vertexCount,
                               const SkPoint vertices[], const SkPoint texs[],
                               const SkColor colors[], SkXfermode* xmode,
diff --git a/include/utils/SkProxyCanvas.h b/include/utils/SkProxyCanvas.h
index 8d8daec..195b74d 100644
--- a/include/utils/SkProxyCanvas.h
+++ b/include/utils/SkProxyCanvas.h
@@ -64,7 +64,6 @@
                                 const SkPath& path, const SkMatrix* matrix,
                                 const SkPaint& paint);
     virtual void drawPicture(SkPicture&);
-    virtual void drawShape(SkShape*);
     virtual void drawVertices(VertexMode vmode, int vertexCount,
                               const SkPoint vertices[], const SkPoint texs[],
                               const SkColor colors[], SkXfermode* xmode,
diff --git a/samplecode/SamplePicture.cpp b/samplecode/SamplePicture.cpp
index d7b6b22..585b2f2 100644
--- a/samplecode/SamplePicture.cpp
+++ b/samplecode/SamplePicture.cpp
@@ -14,7 +14,6 @@
 #include "SkUtils.h"
 #include "SkColorPriv.h"
 #include "SkColorFilter.h"
-#include "SkShape.h"
 #include "SkTime.h"
 #include "SkTypeface.h"
 #include "SkXfermode.h"
@@ -22,67 +21,6 @@
 #include "SkStream.h"
 #include "SkXMLParser.h"
 
-class SignalShape : public SkShape {
-public:
-    SignalShape() : fSignal(0) {}
-
-    SkShape* setSignal(int n) {
-        fSignal = n;
-        return this;
-    }
-
-protected:
-    virtual void onDraw(SkCanvas* canvas) {
-    //    SkDebugf("---- sc %d\n", canvas->getSaveCount() - 1);
-    }
-
-private:
-    int fSignal;
-};
-
-static SkPMColor SignalProc(SkPMColor src, SkPMColor dst) {
-    return dst;
-}
-
-/*  Picture playback will skip blocks of draw calls that follow a clip() call
-    that returns empty, and jump down to the corresponding restore() call.
-
-    This is a great preformance win for drawing very large/tall pictures with
-    a small visible window (think scrolling a long document). These tests make
-    sure that (a) we are performing the culling, and (b) we don't get confused
-    by nested save() calls, nor by calls to restoreToCount().
- */
-static void test_saveRestoreCulling() {
-    SkPaint signalPaint;
-    SignalShape signalShape;
-
-    SkPicture pic;
-    SkRect r = SkRect::MakeWH(0, 0);
-    int n;
-    SkCanvas* canvas = pic.beginRecording(100, 100);
-    int startN = canvas->getSaveCount();
-    SkDebugf("---- start sc %d\n", startN);
-    canvas->drawShape(signalShape.setSignal(1));
-    canvas->save();
-    canvas->drawShape(signalShape.setSignal(2));
-    n = canvas->save();
-    canvas->drawShape(signalShape.setSignal(3));
-    canvas->save();
-    canvas->clipRect(r);
-    canvas->drawShape(signalShape.setSignal(4));
-    canvas->restoreToCount(n);
-    canvas->drawShape(signalShape.setSignal(5));
-    canvas->restore();
-    canvas->drawShape(signalShape.setSignal(6));
-    SkASSERT(canvas->getSaveCount() == startN);
-
-    SkBitmap bm;
-    bm.setConfig(SkBitmap::kARGB_8888_Config, 100, 100);
-    bm.allocPixels();
-    SkCanvas c(bm);
-    c.drawPicture(pic);
-}
-
 ///////////////////////////////////////////////////////////////////////////////
 
 #include "SkImageRef_GlobalPool.h"
@@ -137,8 +75,6 @@
         // unref fPicture in our destructor, and it will in turn take care of
         // the other references to fSubPicture
         fSubPicture->unref();
-
-        test_saveRestoreCulling();
     }
     
     virtual ~PictureView() {
diff --git a/samplecode/SampleShapes.cpp b/samplecode/SampleShapes.cpp
index dc10f1a..6742017 100644
--- a/samplecode/SampleShapes.cpp
+++ b/samplecode/SampleShapes.cpp
@@ -127,16 +127,14 @@
         matrix.preScale(SK_Scalar1*2, SK_Scalar1*2);
         gs->appendShape(&fGroup, matrix);
         
-#if 0
-        canvas->drawShape(gs);
-#else
+#if 1
         SkPicture* pict = new SkPicture;
         SkCanvas* cv = pict->beginRecording(1000, 1000);
         cv->scale(SK_ScalarHalf, SK_ScalarHalf);
-        cv->drawShape(gs);
+        gs->draw(cv);
         cv->translate(SkIntToScalar(680), SkIntToScalar(480));
         cv->scale(-SK_Scalar1, SK_Scalar1);
-        cv->drawShape(gs);
+        gs->draw(cv);
         pict->endRecording();
         
         drawpicture(canvas, *pict);
diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp
index f8dd028..7325c02 100644
--- a/src/core/SkCanvas.cpp
+++ b/src/core/SkCanvas.cpp
@@ -22,7 +22,6 @@
 #include "SkDrawLooper.h"
 #include "SkPicture.h"
 #include "SkScalarCompare.h"
-#include "SkShape.h"
 #include "SkTemplates.h"
 #include "SkTLazy.h"
 #include "SkUtils.h"
@@ -1646,11 +1645,6 @@
     restoreToCount(saveCount);
 }
 
-void SkCanvas::drawShape(SkShape* shape) {
-    // shape baseclass takes care of save/restore
-    shape->draw(this);
-}
-
 ///////////////////////////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////////////////////////
 
diff --git a/src/core/SkPictureFlat.h b/src/core/SkPictureFlat.h
index 697b399..a11f556 100644
--- a/src/core/SkPictureFlat.h
+++ b/src/core/SkPictureFlat.h
@@ -28,7 +28,6 @@
     DRAW_POS_TEXT_H,
     DRAW_POS_TEXT_H_TOP_BOTTOM, // fast variant of DRAW_POS_TEXT_H
     DRAW_RECT,
-    DRAW_SHAPE,
     DRAW_SPRITE,
     DRAW_TEXT,
     DRAW_TEXT_ON_PATH,
diff --git a/src/core/SkPicturePlayback.cpp b/src/core/SkPicturePlayback.cpp
index 67b6865..05663e5 100644
--- a/src/core/SkPicturePlayback.cpp
+++ b/src/core/SkPicturePlayback.cpp
@@ -120,17 +120,6 @@
         }
     }
 
-    const SkTDArray<SkShape* >& shapes = record.getShapes();
-    fShapeCount = shapes.count();
-    if (fShapeCount > 0) {
-        fShapes = SkNEW_ARRAY(SkShape*, fShapeCount);
-        for (int i = 0; i < fShapeCount; i++) {
-            SkShape* s = shapes[i];
-            SkSafeRef(s);
-            fShapes[i] = s;
-        }
-    }
-
     const SkTDArray<const SkFlatRegion* >& regions = record.getRegions();
     fRegionCount = regions.count();
     if (fRegionCount > 0) {
@@ -203,14 +192,6 @@
         fPictureRefs[i]->ref();
     }
 
-    fShapeCount = src.fShapeCount;
-    fShapes = SkNEW_ARRAY(SkShape*, fShapeCount);
-    for (int i = 0; i < fShapeCount; i++) {
-        SkShape* s = src.fShapes[i];
-        SkSafeRef(s);
-        fShapes[i] = s;
-    }
-
     fRegionCount = src.fRegionCount;
     fRegions = SkNEW_ARRAY(SkRegion, fRegionCount);
     for (i = 0; i < fRegionCount; i++) {
@@ -224,10 +205,9 @@
     fPaints = NULL;
     fPathHeap = NULL;
     fPictureRefs = NULL;
-    fShapes = NULL;
     fRegions = NULL;
     fBitmapCount = fMatrixCount = fPaintCount = fPictureCount =
-    fRegionCount = fShapeCount = 0;
+    fRegionCount = 0;
 
     fFactoryPlayback = NULL;
 }
@@ -247,11 +227,6 @@
     }
     SkDELETE_ARRAY(fPictureRefs);
 
-    for (int i = 0; i < fShapeCount; i++) {
-        SkSafeUnref(fShapes[i]);
-    }
-    SkDELETE_ARRAY(fShapes);
-
     SkDELETE(fFactoryPlayback);
 }
 
@@ -281,7 +256,6 @@
 #define PICT_PAINT_TAG      SkSetFourByteTag('p', 'n', 't', ' ')
 #define PICT_PATH_TAG       SkSetFourByteTag('p', 't', 'h', ' ')
 #define PICT_REGION_TAG     SkSetFourByteTag('r', 'g', 'n', ' ')
-#define PICT_SHAPE_TAG      SkSetFourByteTag('s', 'h', 'p', ' ')
 
 #include "SkStream.h"
 
@@ -378,11 +352,6 @@
         buffer.writePad(storage.get(), size);
     }
 
-    writeTagSize(buffer, PICT_SHAPE_TAG, fShapeCount);
-    for (i = 0; i < fShapeCount; i++) {
-        buffer.writeFlattenable(fShapes[i]);
-    }
-
     // now we can write to the stream again
 
     writeFactories(stream, factSet);
@@ -491,12 +460,6 @@
         SkDEBUGCODE(uint32_t bytes =) fRegions[i].unflatten(buffer.skip(size));
         SkASSERT(size == bytes);
     }
-
-    fShapeCount = readTagSize(buffer, PICT_SHAPE_TAG);
-    fShapes = SkNEW_ARRAY(SkShape*, fShapeCount);
-    for (i = 0; i < fShapeCount; i++) {
-        fShapes[i] = reinterpret_cast<SkShape*>(buffer.readFlattenable());
-    }
 }
 
 ///////////////////////////////////////////////////////////////////////////////
@@ -651,12 +614,6 @@
                 const SkPaint& paint = *getPaint();
                 canvas.drawRect(*fReader.skipRect(), paint);
             } break;
-            case DRAW_SHAPE: {
-                SkShape* shape = getShape();
-                if (shape) {
-                    canvas.drawShape(shape);
-                }
-            } break;
             case DRAW_SPRITE: {
                 const SkPaint* paint = getPaint();
                 const SkBitmap& bitmap = getBitmap();
diff --git a/src/core/SkPicturePlayback.h b/src/core/SkPicturePlayback.h
index 350df78..7eda167 100644
--- a/src/core/SkPicturePlayback.h
+++ b/src/core/SkPicturePlayback.h
@@ -11,7 +11,6 @@
 #include "SkPathHeap.h"
 #include "SkRegion.h"
 #include "SkPictureFlat.h"
-#include "SkShape.h"
 
 #ifdef ANDROID
 #include "SkThread.h"
@@ -78,12 +77,6 @@
         return *fPictureRefs[index - 1];
     }
     
-    SkShape* getShape() {
-        int index = getInt();
-        SkASSERT(index > 0 && index <= fShapeCount);
-        return fShapes[index - 1];
-    }
-    
     const SkPaint* getPaint() {
         int index = getInt();
         if (index == 0) {
@@ -170,8 +163,6 @@
 
     SkPicture** fPictureRefs;
     int fPictureCount;
-    SkShape** fShapes;
-    int fShapeCount;
 
     SkRefCntPlayback fRCPlayback;
     SkTypefacePlayback fTFPlayback;
diff --git a/src/core/SkPictureRecord.cpp b/src/core/SkPictureRecord.cpp
index 6b2b330..9339efc 100644
--- a/src/core/SkPictureRecord.cpp
+++ b/src/core/SkPictureRecord.cpp
@@ -1,5 +1,4 @@
 #include "SkPictureRecord.h"
-#include "SkShape.h"
 #include "SkTSearch.h"
 
 #define MIN_WRITER_SIZE 16384
@@ -368,20 +367,6 @@
     validate();
 }
 
-void SkPictureRecord::drawShape(SkShape* shape) {
-    addDraw(DRAW_SHAPE);
-
-    int index = fShapes.find(shape);
-    if (index < 0) {    // not found
-        index = fShapes.count();
-        *fShapes.append() = shape;
-        shape->ref();
-    }
-    // follow the convention of recording a 1-based index
-    addInt(index + 1);
-    validate();
-}
-
 void SkPictureRecord::drawVertices(VertexMode vmode, int vertexCount,
                           const SkPoint vertices[], const SkPoint texs[],
                           const SkColor colors[], SkXfermode*,
@@ -433,7 +418,6 @@
     fPaints.reset();
     fPictureRefs.unrefAll();
     fRegions.reset();
-    fShapes.safeUnrefAll();
     fWriter.reset();
     fHeap.reset();
 
diff --git a/src/core/SkPictureRecord.h b/src/core/SkPictureRecord.h
index e0d6a50..9c86cf9 100644
--- a/src/core/SkPictureRecord.h
+++ b/src/core/SkPictureRecord.h
@@ -51,7 +51,6 @@
                             const SkPath& path, const SkMatrix* matrix, 
                                 const SkPaint&);
     virtual void drawPicture(SkPicture& picture);
-    virtual void drawShape(SkShape*);
     virtual void drawVertices(VertexMode, int vertexCount,
                           const SkPoint vertices[], const SkPoint texs[],
                           const SkColor colors[], SkXfermode*,
@@ -73,9 +72,6 @@
     const SkTDArray<SkPicture* >& getPictureRefs() const {
         return fPictureRefs;
     }
-    const SkTDArray<SkShape* >& getShapes() const {
-        return fShapes;
-    }
     const SkTDArray<const SkFlatRegion* >& getRegions() const {
         return fRegions;
     }
@@ -173,7 +169,6 @@
 
     // we ref each item in these arrays
     SkTDArray<SkPicture*> fPictureRefs;
-    SkTDArray<SkShape*> fShapes;
 
     SkRefCntSet fRCSet;
     SkRefCntSet fTFSet;
diff --git a/src/pdf/SkPDFDevice.cpp b/src/pdf/SkPDFDevice.cpp
index bd94471..d48ce7d 100644
--- a/src/pdf/SkPDFDevice.cpp
+++ b/src/pdf/SkPDFDevice.cpp
@@ -1081,10 +1081,13 @@
     return mediaBox;
 }
 
-/**
- *  Can this return SkData instead of SkStream?
- */
 SkStream* SkPDFDevice::content() const {
+    SkMemoryStream* result = new SkMemoryStream;
+    result->setData(this->copyContentToData())->unref();
+    return result;
+}
+
+SkData* SkPDFDevice::copyContentToData() const {
     SkDynamicMemoryWStream data;
     if (fInitialTransform.getType() != SkMatrix::kIdentity_Mask) {
         SkPDFUtils::AppendTransform(fInitialTransform, &data);
@@ -1097,11 +1100,11 @@
         SkRect r = SkRect::MakeWH(this->width(), this->height());
         emit_clip(NULL, &r, &data);
     }
-
+    
     GraphicStackState gsState(fExistingClipStack, fExistingClipRegion, &data);
     for (ContentEntry* entry = fContentEntries.get();
-            entry != NULL;
-            entry = entry->fNext.get()) {
+         entry != NULL;
+         entry = entry->fNext.get()) {
         SkIPoint translation = this->getOrigin();
         translation.negate();
         gsState.updateClip(entry->fState.fClipStack, entry->fState.fClipRegion,
@@ -1114,9 +1117,9 @@
     }
     gsState.drainStack();
 
-    SkMemoryStream* result = new SkMemoryStream;
-    result->setData(data.copyToData())->unref();
-    return result;
+    // potentially we could cache this SkData, and only rebuild it if we
+    // see that our state has changed.
+    return data.copyToData();
 }
 
 void SkPDFDevice::createFormXObjectFromDevice(
diff --git a/src/pipe/SkGPipePriv.h b/src/pipe/SkGPipePriv.h
index 06ba7b6..7122992 100644
--- a/src/pipe/SkGPipePriv.h
+++ b/src/pipe/SkGPipePriv.h
@@ -56,7 +56,6 @@
     kDrawPosText_DrawOp,
     kDrawPosTextH_DrawOp,
     kDrawRect_DrawOp,
-    kDrawShape_DrawOp,
     kDrawSprite_DrawOp,
     kDrawText_DrawOp,
     kDrawTextOnPath_DrawOp,
diff --git a/src/pipe/SkGPipeRead.cpp b/src/pipe/SkGPipeRead.cpp
index fb0fbc4..07d4ee2 100644
--- a/src/pipe/SkGPipeRead.cpp
+++ b/src/pipe/SkGPipeRead.cpp
@@ -364,11 +364,6 @@
     canvas->drawData(data, size);
 }
 
-static void drawShape_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
-                         SkGPipeState* state) {
-    UNIMPLEMENTED
-}
-
 static void drawPicture_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
                            SkGPipeState* state) {
     UNIMPLEMENTED
@@ -463,7 +458,6 @@
     drawPosText_rp,
     drawPosTextH_rp,
     drawRect_rp,
-    drawShape_rp,
     drawSprite_rp,
     drawText_rp,
     drawTextOnPath_rp,
diff --git a/src/pipe/SkGPipeWrite.cpp b/src/pipe/SkGPipeWrite.cpp
index 1ff7d45..b1eebc8 100644
--- a/src/pipe/SkGPipeWrite.cpp
+++ b/src/pipe/SkGPipeWrite.cpp
@@ -127,7 +127,6 @@
                             const SkPath& path, const SkMatrix* matrix, 
                                 const SkPaint&);
     virtual void drawPicture(SkPicture& picture);
-    virtual void drawShape(SkShape*);
     virtual void drawVertices(VertexMode, int vertexCount,
                           const SkPoint vertices[], const SkPoint texs[],
                           const SkColor colors[], SkXfermode*,
@@ -591,10 +590,6 @@
     this->INHERITED::drawPicture(picture);
 }
 
-void SkGPipeCanvas::drawShape(SkShape* shape) {
-    UNIMPLEMENTED
-}
-
 void SkGPipeCanvas::drawVertices(VertexMode mode, int vertexCount,
                                  const SkPoint vertices[], const SkPoint texs[],
                                  const SkColor colors[], SkXfermode*,
diff --git a/src/utils/SkDumpCanvas.cpp b/src/utils/SkDumpCanvas.cpp
index 223a4f7..af67c06 100644
--- a/src/utils/SkDumpCanvas.cpp
+++ b/src/utils/SkDumpCanvas.cpp
@@ -351,14 +351,6 @@
                str.c_str(), byteLength);
 }
 
-void SkDumpCanvas::drawShape(SkShape* shape) {
-    this->dump(kDrawShape_Verb, NULL, "drawShape(%p)", shape);
-    fNestLevel += 1;
-    this->INHERITED::drawShape(shape);
-    fNestLevel -= 1;
-    this->dump(kDrawShape_Verb, NULL, "endShape(%p)", shape);
-}
-
 void SkDumpCanvas::drawPicture(SkPicture& picture) {
     this->dump(kDrawPicture_Verb, NULL, "drawPicture(%p) %d:%d", &picture,
                picture.width(), picture.height());
diff --git a/src/utils/SkNWayCanvas.cpp b/src/utils/SkNWayCanvas.cpp
index d3c84a1..d60f259 100644
--- a/src/utils/SkNWayCanvas.cpp
+++ b/src/utils/SkNWayCanvas.cpp
@@ -248,13 +248,6 @@
     }
 }
 
-void SkNWayCanvas::drawShape(SkShape* shape) {
-    Iter iter(fList);
-    while (iter.next()) {
-        iter->drawShape(shape);
-    }
-}
-
 void SkNWayCanvas::drawVertices(VertexMode vmode, int vertexCount,
                           const SkPoint vertices[], const SkPoint texs[],
                           const SkColor colors[], SkXfermode* xmode,
diff --git a/src/utils/SkProxyCanvas.cpp b/src/utils/SkProxyCanvas.cpp
index 33f77e4..9c94d59 100644
--- a/src/utils/SkProxyCanvas.cpp
+++ b/src/utils/SkProxyCanvas.cpp
@@ -126,10 +126,6 @@
     fProxy->drawPicture(picture);
 }
 
-void SkProxyCanvas::drawShape(SkShape* shape) {
-    fProxy->drawShape(shape);
-}
-
 void SkProxyCanvas::drawVertices(VertexMode vmode, int vertexCount,
                                  const SkPoint vertices[], const SkPoint texs[],
                                  const SkColor colors[], SkXfermode* xmode,
