Added Debugger to Sample App, off by default
Removed CocoaDebugger from experimental
Slight changes to SkOSMenu
Bug fixes for NetPipeReader and DrawingBoard


git-svn-id: http://skia.googlecode.com/svn/trunk@2102 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/samplecode/SampleApp.cpp b/samplecode/SampleApp.cpp
index 15d1c28..e450a95 100644
--- a/samplecode/SampleApp.cpp
+++ b/samplecode/SampleApp.cpp
@@ -29,7 +29,7 @@
 #include "SkPDFDocument.h"
 #include "SkStream.h"
 
-#define TEST_GPIPEx
+#define TEST_GPIPE
 
 #ifdef  TEST_GPIPE
 #define PIPE_FILEx
@@ -42,13 +42,24 @@
 #include "SkSockets.h"
 SkTCPServer gServer;
 #endif
+
+#define DEBUGGERx
+#ifdef  DEBUGGER
+extern SkView* create_debugger(const char* data, size_t size);
+extern bool is_debugger(SkView* view);
+SkTDArray<char> gTempDataStore;
+#endif
+
 #endif
 
 #define USE_ARROWS_FOR_ZOOM true
 //#define DEFAULT_TO_GPU
 
 extern SkView* create_overview(int, const SkViewFactory[]);
+extern bool is_overview(SkView* view);
 extern SkView* create_transition(SkView*, SkView*, int);
+extern bool is_transition(SkView* view);
+
 
 #define ANIMATING_EVENTTYPE "nextSample"
 #define ANIMATING_DELAY     750
@@ -438,6 +449,7 @@
     fZoomScale = SK_Scalar1;
     
     fMagnify = false;
+    fDebugger = false;
     
     fSaveToPdf = false;
     fPdfCanvas = NULL;
@@ -449,7 +461,8 @@
     fAppMenu.setTitle("Global Settings");
     int itemID;
     
-    itemID =fAppMenu.appendList("Device Type", "Device Type", sinkID, 0, "Raster", "Picture", "OpenGL", NULL);
+    itemID =fAppMenu.appendList("Device Type", "Device Type", sinkID, 0, 
+                                "Raster", "Picture", "OpenGL", NULL);
     fAppMenu.assignKeyEquivalentToItem(itemID, 'd');
     itemID = fAppMenu.appendTriState("AA", "AA", sinkID, fAAState);
     fAppMenu.assignKeyEquivalentToItem(itemID, 'b');
@@ -459,14 +472,16 @@
     fAppMenu.assignKeyEquivalentToItem(itemID, 'n');
     itemID = fAppMenu.appendTriState("Hinting", "Hinting", sinkID, fHintingState);
     fAppMenu.assignKeyEquivalentToItem(itemID, 'h');
-    itemID = fAppMenu.appendSwitch("Pipe", "Pipe" , sinkID, fUsePipe);    
-    fAppMenu.assignKeyEquivalentToItem(itemID, 'p');
+    fUsePipeMenuItemID = fAppMenu.appendSwitch("Pipe", "Pipe" , sinkID, fUsePipe);    
+    fAppMenu.assignKeyEquivalentToItem(fUsePipeMenuItemID, 'p');
+#ifdef DEBUGGER
+    itemID = fAppMenu.appendSwitch("Debugger", "Debugger", sinkID, fDebugger);
+    fAppMenu.assignKeyEquivalentToItem(itemID, 'q');
+#endif
     itemID = fAppMenu.appendSwitch("Slide Show", "Slide Show" , sinkID, false);    
     fAppMenu.assignKeyEquivalentToItem(itemID, 'a');    
     itemID = fAppMenu.appendSwitch("Clip", "Clip" , sinkID, fUseClip);    
     fAppMenu.assignKeyEquivalentToItem(itemID, 'c');
-    itemID = fAppMenu.appendSwitch("Measure FPS", "Measure FPS" , sinkID, fMeasureFPS);
-    fAppMenu.assignKeyEquivalentToItem(itemID, 'f');
     itemID = fAppMenu.appendSwitch("Flip X", "Flip X" , sinkID, false); 
     fAppMenu.assignKeyEquivalentToItem(itemID, 'x');
     itemID = fAppMenu.appendSwitch("Flip Y", "Flip Y" , sinkID, false);
@@ -914,7 +929,7 @@
         this->inval(NULL);
         return;
     }
