Added CocoaDebugger to experimental


git-svn-id: http://skia.googlecode.com/svn/trunk@1622 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/experimental/CocoaDebugger/SkContentView.cpp b/experimental/CocoaDebugger/SkContentView.cpp
new file mode 100644
index 0000000..0c3351f
--- /dev/null
+++ b/experimental/CocoaDebugger/SkContentView.cpp
@@ -0,0 +1,150 @@
+#include "SkDebuggerViews.h"
+#include <stdio.h>
+
+SkContentView::SkContentView(SkEventSinkID clID, SkEventSinkID ipID) : 
+                         fDumper(this->getSinkID(), clID, ipID) {
+    fBGColor = 0xFFDDDDDD;
+    fAtomsToRead = 0;
+    fDisplayClip = false;
+}
+
+SkContentView::~SkContentView() {
+    fAtomBounds.clear();
+    fFrameBounds.clear();
+}
+
+void SkContentView::reinit(const char* filename) {
+    fFilePath.set(filename);
+    fAtomsToRead = 0;
+    this->init();
+}
+
+bool SkContentView::onEvent(const SkEvent& evt) {
+    return this->INHERITED::onEvent(evt);
+}
+
+//Read file atom by atom and record attom bounds
+void SkContentView::init() {
+    fDumper.unload();
+    fAtomBounds.clear();
+    fFrameBounds.clear();
+    
+    SkDumpCanvasM* dumpCanvas = new SkDumpCanvasM(&fDumper);
+    SkGPipeReader* dumpReader = new SkGPipeReader(dumpCanvas);
+    
+    FILE* f = fopen(fFilePath.c_str(), "rb");
+    SkASSERT(f != NULL);
+    fseek(f, 0, SEEK_END);
+    int fileSize = ftell(f) * sizeof(char);
+    fseek(f, 0, SEEK_SET);
+    if (fileSize > 0) {
+        char* block = (char*)sk_malloc_throw(fileSize);
+        fread(block, 1, fileSize, f);
+        int offset = 0;
+        int frameBound = 0;
+        size_t bytesRead;
+        while (offset < fileSize) {
+            SkGPipeReader::Status s = dumpReader->playback(block + offset, 
+                                                           fileSize - offset, 
+                                                           &bytesRead, true);
+            SkASSERT(SkGPipeReader::kError_Status != s);
+            offset += bytesRead;
+            if (SkGPipeReader::kDone_Status == s) {
+                fDumper.dump(dumpCanvas,SkDumpCanvasM::kNULL_Verb, 
+                             "End of Frame", NULL);
+                delete dumpReader;
+                delete dumpCanvas;
+                dumpCanvas = new SkDumpCanvasM(&fDumper);
+                dumpReader = new SkGPipeReader(dumpCanvas);
+                frameBound = offset;
+            }
+            fAtomBounds.push_back(offset);
+            fFrameBounds.push_back(frameBound);
+        }
+        sk_free(block);
+    }
+
+    fclose(f);
+    
+    delete dumpReader;
+    delete dumpCanvas;
+    
+    fDumper.load();
+}
+
+void SkContentView::goToAtom(int atom) {
+    if (atom != fAtomsToRead) {
+        fAtomsToRead = atom;
+        this->inval(NULL);
+    }
+}
+
+void SkContentView::toggleClip() {
+    fDisplayClip = !fDisplayClip;
+    this->inval(NULL);
+}
+
+void SkContentView::onDraw(SkCanvas* canvas) {
+    canvas->drawColor(fBGColor);
+    
+    SkAutoCanvasRestore acr(canvas, true);
+
+    int lastFrameBound = fFrameBounds[fAtomsToRead];
+    int toBeRead = fAtomBounds[fAtomsToRead] - lastFrameBound;
+    int firstChunk = (fAtomsToRead > 0) ? fAtomBounds[fAtomsToRead - 1] -
+                                          lastFrameBound: 0;
+    if (toBeRead > 0) {
+        SkDumpCanvasM* dumpCanvas = new SkDumpCanvasM(&fDumper);
+        SkGPipeReader* dumpReader = new SkGPipeReader(dumpCanvas);
+        SkGPipeReader* reader = new SkGPipeReader(canvas);
+        fDumper.disable();
+        
+        FILE* f = fopen(fFilePath.c_str(), "rb");
+        SkASSERT(f != NULL);
+        fseek(f, lastFrameBound, SEEK_SET);
+        char* block = (char*)sk_malloc_throw(toBeRead);
+        fread(block, 1, toBeRead, f);
+        int offset = 0;
+        size_t bytesRead;
+        SkGPipeReader::Status s;
+        //Read the first chunk
+        if (offset < firstChunk && firstChunk < toBeRead) {
+            s = dumpReader->playback(block + offset, firstChunk - offset, NULL, false);
+            SkASSERT(SkGPipeReader::kError_Status != s);
+            s = reader->playback(block + offset, firstChunk - offset, &bytesRead, false);
+            SkASSERT(SkGPipeReader::kError_Status != s);
+            if (SkGPipeReader::kDone_Status == s){
+                delete dumpReader;
+                delete dumpCanvas;
+                dumpCanvas = new SkDumpCanvasM(&fDumper);
+                dumpReader = new SkGPipeReader(dumpCanvas);
+                delete reader;
+                reader = new SkGPipeReader(canvas);
+            }
+            offset += bytesRead;
+        }
+        SkASSERT(offset == firstChunk);
+        //Then read the current atom
+        fDumper.enable();
+        s = dumpReader->playback(block + offset, toBeRead - offset, NULL, true);
+        SkASSERT(SkGPipeReader::kError_Status != s);
+        s = reader->playback(block + offset, toBeRead - offset, &bytesRead, true);
+        SkASSERT(SkGPipeReader::kError_Status != s);
+
+        sk_free(block);
+        fclose(f);
+        
+        delete reader;
+        delete dumpReader;
+        delete dumpCanvas;
+        
+        if (fDisplayClip) {
+            SkPaint p;
+            p.setColor(0x440000AA);
+            SkPath path;
+            canvas->getTotalClip().getBoundaryPath(&path);
+            canvas->drawPath(path, p);
+        }
+    }
+    this->INHERITED::onDraw(canvas);
+}
\ No newline at end of file