perfetto-ui: Preperation for adding counter details

A couple of preparatory changes for adding details for counters:

- Fix a bug where drag_gesture_handler missed out of window mouseup
  and ended up in a bad state.
- Optimise counter rendering for the common case where counter value does
  not change.
- Highlight location of data point on counter track.
- Add a resizeable details window.

Change-Id: I9784f92e79fc812903bc1a235c76d66b1cf20010
diff --git a/ui/src/frontend/panel_container.ts b/ui/src/frontend/panel_container.ts
index d4ac2ec..50af60e 100644
--- a/ui/src/frontend/panel_container.ts
+++ b/ui/src/frontend/panel_container.ts
@@ -162,9 +162,9 @@
   }
 
   private updateCanvasDimensions() {
-    this.canvasHeight = this.attrs.doesScroll ?
-        this.parentHeight * this.canvasOverdrawFactor :
-        this.totalPanelHeight;
+    this.canvasHeight = Math.floor(
+        this.attrs.doesScroll ? this.parentHeight * this.canvasOverdrawFactor :
+                                this.totalPanelHeight);
     const ctx = assertExists(this.ctx);
     const canvas = assertExists(ctx.canvas);
     canvas.style.height = `${this.canvasHeight}px`;
@@ -176,7 +176,8 @@
 
   private repositionCanvas() {
     const canvas = assertExists(assertExists(this.ctx).canvas);
-    const canvasYStart = this.scrollTop - this.getCanvasOverdrawHeightPerSide();
+    const canvasYStart =
+        Math.floor(this.scrollTop - this.getCanvasOverdrawHeightPerSide());
     canvas.style.transform = `translateY(${canvasYStart}px)`;
   }
 
@@ -222,7 +223,7 @@
     if (!this.ctx) return;
     this.ctx.clearRect(0, 0, this.parentWidth, this.canvasHeight);
     const canvasYStart =
-        Math.ceil(this.scrollTop - this.getCanvasOverdrawHeightPerSide());
+        Math.floor(this.scrollTop - this.getCanvasOverdrawHeightPerSide());
 
     let panelYStart = 0;
     const panels = assertExists(this.attrs).panels;