Update from https://crrev.com/304715

Includes patches to sky/viewer/cc/ and ui/compositor/ for the following:

cc: Toggle LCD text at raster time instead of record time.
https://codereview.chromium.org/684543006
https://crrev.com/304623

and

Make Keyframe use TimeTicks/TimeDelta to represent time instead of double.
https://codereview.chromium.org/719453007
https://crrev.com/304612

Review URL: https://codereview.chromium.org/737943002
diff --git a/cc/resources/resource_provider.cc b/cc/resources/resource_provider.cc
index 2518972..06bb5f0 100644
--- a/cc/resources/resource_provider.cc
+++ b/cc/resources/resource_provider.cc
@@ -1112,15 +1112,15 @@
 }
 
 SkSurface* ResourceProvider::ScopedWriteLockGr::GetSkSurface(
-    bool use_distance_field_text) {
+    bool use_distance_field_text,
+    bool can_use_lcd_text) {
   DCHECK(thread_checker_.CalledOnValidThread());
   DCHECK(resource_->locked_for_write);
 
-  // If the surface doesn't exist, or doesn't have the correct dff setting,
-  // recreate the surface within the resource.
-  if (!resource_->sk_surface ||
-      use_distance_field_text !=
-          resource_->sk_surface->props().isUseDistanceFieldFonts()) {
+  bool create_surface =
+      !resource_->sk_surface.get() ||
+      !SurfaceHasMatchingProperties(use_distance_field_text, can_use_lcd_text);
+  if (create_surface) {
     class GrContext* gr_context = resource_provider_->GrContext();
     // TODO(alokp): Implement TestContextProvider::GrContext().
     if (!gr_context)
@@ -1139,15 +1139,34 @@
         skia::AdoptRef(gr_context->wrapBackendTexture(desc));
     if (!gr_texture)
       return nullptr;
-    SkSurface::TextRenderMode text_render_mode =
-        use_distance_field_text ? SkSurface::kDistanceField_TextRenderMode
-                                : SkSurface::kStandard_TextRenderMode;
+    uint32_t flags = use_distance_field_text
+                         ? SkSurfaceProps::kUseDistanceFieldFonts_Flag
+                         : 0;
+    // Use unknown pixel geometry to disable LCD text.
+    SkSurfaceProps surface_props(flags, kUnknown_SkPixelGeometry);
+    if (can_use_lcd_text) {
+      // LegacyFontHost will get LCD text and skia figures out what type to use.
+      surface_props =
+          SkSurfaceProps(flags, SkSurfaceProps::kLegacyFontHost_InitType);
+    }
     resource_->sk_surface = skia::AdoptRef(SkSurface::NewRenderTargetDirect(
-        gr_texture->asRenderTarget(), text_render_mode));
+        gr_texture->asRenderTarget(), &surface_props));
   }
   return resource_->sk_surface.get();
 }
 
+bool ResourceProvider::ScopedWriteLockGr::SurfaceHasMatchingProperties(
+    bool use_distance_field_text,
+    bool can_use_lcd_text) const {
+  const SkSurface* surface = resource_->sk_surface.get();
+  bool surface_uses_distance_field_text =
+      surface->props().isUseDistanceFieldFonts();
+  bool surface_can_use_lcd_text =
+      surface->props().pixelGeometry() != kUnknown_SkPixelGeometry;
+  return use_distance_field_text == surface_uses_distance_field_text &&
+         can_use_lcd_text == surface_can_use_lcd_text;
+}
+
 ResourceProvider::SynchronousFence::SynchronousFence(
     gpu::gles2::GLES2Interface* gl)
     : gl_(gl), has_synchronized_(true) {