Rest of 2016 vision code.

Vision2016Debug:
  - Added live debug (debug_reciever);
  - Added file replay (blob_stream_replay).
  - Add gtk event code.
  - Updated code and fixed compile errors after rebase.
  - Added useful tools for reference. As per Austins directions.

Change-Id: I7c5e7df01eb09057178bcb99dd3e302ca274ac76
diff --git a/aos/vision/blob/stream_view.h b/aos/vision/blob/stream_view.h
index 9d63e8d..bee1dc9 100644
--- a/aos/vision/blob/stream_view.h
+++ b/aos/vision/blob/stream_view.h
@@ -10,30 +10,32 @@
 namespace aos {
 namespace vision {
 
-class BlobStreamViewer {
+class BlobStreamViewer : public DebugViewer {
  public:
-  BlobStreamViewer() : view_(false) {}
+  BlobStreamViewer() : DebugViewer(false) {}
+  explicit BlobStreamViewer(bool flip) : DebugViewer(flip) {}
+
   void Submit(ImageFormat fmt, const BlobList &blob_list) {
     SetFormatAndClear(fmt);
     DrawBlobList(blob_list, {255, 255, 255});
   }
 
   inline void SetFormatAndClear(ImageFormat fmt) {
-    if (fmt.w != ptr_.fmt().w || fmt.h != ptr_.fmt().h) {
+    if (!image_.fmt().Equals(fmt)) {
       printf("resizing data: %d, %d\n", fmt.w, fmt.h);
-      outbuf_.reset(new PixelRef[fmt.ImgSize()]);
-      ptr_ = ImagePtr{fmt, outbuf_.get()};
-      view_.UpdateImage(ptr_);
+      image_ = ImageValue(fmt);
+      UpdateImage(image_.get());
     }
-    memset(ptr_.data(), 0, fmt.ImgSize() * sizeof(PixelRef));
+    memset(image_.data(), 0, fmt.ImgSize() * sizeof(PixelRef));
   }
 
   inline void DrawBlobList(const BlobList &blob_list, PixelRef color) {
-    for (const auto &blob : blob_list) {
-      for (int i = 0; i < (int)blob.ranges.size(); ++i) {
-        for (const auto &range : blob.ranges[i]) {
+    ImagePtr ptr = img();
+    for (const RangeImage &blob : blob_list) {
+      for (int i = 0; i < (int)blob.ranges().size(); ++i) {
+        for (const auto &range : blob.ranges()[i]) {
           for (int j = range.st; j < range.ed; ++j) {
-            ptr_.get_px(j, i + blob.min_y) = color;
+            ptr.get_px(j, i + blob.min_y()) = color;
           }
         }
       }
@@ -42,15 +44,16 @@
 
   inline void DrawSecondBlobList(const BlobList &blob_list, PixelRef color1,
                                  PixelRef color2) {
+    ImagePtr ptr = img();
     for (const auto &blob : blob_list) {
-      for (int i = 0; i < (int)blob.ranges.size(); ++i) {
-        for (const auto &range : blob.ranges[i]) {
+      for (int i = 0; i < (int)blob.ranges().size(); ++i) {
+        for (const auto &range : blob.ranges()[i]) {
           for (int j = range.st; j < range.ed; ++j) {
-            auto px = ptr_.get_px(j, i + blob.min_y);
+            auto px = ptr.get_px(j, i + blob.min_y());
             if (px.r == 0 && px.g == 0 && px.b == 0) {
-              ptr_.get_px(j, i + blob.min_y) = color1;
+              ptr.get_px(j, i + blob.min_y()) = color1;
             } else {
-              ptr_.get_px(j, i + blob.min_y) = color2;
+              ptr.get_px(j, i + blob.min_y()) = color2;
             }
           }
         }
@@ -58,13 +61,13 @@
     }
   }
 
-  DebugViewer *view() { return &view_; }
+  // Backwards compatible.
+  DebugViewer *view() { return this; }
+
+  ImagePtr img() { return image_.get(); }
 
  private:
-  std::unique_ptr<PixelRef[]> outbuf_;
-  ImagePtr ptr_;
-
-  DebugViewer view_;
+  ImageValue image_;
 };
 
 }  // namespace vision