Update from https://crrev.com/316786

List of manually-modified files:
gpu/command_buffer/service/in_process_command_buffer.cc
examples/sample_app/BUILD.gn
examples/sample_app/spinning_cube.cc
mojo/android/javatests/src/org/chromium/mojo/MojoTestCase.java
mojo/cc/context_provider_mojo.cc
mojo/cc/context_provider_mojo.h
mojo/common/trace_controller_impl.cc
mojo/gles2/command_buffer_client_impl.cc
mojo/gles2/command_buffer_client_impl.h
services/gles2/gpu_impl.cc
shell/android/apk/src/org/chromium/mojo/shell/MojoShellApplication.java
sky/engine/core/dom/Node.cpp
sky/shell/apk/src/org/domokit/sky/shell/SkyShellApplication.java
ui/events/latency_info.cc
ui/gfx/transform.cc
ui/gfx/transform.h
ui/gfx/transform_util.cc
ui/gfx/transform_util.h

Review URL: https://codereview.chromium.org/935333002
diff --git a/ui/gfx/transform.cc b/ui/gfx/transform.cc
index 7fe5174..c13ae1d 100644
--- a/ui/gfx/transform.cc
+++ b/ui/gfx/transform.cc
@@ -40,6 +40,12 @@
   return std::abs(x - SkDoubleToMScalar(1.0)) <= tolerance;
 }
 
+static float Round(float f) {
+  if (f == 0.f)
+    return f;
+  return (f > 0.f) ? std::floor(f + 0.5f) : std::ceil(f - 0.5f);
+}
+
 }  // namespace
 
 Transform::Transform(SkMScalar col1row1,
@@ -493,6 +499,12 @@
   return true;
 }
 
+void Transform::RoundTranslationComponents() {
+  matrix_.set(0, 3, Round(matrix_.get(0, 3)));
+  matrix_.set(1, 3, Round(matrix_.get(1, 3)));
+}
+
+
 void Transform::TransformPointInternal(const SkMatrix44& xform,
                                        Point3F* point) const {
   if (xform.isIdentity())
diff --git a/ui/gfx/transform.h b/ui/gfx/transform.h
index 8156b72..68a734e 100644
--- a/ui/gfx/transform.h
+++ b/ui/gfx/transform.h
@@ -238,6 +238,8 @@
   // DecomposedTransform.
   bool Blend(const Transform& from, double progress);
 
+  void RoundTranslationComponents();
+
   // Returns |this| * |other|.
   Transform operator*(const Transform& other) const {
     return Transform(*this, other);
diff --git a/ui/gfx/transform_util.cc b/ui/gfx/transform_util.cc
index 655ce57..e96d96e 100644
--- a/ui/gfx/transform_util.cc
+++ b/ui/gfx/transform_util.cc
@@ -498,4 +498,21 @@
       quaternion[3]);
 }
 
+float MatrixDistance(const Transform& a, const Transform& b) {
+  double sum = 0.0;
+
+  const SkMatrix44& a_data = a.matrix();
+  const SkMatrix44& b_data = b.matrix();
+
+  for (int row = 0; row < 4; ++row) {
+    for (int col = 0; col < 4; ++col) {
+      double diff = a_data.get(row, col) - b_data.get(row, col);
+      sum += diff * diff;
+    }
+  }
+
+  return static_cast<float>(std::sqrt(sum));
+}
+
+
 }  // namespace ui
diff --git a/ui/gfx/transform_util.h b/ui/gfx/transform_util.h
index a77ded2..6b091a2 100644
--- a/ui/gfx/transform_util.h
+++ b/ui/gfx/transform_util.h
@@ -58,6 +58,9 @@
                               const Transform& transform,
                               const Rect& viewport);
 
+// Computes the Frobenius norm of (a - b).
+GFX_EXPORT float MatrixDistance(const Transform& a, const Transform& b);
+
 }  // namespace gfx
 
 #endif  // UI_GFX_TRANSFORM_UTIL_H_