-
+    
     if (fRequestGrabImage) {
         fRequestGrabImage = false;
 
@@ -969,7 +984,24 @@
         r.set(50, 50, 50+100, 50+100);
         bm.scrollRect(&r, dx, dy, &inval);
         paint_rgn(bm, r, inval);
-    }        
+    }
+#ifdef DEBUGGER
+    SkView* curr = curr_view(this);
+    if (fDebugger && !is_debugger(curr) && !is_transition(curr) && !is_overview(curr)) {
+        //Stop Pipe when fDebugger is active
+        fUsePipe = false;
+        (void)SampleView::SetUsePipe(curr, false);
+        fAppMenu.getItemByID(fUsePipeMenuItemID)->setBool(fUsePipe);
+        this->onUpdateMenu(&fAppMenu);
+        
+        //Reset any transformations
+        fGesture.stop();
+        fGesture.reset();
+        
+        this->loadView(create_debugger(gTempDataStore.begin(), 
+                                       gTempDataStore.count()));
+    }
+#endif
 }
 
 void SampleWindow::beforeChild(SkView* child, SkCanvas* canvas) {
@@ -1000,7 +1032,7 @@
     } else {
         (void)SampleView::SetRepeatDraw(child, 1);
     }
-    (void)SampleView::SetUsePipe(child, fUsePipe);
+    //(void)SampleView::SetUsePipe(child, fUsePipe);
 }
 
 void SampleWindow::afterChild(SkView* child, SkCanvas* canvas) {
@@ -1089,8 +1121,8 @@
         }
         return true;
     }
