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/experimental/Networking/SampleNetPipeReader.cpp b/experimental/Networking/SampleNetPipeReader.cpp
index 0d90286..f58d5c2 100644
--- a/experimental/Networking/SampleNetPipeReader.cpp
+++ b/experimental/Networking/SampleNetPipeReader.cpp
@@ -6,12 +6,26 @@
 #include "SkSockets.h"
 #include "SkOSMenu.h"
 
-#define MAX_READS_PER_FRAME 5
+/**
+ * A simple networked pipe reader
+ *
+ * This view will connect to a user specified server, in this case meaning any
+ * Skia app that's has a SkTCPServer set up to broadcast its piped drawing data,
+ * received all the data transmitted and attempt to reproduce the drawing calls.
+ * This reader will only keep the latest batch of data. In order to keep up with
+ * the server, which may be producing data at a much higher rate than the reader
+ * is consuming, the reader will attempt multiple reads and only render the 
+ * latest frame. this behavior can be adjusted by changing MAX_READS_PER_FRAME
+ * or disabled by setting fSync to false
+ */
+
+#define MAX_READS_PER_FRAME 12
+
 class NetPipeReaderView : public SampleView {
 public:
 	NetPipeReaderView() {
         fSocket = NULL;
-        fSync = false;
+        fSync = true;
     }
     
     ~NetPipeReaderView() {
@@ -47,9 +61,9 @@
         return this->INHERITED::onQuery(evt);
     }
 
-    bool onEvent(const SkEvent& evt) {;
+    bool onEvent(const SkEvent& evt) {
         SkString s;
-        if (SkOSMenu::FindText(&evt, "Server IP", &s)) {
+        if (SkOSMenu::FindText(evt, "Server IP", &s)) {
             if (NULL != fSocket) {
                 delete fSocket;
             }
@@ -58,7 +72,7 @@
             SkDebugf("Connecting to %s\n", s.c_str());
             return true;
         }
-        if (SkOSMenu::FindSwitchState(&evt, "Sync", &fSync))
+        if (SkOSMenu::FindSwitchState(evt, "Sync", &fSync))
             return true;
         return this->INHERITED::onEvent(evt);
     }
@@ -73,10 +87,17 @@
                 int numreads = 0;
                 while (fSocket->readPacket(readData, this) > 0 && 
                        numreads < MAX_READS_PER_FRAME) {
+                    // at this point, new data has been read and stored, discard
+                    // old data since it's not needed anymore
+                    SkASSERT(fDataArray.count() > dataToRemove);
                     fDataArray.remove(0, dataToRemove);
                     dataToRemove = fDataArray.count();
                     ++numreads;
                 }
+                // clean up if max reads reached
+                if (numreads == MAX_READS_PER_FRAME && 
+                    fDataArray.count() > dataToRemove)
+                    fDataArray.remove(0, dataToRemove);
             }
             else {
                 if (fSocket->readPacket(readData, this) > 0) 
@@ -85,7 +106,7 @@
         }
         else
             fSocket->connectToServer();
-
+        
         SkGPipeReader reader(canvas);
         size_t bytesRead;
         SkGPipeReader::Status fStatus = reader.playback(fDataArray.begin(),
@@ -102,7 +123,6 @@
     typedef SampleView INHERITED;
 };
 
-
 ///////////////////////////////////////////////////////////////////////////////
 
 static SkView* MyFactory() { return new NetPipeReaderView; }