update pipe test



git-svn-id: http://skia.googlecode.com/svn/trunk@1238 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/samplecode/SampleApp.cpp b/samplecode/SampleApp.cpp
index 113a8ed..724602d 100644
--- a/samplecode/SampleApp.cpp
+++ b/samplecode/SampleApp.cpp
@@ -705,9 +705,6 @@
 }
 
 SkCanvas* SampleWindow::beforeChildren(SkCanvas* canvas) {
-    SkIPoint viewport;
-    bool alreadyGPU = canvas->getViewport(&viewport);
-
     if (kGPU_CanvasType != fCanvasType) {
 #ifdef SK_SUPPORT_GL
         detachGL();
@@ -723,7 +720,7 @@
             canvas = fPicture->beginRecording(9999, 9999);
             break;
         case kGPU_CanvasType: {
-            if (!alreadyGPU && make3DReady()) {
+            if (make3DReady()) {
                 SkDevice* device = canvas->getDevice();
                 const SkBitmap& bitmap = device->accessBitmap(true);
 
@@ -1338,35 +1335,77 @@
 }
 
 #define TEST_GPIPEx
+
 #ifdef TEST_GPIPE
     #include "SkGPipe.h"
+
+class SimplePC : public SkGPipeController {
+public:
+    SimplePC(SkCanvas* target);
+    ~SimplePC();
+
+    virtual void* requestBlock(size_t minRequest, size_t* actual);
+    virtual void notifyWritten(size_t bytes);
+
+private:
+    SkGPipeReader fReader;
+    void*         fBlock;
+    size_t        fBlockSize;
+    size_t        fBytesWritten;
+    SkGPipeReader::Status   fStatus;
+
+    size_t        fTotalWritten;
+};
+
+SimplePC::SimplePC(SkCanvas* target) : fReader(target) {
+    fBlock = NULL;
+    fBlockSize = fBytesWritten = 0;
+    fStatus = SkGPipeReader::kDone_Status;
+    fTotalWritten = 0;
+}
+
+SimplePC::~SimplePC() {
+//    SkASSERT(SkGPipeReader::kDone_Status == fStatus);
+    sk_free(fBlock);
+
+    SkDebugf("--- %d bytes written to pipe, status %d\n", fTotalWritten, fStatus);
+}
+
+void* SimplePC::requestBlock(size_t minRequest, size_t* actual) {
+    sk_free(fBlock);
+
+    fBlockSize = minRequest * 4;
+    fBlock = sk_malloc_throw(fBlockSize);
+    fBytesWritten = 0;
+    *actual = fBlockSize;
+    return fBlock;
+}
+
+void SimplePC::notifyWritten(size_t bytes) {
+    SkASSERT(fBytesWritten + bytes <= fBlockSize);
+
+    fStatus = fReader.playback((const char*)fBlock + fBytesWritten, bytes);
+    SkASSERT(SkGPipeReader::kError_Status != fStatus);
+    fBytesWritten += bytes;
+    fTotalWritten += bytes;
+}
+
 #endif
 
+
 void SampleView::onDraw(SkCanvas* canvas) {
     this->onDrawBackground(canvas);
 
 #ifdef TEST_GPIPE
+    SimplePC controller(canvas);
     SkGPipeWriter writer;
-    SkCanvas* origCanvas = canvas;
-    canvas = writer.startRecording();
+    canvas = writer.startRecording(&controller);
 #endif
 
     for (int i = 0; i < fRepeatCount; i++) {
         SkAutoCanvasRestore acr(canvas, true);
         this->onDrawContent(canvas);
     }
-
-#ifdef TEST_GPIPE
-    writer.endRecording();
-
-    size_t size = writer.flatten(NULL);
-    SkAutoMalloc storage(size);
-    writer.flatten(storage.get());
-
-    SkGPipeReader reader(origCanvas);
-    SkGPipeReader::Status status = reader.playback(storage.get(), size);
-    SkASSERT(SkGPipeReader::kDone_Status == status);
-#endif
 }
 
 void SampleView::onDrawBackground(SkCanvas* canvas) {