-    if (evt.isType("unref-transition-view")) {
-        SkEventSink::FindSink(evt.getFast32())->unref();
+    if (evt.isType("replace-transition-view")) {
+        this->loadView((SkView*)SkEventSink::FindSink(evt.getFast32()));
         return true;
     }
     if (evt.isType("set-curr-index")) {
@@ -1102,49 +1134,65 @@
         return true;
     }
     int selected = -1;
-    if (SkOSMenu::FindListIndex(&evt, "Device Type", &selected)) {
+    if (SkOSMenu::FindListIndex(evt, "Device Type", &selected)) {
         this->setDeviceType((DeviceType)selected);
         return true; 
     }
-    if (SkOSMenu::FindSwitchState(&evt, "Pipe", NULL)) {
-        this->togglePipe();
+    if (SkOSMenu::FindSwitchState(evt, "Pipe", &fUsePipe)) {
+#ifdef PIPE_NET
+        if (!fUsePipe)
+            gServer.disconnectAll();
+#endif
+        (void)SampleView::SetUsePipe(curr_view(this), fUsePipe);
+        this->updateTitle();
+        this->inval(NULL);
         return true;
     }
-    if (SkOSMenu::FindSwitchState(&evt, "Slide Show", NULL)) {
+    if (SkOSMenu::FindSwitchState(evt, "Slide Show", NULL)) {
         this->toggleSlideshow();
         return true;
     }
-    if (SkOSMenu::FindTriState(&evt, "AA", &fAAState) ||
-        SkOSMenu::FindTriState(&evt, "LCD", &fLCDState) ||
-        SkOSMenu::FindTriState(&evt, "Filter", &fFilterState) ||
-        SkOSMenu::FindTriState(&evt, "Hinting", &fHintingState) ||
-        SkOSMenu::FindSwitchState(&evt, "Clip", &fUseClip) ||
-        SkOSMenu::FindSwitchState(&evt, "Zoomer", &fShowZoomer) ||
-        SkOSMenu::FindSwitchState(&evt, "Magnify", &fMagnify) ||
-        SkOSMenu::FindSwitchState(&evt, "Measure FPS", &fMeasureFPS) ||
-        SkOSMenu::FindListIndex(&evt, "Transition-Next", &fTransitionNext) ||
-        SkOSMenu::FindListIndex(&evt, "Transition-Prev", &fTransitionPrev)) {
+    if (SkOSMenu::FindTriState(evt, "AA", &fAAState) ||
+        SkOSMenu::FindTriState(evt, "LCD", &fLCDState) ||
+        SkOSMenu::FindTriState(evt, "Filter", &fFilterState) ||
+        SkOSMenu::FindTriState(evt, "Hinting", &fHintingState) ||
+        SkOSMenu::FindSwitchState(evt, "Clip", &fUseClip) ||
+        SkOSMenu::FindSwitchState(evt, "Zoomer", &fShowZoomer) ||
+        SkOSMenu::FindSwitchState(evt, "Magnify", &fMagnify) ||
+        SkOSMenu::FindListIndex(evt, "Transition-Next", &fTransitionNext) ||
+        SkOSMenu::FindListIndex(evt, "Transition-Prev", &fTransitionPrev)) {
         this->inval(NULL);
         this->updateTitle();
         return true;
     }
-    if (SkOSMenu::FindSwitchState(&evt, "Flip X", NULL)) {
+    if (SkOSMenu::FindSwitchState(evt, "Flip X", NULL)) {
         fFlipAxis ^= kFlipAxis_X;
         this->updateTitle();
         this->inval(NULL);
         return true;
     }
-    if (SkOSMenu::FindSwitchState(&evt, "Flip Y", NULL)) {
+    if (SkOSMenu::FindSwitchState(evt, "Flip Y", NULL)) {
         fFlipAxis ^= kFlipAxis_Y;
         this->updateTitle();
         this->inval(NULL);
         return true;
     }
-    
-    if (SkOSMenu::FindAction(&evt,"Save to PDF")) {
+    if (SkOSMenu::FindAction(evt,"Save to PDF")) {
         this->saveToPdf();
         return true;
-    }    
+    } 
+#ifdef DEBUGGER
+    if (SkOSMenu::FindSwitchState(evt, "Debugger", &fDebugger)) {
+        if (fDebugger) {
+            fUsePipe = true;
+            (void)SampleView::SetUsePipe(curr_view(this), true);
+        } else {
+            this->loadView(fSamples[fCurrIndex]());
+        }
+        this->inval(NULL);
+        return true;
+    }
+#endif
     return this->INHERITED::onEvent(evt);
 }
 
@@ -1230,6 +1278,12 @@
         case 'd':
             SkGraphics::SetFontCacheUsed(0);
             return true;
+        case 'f':
+            // only 
+            fMeasureFPS = !fMeasureFPS;
+            this->updateTitle();
+            this->inval(NULL);
+            break;
         case 'g':
             fRequestGrabImage = true;
             this->inval(NULL);
@@ -1285,16 +1339,6 @@
     this->inval(NULL);
 }
 
-void SampleWindow::togglePipe() {
-    fUsePipe = !fUsePipe;
-#ifdef PIPE_NET
-    if (!fUsePipe)
-        gServer.disconnectAll();
-#endif
-    this->updateTitle();
-    this->inval(NULL);
-}
-
 #include "SkDumpCanvas.h"
 
 bool SampleWindow::onHandleKey(SkKey key) {
@@ -1427,7 +1471,7 @@
     if (prev) {
         prev->detachFromParent();
     }
-
+    
     view->setVisibleP(true);
     view->setClipToBounds(false);
     this->attachChildToFront(view)->unref();
@@ -1435,10 +1479,16 @@
 
     //repopulate the slide menu when a view is loaded
     fSlideMenu.reset();
+#ifdef DEBUGGER
+    if (!is_debugger(view) && !is_overview(view) && !is_transition(view) && fDebugger) {
+        //Force Pipe to be on if using debugger
+        fUsePipe = true;
+    }
+#endif
+    (void)SampleView::SetUsePipe(view, fUsePipe);
     if (SampleView::IsSampleView(view))
         ((SampleView*)view)->requestMenu(&fSlideMenu);
     this->onUpdateMenu(&fSlideMenu);
-    
     this->updateTitle();
 }
 
@@ -1648,10 +1698,9 @@
 SimplePC::~SimplePC() {
 //    SkASSERT(SkGPipeReader::kDone_Status == fStatus);
     if (fTotalWritten) {
-        SkDebugf("--- %d bytes %d atoms, status %d\n", fTotalWritten,
-                     fAtomsWritten, fStatus);
-        
         if (fWriteToPipe) {
+            SkDebugf("--- %d bytes %d atoms, status %d\n", fTotalWritten,
+                     fAtomsWritten, fStatus);
 #ifdef  PIPE_FILE
             //File is open in append mode
             FILE* f = fopen(FILE_PATH, "ab");
@@ -1665,6 +1714,10 @@
                 gServer.writePacket(fBlock, fTotalWritten);
             }
 #endif
+#ifdef  DEBUGGER
+            gTempDataStore.reset();
+            gTempDataStore.append(fTotalWritten, (const char*)fBlock);
+#endif
         }
     }
     sk_free(fBlock);
@@ -1701,6 +1754,9 @@
         canvas = writer.startRecording(&controller, flags);
         //Must draw before controller goes out of scope and sends data
         this->INHERITED::draw(canvas);
+        //explicitly end recording to ensure writer is flushed before the memory
+        //is freed in the deconstructor of the controller
+        writer.endRecording();
         controller.setWriteToPipe(fUsePipe);
     }
     else