diff --git a/bench/BigPathBench.cpp b/bench/BigPathBench.cpp
index f39fd73..a2f3ae0 100644
--- a/bench/BigPathBench.cpp
+++ b/bench/BigPathBench.cpp
@@ -84,4 +84,3 @@
 DEF_BENCH( return new BigPathBench(kLeft_Align,     true); )
 DEF_BENCH( return new BigPathBench(kMiddle_Align,   true); )
 DEF_BENCH( return new BigPathBench(kRight_Align,    true); )
-
diff --git a/bench/BitmapRectBench.cpp b/bench/BitmapRectBench.cpp
index 7211ae2..789a725 100644
--- a/bench/BitmapRectBench.cpp
+++ b/bench/BitmapRectBench.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/bench/BlurBench.cpp b/bench/BlurBench.cpp
index 29f0dfd..58f9e89 100644
--- a/bench/BlurBench.cpp
+++ b/bench/BlurBench.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/bench/BlurImageFilterBench.cpp b/bench/BlurImageFilterBench.cpp
index f0a7a8e..2407a44 100644
--- a/bench/BlurImageFilterBench.cpp
+++ b/bench/BlurImageFilterBench.cpp
@@ -23,7 +23,7 @@
 #define BLUR_SIGMA_LARGE    10.0f
 #define BLUR_SIGMA_HUGE     80.0f
 
-  
+
 // When 'cropped' is set we apply a cropRect to the blurImageFilter. The crop rect is an inset of
 // the source's natural dimensions. This is intended to exercise blurring a larger source bitmap
 // to a smaller destination bitmap.
diff --git a/bench/BlurRectBench.cpp b/bench/BlurRectBench.cpp
index 53cf2da..774bafa 100644
--- a/bench/BlurRectBench.cpp
+++ b/bench/BlurRectBench.cpp
@@ -92,7 +92,7 @@
         SkMask mask;
         if (!SkBlurMask::BlurRect(SkBlurMask::ConvertRadiusToSigma(this->radius()),
                                   &mask, r, kNormal_SkBlurStyle)) {
-            return;    
+            return;
         }
         SkMask::FreeImage(mask.fImage);
     }
diff --git a/bench/DashBench.cpp b/bench/DashBench.cpp
index 43db54c..ba1d66a 100644
--- a/bench/DashBench.cpp
+++ b/bench/DashBench.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/bench/FSRectBench.cpp b/bench/FSRectBench.cpp
index cd9a36b..2d5abc2 100644
--- a/bench/FSRectBench.cpp
+++ b/bench/FSRectBench.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2013 Google Inc.
  *
diff --git a/bench/GMBench.cpp b/bench/GMBench.cpp
index 57f0d3c..57b2316 100644
--- a/bench/GMBench.cpp
+++ b/bench/GMBench.cpp
@@ -34,4 +34,3 @@
     SkISize size = fGM->getISize();
     return SkIPoint::Make(size.fWidth, size.fHeight);
 }
-
diff --git a/bench/GeometryBench.cpp b/bench/GeometryBench.cpp
index d93578e..50985de 100644
--- a/bench/GeometryBench.cpp
+++ b/bench/GeometryBench.cpp
@@ -97,7 +97,7 @@
 class GeoRectBench_Intersects : public GeoRectBench {
 public:
     GeoRectBench_Intersects() : GeoRectBench("rect_Intersects") {}
-    
+
 protected:
     void onDraw(int loops, SkCanvas* canvas) override {
         for (int outer = 0; outer < loops; ++outer) {
@@ -113,7 +113,7 @@
 class GeoRectBench_sort : public GeoRectBench {
 public:
     GeoRectBench_sort() : GeoRectBench("rect_sort") {}
-    
+
 protected:
     void onDraw(int loops, SkCanvas* canvas) override {
         for (int outer = 0; outer < loops; ++outer) {
@@ -243,4 +243,3 @@
     }
 };
 DEF_BENCH( return new ChopCubicAt; )
-
diff --git a/bench/GrResourceCacheBench.cpp b/bench/GrResourceCacheBench.cpp
index bc38035..890bc96 100644
--- a/bench/GrResourceCacheBench.cpp
+++ b/bench/GrResourceCacheBench.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2013 Google Inc.
  *
diff --git a/bench/GradientBench.cpp b/bench/GradientBench.cpp
index 21ebdce..1685c52 100644
--- a/bench/GradientBench.cpp
+++ b/bench/GradientBench.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/bench/MatrixBench.cpp b/bench/MatrixBench.cpp
index 5e62eac..a185fec 100644
--- a/bench/MatrixBench.cpp
+++ b/bench/MatrixBench.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
@@ -298,4 +297,3 @@
 DEF_BENCH( return new MapPointsMatrixBench("mappoints_trans", make_trans()); )
 DEF_BENCH( return new MapPointsMatrixBench("mappoints_scale", make_scale()); )
 DEF_BENCH( return new MapPointsMatrixBench("mappoints_affine", make_afine()); )
-
diff --git a/bench/MemoryBench.cpp b/bench/MemoryBench.cpp
index cd9afe4..b775793 100644
--- a/bench/MemoryBench.cpp
+++ b/bench/MemoryBench.cpp
@@ -55,4 +55,3 @@
 
 DEF_BENCH( return new ChunkAllocBench(64); )
 DEF_BENCH( return new ChunkAllocBench(8*1024); )
-
diff --git a/bench/MutexBench.cpp b/bench/MutexBench.cpp
index d1d014d..27ebee5 100644
--- a/bench/MutexBench.cpp
+++ b/bench/MutexBench.cpp
@@ -65,4 +65,3 @@
 DEF_BENCH( return new MutexBench<SkMutex>(SkString("SkMutex")); )
 DEF_BENCH( return new MutexBench<SkSpinlock>(SkString("SkSpinlock")); )
 DEF_BENCH( return new SharedBench; )
-
diff --git a/bench/PatchBench.cpp b/bench/PatchBench.cpp
index 5d7451a..80d5ce0 100644
--- a/bench/PatchBench.cpp
+++ b/bench/PatchBench.cpp
@@ -12,11 +12,11 @@
 #include "SkString.h"
 
 /**
- * This bench measures the rendering time of the call SkCanvas::drawPatch with different types of 
- * input patches (regular case, with loops, a square, with a big difference between "parallel" 
- * sides). This bench also tests the different combination of optional parameters for the function 
+ * This bench measures the rendering time of the call SkCanvas::drawPatch with different types of
+ * input patches (regular case, with loops, a square, with a big difference between "parallel"
+ * sides). This bench also tests the different combination of optional parameters for the function
  * (passing texture coordinates and colors, only textures coordinates, only colors or none).
- * Finally, it applies a scale to test if the size affects the rendering time. 
+ * Finally, it applies a scale to test if the size affects the rendering time.
  */
 
 class PatchBench : public Benchmark {
diff --git a/bench/PatchGridBench.cpp b/bench/PatchGridBench.cpp
index 83e2932..db7865b 100644
--- a/bench/PatchGridBench.cpp
+++ b/bench/PatchGridBench.cpp
@@ -13,34 +13,34 @@
 #include "SkString.h"
 
  /**
- * This bench measures the rendering time of a gridof patches. 
- * This bench also tests the different combination of optional parameters for the function 
+ * This bench measures the rendering time of a gridof patches.
+ * This bench also tests the different combination of optional parameters for the function
  * (passing texture coordinates and colors, only textures coordinates, only colors or none).
  * Finally, it also has 3 possible sizes small, medium and big to test if the size of the patches
- * in the grid affects time. 
+ * in the grid affects time.
  */
 
 class PatchGridBench : public Benchmark {
-    
+
 public:
-    
+
     enum Size {
         kSmall_Size,
         kMedium_Size,
         kBig_Size
     };
-    
+
     enum VertexMode {
         kNone_VertexMode,
         kColors_VertexMode,
         kTexCoords_VertexMode,
         kBoth_VertexMode
     };
-    
+
     PatchGridBench(Size size, VertexMode vertexMode)
     : fVertexMode(vertexMode)
     , fSize(size) { }
-    
+
     void setScale(SkCanvas* canvas){
         switch (fSize) {
             case kSmall_Size:
@@ -54,7 +54,7 @@
                 break;
         }
     }
-    
+
     void setGrid() {
         SkPoint vertices[4][5] = {
             {{50,50}, {150,50}, {250,50},{350,50},{450,50}},
@@ -62,28 +62,28 @@
             {{50,250}, {150,250}, {250,250},{350,250},{450,250}},
             {{100,300}, {150,350}, {250,350},{350,350},{450,350}}
         };
-        
+
         SkColor cornerColors[4][5] = {
             {SK_ColorBLUE, SK_ColorRED, SK_ColorBLUE, SK_ColorRED, SK_ColorBLUE},
             {SK_ColorRED, SK_ColorBLUE, SK_ColorRED, SK_ColorBLUE, SK_ColorRED},
             {SK_ColorBLUE, SK_ColorRED, SK_ColorBLUE, SK_ColorRED, SK_ColorBLUE},
             {SK_ColorRED, SK_ColorBLUE, SK_ColorRED, SK_ColorBLUE, SK_ColorRED},
         };
-        
+
         SkPoint texCoords[4][5] = {
             {{0.0f,0.0f}, {1.0f,0.0f}, {2.0f,0.0f}, {3.0f,0.0f}, {4.0f,0.0f}},
             {{0.0f,1.0f}, {1.0f,1.0f}, {2.0f,1.0f}, {3.0f,1.0f}, {4.0f,1.0f}},
             {{0.0f,2.0f}, {1.0f,2.0f}, {2.0f,2.0f}, {3.0f,2.0f}, {4.0f,2.0f}},
             {{0.0f,3.0f}, {1.0f,3.0f}, {2.0f,3.0f}, {3.0f,3.0f}, {4.0f,3.0f}},
         };
-        
+
         SkPoint hrzCtrl[4][8] = {
             {{75,30},{125,45},{175,70},{225,20},{275,50},{325,50},{375,5},{425,90}},
             {{75,150},{125,150},{175,150},{225,150},{275,150},{325,150},{375,150},{425,150}},
             {{75,250},{125,250},{175,250},{225,250},{275,200},{325,150},{375,250},{425,250}},
             {{75,350},{125,350},{175,350},{225,350},{275,350},{325,350},{375,350},{425,350}}
         };
-        
+
         SkPoint vrtCtrl[6][5] = {
             {{50,75},{150,75},{250,75},{350,75},{450,75}},
             {{50,125},{150,125},{250,125},{350,125},{450,125}},
@@ -92,43 +92,43 @@
             {{50,275},{150,275},{250,275},{350,275},{400,305}},
             {{50,325},{150,325},{250,325},{350,325},{450,325}}
         };
-        
+
         static const int kRows = 3;
         static const int kCols = 4;
-        
+
         fGrid.reset(kRows, kCols, SkPatchGrid::kColors_VertexType, nullptr);
         for (int i = 0; i < kRows; i++) {
             for (int j = 0; j < kCols; j++) {
                 SkPoint points[12];
-                
+
                 //set corners
                 points[SkPatchUtils::kTopP0_CubicCtrlPts] = vertices[i][j];
                 points[SkPatchUtils::kTopP3_CubicCtrlPts] = vertices[i][j + 1];
                 points[SkPatchUtils::kBottomP0_CubicCtrlPts] = vertices[i + 1][j];
                 points[SkPatchUtils::kBottomP3_CubicCtrlPts] = vertices[i + 1][j + 1];
-                
+
                 points[SkPatchUtils::kTopP1_CubicCtrlPts] = hrzCtrl[i][j * 2];
                 points[SkPatchUtils::kTopP2_CubicCtrlPts] = hrzCtrl[i][j * 2 + 1];
                 points[SkPatchUtils::kBottomP1_CubicCtrlPts] = hrzCtrl[i + 1][j * 2];
                 points[SkPatchUtils::kBottomP2_CubicCtrlPts] = hrzCtrl[i + 1][j * 2 + 1];
-                
+
                 points[SkPatchUtils::kLeftP1_CubicCtrlPts] = vrtCtrl[i * 2][j];
                 points[SkPatchUtils::kLeftP2_CubicCtrlPts] = vrtCtrl[i * 2 + 1][j];
                 points[SkPatchUtils::kRightP1_CubicCtrlPts] = vrtCtrl[i * 2][j + 1];
                 points[SkPatchUtils::kRightP2_CubicCtrlPts] = vrtCtrl[i * 2 + 1][j + 1];
-                
+
                 SkColor colors[4];
                 colors[0] = cornerColors[i][j];
                 colors[1] = cornerColors[i][j + 1];
                 colors[3] = cornerColors[i + 1][j];
                 colors[2] = cornerColors[i + 1][j + 1];
-                
+
                 SkPoint texs[4];
                 texs[0] = texCoords[i][j];
                 texs[1] = texCoords[i][j + 1];
                 texs[3] = texCoords[i + 1][j];
                 texs[2] = texCoords[i + 1][j + 1];
-                
+
                 switch (fVertexMode) {
                     case kNone_VertexMode:
                         fGrid.setPatch(j, i, points, nullptr, nullptr);
@@ -148,7 +148,7 @@
             }
         }
     }
-    
+
     // override this method to change the shader
     sk_sp<SkShader> createShader() {
         const SkColor colors[] = {
@@ -156,7 +156,7 @@
             SK_ColorMAGENTA, SK_ColorBLUE, SK_ColorYELLOW,
         };
         const SkPoint pts[] = { { 200.f / 4.f, 0.f }, { 3.f * 200.f / 4, 200.f } };
-        
+
         return SkGradientShader::MakeLinear(pts, colors, nullptr, SK_ARRAY_COUNT(colors),
                                             SkShader::kMirror_TileMode);
     }
@@ -180,7 +180,7 @@
             default:
                 break;
         }
-        
+
         SkString size;
         switch (fSize) {
             case kSmall_Size:
@@ -198,7 +198,7 @@
         fName.printf("patch_grid_%s_%s", vertexMode.c_str(), size.c_str());
         return fName.c_str();
     }
-    
+
     void onDelayedSetup() override {
         this->setGrid();
         switch (fVertexMode) {
@@ -225,7 +225,7 @@
     SkPatchGrid fGrid;
     VertexMode  fVertexMode;
     Size        fSize;
-    
+
     typedef Benchmark INHERITED;
 };
 
diff --git a/bench/PathIterBench.cpp b/bench/PathIterBench.cpp
index 5a8727f..cf93b5d 100644
--- a/bench/PathIterBench.cpp
+++ b/bench/PathIterBench.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/bench/ReadPixBench.cpp b/bench/ReadPixBench.cpp
index 7df5260..b1061a1 100644
--- a/bench/ReadPixBench.cpp
+++ b/bench/ReadPixBench.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2012 The Android Open Source Project
  *
diff --git a/bench/RectBench.cpp b/bench/RectBench.cpp
index 5bd5640..edd5ac7 100644
--- a/bench/RectBench.cpp
+++ b/bench/RectBench.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/bench/RectanizerBench.cpp b/bench/RectanizerBench.cpp
index 9b7e3ae..5bc6f11 100644
--- a/bench/RectanizerBench.cpp
+++ b/bench/RectanizerBench.cpp
@@ -41,7 +41,7 @@
         kSmallPow2_RectType
     };
 
-    RectanizerBench(RectanizerType rectanizerType, RectType rectType) 
+    RectanizerBench(RectanizerType rectanizerType, RectType rectType)
         : fName("rectanizer_")
         , fRectanizerType(rectanizerType)
         , fRectType(rectType) {
diff --git a/bench/RegionBench.cpp b/bench/RegionBench.cpp
index 8554569..f73a888 100644
--- a/bench/RegionBench.cpp
+++ b/bench/RegionBench.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/bench/RepeatTileBench.cpp b/bench/RepeatTileBench.cpp
index 452c2c0..33e9178 100644
--- a/bench/RepeatTileBench.cpp
+++ b/bench/RepeatTileBench.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/bench/RotatedRectBench.cpp b/bench/RotatedRectBench.cpp
index 5ae0b1b..23e0443 100644
--- a/bench/RotatedRectBench.cpp
+++ b/bench/RotatedRectBench.cpp
@@ -13,7 +13,7 @@
 
 /** This benchmark tests rendering rotated rectangles. It can optionally apply AA and/or change the
     paint color between each rect in different ways using the ColorType enum. The xfermode used can
-    be specified as well. 
+    be specified as well.
   */
 
 enum ColorType {
diff --git a/bench/ScalarBench.cpp b/bench/ScalarBench.cpp
index 0048c6e..9d3b0ec 100644
--- a/bench/ScalarBench.cpp
+++ b/bench/ScalarBench.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/bench/ShapesBench.cpp b/bench/ShapesBench.cpp
index 2266cc3..a658c45 100644
--- a/bench/ShapesBench.cpp
+++ b/bench/ShapesBench.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2016 Google Inc.
  *
diff --git a/bench/SkLinearBitmapPipelineBench.cpp b/bench/SkLinearBitmapPipelineBench.cpp
index 7ab29f6..f111aee 100644
--- a/bench/SkLinearBitmapPipelineBench.cpp
+++ b/bench/SkLinearBitmapPipelineBench.cpp
@@ -342,5 +342,3 @@
 DEF_BENCH(return new SkBitmapFPOrigShader(
     srcSize, kLinear_SkColorProfileType, mR, true,
     SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode);)
-
-
diff --git a/bench/TextBench.cpp b/bench/TextBench.cpp
index f2d7bd3..04f824c 100644
--- a/bench/TextBench.cpp
+++ b/bench/TextBench.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/bench/TextBlobBench.cpp b/bench/TextBlobBench.cpp
index 6d5a88f..a350e7b 100644
--- a/bench/TextBlobBench.cpp
+++ b/bench/TextBlobBench.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2015 Google Inc.
  *
diff --git a/bench/TileBench.cpp b/bench/TileBench.cpp
index 47e79c7..3093016 100644
--- a/bench/TileBench.cpp
+++ b/bench/TileBench.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2013 Google Inc.
  *
diff --git a/bench/TopoSortBench.cpp b/bench/TopoSortBench.cpp
index 3fa1c0f..8a8ec66 100644
--- a/bench/TopoSortBench.cpp
+++ b/bench/TopoSortBench.cpp
@@ -76,4 +76,3 @@
 ///////////////////////////////////////////////////////////////////////////////
 
 DEF_BENCH( return new TopoSortBench(); )
-
diff --git a/bench/WriterBench.cpp b/bench/WriterBench.cpp
index 115ffc1..78c5d8b 100644
--- a/bench/WriterBench.cpp
+++ b/bench/WriterBench.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2012 The Android Open Source Project
  *
diff --git a/bench/Xfer4fBench.cpp b/bench/Xfer4fBench.cpp
index bc234a7..ab04476 100644
--- a/bench/Xfer4fBench.cpp
+++ b/bench/Xfer4fBench.cpp
@@ -22,7 +22,7 @@
         , fFlags(flags & ~USE_AA)
     {
         fXfer.reset(SkXfermode::Create(mode));
-        
+
         fProc1 = SkXfermode::GetD32Proc(fXfer, fFlags | SkXfermode::kSrcIsSingle_D32Flag);
         fProcN = SkXfermode::GetD32Proc(fXfer, fFlags);
         fName.printf("xfer4f_%s_%s_%c_%s_%s",
@@ -37,7 +37,7 @@
             fDst[i] = 0;
             fAAStorage[i] = i * 255 / (N - 1);
         }
-        
+
         if (flags & USE_AA) {
             fAA = fAAStorage;
         } else {
diff --git a/bench/XferU64Bench.cpp b/bench/XferU64Bench.cpp
index a57ba60..90aa328 100644
--- a/bench/XferU64Bench.cpp
+++ b/bench/XferU64Bench.cpp
@@ -37,7 +37,7 @@
             fDst[i] = 0;
             fAAStorage[i] = i * 255 / (N - 1);
         }
-        
+
         if (flags & USE_AA) {
             fAA = fAAStorage;
         } else {
diff --git a/bench/XfermodeBench.cpp b/bench/XfermodeBench.cpp
index f407c59..9eae7ce 100644
--- a/bench/XfermodeBench.cpp
+++ b/bench/XfermodeBench.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2013 Google Inc.
  *
diff --git a/bench/nanobenchAndroid.cpp b/bench/nanobenchAndroid.cpp
index 7a166d4..cb6f09d 100644
--- a/bench/nanobenchAndroid.cpp
+++ b/bench/nanobenchAndroid.cpp
@@ -49,5 +49,3 @@
 bool HWUITarget::capturePixels(SkBitmap* bmp) {
     return this->renderer.capturePixels(bmp);
 }
-
-
diff --git a/gm/aaclip.cpp b/gm/aaclip.cpp
index fae6109..1cb7157 100644
--- a/gm/aaclip.cpp
+++ b/gm/aaclip.cpp
@@ -206,7 +206,7 @@
     ClipCubicGM() {
         fVPath.moveTo(W, 0);
         fVPath.cubicTo(W, H-10, 0, 10, 0, H);
-    
+
         SkMatrix pivot;
         pivot.setRotate(90, W/2, H/2);
         fVPath.transform(pivot, &fHPath);
@@ -216,7 +216,7 @@
     SkString onShortName() override {
         return SkString("clipcubic");
     }
-    
+
     SkISize onISize() override {
         return SkISize::Make(400, 410);
     }
@@ -224,10 +224,10 @@
     void doDraw(SkCanvas* canvas, const SkPath& path) {
         SkPaint paint;
         paint.setAntiAlias(true);
-        
+
         paint.setColor(sk_tool_utils::color_to_565(0xFFCCCCCC));
         canvas->drawPath(path, paint);
-        
+
         paint.setColor(SK_ColorRED);
         paint.setStyle(SkPaint::kStroke_Style);
         canvas->drawPath(path, paint);
@@ -242,7 +242,7 @@
 
         canvas->drawRect(r, paint);
         this->doDraw(canvas, path);
-        
+
         canvas->translate(dx, dy);
 
         canvas->drawRect(r, paint);
@@ -256,7 +256,7 @@
         canvas->translate(0, 200);
         this->drawAndClip(canvas, fHPath, 200, 0);
     }
-    
+
 private:
     typedef skiagm::GM INHERITED;
 };
diff --git a/gm/aaxfermodes.cpp b/gm/aaxfermodes.cpp
index 14073df..f1264db 100644
--- a/gm/aaxfermodes.cpp
+++ b/gm/aaxfermodes.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2015 Google Inc.
  *
@@ -113,8 +112,8 @@
                         kLabelSpacing + kShapeTypeSpacing * 1.5f + kShapeSpacing / 2,
                         kSubtitleSpacing / 2 + fLabelPaint.getTextSize() / 3, fLabelPaint);
                 canvas->drawText("Src Opaque", sizeof("Src Opaque") - 1,
-                        kLabelSpacing + kShapeTypeSpacing * 1.5f + kShapeSpacing / 2 + 
-                        kPaintSpacing, kSubtitleSpacing / 2 + fLabelPaint.getTextSize() / 3, 
+                        kLabelSpacing + kShapeTypeSpacing * 1.5f + kShapeSpacing / 2 +
+                        kPaintSpacing, kSubtitleSpacing / 2 + fLabelPaint.getTextSize() / 3,
                         fLabelPaint);
             }
 
diff --git a/gm/addarc.cpp b/gm/addarc.cpp
index 0d1ea93..9280140 100644
--- a/gm/addarc.cpp
+++ b/gm/addarc.cpp
@@ -120,12 +120,12 @@
 class StrokeCircleGM : public skiagm::GM {
 public:
     StrokeCircleGM() : fRotate(0) {}
-    
+
 protected:
     SkString onShortName() override { return SkString("strokecircle"); }
-    
+
     SkISize onISize() override { return SkISize::Make(520, 520); }
-    
+
     void onDraw(SkCanvas* canvas) override {
         canvas->scale(20, 20);
         canvas->translate(13, 13);
@@ -176,12 +176,12 @@
 class ManyArcsGM : public skiagm::GM {
 public:
     ManyArcsGM() {}
-    
+
 protected:
     SkString onShortName() override { return SkString("manyarcs"); }
-    
+
     SkISize onISize() override { return SkISize::Make(620, 330); }
-    
+
     void onDraw(SkCanvas* canvas) override {
         SkPaint paint;
         paint.setAntiAlias(true);
@@ -197,12 +197,12 @@
         for (size_t i = 0; i < SK_ARRAY_COUNT(sweepAngles); ++i) {
             sweepAngles[i] *= 180;
         }
-        
+
         SkScalar startAngles[] = { -1, -0.5f, 0, 0.5f };
         for (size_t i = 0; i < SK_ARRAY_COUNT(startAngles); ++i) {
             startAngles[i] *= 180;
         }
-        
+
         bool anticlockwise = false;
         SkScalar sign = 1;
         for (size_t i = 0; i < SK_ARRAY_COUNT(startAngles) * 2; ++i) {
@@ -225,9 +225,8 @@
             canvas->translate(0, 40);
         }
     }
-    
+
 private:
     typedef skiagm::GM INHERITED;
 };
 DEF_GM( return new ManyArcsGM; )
-
diff --git a/gm/anisotropic.cpp b/gm/anisotropic.cpp
index 6610926..3e573c4 100644
--- a/gm/anisotropic.cpp
+++ b/gm/anisotropic.cpp
@@ -60,7 +60,7 @@
 
     void onDraw(SkCanvas* canvas) override {
         SkScalar gScales[] = { 0.9f, 0.8f, 0.75f, 0.6f, 0.5f, 0.4f, 0.25f, 0.2f, 0.1f };
-        
+
         SkASSERT(kNumVertImages-1 == (int)SK_ARRAY_COUNT(gScales)/2);
 
         // Minimize vertically
diff --git a/gm/beziereffects.cpp b/gm/beziereffects.cpp
index 5d26be8..f609ba8 100644
--- a/gm/beziereffects.cpp
+++ b/gm/beziereffects.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2013 Google Inc.
  *
diff --git a/gm/bigrrectaaeffect.cpp b/gm/bigrrectaaeffect.cpp
index 3a7a155..f24d072 100644
--- a/gm/bigrrectaaeffect.cpp
+++ b/gm/bigrrectaaeffect.cpp
@@ -74,7 +74,7 @@
         for (size_t et = 0; et < SK_ARRAY_COUNT(kEdgeTypes); ++et) {
             GrPrimitiveEdgeType edgeType = kEdgeTypes[et];
             canvas->save();
-                canvas->translate(SkIntToScalar(x), SkIntToScalar(y));                
+                canvas->translate(SkIntToScalar(x), SkIntToScalar(y));
 
                 // Draw a background for the test case
                 SkPaint paint;
diff --git a/gm/bitmapcopy.cpp b/gm/bitmapcopy.cpp
index ac43db5..b52337b 100644
--- a/gm/bitmapcopy.cpp
+++ b/gm/bitmapcopy.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
@@ -78,7 +77,7 @@
         canvas->clear(sk_tool_utils::color_to_565(0xFFDDDDDD));
         paint.setAntiAlias(true);
         sk_tool_utils::set_portable_typeface(&paint);
-        
+
         SkScalar width = SkIntToScalar(40);
         SkScalar height = SkIntToScalar(40);
         if (paint.getFontSpacing() > height) {
diff --git a/gm/bitmapfilters.cpp b/gm/bitmapfilters.cpp
index b727328..2cded98 100644
--- a/gm/bitmapfilters.cpp
+++ b/gm/bitmapfilters.cpp
@@ -131,19 +131,19 @@
 
         fBitmap.extractAlpha(&fAlpha);
     }
-    
+
 public:
     SkBitmap fBitmap, fAlpha;
-    
+
 protected:
     SkString onShortName() override {
         return SkString("extractalpha");
     }
-    
+
     SkISize onISize() override {
         return SkISize::Make(540, 330);
     }
-    
+
     void onDraw(SkCanvas* canvas) override {
         SkPaint paint;
         paint.setAntiAlias(true);
@@ -153,9 +153,8 @@
         canvas->drawBitmap(fBitmap, 10, 10, &paint);    // should stay blue (ignore paint's color)
         canvas->drawBitmap(fAlpha, 120, 10, &paint);    // should draw red
     }
-    
+
 private:
     typedef skiagm::GM INHERITED;
 };
 DEF_GM( return new TestExtractAlphaGM; )
-
diff --git a/gm/bitmaprect.cpp b/gm/bitmaprect.cpp
index bf06adb..4853d03 100644
--- a/gm/bitmaprect.cpp
+++ b/gm/bitmaprect.cpp
@@ -281,4 +281,3 @@
 DEF_GM( return new DrawBitmapRect4(false); )
 DEF_GM( return new DrawBitmapRect4(true); )
 #endif
-
diff --git a/gm/bitmapshader.cpp b/gm/bitmapshader.cpp
index 491905a..84d0b55 100644
--- a/gm/bitmapshader.cpp
+++ b/gm/bitmapshader.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2013 Google Inc.
  *
diff --git a/gm/bleed.cpp b/gm/bleed.cpp
index c3d026a..bd1a282 100644
--- a/gm/bleed.cpp
+++ b/gm/bleed.cpp
@@ -156,7 +156,7 @@
 
 /** Similar to make_ringed_bitmap with these modifications:
         - The backing store is a texture.
-        - The texture is larger than the bitmap dimensions (it is surrounded by non-content 
+        - The texture is larger than the bitmap dimensions (it is surrounded by non-content
           padding on the right/bottom of the contents.)
         - The right/bottom sides of the rings are omitted so that the rect to draw is adjacent to
           the texture padding.
diff --git a/gm/bmpfilterqualityrepeat.cpp b/gm/bmpfilterqualityrepeat.cpp
index b32a99a..6264d74 100644
--- a/gm/bmpfilterqualityrepeat.cpp
+++ b/gm/bmpfilterqualityrepeat.cpp
@@ -39,7 +39,7 @@
 
     void onDraw(SkCanvas* canvas) override {
 
-        static const struct { 
+        static const struct {
             SkFilterQuality fQuality;
             const char* fName;
         } kQualities[] = {
diff --git a/gm/circles.cpp b/gm/circles.cpp
index d9b25c0..dd37a61 100644
--- a/gm/circles.cpp
+++ b/gm/circles.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2012 Intel Inc.
  *
@@ -155,7 +154,7 @@
         giantPaint.setAntiAlias(true);
         giantPaint.setColor(0x80808080);
         canvas->drawCircle(giantCenter.fX, giantCenter.fY, giantRadius, giantPaint);
-        
+
         SkRandom rand;
         canvas->translate(20 * SK_Scalar1, 20 * SK_Scalar1);
         int i;
diff --git a/gm/circularclips.cpp b/gm/circularclips.cpp
index 15f583f..2691971 100644
--- a/gm/circularclips.cpp
+++ b/gm/circularclips.cpp
@@ -60,7 +60,7 @@
         canvas->drawRect(rect, fillPaint);
 
         canvas->restore();
-      
+
         fillPaint.setColor(0xFF000000);
 
         for (size_t i = 0; i < 4; i++) {
diff --git a/gm/color4f.cpp b/gm/color4f.cpp
index 7704dee..2585ad8 100644
--- a/gm/color4f.cpp
+++ b/gm/color4f.cpp
@@ -53,7 +53,7 @@
     const SkRect r = SkRect::MakeWH(50, 100);
     sk_sp<SkShader> (*shaders[])() { make_opaque_color, make_alpha_color };
     sk_sp<SkColorFilter> (*filters[])() { make_cf_null, make_cf0, make_cf1, make_cf2 };
-    
+
     SkPaint paint;
     for (auto shProc : shaders) {
         paint.setShader(shProc());
diff --git a/gm/colormatrix.cpp b/gm/colormatrix.cpp
index 8ac15db..202f72a 100644
--- a/gm/colormatrix.cpp
+++ b/gm/colormatrix.cpp
@@ -35,7 +35,7 @@
     SkISize onISize() override {
         return SkISize::Make(WIDTH, HEIGHT);
     }
-    
+
     void onOnceBeforeDraw() override {
         fSolidImg = CreateSolidBitmap(64, 64);
         fTransparentImg = CreateTransparentBitmap(64, 64);
@@ -145,4 +145,3 @@
     typedef skiagm::GM INHERITED;
 };
 DEF_GM( return new ColorMatrixGM; )
-
diff --git a/gm/complexclip.cpp b/gm/complexclip.cpp
index bcbd7fd..7708efe 100644
--- a/gm/complexclip.cpp
+++ b/gm/complexclip.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/gm/complexclip3.cpp b/gm/complexclip3.cpp
index ae07d8e..67916ca 100644
--- a/gm/complexclip3.cpp
+++ b/gm/complexclip3.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2014 Google Inc.
  *
@@ -26,7 +25,7 @@
         SkString str;
         str.printf("complexclip3_%s", fDoSimpleClipFirst ? "simple" : "complex");
         return str;
-    }    
+    }
 
     SkISize onISize() { return SkISize::Make(1000, 950); }
 
diff --git a/gm/composeshader.cpp b/gm/composeshader.cpp
index c43b443..421641c 100644
--- a/gm/composeshader.cpp
+++ b/gm/composeshader.cpp
@@ -204,7 +204,7 @@
             canvas->translate(0, r.height() + 5);
         }
     }
-    
+
 private:
     /** This determines the length and width of the bitmaps used in the ComposeShaders.  Values
      *  above 20 may cause an SkASSERT to fail in SkSmallAllocator. However, larger values will
diff --git a/gm/conicpaths.cpp b/gm/conicpaths.cpp
index 91c337f..9e4e9ce 100644
--- a/gm/conicpaths.cpp
+++ b/gm/conicpaths.cpp
@@ -120,7 +120,7 @@
         }
         canvas->restore();
 
-        this->drawGiantCircle(canvas);  
+        this->drawGiantCircle(canvas);
     }
 
 private:
diff --git a/gm/convex_all_line_paths.cpp b/gm/convex_all_line_paths.cpp
index 3eae959..eb4bdcf 100644
--- a/gm/convex_all_line_paths.cpp
+++ b/gm/convex_all_line_paths.cpp
@@ -28,7 +28,7 @@
 // paths
 class ConvexLineOnlyPathsGM : public GM {
 public:
-    ConvexLineOnlyPathsGM() { 
+    ConvexLineOnlyPathsGM() {
         this->setBGColor(0xFFFFFFFF);
     }
 
@@ -284,7 +284,7 @@
 
     void onDraw(SkCanvas* canvas) override {
         // the right edge of the last drawn path
-        SkPoint offset = { 0, SkScalarHalf(kMaxPathHeight) }; 
+        SkPoint offset = { 0, SkScalarHalf(kMaxPathHeight) };
 
         for (int i = 0; i < kNumPaths; ++i) {
             this->drawPath(canvas, i, &offset);
diff --git a/gm/convexpaths.cpp b/gm/convexpaths.cpp
index 4180884..50939f9 100644
--- a/gm/convexpaths.cpp
+++ b/gm/convexpaths.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/gm/convexpolyclip.cpp b/gm/convexpolyclip.cpp
index ff83a26..0c8e291 100644
--- a/gm/convexpolyclip.cpp
+++ b/gm/convexpolyclip.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2014 Google Inc.
  *
diff --git a/gm/convexpolyeffect.cpp b/gm/convexpolyeffect.cpp
index 412e478..aec571b 100644
--- a/gm/convexpolyeffect.cpp
+++ b/gm/convexpolyeffect.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2014 Google Inc.
  *
diff --git a/gm/dashing.cpp b/gm/dashing.cpp
index 6cb1dea..95fc15a 100644
--- a/gm/dashing.cpp
+++ b/gm/dashing.cpp
@@ -12,7 +12,7 @@
 
 static void drawline(SkCanvas* canvas, int on, int off, const SkPaint& paint,
                      SkScalar finalX = SkIntToScalar(600), SkScalar finalY = SkIntToScalar(0),
-                     SkScalar phase = SkIntToScalar(0), 
+                     SkScalar phase = SkIntToScalar(0),
                      SkScalar startX = SkIntToScalar(0), SkScalar startY = SkIntToScalar(0)) {
     SkPaint p(paint);
 
@@ -453,8 +453,8 @@
             paint.setStrokeWidth(SkIntToScalar(phase+1));
             paint.setColor(gColors[phase]);
             sign = (x % 20) ? 1 : -1;
-            drawline(canvas, kOn, kOff, paint, 
-                     SkIntToScalar(x), -sign * SkIntToScalar(10003), 
+            drawline(canvas, kOn, kOff, paint,
+                     SkIntToScalar(x), -sign * SkIntToScalar(10003),
                      SkIntToScalar(phase),
                      SkIntToScalar(x),  sign * SkIntToScalar(10003));
             phase = (phase + 1) % kIntervalLength;
@@ -464,8 +464,8 @@
             paint.setStrokeWidth(SkIntToScalar(phase+1));
             paint.setColor(gColors[phase]);
             sign = (y % 20) ? 1 : -1;
-            drawline(canvas, kOn, kOff, paint, 
-                     -sign * SkIntToScalar(10003), SkIntToScalar(y), 
+            drawline(canvas, kOn, kOff, paint,
+                     -sign * SkIntToScalar(10003), SkIntToScalar(y),
                      SkIntToScalar(phase),
                       sign * SkIntToScalar(10003), SkIntToScalar(y));
             phase = (phase + 1) % kIntervalLength;
diff --git a/gm/dcshader.cpp b/gm/dcshader.cpp
index ed2b058..487f767 100644
--- a/gm/dcshader.cpp
+++ b/gm/dcshader.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2014 Google Inc.
  *
diff --git a/gm/distantclip.cpp b/gm/distantclip.cpp
index fd96564..9276dad 100644
--- a/gm/distantclip.cpp
+++ b/gm/distantclip.cpp
@@ -1,5 +1,4 @@
 
-
 /*
  * Copyright 2012 Google Inc.
  *
@@ -46,8 +45,8 @@
         sk_sp<SkPicture> pict(recorder.finishRecordingAsPicture());
 
         // Next we play that picture into another picture of the same size.
-        pict->playback(recorder.beginRecording(pict->cullRect().width(), 
-                                               pict->cullRect().height(), 
+        pict->playback(recorder.beginRecording(pict->cullRect().width(),
+                                               pict->cullRect().height(),
                                                nullptr, 0));
         sk_sp<SkPicture> pict2(recorder.finishRecordingAsPicture());
 
diff --git a/gm/drawatlas.cpp b/gm/drawatlas.cpp
index 334aba7..a906cbe 100644
--- a/gm/drawatlas.cpp
+++ b/gm/drawatlas.cpp
@@ -39,17 +39,17 @@
 
 public:
     DrawAtlasGM() {}
-    
+
 protected:
-    
+
     SkString onShortName() override {
         return SkString("draw-atlas");
     }
-    
+
     SkISize onISize() override {
         return SkISize::Make(640, 480);
     }
-    
+
     void onDraw(SkCanvas* canvas) override {
         const SkRect target = { 50, 50, 80, 90 };
         if (nullptr == fAtlas) {
@@ -61,7 +61,7 @@
             SkScalar fDegrees;
             SkScalar fTx;
             SkScalar fTy;
-            
+
             void apply(SkRSXform* xform) const {
                 const SkScalar rad = SkDegreesToRadians(fDegrees);
                 xform->fSCos = fScale * SkScalarCos(rad);
@@ -95,9 +95,8 @@
         canvas->translate(0, 100);
         canvas->drawAtlas(fAtlas.get(), xform, tex, colors, N, SkXfermode::kSrcIn_Mode, nullptr, &paint);
     }
-    
+
 private:
     typedef GM INHERITED;
 };
 DEF_GM( return new DrawAtlasGM; )
-
diff --git a/gm/drawatlascolor.cpp b/gm/drawatlascolor.cpp
index e8fd236..0e85055 100644
--- a/gm/drawatlascolor.cpp
+++ b/gm/drawatlascolor.cpp
@@ -29,22 +29,22 @@
     paint.setXfermode(SkXfermode::Create(SkXfermode::kSrc_Mode));
 
     paint.setColor(SK_ColorWHITE);
-    SkRect r = SkRect::MakeXYWH(0, 0, 
+    SkRect r = SkRect::MakeXYWH(0, 0,
                                 SkIntToScalar(kBlockSize), SkIntToScalar(kBlockSize));
     canvas->drawRect(r, paint);
 
     paint.setColor(SK_ColorRED);
-    r = SkRect::MakeXYWH(SkIntToScalar(kBlockSize), 0, 
+    r = SkRect::MakeXYWH(SkIntToScalar(kBlockSize), 0,
                          SkIntToScalar(kBlockSize), SkIntToScalar(kBlockSize));
     canvas->drawRect(r, paint);
 
     paint.setColor(SK_ColorGREEN);
-    r = SkRect::MakeXYWH(0, SkIntToScalar(kBlockSize), 
+    r = SkRect::MakeXYWH(0, SkIntToScalar(kBlockSize),
                          SkIntToScalar(kBlockSize), SkIntToScalar(kBlockSize));
     canvas->drawRect(r, paint);
 
     paint.setColor(SK_ColorTRANSPARENT);
-    r = SkRect::MakeXYWH(SkIntToScalar(kBlockSize), SkIntToScalar(kBlockSize), 
+    r = SkRect::MakeXYWH(SkIntToScalar(kBlockSize), SkIntToScalar(kBlockSize),
                          SkIntToScalar(kBlockSize), SkIntToScalar(kBlockSize));
     canvas->drawRect(r, paint);
 
@@ -58,17 +58,17 @@
     DrawAtlasColorsGM() {
         this->setBGColor(sk_tool_utils::color_to_565(0xFFCCCCCC));
     }
-    
+
 protected:
     SkString onShortName() override {
         return SkString("draw-atlas-colors");
     }
-    
+
     SkISize onISize() override {
         return SkISize::Make(kNumXferModes * (kAtlasSize + kPad) + kPad,
                              2 * kNumColors * (kAtlasSize + kPad) + kTextPad + kPad);
     }
-    
+
     void onDraw(SkCanvas* canvas) override {
         const SkRect target = SkRect::MakeWH(SkIntToScalar(kAtlasSize), SkIntToScalar(kAtlasSize));
 
@@ -147,7 +147,7 @@
         }
 
         for (int i = 0; i < numModes; ++i) {
-            canvas->save();            
+            canvas->save();
             canvas->translate(SkIntToScalar(i*(target.height()+kPad)),
                               SkIntToScalar(kTextPad+kPad));
             // w/o a paint
@@ -157,10 +157,10 @@
             // w a paint
             canvas->drawAtlas(fAtlas.get(), xforms, rects, quadColors, numColors,
                               gModes[i].fMode, nullptr, &paint);
-            canvas->restore();        
+            canvas->restore();
         }
     }
-    
+
 private:
     static const int kNumXferModes = 29;
     static const int kNumColors = 4;
@@ -174,4 +174,3 @@
     typedef GM INHERITED;
 };
 DEF_GM( return new DrawAtlasColorsGM; )
-
diff --git a/gm/drawbitmaprect.cpp b/gm/drawbitmaprect.cpp
index 883e81b..7d83047 100644
--- a/gm/drawbitmaprect.cpp
+++ b/gm/drawbitmaprect.cpp
@@ -35,7 +35,7 @@
 
 static sk_sp<SkImage> makebm(SkCanvas* origCanvas, SkBitmap* resultBM, int w, int h) {
     SkImageInfo info = SkImageInfo::MakeN32Premul(w, h);
-    
+
     auto surface(origCanvas->makeSurface(info));
     if (nullptr == surface) {
         // picture canvas will return null, so fall-back to raster
@@ -88,7 +88,7 @@
 #if SK_SUPPORT_GPU
     if (GrTexture* texture = as_IB(image)->peekTexture()) {
         GrWrapTextureInBitmap(texture, image->width(), image->height(), image->isOpaque(), &tempBM);
-    } else 
+    } else
 #endif
     {
         image->asLegacyBitmap(&tempBM, SkImage::kRO_LegacyBitmapMode);
diff --git a/gm/drawminibitmaprect.cpp b/gm/drawminibitmaprect.cpp
index f5164f7..073d5a1 100644
--- a/gm/drawminibitmaprect.cpp
+++ b/gm/drawminibitmaprect.cpp
@@ -140,4 +140,3 @@
 
 DEF_GM( return new DrawMiniBitmapRectGM(true); )
 DEF_GM( return new DrawMiniBitmapRectGM(false); )
-
diff --git a/gm/dstreadshuffle.cpp b/gm/dstreadshuffle.cpp
index 8ff40a8..4f0f071 100644
--- a/gm/dstreadshuffle.cpp
+++ b/gm/dstreadshuffle.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2013 Google Inc.
  *
diff --git a/gm/emptypath.cpp b/gm/emptypath.cpp
index 5afb3d5..aadb94d 100644
--- a/gm/emptypath.cpp
+++ b/gm/emptypath.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
@@ -201,7 +200,7 @@
             canvas->translate(0, 40);
         }
     }
-    
+
 private:
     typedef GM INHERITED;
 };
diff --git a/gm/filterfastbounds.cpp b/gm/filterfastbounds.cpp
index 9e84024..bcecff9 100644
--- a/gm/filterfastbounds.cpp
+++ b/gm/filterfastbounds.cpp
@@ -298,14 +298,14 @@
         for (int i = 0; i < (int)SK_ARRAY_COUNT(gDrawMthds) + kNumXtraCols; ++i) {
             canvas->drawLine(SkIntToScalar(i * kTileWidth),
                              0,
-                             SkIntToScalar(i * kTileWidth), 
+                             SkIntToScalar(i * kTileWidth),
                              SkIntToScalar(paints.count() * kTileWidth),
                              blackFill);
         }
 
         // A column of saveLayers with PictureImageFilters
         for (int i = 0; i < pifPaints.count(); ++i) {
-            draw_savelayer_with_paint(SkIPoint::Make(0, i*kTileHeight), 
+            draw_savelayer_with_paint(SkIPoint::Make(0, i*kTileHeight),
                                       canvas, pifPaints[i]);
         }
 
diff --git a/gm/fontmgr.cpp b/gm/fontmgr.cpp
index 67be00d..dd8b14d 100644
--- a/gm/fontmgr.cpp
+++ b/gm/fontmgr.cpp
@@ -262,7 +262,7 @@
         paint.setTextSkewX(fSkewX);
 
         const SkColor boundsColors[2] = { SK_ColorRED, SK_ColorBLUE };
-        
+
         SkFontMgr* fm = fFM;
         int count = SkMin32(fm->countFamilies(), 32);
 
diff --git a/gm/gammatext.cpp b/gm/gammatext.cpp
index e978b6b..bc5feb3 100644
--- a/gm/gammatext.cpp
+++ b/gm/gammatext.cpp
@@ -115,7 +115,7 @@
 static void draw_pair(SkCanvas* canvas, SkPaint* paint, const sk_sp<SkShader>& shader) {
     const char text[] = "Now is the time for all good";
     const size_t len = strlen(text);
-    
+
     paint->setShader(nullptr);
     canvas->drawText(text, len, 10, 20, *paint);
     paint->setShader(SkShader::MakeColorShader(paint->getColor()));
@@ -140,7 +140,7 @@
     SkString onShortName() override {
         return SkString("gammagradienttext");
     }
-    
+
     SkISize onISize() override {
         return SkISize::Make(300, 300);
     }
@@ -164,10 +164,9 @@
             canvas->translate(0, 80);
         }
     }
-    
+
 private:
     typedef skiagm::GM INHERITED;
 };
 
 DEF_GM( return new GammaShaderTextGM; )
-
diff --git a/gm/gm.cpp b/gm/gm.cpp
index ebdc4f1..e0cb8b8 100644
--- a/gm/gm.cpp
+++ b/gm/gm.cpp
@@ -107,4 +107,3 @@
 SkString skiagm::SimpleGM::onShortName() {
     return fName;
 }
-
diff --git a/gm/gradientDirtyLaundry.cpp b/gm/gradientDirtyLaundry.cpp
index 3fca7f2..6b16be9 100644
--- a/gm/gradientDirtyLaundry.cpp
+++ b/gm/gradientDirtyLaundry.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2013 Google Inc.
  *
diff --git a/gm/gradients.cpp b/gm/gradients.cpp
index 29d0f31..11c27ba 100644
--- a/gm/gradients.cpp
+++ b/gm/gradients.cpp
@@ -510,7 +510,7 @@
         paint.setDither(fDither);
         canvas->drawRect(SkRect::MakeWH(500, 500), paint);
     }
-    
+
 private:
     sk_sp<SkShader> fShader;
     bool fDither;
@@ -548,7 +548,7 @@
         paint.setShader(fShader);
         canvas->drawRect(SkRect::MakeWH(500, 500), paint);
     }
-    
+
 private:
     sk_sp<SkShader> fShader;
     bool fDither;
@@ -600,7 +600,7 @@
                     (index + 1) * kHeight), paint);
         }
     }
-    
+
 private:
     sk_sp<SkShader> fShader[100];
     bool fDither;
diff --git a/gm/image.cpp b/gm/image.cpp
index c86be07..5333b17 100644
--- a/gm/image.cpp
+++ b/gm/image.cpp
@@ -291,7 +291,7 @@
             canvas->translate(0, 120);
         }
     }
-    
+
 private:
     typedef skiagm::GM INHERITED;
 };
diff --git a/gm/image_pict.cpp b/gm/image_pict.cpp
index 3209221..fd7ac2a 100644
--- a/gm/image_pict.cpp
+++ b/gm/image_pict.cpp
@@ -373,6 +373,3 @@
 #if SK_SUPPORT_GPU
     DEF_GM( return new ImageCacheratorGM("texture", make_tex_generator); )
 #endif
-
-
-
diff --git a/gm/image_shader.cpp b/gm/image_shader.cpp
index 5fed7d1..214b05d 100644
--- a/gm/image_shader.cpp
+++ b/gm/image_shader.cpp
@@ -124,4 +124,3 @@
     typedef skiagm::GM INHERITED;
 };
 DEF_GM( return new ImageShaderGM; )
-
diff --git a/gm/imagefiltersbase.cpp b/gm/imagefiltersbase.cpp
index ca8a2d4..d580243 100644
--- a/gm/imagefiltersbase.cpp
+++ b/gm/imagefiltersbase.cpp
@@ -298,7 +298,7 @@
             canvas->translate(0, 200);
         }
     }
-    
+
 private:
     typedef GM INHERITED;
 };
@@ -322,4 +322,3 @@
     }
 };
 DEF_GM( return new ImageFiltersText_CF; )
-
diff --git a/gm/imagefiltersscaled.cpp b/gm/imagefiltersscaled.cpp
index 21d0704..b0c55dc 100644
--- a/gm/imagefiltersscaled.cpp
+++ b/gm/imagefiltersscaled.cpp
@@ -60,8 +60,8 @@
         noisePaint.setShader(noise);
 
         SkPoint3 pointLocation = SkPoint3::Make(0, 0, SkIntToScalar(10));
-        SkPoint3 spotLocation = SkPoint3::Make(SkIntToScalar(-10), 
-                                               SkIntToScalar(-10), 
+        SkPoint3 spotLocation = SkPoint3::Make(SkIntToScalar(-10),
+                                               SkIntToScalar(-10),
                                                SkIntToScalar(20));
         SkPoint3 spotTarget = SkPoint3::Make(SkIntToScalar(40), SkIntToScalar(40), 0);
         SkScalar spotExponent = SK_Scalar1;
diff --git a/gm/imagefromyuvtextures.cpp b/gm/imagefromyuvtextures.cpp
index 0d2637c..c3184be 100644
--- a/gm/imagefromyuvtextures.cpp
+++ b/gm/imagefromyuvtextures.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2015 Google Inc.
  *
@@ -102,7 +101,7 @@
         for (int i = 0; i < 3; ++i) {
             SkASSERT(fYUVBmps[i].width() == SkToInt(fYUVBmps[i].rowBytes()));
             yuvHandles[i] = gpu->createTestingOnlyBackendTexture(fYUVBmps[i].getPixels(),
-                                                                 fYUVBmps[i].width(), 
+                                                                 fYUVBmps[i].width(),
                                                                  fYUVBmps[i].height(),
                                                                  kAlpha_8_GrPixelConfig);
         }
diff --git a/gm/imagesource2.cpp b/gm/imagesource2.cpp
index db8a9f6..3a3d273 100644
--- a/gm/imagesource2.cpp
+++ b/gm/imagesource2.cpp
@@ -47,7 +47,7 @@
         int curColor = 0;
 
         for (int x = 0; x < kImageSize; x += 3) {
-            SkRect r = SkRect::MakeXYWH(SkIntToScalar(x), SkIntToScalar(0), 
+            SkRect r = SkRect::MakeXYWH(SkIntToScalar(x), SkIntToScalar(0),
                                         SkIntToScalar(3), SkIntToScalar(kImageSize));
             SkPaint p;
             p.setColor(gColors[curColor]);
diff --git a/gm/internal_links.cpp b/gm/internal_links.cpp
index bc1dc24..995cd69 100644
--- a/gm/internal_links.cpp
+++ b/gm/internal_links.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2013 Google Inc.
  *
diff --git a/gm/lcdblendmodes.cpp b/gm/lcdblendmodes.cpp
index 874714b..8ac9449 100644
--- a/gm/lcdblendmodes.cpp
+++ b/gm/lcdblendmodes.cpp
@@ -6,7 +6,7 @@
  */
 
 
-/* 
+/*
  * Tests text rendering with LCD and the various blend modes.
  */
 
@@ -40,7 +40,7 @@
         const int kPointSize = 25;
         fTextHeight = SkIntToScalar(kPointSize);
     }
-    
+
 protected:
     SkString onShortName() override {
         return SkString("lcdblendmodes");
@@ -49,9 +49,9 @@
     void onOnceBeforeDraw() override {
         fCheckerboard = sk_tool_utils::create_checkerboard_shader(SK_ColorBLACK, SK_ColorWHITE, 4);
     }
-    
+
     SkISize onISize() override { return SkISize::Make(kWidth, kHeight); }
-    
+
     void onDraw(SkCanvas* canvas) override {
         SkPaint p;
         p.setAntiAlias(false);
@@ -142,7 +142,7 @@
             y+=fTextHeight;
         }
     }
-    
+
 private:
     SkScalar fTextHeight;
     sk_sp<SkShader> fCheckerboard;
diff --git a/gm/lcdtext.cpp b/gm/lcdtext.cpp
index a2bfa01..978bfd6 100644
--- a/gm/lcdtext.cpp
+++ b/gm/lcdtext.cpp
@@ -23,19 +23,19 @@
         const int pointSize = 36;
         textHeight = SkIntToScalar(pointSize);
     }
-    
+
 protected:
-    
+
     SkString onShortName() {
         SkString name("lcdtext");
         name.append(sk_tool_utils::major_platform_os_name());
         return name;
     }
-    
+
     SkISize onISize() { return SkISize::Make(640, 480); }
-    
+
     virtual void onDraw(SkCanvas* canvas) {
-        
+
         y = textHeight;
         drawText(canvas, SkString("TEXT: SubpixelTrue LCDRenderTrue"),
                  true,  true);
@@ -46,7 +46,7 @@
         drawText(canvas, SkString("TEXT: SubpixelFalse LCDRenderFalse"),
                  false, false);
     }
-    
+
     void drawText(SkCanvas* canvas, const SkString& string,
                   bool subpixelTextEnabled, bool lcdRenderTextEnabled) {
         SkPaint paint;
@@ -56,11 +56,11 @@
         paint.setSubpixelText(subpixelTextEnabled);
         paint.setLCDRenderText(lcdRenderTextEnabled);
         paint.setTextSize(textHeight);
-        
+
         canvas->drawText(string.c_str(), string.size(), 0, y, paint);
         y += textHeight;
     }
-    
+
 private:
     typedef skiagm::GM INHERITED;
     SkScalar y, textHeight;
@@ -85,14 +85,14 @@
 
 public:
     LcdTextSizeGM() {}
-    
+
 protected:
     SkString onShortName() {
         return SkString("lcdtextsize");
     }
-    
+
     SkISize onISize() { return SkISize::Make(320, 120); }
-    
+
     virtual void onDraw(SkCanvas* canvas) {
         const char* lcd_text = "LCD";
         const char* gray_text = "GRAY";
diff --git a/gm/lightingshader.cpp b/gm/lightingshader.cpp
index 6d25671..54f698a 100644
--- a/gm/lightingshader.cpp
+++ b/gm/lightingshader.cpp
@@ -92,7 +92,7 @@
 
         SkMatrix matrix;
         matrix.setRectToRect(bitmapBounds, r, SkMatrix::kFill_ScaleToFit);
-    
+
         const SkMatrix& ctm = canvas->getTotalMatrix();
 
         // TODO: correctly pull out the pure rotation
diff --git a/gm/localmatriximagefilter.cpp b/gm/localmatriximagefilter.cpp
index dd86c96..d53380b 100644
--- a/gm/localmatriximagefilter.cpp
+++ b/gm/localmatriximagefilter.cpp
@@ -99,4 +99,3 @@
     typedef GM INHERITED;
 };
 DEF_GM( return new LocalMatrixImageFilterGM; )
-
diff --git a/gm/mipmap.cpp b/gm/mipmap.cpp
index 9a0f060..ae73a8d 100644
--- a/gm/mipmap.cpp
+++ b/gm/mipmap.cpp
@@ -47,4 +47,3 @@
     }
     canvas->drawImage(img.get(), 20, 20, nullptr);
 }
-
diff --git a/gm/multipicturedraw.cpp b/gm/multipicturedraw.cpp
index 03934a6..787646f 100644
--- a/gm/multipicturedraw.cpp
+++ b/gm/multipicturedraw.cpp
@@ -424,7 +424,7 @@
 
             SkCanvas* subCanvas = step.fSurf->getCanvas();
 
-            const SkMatrix trans = SkMatrix::MakeTrans(-SkIntToScalar(x*kTileWidth), 
+            const SkMatrix trans = SkMatrix::MakeTrans(-SkIntToScalar(x*kTileWidth),
                                                        -SkIntToScalar(y*kTileHeight));
 
             create_content(mpd, pfGen, pictures, subCanvas, trans);
@@ -518,7 +518,7 @@
 
         SkString onShortName() override {
             static const char* gContentNames[] = {
-                "noclip", "rectclip", "rrectclip", "pathclip", 
+                "noclip", "rectclip", "rrectclip", "pathclip",
                 "invpathclip", "sierpinski", "biglayer"
             };
             static const char* gLayoutNames[] = { "simple", "tiled" };
diff --git a/gm/ninepatchstretch.cpp b/gm/ninepatchstretch.cpp
index 9b0b94e..4c6e7d2 100644
--- a/gm/ninepatchstretch.cpp
+++ b/gm/ninepatchstretch.cpp
@@ -110,4 +110,3 @@
     typedef skiagm::GM INHERITED;
 };
 DEF_GM( return new NinePatchStretchGM; )
-
diff --git a/gm/offsetimagefilter.cpp b/gm/offsetimagefilter.cpp
index dd33d9d..11da041 100644
--- a/gm/offsetimagefilter.cpp
+++ b/gm/offsetimagefilter.cpp
@@ -34,7 +34,7 @@
     void onOnceBeforeDraw() override {
         fBitmap = SkImage::MakeFromBitmap(
             sk_tool_utils::create_string_bitmap(80, 80, 0xD000D000, 15, 65, 96, "e"));
-        
+
         fCheckerboard = SkImage::MakeFromBitmap(
             sk_tool_utils::create_checkerboard_bitmap(80, 80,
                                                       sk_tool_utils::color_to_565(0xFFA0A0A0),
@@ -103,14 +103,14 @@
 class SimpleOffsetImageFilterGM : public skiagm::GM {
 public:
     SimpleOffsetImageFilterGM() {}
-    
+
 protected:
     SkString onShortName() override {
         return SkString("simple-offsetimagefilter");
     }
-    
+
     SkISize onISize() override { return SkISize::Make(640, 200); }
-    
+
     void doDraw(SkCanvas* canvas, const SkRect& r, SkImageFilter* imgf,
                 const SkRect* clipR = nullptr) {
         SkPaint p;
@@ -157,22 +157,22 @@
         SkImageFilter::CropRect cr2(r2);
 
         canvas->translate(40, 40);
-        
+
         canvas->save();
         this->doDraw(canvas, r, nullptr);
-        
+
         canvas->translate(100, 0);
         this->doDraw(canvas, r, SkOffsetImageFilter::Create(20, 20));
-        
+
         canvas->translate(100, 0);
         this->doDraw(canvas, r, SkOffsetImageFilter::Create(20, 20, nullptr, &cr0));
-        
+
         canvas->translate(100, 0);
         this->doDraw(canvas, r, SkOffsetImageFilter::Create(20, 20), &r);
-        
+
         canvas->translate(100, 0);
         this->doDraw(canvas, r, SkOffsetImageFilter::Create(20, 20, nullptr, &cr1));
-        
+
         SkRect clipR = SkRect::MakeXYWH(40, 40, 40, 40);
         canvas->translate(100, 0);
         this->doDraw(canvas, r, SkOffsetImageFilter::Create(20, 20, nullptr, nullptr), &clipR);
diff --git a/gm/ovals.cpp b/gm/ovals.cpp
index 580426b..1374b7d 100755
--- a/gm/ovals.cpp
+++ b/gm/ovals.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2013 Google Inc.
  *
diff --git a/gm/patch.cpp b/gm/patch.cpp
index 5b661f4..d27c4e1 100644
--- a/gm/patch.cpp
+++ b/gm/patch.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2014 Google Inc.
  *
@@ -16,7 +15,7 @@
         SK_ColorYELLOW,
     };
     const SkPoint pts[] = { { 100.f / 4.f, 0.f }, { 3.f * 100.f / 4.f, 100.f } };
-    
+
     return SkGradientShader::MakeLinear(pts, colors, nullptr, SK_ARRAY_COUNT(colors),
                                         SkShader::kMirror_TileMode);
 }
@@ -66,7 +65,7 @@
 
 DEF_SIMPLE_GM(patch_primitive, canvas, 800, 800) {
         SkPaint paint;
-        
+
         // The order of the colors and points is clockwise starting at upper-left corner.
         const SkPoint cubics[SkPatchUtils::kNumCtrlPts] = {
             //top points
@@ -78,22 +77,22 @@
             //left points
             {50,250},{150,150}
         };
-        
+
         const SkColor colors[SkPatchUtils::kNumCorners] = {
             SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorCYAN
         };
         const SkPoint texCoords[SkPatchUtils::kNumCorners] = {
             {0.0f, 0.0f}, {100.0f, 0.0f}, {100.0f,100.0f}, {0.0f, 100.0f}}
         ;
-        
+
         const SkXfermode::Mode modes[] = {
             SkXfermode::kSrc_Mode,
             SkXfermode::kDst_Mode,
             SkXfermode::kModulate_Mode,
         };
-        
+
         sk_sp<SkShader> shader(make_shader());
-        
+
         canvas->save();
         for (int y = 0; y < 3; y++) {
             SkAutoTUnref<SkXfermode> xfer(SkXfermode::Create(modes[y]));
@@ -121,7 +120,7 @@
                     default:
                         break;
                 }
-                
+
                 draw_control_points(canvas, cubics);
                 canvas->restore();
             }
diff --git a/gm/patchgrid.cpp b/gm/patchgrid.cpp
index 6f77d48..962c1a9 100644
--- a/gm/patchgrid.cpp
+++ b/gm/patchgrid.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2014 Google Inc.
  *
@@ -57,7 +56,7 @@
  * This GM draws a grid of patches, it only uses colors so it could be considered a mesh gradient.
  */
 class SkPatchGridGM : public GM {
-    
+
 public:
     SkPatchGridGM() {
         this->setBGColor(0xFFFFFFFF);
@@ -75,28 +74,28 @@
     void onDraw(SkCanvas* canvas) override {
 
         SkPaint paint;
-        
+
         SkPoint vertices[4][5] = {
             {{50,50}, {150,50}, {250,50},{350,50},{450,50}},
             {{50,150}, {120,120}, {250,150},{350,150},{450,150}},
             {{50,250}, {150,250}, {250,250},{350,250},{450,250}},
             {{100,300}, {150,350}, {250,350},{350,350},{450,350}}
         };
-        
+
         SkColor cornerColors[4][5] = {
             {SK_ColorBLUE, SK_ColorRED, SK_ColorBLUE, SK_ColorRED, SK_ColorBLUE},
             {SK_ColorRED, SK_ColorBLUE, SK_ColorRED, SK_ColorBLUE, SK_ColorRED},
             {SK_ColorBLUE, SK_ColorRED, SK_ColorBLUE, SK_ColorRED, SK_ColorBLUE},
             {SK_ColorRED, SK_ColorBLUE, SK_ColorRED, SK_ColorBLUE, SK_ColorRED},
         };
-        
+
         SkPoint hrzCtrl[4][8] = {
             {{75,30},{125,45},{175,70},{225,20},{275,50},{325,50},{375,5},{425,90}},
             {{75,150},{125,150},{175,150},{225,150},{275,150},{325,150},{375,150},{425,150}},
             {{75,250},{125,250},{175,250},{225,250},{275,200},{325,150},{375,250},{425,250}},
             {{75,350},{125,350},{175,350},{225,350},{275,350},{325,350},{375,350},{425,350}}
         };
-        
+
         SkPoint vrtCtrl[6][5] = {
             {{50,75},{150,75},{250,75},{350,75},{450,75}},
             {{50,125},{150,125},{250,125},{350,125},{450,125}},
@@ -105,42 +104,42 @@
             {{50,275},{150,275},{250,275},{350,275},{400,305}},
             {{50,325},{150,325},{250,325},{350,325},{450,325}}
         };
-        
+
         static const int kRows = 3;
         static const int kCols = 4;
-        
+
         canvas->scale(3, 3);
         SkPatchGrid grid(kRows, kCols, SkPatchGrid::kColors_VertexType, nullptr);
         for (int i = 0; i < kRows; i++) {
             for (int j = 0; j < kCols; j++) {
                 SkPoint points[12];
-                
+
                 //set corners
                 points[SkPatchUtils::kTopP0_CubicCtrlPts] = vertices[i][j];
                 points[SkPatchUtils::kTopP3_CubicCtrlPts] = vertices[i][j + 1];
                 points[SkPatchUtils::kBottomP0_CubicCtrlPts] = vertices[i + 1][j];
                 points[SkPatchUtils::kBottomP3_CubicCtrlPts] = vertices[i + 1][j + 1];
-                
+
                 points[SkPatchUtils::kTopP1_CubicCtrlPts] = hrzCtrl[i][j * 2];
                 points[SkPatchUtils::kTopP2_CubicCtrlPts] = hrzCtrl[i][j * 2 + 1];
                 points[SkPatchUtils::kBottomP1_CubicCtrlPts] = hrzCtrl[i + 1][j * 2];
                 points[SkPatchUtils::kBottomP2_CubicCtrlPts] = hrzCtrl[i + 1][j * 2 + 1];
-                
+
                 points[SkPatchUtils::kLeftP1_CubicCtrlPts] = vrtCtrl[i * 2][j];
                 points[SkPatchUtils::kLeftP2_CubicCtrlPts] = vrtCtrl[i * 2 + 1][j];
                 points[SkPatchUtils::kRightP1_CubicCtrlPts] = vrtCtrl[i * 2][j + 1];
                 points[SkPatchUtils::kRightP2_CubicCtrlPts] = vrtCtrl[i * 2 + 1][j + 1];
-                
+
                 SkColor colors[4];
                 colors[0] = cornerColors[i][j];
                 colors[1] = cornerColors[i][j + 1];
                 colors[3] = cornerColors[i + 1][j];
                 colors[2] = cornerColors[i + 1][j + 1];
-                
+
                 grid.setPatch(j, i, points, colors, nullptr);
             }
         }
-        
+
         grid.draw(canvas, paint);
         SkISize dims = grid.getDimensions();
         for (int y = 0; y < dims.height(); y++) {
diff --git a/gm/path_stroke_with_zero_length.cpp b/gm/path_stroke_with_zero_length.cpp
index f69b5f9..ab92736 100644
--- a/gm/path_stroke_with_zero_length.cpp
+++ b/gm/path_stroke_with_zero_length.cpp
@@ -193,4 +193,3 @@
 ///////////////////////////////////////////////////////////////////////////////
 
 DEF_GM( return new StrokeZeroGM(); )
-
diff --git a/gm/pathcontourstart.cpp b/gm/pathcontourstart.cpp
index dbda7c3..56f6492 100644
--- a/gm/pathcontourstart.cpp
+++ b/gm/pathcontourstart.cpp
@@ -127,4 +127,3 @@
 DEF_GM( return new ContourStartGM(); )
 
 } // namespace skiagm
-
diff --git a/gm/pathreverse.cpp b/gm/pathreverse.cpp
index 3350765..f0ce051 100644
--- a/gm/pathreverse.cpp
+++ b/gm/pathreverse.cpp
@@ -15,7 +15,7 @@
  * paint.setTextSize(SkIntToScalar(100));
  * paint.setTypeface(SkTypeface::CreateFromName("Hiragino Maru Gothic Pro"));
  * paint.getTextPath("e", 1, 50, 50, &path);
- * 
+ *
  * The path data is duplicated here to allow the test to
  * run on all platforms and to remove the bug dependency
  * should future Macs edit or delete the font.
diff --git a/gm/picture.cpp b/gm/picture.cpp
index 904046d..1ea8ada 100644
--- a/gm/picture.cpp
+++ b/gm/picture.cpp
@@ -23,7 +23,7 @@
     paint.setColor(0x80FF0000);
     path.moveTo(0, 0); path.lineTo(100, 0); path.lineTo(100, 100);
     canvas->drawPath(path, paint);
-    
+
     paint.setColor(0x8000FF00);
     path.reset(); path.moveTo(0, 0); path.lineTo(100, 0); path.lineTo(0, 100);
     canvas->drawPath(path, paint);
@@ -63,10 +63,10 @@
         SkPaint paint;
 
         canvas->drawPicture(fPicture);
-        
+
         matrix.setTranslate(110, 0);
         canvas->drawPicture(fPicture, &matrix, nullptr);
-        
+
         matrix.postTranslate(110, 0);
         canvas->drawPicture(fPicture, &matrix, &paint);
 
diff --git a/gm/pixelsnap.cpp b/gm/pixelsnap.cpp
index 7791acb..1711f5e 100644
--- a/gm/pixelsnap.cpp
+++ b/gm/pixelsnap.cpp
@@ -36,7 +36,7 @@
         SkPaint bgPaint;
         bgPaint.setShader(
                 sk_tool_utils::create_checkerboard_shader(
-                sk_tool_utils::color_to_565(0xFFAAAAAA), 
+                sk_tool_utils::color_to_565(0xFFAAAAAA),
                 sk_tool_utils::color_to_565(0xFF777777), 1));
         canvas->drawPaint(bgPaint);
 
diff --git a/gm/points.cpp b/gm/points.cpp
index eda3121..0aa6fd8 100644
--- a/gm/points.cpp
+++ b/gm/points.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/gm/recordopts.cpp b/gm/recordopts.cpp
index 3c44f4a..d920a17 100644
--- a/gm/recordopts.cpp
+++ b/gm/recordopts.cpp
@@ -213,4 +213,3 @@
         }
     }
 }
-
diff --git a/gm/rectangletexture.cpp b/gm/rectangletexture.cpp
index 43d008a..47390e2 100644
--- a/gm/rectangletexture.cpp
+++ b/gm/rectangletexture.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2016 Google Inc.
  *
@@ -95,7 +94,7 @@
         GR_GL_CALL(gl, TexParameteri(TARGET, GR_GL_TEXTURE_MIN_FILTER,
                                      GR_GL_NEAREST));
         GR_GL_CALL(gl, TexParameteri(TARGET, GR_GL_TEXTURE_WRAP_S,
-                                     GR_GL_CLAMP_TO_EDGE));    
+                                     GR_GL_CLAMP_TO_EDGE));
         GR_GL_CALL(gl, TexParameteri(TARGET, GR_GL_TEXTURE_WRAP_T,
                                      GR_GL_CLAMP_TO_EDGE));
         GR_GL_CALL(gl, TexImage2D(TARGET, 0, GR_GL_RGBA, width, height, 0,
diff --git a/gm/roundrects.cpp b/gm/roundrects.cpp
index d0401f0..514e43a 100644
--- a/gm/roundrects.cpp
+++ b/gm/roundrects.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2013 Google Inc.
  *
diff --git a/gm/shadertext.cpp b/gm/shadertext.cpp
index 13fa283..f794481 100644
--- a/gm/shadertext.cpp
+++ b/gm/shadertext.cpp
@@ -133,7 +133,7 @@
                                                    SkShader::kClamp_TileMode);
             }
         }
-        
+
         SkBitmap bm;
         makebm(&bm, w/16, h/4);
         for (size_t tx = 0; tx < SK_ARRAY_COUNT(tileModes); ++tx) {
diff --git a/gm/shallowgradient.cpp b/gm/shallowgradient.cpp
index 6990ba7..ad1de63 100644
--- a/gm/shallowgradient.cpp
+++ b/gm/shallowgradient.cpp
@@ -50,7 +50,7 @@
     }
 
     void onDraw(SkCanvas* canvas) override {
-        const SkColor colors[] = { sk_tool_utils::color_to_565(0xFF555555), 
+        const SkColor colors[] = { sk_tool_utils::color_to_565(0xFF555555),
                 sk_tool_utils::color_to_565(0xFF444444) };
         const int colorCount = SK_ARRAY_COUNT(colors);
 
diff --git a/gm/shapes.cpp b/gm/shapes.cpp
index 02b6a98..ee0920e 100644
--- a/gm/shapes.cpp
+++ b/gm/shapes.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2016 Google Inc.
  *
diff --git a/gm/showmiplevels.cpp b/gm/showmiplevels.cpp
index fd1254f..717d629 100644
--- a/gm/showmiplevels.cpp
+++ b/gm/showmiplevels.cpp
@@ -204,7 +204,7 @@
             canvas->translate(0, bm.height() * 0.85f);
         }
     }
-    
+
 private:
     typedef skiagm::GM INHERITED;
 };
@@ -300,7 +300,7 @@
             canvas->translate(0, SkScalarRoundToScalar(bm.height() * 0.85f));
         }
     }
-    
+
 private:
     typedef skiagm::GM INHERITED;
 };
diff --git a/gm/smallpaths.cpp b/gm/smallpaths.cpp
index fd89f70..926b2a2 100644
--- a/gm/smallpaths.cpp
+++ b/gm/smallpaths.cpp
@@ -63,16 +63,16 @@
     static SkScalar yOffset = 50.f;
     path->moveTo(-32.5f + xOffset, 0.0f + yOffset);
     path->lineTo(32.5f + xOffset, 0.0f + yOffset);
-    
+
     path->moveTo(-32.5f + xOffset, 19 + yOffset);
     path->lineTo(32.5f + xOffset, 19 + yOffset);
-    
+
     path->moveTo(-32.5f + xOffset, -19 + yOffset);
     path->lineTo(32.5f + xOffset, -19 + yOffset);
     path->lineTo(-32.5f + xOffset, -19 + yOffset);
-    
+
     path->close();
-    
+
     return SkIntToScalar(70);
 }
 
@@ -81,16 +81,16 @@
     static SkScalar yOffset = 40.f;
     path->moveTo(-26.f + xOffset, 0.0f + yOffset);
     path->lineTo(26.f + xOffset, 0.0f + yOffset);
-    
+
     path->moveTo(-28.f + xOffset, -2.4748745f + yOffset);
     path->lineTo(0 + xOffset, 25.525126f + yOffset);
-    
+
     path->moveTo(-28.f + xOffset, 2.4748745f + yOffset);
     path->lineTo(0 + xOffset, -25.525126f + yOffset);
     path->lineTo(-28.f + xOffset, 2.4748745f + yOffset);
 
     path->close();
-    
+
     return SkIntToScalar(70);
 }
 
@@ -101,7 +101,7 @@
     path->conicTo(435.93292f + xOffset, 56.000031f + yOffset,
                   382.61078f + xOffset, 69.752716f + yOffset,
                   0.9920463f);
-    
+
     return SkIntToScalar(40);
 }
 
@@ -118,7 +118,7 @@
     path->lineTo(24.67f + xOffset, 5.3299999f);
     path->lineTo(24.67f + xOffset, 0.33000004f);
     path->close();
-    
+
     path->moveTo(25.727224f + xOffset, 12.886665f);
     path->lineTo(10.907918f + xOffset, 12.886665f);
     path->lineTo(7.5166659f + xOffset, 28.683645f);
@@ -133,14 +133,14 @@
 
 static SkScalar make_battery2(SkPath* path) {
     static SkScalar xOffset = 5.f;
-    
+
     path->moveTo(32.669998f + xOffset, 9.8640003f);
     path->lineTo(0.33000004f + xOffset, 9.8640003f);
     path->lineTo(0.33000004f + xOffset, 50.669998f);
     path->lineTo(32.669998f + xOffset, 50.669998f);
     path->lineTo(32.669998f + xOffset, 9.8640003f);
     path->close();
-    
+
     path->moveTo(10.907918f + xOffset, 12.886665f);
     path->lineTo(25.727224f + xOffset, 12.886665f);
     path->lineTo(16.854223f + xOffset, 25.136419f);
@@ -150,7 +150,7 @@
     path->lineTo(7.5166659f + xOffset, 28.683645f);
     path->lineTo(10.907918f + xOffset, 12.886665f);
     path->close();
-    
+
     return SkIntToScalar(70);
 }
 
@@ -229,7 +229,7 @@
         }
         canvas->restore();
         canvas->translate(SkIntToScalar(120), SkIntToScalar(0));
-     
+
         // second column: stroked paths
         canvas->save();
         paint.setStyle(SkPaint::kStroke_Style);
@@ -242,7 +242,7 @@
         }
         canvas->restore();
         canvas->translate(SkIntToScalar(120), SkIntToScalar(0));
-        
+
         // third column: stroked paths with different widths
         canvas->save();
         paint.setStyle(SkPaint::kStroke_Style);
@@ -255,7 +255,7 @@
         }
         canvas->restore();
         canvas->translate(SkIntToScalar(120), SkIntToScalar(0));
-        
+
         // fourth column: stroked and filled paths
         paint.setStyle(SkPaint::kStrokeAndFill_Style);
         paint.setStrokeCap(SkPaint::kButt_Cap);
@@ -265,7 +265,7 @@
             canvas->drawPath(fPath[i], paint);
             canvas->translate(SkIntToScalar(0), fDY[i]);
         }
-        
+
     }
 
 private:
@@ -273,4 +273,3 @@
 };
 
 DEF_GM(return new SmallPathsGM;)
-
diff --git a/gm/strokefill.cpp b/gm/strokefill.cpp
index fc1a281..98e9bbb 100644
--- a/gm/strokefill.cpp
+++ b/gm/strokefill.cpp
@@ -258,12 +258,12 @@
         paint.setAntiAlias(true);
         paint.setTextSize(SkIntToScalar(100));
         paint.setStrokeWidth(SkIntToScalar(5));
-        
+
         // use paths instead of text to test the path data on all platforms, since the
         // Mac-specific font may change or is not available everywhere
         path_bold(canvas, papyrus_hello(), paint);
         path_bold(canvas, hiragino_maru_gothic_pro_dash(), paint);
-        
+
         // use the portable typeface to generically test the fake bold code everywhere
         // (as long as the freetype option to do the bolding itself isn't enabled)
         sk_tool_utils::set_portable_typeface(&paint, "serif");
@@ -304,7 +304,7 @@
         path3.addRect(r, SkPath::kCCW_Direction);
         canvas->drawPath(path3, paint);
 
-        r = SkRect::MakeXYWH(x + SkIntToScalar(70), y + SkIntToScalar(280), 
+        r = SkRect::MakeXYWH(x + SkIntToScalar(70), y + SkIntToScalar(280),
                              SkIntToScalar(100), SkIntToScalar(100));
         SkPath path4;
         path4.setFillType(SkPath::kWinding_FillType);
@@ -313,7 +313,7 @@
         path4.addRect(r, SkPath::kCW_Direction);
         canvas->drawPath(path4, paint);
 
-        r = SkRect::MakeXYWH(x + SkIntToScalar(190), y + SkIntToScalar(280), 
+        r = SkRect::MakeXYWH(x + SkIntToScalar(190), y + SkIntToScalar(280),
                              SkIntToScalar(100), SkIntToScalar(100));
         path4.reset();
         SkASSERT(!SkPathPriv::CheapComputeFirstDirection(path4, nullptr));
@@ -322,7 +322,7 @@
         path4.moveTo(0, 0); // test for crbug.com/247770
         canvas->drawPath(path4, paint);
 
-        r = SkRect::MakeXYWH(x + SkIntToScalar(310), y + SkIntToScalar(280), 
+        r = SkRect::MakeXYWH(x + SkIntToScalar(310), y + SkIntToScalar(280),
                              SkIntToScalar(100), SkIntToScalar(100));
         path4.reset();
         SkASSERT(!SkPathPriv::CheapComputeFirstDirection(path4, nullptr));
diff --git a/gm/strokerects.cpp b/gm/strokerects.cpp
index f5167bb..afd41b2 100644
--- a/gm/strokerects.cpp
+++ b/gm/strokerects.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/gm/strokes.cpp b/gm/strokes.cpp
index f64a876..61f5a8a 100644
--- a/gm/strokes.cpp
+++ b/gm/strokes.cpp
@@ -243,7 +243,7 @@
     p.setStrokeWidth(0);
     SkPath path;
     SkPoint pts[] = {{105.738571f,13.126318f},
-            {105.738571f,13.126318f}, 
+            {105.738571f,13.126318f},
             {123.753784f,1.f}};
     SkVector tangent = pts[1] - pts[2];
     tangent.normalize();
@@ -449,7 +449,7 @@
         SkPaint paint;
         paint.setStyle(SkPaint::kStroke_Style);
         paint.setStrokeWidth(0.055f);
-    
+
         canvas->scale(1000, 1000);
         canvas->drawCircle(0, 2, 1.97f, paint);
     }
diff --git a/gm/surface.cpp b/gm/surface.cpp
index 436ea95..901e324 100644
--- a/gm/surface.cpp
+++ b/gm/surface.cpp
@@ -86,7 +86,7 @@
             { kRGB_V_SkPixelGeometry,   "RGB_V" },
             { kBGR_V_SkPixelGeometry,   "BGR_V" },
         };
-    
+
         SkScalar x = 0;
         for (int disallowAA = 0; disallowAA <= 1; ++disallowAA) {
             for (int disallowDither = 0; disallowDither <= 1; ++disallowDither) {
@@ -156,4 +156,3 @@
     typedef GM INHERITED;
 };
 DEF_GM( return new NewSurfaceGM )
-
diff --git a/gm/tablecolorfilter.cpp b/gm/tablecolorfilter.cpp
index c9ca474..a644bd1 100644
--- a/gm/tablecolorfilter.cpp
+++ b/gm/tablecolorfilter.cpp
@@ -209,12 +209,12 @@
     {
         fName.printf("colorcomposefilter_%s", suffix);
     }
-    
+
 protected:
     virtual SkString onShortName() {
         return fName;
     }
-    
+
     virtual SkISize onISize() {
         return SkISize::Make(790, 790);
     }
@@ -270,7 +270,7 @@
             canvas->translate(0, r.height() + spacer);
         }
     }
-    
+
 private:
     typedef GM INHERITED;
 };
diff --git a/gm/texdata.cpp b/gm/texdata.cpp
index 4b484cc..8e29b23 100644
--- a/gm/texdata.cpp
+++ b/gm/texdata.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/gm/textblobblockreordering.cpp b/gm/textblobblockreordering.cpp
index 6542825..31ba3c7 100644
--- a/gm/textblobblockreordering.cpp
+++ b/gm/textblobblockreordering.cpp
@@ -58,9 +58,9 @@
         SkRect bounds = fBlob->bounds();
         const int yDelta = SkScalarFloorToInt(bounds.height()) + 20;
         const int xDelta = SkScalarFloorToInt(bounds.width());
-        
+
         canvas->drawTextBlob(fBlob, 0, 0, paint);
-        
+
         canvas->translate(SkIntToScalar(xDelta), SkIntToScalar(yDelta));
 
 	// draw a rect where the text should be, and then twiddle the xfermode
@@ -84,7 +84,7 @@
 
     typedef GM INHERITED;
 };
- 
+
 //////////////////////////////////////////////////////////////////////////////
 
 DEF_GM(return new TextBlobBlockReordering;)
diff --git a/gm/texturedomaineffect.cpp b/gm/texturedomaineffect.cpp
index 6bd6490..89d3b44 100644
--- a/gm/texturedomaineffect.cpp
+++ b/gm/texturedomaineffect.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2014 Google Inc.
  *
diff --git a/gm/tilemodes.cpp b/gm/tilemodes.cpp
index d774939..b7f0d45 100644
--- a/gm/tilemodes.cpp
+++ b/gm/tilemodes.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/gm/tilemodes_scaled.cpp b/gm/tilemodes_scaled.cpp
index 21224b4..3bcb0fa 100644
--- a/gm/tilemodes_scaled.cpp
+++ b/gm/tilemodes_scaled.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/gm/tinybitmap.cpp b/gm/tinybitmap.cpp
index 1162b2d..fc226c1 100644
--- a/gm/tinybitmap.cpp
+++ b/gm/tinybitmap.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/gm/verttext2.cpp b/gm/verttext2.cpp
index 4896cc9..12576c2 100644
--- a/gm/verttext2.cpp
+++ b/gm/verttext2.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/gm/verylargebitmap.cpp b/gm/verylargebitmap.cpp
index 78f8f59..f257bf9 100644
--- a/gm/verylargebitmap.cpp
+++ b/gm/verylargebitmap.cpp
@@ -120,4 +120,3 @@
 };
 DEF_GM( return new VeryLargeBitmapGM(make_raster_image, "bitmap"); )
 DEF_GM( return new VeryLargeBitmapGM(make_picture_image, "_picture_image"); )
-
diff --git a/gm/xfermodes.cpp b/gm/xfermodes.cpp
index a1427cf..821bb8c 100644
--- a/gm/xfermodes.cpp
+++ b/gm/xfermodes.cpp
@@ -61,7 +61,7 @@
     kSmallTransparentImage_SrcType        = 0x40,
     //! kRectangleImage_SrcType drawn directly with a mask.
     kRectangleWithMask_SrcType            = 0x80,
-    
+
     kAll_SrcType                          = 0xFF, //!< All the source types.
     kBasic_SrcType                        = 0x03, //!< Just basic source types.
 };
@@ -87,7 +87,7 @@
     { SkXfermode::kDstOut_Mode,       "DstOut",       kAll_SrcType   },
     { SkXfermode::kSrcATop_Mode,      "SrcATop",      kAll_SrcType   },
     { SkXfermode::kDstATop_Mode,      "DstATop",      kAll_SrcType   },
-    
+
     { SkXfermode::kXor_Mode,          "Xor",          kBasic_SrcType },
     { SkXfermode::kPlus_Mode,         "Plus",         kBasic_SrcType },
     { SkXfermode::kModulate_Mode,     "Modulate",     kAll_SrcType   },
diff --git a/gm/xfermodes2.cpp b/gm/xfermodes2.cpp
index 397f4e1..0956af6 100644
--- a/gm/xfermodes2.cpp
+++ b/gm/xfermodes2.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2013 Google Inc.
  *
diff --git a/gm/yuvtorgbeffect.cpp b/gm/yuvtorgbeffect.cpp
index 4aafb7a..996e473 100644
--- a/gm/yuvtorgbeffect.cpp
+++ b/gm/yuvtorgbeffect.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2014 Google Inc.
  *
diff --git a/platform_tools/android/apps/sample_app/src/main/jni/AndroidKeyToSkKey.h b/platform_tools/android/apps/sample_app/src/main/jni/AndroidKeyToSkKey.h
index 6bcb148..00fd5d0 100644
--- a/platform_tools/android/apps/sample_app/src/main/jni/AndroidKeyToSkKey.h
+++ b/platform_tools/android/apps/sample_app/src/main/jni/AndroidKeyToSkKey.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Skia
  *
diff --git a/platform_tools/android/apps/sample_app/src/main/jni/com_skia_SkiaSampleRenderer.cpp b/platform_tools/android/apps/sample_app/src/main/jni/com_skia_SkiaSampleRenderer.cpp
index 2ae7223..e5c6660 100644
--- a/platform_tools/android/apps/sample_app/src/main/jni/com_skia_SkiaSampleRenderer.cpp
+++ b/platform_tools/android/apps/sample_app/src/main/jni/com_skia_SkiaSampleRenderer.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Skia
  *
diff --git a/samplecode/ClockFaceView.cpp b/samplecode/ClockFaceView.cpp
index 80debeb..a282c31 100644
--- a/samplecode/ClockFaceView.cpp
+++ b/samplecode/ClockFaceView.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/samplecode/GMSampleView.cpp b/samplecode/GMSampleView.cpp
index 24c94cb..76d0c59 100644
--- a/samplecode/GMSampleView.cpp
+++ b/samplecode/GMSampleView.cpp
@@ -59,4 +59,3 @@
 bool GMSampleView::onAnimate(const SkAnimTimer& timer) {
     return fGM->animate(timer);
 }
-
diff --git a/samplecode/OverView.cpp b/samplecode/OverView.cpp
index 8520f57..0cd129e 100644
--- a/samplecode/OverView.cpp
+++ b/samplecode/OverView.cpp
@@ -172,4 +172,3 @@
         }
     }
 }
-
diff --git a/samplecode/PerlinPatch.cpp b/samplecode/PerlinPatch.cpp
index ad2d6be..c5a0db8 100644
--- a/samplecode/PerlinPatch.cpp
+++ b/samplecode/PerlinPatch.cpp
@@ -129,7 +129,7 @@
         }
 
         SkPaint paint;
-        
+
         SkScalar texWidth = fTexScale * TexWidth;
         SkScalar texHeight = fTexScale * TexHeight;
         const SkPoint texCoords[SkPatchUtils::kNumCorners] = {
@@ -138,7 +138,7 @@
             { fTexX + texWidth, fTexY + texHeight},
             { fTexX - texWidth, fTexY + texHeight}}
         ;
-        
+
         SkAutoTUnref<SkXfermode> xfer(SkXfermode::Create(SkXfermode::kSrc_Mode));
 
         SkScalar scaleFreq = 2.0;
@@ -204,4 +204,3 @@
 };
 
 DEF_SAMPLE( return new PerlinPatchView(); )
-
diff --git a/samplecode/Sample2PtRadial.cpp b/samplecode/Sample2PtRadial.cpp
index c32025e..db3b24f 100644
--- a/samplecode/Sample2PtRadial.cpp
+++ b/samplecode/Sample2PtRadial.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/samplecode/SampleAAClip.cpp b/samplecode/SampleAAClip.cpp
index 78baf3d..4c79560 100644
--- a/samplecode/SampleAAClip.cpp
+++ b/samplecode/SampleAAClip.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/samplecode/SampleAARects.cpp b/samplecode/SampleAARects.cpp
index d0c1115..41507d9 100644
--- a/samplecode/SampleAARects.cpp
+++ b/samplecode/SampleAARects.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/samplecode/SampleAll.cpp b/samplecode/SampleAll.cpp
index 70ecd9f..d3be968 100644
--- a/samplecode/SampleAll.cpp
+++ b/samplecode/SampleAll.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/samplecode/SampleAnimatedText.cpp b/samplecode/SampleAnimatedText.cpp
index 8ca9d87..89ea692 100755
--- a/samplecode/SampleAnimatedText.cpp
+++ b/samplecode/SampleAnimatedText.cpp
@@ -133,7 +133,7 @@
     }
 
     bool onAnimate(const SkAnimTimer& timer) override {
-        // We add noise to the scale and rotation animations to 
+        // We add noise to the scale and rotation animations to
         // keep the font atlas from falling into a steady state
         fRotation += (1.0f + gRand.nextRangeF(-0.1f, 0.1f));
         fScale += (fScaleInc + gRand.nextRangeF(-0.025f, 0.025f));
diff --git a/samplecode/SampleAnimator.cpp b/samplecode/SampleAnimator.cpp
index 8b7af68..d4a4cdd 100644
--- a/samplecode/SampleAnimator.cpp
+++ b/samplecode/SampleAnimator.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/samplecode/SampleApp.cpp b/samplecode/SampleApp.cpp
index 3149711..e0d152d 100644
--- a/samplecode/SampleApp.cpp
+++ b/samplecode/SampleApp.cpp
@@ -852,7 +852,7 @@
         fDeviceType = kGPU_DeviceType;
     }
 #endif
-        
+
 #if DEFAULT_TO_GPU
     fDeviceType = kGPU_DeviceType;
 #endif
@@ -1792,13 +1792,13 @@
 void SampleWindow::setDeviceType(DeviceType type) {
     if (type == fDeviceType)
         return;
-    
+
     fDevManager->tearDownBackend(this);
-    
+
     fDeviceType = type;
-    
+
     fDevManager->setUpBackend(this, fMSAASampleCount);
-    
+
     this->updateTitle();
     this->inval(nullptr);
 }
@@ -1807,9 +1807,9 @@
     this->setColorType(ct, pt);
 
     fDevManager->tearDownBackend(this);
-    
+
     fDevManager->setUpBackend(this, fMSAASampleCount);
-    
+
     this->updateTitle();
     this->inval(nullptr);
 }
diff --git a/samplecode/SampleApp.h b/samplecode/SampleApp.h
index 7ee07d8..082208c 100644
--- a/samplecode/SampleApp.h
+++ b/samplecode/SampleApp.h
@@ -72,7 +72,7 @@
      */
     class DeviceManager : public SkRefCnt {
     public:
-        
+
 
         virtual void setUpBackend(SampleWindow* win, int msaaSampleCount) = 0;
 
diff --git a/samplecode/SampleAtlas.cpp b/samplecode/SampleAtlas.cpp
index 3061b14..7cf1bb3 100644
--- a/samplecode/SampleAtlas.cpp
+++ b/samplecode/SampleAtlas.cpp
@@ -30,7 +30,7 @@
     for (int i = 0; i < count; ++i) {
         SkMatrix matrix;
         matrix.setRSXform(xform[i]);
-        
+
         canvas->save();
         canvas->concat(matrix);
         canvas->drawImageRect(atlas, tex[i], tex[i].makeOffset(-tex[i].x(), -tex[i].y()), paint,
@@ -118,7 +118,7 @@
                 fDAlpha = -fDAlpha;
             }
         }
-        
+
         SkRSXform asRSXform() const {
             return SkRSXform::MakeFromRadians(fScale, fRadian, fCenter.x(), fCenter.y(),
                                               SkScalarHalf(kCellSize), SkScalarHalf(kCellSize));
@@ -151,7 +151,7 @@
                 const SkScalar sx = SkIntToScalar(x);
                 const SkScalar sy = SkIntToScalar(y);
                 fTex[i].setXYWH(sx, sy, cell, cell);
-                
+
                 fRec[i].fCenter.set(sx + cell/2, sy + 3*cell/4);
                 fRec[i].fVelocity.fX = rand.nextSScalar1() * kMaxSpeed;
                 fRec[i].fVelocity.fY = rand.nextSScalar1() * kMaxSpeed;
@@ -189,7 +189,7 @@
         const SkColor* colorsPtr = fUseColors ? colors : nullptr;
         fProc(canvas, fAtlas.get(), xform, fTex, colorsPtr, N, &cull, &paint);
     }
-    
+
     SkRect onGetBounds() override {
         const SkScalar border = kMaxScale * kCellSize;
         SkRect r = fBounds;
diff --git a/samplecode/SampleBigBlur.cpp b/samplecode/SampleBigBlur.cpp
index fcbd6ac..800ae24 100644
--- a/samplecode/SampleBigBlur.cpp
+++ b/samplecode/SampleBigBlur.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/samplecode/SampleBitmapRect.cpp b/samplecode/SampleBitmapRect.cpp
index 0576234..24c3eff 100644
--- a/samplecode/SampleBitmapRect.cpp
+++ b/samplecode/SampleBitmapRect.cpp
@@ -78,7 +78,7 @@
     void resetBounce() {
         fSrcPts[0].set(0, 0);
         fSrcPts[1].set(SCALAR_SIZE, SCALAR_SIZE);
-        
+
         fSrcVec[0] = unit_vec(30);
         fSrcVec[1] = unit_vec(107);
     }
diff --git a/samplecode/SampleBlur.cpp b/samplecode/SampleBlur.cpp
index bd5ff47..b617691 100644
--- a/samplecode/SampleBlur.cpp
+++ b/samplecode/SampleBlur.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/samplecode/SampleClamp.cpp b/samplecode/SampleClamp.cpp
index 9739053..3046cde 100644
--- a/samplecode/SampleClamp.cpp
+++ b/samplecode/SampleClamp.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/samplecode/SampleClipDrawMatch.cpp b/samplecode/SampleClipDrawMatch.cpp
index 45663b5..b010ad0 100644
--- a/samplecode/SampleClipDrawMatch.cpp
+++ b/samplecode/SampleClipDrawMatch.cpp
@@ -111,7 +111,7 @@
     case kRectAndConcave_Geometry:
         canvas->drawPath(create_concave_path(offset), p);
         break;
-    } 
+    }
 }
 
 class ClipDrawMatchView : public SampleView {
@@ -202,7 +202,7 @@
             canvas->clipRect(r, SkRegion::kReplace_Op, true); // AA here forces shader clips
             canvas->clipPath(create_concave_path(offset), SkRegion::kIntersect_Op, useAA);
             } break;
-        } 
+        }
 
         SkISize size = canvas->getDeviceSize();
         SkRect bigR = SkRect::MakeWH(SkIntToScalar(size.width()), SkIntToScalar(size.height()));
diff --git a/samplecode/SampleColorFilter.cpp b/samplecode/SampleColorFilter.cpp
index 0b8acc3..8a8eef6 100644
--- a/samplecode/SampleColorFilter.cpp
+++ b/samplecode/SampleColorFilter.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/samplecode/SampleComplexClip.cpp b/samplecode/SampleComplexClip.cpp
index 0d613ec..aab759c 100644
--- a/samplecode/SampleComplexClip.cpp
+++ b/samplecode/SampleComplexClip.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/samplecode/SampleConcavePaths.cpp b/samplecode/SampleConcavePaths.cpp
index abdf707..d75ec4c 100644
--- a/samplecode/SampleConcavePaths.cpp
+++ b/samplecode/SampleConcavePaths.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/samplecode/SampleDash.cpp b/samplecode/SampleDash.cpp
index a01c079..f2c6b8b 100644
--- a/samplecode/SampleDash.cpp
+++ b/samplecode/SampleDash.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/samplecode/SampleDither.cpp b/samplecode/SampleDither.cpp
index a599418..99b33f0 100644
--- a/samplecode/SampleDither.cpp
+++ b/samplecode/SampleDither.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/samplecode/SampleDraw.cpp b/samplecode/SampleDraw.cpp
index 5e239c6..29ad07d 100644
--- a/samplecode/SampleDraw.cpp
+++ b/samplecode/SampleDraw.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/samplecode/SampleEffects.cpp b/samplecode/SampleEffects.cpp
index 12ea4e2..a8f793c 100644
--- a/samplecode/SampleEffects.cpp
+++ b/samplecode/SampleEffects.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/samplecode/SampleFillType.cpp b/samplecode/SampleFillType.cpp
index af94c9f..582dd96 100644
--- a/samplecode/SampleFillType.cpp
+++ b/samplecode/SampleFillType.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/samplecode/SampleFilter.cpp b/samplecode/SampleFilter.cpp
index acf358a..66de8f3 100644
--- a/samplecode/SampleFilter.cpp
+++ b/samplecode/SampleFilter.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/samplecode/SampleFilterFuzz.cpp b/samplecode/SampleFilterFuzz.cpp
index 0602e2b..18806c9 100644
--- a/samplecode/SampleFilterFuzz.cpp
+++ b/samplecode/SampleFilterFuzz.cpp
@@ -696,8 +696,8 @@
     {
         SkRTreeFactory factory;
         SkPictureRecorder recorder;
-        SkCanvas* recordingCanvas = recorder.beginRecording(SkIntToScalar(kBitmapSize), 
-                                                            SkIntToScalar(kBitmapSize), 
+        SkCanvas* recordingCanvas = recorder.beginRecording(SkIntToScalar(kBitmapSize),
+                                                            SkIntToScalar(kBitmapSize),
                                                             &factory, 0);
         drawSomething(recordingCanvas);
         sk_sp<SkPicture> pict(recorder.finishRecordingAsPicture());
diff --git a/samplecode/SampleFilterQuality.cpp b/samplecode/SampleFilterQuality.cpp
index ee99845..2c3eb4c 100644
--- a/samplecode/SampleFilterQuality.cpp
+++ b/samplecode/SampleFilterQuality.cpp
@@ -54,7 +54,7 @@
 
     SkPaint paint;
     paint.setShader(make_shader(SkRect::MakeWH(N, N)));
-    
+
     canvas->drawPath(path, paint);
     return surface->makeImageSnapshot();
 }
@@ -63,7 +63,7 @@
     const SkScalar S = 16;    // amount to scale up
     const int D = 2;    // dimension scaling for the offscreen
     // since we only view the center, don't need to produce the entire thing
-    
+
     SkImageInfo info = SkImageInfo::MakeN32(orig->width() * D, orig->height() * D,
                                             kOpaque_SkAlphaType);
     auto surface(origSurf->makeSurface(info));
@@ -73,7 +73,7 @@
     canvas->translate(-SkScalarHalf(orig->width()) * (S - D) / S,
                       -SkScalarHalf(orig->height()) * (S - D) / S);
     canvas->drawImage(orig, 0, 0, nullptr);
-    
+
     if (S > 3) {
         SkPaint paint;
         paint.setColor(SK_ColorWHITE);
diff --git a/samplecode/SampleFontCache.cpp b/samplecode/SampleFontCache.cpp
index 5391d24..97c9565 100644
--- a/samplecode/SampleFontCache.cpp
+++ b/samplecode/SampleFontCache.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/samplecode/SampleFontScalerTest.cpp b/samplecode/SampleFontScalerTest.cpp
index 0105a47..ce3b81e 100644
--- a/samplecode/SampleFontScalerTest.cpp
+++ b/samplecode/SampleFontScalerTest.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/samplecode/SampleFuzz.cpp b/samplecode/SampleFuzz.cpp
index d1a696f..b8c800a 100644
--- a/samplecode/SampleFuzz.cpp
+++ b/samplecode/SampleFuzz.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/samplecode/SampleGradients.cpp b/samplecode/SampleGradients.cpp
index 5e9450e..19ba74b 100644
--- a/samplecode/SampleGradients.cpp
+++ b/samplecode/SampleGradients.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/samplecode/SampleHT.cpp b/samplecode/SampleHT.cpp
index 1989c3a..d0cd3a5 100644
--- a/samplecode/SampleHT.cpp
+++ b/samplecode/SampleHT.cpp
@@ -57,7 +57,7 @@
         fInterp = nullptr;
         fTime = 0;
     }
-    
+
     void spawnAnimation(SkMSec now) {
         this->setTime(now);
 
@@ -122,14 +122,14 @@
         W = 640,
         H = 480,
     };
-    
+
     struct Rec {
         HTDrawable* fDrawable;
     };
     Rec fArray[N];
     sk_sp<SkDrawable> fRoot;
     SkMSec fTime;
-    
+
     HTView() {
         SkRandom rand;
 
diff --git a/samplecode/SampleHairCurves.cpp b/samplecode/SampleHairCurves.cpp
index 2cf0b3c..967c4f2 100644
--- a/samplecode/SampleHairCurves.cpp
+++ b/samplecode/SampleHairCurves.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/samplecode/SampleLCD.cpp b/samplecode/SampleLCD.cpp
index 130a28c..862d935 100644
--- a/samplecode/SampleLCD.cpp
+++ b/samplecode/SampleLCD.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/samplecode/SampleLayers.cpp b/samplecode/SampleLayers.cpp
index b31c839..8c2724c 100644
--- a/samplecode/SampleLayers.cpp
+++ b/samplecode/SampleLayers.cpp
@@ -306,4 +306,3 @@
     typedef SampleView INHERITED;
 };
 DEF_SAMPLE( return new BackdropView; )
-
diff --git a/samplecode/SampleLighting.cpp b/samplecode/SampleLighting.cpp
index 1da888f..5171579 100755
--- a/samplecode/SampleLighting.cpp
+++ b/samplecode/SampleLighting.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2015 Google Inc.
  *
@@ -71,7 +70,7 @@
                                                nullptr, nullptr));
         paint.setColor(SK_ColorBLACK);
 
-        SkRect r = SkRect::MakeWH((SkScalar)fDiffuseBitmap.width(), 
+        SkRect r = SkRect::MakeWH((SkScalar)fDiffuseBitmap.width(),
                                   (SkScalar)fDiffuseBitmap.height());
         canvas->drawRect(r, paint);
 
diff --git a/samplecode/SampleManyRects.cpp b/samplecode/SampleManyRects.cpp
index 0290af2..950b983 100644
--- a/samplecode/SampleManyRects.cpp
+++ b/samplecode/SampleManyRects.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2013 Google Inc.
  *
diff --git a/samplecode/SampleMeasure.cpp b/samplecode/SampleMeasure.cpp
index 20335f2..dc771db 100644
--- a/samplecode/SampleMeasure.cpp
+++ b/samplecode/SampleMeasure.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/samplecode/SamplePath.cpp b/samplecode/SamplePath.cpp
index fec3b5e..12cc402 100644
--- a/samplecode/SamplePath.cpp
+++ b/samplecode/SamplePath.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
@@ -345,4 +344,3 @@
     typedef SampleView INHERITED;
 };
 DEF_SAMPLE( return new ArcToView; )
-
diff --git a/samplecode/SamplePathClip.cpp b/samplecode/SamplePathClip.cpp
index 02a613a..a53fe71 100644
--- a/samplecode/SamplePathClip.cpp
+++ b/samplecode/SamplePathClip.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
@@ -80,7 +79,7 @@
     if (p0.fY == p1.fY) {
         return 0;
     }
-    
+
     if (p0.fY > p1.fY) {
         SkTSwap(p0, p1);
     }
@@ -88,7 +87,7 @@
     if (p1.fY <= bounds.top() || p0.fY >= bounds.bottom()) {
         return 0;
     }
-    
+
     double dxdy = (double)(p1.fX - p0.fX) / (p1.fY - p0.fY);
     if (p0.fY < bounds.top()) {
         p0.fX = SkDoubleToScalar(p0.fX + dxdy * (bounds.top() - p0.fY));
@@ -98,14 +97,14 @@
         p1.fX = SkDoubleToScalar(p1.fX + dxdy * (bounds.bottom() - p1.fY));
         p1.fY = bounds.bottom();
     }
-    
+
     // Now p0...p1 is strictly inside bounds vertically, so we just need to clip horizontally
-    
+
     if (p0.fX > p1.fX) {
         SkTSwap(p0, p1);
     }
     // now we're left-to-right: p0 .. p1
-    
+
     if (p1.fX <= bounds.left()) {   // entirely to the left
         p0.fX = p1.fX = bounds.left();
         *edges++ = p0;
@@ -118,7 +117,7 @@
         *edges++ = p1;
         return 2;
     }
-    
+
     if (p0.fX < bounds.left()) {
         float y = SkDoubleToScalar(p0.fY + (bounds.left() - p0.fX) / dxdy);
         *edges++ = SkPoint::Make(bounds.left(), p0.fY);
@@ -157,7 +156,7 @@
     SkPoint fPoly[N];
     SkRect  fClip;
     SkColor fEdgeColor[N];
-    
+
     EdgeClipView() : fClip(SkRect::MakeLTRB(150, 150, 550, 450)) {
         fPoly[0].set(300, 40);
         fPoly[1].set(550, 250);
@@ -167,7 +166,7 @@
         fEdgeColor[1] = 0xFF00FF00;
         fEdgeColor[2] = 0xFF0000FF;
     }
-    
+
 protected:
     bool onQuery(SkEvent* evt) override {
         if (SampleCode::TitleQ(*evt)) {
@@ -240,21 +239,21 @@
         MyClick(SkView* view) : Click(view) {}
         virtual void handleMove() = 0;
     };
-    
+
     class VertClick : public MyClick {
         SkPoint* fPt;
     public:
         VertClick(SkView* view, SkPoint* pt) : MyClick(view), fPt(pt) {}
         void handleMove() override { *fPt = snap(fCurr); }
     };
-    
+
     class DragRectClick : public MyClick {
         SkRect* fRect;
     public:
         DragRectClick(SkView* view, SkRect* rect) : MyClick(view), fRect(rect) {}
         void handleMove() override { fRect->offset(fCurr.x() - fPrev.x(), fCurr.y() - fPrev.y()); }
     };
-    
+
     class DragPolyClick : public MyClick {
         SkPoint fSrc[100];
         SkPoint* fPoly;
@@ -294,7 +293,7 @@
                 return new VertClick(this, &fPoly[i]);
             }
         }
-        
+
         SkPath path;
         path.addPoly(fPoly, N, true);
         if (path.contains(x, y)) {
@@ -306,15 +305,14 @@
         }
         return new DoNothingClick(this);
     }
-    
+
     bool onClick(Click* click) override {
         ((MyClick*)click)->handleMove();
         this->inval(nullptr);
         return false;
     }
-    
+
 private:
     typedef SampleView INHERITED;
 };
 DEF_SAMPLE( return new EdgeClipView; )
-
diff --git a/samplecode/SamplePathFill.cpp b/samplecode/SamplePathFill.cpp
index 1a79d7f..2f0dc6f 100644
--- a/samplecode/SamplePathFill.cpp
+++ b/samplecode/SamplePathFill.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/samplecode/SamplePathFuzz.cpp b/samplecode/SamplePathFuzz.cpp
index d719826..05eb76f 100644
--- a/samplecode/SamplePathFuzz.cpp
+++ b/samplecode/SamplePathFuzz.cpp
@@ -698,5 +698,3 @@
 
 static SkView* MyFactory() { return new PathFuzzView; }
 static SkViewRegister reg(MyFactory);
-
-
diff --git a/samplecode/SamplePolyToPoly.cpp b/samplecode/SamplePolyToPoly.cpp
index 1283a23..6cb818a 100644
--- a/samplecode/SamplePolyToPoly.cpp
+++ b/samplecode/SamplePolyToPoly.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/samplecode/SampleQuadStroker.cpp b/samplecode/SampleQuadStroker.cpp
index 40f01fd..ab65ff6 100644
--- a/samplecode/SampleQuadStroker.cpp
+++ b/samplecode/SampleQuadStroker.cpp
@@ -393,7 +393,7 @@
             return;
         }
         SkRect bounds = path.getBounds();
-        this->setWHZ(SkScalarCeilToInt(bounds.right()), drawText 
+        this->setWHZ(SkScalarCeilToInt(bounds.right()), drawText
                 ? SkScalarRoundToInt(scale * 3 / 2) : SkScalarRoundToInt(scale),
                 SkScalarRoundToInt(950.0f / scale));
         erase(fMinSurface);
@@ -474,7 +474,7 @@
         path.reset();
         path.setFillType(SkPath::kEvenOdd_FillType);
         path.addCircle(center.fX, center.fY, maxSide + width / 2);
-        SkRect outside = SkRect::MakeXYWH(center.fX - maxSide - width, center.fY - maxSide - width, 
+        SkRect outside = SkRect::MakeXYWH(center.fX - maxSide - width, center.fY - maxSide - width,
                 (maxSide + width) * 2, (maxSide + width) * 2);
         path.addRect(outside);
         canvas->drawPath(path, paint);
@@ -648,7 +648,7 @@
                 if (fArcButton.fEnabled) {
                     SkPoint center;
                     if (arcCenter(&center)) {
-                        r.set(center.fX - fRadius, center.fY - fRadius, center.fX + fRadius, 
+                        r.set(center.fX - fRadius, center.fY - fRadius, center.fX + fRadius,
                                 center.fY + fRadius);
                     }
                 }
diff --git a/samplecode/SampleRectanizer.cpp b/samplecode/SampleRectanizer.cpp
index 55e70a2..4ff28b2 100644
--- a/samplecode/SampleRectanizer.cpp
+++ b/samplecode/SampleRectanizer.cpp
@@ -100,7 +100,7 @@
 
         long totArea = 0;
         for (int i = 0; i < fCurRandRect; ++i) {
-            r = SkRect::MakeXYWH(SkIntToScalar(fRectLocations[i].fX), 
+            r = SkRect::MakeXYWH(SkIntToScalar(fRectLocations[i].fX),
                                  SkIntToScalar(fRectLocations[i].fY),
                                  SkIntToScalar((*fCurRects)[i].fWidth),
                                  SkIntToScalar((*fCurRects)[i].fHeight));
diff --git a/samplecode/SampleRepeatTile.cpp b/samplecode/SampleRepeatTile.cpp
index 598a088..f56492d 100644
--- a/samplecode/SampleRepeatTile.cpp
+++ b/samplecode/SampleRepeatTile.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/samplecode/SampleShip.cpp b/samplecode/SampleShip.cpp
index daaf5e3..1335c31 100644
--- a/samplecode/SampleShip.cpp
+++ b/samplecode/SampleShip.cpp
@@ -35,7 +35,7 @@
     for (int i = 0; i < count; ++i) {
         SkMatrix matrix;
         matrix.setRSXform(xform[i]);
-        
+
         canvas->save();
         canvas->concat(matrix);
         canvas->drawImageRect(atlas, tex[i], tex[i].makeOffset(-tex[i].x(), -tex[i].y()), paint,
@@ -58,7 +58,7 @@
                 return;
             }
         }
-        
+
         SkScalar anchorX = fAtlas->width()*0.5f;
         SkScalar anchorY = fAtlas->height()*0.5f;
         int currIndex = 0;
@@ -66,7 +66,7 @@
             for (int y = 0; y < kGrid; y++) {
                 float xPos = (x / (kGrid - 1.0f)) * kWidth;
                 float yPos = (y / (kGrid - 1.0f)) * kWidth;
-                
+
                 fTex[currIndex] = SkRect::MakeLTRB(0.0f, 0.0f,
                                                    SkIntToScalar(fAtlas->width()),
                                                    SkIntToScalar(fAtlas->height()));
@@ -80,13 +80,13 @@
                                            SkIntToScalar(fAtlas->height()));
         fXform[currIndex] = SkRSXform::MakeFromRadians(0.5f, SK_ScalarPI*0.5f,
                                                        kWidth*0.5f, kHeight*0.5f, anchorX, anchorY);
-        
+
         fCurrentTime = 0;
         fTimer.start();
     }
 
     ~DrawShipView() override {}
-    
+
 protected:
     // overrides from SkEventSink
     bool onQuery(SkEvent* evt) override {
@@ -96,25 +96,25 @@
         }
         return this->INHERITED::onQuery(evt);
     }
-    
+
     void onDrawContent(SkCanvas* canvas) override {
         const float kCosDiff = 0.99984769515f;
         const float kSinDiff = 0.01745240643f;
-        
+
         if (!fAtlas) {
             return;
         }
-        
+
         SkPaint paint;
         paint.setFilterQuality(kLow_SkFilterQuality);
         paint.setColor(SK_ColorWHITE);
         paint.setTextSize(15.0f);
-        
+
         fTimer.end();
-        
+
         fTimes[fCurrentTime] = (float)(fTimer.fWall);
         fCurrentTime = (fCurrentTime + 1) & 0x1f;
-        
+
         float meanTime = 0.0f;
         for (int i = 0; i < 32; ++i) {
             meanTime += fTimes[i];
@@ -125,27 +125,27 @@
         outString.appendScalar(fps);
         outString.append(" ms: ");
         outString.appendScalar(meanTime);
-        
+
         fTimer.start();
-        
+
         SkScalar anchorX = fAtlas->width()*0.5f;
         SkScalar anchorY = fAtlas->height()*0.5f;
         for (int i = 0; i < kGrid*kGrid+1; ++i) {
             SkScalar c = fXform[i].fSCos;
             SkScalar s = fXform[i].fSSin;
-            
+
             SkScalar dx = c*anchorX - s*anchorY;
             SkScalar dy = s*anchorX + c*anchorY;
-            
+
             fXform[i].fSCos = kCosDiff*c - kSinDiff*s;
             fXform[i].fSSin = kSinDiff*c + kCosDiff*s;
-            
+
             dx -= fXform[i].fSCos*anchorX - fXform[i].fSSin*anchorY;
             dy -= fXform[i].fSSin*anchorX + fXform[i].fSCos*anchorY;
             fXform[i].fTx += dx;
             fXform[i].fTy += dy;
         }
-        
+
         fProc(canvas, fAtlas.get(), fXform, fTex, nullptr, kGrid*kGrid+1, nullptr, &paint);
         paint.setColor(SK_ColorBLACK);
         canvas->drawRect(SkRect::MakeXYWH(0, 0, 200, 24), paint);
@@ -167,15 +167,15 @@
 private:
     const char*         fName;
     DrawAtlasProc       fProc;
-    
+
     sk_sp<SkImage> fAtlas;
     SkRSXform   fXform[kGrid*kGrid+1];
     SkRect      fTex[kGrid*kGrid+1];
     WallTimer   fTimer;
     float       fTimes[32];
     int         fCurrentTime;
-    
-    
+
+
     typedef SampleView INHERITED;
 };
 
diff --git a/samplecode/SampleSkLayer.cpp b/samplecode/SampleSkLayer.cpp
index c57a281..0422561 100644
--- a/samplecode/SampleSkLayer.cpp
+++ b/samplecode/SampleSkLayer.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/samplecode/SampleSlides.cpp b/samplecode/SampleSlides.cpp
index 9b054ad..b4ebb3c 100644
--- a/samplecode/SampleSlides.cpp
+++ b/samplecode/SampleSlides.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/samplecode/SampleStrokePath.cpp b/samplecode/SampleStrokePath.cpp
index 9bcfcd9..f3cdee3 100644
--- a/samplecode/SampleStrokePath.cpp
+++ b/samplecode/SampleStrokePath.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/samplecode/SampleStrokeRect.cpp b/samplecode/SampleStrokeRect.cpp
index 59e0a46..a0cc5b2 100644
--- a/samplecode/SampleStrokeRect.cpp
+++ b/samplecode/SampleStrokeRect.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/samplecode/SampleTextAlpha.cpp b/samplecode/SampleTextAlpha.cpp
index 6e2e950..a57c016 100644
--- a/samplecode/SampleTextAlpha.cpp
+++ b/samplecode/SampleTextAlpha.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/samplecode/SampleTextBox.cpp b/samplecode/SampleTextBox.cpp
index aedeaf6..8540ca4 100644
--- a/samplecode/SampleTextBox.cpp
+++ b/samplecode/SampleTextBox.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/samplecode/SampleTextOnPath.cpp b/samplecode/SampleTextOnPath.cpp
index 7c71084..63b7ef2 100644
--- a/samplecode/SampleTextOnPath.cpp
+++ b/samplecode/SampleTextOnPath.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/samplecode/SampleTiling.cpp b/samplecode/SampleTiling.cpp
index dbc7d09..84346b0 100644
--- a/samplecode/SampleTiling.cpp
+++ b/samplecode/SampleTiling.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/samplecode/SampleVertices.cpp b/samplecode/SampleVertices.cpp
index 985ef60..0d43962 100644
--- a/samplecode/SampleVertices.cpp
+++ b/samplecode/SampleVertices.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/samplecode/SampleWritePixels.cpp b/samplecode/SampleWritePixels.cpp
index bce7980..912567d 100644
--- a/samplecode/SampleWritePixels.cpp
+++ b/samplecode/SampleWritePixels.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/samplecode/SampleXfer.cpp b/samplecode/SampleXfer.cpp
index 58546e1..6aaffe5 100644
--- a/samplecode/SampleXfer.cpp
+++ b/samplecode/SampleXfer.cpp
@@ -57,7 +57,7 @@
         fColor = (gRand.nextU() & 0x7F7F7F7F) | SkColorSetARGB(0xFF, 0, 0, 0x80);
         fFast32 = fast;
     }
-    
+
 protected:
     void onPrepareWidEvent(SkEvent* evt) override {
         evt->setType("push-button");
@@ -101,7 +101,7 @@
         }
         return true;
     }
-    
+
 private:
     typedef HasEventWig INHERITED;
 };
@@ -151,7 +151,7 @@
     enum {
         N = 4
     };
-    
+
     SkRect        fModeRect[N_Modes];
     SkAutoTUnref<CircDrawable> fDrs[N];
     CircDrawable* fSelected;
@@ -234,7 +234,7 @@
         this->inval(nullptr);
         return fSelected ? new Click(this) : nullptr;
     }
-    
+
     bool onClick(Click* click) override {
         fSelected->fLoc.fX += click->fCurr.fX - click->fPrev.fX;
         fSelected->fLoc.fY += click->fCurr.fY - click->fPrev.fY;
diff --git a/samplecode/vertexdump.cpp b/samplecode/vertexdump.cpp
index 9bfb0ce..69fd967 100644
--- a/samplecode/vertexdump.cpp
+++ b/samplecode/vertexdump.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/src/core/SkAAClip.cpp b/src/core/SkAAClip.cpp
index 71d212a..f71d7b6 100644
--- a/src/core/SkAAClip.cpp
+++ b/src/core/SkAAClip.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/src/core/SkAAClip.h b/src/core/SkAAClip.h
index 0207233..7b29ef1 100644
--- a/src/core/SkAAClip.h
+++ b/src/core/SkAAClip.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/src/core/SkAdvancedTypefaceMetrics.cpp b/src/core/SkAdvancedTypefaceMetrics.cpp
index 48b2cd7..ce2c15b 100644
--- a/src/core/SkAdvancedTypefaceMetrics.cpp
+++ b/src/core/SkAdvancedTypefaceMetrics.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/src/core/SkAdvancedTypefaceMetrics.h b/src/core/SkAdvancedTypefaceMetrics.h
index 424e5f3..329b7d1 100644
--- a/src/core/SkAdvancedTypefaceMetrics.h
+++ b/src/core/SkAdvancedTypefaceMetrics.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/src/core/SkAlphaRuns.cpp b/src/core/SkAlphaRuns.cpp
index 37b1a57..37f57c1 100644
--- a/src/core/SkAlphaRuns.cpp
+++ b/src/core/SkAlphaRuns.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/core/SkAntiRun.h b/src/core/SkAntiRun.h
index d49a723..8214e28 100644
--- a/src/core/SkAntiRun.h
+++ b/src/core/SkAntiRun.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/core/SkAutoKern.h b/src/core/SkAutoKern.h
index 27df6da..8b03251 100644
--- a/src/core/SkAutoKern.h
+++ b/src/core/SkAutoKern.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/core/SkAutoPixmapStorage.cpp b/src/core/SkAutoPixmapStorage.cpp
index c0e9c3c..865b3a6 100644
--- a/src/core/SkAutoPixmapStorage.cpp
+++ b/src/core/SkAutoPixmapStorage.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2016 Google Inc.
  *
@@ -57,4 +56,3 @@
 
     return data.release();
 }
-
diff --git a/src/core/SkAutoPixmapStorage.h b/src/core/SkAutoPixmapStorage.h
index 1a07a97..379bf42 100644
--- a/src/core/SkAutoPixmapStorage.h
+++ b/src/core/SkAutoPixmapStorage.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2016 Google Inc.
  *
diff --git a/src/core/SkBitmapController.cpp b/src/core/SkBitmapController.cpp
index eabf135..ac1029d 100644
--- a/src/core/SkBitmapController.cpp
+++ b/src/core/SkBitmapController.cpp
@@ -49,7 +49,7 @@
 private:
     SkBitmap                     fResultBitmap;
     SkAutoTUnref<const SkMipMap> fCurrMip;
-    
+
     bool processHQRequest(const SkBitmapProvider&);
     bool processMediumRequest(const SkBitmapProvider&);
 };
@@ -77,17 +77,17 @@
     if (fQuality != kHigh_SkFilterQuality) {
         return false;
     }
-    
+
     // Our default return state is to downgrade the request to Medium, w/ or w/o setting fBitmap
     // to a valid bitmap. If we succeed, we will set this to Low instead.
     fQuality = kMedium_SkFilterQuality;
-    
+
     if (kN32_SkColorType != provider.info().colorType() || !cache_size_okay(provider, fInvMatrix) ||
         fInvMatrix.hasPerspective())
     {
         return false; // can't handle the reqeust
     }
-    
+
     SkScalar invScaleX = fInvMatrix.getScaleX();
     SkScalar invScaleY = fInvMatrix.getScaleY();
     if (fInvMatrix.getType() & SkMatrix::kAffine_Mask) {
@@ -126,7 +126,7 @@
                                     dstW, dstH, SkResourceCache::GetAllocator())) {
             return false; // we failed to create fScaledBitmap
         }
-        
+
         SkASSERT(fResultBitmap.getPixels());
         fResultBitmap.setImmutable();
         if (!provider.isVolatile()) {
@@ -135,9 +135,9 @@
             }
         }
     }
-    
+
     SkASSERT(fResultBitmap.getPixels());
-    
+
     fInvMatrix.postScale(SkIntToScalar(dstW) / provider.width(),
                          SkIntToScalar(dstH) / provider.height());
     fQuality = kLow_SkFilterQuality;
@@ -153,11 +153,11 @@
     if (fQuality != kMedium_SkFilterQuality) {
         return false;
     }
-    
+
     // Our default return state is to downgrade the request to Low, w/ or w/o setting fBitmap
     // to a valid bitmap.
     fQuality = kLow_SkFilterQuality;
-    
+
     SkSize invScaleSize;
     if (!fInvMatrix.decomposeScale(&invScaleSize, nullptr)) {
         return false;
@@ -179,7 +179,7 @@
         if (nullptr == fCurrMip->data()) {
             sk_throw();
         }
-        
+
         const SkSize scale = SkSize::Make(SkScalarInvert(invScaleSize.width()),
                                           SkScalarInvert(invScaleSize.height()));
         SkMipMap::Level level;
@@ -225,4 +225,3 @@
                                                                       void* storage, size_t size) {
     return SkInPlaceNewCheck<SkDefaultBitmapControllerState>(storage, size, bm, inverse, quality);
 }
-
diff --git a/src/core/SkBitmapController.h b/src/core/SkBitmapController.h
index 32e73e8..86b8755 100644
--- a/src/core/SkBitmapController.h
+++ b/src/core/SkBitmapController.h
@@ -27,12 +27,12 @@
         const SkPixmap& pixmap() const { return fPixmap; }
         const SkMatrix& invMatrix() const { return fInvMatrix; }
         SkFilterQuality quality() const { return fQuality; }
-    
+
     protected:
         SkPixmap        fPixmap;
         SkMatrix        fInvMatrix;
         SkFilterQuality fQuality;
-    
+
     private:
         friend class SkBitmapController;
     };
@@ -56,7 +56,7 @@
 class SkDefaultBitmapController : public SkBitmapController {
 public:
     SkDefaultBitmapController() {}
-    
+
 protected:
     State* onRequestBitmap(const SkBitmapProvider&, const SkMatrix& inverse, SkFilterQuality,
                            void* storage, size_t storageSize) override;
diff --git a/src/core/SkBitmapHeap.cpp b/src/core/SkBitmapHeap.cpp
index c65a704..071647e 100644
--- a/src/core/SkBitmapHeap.cpp
+++ b/src/core/SkBitmapHeap.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2012 Google Inc.
  *
diff --git a/src/core/SkBitmapProcState.cpp b/src/core/SkBitmapProcState.cpp
index ab23212..fc74911 100644
--- a/src/core/SkBitmapProcState.cpp
+++ b/src/core/SkBitmapProcState.cpp
@@ -824,4 +824,3 @@
         }
     }
 }
-
diff --git a/src/core/SkBitmapProcState_filter.h b/src/core/SkBitmapProcState_filter.h
index 99f40ec..dfc18d8 100644
--- a/src/core/SkBitmapProcState_filter.h
+++ b/src/core/SkBitmapProcState_filter.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2009 The Android Open Source Project
  *
diff --git a/src/core/SkBitmapProcState_matrix.h b/src/core/SkBitmapProcState_matrix.h
index 860e27a..7e2e44b 100644
--- a/src/core/SkBitmapProcState_matrix.h
+++ b/src/core/SkBitmapProcState_matrix.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/src/core/SkBitmapProvider.cpp b/src/core/SkBitmapProvider.cpp
index 9cf2e9a..9f6eb94 100644
--- a/src/core/SkBitmapProvider.cpp
+++ b/src/core/SkBitmapProvider.cpp
@@ -84,4 +84,3 @@
         return true;
     }
 }
-
diff --git a/src/core/SkBitmapScaler.cpp b/src/core/SkBitmapScaler.cpp
index e3face8..398e20c 100644
--- a/src/core/SkBitmapScaler.cpp
+++ b/src/core/SkBitmapScaler.cpp
@@ -263,4 +263,3 @@
     SkASSERT(resultPtr->getPixels());
     return true;
 }
-
diff --git a/src/core/SkBlitBWMaskTemplate.h b/src/core/SkBlitBWMaskTemplate.h
index accf498..b0b9358 100644
--- a/src/core/SkBlitBWMaskTemplate.h
+++ b/src/core/SkBlitBWMaskTemplate.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/core/SkBlitter.h b/src/core/SkBlitter.h
index 8711f1a..0095826 100644
--- a/src/core/SkBlitter.h
+++ b/src/core/SkBlitter.h
@@ -59,7 +59,7 @@
     virtual void blitAntiH2(int x, int y, U8CPU a0, U8CPU a1) {
         int16_t runs[3];
         uint8_t aa[2];
-        
+
         runs[0] = 1;
         runs[1] = 1;
         runs[2] = 0;
@@ -72,7 +72,7 @@
     virtual void blitAntiV2(int x, int y, U8CPU a0, U8CPU a1) {
         int16_t runs[2];
         uint8_t aa[1];
-        
+
         runs[0] = 1;
         runs[1] = 0;
         aa[0] = SkToU8(a0);
@@ -83,7 +83,7 @@
         aa[0] = SkToU8(a1);
         this->blitAntiH(x, y + 1, aa, runs);
     }
-    
+
     /**
      *  Special method just to identify the null blitter, which is returned
      *  from Choose() if the request cannot be fulfilled. Default impl
diff --git a/src/core/SkBlitter_A8.cpp b/src/core/SkBlitter_A8.cpp
index 51748b0..57587c6 100644
--- a/src/core/SkBlitter_A8.cpp
+++ b/src/core/SkBlitter_A8.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/core/SkBlitter_PM4f.cpp b/src/core/SkBlitter_PM4f.cpp
index b7d8e7f..820d72c 100644
--- a/src/core/SkBlitter_PM4f.cpp
+++ b/src/core/SkBlitter_PM4f.cpp
@@ -26,17 +26,17 @@
 
     void blitH(int x, int y, int width) override {
         SkASSERT(x >= 0 && y >= 0 && x + width <= fDevice.width());
-        
+
         fState.fProc1(fState.fXfer, State::WritableAddr(fDevice, x, y),
                       &fState.fPM4f, width, nullptr);
     }
 
     void blitV(int x, int y, int height, SkAlpha alpha) override {
         SkASSERT(x >= 0 && y >= 0 && y + height <= fDevice.height());
-        
+
         typename State::DstType* device = State::WritableAddr(fDevice, x, y);
         size_t                 deviceRB = fDevice.rowBytes();
-        
+
         for (int i = 0; i < height; ++i) {
             fState.fProc1(fState.fXfer, device, &fState.fPM4f, 1, &alpha);
             device = (typename State::DstType*)((char*)device + deviceRB);
@@ -46,10 +46,10 @@
     void blitRect(int x, int y, int width, int height) override {
         SkASSERT(x >= 0 && y >= 0 &&
                  x + width <= fDevice.width() && y + height <= fDevice.height());
-        
+
         typename State::DstType* device = State::WritableAddr(fDevice, x, y);
         size_t        deviceRB = fDevice.rowBytes();
-        
+
         do {
             fState.fProc1(fState.fXfer, device, &fState.fPM4f, width, nullptr);
             y += 1;
@@ -59,7 +59,7 @@
 
     void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]) override {
         typename State::DstType* device = State::WritableAddr(fDevice, x, y);
-        
+
         for (;;) {
             int count = *runs;
             if (count <= 0) {
@@ -84,24 +84,24 @@
 
     void blitLCDMask(const SkMask& mask, const SkIRect& clip) {
         auto proc = fState.getLCDProc(SkXfermode::kSrcIsSingle_LCDFlag);
-        
+
         const int x = clip.fLeft;
         const int width = clip.width();
         const int y = clip.fTop;
         const int height = clip.height();
-        
+
         typename State::DstType* device = State::WritableAddr(fDevice, x, y);
         const size_t dstRB = fDevice.rowBytes();
         const uint16_t* maskRow = (const uint16_t*)mask.getAddr(x, y);
         const size_t maskRB = mask.fRowBytes;
-        
+
         for (int i = 0; i < height; ++i) {
             proc(device, &fState.fPM4f, width, maskRow);
             device = (typename State::DstType*)((char*)device + dstRB);
             maskRow = (const uint16_t*)((const char*)maskRow + maskRB);
         }
     }
-    
+
     void blitMask(const SkMask& mask, const SkIRect& clip) override {
         if (SkMask::kLCD16_Format == mask.fFormat) {
             this->blitLCDMask(mask, clip);
@@ -111,19 +111,19 @@
             this->INHERITED::blitMask(mask, clip);
             return;
         }
-        
+
         SkASSERT(mask.fBounds.contains(clip));
-        
+
         const int x = clip.fLeft;
         const int width = clip.width();
         const int y = clip.fTop;
         const int height = clip.height();
-        
+
         typename State::DstType* device = State::WritableAddr(fDevice, x, y);
         const size_t dstRB = fDevice.rowBytes();
         const uint8_t* maskRow = (const uint8_t*)mask.getAddr(x, y);
         const size_t maskRB = mask.fRowBytes;
-        
+
         for (int i = 0; i < height; ++i) {
             fState.fProc1(fState.fXfer, device, &fState.fPM4f, width, maskRow);
             device = (typename State::DstType*)((char*)device + dstRB);
@@ -144,10 +144,10 @@
         , fBlitBW(bstate.fBlitBW)
         , fBlitAA(bstate.fBlitAA)
     {}
-    
+
     void blitH(int x, int y, int width) override {
         SkASSERT(x >= 0 && y >= 0 && x + width <= fDevice.width());
-        
+
         if (fBlitBW) {
             fBlitBW(&fBState, x, y, fDevice, width);
             return;
@@ -170,7 +170,7 @@
 
         typename State::DstType* device = State::WritableAddr(fDevice, x, y);
         size_t                   deviceRB = fDevice.rowBytes();
-        
+
         if (fConstInY) {
             fShaderContext->shadeSpan4f(x, y, fState.fBuffer, 1);
         }
@@ -186,17 +186,17 @@
     void blitRect(int x, int y, int width, int height) override {
         SkASSERT(x >= 0 && y >= 0 &&
                  x + width <= fDevice.width() && y + height <= fDevice.height());
-        
+
         if (fBlitBW) {
             for (const int bottom = y + height; y < bottom; ++y) {
                 fBlitBW(&fBState, x, y, fDevice, width);
             }
             return;
         }
-        
+
         typename State::DstType* device = State::WritableAddr(fDevice, x, y);
         size_t                   deviceRB = fDevice.rowBytes();
-        
+
         if (fConstInY) {
             fShaderContext->shadeSpan4f(x, y, fState.fBuffer, width);
         }
@@ -211,7 +211,7 @@
 
     void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]) override {
         typename State::DstType* device = State::WritableAddr(fDevice, x, y);
-        
+
         for (;;) {
             int count = *runs;
             if (count <= 0) {
@@ -241,16 +241,16 @@
 
     void blitLCDMask(const SkMask& mask, const SkIRect& clip) {
         auto proc = fState.getLCDProc(0);
-        
+
         const int x = clip.fLeft;
         const int width = clip.width();
         int y = clip.fTop;
-        
+
         typename State::DstType* device = State::WritableAddr(fDevice, x, y);
         const size_t deviceRB = fDevice.rowBytes();
         const uint16_t* maskRow = (const uint16_t*)mask.getAddr(x, y);
         const size_t maskRB = mask.fRowBytes;
-        
+
         if (fConstInY) {
             fShaderContext->shadeSpan4f(x, y, fState.fBuffer, width);
         }
@@ -292,7 +292,7 @@
 
         typename State::DstType* device = State::WritableAddr(fDevice, x, y);
         const size_t deviceRB = fDevice.rowBytes();
-        
+
         if (fConstInY) {
             fShaderContext->shadeSpan4f(x, y, fState.fBuffer, width);
         }
@@ -305,7 +305,7 @@
             maskRow += maskRB;
         }
     }
-    
+
 protected:
     State                        fState;
     SkShader::Context::BlitState fBState;
@@ -344,10 +344,10 @@
 
 struct State32 : State4f {
     typedef uint32_t    DstType;
-    
+
     SkXfermode::D32Proc fProc1;
     SkXfermode::D32Proc fProcN;
-    
+
     State32(const SkImageInfo& info, const SkPaint& paint, const SkShader::Context* shaderContext)
         : State4f(info, paint, shaderContext)
     {
@@ -360,7 +360,7 @@
         fProc1 = SkXfermode::GetD32Proc(fXfer, fFlags | SkXfermode::kSrcIsSingle_D32Flag);
         fProcN = SkXfermode::GetD32Proc(fXfer, fFlags);
     }
-    
+
     SkXfermode::LCD32Proc getLCDProc(uint32_t oneOrManyFlag) const {
         uint32_t flags = fFlags & 1;
         if (!(fFlags & SkXfermode::kDstIsSRGB_D32Flag)) {
@@ -376,10 +376,10 @@
 
 struct State64 : State4f {
     typedef uint64_t    DstType;
-    
+
     SkXfermode::D64Proc fProc1;
     SkXfermode::D64Proc fProcN;
-    
+
     State64(const SkImageInfo& info, const SkPaint& paint, const SkShader::Context* shaderContext)
         : State4f(info, paint, shaderContext)
     {
@@ -400,7 +400,7 @@
         }
         return SkXfermode::GetLCD64Proc(flags | oneOrManyFlag);
     }
-    
+
     static DstType* WritableAddr(const SkPixmap& device, int x, int y) {
         return device.writable_addr64(x, y);
     }
diff --git a/src/core/SkBuffer.h b/src/core/SkBuffer.h
index 92ed705..c466fb6 100644
--- a/src/core/SkBuffer.h
+++ b/src/core/SkBuffer.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/core/SkCachedData.cpp b/src/core/SkCachedData.cpp
index cfa4c61..1ea232b 100644
--- a/src/core/SkCachedData.cpp
+++ b/src/core/SkCachedData.cpp
@@ -98,7 +98,7 @@
     if ((1 == fRefCnt) && fInCache) {
         this->inMutexLock();
     }
-    
+
     fRefCnt += 1;
     if (fromCache) {
         SkASSERT(!fInCache);
@@ -125,22 +125,22 @@
         default:
             break;
     }
-    
+
     if (fromCache) {
         SkASSERT(fInCache);
         fInCache = false;
     }
-    
+
     // return true when we need to be deleted
     return 0 == fRefCnt;
 }
 
 void SkCachedData::inMutexLock() {
     fMutex.assertHeld();
-    
+
     SkASSERT(!fIsLocked);
     fIsLocked = true;
-    
+
     switch (fStorageType) {
         case kMalloc_StorageType:
             this->setData(fStorage.fMalloc);
@@ -159,10 +159,10 @@
 
 void SkCachedData::inMutexUnlock() {
     fMutex.assertHeld();
-    
+
     SkASSERT(fIsLocked);
     fIsLocked = false;
-    
+
     switch (fStorageType) {
         case kMalloc_StorageType:
             // nothing to do/check
diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp
index 6a11db5..258343a 100644
--- a/src/core/SkCanvas.cpp
+++ b/src/core/SkCanvas.cpp
@@ -2235,7 +2235,7 @@
             return;
         }
     }
-    
+
     SkLazyPaint lazy;
     if (nullptr == paint) {
         paint = lazy.init();
@@ -2272,7 +2272,7 @@
             iter.fDevice->drawImage(iter, image, x, y, pnt);
         }
     }
-    
+
     LOOPER_END
 }
 
@@ -2292,14 +2292,14 @@
     if (nullptr == paint) {
         paint = lazy.init();
     }
-    
+
     LOOPER_BEGIN_CHECK_COMPLETE_OVERWRITE(*paint, SkDrawFilter::kBitmap_Type, &dst,
                                           image->isOpaque())
-    
+
     while (iter.next()) {
         iter.fDevice->drawImageRect(iter, image, src, dst, looper.paint(), constraint);
     }
-    
+
     LOOPER_END
 }
 
@@ -2397,25 +2397,25 @@
 void SkCanvas::onDrawImageNine(const SkImage* image, const SkIRect& center, const SkRect& dst,
                                const SkPaint* paint) {
     TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawImageNine()");
-    
+
     if (nullptr == paint || paint->canComputeFastBounds()) {
         SkRect storage;
         if (this->quickReject(paint ? paint->computeFastBounds(dst, &storage) : dst)) {
             return;
         }
     }
-    
+
     SkLazyPaint lazy;
     if (nullptr == paint) {
         paint = lazy.init();
     }
-    
+
     LOOPER_BEGIN(*paint, SkDrawFilter::kBitmap_Type, &dst)
-    
+
     while (iter.next()) {
         iter.fDevice->drawImageNine(iter, image, center, dst, looper.paint());
     }
-    
+
     LOOPER_END
 }
 
@@ -2430,18 +2430,18 @@
             return;
         }
     }
-    
+
     SkLazyPaint lazy;
     if (nullptr == paint) {
         paint = lazy.init();
     }
-    
+
     LOOPER_BEGIN(*paint, SkDrawFilter::kBitmap_Type, &dst)
-    
+
     while (iter.next()) {
         iter.fDevice->drawBitmapNine(iter, bitmap, center, dst, looper.paint());
     }
-    
+
     LOOPER_END
 }
 
@@ -2740,7 +2740,7 @@
     if (paint) {
         pnt = *paint;
     }
-    
+
     LOOPER_BEGIN(pnt, SkDrawFilter::kPath_Type, nullptr)
     while (iter.next()) {
         iter.fDevice->drawAtlas(iter, atlas, xform, tex, colors, count, mode, pnt);
diff --git a/src/core/SkChunkAlloc.cpp b/src/core/SkChunkAlloc.cpp
index 3f30276..8c5b8fb 100644
--- a/src/core/SkChunkAlloc.cpp
+++ b/src/core/SkChunkAlloc.cpp
@@ -23,7 +23,7 @@
     char*   fFreePtr;
     // data[] follows
 
-    size_t blockSize() { 
+    size_t blockSize() {
         char* start = this->startOfData();
         size_t bytes = fFreePtr - start;
         return fFreeSize + bytes;
@@ -232,4 +232,3 @@
     SkASSERT(totCapacity == totUsed + totLost + totAvailable);
 }
 #endif
-
diff --git a/src/core/SkColorFilter.cpp b/src/core/SkColorFilter.cpp
index 59a625d..3e0a2ec 100644
--- a/src/core/SkColorFilter.cpp
+++ b/src/core/SkColorFilter.cpp
@@ -78,17 +78,17 @@
         // Can only claim alphaunchanged and SkPM4f support if both our proxys do.
         return fOuter->getFlags() & fInner->getFlags();
     }
-    
+
     void filterSpan(const SkPMColor shader[], int count, SkPMColor result[]) const override {
         fInner->filterSpan(shader, count, result);
         fOuter->filterSpan(result, count, result);
     }
-    
+
     void filterSpan4f(const SkPM4f shader[], int count, SkPM4f result[]) const override {
         fInner->filterSpan4f(shader, count, result);
         fOuter->filterSpan4f(result, count, result);
     }
-    
+
 #ifndef SK_IGNORE_TO_STRING
     void toString(SkString* str) const override {
         SkString outerS, innerS;
@@ -111,13 +111,13 @@
 #endif
 
     SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkComposeColorFilter)
-    
+
 protected:
     void flatten(SkWriteBuffer& buffer) const override {
         buffer.writeFlattenable(fOuter.get());
         buffer.writeFlattenable(fInner.get());
     }
-    
+
 private:
     SkComposeColorFilter(sk_sp<SkColorFilter> outer, sk_sp<SkColorFilter> inner,
                          int composedFilterCount)
@@ -178,4 +178,3 @@
 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkComposeColorFilter)
 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkModeColorFilter)
 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END
-
diff --git a/src/core/SkColorFilterShader.h b/src/core/SkColorFilterShader.h
index 167a272..e42d06c 100644
--- a/src/core/SkColorFilterShader.h
+++ b/src/core/SkColorFilterShader.h
@@ -27,9 +27,9 @@
         // Takes ownership of shaderContext and calls its destructor.
         FilterShaderContext(const SkColorFilterShader&, SkShader::Context*, const ContextRec&);
         virtual ~FilterShaderContext();
-        
+
         uint32_t getFlags() const override;
-        
+
         void shadeSpan(int x, int y, SkPMColor[], int count) override;
         void shadeSpan4f(int x, int y, SkPM4f[], int count) override;
 
@@ -37,25 +37,25 @@
             // forward to our proxy
             fShaderContext->set3DMask(mask);
         }
-        
+
     private:
         SkShader::Context* fShaderContext;
-        
+
         typedef SkShader::Context INHERITED;
     };
-    
+
     SK_TO_STRING_OVERRIDE()
     SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkColorFilterShader)
-    
+
 protected:
     void flatten(SkWriteBuffer&) const override;
     size_t onContextSize(const ContextRec&) const override;
     Context* onCreateContext(const ContextRec&, void* storage) const override;
-    
+
 private:
     sk_sp<SkShader>      fShader;
     sk_sp<SkColorFilter> fFilter;
-    
+
     typedef SkShader INHERITED;
 };
 
diff --git a/src/core/SkColorTable.cpp b/src/core/SkColorTable.cpp
index d11ef78..d7253e1 100644
--- a/src/core/SkColorTable.cpp
+++ b/src/core/SkColorTable.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2009 The Android Open Source Project
  *
@@ -109,4 +108,3 @@
 
     return new SkColorTable(colors.release(), count, kAllocatedWithMalloc);
 }
-
diff --git a/src/core/SkComposeShader.h b/src/core/SkComposeShader.h
index ee6e36a..8ea7c67 100644
--- a/src/core/SkComposeShader.h
+++ b/src/core/SkComposeShader.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/core/SkConfig8888.cpp b/src/core/SkConfig8888.cpp
index e2dd102..5bac16a 100644
--- a/src/core/SkConfig8888.cpp
+++ b/src/core/SkConfig8888.cpp
@@ -129,7 +129,7 @@
 static void copy_g8_to_32(void* dst, size_t dstRB, const void* src, size_t srcRB, int w, int h) {
     uint32_t* dst32 = (uint32_t*)dst;
     const uint8_t* src8 = (const uint8_t*)src;
-    
+
     for (int y = 0; y < h; ++y) {
         for (int x = 0; x < w; ++x) {
             dst32[x] = SkPackARGB32(0xFF, src8[x], src8[x], src8[x]);
@@ -173,10 +173,10 @@
     if (srcInfo.dimensions() != dstInfo.dimensions()) {
         return false;
     }
-    
+
     const int width = srcInfo.width();
     const int height = srcInfo.height();
-    
+
     // Do the easiest one first : both configs are equal
     if ((srcInfo == dstInfo) && !ctable) {
         size_t bytes = width * srcInfo.bytesPerPixel();
@@ -303,4 +303,3 @@
         return true;
     }
 }
-
diff --git a/src/core/SkCoreBlitters.h b/src/core/SkCoreBlitters.h
index 06e106d..ec9ee20 100644
--- a/src/core/SkCoreBlitters.h
+++ b/src/core/SkCoreBlitters.h
@@ -171,17 +171,17 @@
     void blitRect(int x, int y, int width, int height) override;
     void blitAntiH(int x, int y, const SkAlpha[], const int16_t[]) override;
     void blitMask(const SkMask&, const SkIRect&) override;
-    
+
 private:
     SkXfermode*         fXfermode;
     SkPMColor*          fBuffer;
     SkBlitRow::Proc32   fProc32;
     SkBlitRow::Proc32   fProc32Blend;
     bool                fShadeDirectlyIntoDevice;
-    
+
     // illegal
     SkARGB32_Shader_Blitter& operator=(const SkARGB32_Shader_Blitter&);
-    
+
     typedef SkShaderBlitter INHERITED;
 };
 
diff --git a/src/core/SkCubicClipper.cpp b/src/core/SkCubicClipper.cpp
index 469fc22..b5b7dce 100644
--- a/src/core/SkCubicClipper.cpp
+++ b/src/core/SkCubicClipper.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2009 The Android Open Source Project
  *
diff --git a/src/core/SkCubicClipper.h b/src/core/SkCubicClipper.h
index d7dc381..617086e 100644
--- a/src/core/SkCubicClipper.h
+++ b/src/core/SkCubicClipper.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2009 The Android Open Source Project
  *
diff --git a/src/core/SkData.cpp b/src/core/SkData.cpp
index 4b21949..995a30a 100644
--- a/src/core/SkData.cpp
+++ b/src/core/SkData.cpp
@@ -192,4 +192,3 @@
     }
     return data;
 }
-
diff --git a/src/core/SkDeque.cpp b/src/core/SkDeque.cpp
index 2e469d1..f9ab4af 100644
--- a/src/core/SkDeque.cpp
+++ b/src/core/SkDeque.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/core/SkDescriptor.h b/src/core/SkDescriptor.h
index 1f6f4a8..0f13acd 100644
--- a/src/core/SkDescriptor.h
+++ b/src/core/SkDescriptor.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/core/SkDevice.cpp b/src/core/SkDevice.cpp
index 0ff094d..3a4090e 100644
--- a/src/core/SkDevice.cpp
+++ b/src/core/SkDevice.cpp
@@ -88,11 +88,11 @@
 void SkBaseDevice::drawPatch(const SkDraw& draw, const SkPoint cubics[12], const SkColor colors[4],
                              const SkPoint texCoords[4], SkXfermode* xmode, const SkPaint& paint) {
     SkPatchUtils::VertexData data;
-    
+
     SkISize lod = SkPatchUtils::GetLevelOfDetail(cubics, draw.fMatrix);
 
     // It automatically adjusts lodX and lodY in case it exceeds the number of indices.
-    // If it fails to generate the vertices, then we do not draw. 
+    // If it fails to generate the vertices, then we do not draw.
     if (SkPatchUtils::getVertexData(&data, cubics, colors, texCoords, lod.width(), lod.height())) {
         this->drawVertices(draw, SkCanvas::kTriangles_VertexMode, data.fVertexCount, data.fPoints,
                            data.fTexCoords, data.fColors, xmode, data.fIndices, data.fIndexCount,
@@ -176,7 +176,7 @@
 void SkBaseDevice::drawBitmapNine(const SkDraw& draw, const SkBitmap& bitmap, const SkIRect& center,
                                   const SkRect& dst, const SkPaint& paint) {
     SkNinePatchIter iter(bitmap.width(), bitmap.height(), center, dst);
-    
+
     SkRect srcR, dstR;
     while (iter.next(&srcR, &dstR)) {
         this->drawBitmapRect(draw, bitmap, &srcR, dstR, paint, SkCanvas::kStrict_SrcRectConstraint);
@@ -192,7 +192,7 @@
     for (int i = 0; i < count; ++i) {
         SkPoint quad[4];
         xform[i].toQuad(tex[i].width(), tex[i].height(), quad);
-        
+
         SkMatrix localM;
         localM.setRSXform(xform[i]);
         localM.preTranslate(-tex[i].left(), -tex[i].top());
@@ -209,7 +209,7 @@
         if (colors) {
             pnt.setColorFilter(SkColorFilter::MakeModeFilter(colors[i], mode));
         }
-        
+
         path.rewind();
         path.addPoly(quad, 4, true);
         path.setConvexity(SkPath::kConvex_Convexity);
@@ -283,24 +283,24 @@
 static void morphpoints(SkPoint dst[], const SkPoint src[], int count,
                         SkPathMeasure& meas, const SkMatrix& matrix) {
     SkMatrix::MapXYProc proc = matrix.getMapXYProc();
-    
+
     for (int i = 0; i < count; i++) {
         SkPoint pos;
         SkVector tangent;
-        
+
         proc(matrix, src[i].fX, src[i].fY, &pos);
         SkScalar sx = pos.fX;
         SkScalar sy = pos.fY;
-        
+
         if (!meas.getPosTan(sx, &pos, &tangent)) {
             // set to 0 if the measure failed, so that we just set dst == pos
             tangent.set(0, 0);
         }
-        
+
         /*  This is the old way (that explains our approach but is way too slow
          SkMatrix    matrix;
          SkPoint     pt;
-         
+
          pt.set(sx, sy);
          matrix.setSinCos(tangent.fY, tangent.fX);
          matrix.preTranslate(-sx, 0);
@@ -313,7 +313,7 @@
 }
 
 /*  TODO
- 
+
  Need differentially more subdivisions when the follow-path is curvy. Not sure how to
  determine that, but we need it. I guess a cheap answer is let the caller tell us,
  but that seems like a cop-out. Another answer is to get Rob Johnson to figure it out.
@@ -323,7 +323,7 @@
     SkPath::Iter    iter(src, false);
     SkPoint         srcP[4], dstP[3];
     SkPath::Verb    verb;
-    
+
     while ((verb = iter.next(srcP)) != SkPath::kDone_Verb) {
         switch (verb) {
             case SkPath::kMove_Verb:
@@ -359,16 +359,16 @@
                                   const SkPath& follow, const SkMatrix* matrix,
                                   const SkPaint& paint) {
     SkASSERT(byteLength == 0 || text != nullptr);
-    
+
     // nothing to draw
     if (text == nullptr || byteLength == 0 || draw.fRC->isEmpty()) {
         return;
     }
-    
+
     SkTextToPathIter    iter((const char*)text, byteLength, paint, true);
     SkPathMeasure       meas(follow, false);
     SkScalar            hOffset = 0;
-    
+
     // need to measure first
     if (paint.getTextAlign() != SkPaint::kLeft_Align) {
         SkScalar pathLen = meas.getLength();
@@ -377,19 +377,19 @@
         }
         hOffset += pathLen;
     }
-    
+
     const SkPath*   iterPath;
     SkScalar        xpos;
     SkMatrix        scaledMatrix;
     SkScalar        scale = iter.getPathScale();
-    
+
     scaledMatrix.setScale(scale, scale);
-    
+
     while (iter.next(&iterPath, &xpos)) {
         if (iterPath) {
             SkPath      tmp;
             SkMatrix    m(scaledMatrix);
-            
+
             tmp.setIsVolatile(true);
             m.postTranslate(xpos + hOffset, 0);
             if (matrix) {
diff --git a/src/core/SkDeviceProfile.h b/src/core/SkDeviceProfile.h
index 2872b13..ed533f8 100644
--- a/src/core/SkDeviceProfile.h
+++ b/src/core/SkDeviceProfile.h
@@ -12,7 +12,7 @@
 
 class SkDeviceProfile : public SkRefCnt {
 public:
-    
+
 
     enum LCDConfig {
         kNone_LCDConfig,   // disables LCD text rendering, uses A8 instead
diff --git a/src/core/SkDither.cpp b/src/core/SkDither.cpp
index 546d479..d966e0e 100644
--- a/src/core/SkDither.cpp
+++ b/src/core/SkDither.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/src/core/SkDither.h b/src/core/SkDither.h
index d82b416..463b504 100644
--- a/src/core/SkDither.h
+++ b/src/core/SkDither.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2008 The Android Open Source Project
  *
diff --git a/src/core/SkEdge.cpp b/src/core/SkEdge.cpp
index 94b7870..49df95b 100644
--- a/src/core/SkEdge.cpp
+++ b/src/core/SkEdge.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/core/SkEdge.h b/src/core/SkEdge.h
index c3adbf8..11669b4 100644
--- a/src/core/SkEdge.h
+++ b/src/core/SkEdge.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/core/SkEdgeBuilder.cpp b/src/core/SkEdgeBuilder.cpp
index 8ff68ee..af68e0f 100644
--- a/src/core/SkEdgeBuilder.cpp
+++ b/src/core/SkEdgeBuilder.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/src/core/SkEdgeBuilder.h b/src/core/SkEdgeBuilder.h
index 047460d..59f6287 100644
--- a/src/core/SkEdgeBuilder.h
+++ b/src/core/SkEdgeBuilder.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/src/core/SkEdgeClipper.cpp b/src/core/SkEdgeClipper.cpp
index 55f9192..85c519d 100644
--- a/src/core/SkEdgeClipper.cpp
+++ b/src/core/SkEdgeClipper.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2009 The Android Open Source Project
  *
diff --git a/src/core/SkEdgeClipper.h b/src/core/SkEdgeClipper.h
index 16887b4..e460c1c 100644
--- a/src/core/SkEdgeClipper.h
+++ b/src/core/SkEdgeClipper.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2009 The Android Open Source Project
  *
diff --git a/src/core/SkError.cpp b/src/core/SkError.cpp
index 9e4385b..d85b5ff 100644
--- a/src/core/SkError.cpp
+++ b/src/core/SkError.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2013 Google Inc.
  *
diff --git a/src/core/SkErrorInternals.h b/src/core/SkErrorInternals.h
index 65ff231..d573576 100644
--- a/src/core/SkErrorInternals.h
+++ b/src/core/SkErrorInternals.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2013 Google Inc.
  *
diff --git a/src/core/SkFDot6.h b/src/core/SkFDot6.h
index 91f3dda..82138ac 100644
--- a/src/core/SkFDot6.h
+++ b/src/core/SkFDot6.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/core/SkFilterProc.cpp b/src/core/SkFilterProc.cpp
index 2903849..5049727 100644
--- a/src/core/SkFilterProc.cpp
+++ b/src/core/SkFilterProc.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/core/SkFilterProc.h b/src/core/SkFilterProc.h
index 3b20d59..7348967 100644
--- a/src/core/SkFilterProc.h
+++ b/src/core/SkFilterProc.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2008 The Android Open Source Project
  *
diff --git a/src/core/SkGlyphCache.cpp b/src/core/SkGlyphCache.cpp
index 93d48a3..241854e 100644
--- a/src/core/SkGlyphCache.cpp
+++ b/src/core/SkGlyphCache.cpp
@@ -53,7 +53,7 @@
 }
 
 SkGlyphCache::~SkGlyphCache() {
-    fGlyphMap.foreach ([](SkGlyph* g) { 
+    fGlyphMap.foreach ([](SkGlyph* g) {
         if (g->fPathData) {
             delete g->fPathData->fPath;
         } } );
@@ -267,7 +267,7 @@
     intercept->fInterval[1] = SkTMax(intercept->fInterval[1], val);
 }
 
-void SkGlyphCache::AddPoints(const SkPoint* pts, int ptCount, const SkScalar bounds[2], 
+void SkGlyphCache::AddPoints(const SkPoint* pts, int ptCount, const SkScalar bounds[2],
         bool yAxis, SkGlyph::Intercept* intercept) {
     for (int i = 0; i < ptCount; ++i) {
         SkScalar val = *(&pts[i].fY - yAxis);
diff --git a/src/core/SkGlyphCache.h b/src/core/SkGlyphCache.h
index 8d6bae6..2b5262b 100644
--- a/src/core/SkGlyphCache.h
+++ b/src/core/SkGlyphCache.h
@@ -242,7 +242,7 @@
     static void OffsetResults(const SkGlyph::Intercept* intercept, SkScalar scale,
                               SkScalar xPos, SkScalar* array, int* count);
     static void AddInterval(SkScalar val, SkGlyph::Intercept* intercept);
-    static void AddPoints(const SkPoint* pts, int ptCount, const SkScalar bounds[2], 
+    static void AddPoints(const SkPoint* pts, int ptCount, const SkScalar bounds[2],
                           bool yAxis, SkGlyph::Intercept* intercept);
     static void AddLine(const SkPoint pts[2], SkScalar axis, bool yAxis,
                         SkGlyph::Intercept* intercept);
diff --git a/src/core/SkGraphics.cpp b/src/core/SkGraphics.cpp
index 2b1212c..0273139 100644
--- a/src/core/SkGraphics.cpp
+++ b/src/core/SkGraphics.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/core/SkHalf.cpp b/src/core/SkHalf.cpp
index 0db979b..262362e 100644
--- a/src/core/SkHalf.cpp
+++ b/src/core/SkHalf.cpp
@@ -34,18 +34,18 @@
     static const uint32_t sign_mask = 0x80000000u;
     static const uint32_t round_mask = ~0xfffu;
     SkHalf o = 0;
-    
+
     FloatUIntUnion floatUnion;
     floatUnion.fFloat = f;
-    
+
     uint32_t sign = floatUnion.fUInt & sign_mask;
     floatUnion.fUInt ^= sign;
-    
+
     // NOTE all the integer compares in this function can be safely
     // compiled into signed compares since all operands are below
     // 0x80000000. Important if you want fast straight SSE2 code
     // (since there's no unsigned PCMPGTD).
-    
+
     // Inf or NaN (all exponent bits set)
     if (floatUnion.fUInt >= f32infty)
         // NaN->qNaN and Inf->Inf
@@ -59,10 +59,10 @@
         if (floatUnion.fUInt > f16infty) {
             floatUnion.fUInt = f16infty;
         }
-        
+
         o = floatUnion.fUInt >> 13; // Take the bits!
     }
-    
+
     o |= sign >> 16;
     return o;
 }
@@ -72,7 +72,7 @@
 float SkHalfToFloat(SkHalf h) {
     static const FloatUIntUnion magic = { 126 << 23 };
     FloatUIntUnion o;
-    
+
     if (halfExponent(h) == 0)
     {
         // Zero / Denormal
@@ -90,7 +90,7 @@
         else
             o.fUInt |= ((127 - 15 + halfExponent(h)) << 23);
     }
-    
+
     // Set sign
     o.fUInt |= (halfSign(h) << 31);
     return o.fFloat;
diff --git a/src/core/SkImageFilter.cpp b/src/core/SkImageFilter.cpp
index 62509c5..06076c6 100644
--- a/src/core/SkImageFilter.cpp
+++ b/src/core/SkImageFilter.cpp
@@ -804,4 +804,3 @@
                                        SkBitmap* result, SkIPoint* offset) {
     return fDevice->filterImage(filter, src, ctx, result, offset);
 }
-
diff --git a/src/core/SkImageFilterCacheKey.h b/src/core/SkImageFilterCacheKey.h
index 76280db..3f5d1c8 100644
--- a/src/core/SkImageFilterCacheKey.h
+++ b/src/core/SkImageFilterCacheKey.h
@@ -39,4 +39,3 @@
 };
 
 #endif
-
diff --git a/src/core/SkImageInfo.cpp b/src/core/SkImageInfo.cpp
index 6e251a9..16f0a01 100644
--- a/src/core/SkImageInfo.cpp
+++ b/src/core/SkImageInfo.cpp
@@ -121,4 +121,3 @@
 
     return true;
 }
-
diff --git a/src/core/SkLight.h b/src/core/SkLight.h
index 4a6e149..d9eb78d 100644
--- a/src/core/SkLight.h
+++ b/src/core/SkLight.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2015 Google Inc.
  *
@@ -40,9 +39,9 @@
 
     LightType type() const { return fType; }
     const SkColor3f& color() const { return fColor; }
-    const SkVector3& dir() const { 
+    const SkVector3& dir() const {
         SkASSERT(kAmbient_LightType != fType);
-        return fDirection; 
+        return fDirection;
     }
 
 private:
diff --git a/src/core/SkLightingShader.cpp b/src/core/SkLightingShader.cpp
index d8e88c9..fdd0a04 100644
--- a/src/core/SkLightingShader.cpp
+++ b/src/core/SkLightingShader.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2015 Google Inc.
  *
@@ -53,7 +52,7 @@
     SkLightingShaderImpl(const SkBitmap& diffuse, const SkBitmap& normal,
                          const SkLightingShader::Lights* lights,
                          const SkVector& invNormRotation,
-                         const SkMatrix* diffLocalM, const SkMatrix* normLocalM) 
+                         const SkMatrix* diffLocalM, const SkMatrix* normLocalM)
         : INHERITED(diffLocalM)
         , fDiffuseMap(diffuse)
         , fNormalMap(normal)
@@ -204,14 +203,14 @@
                                                    "Xform", &xformUniName);
 
             fragBuilder->codeAppend("vec4 diffuseColor = ");
-            fragBuilder->appendTextureLookupAndModulate(args.fInputColor, args.fSamplers[0], 
-                                                args.fCoords[0].c_str(), 
+            fragBuilder->appendTextureLookupAndModulate(args.fInputColor, args.fSamplers[0],
+                                                args.fCoords[0].c_str(),
                                                 args.fCoords[0].getType());
             fragBuilder->codeAppend(";");
 
             fragBuilder->codeAppend("vec4 normalColor = ");
             fragBuilder->appendTextureLookup(args.fSamplers[1],
-                                     args.fCoords[1].c_str(), 
+                                     args.fCoords[1].c_str(),
                                      args.fCoords[1].getType());
             fragBuilder->codeAppend(";");
 
@@ -220,7 +219,7 @@
             fragBuilder->codeAppendf(
                                  "mat3 m = mat3(%s.x, -%s.y, 0.0, %s.y, %s.x, 0.0, 0.0, 0.0, 1.0);",
                                  xformUniName, xformUniName, xformUniName, xformUniName);
-            
+
             // TODO: inverse map the light direction vectors in the vertex shader rather than
             // transforming all the normals here!
             fragBuilder->codeAppend("normal = normalize(m*normal);");
@@ -302,7 +301,7 @@
 private:
     GrGLSLFragmentProcessor* onCreateGLSLInstance() const override { return new LightingGLFP; }
 
-    bool onIsEqual(const GrFragmentProcessor& proc) const override { 
+    bool onIsEqual(const GrFragmentProcessor& proc) const override {
         const LightingFP& lightingFP = proc.cast<LightingFP>();
         return fDiffDeviceTransform == lightingFP.fDiffDeviceTransform &&
                fNormDeviceTransform == lightingFP.fNormDeviceTransform &&
@@ -331,7 +330,7 @@
                      const SkMatrix& localMatrix1,
                      const SkMatrix* localMatrix2,
                      SkMatrix* result) {
-    
+
     result->setIDiv(bm.width(), bm.height());
 
     SkMatrix lmInverse;
@@ -360,7 +359,7 @@
     SkASSERT(fDiffuseMap.width() == fNormalMap.width() &&
              fDiffuseMap.height() == fNormalMap.height());
     SkMatrix diffM, normM;
-    
+
     if (!make_mat(fDiffuseMap, this->getLocalMatrix(), localMatrix, &diffM)) {
         return nullptr;
     }
@@ -371,17 +370,17 @@
 
     bool doBicubic;
     GrTextureParams::FilterMode diffFilterMode = GrSkFilterQualityToGrFilterMode(
-                                        SkTMin(filterQuality, kMedium_SkFilterQuality), 
+                                        SkTMin(filterQuality, kMedium_SkFilterQuality),
                                         viewM,
                                         this->getLocalMatrix(),
-                                        &doBicubic); 
+                                        &doBicubic);
     SkASSERT(!doBicubic);
 
     GrTextureParams::FilterMode normFilterMode = GrSkFilterQualityToGrFilterMode(
-                                        SkTMin(filterQuality, kMedium_SkFilterQuality), 
+                                        SkTMin(filterQuality, kMedium_SkFilterQuality),
                                         viewM,
                                         fNormLocalMatrix,
-                                        &doBicubic); 
+                                        &doBicubic);
     SkASSERT(!doBicubic);
 
     // TODO: support other tile modes
@@ -447,19 +446,19 @@
         color.fX = 0.0f;
     } else if (color.fX >= 255.0f) {
         color.fX = 255.0f;
-    } 
+    }
 
     if (color.fY <= 0.0f) {
         color.fY = 0.0f;
     } else if (color.fY >= 255.0f) {
         color.fY = 255.0f;
-    } 
+    }
 
     if (color.fZ <= 0.0f) {
         color.fZ = 0.0f;
     } else if (color.fZ >= 255.0f) {
         color.fZ = 255.0f;
-    } 
+    }
 
     return SkPreMultiplyARGB(a, (int) color.fX,  (int) color.fY, (int) color.fZ);
 }
@@ -511,7 +510,7 @@
 
             xformedNorm.fX = lightShader.fInvNormRotation.fX * norm.fX +
                              lightShader.fInvNormRotation.fY * norm.fY;
-            xformedNorm.fY = lightShader.fInvNormRotation.fX * norm.fX - 
+            xformedNorm.fY = lightShader.fInvNormRotation.fX * norm.fX -
                              lightShader.fInvNormRotation.fY * norm.fY;
             xformedNorm.fZ = norm.fZ;
 
@@ -601,7 +600,7 @@
             if (!buf.readScalarArray(&dir.fX, 3)) {
                 return nullptr;
             }
-            builder.add(SkLight(color, dir));        
+            builder.add(SkLight(color, dir));
         }
     }
 
diff --git a/src/core/SkLightingShader.h b/src/core/SkLightingShader.h
index 30ce655..ffbcbe9 100644
--- a/src/core/SkLightingShader.h
+++ b/src/core/SkLightingShader.h
@@ -69,7 +69,7 @@
         @param  normal      the normal map
         @param  light       the light applied to the normal map
         @param  ambient     the linear (unpremul) ambient light color. Range is 0..1/channel.
-        @param  localMatrix the matrix mapping the textures to the dest rect 
+        @param  localMatrix the matrix mapping the textures to the dest rect
 
         nullptr will be returned if:
             either 'diffuse' or 'normal' are empty
diff --git a/src/core/SkLineClipper.h b/src/core/SkLineClipper.h
index 11e0a73..d2c9b5f 100644
--- a/src/core/SkLineClipper.h
+++ b/src/core/SkLineClipper.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/src/core/SkLinearBitmapPipeline.cpp b/src/core/SkLinearBitmapPipeline.cpp
index 9c4c42c..37f9eb4 100644
--- a/src/core/SkLinearBitmapPipeline.cpp
+++ b/src/core/SkLinearBitmapPipeline.cpp
@@ -589,4 +589,3 @@
     // first pixel to the center of the last pixel. This implies that length is count-1.
     fFirstStage->pointSpan(Span{{x + 0.5f, y + 0.5f}, count - 1.0f, count});
 }
-
diff --git a/src/core/SkMaskFilter.cpp b/src/core/SkMaskFilter.cpp
index 51c4897..cacc052 100644
--- a/src/core/SkMaskFilter.cpp
+++ b/src/core/SkMaskFilter.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/core/SkMaskGamma.h b/src/core/SkMaskGamma.h
index 16ea47b..94219d4 100644
--- a/src/core/SkMaskGamma.h
+++ b/src/core/SkMaskGamma.h
@@ -92,7 +92,7 @@
  * @param B The number of luminance bits to use [1, 8] from the blue channel.
  */
 template <int R_LUM_BITS, int G_LUM_BITS, int B_LUM_BITS> class SkTMaskGamma : public SkRefCnt {
-    
+
 public:
 
     /** Creates a linear SkTMaskGamma. */
@@ -151,7 +151,7 @@
     const uint8_t* getGammaTables() const {
         return (const uint8_t*) fGammaTables;
     }
-    
+
 private:
     static const int MAX_LUM_BITS =
           B_LUM_BITS > (R_LUM_BITS > G_LUM_BITS ? R_LUM_BITS : G_LUM_BITS)
diff --git a/src/core/SkMetaData.cpp b/src/core/SkMetaData.cpp
index dd6ed05..6e1f5e2 100644
--- a/src/core/SkMetaData.cpp
+++ b/src/core/SkMetaData.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/core/SkModeColorFilter.cpp b/src/core/SkModeColorFilter.cpp
index 3da5160..84c6491 100644
--- a/src/core/SkModeColorFilter.cpp
+++ b/src/core/SkModeColorFilter.cpp
@@ -52,7 +52,7 @@
 void SkModeColorFilter::filterSpan(const SkPMColor shader[], int count, SkPMColor result[]) const {
     SkPMColor       color = fPMColor;
     SkXfermodeProc  proc = fProc;
-    
+
     for (int i = 0; i < count; i++) {
         result[i] = proc(color, shader[i]);
     }
@@ -61,7 +61,7 @@
 void SkModeColorFilter::filterSpan4f(const SkPM4f shader[], int count, SkPM4f result[]) const {
     SkPM4f            color = SkPM4f::FromPMColor(fPMColor);
     SkXfermodeProc4f  proc = SkXfermode::GetProc4f(fMode);
-    
+
     for (int i = 0; i < count; i++) {
         result[i] = proc(color, shader[i]);
     }
diff --git a/src/core/SkMultiPictureDraw.cpp b/src/core/SkMultiPictureDraw.cpp
index 5745664..09efba9 100644
--- a/src/core/SkMultiPictureDraw.cpp
+++ b/src/core/SkMultiPictureDraw.cpp
@@ -204,4 +204,3 @@
     GrLayerHoister::End(context);
 #endif
 }
-
diff --git a/src/core/SkNinePatchIter.cpp b/src/core/SkNinePatchIter.cpp
index 5d24d75..1a780a0 100644
--- a/src/core/SkNinePatchIter.cpp
+++ b/src/core/SkNinePatchIter.cpp
@@ -19,22 +19,22 @@
     fSrcX[1] = SkIntToScalar(c.fLeft);
     fSrcX[2] = SkIntToScalar(c.fRight);
     fSrcX[3] = SkIntToScalar(w);
-    
+
     fSrcY[0] = 0;
     fSrcY[1] = SkIntToScalar(c.fTop);
     fSrcY[2] = SkIntToScalar(c.fBottom);
     fSrcY[3] = SkIntToScalar(h);
-    
+
     fDstX[0] = dst.fLeft;
     fDstX[1] = dst.fLeft + SkIntToScalar(c.fLeft);
     fDstX[2] = dst.fRight - SkIntToScalar(w - c.fRight);
     fDstX[3] = dst.fRight;
-    
+
     fDstY[0] = dst.fTop;
     fDstY[1] = dst.fTop + SkIntToScalar(c.fTop);
     fDstY[2] = dst.fBottom - SkIntToScalar(h - c.fBottom);
     fDstY[3] = dst.fBottom;
-    
+
     if (fDstX[1] > fDstX[2]) {
         fDstX[1] = fDstX[0] + (fDstX[3] - fDstX[0]) * c.fLeft / (w - c.width());
         fDstX[2] = fDstX[1];
diff --git a/src/core/SkNinePatchIter.h b/src/core/SkNinePatchIter.h
index 2d7e9a8..df06c1f 100644
--- a/src/core/SkNinePatchIter.h
+++ b/src/core/SkNinePatchIter.h
@@ -26,17 +26,16 @@
      *  While it returns true, use src/dst to draw the image/bitmap
      */
     bool next(SkRect* src, SkRect* dst);
-    
+
 private:
     SkScalar fSrcX[4];
     SkScalar fSrcY[4];
     SkScalar fDstX[4];
     SkScalar fDstY[4];
-    
+
     int fCurrX;
     int fCurrY;
     bool fDone;
 };
 
 #endif
-
diff --git a/src/core/SkPaint.cpp b/src/core/SkPaint.cpp
index 6a54b9a..8d62a6a 100644
--- a/src/core/SkPaint.cpp
+++ b/src/core/SkPaint.cpp
@@ -1115,7 +1115,7 @@
 }
 
 int SkPaint::getTextIntercepts(const void* textData, size_t length,
-                               SkScalar x, SkScalar y, const SkScalar bounds[2], 
+                               SkScalar x, SkScalar y, const SkScalar bounds[2],
                                SkScalar* array) const {
     SkASSERT(length == 0 || textData != nullptr);
     if (!length) {
diff --git a/src/core/SkPaintPriv.h b/src/core/SkPaintPriv.h
index a03f9b3..1cf4040 100644
--- a/src/core/SkPaintPriv.h
+++ b/src/core/SkPaintPriv.h
@@ -21,7 +21,7 @@
         kOpaque_ShaderOverrideOpacity,      //!< the overriding shader is opaque
         kNotOpaque_ShaderOverrideOpacity,   //!< the overriding shader may not be opaque
     };
-    
+
     /**
      *  Returns true if drawing with this paint (or nullptr) will ovewrite all affected pixels.
      *
diff --git a/src/core/SkPath.cpp b/src/core/SkPath.cpp
index 320448a..87ecd4e 100644
--- a/src/core/SkPath.cpp
+++ b/src/core/SkPath.cpp
@@ -3177,7 +3177,7 @@
     if ((onCurveCount & 1) || evenOddFill) {
         return SkToBool(onCurveCount & 1) ^ isInverse;
     }
-    // If the point touches an even number of curves, and the fill is winding, check for  
+    // If the point touches an even number of curves, and the fill is winding, check for
     // coincidence. Count coincidence as places where the on curve points have identical tangents.
     iter.setPath(*this, true);
     done = false;
diff --git a/src/core/SkPathMeasure.cpp b/src/core/SkPathMeasure.cpp
index c0d9792..5ca5ebd 100644
--- a/src/core/SkPathMeasure.cpp
+++ b/src/core/SkPathMeasure.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2008 The Android Open Source Project
  *
@@ -527,12 +526,12 @@
     if (count <= 0) {
         return ~0;
     }
-    
+
     SkASSERT(base != nullptr); // base may be nullptr if count is zero
-    
+
     int lo = 0;
     int hi = count - 1;
-    
+
     while (lo < hi) {
         int mid = (hi + lo) >> 1;
         if (base[mid].fDistance < key) {
@@ -541,7 +540,7 @@
             hi = mid;
         }
     }
-    
+
     if (base[hi].fDistance < key) {
         hi += 1;
         hi = ~hi;
diff --git a/src/core/SkPathPriv.h b/src/core/SkPathPriv.h
index 048c926..f0bab95 100644
--- a/src/core/SkPathPriv.h
+++ b/src/core/SkPathPriv.h
@@ -29,7 +29,7 @@
      */
     static FirstDirection OppositeFirstDirection(FirstDirection dir) {
         static const FirstDirection gOppositeDir[] = {
-            kCCW_FirstDirection, kCW_FirstDirection, kUnknown_FirstDirection, 
+            kCCW_FirstDirection, kCW_FirstDirection, kUnknown_FirstDirection,
         };
         return gOppositeDir[dir];
     }
diff --git a/src/core/SkPerspIter.h b/src/core/SkPerspIter.h
index 821f153..3a00971 100644
--- a/src/core/SkPerspIter.h
+++ b/src/core/SkPerspIter.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/core/SkPictureData.cpp b/src/core/SkPictureData.cpp
index 79b2255..92aa241 100644
--- a/src/core/SkPictureData.cpp
+++ b/src/core/SkPictureData.cpp
@@ -630,5 +630,3 @@
 }
 #endif
 ///////////////////////////////////////////////////////////////////////////////
-
-
diff --git a/src/core/SkPictureFlat.cpp b/src/core/SkPictureFlat.cpp
index 02d8592..71f39ea 100644
--- a/src/core/SkPictureFlat.cpp
+++ b/src/core/SkPictureFlat.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/src/core/SkPictureFlat.h b/src/core/SkPictureFlat.h
index 00b7c2b..73103c6 100644
--- a/src/core/SkPictureFlat.h
+++ b/src/core/SkPictureFlat.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/src/core/SkPicturePlayback.cpp b/src/core/SkPicturePlayback.cpp
index ae3c3f2..f21ac32 100644
--- a/src/core/SkPicturePlayback.cpp
+++ b/src/core/SkPicturePlayback.cpp
@@ -24,7 +24,7 @@
 
 SkCanvas::SaveLayerFlags SkCanvas::LegacySaveFlagsToSaveLayerFlags(uint32_t flags) {
     uint32_t layerFlags = 0;
-    
+
     if (0 == (flags & kClipToLayer_LegacySaveFlags)) {
         layerFlags |= SkCanvas::kDontClipToLayer_PrivateSaveLayerFlag;
     }
@@ -532,4 +532,3 @@
             SkASSERTF(false, "Unknown draw type: %d", op);
     }
 }
-
diff --git a/src/core/SkPictureRecord.cpp b/src/core/SkPictureRecord.cpp
index 459402b..fc502aa 100644
--- a/src/core/SkPictureRecord.cpp
+++ b/src/core/SkPictureRecord.cpp
@@ -975,4 +975,3 @@
 }
 
 ///////////////////////////////////////////////////////////////////////////////
-
diff --git a/src/core/SkPictureShader.h b/src/core/SkPictureShader.h
index 8f167b8..9528968 100644
--- a/src/core/SkPictureShader.h
+++ b/src/core/SkPictureShader.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2014 Google Inc.
  *
diff --git a/src/core/SkPixmap.cpp b/src/core/SkPixmap.cpp
index e73440e..a5e474b 100644
--- a/src/core/SkPixmap.cpp
+++ b/src/core/SkPixmap.cpp
@@ -58,7 +58,7 @@
     if (!r.intersect(srcRect, subset)) {
         return false;   // r is empty (i.e. no intersection)
     }
-    
+
     // If the upper left of the rectangle was outside the bounds of this SkBitmap, we should have
     // exited above.
     SkASSERT(static_cast<unsigned>(r.fLeft) < static_cast<unsigned>(this->width()));
@@ -84,15 +84,15 @@
     if (0 == requestedDstInfo.width() || 0 == requestedDstInfo.height()) {
         return false;
     }
-    
+
     SkIRect srcR = SkIRect::MakeXYWH(x, y, requestedDstInfo.width(), requestedDstInfo.height());
     if (!srcR.intersect(0, 0, this->width(), this->height())) {
         return false;
     }
-    
+
     // the intersect may have shrunk info's logical size
     const SkImageInfo dstInfo = requestedDstInfo.makeWH(srcR.width(), srcR.height());
-    
+
     // if x or y are negative, then we have to adjust pixels
     if (x > 0) {
         x = 0;
@@ -134,7 +134,7 @@
     int height = area.height();
     const int width = area.width();
     const int rowBytes = this->rowBytes();
-    
+
     switch (this->colorType()) {
         case kGray_8_SkColorType: {
             if (255 != a) {
@@ -162,14 +162,14 @@
         case kRGB_565_SkColorType: {
             uint16_t* p = this->writable_addr16(area.fLeft, area.fTop);
             uint16_t v;
-            
+
             // make rgb premultiplied
             if (255 != a) {
                 r = SkMulDiv255Round(r, a);
                 g = SkMulDiv255Round(g, a);
                 b = SkMulDiv255Round(b, a);
             }
-            
+
             if (kARGB_4444_SkColorType == this->colorType()) {
                 v = pack_8888_to_4444(a, r, g, b);
             } else {
@@ -186,7 +186,7 @@
         case kBGRA_8888_SkColorType:
         case kRGBA_8888_SkColorType: {
             uint32_t* p = this->writable_addr32(area.fLeft, area.fTop);
-            
+
             if (255 != a && kPremul_SkAlphaType == this->alphaType()) {
                 r = SkMulDiv255Round(r, a);
                 g = SkMulDiv255Round(g, a);
@@ -273,4 +273,3 @@
 }
 
 //////////////////////////////////////////////////////////////////////////////////////////////////
-
diff --git a/src/core/SkPoint.cpp b/src/core/SkPoint.cpp
index 345ef37..490e4a2 100644
--- a/src/core/SkPoint.cpp
+++ b/src/core/SkPoint.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2008 The Android Open Source Project
  *
diff --git a/src/core/SkPtrRecorder.cpp b/src/core/SkPtrRecorder.cpp
index be169d7..dd73a7c 100644
--- a/src/core/SkPtrRecorder.cpp
+++ b/src/core/SkPtrRecorder.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/src/core/SkPtrRecorder.h b/src/core/SkPtrRecorder.h
index 2d755e6..402278e 100644
--- a/src/core/SkPtrRecorder.h
+++ b/src/core/SkPtrRecorder.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2008 The Android Open Source Project
  *
@@ -22,7 +21,7 @@
  */
 class SkPtrSet : public SkRefCnt {
 public:
-    
+
 
     /**
      *  Search for the specified ptr in the set. If it is found, return its
@@ -144,7 +143,7 @@
  */
 class SkNamedFactorySet : public SkRefCnt {
 public:
-    
+
 
     SkNamedFactorySet();
 
diff --git a/src/core/SkQuadClipper.h b/src/core/SkQuadClipper.h
index c0b8695..1dd8576 100644
--- a/src/core/SkQuadClipper.h
+++ b/src/core/SkQuadClipper.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2009 The Android Open Source Project
  *
diff --git a/src/core/SkRTree.h b/src/core/SkRTree.h
index 5578171..499f7a5 100644
--- a/src/core/SkRTree.h
+++ b/src/core/SkRTree.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2012 Google Inc.
  *
diff --git a/src/core/SkRasterClip.cpp b/src/core/SkRasterClip.cpp
index 5afe279..8946767 100644
--- a/src/core/SkRasterClip.cpp
+++ b/src/core/SkRasterClip.cpp
@@ -211,7 +211,7 @@
         }
     } else {
         base.setRect(bounds);
-        
+
         if (SkRegion::kReplace_Op == op) {
             return this->setPath(path, base, doAA);
         } else {
@@ -302,7 +302,7 @@
         }
         return this->op(ir, op);
     }
-    
+
     if (fIsBW && doAA) {
         // check that the rect really needs aa, or is it close enought to
         // integer boundaries that we can just treat it as a BW rect?
@@ -369,13 +369,13 @@
 
 void SkRasterClip::convertToAA() {
     AUTO_RASTERCLIP_VALIDATE(*this);
-    
+
     SkASSERT(!fForceConservativeRects);
-    
+
     SkASSERT(fIsBW);
     fAA.setRegion(fBW);
     fIsBW = false;
-    
+
     // since we are being explicitly asked to convert-to-aa, we pass false so we don't "optimize"
     // ourselves back to BW.
     (void)this->updateCacheAndReturnNonEmpty(false);
diff --git a/src/core/SkRasterClip.h b/src/core/SkRasterClip.h
index 8f05bb9..5d99f1d 100644
--- a/src/core/SkRasterClip.h
+++ b/src/core/SkRasterClip.h
@@ -48,7 +48,7 @@
     bool op(const SkRect&, const SkIRect&, SkRegion::Op, bool doAA);
     bool op(const SkRRect&, const SkIRect&, SkRegion::Op, bool doAA);
     bool op(const SkPath&, const SkIRect&, SkRegion::Op, bool doAA);
-    
+
     void translate(int dx, int dy, SkRasterClip* dst) const;
     void translate(int dx, int dy) {
         this->translate(dx, dy, this);
diff --git a/src/core/SkRasterizer.cpp b/src/core/SkRasterizer.cpp
index 6a3ea10..60176b8 100644
--- a/src/core/SkRasterizer.cpp
+++ b/src/core/SkRasterizer.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/core/SkReadBuffer.cpp b/src/core/SkReadBuffer.cpp
index 59d5172..fba02f7 100644
--- a/src/core/SkReadBuffer.cpp
+++ b/src/core/SkReadBuffer.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2012 Google Inc.
  *
diff --git a/src/core/SkRecordDraw.cpp b/src/core/SkRecordDraw.cpp
index 394cc72..d0e8c4c 100644
--- a/src/core/SkRecordDraw.cpp
+++ b/src/core/SkRecordDraw.cpp
@@ -811,4 +811,3 @@
     }
     visitor.cleanUp();
 }
-
diff --git a/src/core/SkRecordOpts.cpp b/src/core/SkRecordOpts.cpp
index 0121ea5..ea19d6e 100644
--- a/src/core/SkRecordOpts.cpp
+++ b/src/core/SkRecordOpts.cpp
@@ -292,4 +292,3 @@
 
     record->defrag();
 }
-
diff --git a/src/core/SkRect.cpp b/src/core/SkRect.cpp
index f2060f8..0b2723a 100644
--- a/src/core/SkRect.cpp
+++ b/src/core/SkRect.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/core/SkRefDict.cpp b/src/core/SkRefDict.cpp
index 9364a39..7407188 100644
--- a/src/core/SkRefDict.cpp
+++ b/src/core/SkRefDict.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/src/core/SkRefDict.h b/src/core/SkRefDict.h
index 9583df1..fec49ce 100644
--- a/src/core/SkRefDict.h
+++ b/src/core/SkRefDict.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/src/core/SkRegion.cpp b/src/core/SkRegion.cpp
index ba66581..38d12d2 100644
--- a/src/core/SkRegion.cpp
+++ b/src/core/SkRegion.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/core/SkRegionPriv.h b/src/core/SkRegionPriv.h
index c9633c7..a4cf77b 100644
--- a/src/core/SkRegionPriv.h
+++ b/src/core/SkRegionPriv.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/core/SkScalar.cpp b/src/core/SkScalar.cpp
index 7cb0a8b..87a5073 100644
--- a/src/core/SkScalar.cpp
+++ b/src/core/SkScalar.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2010 The Android Open Source Project
  *
diff --git a/src/core/SkScalerContext.cpp b/src/core/SkScalerContext.cpp
index 5e125f3..cf4098b 100644
--- a/src/core/SkScalerContext.cpp
+++ b/src/core/SkScalerContext.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/core/SkScan.cpp b/src/core/SkScan.cpp
index b21dd6b..7fce3f1 100644
--- a/src/core/SkScan.cpp
+++ b/src/core/SkScan.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/core/SkScan.h b/src/core/SkScan.h
index 7309a1d..f944320 100644
--- a/src/core/SkScan.h
+++ b/src/core/SkScan.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 The Android Open Source Project
  *
diff --git a/src/core/SkScanPriv.h b/src/core/SkScanPriv.h
index 75ceee0..798cae6 100644
--- a/src/core/SkScanPriv.h
+++ b/src/core/SkScanPriv.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/core/SkScan_AntiPath.cpp b/src/core/SkScan_AntiPath.cpp
index 06365c1..3b0f3e1 100644
--- a/src/core/SkScan_AntiPath.cpp
+++ b/src/core/SkScan_AntiPath.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/core/SkScan_Antihair.cpp b/src/core/SkScan_Antihair.cpp
index 8ee0ba5..b3770eb 100644
--- a/src/core/SkScan_Antihair.cpp
+++ b/src/core/SkScan_Antihair.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 The Android Open Source Project
  *
diff --git a/src/core/SkScan_Path.cpp b/src/core/SkScan_Path.cpp
index 6c1f1c0..884f785 100644
--- a/src/core/SkScan_Path.cpp
+++ b/src/core/SkScan_Path.cpp
@@ -510,7 +510,7 @@
         } else {
             rightEdge = SkScalarRoundToInt(path.getBounds().right()) << shiftEdgesUp;
         }
-        
+
         walk_edges(&headEdge, path.getFillType(), blitter, start_y, stop_y, proc, rightEdge);
     }
 }
diff --git a/src/core/SkSpecialImage.cpp b/src/core/SkSpecialImage.cpp
index b8eabc5..681c224 100644
--- a/src/core/SkSpecialImage.cpp
+++ b/src/core/SkSpecialImage.cpp
@@ -166,7 +166,7 @@
     }
 
     ~SkSpecialImage_Image() override { }
-    
+
     bool isOpaque() const override { return fImage->isOpaque(); }
 
     size_t getSize() const override {
@@ -200,7 +200,7 @@
     bool getBitmapDeprecated(SkBitmap* result) const override {
 #if SK_SUPPORT_GPU
         if (GrTexture* texture = as_IB(fImage.get())->peekTexture()) {
-            const SkImageInfo info = GrMakeInfoFromTexture(texture, 
+            const SkImageInfo info = GrMakeInfoFromTexture(texture,
                                                            fImage->width(), fImage->height(),
                                                            fImage->isOpaque());
             if (!result->setInfo(info)) {
@@ -357,7 +357,7 @@
 
     sk_sp<SkSpecialImage> onMakeSubset(const SkIRect& subset) const override {
         SkBitmap subsetBM;
-        
+
         if (!fBitmap.extractSubset(&subsetBM, subset)) {
             return nullptr;
         }
@@ -415,7 +415,7 @@
 #include "SkImage_Gpu.h"
 
 class SkSpecialImage_Gpu : public SkSpecialImage_Base {
-public:                                       
+public:
     SkSpecialImage_Gpu(SkImageFilter::Proxy* proxy, const SkIRect& subset,
                        uint32_t uniqueID, GrTexture* tex, SkAlphaType at)
         : INHERITED(proxy, subset, uniqueID)
@@ -447,7 +447,7 @@
     GrTexture* onPeekTexture() const override { return fTexture; }
 
     bool getBitmapDeprecated(SkBitmap* result) const override {
-        const SkImageInfo info = GrMakeInfoFromTexture(fTexture, 
+        const SkImageInfo info = GrMakeInfoFromTexture(fTexture,
                                                        this->width(), this->height(),
                                                        this->isOpaque());
         if (!result->setInfo(info)) {
@@ -463,7 +463,7 @@
 
     bool testingOnlyOnGetROPixels(SkBitmap* result) const override {
 
-        const SkImageInfo info = SkImageInfo::MakeN32(this->width(), 
+        const SkImageInfo info = SkImageInfo::MakeN32(this->width(),
                                                       this->height(),
                                                       this->isOpaque() ? kOpaque_SkAlphaType
                                                                        : kPremul_SkAlphaType);
@@ -495,7 +495,7 @@
         return SkSpecialImage::MakeFromGpu(this->internal_getProxy(),
                                            subset,
                                            this->uniqueID(),
-                                           fTexture, 
+                                           fTexture,
                                            fAlphaType);
     }
 
@@ -536,7 +536,7 @@
 };
 
 sk_sp<SkSpecialImage> SkSpecialImage::MakeFromGpu(SkImageFilter::Proxy* proxy,
-                                                  const SkIRect& subset, 
+                                                  const SkIRect& subset,
                                                   uint32_t uniqueID,
                                                   GrTexture* tex,
                                                   SkAlphaType at) {
diff --git a/src/core/SkSpecialImage.h b/src/core/SkSpecialImage.h
index 778bf53..4de28eb 100644
--- a/src/core/SkSpecialImage.h
+++ b/src/core/SkSpecialImage.h
@@ -76,7 +76,7 @@
     static sk_sp<SkSpecialImage> MakeFromGpu(SkImageFilter::Proxy*,
                                              const SkIRect& subset,
                                              uint32_t uniqueID,
-                                             GrTexture*, 
+                                             GrTexture*,
                                              SkAlphaType at = kPremul_SkAlphaType);
     static sk_sp<SkSpecialImage> MakeFromPixmap(SkImageFilter::Proxy*,
                                                 const SkIRect& subset,
@@ -164,4 +164,3 @@
 };
 
 #endif
-
diff --git a/src/core/SkSpecialSurface.cpp b/src/core/SkSpecialSurface.cpp
index c1b06dd..2ac71ff 100644
--- a/src/core/SkSpecialSurface.cpp
+++ b/src/core/SkSpecialSurface.cpp
@@ -70,7 +70,7 @@
                             SkPixelRef* pr,
                             const SkIRect& subset,
                             const SkSurfaceProps* props)
-        : INHERITED(proxy, subset, props) {   
+        : INHERITED(proxy, subset, props) {
         const SkImageInfo& info = pr->info();
 
         fBitmap.setInfo(info, info.minRowBytes());
@@ -148,7 +148,7 @@
     typedef SkSpecialSurface_Base INHERITED;
 };
 
-sk_sp<SkSpecialSurface> SkSpecialSurface::MakeFromTexture(SkImageFilter::Proxy* proxy, 
+sk_sp<SkSpecialSurface> SkSpecialSurface::MakeFromTexture(SkImageFilter::Proxy* proxy,
                                                           const SkIRect& subset,
                                                           GrTexture* texture,
                                                           const SkSurfaceProps* props) {
diff --git a/src/core/SkSpecialSurface.h b/src/core/SkSpecialSurface.h
index 098baa4..d24ee74 100644
--- a/src/core/SkSpecialSurface.h
+++ b/src/core/SkSpecialSurface.h
@@ -35,7 +35,7 @@
     /**
     *  Return a canvas that will draw into this surface. This will always
     *  return the same canvas for a given surface, and is managed/owned by the
-    *  surface. 
+    *  surface.
     *
     *  The canvas will be invalid after 'newImageSnapshot' is called.
     */
diff --git a/src/core/SkSpriteBlitter4f.cpp b/src/core/SkSpriteBlitter4f.cpp
index 474bf4d..2561620 100644
--- a/src/core/SkSpriteBlitter4f.cpp
+++ b/src/core/SkSpriteBlitter4f.cpp
@@ -18,13 +18,13 @@
         fFilter = SkFilterSpanProc_Choose(paint);
         fBuffer.reset(src.width());
     }
-    
+
 protected:
     SkXfermode*             fXfer;
     SkLoadSpanProc          fLoader;
     SkFilterSpanProc        fFilter;
     SkAutoTMalloc<SkPM4f>   fBuffer;
-    
+
 private:
     typedef SkSpriteBlitter INHERITED;
 };
@@ -53,7 +53,7 @@
             dst = (uint64_t* SK_RESTRICT)((char*)dst + dstRB);
         }
     }
-    
+
 private:
     SkXfermode::D64Proc fWriter;
 
@@ -89,12 +89,12 @@
         }
         fWriter = SkXfermode::GetD32Proc(fXfer, flags);
     }
-    
+
     void blitRect(int x, int y, int width, int height) override {
         SkASSERT(width > 0 && height > 0);
         uint32_t* SK_RESTRICT dst = fDst.writable_addr32(x, y);
         size_t dstRB = fDst.rowBytes();
-        
+
         for (int bottom = y + height; y < bottom; ++y) {
             fLoader(fSource, x - fLeft, y - fTop, fBuffer, width);
             fFilter(*fPaint, fBuffer, width);
@@ -102,10 +102,10 @@
             dst = (uint32_t* SK_RESTRICT)((char*)dst + dstRB);
         }
     }
-    
+
 protected:
     SkXfermode::D32Proc fWriter;
-    
+
 private:
     typedef Sprite_4f INHERITED;
 };
@@ -114,11 +114,11 @@
 SkSpriteBlitter* SkSpriteBlitter::ChooseS32(const SkPixmap& source, const SkPaint& paint,
                                             SkTBlitterAllocator* allocator) {
     SkASSERT(allocator != nullptr);
-    
+
     if (paint.getMaskFilter() != nullptr) {
         return nullptr;
     }
-    
+
     switch (source.colorType()) {
         case kN32_SkColorType:
         case kRGBA_F16_SkColorType:
diff --git a/src/core/SkSpriteBlitter_RGB16.cpp b/src/core/SkSpriteBlitter_RGB16.cpp
index 4dd4164..d0d3001 100644
--- a/src/core/SkSpriteBlitter_RGB16.cpp
+++ b/src/core/SkSpriteBlitter_RGB16.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/core/SkStream.cpp b/src/core/SkStream.cpp
index a4c44fb..1d1c9b9 100644
--- a/src/core/SkStream.cpp
+++ b/src/core/SkStream.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/core/SkString.cpp b/src/core/SkString.cpp
index 8ac5674..2e2c0e7 100644
--- a/src/core/SkString.cpp
+++ b/src/core/SkString.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/core/SkStroke.cpp b/src/core/SkStroke.cpp
index 9c26294..0f1a15f 100644
--- a/src/core/SkStroke.cpp
+++ b/src/core/SkStroke.cpp
@@ -397,7 +397,7 @@
                     continue;
                 }
                 return true;
-            case SkPath::kClose_Verb: 
+            case SkPath::kClose_Verb:
             case SkPath::kDone_Verb:
                 return false;
         }
@@ -627,7 +627,7 @@
     SkScalar xT = 0, yT = 0;
     (void) conic.findXExtrema(&xT);
     (void) conic.findYExtrema(&yT);
-    SkScalar t = SkTMax(xT, yT); 
+    SkScalar t = SkTMax(xT, yT);
     if (0 == t) {
         return kLine_ReductionType;
     }
diff --git a/src/core/SkStrokeRec.cpp b/src/core/SkStrokeRec.cpp
index 6c975b4..6aed573 100644
--- a/src/core/SkStrokeRec.cpp
+++ b/src/core/SkStrokeRec.cpp
@@ -96,7 +96,7 @@
 
 #include "SkStroke.h"
 
-#ifdef SK_DEBUG  
+#ifdef SK_DEBUG
     // enables tweaking these values at runtime from SampleApp
     bool gDebugStrokerErrorSet = false;
     SkScalar gDebugStrokerError;
diff --git a/src/core/SkStrokerPriv.cpp b/src/core/SkStrokerPriv.cpp
index 7fc773a..840f961 100644
--- a/src/core/SkStrokerPriv.cpp
+++ b/src/core/SkStrokerPriv.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/core/SkStrokerPriv.h b/src/core/SkStrokerPriv.h
index 1c35f0a..d008efa 100644
--- a/src/core/SkStrokerPriv.h
+++ b/src/core/SkStrokerPriv.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/core/SkSwizzle.cpp b/src/core/SkSwizzle.cpp
index 9c19718..f080b83 100644
--- a/src/core/SkSwizzle.cpp
+++ b/src/core/SkSwizzle.cpp
@@ -12,5 +12,3 @@
 void SkSwapRB(uint32_t* dest, const uint32_t* src, int count) {
     SkOpts::RGBA_to_BGRA(dest, src, count);
 }
-
-
diff --git a/src/core/SkTDPQueue.h b/src/core/SkTDPQueue.h
index 1545f97..294c9f4 100644
--- a/src/core/SkTDPQueue.h
+++ b/src/core/SkTDPQueue.h
@@ -34,7 +34,7 @@
     /** Gets the next item in the queue without popping it. */
     const T& peek() const { return fArray[0]; }
     T& peek() { return fArray[0]; }
-    
+
     /** Removes the next item. */
     void pop() {
         this->validate();
@@ -134,7 +134,7 @@
         SkASSERT(index >= 0);
         do {
             int child = LeftOf(index);
-            
+
             if (child >= fArray.count()) {
                 // We're a leaf.
                 this->setIndex(index);
@@ -188,7 +188,7 @@
     }
 
     SkTDArray<T> fArray;
-    
+
     typedef SkNoncopyable INHERITED;
 };
 
diff --git a/src/core/SkTDynamicHash.h b/src/core/SkTDynamicHash.h
index 2fa37b5..b144d18 100644
--- a/src/core/SkTDynamicHash.h
+++ b/src/core/SkTDynamicHash.h
@@ -127,12 +127,12 @@
         fDeleted = 0;
     }
 
-    void reset() { 
-        fCount = 0; 
-        fDeleted = 0; 
-        fCapacity = 0; 
-        sk_free(fArray); 
-        fArray = nullptr; 
+    void reset() {
+        fCount = 0;
+        fDeleted = 0;
+        fCapacity = 0;
+        sk_free(fArray);
+        fArray = nullptr;
     }
 
 protected:
diff --git a/src/core/SkTMultiMap.h b/src/core/SkTMultiMap.h
index b0d04d5..4c8683c 100644
--- a/src/core/SkTMultiMap.h
+++ b/src/core/SkTMultiMap.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2013 Google Inc.
  *
diff --git a/src/core/SkTSearch.cpp b/src/core/SkTSearch.cpp
index 5b5f139..9ff9777 100644
--- a/src/core/SkTSearch.cpp
+++ b/src/core/SkTSearch.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/core/SkTSort.h b/src/core/SkTSort.h
index 027ea52..51b103c 100644
--- a/src/core/SkTSort.h
+++ b/src/core/SkTSort.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/core/SkTaskGroup.cpp b/src/core/SkTaskGroup.cpp
index b3c23b6..b696555 100644
--- a/src/core/SkTaskGroup.cpp
+++ b/src/core/SkTaskGroup.cpp
@@ -207,4 +207,3 @@
 void SkTaskGroup::batch(int N, std::function<void(int)> fn) {
     ThreadPool::Batch(N, fn, &fPending);
 }
-
diff --git a/src/core/SkTextBlob.cpp b/src/core/SkTextBlob.cpp
index 79fe858..463312a 100644
--- a/src/core/SkTextBlob.cpp
+++ b/src/core/SkTextBlob.cpp
@@ -646,4 +646,3 @@
 
     return blob;
 }
-
diff --git a/src/core/SkTextFormatParams.h b/src/core/SkTextFormatParams.h
index f41c4de..ef22c84 100644
--- a/src/core/SkTextFormatParams.h
+++ b/src/core/SkTextFormatParams.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2010 The Android Open Source Project
  *
diff --git a/src/core/SkTextMapStateProc.h b/src/core/SkTextMapStateProc.h
index 8ef9389..9440509 100644
--- a/src/core/SkTextMapStateProc.h
+++ b/src/core/SkTextMapStateProc.h
@@ -75,4 +75,3 @@
 }
 
 #endif
-
diff --git a/src/core/SkTypeface.cpp b/src/core/SkTypeface.cpp
index 8b7620b..6024c81 100644
--- a/src/core/SkTypeface.cpp
+++ b/src/core/SkTypeface.cpp
@@ -358,4 +358,3 @@
     }
     return false;
 }
-
diff --git a/src/core/SkTypefaceCache.cpp b/src/core/SkTypefaceCache.cpp
index 5fe080d..faf3978 100644
--- a/src/core/SkTypefaceCache.cpp
+++ b/src/core/SkTypefaceCache.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/src/core/SkTypefaceCache.h b/src/core/SkTypefaceCache.h
index f39b0d7..bb2cb85 100644
--- a/src/core/SkTypefaceCache.h
+++ b/src/core/SkTypefaceCache.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/src/core/SkUnPreMultiply.cpp b/src/core/SkUnPreMultiply.cpp
index 6245e96..a15e7d1 100644
--- a/src/core/SkUnPreMultiply.cpp
+++ b/src/core/SkUnPreMultiply.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/src/core/SkUtils.cpp b/src/core/SkUtils.cpp
index f706cb9..635d1b1 100644
--- a/src/core/SkUtils.cpp
+++ b/src/core/SkUtils.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/core/SkUtilsArm.cpp b/src/core/SkUtilsArm.cpp
index 9dc4e54..bf98fed 100644
--- a/src/core/SkUtilsArm.cpp
+++ b/src/core/SkUtilsArm.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2012 The Android Open Source Project
  *
diff --git a/src/core/SkUtilsArm.h b/src/core/SkUtilsArm.h
index 51ae7e4..3176771 100644
--- a/src/core/SkUtilsArm.h
+++ b/src/core/SkUtilsArm.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2012 The Android Open Source Project
  *
diff --git a/src/core/SkWriteBuffer.cpp b/src/core/SkWriteBuffer.cpp
index f8b3195..6baea37 100644
--- a/src/core/SkWriteBuffer.cpp
+++ b/src/core/SkWriteBuffer.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2012 Google Inc.
  *
diff --git a/src/core/SkXfermode.cpp b/src/core/SkXfermode.cpp
index 262e526..98eb796 100644
--- a/src/core/SkXfermode.cpp
+++ b/src/core/SkXfermode.cpp
@@ -246,7 +246,7 @@
         *g = L + (*g - L) * scale;
         *b = L + (*b - L) * scale;
     }
-    
+
     if ((x > a) && (denom = x - L)) { // Compute denom and make sure it's non zero
         float scale = (a - L) / denom;
         *r = L + (*r - L) * scale;
@@ -268,7 +268,7 @@
     float sr = s[SkPM4f::R];
     float sg = s[SkPM4f::G];
     float sb = s[SkPM4f::B];
-    
+
     float da = d[SkPM4f::A];
     float dr = d[SkPM4f::R];
     float dg = d[SkPM4f::G];
@@ -289,18 +289,18 @@
     float sr = s[SkPM4f::R];
     float sg = s[SkPM4f::G];
     float sb = s[SkPM4f::B];
-    
+
     float da = d[SkPM4f::A];
     float dr = d[SkPM4f::R];
     float dg = d[SkPM4f::G];
     float db = d[SkPM4f::B];
-    
+
     float Dr = dr;
     float Dg = dg;
     float Db = db;
     SetSat(&Dr, &Dg, &Db, Sat(sr, sg, sb) * da);
     SetLum(&Dr, &Dg, &Db, sa * da, Lum(dr, dg, db) * sa);
-    
+
     return color_alpha(s * inv_alpha(d) + d * inv_alpha(s) + set_argb(0, Dr, Dg, Db),
                        sa + da - sa * da);
 }
@@ -310,7 +310,7 @@
     float sr = s[SkPM4f::R];
     float sg = s[SkPM4f::G];
     float sb = s[SkPM4f::B];
-    
+
     float da = d[SkPM4f::A];
     float dr = d[SkPM4f::R];
     float dg = d[SkPM4f::G];
@@ -320,7 +320,7 @@
     float Sg = sg;
     float Sb = sb;
     SetLum(&Sr, &Sg, &Sb, sa * da, Lum(dr, dg, db) * sa);
-    
+
     Sk4f res = color_alpha(s * inv_alpha(d) + d * inv_alpha(s) + set_argb(0, Sr, Sg, Sb),
                            sa + da - sa * da);
     // Can return tiny negative values ...
@@ -332,17 +332,17 @@
     float sr = s[SkPM4f::R];
     float sg = s[SkPM4f::G];
     float sb = s[SkPM4f::B];
-    
+
     float da = d[SkPM4f::A];
     float dr = d[SkPM4f::R];
     float dg = d[SkPM4f::G];
     float db = d[SkPM4f::B];
-    
+
     float Dr = dr;
     float Dg = dg;
     float Db = db;
     SetLum(&Dr, &Dg, &Db, sa * da, Lum(sr, sg, sb) * da);
-    
+
     Sk4f res = color_alpha(s * inv_alpha(d) + d * inv_alpha(s) + set_argb(0, Dr, Dg, Db),
                            sa + da - sa * da);
     // Can return tiny negative values ...
diff --git a/src/core/SkXfermodeU64.cpp b/src/core/SkXfermodeU64.cpp
index d3ddb2f..630a9d0 100644
--- a/src/core/SkXfermodeU64.cpp
+++ b/src/core/SkXfermodeU64.cpp
@@ -238,7 +238,7 @@
 SkXfermode::D64Proc SkXfermode::onGetD64Proc(uint32_t flags) const {
     SkASSERT(0 == (flags & ~7));
     flags &= 7;
-    
+
     Mode mode;
     return this->asMode(&mode) ? find_proc(mode, flags) : gProcs_General[flags];
 }
@@ -246,4 +246,3 @@
 SkXfermode::D64Proc SkXfermode::GetD64Proc(SkXfermode* xfer, uint32_t flags) {
     return xfer ? xfer->onGetD64Proc(flags) : find_proc(SkXfermode::kSrcOver_Mode, flags);
 }
-
diff --git a/src/core/SkYUVPlanesCache.cpp b/src/core/SkYUVPlanesCache.cpp
index 336b581..07a07c6 100644
--- a/src/core/SkYUVPlanesCache.cpp
+++ b/src/core/SkYUVPlanesCache.cpp
@@ -77,7 +77,7 @@
     if (!CHECK_LOCAL(localCache, find, Find, key, YUVPlanesRec::Visitor, &result)) {
         return nullptr;
     }
-    
+
     *info = result.fInfo;
     return result.fData;
 }
diff --git a/src/effects/GrCircleBlurFragmentProcessor.cpp b/src/effects/GrCircleBlurFragmentProcessor.cpp
index 50fbbac..afab4b4 100644
--- a/src/effects/GrCircleBlurFragmentProcessor.cpp
+++ b/src/effects/GrCircleBlurFragmentProcessor.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2015 Google Inc.
  *
@@ -57,7 +56,7 @@
 
     // We just want to compute "length(vec) - %s.z + 0.5) * %s.w" but need to rearrange
     // for precision
-    fragBuilder->codeAppendf("vec2 vec = vec2( (%s.x - %s.x) * %s.w , (%s.y - %s.y) * %s.w );", 
+    fragBuilder->codeAppendf("vec2 vec = vec2( (%s.x - %s.x) * %s.w , (%s.y - %s.y) * %s.w );",
                              fragmentPos, dataName, dataName,
                              fragmentPos, dataName, dataName);
     fragBuilder->codeAppendf("float dist = length(vec) + ( 0.5 - %s.z ) * %s.w;",
@@ -88,7 +87,7 @@
 GrCircleBlurFragmentProcessor::GrCircleBlurFragmentProcessor(const SkRect& circle,
                                                              float sigma,
                                                              float offset,
-                                                             GrTexture* blurProfile) 
+                                                             GrTexture* blurProfile)
     : fCircle(circle)
     , fSigma(sigma)
     , fOffset(offset)
diff --git a/src/effects/GrCircleBlurFragmentProcessor.h b/src/effects/GrCircleBlurFragmentProcessor.h
index 2a97646..ca12db7 100644
--- a/src/effects/GrCircleBlurFragmentProcessor.h
+++ b/src/effects/GrCircleBlurFragmentProcessor.h
@@ -18,7 +18,7 @@
 
 class GrTextureProvider;
 
-// This FP handles the special case of a blurred circle. It uses a 1D 
+// This FP handles the special case of a blurred circle. It uses a 1D
 // profile that is just rotated about the origin of the circle.
 class GrCircleBlurFragmentProcessor : public GrFragmentProcessor {
 public:
diff --git a/src/effects/Sk1DPathEffect.cpp b/src/effects/Sk1DPathEffect.cpp
index 1d147bd..0d61632 100644
--- a/src/effects/Sk1DPathEffect.cpp
+++ b/src/effects/Sk1DPathEffect.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/effects/Sk2DPathEffect.cpp b/src/effects/Sk2DPathEffect.cpp
index a54f453..da43d22 100644
--- a/src/effects/Sk2DPathEffect.cpp
+++ b/src/effects/Sk2DPathEffect.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/effects/SkAlphaThresholdFilter.cpp b/src/effects/SkAlphaThresholdFilter.cpp
index d3d36f7..55dfe58 100644
--- a/src/effects/SkAlphaThresholdFilter.cpp
+++ b/src/effects/SkAlphaThresholdFilter.cpp
@@ -410,4 +410,3 @@
     str->append(")");
 }
 #endif
-
diff --git a/src/effects/SkArithmeticMode.cpp b/src/effects/SkArithmeticMode.cpp
index c8e0756..32238f1 100644
--- a/src/effects/SkArithmeticMode.cpp
+++ b/src/effects/SkArithmeticMode.cpp
@@ -25,7 +25,7 @@
         fK[3] = k4;
         fEnforcePMColor = enforcePMColor;
     }
-    
+
     void xfer32(SkPMColor[], const SkPMColor[], int count, const SkAlpha[]) const override;
 
     SK_TO_STRING_OVERRIDE()
@@ -147,7 +147,7 @@
                SkScalarNearlyEqual(k3, SK_Scalar1) && SkScalarNearlyZero(k4)) {
         return SkXfermode::Create(SkXfermode::kDst_Mode);
     }
-    
+
     return new SkArithmeticMode_scalar(k1, k2, k3, k4, enforcePMColor);
 }
 
diff --git a/src/effects/SkArithmeticMode_gpu.h b/src/effects/SkArithmeticMode_gpu.h
index 18530e9..a44ac11 100644
--- a/src/effects/SkArithmeticMode_gpu.h
+++ b/src/effects/SkArithmeticMode_gpu.h
@@ -85,12 +85,12 @@
                                   GrXPFactory::InvariantBlendedColor*) const override;
 
 private:
-    GrArithmeticXPFactory(float k1, float k2, float k3, float k4, bool enforcePMColor); 
+    GrArithmeticXPFactory(float k1, float k2, float k3, float k4, bool enforcePMColor);
 
     GrXferProcessor* onCreateXferProcessor(const GrCaps& caps,
                                            const GrPipelineOptimizations& optimizations,
                                            bool hasMixedSamples,
-                                           const DstTexture*) const override; 
+                                           const DstTexture*) const override;
 
     bool onWillReadDstColor(const GrCaps& caps,
                             const GrPipelineOptimizations& optimizations,
diff --git a/src/effects/SkAvoidXfermode.cpp b/src/effects/SkAvoidXfermode.cpp
index a4fbc98..d9678f5 100644
--- a/src/effects/SkAvoidXfermode.cpp
+++ b/src/effects/SkAvoidXfermode.cpp
@@ -223,7 +223,7 @@
     }
 
     AvoidFP(SkColor opColor, uint8_t tolerance,
-            SkAvoidXfermode::Mode mode, const GrFragmentProcessor* dst) 
+            SkAvoidXfermode::Mode mode, const GrFragmentProcessor* dst)
         : fOpColor(opColor), fTolerance(tolerance), fMode(mode) {
         this->initClassID<AvoidFP>();
 
@@ -377,7 +377,7 @@
 
     void onGetGLSLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBuilder* b) const override;
 
-    bool onIsEqual(const GrXferProcessor& xpBase) const override { 
+    bool onIsEqual(const GrXferProcessor& xpBase) const override {
         const AvoidXP& xp = xpBase.cast<AvoidXP>();
 
         return fOpColor == xp.fOpColor &&
diff --git a/src/effects/SkBlurImageFilter.cpp b/src/effects/SkBlurImageFilter.cpp
index 60d8d17..65c0aa8 100644
--- a/src/effects/SkBlurImageFilter.cpp
+++ b/src/effects/SkBlurImageFilter.cpp
@@ -212,7 +212,7 @@
         SkOpts::box_blur_xy(t,  h,  dstBoundsT,   d, kernelSizeY3, highOffsetY, highOffsetY, h, w);
     }
 
-    return SkSpecialImage::MakeFromRaster(source->internal_getProxy(), 
+    return SkSpecialImage::MakeFromRaster(source->internal_getProxy(),
                                           SkIRect::MakeWH(dstBounds.width(),
                                                           dstBounds.height()),
                                           dst);
diff --git a/src/effects/SkBlurMask.cpp b/src/effects/SkBlurMask.cpp
index 4d05353..d22881a 100644
--- a/src/effects/SkBlurMask.cpp
+++ b/src/effects/SkBlurMask.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/effects/SkBlurMaskFilter.cpp b/src/effects/SkBlurMaskFilter.cpp
index 7d77a99..517aa3a 100644
--- a/src/effects/SkBlurMaskFilter.cpp
+++ b/src/effects/SkBlurMaskFilter.cpp
@@ -624,8 +624,8 @@
         // in OpenGL ES, mediump floats have a minimum range of 2^14. If we have coordinates bigger
         // than that, the shader math will end up with infinities and result in the blur effect not
         // working correctly. To avoid this, we switch into highp when the coordinates are too big.
-        // As 2^14 is the minimum range but the actual range can be bigger, we might end up 
-        // switching to highp sooner than strictly necessary, but most devices that have a bigger 
+        // As 2^14 is the minimum range but the actual range can be bigger, we might end up
+        // switching to highp sooner than strictly necessary, but most devices that have a bigger
         // range for mediump also have mediump being exactly the same as highp (e.g. all non-OpenGL
         // ES devices), and thus incur no additional penalty for the switch.
         static const SkScalar kMAX_BLUR_COORD = SkIntToScalar(16000);
@@ -744,12 +744,12 @@
         fragBuilder->codeAppendf("vec4 src=vec4(1);");
     }
 
-    fragBuilder->codeAppendf("%s vec2 translatedPos = %s.xy - %s.xy;", precisionString, fragmentPos, 
+    fragBuilder->codeAppendf("%s vec2 translatedPos = %s.xy - %s.xy;", precisionString, fragmentPos,
                              rectName);
     fragBuilder->codeAppendf("%s float width = %s.z - %s.x;", precisionString, rectName, rectName);
     fragBuilder->codeAppendf("%s float height = %s.w - %s.y;", precisionString, rectName, rectName);
 
-    fragBuilder->codeAppendf("%s vec2 smallDims = vec2(width - %s, height - %s);", precisionString, 
+    fragBuilder->codeAppendf("%s vec2 smallDims = vec2(width - %s, height - %s);", precisionString,
                              profileSizeName, profileSizeName);
     fragBuilder->codeAppendf("%s float center = 2.0 * floor(%s/2.0 + .25) - 1.0;", precisionString,
                              profileSizeName);
@@ -757,7 +757,7 @@
 
     OutputRectBlurProfileLookup(fragBuilder, args.fSamplers[0], "horiz_lookup", profileSizeName,
                                 "translatedPos.x", "width", "wh.x");
-    OutputRectBlurProfileLookup(fragBuilder, args.fSamplers[0], "vert_lookup", profileSizeName, 
+    OutputRectBlurProfileLookup(fragBuilder, args.fSamplers[0], "vert_lookup", profileSizeName,
                                 "translatedPos.y", "height", "wh.y");
 
     fragBuilder->codeAppendf("float final = horiz_lookup * vert_lookup;");
@@ -1168,7 +1168,7 @@
     SkRect proxyRect = rrect.rect();
     proxyRect.outset(extra, extra);
 
-    SkAutoTUnref<const GrFragmentProcessor> fp(GrRRectBlurEffect::Create(texProvider, 
+    SkAutoTUnref<const GrFragmentProcessor> fp(GrRRectBlurEffect::Create(texProvider,
                                                                          xformedSigma, rrect));
     if (!fp) {
         return false;
diff --git a/src/effects/SkColorFilterImageFilter.cpp b/src/effects/SkColorFilterImageFilter.cpp
index 1e2cdac..1da8b2c 100644
--- a/src/effects/SkColorFilterImageFilter.cpp
+++ b/src/effects/SkColorFilterImageFilter.cpp
@@ -35,7 +35,7 @@
 }
 
 SkColorFilterImageFilter::SkColorFilterImageFilter(SkColorFilter* cf,
-                                                   SkImageFilter* input, 
+                                                   SkImageFilter* input,
                                                    const CropRect* cropRect)
     : INHERITED(1, &input, cropRect)
     , fColorFilter(SkRef(cf)) {
diff --git a/src/effects/SkColorMatrix.cpp b/src/effects/SkColorMatrix.cpp
index d99d51e..45cd502 100644
--- a/src/effects/SkColorMatrix.cpp
+++ b/src/effects/SkColorMatrix.cpp
@@ -192,4 +192,3 @@
     setrow(fMat + 10, 1, kU2B, 0);
     fMat[kA_Scale] = 1;
 }
-
diff --git a/src/effects/SkCornerPathEffect.cpp b/src/effects/SkCornerPathEffect.cpp
index 325e2ca..c38889c 100644
--- a/src/effects/SkCornerPathEffect.cpp
+++ b/src/effects/SkCornerPathEffect.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/effects/SkDiscretePathEffect.cpp b/src/effects/SkDiscretePathEffect.cpp
index 1989d9d..5e68dc6 100644
--- a/src/effects/SkDiscretePathEffect.cpp
+++ b/src/effects/SkDiscretePathEffect.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/effects/SkDisplacementMapEffect.cpp b/src/effects/SkDisplacementMapEffect.cpp
index ab4767c..ec75fd0 100644
--- a/src/effects/SkDisplacementMapEffect.cpp
+++ b/src/effects/SkDisplacementMapEffect.cpp
@@ -631,4 +631,3 @@
     b->add32(xKey | yKey);
 }
 #endif
-
diff --git a/src/effects/SkEmbossMask.cpp b/src/effects/SkEmbossMask.cpp
index 32e9b23..310addf 100644
--- a/src/effects/SkEmbossMask.cpp
+++ b/src/effects/SkEmbossMask.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/effects/SkEmbossMask.h b/src/effects/SkEmbossMask.h
index 7053be2..80fcb20 100644
--- a/src/effects/SkEmbossMask.h
+++ b/src/effects/SkEmbossMask.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/effects/SkEmbossMask_Table.h b/src/effects/SkEmbossMask_Table.h
index 0d331ee..b7073f3 100644
--- a/src/effects/SkEmbossMask_Table.h
+++ b/src/effects/SkEmbossMask_Table.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/effects/SkGpuBlurUtils.cpp b/src/effects/SkGpuBlurUtils.cpp
index 7fac2a6..c43f273 100644
--- a/src/effects/SkGpuBlurUtils.cpp
+++ b/src/effects/SkGpuBlurUtils.cpp
@@ -300,7 +300,7 @@
                     srcDrawContext.reset(context->drawContext(srcTexture->asRenderTarget()));
                     if (!srcDrawContext) {
                         return nullptr;
-                    }        
+                    }
                 }
 
                 // Clear out a radius to the right of the srcRect to prevent the
@@ -333,7 +333,7 @@
                     srcDrawContext.reset(context->drawContext(srcTexture->asRenderTarget()));
                     if (!srcDrawContext) {
                         return nullptr;
-                    }        
+                    }
                 }
 
                 // Clear out a radius below the srcRect to prevent the Y
diff --git a/src/effects/SkLayerDrawLooper.cpp b/src/effects/SkLayerDrawLooper.cpp
index 526fb4d..0a5c4f9 100644
--- a/src/effects/SkLayerDrawLooper.cpp
+++ b/src/effects/SkLayerDrawLooper.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/src/effects/SkLayerRasterizer.cpp b/src/effects/SkLayerRasterizer.cpp
index 351265c..a51613a 100644
--- a/src/effects/SkLayerRasterizer.cpp
+++ b/src/effects/SkLayerRasterizer.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/effects/SkLightingImageFilter.cpp b/src/effects/SkLightingImageFilter.cpp
index 4b0ab8e..9202818 100644
--- a/src/effects/SkLightingImageFilter.cpp
+++ b/src/effects/SkLightingImageFilter.cpp
@@ -743,7 +743,7 @@
 
 class SkImageFilterLight : public SkRefCnt {
 public:
-    
+
 
     enum LightType {
         kDistant_LightType,
@@ -880,8 +880,8 @@
         // Use X scale and Y scale on Z and average the result
         SkPoint locationZ = SkPoint::Make(fLocation.fZ, fLocation.fZ);
         matrix.mapVectors(&locationZ, 1);
-        SkPoint3 location = SkPoint3::Make(location2.fX, 
-                                           location2.fY, 
+        SkPoint3 location = SkPoint3::Make(location2.fX,
+                                           location2.fY,
                                            SkScalarAve(locationZ.fX, locationZ.fY));
         return new SkPointLight(location, color());
     }
diff --git a/src/effects/SkMergeImageFilter.cpp b/src/effects/SkMergeImageFilter.cpp
index e3b99c6..47d33df 100755
--- a/src/effects/SkMergeImageFilter.cpp
+++ b/src/effects/SkMergeImageFilter.cpp
@@ -77,7 +77,7 @@
         if (!inputs[i]) {
             continue;
         }
-        const SkIRect inputBounds = SkIRect::MakeXYWH(offsets[i].fX, offsets[i].fY, 
+        const SkIRect inputBounds = SkIRect::MakeXYWH(offsets[i].fX, offsets[i].fY,
                                                       inputs[i]->width(), inputs[i]->height());
         bounds.join(inputBounds);
     }
@@ -165,7 +165,7 @@
 #ifndef SK_IGNORE_TO_STRING
 void SkMergeImageFilter::toString(SkString* str) const {
     str->appendf("SkMergeImageFilter: (");
-    
+
     for (int i = 0; i < this->countInputs(); ++i) {
         SkImageFilter* filter = this->getInput(i);
         str->appendf("%d: (", i);
diff --git a/src/effects/SkMorphologyImageFilter.cpp b/src/effects/SkMorphologyImageFilter.cpp
index b592fd0..8c952e8 100644
--- a/src/effects/SkMorphologyImageFilter.cpp
+++ b/src/effects/SkMorphologyImageFilter.cpp
@@ -611,7 +611,7 @@
         call_proc_X(procX, inputPixmap, &dst, width, srcBounds);
     } else if (height > 0) {
         call_proc_Y(procY,
-                    inputPixmap.addr32(srcBounds.left(), srcBounds.top()), 
+                    inputPixmap.addr32(srcBounds.left(), srcBounds.top()),
                     inputPixmap.rowBytesAsPixels(),
                     &dst, height, srcBounds);
     }
@@ -632,4 +632,3 @@
                                                         SkIPoint* offset) const {
     return this->filterImageGeneric(false, source, ctx, offset);
 }
-
diff --git a/src/effects/SkPackBits.h b/src/effects/SkPackBits.h
index f6430fa..2dc7677 100644
--- a/src/effects/SkPackBits.h
+++ b/src/effects/SkPackBits.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2008 The Android Open Source Project
  *
diff --git a/src/effects/SkPictureImageFilter.cpp b/src/effects/SkPictureImageFilter.cpp
index 8f8853e..f5e3d46 100644
--- a/src/effects/SkPictureImageFilter.cpp
+++ b/src/effects/SkPictureImageFilter.cpp
@@ -17,7 +17,7 @@
     : INHERITED(0, 0, nullptr)
     , fPicture(std::move(picture))
     , fCropRect(fPicture ? fPicture->cullRect() : SkRect::MakeEmpty())
-    , fPictureResolution(kDeviceSpace_PictureResolution) 
+    , fPictureResolution(kDeviceSpace_PictureResolution)
     , fFilterQuality(kLow_SkFilterQuality) {
 }
 
@@ -48,7 +48,7 @@
         pictureResolution = kDeviceSpace_PictureResolution;
     } else {
         pictureResolution = (PictureResolution)buffer.readInt();
-    }  
+    }
 
     if (kLocalSpace_PictureResolution == pictureResolution) {
         //filterLevel is only serialized if pictureResolution is LocalSpace
@@ -105,9 +105,9 @@
         return false;
     }
 
-    if (kDeviceSpace_PictureResolution == fPictureResolution || 
+    if (kDeviceSpace_PictureResolution == fPictureResolution ||
         0 == (ctx.ctm().getType() & ~SkMatrix::kTranslate_Mask)) {
-        this->drawPictureAtDeviceResolution(device.get(), bounds, ctx);        
+        this->drawPictureAtDeviceResolution(device.get(), bounds, ctx);
     } else {
         this->drawPictureAtLocalResolution(proxy, device.get(), bounds, ctx);
     }
@@ -161,7 +161,7 @@
 #ifndef SK_IGNORE_TO_STRING
 void SkPictureImageFilter::toString(SkString* str) const {
     str->appendf("SkPictureImageFilter: (");
-    str->appendf("crop: (%f,%f,%f,%f) ", 
+    str->appendf("crop: (%f,%f,%f,%f) ",
                  fCropRect.fLeft, fCropRect.fTop, fCropRect.fRight, fCropRect.fBottom);
     if (fPicture) {
         str->appendf("picture: (%f,%f,%f,%f)",
diff --git a/src/effects/SkPixelXorXfermode.cpp b/src/effects/SkPixelXorXfermode.cpp
index e175840..c69fe09 100644
--- a/src/effects/SkPixelXorXfermode.cpp
+++ b/src/effects/SkPixelXorXfermode.cpp
@@ -294,7 +294,7 @@
     void onSetData(const GrGLSLProgramDataManager& pdman,
                    const GrXferProcessor& processor) override {
         const PixelXorXP& pixelXor = processor.cast<PixelXorXP>();
-        pdman.set3f(fOpColorUni, 
+        pdman.set3f(fOpColorUni,
                     SkGetPackedR32(pixelXor.opColor())/255.0f,
                     SkGetPackedG32(pixelXor.opColor())/255.0f,
                     SkGetPackedB32(pixelXor.opColor())/255.0f);
diff --git a/src/effects/SkTableMaskFilter.cpp b/src/effects/SkTableMaskFilter.cpp
index 88484d7..ddf9f33 100644
--- a/src/effects/SkTableMaskFilter.cpp
+++ b/src/effects/SkTableMaskFilter.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/src/effects/SkXfermodeImageFilter.cpp b/src/effects/SkXfermodeImageFilter.cpp
index 09651b6..8f7fdc7 100644
--- a/src/effects/SkXfermodeImageFilter.cpp
+++ b/src/effects/SkXfermodeImageFilter.cpp
@@ -247,4 +247,3 @@
 }
 
 #endif
-
diff --git a/src/effects/gradients/SkGradientBitmapCache.cpp b/src/effects/gradients/SkGradientBitmapCache.cpp
index cba103b..20b87e0 100644
--- a/src/effects/gradients/SkGradientBitmapCache.cpp
+++ b/src/effects/gradients/SkGradientBitmapCache.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2010 Google Inc.
  *
diff --git a/src/effects/gradients/SkGradientBitmapCache.h b/src/effects/gradients/SkGradientBitmapCache.h
index 81bd214..0dcd322 100644
--- a/src/effects/gradients/SkGradientBitmapCache.h
+++ b/src/effects/gradients/SkGradientBitmapCache.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2010 Google Inc.
  *
diff --git a/src/effects/gradients/SkRadialGradient.cpp b/src/effects/gradients/SkRadialGradient.cpp
index 254e438..1312b36 100644
--- a/src/effects/gradients/SkRadialGradient.cpp
+++ b/src/effects/gradients/SkRadialGradient.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2012 Google Inc.
  *
diff --git a/src/effects/gradients/SkRadialGradient.h b/src/effects/gradients/SkRadialGradient.h
index 428d7fa..6e41e79 100644
--- a/src/effects/gradients/SkRadialGradient.h
+++ b/src/effects/gradients/SkRadialGradient.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2012 Google Inc.
  *
diff --git a/src/effects/gradients/SkSweepGradient.cpp b/src/effects/gradients/SkSweepGradient.cpp
index 3021e4b..f14035c 100644
--- a/src/effects/gradients/SkSweepGradient.cpp
+++ b/src/effects/gradients/SkSweepGradient.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2012 Google Inc.
  *
diff --git a/src/effects/gradients/SkSweepGradient.h b/src/effects/gradients/SkSweepGradient.h
index f458cea..de57335 100644
--- a/src/effects/gradients/SkSweepGradient.h
+++ b/src/effects/gradients/SkSweepGradient.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2012 Google Inc.
  *
diff --git a/src/effects/gradients/SkTwoPointConicalGradient.h b/src/effects/gradients/SkTwoPointConicalGradient.h
index 5783c39..309b666 100644
--- a/src/effects/gradients/SkTwoPointConicalGradient.h
+++ b/src/effects/gradients/SkTwoPointConicalGradient.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2012 Google Inc.
  *
diff --git a/src/effects/gradients/SkTwoPointConicalGradient_gpu.cpp b/src/effects/gradients/SkTwoPointConicalGradient_gpu.cpp
index 5394369..4f1dabe 100644
--- a/src/effects/gradients/SkTwoPointConicalGradient_gpu.cpp
+++ b/src/effects/gradients/SkTwoPointConicalGradient_gpu.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2014 Google Inc.
  *
@@ -293,7 +292,7 @@
     if (fCachedRadius != radius0 ||
         fCachedDiffRadius != diffRadius) {
 
-        pdman.set3f(fParamUni, SkScalarToFloat(radius0), 
+        pdman.set3f(fParamUni, SkScalarToFloat(radius0),
                     SkScalarToFloat(SkScalarMul(radius0, radius0)), SkScalarToFloat(diffRadius));
         fCachedRadius = radius0;
         fCachedDiffRadius = diffRadius;
diff --git a/src/gpu/GrAuditTrail.cpp b/src/gpu/GrAuditTrail.cpp
index 353d901..82dc7f7 100644
--- a/src/gpu/GrAuditTrail.cpp
+++ b/src/gpu/GrAuditTrail.cpp
@@ -19,11 +19,11 @@
     auditBatch->fClientID = kGrAuditTrailInvalidID;
     auditBatch->fBatchListID = kGrAuditTrailInvalidID;
     auditBatch->fChildID = kGrAuditTrailInvalidID;
-    
+
     // consume the current stack trace if any
     auditBatch->fStackTrace = fCurrentStackTrace;
     fCurrentStackTrace.reset();
-    
+
     if (fClientID != kGrAuditTrailInvalidID) {
         auditBatch->fClientID = fClientID;
         Batches** batchesLookup = fClientIDLookup.find(fClientID);
@@ -70,13 +70,13 @@
     // steal all of consumed's batches
     for (int i = 0; i < consumedBatch.fChildren.count(); i++) {
         Batch* childBatch = consumedBatch.fChildren[i];
-        
+
         // set the ids for the child batch
         childBatch->fBatchListID = index;
         childBatch->fChildID = consumerBatch.fChildren.count();
         consumerBatch.fChildren.push_back(childBatch);
     }
-    
+
     // Update the bounds for the combineWith node
     consumerBatch.fBounds = consumer->bounds();
 
@@ -116,7 +116,7 @@
             if (kGrAuditTrailInvalidID == currentBatchListID ||
                 batch->fBatchListID != currentBatchListID) {
                 BatchInfo& outBatchInfo = outInfo->push_back();
-                
+
                 // copy out all of the batches so the client can display them even if
                 // they have a different clientID
                 this->copyOutFromBatchList(&outBatchInfo, batch->fBatchListID);
diff --git a/src/gpu/GrAutoLocaleSetter.h b/src/gpu/GrAutoLocaleSetter.h
index 6bfff0c..564abd9 100644
--- a/src/gpu/GrAutoLocaleSetter.h
+++ b/src/gpu/GrAutoLocaleSetter.h
@@ -36,7 +36,7 @@
 public:
     GrAutoLocaleSetter (const char* name) {
 #if defined(SK_BUILD_FOR_WIN)
-        fOldPerThreadLocale = _configthreadlocale(_ENABLE_PER_THREAD_LOCALE);        
+        fOldPerThreadLocale = _configthreadlocale(_ENABLE_PER_THREAD_LOCALE);
         char* oldLocale = setlocale(LC_ALL, name);
         if (oldLocale) {
             fOldLocale = oldLocale;
@@ -84,4 +84,3 @@
 #undef HAVE_LOCALE_T
 
 #endif
-
diff --git a/src/gpu/GrBlurUtils.cpp b/src/gpu/GrBlurUtils.cpp
index 8658658..65b18a5 100644
--- a/src/gpu/GrBlurUtils.cpp
+++ b/src/gpu/GrBlurUtils.cpp
@@ -99,8 +99,8 @@
                                   const GrStrokeInfo& strokeInfo,
                                   bool doAA,
                                   int sampleCnt) {
-    // This mask will ultimately be drawn as a non-AA rect (see draw_mask). 
-    // Non-AA rects have a bad habit of snapping arbitrarily. Integerize here 
+    // This mask will ultimately be drawn as a non-AA rect (see draw_mask).
+    // Non-AA rects have a bad habit of snapping arbitrarily. Integerize here
     // so the mask draws in a reproducible manner.
     *maskRect = SkRect::Make(maskRect->roundOut());
 
@@ -275,7 +275,7 @@
                                strokeInfo, pathPtr, pathIsMutable);
 }
 
-void GrBlurUtils::drawPathWithMaskFilter(GrContext* context, 
+void GrBlurUtils::drawPathWithMaskFilter(GrContext* context,
                                          GrDrawContext* drawContext,
                                          const GrClip& clip,
                                          const SkPath& origSrcPath,
@@ -347,4 +347,3 @@
         drawContext->drawPath(clip, grPaint, viewMatrix, *pathPtr, strokeInfo);
     }
 }
-
diff --git a/src/gpu/GrBufferAllocPool.cpp b/src/gpu/GrBufferAllocPool.cpp
index ac34b5c..278cf86 100644
--- a/src/gpu/GrBufferAllocPool.cpp
+++ b/src/gpu/GrBufferAllocPool.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2010 Google Inc.
  *
diff --git a/src/gpu/GrCaps.cpp b/src/gpu/GrCaps.cpp
index 1c5371a..41f5b9b 100644
--- a/src/gpu/GrCaps.cpp
+++ b/src/gpu/GrCaps.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2015 Google Inc.
  *
diff --git a/src/gpu/GrClipMaskManager.cpp b/src/gpu/GrClipMaskManager.cpp
index e04adee..2700f56 100644
--- a/src/gpu/GrClipMaskManager.cpp
+++ b/src/gpu/GrClipMaskManager.cpp
@@ -86,9 +86,9 @@
             path.toggleInverseFillType();
         }
         GrStrokeInfo stroke(SkStrokeRec::kFill_InitStyle);
-    
+
         GrPathRendererChain::DrawType type;
-        
+
         if (needsStencil) {
             type = element->isAA()
                             ? GrPathRendererChain::kStencilAndColorAntiAlias_DrawType
@@ -96,9 +96,9 @@
         } else {
             type = element->isAA()
                             ? GrPathRendererChain::kColorAntiAlias_DrawType
-                            : GrPathRendererChain::kColor_DrawType;    
+                            : GrPathRendererChain::kColor_DrawType;
         }
-    
+
         GrPathRenderer::CanDrawPathArgs canDrawArgs;
         canDrawArgs.fShaderCaps = context->caps()->shaderCaps();
         canDrawArgs.fViewMatrix = &viewMatrix;
@@ -177,7 +177,7 @@
 
         SkRegion::Op op = element->getOp();
         bool invert = element->isInverseFilled();
-        bool needsStencil = invert || 
+        bool needsStencil = invert ||
                             SkRegion::kIntersect_Op == op || SkRegion::kReverseDifference_Op == op;
 
         if (PathNeedsSWRenderer(context, pipelineBuilder.getStencil().isDisabled(),
diff --git a/src/gpu/GrClipMaskManager.h b/src/gpu/GrClipMaskManager.h
index 3635454..ef0c2be 100644
--- a/src/gpu/GrClipMaskManager.h
+++ b/src/gpu/GrClipMaskManager.h
@@ -71,7 +71,7 @@
 
     bool setupScissorClip(const GrPipelineBuilder& pipelineBuilder,
                           GrPipelineBuilder::AutoRestoreStencil* ars,
-                          const SkIRect& scissor,    
+                          const SkIRect& scissor,
                           const SkRect* devBounds,
                           GrAppliedClip* out);
 
diff --git a/src/gpu/GrContextFactory.cpp b/src/gpu/GrContextFactory.cpp
index 4e1a3e0..00ae122 100755
--- a/src/gpu/GrContextFactory.cpp
+++ b/src/gpu/GrContextFactory.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2014 Google Inc.
  *
diff --git a/src/gpu/GrDrawContext.cpp b/src/gpu/GrDrawContext.cpp
index 12bb1de..9110b34 100644
--- a/src/gpu/GrDrawContext.cpp
+++ b/src/gpu/GrDrawContext.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2015 Google Inc.
  *
@@ -43,7 +42,7 @@
 
 class AutoCheckFlush {
 public:
-    AutoCheckFlush(GrDrawingManager* drawingManager) : fDrawingManager(drawingManager) { 
+    AutoCheckFlush(GrDrawingManager* drawingManager) : fDrawingManager(drawingManager) {
         SkASSERT(fDrawingManager);
     }
     ~AutoCheckFlush() { fDrawingManager->getContext()->flushIfNecessary(); }
@@ -270,7 +269,7 @@
     } else {
         // filled BW rect
         batch = GrRectBatchFactory::CreateNonAAFill(paint.getColor(), viewMatrix, rect,
-                                                    nullptr, nullptr);        
+                                                    nullptr, nullptr);
     }
 
     return batch;
@@ -348,7 +347,7 @@
                                                               width, snapToPixelCenters));
 
             // Depending on sub-pixel coordinates and the particular GPU, we may lose a corner of
-            // hairline rects. We jam all the vertices to pixel centers to avoid this, but not 
+            // hairline rects. We jam all the vertices to pixel centers to avoid this, but not
             // when MSAA is enabled because it can cause ugly artifacts.
         }
     }
@@ -364,7 +363,7 @@
         this->getDrawTarget()->drawBatch(pipelineBuilder, batch);
         return;
     }
-    
+
     SkPath path;
     path.setIsVolatile(true);
     path.addRect(rect);
@@ -519,12 +518,12 @@
     GR_AUDIT_TRAIL_AUTO_FRAME(fAuditTrail, "GrDrawContext::drawAtlas");
 
     AutoCheckFlush acf(fDrawingManager);
-        
+
     GrDrawAtlasBatch::Geometry geometry;
     geometry.fColor = paint.getColor();
     SkAutoTUnref<GrDrawBatch> batch(GrDrawAtlasBatch::Create(geometry, viewMatrix, spriteCount,
                                                              xform, texRect, colors));
-    
+
     GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip);
     this->getDrawTarget()->drawBatch(pipelineBuilder, batch);
 }
@@ -599,7 +598,7 @@
         }
     } else {
         inverseVM.reset();
-    }         
+    }
 
     GrPaint grPaint(paintIn);
     grPaint.setAntiAlias(false);
@@ -622,7 +621,7 @@
     if (applyAA) {
         bounds.outset(SK_ScalarHalf, SK_ScalarHalf);
     }
-  
+
     this->fillRectWithLocalMatrix(clip, grPaint, SkMatrix::I(), bounds, inverseVM);
     return true;
 }
@@ -866,8 +865,8 @@
     GR_AUDIT_TRAIL_AUTO_FRAME(fDrawContext->fAuditTrail, "GrDrawContext::drawPath");
 
     if (path.isEmpty() && path.isInverseFillType()) {
-        this->drawAndStencilRect(scissorRect, ss, op, invert, false, SkMatrix::I(), 
-                                 SkRect::MakeIWH(fDrawContext->fRenderTarget->width(), 
+        this->drawAndStencilRect(scissorRect, ss, op, invert, false, SkMatrix::I(),
+                                 SkRect::MakeIWH(fDrawContext->fRenderTarget->width(),
                                                  fDrawContext->fRenderTarget->height()));
         return true;
     }
diff --git a/src/gpu/GrDrawContextPriv.h b/src/gpu/GrDrawContextPriv.h
index 935b631..4482e35 100644
--- a/src/gpu/GrDrawContextPriv.h
+++ b/src/gpu/GrDrawContextPriv.h
@@ -46,7 +46,7 @@
     GrDrawContextPriv* operator&();
 
     GrDrawContext* fDrawContext;
-        
+
     friend class GrDrawContext; // to construct/copy this type.
 };
 
@@ -57,4 +57,3 @@
 }
 
 #endif
-
diff --git a/src/gpu/GrDrawTarget.cpp b/src/gpu/GrDrawTarget.cpp
index 39c1e32..49c46fe 100644
--- a/src/gpu/GrDrawTarget.cpp
+++ b/src/gpu/GrDrawTarget.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2010 Google Inc.
  *
@@ -468,7 +467,7 @@
         batch->bounds().fLeft, batch->bounds().fRight,
         batch->bounds().fTop, batch->bounds().fBottom);
     GrBATCH_INFO(SkTabString(batch->dumpInfo(), 1).c_str());
-    GrBATCH_INFO("\tOutcome:\n");    
+    GrBATCH_INFO("\tOutcome:\n");
     int maxCandidates = SkTMin(fMaxBatchLookback, fBatches.count());
     if (maxCandidates) {
         int i = 0;
@@ -568,13 +567,13 @@
         viewport.fWidth = rt->width();
         viewport.fHeight = rt->height();
         SkIRect ibounds;
-        ibounds.fLeft = SkTPin(SkScalarFloorToInt(batch->bounds().fLeft), viewport.fLeft, 
+        ibounds.fLeft = SkTPin(SkScalarFloorToInt(batch->bounds().fLeft), viewport.fLeft,
                               viewport.fWidth);
-        ibounds.fTop = SkTPin(SkScalarFloorToInt(batch->bounds().fTop), viewport.fBottom, 
+        ibounds.fTop = SkTPin(SkScalarFloorToInt(batch->bounds().fTop), viewport.fBottom,
                              viewport.fHeight);
-        ibounds.fRight = SkTPin(SkScalarCeilToInt(batch->bounds().fRight), viewport.fLeft, 
+        ibounds.fRight = SkTPin(SkScalarCeilToInt(batch->bounds().fRight), viewport.fLeft,
                                viewport.fWidth);
-        ibounds.fBottom = SkTPin(SkScalarCeilToInt(batch->bounds().fBottom), viewport.fBottom, 
+        ibounds.fBottom = SkTPin(SkScalarCeilToInt(batch->bounds().fBottom), viewport.fBottom,
                                 viewport.fHeight);
         if (scissor != nullptr && scissor->enabled()) {
             if (!ibounds.intersect(scissor->rect())) {
diff --git a/src/gpu/GrDrawingManager.cpp b/src/gpu/GrDrawingManager.cpp
index ca50fe4..6efc286 100644
--- a/src/gpu/GrDrawingManager.cpp
+++ b/src/gpu/GrDrawingManager.cpp
@@ -63,7 +63,7 @@
     }
     fFlushing = true;
 
-    SkDEBUGCODE(bool result =) 
+    SkDEBUGCODE(bool result =)
                         SkTTopoSort<GrDrawTarget, GrDrawTarget::TopoSortTraits>(&fDrawTargets);
     SkASSERT(result);
 
@@ -129,7 +129,7 @@
 
     *fDrawTargets.append() = dt;
 
-    // DrawingManager gets the creation ref - this ref is for the caller 
+    // DrawingManager gets the creation ref - this ref is for the caller
     return SkRef(dt);
 }
 
diff --git a/src/gpu/GrDrawingManager.h b/src/gpu/GrDrawingManager.h
index 0a4c3e3..f011b41 100644
--- a/src/gpu/GrDrawingManager.h
+++ b/src/gpu/GrDrawingManager.h
@@ -33,7 +33,7 @@
 
     GrDrawContext* drawContext(GrRenderTarget* rt, const SkSurfaceProps*);
 
-    // The caller automatically gets a ref on the returned drawTarget. It must 
+    // The caller automatically gets a ref on the returned drawTarget. It must
     // be balanced by an unref call.
     GrDrawTarget* newDrawTarget(GrRenderTarget* rt);
 
diff --git a/src/gpu/GrFragmentProcessor.cpp b/src/gpu/GrFragmentProcessor.cpp
index 495a7b3..46efd80 100644
--- a/src/gpu/GrFragmentProcessor.cpp
+++ b/src/gpu/GrFragmentProcessor.cpp
@@ -1,4 +1,3 @@
-
 /*
 * Copyright 2015 Google Inc.
 *
@@ -373,4 +372,3 @@
         return new SeriesFragmentProcessor(series, cnt);
     }
 }
-
diff --git a/src/gpu/GrGpu.cpp b/src/gpu/GrGpu.cpp
index 35c04ca..4f99ab8 100644
--- a/src/gpu/GrGpu.cpp
+++ b/src/gpu/GrGpu.cpp
@@ -488,4 +488,3 @@
     this->onDraw(pipeline, primProc, meshes, meshCount);
     return true;
 }
-
diff --git a/src/gpu/GrGpu.h b/src/gpu/GrGpu.h
index a49b2c2..8562d1e 100644
--- a/src/gpu/GrGpu.h
+++ b/src/gpu/GrGpu.h
@@ -132,7 +132,7 @@
      * @return the buffer if successful, otherwise nullptr.
      */
     GrBuffer* createBuffer(GrBufferType, size_t size, GrAccessPattern);
-    
+
     /**
      * Resolves MSAA.
      */
@@ -357,7 +357,7 @@
               const GrMesh*,
               int meshCount);
 
-    // Called by drawtarget when flushing. 
+    // Called by drawtarget when flushing.
     // Provides a hook for post-flush actions (e.g. PLS reset and Vulkan command buffer submits).
     virtual void finishDrawTarget() {}
 
diff --git a/src/gpu/GrGpuFactory.cpp b/src/gpu/GrGpuFactory.cpp
index 8525af7..c6134b6 100644
--- a/src/gpu/GrGpuFactory.cpp
+++ b/src/gpu/GrGpuFactory.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/src/gpu/GrGpuResource.cpp b/src/gpu/GrGpuResource.cpp
index 7c053b3..53e568b 100644
--- a/src/gpu/GrGpuResource.cpp
+++ b/src/gpu/GrGpuResource.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
@@ -37,7 +36,7 @@
     SkASSERT(this->wasDestroyed());
 }
 
-void GrGpuResource::release() { 
+void GrGpuResource::release() {
     SkASSERT(fGpu);
     this->onRelease();
     get_resource_cache(fGpu)->resourceAccess().removeResource(this);
diff --git a/src/gpu/GrGpuResourceCacheAccess.h b/src/gpu/GrGpuResourceCacheAccess.h
index 4b47a1c..cccbecf 100644
--- a/src/gpu/GrGpuResourceCacheAccess.h
+++ b/src/gpu/GrGpuResourceCacheAccess.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2014 Google Inc.
  *
@@ -41,7 +40,7 @@
      * ownership of.
      */
     bool isAdopted() const { return GrGpuResource::kAdopted_LifeCycle == fResource->fLifeCycle; }
- 
+
     /**
      * Called by the cache to delete the resource under normal circumstances.
      */
diff --git a/src/gpu/GrGpuResourcePriv.h b/src/gpu/GrGpuResourcePriv.h
index 5da1c94..8b67283 100644
--- a/src/gpu/GrGpuResourcePriv.h
+++ b/src/gpu/GrGpuResourcePriv.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2015 Google Inc.
  *
diff --git a/src/gpu/GrImageIDTextureAdjuster.h b/src/gpu/GrImageIDTextureAdjuster.h
index 454571e..ad5e671 100644
--- a/src/gpu/GrImageIDTextureAdjuster.h
+++ b/src/gpu/GrImageIDTextureAdjuster.h
@@ -15,7 +15,7 @@
 class SkImage_Base;
 class SkImageCacherator;
 
-/** Implementation for texture-backed SkBitmaps. The bitmap must stay in scope and unmodified 
+/** Implementation for texture-backed SkBitmaps. The bitmap must stay in scope and unmodified
     while this object exists. */
 class GrBitmapTextureAdjuster : public GrTextureAdjuster {
 public:
diff --git a/src/gpu/GrInvariantOutput.cpp b/src/gpu/GrInvariantOutput.cpp
index 8de5817..ee64d33 100644
--- a/src/gpu/GrInvariantOutput.cpp
+++ b/src/gpu/GrInvariantOutput.cpp
@@ -29,4 +29,3 @@
 }
 
 #endif // end DEBUG
-
diff --git a/src/gpu/GrLayerAtlas.cpp b/src/gpu/GrLayerAtlas.cpp
index c1f8732..ccb208a 100644
--- a/src/gpu/GrLayerAtlas.cpp
+++ b/src/gpu/GrLayerAtlas.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2010 Google Inc.
  *
@@ -167,4 +166,3 @@
     // If the above fails, then the current plot list has no room
     return nullptr;
 }
-
diff --git a/src/gpu/GrLayerAtlas.h b/src/gpu/GrLayerAtlas.h
index e84667b..cf18262 100644
--- a/src/gpu/GrLayerAtlas.h
+++ b/src/gpu/GrLayerAtlas.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2010 Google Inc.
  *
@@ -20,10 +19,10 @@
 class GrRectanizer;
 
 // The backing GrTexture for a GrLayerAtlas is broken into a spatial grid of Plots. When
-// the atlas needs space on the texture (i.e., in response to an addToAtlas call), it 
-// iterates through the plots in use by the requesting client looking for space and, 
-// if no space is found, opens up a new Plot for that client. The Plots keep track of 
-// subimage placement via their GrRectanizer. 
+// the atlas needs space on the texture (i.e., in response to an addToAtlas call), it
+// iterates through the plots in use by the requesting client looking for space and,
+// if no space is found, opens up a new Plot for that client. The Plots keep track of
+// subimage placement via their GrRectanizer.
 //
 // If all Plots are full, the replacement strategy is up to the client. The Plot::reset
 // call will remove a Plot's knowledge of any allocated rects - freeing its space for reuse.
@@ -57,7 +56,7 @@
 
     // This class allows each client to independently track the Plots in
     // which its data is stored.
-    // For example, multiple pictures may simultaneously store their layers in the 
+    // For example, multiple pictures may simultaneously store their layers in the
     // layer atlas. When a picture goes away it can use the ClientPlotUsage to remove itself
     // from those plots.
     class ClientPlotUsage {
@@ -87,8 +86,8 @@
         }
 
 #ifdef SK_DEBUG
-        bool contains(const Plot* plot) const { 
-            return fPlots.contains(const_cast<Plot*>(plot)); 
+        bool contains(const Plot* plot) const {
+            return fPlots.contains(const_cast<Plot*>(plot));
         }
 #endif
 
@@ -97,13 +96,13 @@
         SkDEBUGCODE(int fMaxPlots;)
     };
 
-    GrLayerAtlas(GrTextureProvider*, GrPixelConfig, GrSurfaceFlags flags, 
+    GrLayerAtlas(GrTextureProvider*, GrPixelConfig, GrSurfaceFlags flags,
                  const SkISize& backingTextureSize,
                  int numPlotsX, int numPlotsY);
     ~GrLayerAtlas();
 
-    // Requests a width x height block in the atlas. Upon success it returns 
-    // the containing Plot and absolute location in the backing texture. 
+    // Requests a width x height block in the atlas. Upon success it returns
+    // the containing Plot and absolute location in the backing texture.
     // nullptr is returned if there is no more space in the atlas.
     Plot* addToAtlas(ClientPlotUsage*, int width, int height, SkIPoint16* loc);
 
diff --git a/src/gpu/GrLayerCache.h b/src/gpu/GrLayerCache.h
index 4f4317c..b341cb2 100644
--- a/src/gpu/GrLayerCache.h
+++ b/src/gpu/GrLayerCache.h
@@ -34,7 +34,7 @@
     static uint32_t Hash(const uint32_t& key) { return SkChecksum::Mix(key); }
 
     // GrPictureInfo proper
-    GrPictureInfo(uint32_t pictureID) 
+    GrPictureInfo(uint32_t pictureID)
         : fPictureID(pictureID)
         , fPlotUsage(kNumPlots) {
 #if !GR_CACHE_HOISTED_LAYERS
diff --git a/src/gpu/GrLayerHoister.h b/src/gpu/GrLayerHoister.h
index 13cac51..8b338a8 100644
--- a/src/gpu/GrLayerHoister.h
+++ b/src/gpu/GrLayerHoister.h
@@ -47,7 +47,7 @@
         @param topLevelPicture The top-level picture that is about to be rendered
         @param initialMat  The CTM of the canvas into which the layers will be drawn
         @param query       The rectangle that is about to be drawn.
-        @param atlasedNeedRendering Out parameter storing the layers that 
+        @param atlasedNeedRendering Out parameter storing the layers that
                                     should be hoisted to the atlas
         @param recycled    Out parameter storing layers that are atlased but do not need rendering
         @param numSamples  The number if MSAA samples required
@@ -95,7 +95,7 @@
         @param layers       The hoisted layers
         @param replacements Replacement object that will be used for a replacement draw
     */
-    static void ConvertLayersToReplacements(const SkPicture* topLevelPicture, 
+    static void ConvertLayersToReplacements(const SkPicture* topLevelPicture,
                                             const SkTDArray<GrHoistedLayer>& layers,
                                             GrReplacements* replacements);
 
diff --git a/src/gpu/GrMemoryPool.cpp b/src/gpu/GrMemoryPool.cpp
index adf4684..ee54f6b 100644
--- a/src/gpu/GrMemoryPool.cpp
+++ b/src/gpu/GrMemoryPool.cpp
@@ -171,7 +171,7 @@
             SkASSERT(userStart == block->fCurrPtr);
         } else {
             AllocHeader* allocData = reinterpret_cast<AllocHeader*>(userStart);
-            SkASSERT(allocData->fSentinal == kAssignedMarker || 
+            SkASSERT(allocData->fSentinal == kAssignedMarker ||
                      allocData->fSentinal == kFreedMarker);
             SkASSERT(block == allocData->fHeader);
         }
diff --git a/src/gpu/GrOvalRenderer.cpp b/src/gpu/GrOvalRenderer.cpp
index 9388f32..605ad6e 100644
--- a/src/gpu/GrOvalRenderer.cpp
+++ b/src/gpu/GrOvalRenderer.cpp
@@ -377,7 +377,7 @@
     const Attribute* inEllipseOffsets0() const { return fInEllipseOffsets0; }
     const Attribute* inEllipseOffsets1() const { return fInEllipseOffsets1; }
     const SkMatrix& viewMatrix() const { return fViewMatrix; }
-    
+
     class GLSLProcessor : public GrGLSLGeometryProcessor {
     public:
         GLSLProcessor()
@@ -530,12 +530,12 @@
     if (SkScalarNearlyEqual(oval.width(), oval.height()) && circle_stays_circle(viewMatrix)) {
         return CreateCircleBatch(color, viewMatrix, oval, stroke);
     }
-    
+
     // if we have shader derivative support, render as device-independent
     if (shaderCaps->shaderDerivativeSupport()) {
         return CreateDIEllipseBatch(color, viewMatrix, oval, stroke);
     }
-    
+
     // otherwise axis-aligned ellipses only
     if (viewMatrix.rectStaysRect()) {
         return CreateEllipseBatch(color, viewMatrix, oval, stroke);
@@ -581,7 +581,7 @@
         return string;
     }
 
-    void computePipelineOptimizations(GrInitInvariantOutput* color, 
+    void computePipelineOptimizations(GrInitInvariantOutput* color,
                                       GrInitInvariantOutput* coverage,
                                       GrBatchToXPOverrides* overrides) const override {
         // When this is called on a batch, there is only one geometry bundle
@@ -765,7 +765,7 @@
 
     const char* name() const override { return "EllipseBatch"; }
 
-    void computePipelineOptimizations(GrInitInvariantOutput* color, 
+    void computePipelineOptimizations(GrInitInvariantOutput* color,
                                       GrInitInvariantOutput* coverage,
                                       GrBatchToXPOverrides* overrides) const override {
         // When this is called on a batch, there is only one geometry bundle
@@ -990,7 +990,7 @@
 
     const char* name() const override { return "DIEllipseBatch"; }
 
-    void computePipelineOptimizations(GrInitInvariantOutput* color, 
+    void computePipelineOptimizations(GrInitInvariantOutput* color,
                                       GrInitInvariantOutput* coverage,
                                       GrBatchToXPOverrides* overrides) const override {
         // When this is called on a batch, there is only one geometry bundle
@@ -1063,7 +1063,7 @@
         }
         helper.recordDraw(target);
     }
-    
+
     DIEllipseBatch(const Geometry& geometry, const SkRect& bounds) : INHERITED(ClassID()) {
         fGeoData.push_back(geometry);
 
@@ -1251,7 +1251,7 @@
 
     const char* name() const override { return "RRectCircleBatch"; }
 
-    void computePipelineOptimizations(GrInitInvariantOutput* color, 
+    void computePipelineOptimizations(GrInitInvariantOutput* color,
                                       GrInitInvariantOutput* coverage,
                                       GrBatchToXPOverrides* overrides) const override {
         // When this is called on a batch, there is only one geometry bundle
@@ -1400,7 +1400,7 @@
 
     const char* name() const override { return "RRectEllipseRendererBatch"; }
 
-    void computePipelineOptimizations(GrInitInvariantOutput* color, 
+    void computePipelineOptimizations(GrInitInvariantOutput* color,
                                       GrInitInvariantOutput* coverage,
                                       GrBatchToXPOverrides* overrides) const override {
         // When this is called on a batch, there is only one geometry bundle
diff --git a/src/gpu/GrPLSGeometryProcessor.h b/src/gpu/GrPLSGeometryProcessor.h
index 5c1d6ee..0640af6 100644
--- a/src/gpu/GrPLSGeometryProcessor.h
+++ b/src/gpu/GrPLSGeometryProcessor.h
@@ -16,7 +16,7 @@
  */
 class GrPLSGeometryProcessor : public GrGeometryProcessor {
 public:
-    GrPixelLocalStorageState getPixelLocalStorageState() const override { 
+    GrPixelLocalStorageState getPixelLocalStorageState() const override {
         return GrPixelLocalStorageState::kDraw_GrPixelLocalStorageState;
     }
 
diff --git a/src/gpu/GrPaint.cpp b/src/gpu/GrPaint.cpp
index c381562..af93e8f 100644
--- a/src/gpu/GrPaint.cpp
+++ b/src/gpu/GrPaint.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2013 Google Inc.
  *
@@ -57,7 +56,7 @@
         GrPorterDuffXPFactory::SrcOverInvariantBlendedColor(colorProcInfo.color(),
                                                             colorProcInfo.validFlags(),
                                                             colorProcInfo.isOpaque(),
-                                                            &blendedColor); 
+                                                            &blendedColor);
     }
 
     if (kRGBA_GrColorComponentFlags == blendedColor.fKnownColorFlags) {
diff --git a/src/gpu/GrPath.cpp b/src/gpu/GrPath.cpp
index 71c13af..04d93b1 100644
--- a/src/gpu/GrPath.cpp
+++ b/src/gpu/GrPath.cpp
@@ -211,4 +211,3 @@
     return fSkPath == path;
 }
 #endif
-
diff --git a/src/gpu/GrPathRange.h b/src/gpu/GrPathRange.h
index 00165d1..7bca17f 100644
--- a/src/gpu/GrPathRange.h
+++ b/src/gpu/GrPathRange.h
@@ -23,7 +23,7 @@
 
 class GrPathRange : public GrGpuResource {
 public:
-    
+
 
     enum PathIndexType {
         kU8_PathIndexType,   //!< uint8_t
diff --git a/src/gpu/GrPathRenderer.cpp b/src/gpu/GrPathRenderer.cpp
index 3dcedf9..1f53e84 100644
--- a/src/gpu/GrPathRenderer.cpp
+++ b/src/gpu/GrPathRenderer.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/src/gpu/GrPathRenderer.h b/src/gpu/GrPathRenderer.h
index 7ada6d1..85b3275 100644
--- a/src/gpu/GrPathRenderer.h
+++ b/src/gpu/GrPathRenderer.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
@@ -157,7 +156,7 @@
         canArgs.fAntiAlias = args.fAntiAlias;
 
         canArgs.fIsStencilDisabled = args.fPipelineBuilder->getStencil().isDisabled();
-        canArgs.fIsStencilBufferMSAA = 
+        canArgs.fIsStencilBufferMSAA =
                           args.fPipelineBuilder->getRenderTarget()->isStencilBufferMultisampled();
         SkASSERT(this->canDrawPath(canArgs));
         SkASSERT(args.fPipelineBuilder->getStencil().isDisabled() ||
diff --git a/src/gpu/GrPathRendererChain.cpp b/src/gpu/GrPathRendererChain.cpp
index d9717d5..098d8fb 100644
--- a/src/gpu/GrPathRendererChain.cpp
+++ b/src/gpu/GrPathRendererChain.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/src/gpu/GrPipeline.cpp b/src/gpu/GrPipeline.cpp
index e3c4864..d8e2e5d 100644
--- a/src/gpu/GrPipeline.cpp
+++ b/src/gpu/GrPipeline.cpp
@@ -46,7 +46,7 @@
 
     GrXferProcessor::OptFlags optFlags = GrXferProcessor::kNone_OptFlags;
 
-    const GrXferProcessor* xpForOpts = xferProcessor ? xferProcessor.get() : 
+    const GrXferProcessor* xpForOpts = xferProcessor ? xferProcessor.get() :
                                                        &GrPorterDuffXPFactory::SimpleSrcOverXP();
     optFlags = xpForOpts->getOptimizations(args.fOpts,
                                            builder.getStencil().doesWrite(),
@@ -92,8 +92,8 @@
     // information.
     int firstCoverageProcessorIdx = 0;
 
-    pipeline->adjustProgramFromOptimizations(builder, optFlags, args.fOpts.fColorPOI, 
-                                             args.fOpts.fCoveragePOI, &firstColorProcessorIdx, 
+    pipeline->adjustProgramFromOptimizations(builder, optFlags, args.fOpts.fColorPOI,
+                                             args.fOpts.fCoveragePOI, &firstColorProcessorIdx,
                                              &firstCoverageProcessorIdx);
 
     bool usesLocalCoords = false;
@@ -134,7 +134,7 @@
         overrides->fFlags |= GrXPOverridesForBatch::kReadsLocalCoords_Flag;
     }
     if (SkToBool(optFlags & GrXferProcessor::kCanTweakAlphaForCoverage_OptFlag)) {
-        overrides->fFlags |= GrXPOverridesForBatch::kCanTweakAlphaForCoverage_Flag; 
+        overrides->fFlags |= GrXPOverridesForBatch::kCanTweakAlphaForCoverage_Flag;
     }
 
     GrXPFactory::InvariantBlendedColor blendedColor;
@@ -144,7 +144,7 @@
         GrPorterDuffXPFactory::SrcOverInvariantBlendedColor(args.fOpts.fColorPOI.color(),
                                                             args.fOpts.fColorPOI.validFlags(),
                                                             args.fOpts.fColorPOI.isOpaque(),
-                                                            &blendedColor); 
+                                                            &blendedColor);
     }
     if (blendedColor.fWillBlendWithDst) {
         overrides->fFlags |= GrXPOverridesForBatch::kWillColorBlendWithDst_Flag;
@@ -174,7 +174,7 @@
     const GrXferProcessor& xfer = this->getXferProcessor();
 
     for (int i = 0; i < xfer.numTextures(); ++i) {
-        GrTexture* texture = xfer.textureAccess(i).getTexture();   
+        GrTexture* texture = xfer.textureAccess(i).getTexture();
         SkASSERT(rt->getLastDrawTarget());
         rt->getLastDrawTarget()->addDependency(texture);
     }
@@ -228,4 +228,3 @@
     }
     return true;
 }
-
diff --git a/src/gpu/GrPipelineBuilder.cpp b/src/gpu/GrPipelineBuilder.cpp
index 2eba535..d82ee1c 100644
--- a/src/gpu/GrPipelineBuilder.cpp
+++ b/src/gpu/GrPipelineBuilder.cpp
@@ -53,7 +53,7 @@
 bool GrPipelineBuilder::willXPNeedDstTexture(const GrCaps& caps,
                                              const GrPipelineOptimizations& optimizations) const {
     if (this->getXPFactory()) {
-        return this->getXPFactory()->willNeedDstTexture(caps, optimizations, 
+        return this->getXPFactory()->willNeedDstTexture(caps, optimizations,
                                                         this->hasMixedSamples());
     }
     return GrPorterDuffXPFactory::SrcOverWillNeedDstTexture(caps, optimizations,
diff --git a/src/gpu/GrPipelineBuilder.h b/src/gpu/GrPipelineBuilder.h
index 83ad05f..4190070 100644
--- a/src/gpu/GrPipelineBuilder.h
+++ b/src/gpu/GrPipelineBuilder.h
@@ -108,7 +108,7 @@
      */
     class AutoRestoreFragmentProcessorState : public ::SkNoncopyable {
     public:
-        AutoRestoreFragmentProcessorState() 
+        AutoRestoreFragmentProcessorState()
             : fPipelineBuilder(nullptr)
             , fColorEffectCnt(0)
             , fCoverageEffectCnt(0) {}
@@ -169,7 +169,7 @@
     /**
      * Checks whether the xp will need destination in a texture to correctly blend.
      */
-    bool willXPNeedDstTexture(const GrCaps& caps, 
+    bool willXPNeedDstTexture(const GrCaps& caps,
                               const GrPipelineOptimizations& optimizations) const;
 
     /// @}
@@ -303,7 +303,7 @@
      * @param flags bitfield of Flags specifying the states to enable
      */
     void enableState(uint32_t flags) { fFlags |= flags; }
-        
+
     /**
      * Disable render state settings.
      *
diff --git a/src/gpu/GrPrimitiveProcessor.h b/src/gpu/GrPrimitiveProcessor.h
index 3300ec7..0d5280f 100644
--- a/src/gpu/GrPrimitiveProcessor.h
+++ b/src/gpu/GrPrimitiveProcessor.h
@@ -47,7 +47,7 @@
 
 struct GrInitInvariantOutput;
 
-// Describes the state of pixel local storage with respect to the current draw. 
+// Describes the state of pixel local storage with respect to the current draw.
 enum GrPixelLocalStorageState {
     // The draw is actively updating PLS.
     kDraw_GrPixelLocalStorageState,
@@ -208,7 +208,7 @@
      */
     virtual bool hasTransformedLocalCoords() const = 0;
 
-    virtual GrPixelLocalStorageState getPixelLocalStorageState() const { 
+    virtual GrPixelLocalStorageState getPixelLocalStorageState() const {
         return kDisabled_GrPixelLocalStorageState;
     }
 
@@ -216,7 +216,7 @@
      * If non-null, overrides the dest color returned by GrGLSLFragmentShaderBuilder::dstColor().
      */
     virtual const char* getDestColorOverride() const { return nullptr; }
-    
+
     virtual float getSampleShading() const {
         return 0.0;
     }
diff --git a/src/gpu/GrProcOptInfo.h b/src/gpu/GrProcOptInfo.h
index 94f80e7..87e7cd9 100644
--- a/src/gpu/GrProcOptInfo.h
+++ b/src/gpu/GrProcOptInfo.h
@@ -32,7 +32,7 @@
                                GrColorComponentFlags, bool areCoverageStages, bool isLCD = false);
     void initUsingInvariantOutput(GrInitInvariantOutput invOutput);
     void completeCalculations(const GrFragmentProcessor * const processors[], int cnt);
-    
+
     bool isSolidWhite() const { return fInOut.isSolidWhite(); }
     bool isOpaque() const { return fInOut.isOpaque(); }
     bool isSingleComponent() const { return fInOut.isSingleComponent(); }
diff --git a/src/gpu/GrProgramElement.cpp b/src/gpu/GrProgramElement.cpp
index 6611234..6b56392 100644
--- a/src/gpu/GrProgramElement.cpp
+++ b/src/gpu/GrProgramElement.cpp
@@ -34,4 +34,3 @@
         fGpuResources[i]->pendingIOComplete();
     }
 }
-
diff --git a/src/gpu/GrRectanizer_pow2.cpp b/src/gpu/GrRectanizer_pow2.cpp
index 7091a57..bb41d71 100644
--- a/src/gpu/GrRectanizer_pow2.cpp
+++ b/src/gpu/GrRectanizer_pow2.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2010 Google Inc.
  *
diff --git a/src/gpu/GrRectanizer_skyline.cpp b/src/gpu/GrRectanizer_skyline.cpp
index 32fd410..bbb9859 100644
--- a/src/gpu/GrRectanizer_skyline.cpp
+++ b/src/gpu/GrRectanizer_skyline.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2013 Google Inc.
  *
diff --git a/src/gpu/GrRectanizer_skyline.h b/src/gpu/GrRectanizer_skyline.h
index 576b1fc..a1c571e 100644
--- a/src/gpu/GrRectanizer_skyline.h
+++ b/src/gpu/GrRectanizer_skyline.h
@@ -49,7 +49,7 @@
 
     // Can a width x height rectangle fit in the free space represented by
     // the skyline segments >= 'skylineIndex'? If so, return true and fill in
-    // 'y' with the y-location at which it fits (the x location is pulled from 
+    // 'y' with the y-location at which it fits (the x location is pulled from
     // 'skylineIndex's segment.
     bool rectangleFits(int skylineIndex, int width, int height, int* y) const;
     // Update the skyline structure to include a width x height rect located
diff --git a/src/gpu/GrRenderTarget.cpp b/src/gpu/GrRenderTarget.cpp
index 41c7f10..ae44071 100644
--- a/src/gpu/GrRenderTarget.cpp
+++ b/src/gpu/GrRenderTarget.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
@@ -102,7 +101,7 @@
     if (!fRenderTarget->completeStencilAttachment()) {
         SkSafeSetNull(fRenderTarget->fStencilAttachment);
         return false;
-    } 
+    }
     return true;
 }
 
diff --git a/src/gpu/GrRenderTargetPriv.h b/src/gpu/GrRenderTargetPriv.h
index c6c8933..e64ed57 100644
--- a/src/gpu/GrRenderTargetPriv.h
+++ b/src/gpu/GrRenderTargetPriv.h
@@ -42,7 +42,7 @@
     GrRenderTargetPriv* operator&();
 
     GrRenderTarget* fRenderTarget;
-        
+
     friend class GrRenderTarget; // to construct/copy this type.
 };
 
diff --git a/src/gpu/GrResourceCache.cpp b/src/gpu/GrResourceCache.cpp
index 087e762..96816dd 100644
--- a/src/gpu/GrResourceCache.cpp
+++ b/src/gpu/GrResourceCache.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2014 Google Inc.
  *
diff --git a/src/gpu/GrResourceCache.h b/src/gpu/GrResourceCache.h
index fb13dde..5939c51 100644
--- a/src/gpu/GrResourceCache.h
+++ b/src/gpu/GrResourceCache.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2014 Google Inc.
  *
@@ -131,7 +130,7 @@
     GrGpuResource* findAndRefScratchResource(const GrScratchKey& scratchKey,
                                              size_t resourceSize,
                                              uint32_t flags);
-    
+
 #ifdef SK_DEBUG
     // This is not particularly fast and only used for validation, so debug only.
     int countScratchEntriesForKey(const GrScratchKey& scratchKey) const {
@@ -261,7 +260,7 @@
     bool overBudget() const { return fBudgetedBytes > fMaxBytes || fBudgetedCount > fMaxCount; }
 
     bool wouldFit(size_t bytes) {
-        return fBudgetedBytes+bytes <= fMaxBytes && fBudgetedCount+1 <= fMaxCount;    
+        return fBudgetedBytes+bytes <= fMaxBytes && fBudgetedCount+1 <= fMaxCount;
     }
 
     uint32_t getNextTimestamp();
diff --git a/src/gpu/GrResourceProvider.cpp b/src/gpu/GrResourceProvider.cpp
index a73bf75..7f6a7f1 100644
--- a/src/gpu/GrResourceProvider.cpp
+++ b/src/gpu/GrResourceProvider.cpp
@@ -192,4 +192,3 @@
     }
     return this->gpu()->wrapBackendTextureAsRenderTarget(desc, ownership);
 }
-
diff --git a/src/gpu/GrSWMaskHelper.cpp b/src/gpu/GrSWMaskHelper.cpp
index b6117e3..396d2be 100644
--- a/src/gpu/GrSWMaskHelper.cpp
+++ b/src/gpu/GrSWMaskHelper.cpp
@@ -199,7 +199,7 @@
             fCompressedBuffer.reset(cmpSz);
             fCompressionMode = kBlitter_CompressionMode;
         }
-    } 
+    }
 
     sk_bzero(&fDraw, sizeof(fDraw));
 
diff --git a/src/gpu/GrSWMaskHelper.h b/src/gpu/GrSWMaskHelper.h
index fb5d9e8..d1e1265 100644
--- a/src/gpu/GrSWMaskHelper.h
+++ b/src/gpu/GrSWMaskHelper.h
@@ -67,7 +67,7 @@
 
     // Convert mask generation results to a signed distance field
     void toSDF(unsigned char* sdf);
-    
+
     // Reset the internal bitmap
     void clear(uint8_t alpha) {
         fPixels.erase(SkColorSetARGB(alpha, 0xFF, 0xFF, 0xFF));
diff --git a/src/gpu/GrSoftwarePathRenderer.cpp b/src/gpu/GrSoftwarePathRenderer.cpp
index 093bef7..ca2ca64 100644
--- a/src/gpu/GrSoftwarePathRenderer.cpp
+++ b/src/gpu/GrSoftwarePathRenderer.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2012 Google Inc.
  *
diff --git a/src/gpu/GrSoftwarePathRenderer.h b/src/gpu/GrSoftwarePathRenderer.h
index 72a9515..8b2f2d7 100644
--- a/src/gpu/GrSoftwarePathRenderer.h
+++ b/src/gpu/GrSoftwarePathRenderer.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2012 Google Inc.
  *
@@ -26,7 +25,7 @@
     StencilSupport onGetStencilSupport(const SkPath&, const GrStrokeInfo&) const override {
         return GrPathRenderer::kNoSupport_StencilSupport;
     }
-    
+
     bool onCanDrawPath(const CanDrawPathArgs&) const override;
 
     bool onDrawPath(const DrawPathArgs&) override;
diff --git a/src/gpu/GrStencil.cpp b/src/gpu/GrStencil.cpp
index 189cc38..ee46edb 100644
--- a/src/gpu/GrStencil.cpp
+++ b/src/gpu/GrStencil.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/src/gpu/GrStencil.h b/src/gpu/GrStencil.h
index fa7d626..fc452da 100644
--- a/src/gpu/GrStencil.h
+++ b/src/gpu/GrStencil.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/src/gpu/GrStencilAttachment.cpp b/src/gpu/GrStencilAttachment.cpp
index 9b07070..bcdeec5 100644
--- a/src/gpu/GrStencilAttachment.cpp
+++ b/src/gpu/GrStencilAttachment.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/src/gpu/GrStencilAttachment.h b/src/gpu/GrStencilAttachment.h
index 2aa8e8c..2faa7b6 100644
--- a/src/gpu/GrStencilAttachment.h
+++ b/src/gpu/GrStencilAttachment.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
@@ -18,7 +17,7 @@
 
 class GrStencilAttachment : public GrGpuResource {
 public:
-    
+
 
     virtual ~GrStencilAttachment() {
         // TODO: allow SB to be purged and detach itself from rts
diff --git a/src/gpu/GrStrokeInfo.cpp b/src/gpu/GrStrokeInfo.cpp
index 3b8ecb6..b37c660 100644
--- a/src/gpu/GrStrokeInfo.cpp
+++ b/src/gpu/GrStrokeInfo.cpp
@@ -91,4 +91,3 @@
 
     SkASSERT(this->computeUniqueKeyFragmentData32Cnt() == i);
 }
-
diff --git a/src/gpu/GrTessellator.cpp b/src/gpu/GrTessellator.cpp
index f4195df..5fb008d 100644
--- a/src/gpu/GrTessellator.cpp
+++ b/src/gpu/GrTessellator.cpp
@@ -1277,7 +1277,7 @@
 
 // This is a driver function which calls stages 2-5 in turn.
 
-Poly* contours_to_polys(Vertex** contours, int contourCnt, const SkRect& pathBounds, 
+Poly* contours_to_polys(Vertex** contours, int contourCnt, const SkRect& pathBounds,
                         SkChunkAlloc& alloc) {
     Comparator c;
     if (pathBounds.width() > pathBounds.height()) {
@@ -1316,7 +1316,7 @@
     return tessellate(vertices, alloc);
 }
 
-Poly* path_to_polys(const SkPath& path, SkScalar tolerance, const SkRect& clipBounds, 
+Poly* path_to_polys(const SkPath& path, SkScalar tolerance, const SkRect& clipBounds,
                     int contourCnt, SkChunkAlloc& alloc, bool* isLinear) {
     SkPath::FillType fillType = path.getFillType();
     if (SkPath::IsInverseFillType(fillType)) {
@@ -1328,7 +1328,7 @@
     return contours_to_polys(contours.get(), contourCnt, path.getBounds(), alloc);
 }
 
-void get_contour_count_and_size_estimate(const SkPath& path, SkScalar tolerance, int* contourCnt, 
+void get_contour_count_and_size_estimate(const SkPath& path, SkScalar tolerance, int* contourCnt,
                                          int* sizeEstimate) {
     int maxPts = GrPathUtils::worstCasePointCount(path, contourCnt, tolerance);
     if (maxPts <= 0) {
@@ -1363,7 +1363,7 @@
 
 // Stage 6: Triangulate the monotone polygons into a vertex buffer.
 
-int PathToTriangles(const SkPath& path, SkScalar tolerance, const SkRect& clipBounds, 
+int PathToTriangles(const SkPath& path, SkScalar tolerance, const SkRect& clipBounds,
                     VertexAllocator* vertexAllocator, bool* isLinear) {
     int contourCnt;
     int sizeEstimate;
@@ -1398,7 +1398,7 @@
     return actualCount;
 }
 
-int PathToVertices(const SkPath& path, SkScalar tolerance, const SkRect& clipBounds, 
+int PathToVertices(const SkPath& path, SkScalar tolerance, const SkRect& clipBounds,
                    GrTessellator::WindingVertex** verts) {
     int contourCnt;
     int sizeEstimate;
diff --git a/src/gpu/GrTessellator.h b/src/gpu/GrTessellator.h
index 9e7d5f0..7cc4311 100644
--- a/src/gpu/GrTessellator.h
+++ b/src/gpu/GrTessellator.h
@@ -37,10 +37,10 @@
 // WindingVertex entries, each of which contains the position and winding count (which is the same
 // for all three vertices of a triangle). The 'verts' out parameter is set to point to the resultant
 // vertex array. CALLER IS RESPONSIBLE for deleting this buffer to avoid a memory leak!
-int PathToVertices(const SkPath& path, SkScalar tolerance, const SkRect& clipBounds, 
+int PathToVertices(const SkPath& path, SkScalar tolerance, const SkRect& clipBounds,
                    WindingVertex** verts);
 
-int PathToTriangles(const SkPath& path, SkScalar tolerance, const SkRect& clipBounds, 
+int PathToTriangles(const SkPath& path, SkScalar tolerance, const SkRect& clipBounds,
                     VertexAllocator*, bool *isLinear);
 }
 
diff --git a/src/gpu/GrTest.h b/src/gpu/GrTest.h
index 75eb53a..53aaac3 100644
--- a/src/gpu/GrTest.h
+++ b/src/gpu/GrTest.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2013 Google Inc.
  *
diff --git a/src/gpu/GrTexture.cpp b/src/gpu/GrTexture.cpp
index 28746b9..9051c85 100644
--- a/src/gpu/GrTexture.cpp
+++ b/src/gpu/GrTexture.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/src/gpu/GrTraceMarker.cpp b/src/gpu/GrTraceMarker.cpp
index f54ab83..c4d2ad4 100644
--- a/src/gpu/GrTraceMarker.cpp
+++ b/src/gpu/GrTraceMarker.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2014 Google Inc.
  *
@@ -101,4 +100,3 @@
 GrTraceMarkerSet::Iter GrTraceMarkerSet::end() const {
     return Iter(this, this->fMarkerArray.count());
 }
-
diff --git a/src/gpu/GrTraceMarker.h b/src/gpu/GrTraceMarker.h
index 3182b39..a0e9625 100644
--- a/src/gpu/GrTraceMarker.h
+++ b/src/gpu/GrTraceMarker.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2014 Google Inc.
  *
diff --git a/src/gpu/GrXferProcessor.cpp b/src/gpu/GrXferProcessor.cpp
index 01534a3..3e2ffaa 100644
--- a/src/gpu/GrXferProcessor.cpp
+++ b/src/gpu/GrXferProcessor.cpp
@@ -201,10 +201,10 @@
         if (!caps.shaderCaps()->dstReadInShaderSupport()) {
             SkASSERT(dstTexture && dstTexture->texture());
         } else {
-            SkASSERT(!dstTexture || !dstTexture->texture()); 
+            SkASSERT(!dstTexture || !dstTexture->texture());
         }
     } else {
-        SkASSERT(!dstTexture || !dstTexture->texture()); 
+        SkASSERT(!dstTexture || !dstTexture->texture());
     }
     SkASSERT(!hasMixedSamples || caps.shaderCaps()->dualSourceBlendingSupport());
 #endif
diff --git a/src/gpu/GrYUVProvider.cpp b/src/gpu/GrYUVProvider.cpp
index 90d5537..3990e88 100644
--- a/src/gpu/GrYUVProvider.cpp
+++ b/src/gpu/GrYUVProvider.cpp
@@ -146,4 +146,3 @@
 
     return result.release();
 }
-
diff --git a/src/gpu/SkGpuDevice.h b/src/gpu/SkGpuDevice.h
index 7f9041b..5442408 100644
--- a/src/gpu/SkGpuDevice.h
+++ b/src/gpu/SkGpuDevice.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2010 Google Inc.
  *
diff --git a/src/gpu/SkGpuDevice_drawTexture.cpp b/src/gpu/SkGpuDevice_drawTexture.cpp
index 5c5fb12..1be2dd5 100644
--- a/src/gpu/SkGpuDevice_drawTexture.cpp
+++ b/src/gpu/SkGpuDevice_drawTexture.cpp
@@ -171,7 +171,7 @@
     } else {
         constraintMode = GrTextureAdjuster::kYes_FilterConstraint;
     }
-    
+
     // If we have to outset for AA then we will generate texture coords outside the src rect. The
     // same happens for any mask filter that extends the bounds rendered in the dst.
     // This is conservative as a mask filter does not have to expand the bounds rendered.
diff --git a/src/gpu/SkGr.cpp b/src/gpu/SkGr.cpp
index 71d9e62..905af81 100644
--- a/src/gpu/SkGr.cpp
+++ b/src/gpu/SkGr.cpp
@@ -609,7 +609,7 @@
     SkASSERT(!grPaint->getXPFactory());
     SkXfermode* xfermode = skPaint.getXfermode();
     if (xfermode) {
-        // SafeUnref in case a new xfermode is added that returns null. 
+        // SafeUnref in case a new xfermode is added that returns null.
         // In such cases we will fall back to kSrcOver_Mode.
         SkSafeUnref(grPaint->setXPFactory(xfermode->asXPFactory()));
     }
diff --git a/src/gpu/SkGrPixelRef.cpp b/src/gpu/SkGrPixelRef.cpp
index e21d3b9..d01554b 100644
--- a/src/gpu/SkGrPixelRef.cpp
+++ b/src/gpu/SkGrPixelRef.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2010 Google Inc.
  *
diff --git a/src/gpu/SkGrTexturePixelRef.cpp b/src/gpu/SkGrTexturePixelRef.cpp
index ae2bbdd..55f7aac 100644
--- a/src/gpu/SkGrTexturePixelRef.cpp
+++ b/src/gpu/SkGrTexturePixelRef.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2010 Google Inc.
  *
diff --git a/src/gpu/batches/GrAAConvexPathRenderer.cpp b/src/gpu/batches/GrAAConvexPathRenderer.cpp
index ba19a0d..51c1c55 100644
--- a/src/gpu/batches/GrAAConvexPathRenderer.cpp
+++ b/src/gpu/batches/GrAAConvexPathRenderer.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2012 Google Inc.
  *
@@ -710,7 +709,7 @@
             *reinterpret_cast<GrColor*>(verts + i * vertexStride) = scaledColor;
         } else {
             *reinterpret_cast<GrColor*>(verts + i * vertexStride) = color;
-            *reinterpret_cast<float*>(verts + i * vertexStride + sizeof(GrColor)) = 
+            *reinterpret_cast<float*>(verts + i * vertexStride + sizeof(GrColor)) =
                     tess.coverage(i);
         }
     }
@@ -755,7 +754,7 @@
 
     const char* name() const override { return "AAConvexBatch"; }
 
-    void computePipelineOptimizations(GrInitInvariantOutput* color, 
+    void computePipelineOptimizations(GrInitInvariantOutput* color,
                                       GrInitInvariantOutput* coverage,
                                       GrBatchToXPOverrides* overrides) const override {
         // When this is called on a batch, there is only one geometry bundle
diff --git a/src/gpu/batches/GrAAConvexPathRenderer.h b/src/gpu/batches/GrAAConvexPathRenderer.h
index 5d51d6c..420ca60 100644
--- a/src/gpu/batches/GrAAConvexPathRenderer.h
+++ b/src/gpu/batches/GrAAConvexPathRenderer.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2012 Google Inc.
  *
diff --git a/src/gpu/batches/GrAAConvexTessellator.cpp b/src/gpu/batches/GrAAConvexTessellator.cpp
index c3d2594..7e28d24 100644
--- a/src/gpu/batches/GrAAConvexTessellator.cpp
+++ b/src/gpu/batches/GrAAConvexTessellator.cpp
@@ -36,7 +36,7 @@
     return (v.fX * n1.fY - v.fY * n1.fX) / perpDot;
 }
 
-// This is a special case version of intersect where we have the vector 
+// This is a special case version of intersect where we have the vector
 // perpendicular to the second line rather than the vector parallel to it.
 static SkScalar perp_intersect(const SkPoint& p0, const SkPoint& n0,
                                const SkPoint& p1, const SkPoint& perp) {
@@ -142,7 +142,7 @@
             SkVector other;
             other.setOrthog(fNorms[prev], fSide);
             fBisectors[cur] += other;
-            SkAssertResult(fBisectors[cur].normalize());        
+            SkAssertResult(fBisectors[cur].normalize());
         } else {
             fBisectors[cur].negate();      // make the bisector face in
         }
@@ -154,7 +154,7 @@
 // Create as many rings as we need to (up to a predefined limit) to reach the specified target
 // depth. If we are in fill mode, the final ring will automatically be fanned.
 bool GrAAConvexTessellator::createInsetRings(Ring& previousRing, SkScalar initialDepth,
-                                             SkScalar initialCoverage, SkScalar targetDepth, 
+                                             SkScalar initialCoverage, SkScalar targetDepth,
                                              SkScalar targetCoverage, Ring** finalRing) {
     static const int kMaxNumRings = 8;
 
@@ -167,7 +167,7 @@
         Ring* nextRing = this->getNextRing(currentRing);
         SkASSERT(nextRing != currentRing);
 
-        bool done = this->createInsetRing(*currentRing, nextRing, initialDepth, initialCoverage, 
+        bool done = this->createInsetRing(*currentRing, nextRing, initialDepth, initialCoverage,
                                           targetDepth, targetCoverage, i == 0);
         currentRing = nextRing;
         if (done) {
@@ -203,11 +203,11 @@
     SkScalar coverage = 1.0f;
     SkScalar scaleFactor = 0.0f;
     if (fStrokeWidth >= 0.0f) {
-        SkASSERT(m.isSimilarity()); 
+        SkASSERT(m.isSimilarity());
         scaleFactor = m.getMaxScale(); // x and y scale are the same
         SkScalar effectiveStrokeWidth = scaleFactor * fStrokeWidth;
         Ring outerStrokeRing;
-        this->createOuterRing(fInitialRing, effectiveStrokeWidth / 2 - kAntialiasingRadius, 
+        this->createOuterRing(fInitialRing, effectiveStrokeWidth / 2 - kAntialiasingRadius,
                               coverage, &outerStrokeRing);
         outerStrokeRing.init(*this);
         Ring outerAARing;
@@ -223,10 +223,10 @@
         SkScalar effectiveStrokeWidth = scaleFactor * fStrokeWidth;
         Ring* insetStrokeRing;
         SkScalar strokeDepth = effectiveStrokeWidth / 2 - kAntialiasingRadius;
-        if (this->createInsetRings(fInitialRing, 0.0f, coverage, strokeDepth, coverage, 
+        if (this->createInsetRings(fInitialRing, 0.0f, coverage, strokeDepth, coverage,
                              &insetStrokeRing)) {
             Ring* insetAARing;
-            this->createInsetRings(*insetStrokeRing, strokeDepth, coverage, strokeDepth + 
+            this->createInsetRings(*insetStrokeRing, strokeDepth, coverage, strokeDepth +
                              kAntialiasingRadius * 2, 0.0f, &insetAARing);
         }
     } else {
@@ -373,7 +373,7 @@
 
         this->computeBisectors();
     } else if (this->numPts() == 2) {
-        // We've got two points, so we're degenerate. 
+        // We've got two points, so we're degenerate.
         if (fStrokeWidth < 0.0f) {
             // it's a fill, so we don't need to worry about degenerate paths
             return false;
@@ -429,7 +429,7 @@
     }
 }
 
-void GrAAConvexTessellator::createOuterRing(const Ring& previousRing, SkScalar outset, 
+void GrAAConvexTessellator::createOuterRing(const Ring& previousRing, SkScalar outset,
                                             SkScalar coverage, Ring* nextRing) {
     const int numPts = previousRing.numPts();
     if (numPts == 0) {
@@ -444,9 +444,9 @@
     miterLimitSq = SkScalarMul(miterLimitSq, miterLimitSq);
     for (int cur = 0; cur < numPts; ++cur) {
         int originalIdx = previousRing.index(cur);
-        // For each vertex of the original polygon we add at least two points to the 
+        // For each vertex of the original polygon we add at least two points to the
         // outset polygon - one extending perpendicular to each impinging edge. Connecting these
-        // two points yields a bevel join. We need one additional point for a mitered join, and 
+        // two points yields a bevel join. We need one additional point for a mitered join, and
         // a round join requires one or more points depending upon curvature.
 
         // The perpendicular point for the last edge
@@ -532,7 +532,7 @@
                         this->addTri(originalIdx, perp1Idx, perp2Idx);
                         break;
                     default:
-                        // kRound_Join is unsupported for now. GrAALinearizingConvexPathRenderer is 
+                        // kRound_Join is unsupported for now. GrAALinearizingConvexPathRenderer is
                         // only willing to draw mitered or beveled, so we should never get here.
                         SkASSERT(false);
                 }
@@ -574,20 +574,20 @@
     }
 }
 
-static SkScalar compute_coverage(SkScalar depth, SkScalar initialDepth, SkScalar initialCoverage, 
+static SkScalar compute_coverage(SkScalar depth, SkScalar initialDepth, SkScalar initialCoverage,
                                 SkScalar targetDepth, SkScalar targetCoverage) {
     if (SkScalarNearlyEqual(initialDepth, targetDepth)) {
         return targetCoverage;
     }
-    SkScalar result = (depth - initialDepth) / (targetDepth - initialDepth) * 
+    SkScalar result = (depth - initialDepth) / (targetDepth - initialDepth) *
             (targetCoverage - initialCoverage) + initialCoverage;
     return SkScalarClampMax(result, 1.0f);
 }
 
 // return true when processing is complete
-bool GrAAConvexTessellator::createInsetRing(const Ring& lastRing, Ring* nextRing, 
-                                            SkScalar initialDepth, SkScalar initialCoverage, 
-                                            SkScalar targetDepth, SkScalar targetCoverage, 
+bool GrAAConvexTessellator::createInsetRing(const Ring& lastRing, Ring* nextRing,
+                                            SkScalar initialDepth, SkScalar initialCoverage,
+                                            SkScalar targetDepth, SkScalar targetCoverage,
                                             bool forceNew) {
     bool done = false;
 
@@ -699,9 +699,9 @@
     for (int i = 0; i < fCandidateVerts.numPts(); ++i) {
         int newIdx;
         if (fCandidateVerts.needsToBeNew(i) || forceNew) {
-            // if the originating index is still valid then this point wasn't 
+            // if the originating index is still valid then this point wasn't
             // fused (and is thus movable)
-            SkScalar coverage = compute_coverage(depth, initialDepth, initialCoverage, 
+            SkScalar coverage = compute_coverage(depth, initialDepth, initialCoverage,
                                                  targetDepth, targetCoverage);
             newIdx = this->addPt(fCandidateVerts.point(i), depth, coverage,
                                  fCandidateVerts.originatingIdx(i) != -1, false);
@@ -829,7 +829,7 @@
     }
 
     SkASSERT(fPts.count() <= 1 || fPts.count() == fNorms.count()+1);
-    if (this->numPts() >= 2 && 
+    if (this->numPts() >= 2 &&
         abs_dist_from_line(fPts.top(), fNorms.top(), p) < kClose) {
         // The old last point is on the line from the second to last to the new point
         this->popLastPt();
@@ -862,7 +862,7 @@
     int maxCount = GrPathUtils::quadraticPointCount(pts, kQuadTolerance);
     fPointBuffer.setReserve(maxCount);
     SkPoint* target = fPointBuffer.begin();
-    int count = GrPathUtils::generateQuadraticPoints(pts[0], pts[1], pts[2], 
+    int count = GrPathUtils::generateQuadraticPoints(pts[0], pts[1], pts[2],
             kQuadTolerance, &target, maxCount);
     fPointBuffer.setCount(count);
     for (int i = 0; i < count; i++) {
@@ -884,7 +884,7 @@
     int maxCount = GrPathUtils::cubicPointCount(pts, kCubicTolerance);
     fPointBuffer.setReserve(maxCount);
     SkPoint* target = fPointBuffer.begin();
-    int count = GrPathUtils::generateCubicPoints(pts[0], pts[1], pts[2], pts[3], 
+    int count = GrPathUtils::generateCubicPoints(pts[0], pts[1], pts[2], pts[3],
             kCubicTolerance, &target, maxCount);
     fPointBuffer.setCount(count);
     for (int i = 0; i < count; i++) {
@@ -933,7 +933,7 @@
         stroke.setColor(SK_ColorYELLOW);
         stroke.setStyle(SkPaint::kStroke_Style);
         stroke.setStrokeWidth(kPointRadius/3.0f);
-        canvas->drawCircle(p.fX, p.fY, kPointRadius, stroke); 
+        canvas->drawCircle(p.fX, p.fY, kPointRadius, stroke);
     }
 }
 
@@ -985,7 +985,7 @@
             draw_arrow(canvas, tess.point(fPts[cur].fIndex), fPts[cur].fBisector,
                        kArrowLength, SK_ColorBLUE);
         }
-    }    
+    }
 }
 
 void GrAAConvexTessellator::draw(SkCanvas* canvas) const {
@@ -1012,7 +1012,7 @@
 
     for (int i = 0; i < this->numPts(); ++i) {
         draw_point(canvas,
-                   this->point(i), 0.5f + (this->depth(i)/(2 * kAntialiasingRadius)), 
+                   this->point(i), 0.5f + (this->depth(i)/(2 * kAntialiasingRadius)),
                    !this->movable(i));
 
         SkPaint paint;
@@ -1024,11 +1024,10 @@
 
         SkString num;
         num.printf("%d", i);
-        canvas->drawText(num.c_str(), num.size(), 
-                         this->point(i).fX, this->point(i).fY+(kPointRadius/2.0f), 
+        canvas->drawText(num.c_str(), num.size(),
+                         this->point(i).fX, this->point(i).fY+(kPointRadius/2.0f),
                          paint);
     }
 }
 
 #endif
-
diff --git a/src/gpu/batches/GrAAConvexTessellator.h b/src/gpu/batches/GrAAConvexTessellator.h
index f3d84dc..faa251e 100644
--- a/src/gpu/batches/GrAAConvexTessellator.h
+++ b/src/gpu/batches/GrAAConvexTessellator.h
@@ -31,8 +31,8 @@
 // computeDepthFromEdge requests.
 class GrAAConvexTessellator {
 public:
-    GrAAConvexTessellator(SkScalar strokeWidth = -1.0f, 
-                          SkPaint::Join join = SkPaint::Join::kBevel_Join, 
+    GrAAConvexTessellator(SkScalar strokeWidth = -1.0f,
+                          SkPaint::Join join = SkPaint::Join::kBevel_Join,
                           SkScalar miterLimit = 0.0f)
         : fSide(SkPoint::kOn_Side)
         , fStrokeWidth(strokeWidth)
@@ -61,7 +61,7 @@
     void rewind();
 
 private:
-    // CandidateVerts holds the vertices for the next ring while they are 
+    // CandidateVerts holds the vertices for the next ring while they are
     // being generated. Its main function is to de-dup the points.
     class CandidateVerts {
     public:
@@ -213,14 +213,14 @@
 
     Ring* getNextRing(Ring* lastRing);
 
-    void createOuterRing(const Ring& previousRing, SkScalar outset, SkScalar coverage, 
+    void createOuterRing(const Ring& previousRing, SkScalar outset, SkScalar coverage,
                          Ring* nextRing);
 
-    bool createInsetRings(Ring& previousRing, SkScalar initialDepth, SkScalar initialCoverage, 
+    bool createInsetRings(Ring& previousRing, SkScalar initialDepth, SkScalar initialCoverage,
                           SkScalar targetDepth, SkScalar targetCoverage, Ring** finalRing);
 
-    bool createInsetRing(const Ring& lastRing, Ring* nextRing, 
-                         SkScalar initialDepth, SkScalar initialCoverage, SkScalar targetDepth, 
+    bool createInsetRing(const Ring& lastRing, Ring* nextRing,
+                         SkScalar initialDepth, SkScalar initialCoverage, SkScalar targetDepth,
                          SkScalar targetCoverage, bool forceNew);
 
     void validate() const;
@@ -237,7 +237,7 @@
     // needed for exterior ring creation and then handed off to the initial ring.
     SkTDArray<SkVector> fBisectors;
 
-    // Tracks whether a given point is interior to a curve. Such points are 
+    // Tracks whether a given point is interior to a curve. Such points are
     // assumed to have shallow curvature.
     SkTDArray<bool> fIsCurve;
 
@@ -267,4 +267,3 @@
 
 
 #endif
-
diff --git a/src/gpu/batches/GrAADistanceFieldPathRenderer.cpp b/src/gpu/batches/GrAADistanceFieldPathRenderer.cpp
index 6a8ec2f..f10d3b8 100644
--- a/src/gpu/batches/GrAADistanceFieldPathRenderer.cpp
+++ b/src/gpu/batches/GrAADistanceFieldPathRenderer.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2014 Google Inc.
  *
@@ -96,7 +95,7 @@
     if (args.fViewMatrix->hasPerspective()) {
         return false;
     }
-    
+
     // only support paths with bounds within kMediumMIP by kMediumMIP,
     // scaled to have bounds within 2.0f*kLargeMIP by 2.0f*kLargeMIP
     // the goal is to accelerate rendering of lots of small paths that may be scaling
@@ -155,7 +154,7 @@
 
     const char* name() const override { return "AADistanceFieldPathBatch"; }
 
-    void computePipelineOptimizations(GrInitInvariantOutput* color, 
+    void computePipelineOptimizations(GrInitInvariantOutput* color,
                                       GrInitInvariantOutput* coverage,
                                       GrBatchToXPOverrides* overrides) const override {
         color->setKnownFourComponents(fGeoData[0].fColor);
@@ -570,7 +569,7 @@
     // generated due to stroking it is important that the original path's id is used
     // for caching.
     geometry.fGenID = args.fPath->getGenerationID();
- 
+
     SkAutoTUnref<GrDrawBatch> batch(AADistanceFieldPathBatch::Create(geometry,
                                                                      *args.fViewMatrix, fAtlas,
                                                                      &fPathCache, &fPathList));
diff --git a/src/gpu/batches/GrAADistanceFieldPathRenderer.h b/src/gpu/batches/GrAADistanceFieldPathRenderer.h
index c0e6826..200d315 100755
--- a/src/gpu/batches/GrAADistanceFieldPathRenderer.h
+++ b/src/gpu/batches/GrAADistanceFieldPathRenderer.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2014 Google Inc.
  *
@@ -37,7 +36,7 @@
         public:
             // default ctor needed for new of uninitialized PathData
             // since fStroke has no default ctor
-            Key() 
+            Key()
                 : fGenID(0)
                 , fDimension(0)
                 , fStroke(SkStrokeRec::kFill_InitStyle) {}
@@ -45,12 +44,12 @@
                 : fGenID(genID)
                 , fDimension(dim)
                 , fStroke(stroke) {}
-           
+
             bool operator==(const Key& other) const {
                 return other.fGenID == fGenID && other.fDimension == fDimension &&
                        fStroke.hasEqualEffect(other.fStroke);
             }
-           
+
         private:
             uint32_t   fGenID;
             // rendered size for stored path (32x32 max, 64x64 max, 128x128 max)
@@ -64,11 +63,11 @@
         SkRect                fBounds;
         SkIPoint16            fAtlasLocation;
         SK_DECLARE_INTERNAL_LLIST_INTERFACE(PathData);
-        
+
         static inline const Key& GetKey(const PathData& data) {
             return data.fKey;
         }
-        
+
         static inline uint32_t Hash(Key key) {
             return SkChecksum::Murmur3(reinterpret_cast<const uint32_t*>(&key), sizeof(key));
         }
@@ -78,11 +77,11 @@
 
     typedef SkTDynamicHash<PathData, PathData::Key> PathCache;
     typedef SkTInternalLList<PathData> PathDataList;
-    
+
     GrBatchAtlas*                      fAtlas;
     PathCache                          fPathCache;
     PathDataList                       fPathList;
-    
+
     typedef GrPathRenderer INHERITED;
 
     friend class AADistanceFieldPathBatch;
diff --git a/src/gpu/batches/GrAAFillRectBatch.cpp b/src/gpu/batches/GrAAFillRectBatch.cpp
index 890a18b..859328a 100644
--- a/src/gpu/batches/GrAAFillRectBatch.cpp
+++ b/src/gpu/batches/GrAAFillRectBatch.cpp
@@ -250,7 +250,7 @@
     static void Tesselate(intptr_t vertices, size_t vertexStride, const Geometry& geo,
                           const GrXPOverridesForBatch& overrides) {
         generate_aa_fill_rect_geometry(vertices, vertexStride,
-                                       geo.fColor, geo.fViewMatrix, geo.fRect, geo.fDevRect, 
+                                       geo.fColor, geo.fViewMatrix, geo.fRect, geo.fDevRect,
                                        overrides, nullptr);
     }
 };
@@ -298,7 +298,7 @@
     static void Tesselate(intptr_t vertices, size_t vertexStride, const Geometry& geo,
                           const GrXPOverridesForBatch& overrides) {
         generate_aa_fill_rect_geometry(vertices, vertexStride,
-                                       geo.fColor, geo.fViewMatrix, geo.fRect, geo.fDevRect, 
+                                       geo.fColor, geo.fViewMatrix, geo.fRect, geo.fDevRect,
                                        overrides, &geo.fLocalMatrix);
     }
 };
diff --git a/src/gpu/batches/GrAAHairLinePathRenderer.cpp b/src/gpu/batches/GrAAHairLinePathRenderer.cpp
index 2cc91f9..9056e3c 100644
--- a/src/gpu/batches/GrAAHairLinePathRenderer.cpp
+++ b/src/gpu/batches/GrAAHairLinePathRenderer.cpp
@@ -682,7 +682,7 @@
 
     const char* name() const override { return "AAHairlineBatch"; }
 
-    void computePipelineOptimizations(GrInitInvariantOutput* color, 
+    void computePipelineOptimizations(GrInitInvariantOutput* color,
                                       GrInitInvariantOutput* coverage,
                                       GrBatchToXPOverrides* overrides) const override {
         // When this is called on a batch, there is only one geometry bundle
diff --git a/src/gpu/batches/GrAAHairLinePathRenderer.h b/src/gpu/batches/GrAAHairLinePathRenderer.h
index db2d16f..e2406a5 100644
--- a/src/gpu/batches/GrAAHairLinePathRenderer.h
+++ b/src/gpu/batches/GrAAHairLinePathRenderer.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/src/gpu/batches/GrAALinearizingConvexPathRenderer.cpp b/src/gpu/batches/GrAALinearizingConvexPathRenderer.cpp
index 1cd8daf..bd4353e 100644
--- a/src/gpu/batches/GrAALinearizingConvexPathRenderer.cpp
+++ b/src/gpu/batches/GrAALinearizingConvexPathRenderer.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2015 Google Inc.
  *
@@ -134,7 +133,7 @@
 
     const char* name() const override { return "AAConvexBatch"; }
 
-    void computePipelineOptimizations(GrInitInvariantOutput* color, 
+    void computePipelineOptimizations(GrInitInvariantOutput* color,
                                       GrInitInvariantOutput* coverage,
                                       GrBatchToXPOverrides* overrides) const override {
         // When this is called on a batch, there is only one geometry bundle
diff --git a/src/gpu/batches/GrAALinearizingConvexPathRenderer.h b/src/gpu/batches/GrAALinearizingConvexPathRenderer.h
index 57d21e0..afee5db 100644
--- a/src/gpu/batches/GrAALinearizingConvexPathRenderer.h
+++ b/src/gpu/batches/GrAALinearizingConvexPathRenderer.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2015 Google Inc.
  *
diff --git a/src/gpu/batches/GrAAStrokeRectBatch.cpp b/src/gpu/batches/GrAAStrokeRectBatch.cpp
index 2ce5eca..90f8165 100644
--- a/src/gpu/batches/GrAAStrokeRectBatch.cpp
+++ b/src/gpu/batches/GrAAStrokeRectBatch.cpp
@@ -62,7 +62,7 @@
 
     const char* name() const override { return "AAStrokeRect"; }
 
-    void computePipelineOptimizations(GrInitInvariantOutput* color, 
+    void computePipelineOptimizations(GrInitInvariantOutput* color,
                                       GrInitInvariantOutput* coverage,
                                       GrBatchToXPOverrides* overrides) const override {
         // When this is called on a batch, there is only one geometry bundle
diff --git a/src/gpu/batches/GrAtlasTextBatch.cpp b/src/gpu/batches/GrAtlasTextBatch.cpp
index 654643d..0bbf8c0 100644
--- a/src/gpu/batches/GrAtlasTextBatch.cpp
+++ b/src/gpu/batches/GrAtlasTextBatch.cpp
@@ -43,7 +43,7 @@
     return str;
 }
 
-void GrAtlasTextBatch::computePipelineOptimizations(GrInitInvariantOutput* color, 
+void GrAtlasTextBatch::computePipelineOptimizations(GrInitInvariantOutput* color,
                                                     GrInitInvariantOutput* coverage,
                                                     GrBatchToXPOverrides* overrides) const {
     if (kColorBitmapMask_MaskType == fMaskType) {
diff --git a/src/gpu/batches/GrAtlasTextBatch.h b/src/gpu/batches/GrAtlasTextBatch.h
index 01d7992..82d3115 100644
--- a/src/gpu/batches/GrAtlasTextBatch.h
+++ b/src/gpu/batches/GrAtlasTextBatch.h
@@ -90,7 +90,7 @@
     SkString dumpInfo() const override;
 
 protected:
-    void computePipelineOptimizations(GrInitInvariantOutput* color, 
+    void computePipelineOptimizations(GrInitInvariantOutput* color,
                                       GrInitInvariantOutput* coverage,
                                       GrBatchToXPOverrides* overrides) const override;
 
diff --git a/src/gpu/batches/GrBatch.h b/src/gpu/batches/GrBatch.h
index aae726e..278c826 100644
--- a/src/gpu/batches/GrBatch.h
+++ b/src/gpu/batches/GrBatch.h
@@ -96,11 +96,11 @@
     uint32_t classID() const { SkASSERT(kIllegalBatchID != fClassID); return fClassID; }
 
     // We lazily initialize the uniqueID because currently the only user is GrAuditTrail
-    uint32_t uniqueID() const { 
+    uint32_t uniqueID() const {
         if (kIllegalBatchID == fUniqueID) {
             fUniqueID = GenBatchID();
         }
-        return fUniqueID; 
+        return fUniqueID;
     }
     SkDEBUGCODE(bool isUsed() const { return fUsed; })
 
diff --git a/src/gpu/batches/GrDashLinePathRenderer.h b/src/gpu/batches/GrDashLinePathRenderer.h
index f21c73b..af8324d 100644
--- a/src/gpu/batches/GrDashLinePathRenderer.h
+++ b/src/gpu/batches/GrDashLinePathRenderer.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2015 Google Inc.
  *
diff --git a/src/gpu/batches/GrDefaultPathRenderer.cpp b/src/gpu/batches/GrDefaultPathRenderer.cpp
index 0a3dcd6..cda522e 100644
--- a/src/gpu/batches/GrDefaultPathRenderer.cpp
+++ b/src/gpu/batches/GrDefaultPathRenderer.cpp
@@ -228,7 +228,7 @@
 
     const char* name() const override { return "DefaultPathBatch"; }
 
-    void computePipelineOptimizations(GrInitInvariantOutput* color, 
+    void computePipelineOptimizations(GrInitInvariantOutput* color,
                                       GrInitInvariantOutput* coverage,
                                       GrBatchToXPOverrides* overrides) const override {
         // When this is called on a batch, there is only one geometry bundle
diff --git a/src/gpu/batches/GrDrawAtlasBatch.cpp b/src/gpu/batches/GrDrawAtlasBatch.cpp
index f3b497a..3884ef2 100644
--- a/src/gpu/batches/GrDrawAtlasBatch.cpp
+++ b/src/gpu/batches/GrDrawAtlasBatch.cpp
@@ -45,7 +45,7 @@
     if (hasColors) {
         gpColor.fType = Color::kAttribute_Type;
     }
-    
+
     Coverage coverage(coverageIgnored ? Coverage::kNone_Type : Coverage::kSolid_Type);
     LocalCoords localCoords(LocalCoords::kHasExplicit_Type);
     return GrDefaultGeoProcFactory::Create(gpColor, coverage, localCoords, viewMatrix);
@@ -57,14 +57,14 @@
                                                                      this->color(),
                                                                      this->viewMatrix(),
                                                                      this->coverageIgnored()));
-    
+
     target->initDraw(gp);
-    
+
     int instanceCount = fGeoData.count();
     size_t vertexStride = gp->getVertexStride();
     SkASSERT(vertexStride == sizeof(SkPoint) + sizeof(SkPoint)
              + (this->hasColors() ? sizeof(GrColor) : 0));
-    
+
     QuadHelper helper;
     int numQuads = this->quadCount();
     void* verts = helper.init(target, vertexStride, numQuads);
@@ -72,11 +72,11 @@
         SkDebugf("Could not allocate vertices\n");
         return;
     }
-    
+
     uint8_t* vertPtr = reinterpret_cast<uint8_t*>(verts);
     for (int i = 0; i < instanceCount; i++) {
         const Geometry& args = fGeoData[i];
-        
+
         size_t allocSize = args.fVerts.count();
         memcpy(vertPtr, args.fVerts.begin(), allocSize);
         vertPtr += allocSize;
@@ -90,10 +90,10 @@
     : INHERITED(ClassID()) {
     SkASSERT(xforms);
     SkASSERT(rects);
-    
+
     fViewMatrix = viewMatrix;
     Geometry& installedGeo = fGeoData.push_back(geometry);
-    
+
     // Figure out stride and offsets
     // Order within the vertex is: position [color] texCoord
     size_t texOffset = sizeof(SkPoint);
@@ -103,13 +103,13 @@
         texOffset += sizeof(GrColor);
         vertexStride += sizeof(GrColor);
     }
-    
+
     // Compute buffer size and alloc buffer
     fQuadCount = spriteCount;
     int allocSize = static_cast<int>(4*vertexStride*spriteCount);
     installedGeo.fVerts.reset(allocSize);
     uint8_t* currVertex = installedGeo.fVerts.begin();
-    
+
     SkRect bounds;
     bounds.setLargestInverted();
     int paintAlpha = GrColorUnpackA(installedGeo.fColor);
@@ -118,7 +118,7 @@
         SkPoint quad[4];
         const SkRect& currRect = rects[spriteIndex];
         xforms[spriteIndex].toQuad(currRect.width(), currRect.height(), quad);
- 
+
         // Copy colors if necessary
         if (colors) {
             // convert to GrColor
@@ -127,13 +127,13 @@
                 color = SkColorSetA(color, SkMulDiv255Round(SkColorGetA(color), paintAlpha));
             }
             GrColor grColor = SkColorToPremulGrColor(color);
-            
+
             *(reinterpret_cast<GrColor*>(currVertex+sizeof(SkPoint))) = grColor;
             *(reinterpret_cast<GrColor*>(currVertex+vertexStride+sizeof(SkPoint))) = grColor;
             *(reinterpret_cast<GrColor*>(currVertex+2*vertexStride+sizeof(SkPoint))) = grColor;
             *(reinterpret_cast<GrColor*>(currVertex+3*vertexStride+sizeof(SkPoint))) = grColor;
         }
-        
+
         // Copy position and uv to verts
         *(reinterpret_cast<SkPoint*>(currVertex)) = quad[0];
         *(reinterpret_cast<SkPoint*>(currVertex+texOffset)) = SkPoint::Make(currRect.fLeft,
@@ -146,26 +146,26 @@
                                                                             currRect.fTop);
         bounds.growToInclude(quad[1].fX, quad[1].fY);
         currVertex += vertexStride;
-        
+
         *(reinterpret_cast<SkPoint*>(currVertex)) = quad[2];
         *(reinterpret_cast<SkPoint*>(currVertex+texOffset)) = SkPoint::Make(currRect.fRight,
                                                                             currRect.fBottom);
         bounds.growToInclude(quad[2].fX, quad[2].fY);
         currVertex += vertexStride;
-        
+
         *(reinterpret_cast<SkPoint*>(currVertex)) = quad[3];
         *(reinterpret_cast<SkPoint*>(currVertex+texOffset)) = SkPoint::Make(currRect.fLeft,
                                                                             currRect.fBottom);
         bounds.growToInclude(quad[3].fX, quad[3].fY);
         currVertex += vertexStride;
     }
-    
+
     viewMatrix.mapRect(&bounds);
     // Outset for a half pixel in each direction to account for snapping in non-AA case
     bounds.outset(0.5f, 0.5f);
     this->setBounds(bounds);
 }
- 
+
 bool GrDrawAtlasBatch::onCombineIfPossible(GrBatch* t, const GrCaps& caps) {
     GrDrawAtlasBatch* that = t->cast<GrDrawAtlasBatch>();
 
@@ -178,21 +178,21 @@
     if (!this->viewMatrix().cheapEqualTo(that->viewMatrix())) {
         return false;
     }
-    
+
     if (this->hasColors() != that->hasColors()) {
         return false;
     }
-    
+
     if (!this->hasColors() && this->color() != that->color()) {
         return false;
     }
-    
+
     if (this->color() != that->color()) {
         fColor = GrColor_ILLEGAL;
     }
     fGeoData.push_back_n(that->geoData()->count(), that->geoData()->begin());
     fQuadCount += that->quadCount();
-    
+
     this->joinBounds(that->bounds());
     return true;
 }
@@ -219,7 +219,7 @@
 static SkRect random_texRect(SkRandom* random) {
     static const SkScalar kMinCoord = 0.0f;
     static const SkScalar kMaxCoord = 1024.f;
-    
+
     SkRect texRect = SkRect::MakeLTRB(random->nextRangeScalar(kMinCoord, kMaxCoord),
                                       random->nextRangeScalar(kMinCoord, kMaxCoord),
                                       random->nextRangeScalar(kMinCoord, kMaxCoord),
@@ -243,21 +243,21 @@
 
 DRAW_BATCH_TEST_DEFINE(GrDrawAtlasBatch) {
     uint32_t spriteCount = random->nextRangeU(1, 100);
-    
+
     SkTArray<SkRSXform> xforms(spriteCount);
     SkTArray<SkRect> texRects(spriteCount);
     SkTArray<GrColor> colors;
-    
+
     bool hasColors = random->nextBool();
-    
+
     randomize_params(spriteCount,
                      random,
                      &xforms,
                      &texRects,
                      &colors, hasColors);
-    
+
     SkMatrix viewMatrix = GrTest::TestMatrix(random);
-    
+
     GrDrawAtlasBatch::Geometry geometry;
     geometry.fColor = GrRandomColor(random);
     return GrDrawAtlasBatch::Create(geometry, viewMatrix, spriteCount, xforms.begin(),
diff --git a/src/gpu/batches/GrDrawAtlasBatch.h b/src/gpu/batches/GrDrawAtlasBatch.h
index b70f190..0a3d613 100644
--- a/src/gpu/batches/GrDrawAtlasBatch.h
+++ b/src/gpu/batches/GrDrawAtlasBatch.h
@@ -26,10 +26,10 @@
                                const SkColor* colors) {
         return new GrDrawAtlasBatch(geometry, viewMatrix, spriteCount, xforms, rects, colors);
     }
-    
+
     const char* name() const override { return "DrawAtlasBatch"; }
-    
-    void computePipelineOptimizations(GrInitInvariantOutput* color, 
+
+    void computePipelineOptimizations(GrInitInvariantOutput* color,
                                       GrInitInvariantOutput* coverage,
                                       GrBatchToXPOverrides* overrides) const override {
         // When this is called on a batch, there is only one geometry bundle
@@ -57,10 +57,10 @@
     bool hasColors() const { return fHasColors; }
     int quadCount() const { return fQuadCount; }
     bool coverageIgnored() const { return fCoverageIgnored; }
-    
+
     bool onCombineIfPossible(GrBatch* t, const GrCaps&) override;
     SkSTArray<1, Geometry, true> fGeoData;
-    
+
     SkMatrix fViewMatrix;
     GrColor  fColor;
     int      fQuadCount;
diff --git a/src/gpu/batches/GrDrawBatch.h b/src/gpu/batches/GrDrawBatch.h
index 4d4209a..d1083b3 100644
--- a/src/gpu/batches/GrDrawBatch.h
+++ b/src/gpu/batches/GrDrawBatch.h
@@ -88,7 +88,7 @@
     }
 
 protected:
-    virtual void computePipelineOptimizations(GrInitInvariantOutput* color, 
+    virtual void computePipelineOptimizations(GrInitInvariantOutput* color,
                                               GrInitInvariantOutput* coverage,
                                               GrBatchToXPOverrides* overrides) const = 0;
 
diff --git a/src/gpu/batches/GrDrawPathBatch.h b/src/gpu/batches/GrDrawPathBatch.h
index 618bc5e..d29d046 100644
--- a/src/gpu/batches/GrDrawPathBatch.h
+++ b/src/gpu/batches/GrDrawPathBatch.h
@@ -19,7 +19,7 @@
 
 class GrDrawPathBatchBase : public GrDrawBatch {
 public:
-    void computePipelineOptimizations(GrInitInvariantOutput* color, 
+    void computePipelineOptimizations(GrInitInvariantOutput* color,
                                       GrInitInvariantOutput* coverage,
                                       GrBatchToXPOverrides* overrides) const override {
         color->setKnownFourComponents(fColor);
diff --git a/src/gpu/batches/GrDrawVerticesBatch.cpp b/src/gpu/batches/GrDrawVerticesBatch.cpp
index 20d9f79..d3c9f5e 100644
--- a/src/gpu/batches/GrDrawVerticesBatch.cpp
+++ b/src/gpu/batches/GrDrawVerticesBatch.cpp
@@ -65,7 +65,7 @@
     this->setBounds(bounds);
 }
 
-void GrDrawVerticesBatch::computePipelineOptimizations(GrInitInvariantOutput* color, 
+void GrDrawVerticesBatch::computePipelineOptimizations(GrInitInvariantOutput* color,
                                                        GrInitInvariantOutput* coverage,
                                                        GrBatchToXPOverrides* overrides) const {
     // When this is called on a batch, there is only one geometry bundle
diff --git a/src/gpu/batches/GrDrawVerticesBatch.h b/src/gpu/batches/GrDrawVerticesBatch.h
index 9b2faf3..f2b1ea9 100644
--- a/src/gpu/batches/GrDrawVerticesBatch.h
+++ b/src/gpu/batches/GrDrawVerticesBatch.h
@@ -42,7 +42,7 @@
 
     const char* name() const override { return "DrawVerticesBatch"; }
 
-    void computePipelineOptimizations(GrInitInvariantOutput* color, 
+    void computePipelineOptimizations(GrInitInvariantOutput* color,
                                       GrInitInvariantOutput* coverage,
                                       GrBatchToXPOverrides* overrides) const override;
 
diff --git a/src/gpu/batches/GrNinePatch.cpp b/src/gpu/batches/GrNinePatch.cpp
index 17ab6c1..45c33d7 100644
--- a/src/gpu/batches/GrNinePatch.cpp
+++ b/src/gpu/batches/GrNinePatch.cpp
@@ -74,7 +74,7 @@
         return str;
     }
 
-    void computePipelineOptimizations(GrInitInvariantOutput* color, 
+    void computePipelineOptimizations(GrInitInvariantOutput* color,
                                       GrInitInvariantOutput* coverage,
                                       GrBatchToXPOverrides* overrides) const override {
         color->setUnknownFourComponents();
diff --git a/src/gpu/batches/GrNonAAStrokeRectBatch.cpp b/src/gpu/batches/GrNonAAStrokeRectBatch.cpp
index 3e5311f..8c32c83 100644
--- a/src/gpu/batches/GrNonAAStrokeRectBatch.cpp
+++ b/src/gpu/batches/GrNonAAStrokeRectBatch.cpp
@@ -54,7 +54,7 @@
 
     const char* name() const override { return "GrStrokeRectBatch"; }
 
-    void computePipelineOptimizations(GrInitInvariantOutput* color, 
+    void computePipelineOptimizations(GrInitInvariantOutput* color,
                                       GrInitInvariantOutput* coverage,
                                       GrBatchToXPOverrides* overrides) const override {
         // When this is called on a batch, there is only one geometry bundle
diff --git a/src/gpu/batches/GrPLSPathRenderer.cpp b/src/gpu/batches/GrPLSPathRenderer.cpp
index 28ad206..ee0316a 100644
--- a/src/gpu/batches/GrPLSPathRenderer.cpp
+++ b/src/gpu/batches/GrPLSPathRenderer.cpp
@@ -36,7 +36,7 @@
 struct PLSVertex {
     SkPoint  fPos;
     // for triangles, these are the three triangle vertices
-    // for quads, vert1 is the texture UV coords, and vert2 and vert3 are the line segment 
+    // for quads, vert1 is the texture UV coords, and vert2 and vert3 are the line segment
     // comprising the flat edge of the quad
     SkPoint  fVert1;
     SkPoint  fVert2;
@@ -56,7 +56,7 @@
 
 #define kQuadNumVertices 5
 static void add_quad(SkPoint pts[3], PLSVertices& vertices) {
-    SkPoint normal = SkPoint::Make(pts[0].fY - pts[2].fY, 
+    SkPoint normal = SkPoint::Make(pts[0].fY - pts[2].fY,
                                    pts[2].fX - pts[0].fX);
     normal.setLength(kBloatSize);
     SkScalar cross = (pts[1] - pts[0]).cross(pts[2] - pts[0]);
@@ -132,7 +132,7 @@
     return true;
 }
 
-static bool get_geometry(const SkPath& path, const SkMatrix& m, PLSVertices& triVertices, 
+static bool get_geometry(const SkPath& path, const SkMatrix& m, PLSVertices& triVertices,
                          PLSVertices& quadVertices, GrResourceProvider* resourceProvider,
                          SkRect bounds) {
     SkScalar screenSpaceTol = GrPathUtils::kDefaultTolerance;
@@ -292,48 +292,48 @@
 
             GrGLSLVertToFrag v1(kVec2f_GrSLType);
             varyingHandler->addVarying("Vertex1", &v1, kHigh_GrSLPrecision);
-            vsBuilder->codeAppendf("%s = vec2(%s.x, %s.y);", 
+            vsBuilder->codeAppendf("%s = vec2(%s.x, %s.y);",
                                    v1.vsOut(),
-                                   te.inVertex1()->fName, 
+                                   te.inVertex1()->fName,
                                    te.inVertex1()->fName);
 
             GrGLSLVertToFrag v2(kVec2f_GrSLType);
             varyingHandler->addVarying("Vertex2", &v2, kHigh_GrSLPrecision);
-            vsBuilder->codeAppendf("%s = vec2(%s.x, %s.y);", 
+            vsBuilder->codeAppendf("%s = vec2(%s.x, %s.y);",
                                    v2.vsOut(),
-                                   te.inVertex2()->fName, 
+                                   te.inVertex2()->fName,
                                    te.inVertex2()->fName);
 
             GrGLSLVertToFrag v3(kVec2f_GrSLType);
             varyingHandler->addVarying("Vertex3", &v3, kHigh_GrSLPrecision);
-            vsBuilder->codeAppendf("%s = vec2(%s.x, %s.y);", 
+            vsBuilder->codeAppendf("%s = vec2(%s.x, %s.y);",
                                    v3.vsOut(),
-                                   te.inVertex3()->fName, 
+                                   te.inVertex3()->fName,
                                    te.inVertex3()->fName);
 
             GrGLSLVertToFrag delta1(kVec2f_GrSLType);
             varyingHandler->addVarying("delta1", &delta1, kHigh_GrSLPrecision);
-            vsBuilder->codeAppendf("%s = vec2(%s.x - %s.x, %s.y - %s.y) * 0.5;", 
+            vsBuilder->codeAppendf("%s = vec2(%s.x - %s.x, %s.y - %s.y) * 0.5;",
                                    delta1.vsOut(), v1.vsOut(), v2.vsOut(), v2.vsOut(), v1.vsOut());
 
             GrGLSLVertToFrag delta2(kVec2f_GrSLType);
             varyingHandler->addVarying("delta2", &delta2, kHigh_GrSLPrecision);
-            vsBuilder->codeAppendf("%s = vec2(%s.x - %s.x, %s.y - %s.y) * 0.5;", 
+            vsBuilder->codeAppendf("%s = vec2(%s.x - %s.x, %s.y - %s.y) * 0.5;",
                                    delta2.vsOut(), v2.vsOut(), v3.vsOut(), v3.vsOut(), v2.vsOut());
 
             GrGLSLVertToFrag delta3(kVec2f_GrSLType);
             varyingHandler->addVarying("delta3", &delta3, kHigh_GrSLPrecision);
-            vsBuilder->codeAppendf("%s = vec2(%s.x - %s.x, %s.y - %s.y) * 0.5;", 
+            vsBuilder->codeAppendf("%s = vec2(%s.x - %s.x, %s.y - %s.y) * 0.5;",
                                    delta3.vsOut(), v3.vsOut(), v1.vsOut(), v1.vsOut(), v3.vsOut());
 
             GrGLSLVertToFrag windings(kInt_GrSLType);
             varyingHandler->addFlatVarying("windings", &windings, kLow_GrSLPrecision);
-            vsBuilder->codeAppendf("%s = %s;", 
+            vsBuilder->codeAppendf("%s = %s;",
                                    windings.vsOut(), te.inWindings()->fName);
 
             // emit transforms
-            this->emitTransforms(vsBuilder, varyingHandler, uniformHandler, gpArgs->fPositionVar, 
-                                 te.inPosition()->fName, te.localMatrix(), args.fTransformsIn, 
+            this->emitTransforms(vsBuilder, varyingHandler, uniformHandler, gpArgs->fPositionVar,
+                                 te.inPosition()->fName, te.localMatrix(), args.fTransformsIn,
                                  args.fTransformsOut);
 
             GrGLSLPPFragmentBuilder* fsBuilder = args.fFragBuilder;
@@ -342,11 +342,11 @@
             SkAssertResult(fsBuilder->enableFeature(
                     GrGLSLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature));
             fsBuilder->declAppendf(GR_GL_PLS_PATH_DATA_DECL);
-            // Compute four subsamples, each shifted a quarter pixel along x and y from 
-            // gl_FragCoord. The oriented box positioning of the subsamples is of course not 
+            // Compute four subsamples, each shifted a quarter pixel along x and y from
+            // gl_FragCoord. The oriented box positioning of the subsamples is of course not
             // optimal, but it greatly simplifies the math and this simplification is necessary for
             // performance reasons.
-            fsBuilder->codeAppendf("highp vec2 firstSample = %s.xy - vec2(0.25);", 
+            fsBuilder->codeAppendf("highp vec2 firstSample = %s.xy - vec2(0.25);",
                                    fsBuilder->fragmentPosition());
             fsBuilder->codeAppendf("highp vec2 delta1 = %s;", delta1.fsIn());
             fsBuilder->codeAppendf("highp vec2 delta2 = %s;", delta2.fsIn());
@@ -355,11 +355,11 @@
             // all are < 0, we're inside. The first vector in each case is half of what it is
             // "supposed" to be, because we re-use them later as adjustment factors for which half
             // is the correct value, so we multiply the dots by two to compensate.
-            fsBuilder->codeAppendf("highp float d1 = dot(delta1, (firstSample - %s).yx) * 2.0;", 
+            fsBuilder->codeAppendf("highp float d1 = dot(delta1, (firstSample - %s).yx) * 2.0;",
                                    v1.fsIn());
-            fsBuilder->codeAppendf("highp float d2 = dot(delta2, (firstSample - %s).yx) * 2.0;", 
+            fsBuilder->codeAppendf("highp float d2 = dot(delta2, (firstSample - %s).yx) * 2.0;",
                                    v2.fsIn());
-            fsBuilder->codeAppendf("highp float d3 = dot(delta3, (firstSample - %s).yx) * 2.0;", 
+            fsBuilder->codeAppendf("highp float d3 = dot(delta3, (firstSample - %s).yx) * 2.0;",
                                    v3.fsIn());
             fsBuilder->codeAppend("highp float dmax = max(d1, max(d2, d3));");
             fsBuilder->codeAppendf("pls.windings[0] += (dmax <= 0.0) ? %s : 0;", windings.fsIn());
@@ -420,15 +420,15 @@
         : fLocalMatrix(localMatrix)
         , fUsesLocalCoords(usesLocalCoords) {
         this->initClassID<PLSAATriangleEffect>();
-        fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertexAttribType, 
+        fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertexAttribType,
                                                        kHigh_GrSLPrecision));
-        fInVertex1 = &this->addVertexAttrib(Attribute("inVertex1", kVec2f_GrVertexAttribType, 
+        fInVertex1 = &this->addVertexAttrib(Attribute("inVertex1", kVec2f_GrVertexAttribType,
                                                       kHigh_GrSLPrecision));
-        fInVertex2 = &this->addVertexAttrib(Attribute("inVertex2", kVec2f_GrVertexAttribType, 
+        fInVertex2 = &this->addVertexAttrib(Attribute("inVertex2", kVec2f_GrVertexAttribType,
                                                       kHigh_GrSLPrecision));
-        fInVertex3 = &this->addVertexAttrib(Attribute("inVertex3", kVec2f_GrVertexAttribType, 
+        fInVertex3 = &this->addVertexAttrib(Attribute("inVertex3", kVec2f_GrVertexAttribType,
                                                       kHigh_GrSLPrecision));
-        fInWindings = &this->addVertexAttrib(Attribute("inWindings", kInt_GrVertexAttribType, 
+        fInWindings = &this->addVertexAttrib(Attribute("inWindings", kInt_GrVertexAttribType,
                                                        kLow_GrSLPrecision));
         this->setWillReadFragmentPosition();
     }
@@ -440,7 +440,7 @@
     const Attribute* fInWindings;
     SkMatrix         fLocalMatrix;
     bool             fUsesLocalCoords;
-    
+
     GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
 
     typedef GrGeometryProcessor INHERITED;
@@ -497,31 +497,31 @@
 
             GrGLSLVertToFrag ep1(kVec2f_GrSLType);
             varyingHandler->addVarying("endpoint1", &ep1, kHigh_GrSLPrecision);
-            vsBuilder->codeAppendf("%s = vec2(%s.x, %s.y);", ep1.vsOut(), 
+            vsBuilder->codeAppendf("%s = vec2(%s.x, %s.y);", ep1.vsOut(),
                                   qe.inEndpoint1()->fName, qe.inEndpoint1()->fName);
 
             GrGLSLVertToFrag ep2(kVec2f_GrSLType);
             varyingHandler->addVarying("endpoint2", &ep2, kHigh_GrSLPrecision);
-            vsBuilder->codeAppendf("%s = vec2(%s.x, %s.y);", ep2.vsOut(), 
+            vsBuilder->codeAppendf("%s = vec2(%s.x, %s.y);", ep2.vsOut(),
                                   qe.inEndpoint2()->fName, qe.inEndpoint2()->fName);
 
             GrGLSLVertToFrag delta(kVec2f_GrSLType);
             varyingHandler->addVarying("delta", &delta, kHigh_GrSLPrecision);
-            vsBuilder->codeAppendf("%s = vec2(%s.x - %s.x, %s.y - %s.y) * 0.5;", 
-                                   delta.vsOut(), ep1.vsOut(), ep2.vsOut(), ep2.vsOut(), 
+            vsBuilder->codeAppendf("%s = vec2(%s.x - %s.x, %s.y - %s.y) * 0.5;",
+                                   delta.vsOut(), ep1.vsOut(), ep2.vsOut(), ep2.vsOut(),
                                    ep1.vsOut());
 
             GrGLSLVertToFrag windings(kInt_GrSLType);
             varyingHandler->addFlatVarying("windings", &windings, kLow_GrSLPrecision);
-            vsBuilder->codeAppendf("%s = %s;", 
+            vsBuilder->codeAppendf("%s = %s;",
                                    windings.vsOut(), qe.inWindings()->fName);
 
             // Setup position
             this->setupPosition(vsBuilder, gpArgs, qe.inPosition()->fName);
 
             // emit transforms
-            this->emitTransforms(vsBuilder, varyingHandler, uniformHandler, gpArgs->fPositionVar, 
-                                 qe.inPosition()->fName, qe.localMatrix(), args.fTransformsIn, 
+            this->emitTransforms(vsBuilder, varyingHandler, uniformHandler, gpArgs->fPositionVar,
+                                 qe.inPosition()->fName, qe.localMatrix(), args.fTransformsIn,
                                  args.fTransformsOut);
 
             GrGLSLPPFragmentBuilder* fsBuilder = args.fFragBuilder;
@@ -541,7 +541,7 @@
                                      "} else {"
                                      "return false;"
                                      "}";
-            fsBuilder->emitFunction(kBool_GrSLType, "in_quad", QUAD_ARGS, inQuadArgs, inQuadCode, 
+            fsBuilder->emitFunction(kBool_GrSLType, "in_quad", QUAD_ARGS, inQuadArgs, inQuadCode,
                                     &inQuadName);
             fsBuilder->declAppendf(GR_GL_PLS_PATH_DATA_DECL);
             // keep the derivative instructions outside the conditional
@@ -549,25 +549,25 @@
             fsBuilder->codeAppendf("highp vec2 uvdY = dFdy(%s);", uv.fsIn());
             fsBuilder->codeAppend("highp vec2 uvIncX = uvdX * 0.45 + uvdY * -0.1;");
             fsBuilder->codeAppend("highp vec2 uvIncY = uvdX * 0.1 + uvdY * 0.55;");
-            fsBuilder->codeAppendf("highp vec2 uv = %s.xy - uvdX * 0.35 - uvdY * 0.25;", 
+            fsBuilder->codeAppendf("highp vec2 uv = %s.xy - uvdX * 0.35 - uvdY * 0.25;",
                                    uv.fsIn());
             fsBuilder->codeAppendf("highp vec2 firstSample = %s.xy - vec2(0.25);",
                                    fsBuilder->fragmentPosition());
-            fsBuilder->codeAppendf("highp float d = dot(%s, (firstSample - %s).yx) * 2.0;", 
+            fsBuilder->codeAppendf("highp float d = dot(%s, (firstSample - %s).yx) * 2.0;",
                                    delta.fsIn(), ep1.fsIn());
-            fsBuilder->codeAppendf("pls.windings[0] += %s(d, uv) ? %s : 0;", inQuadName.c_str(), 
+            fsBuilder->codeAppendf("pls.windings[0] += %s(d, uv) ? %s : 0;", inQuadName.c_str(),
                                    windings.fsIn());
             fsBuilder->codeAppend("uv += uvIncX;");
             fsBuilder->codeAppendf("d += %s.x;", delta.fsIn());
-            fsBuilder->codeAppendf("pls.windings[1] += %s(d, uv) ? %s : 0;", inQuadName.c_str(), 
+            fsBuilder->codeAppendf("pls.windings[1] += %s(d, uv) ? %s : 0;", inQuadName.c_str(),
                                    windings.fsIn());
             fsBuilder->codeAppend("uv += uvIncY;");
             fsBuilder->codeAppendf("d += %s.y;", delta.fsIn());
-            fsBuilder->codeAppendf("pls.windings[2] += %s(d, uv) ? %s : 0;", inQuadName.c_str(), 
+            fsBuilder->codeAppendf("pls.windings[2] += %s(d, uv) ? %s : 0;", inQuadName.c_str(),
                                    windings.fsIn());
             fsBuilder->codeAppend("uv -= uvIncX;");
             fsBuilder->codeAppendf("d -= %s.x;", delta.fsIn());
-            fsBuilder->codeAppendf("pls.windings[3] += %s(d, uv) ? %s : 0;", inQuadName.c_str(), 
+            fsBuilder->codeAppendf("pls.windings[3] += %s(d, uv) ? %s : 0;", inQuadName.c_str(),
                                    windings.fsIn());
         }
 
@@ -609,15 +609,15 @@
         : fLocalMatrix(localMatrix)
         , fUsesLocalCoords(usesLocalCoords) {
         this->initClassID<PLSQuadEdgeEffect>();
-        fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertexAttribType, 
+        fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertexAttribType,
                                                        kHigh_GrSLPrecision));
-        fInUV = &this->addVertexAttrib(Attribute("inUV", kVec2f_GrVertexAttribType, 
+        fInUV = &this->addVertexAttrib(Attribute("inUV", kVec2f_GrVertexAttribType,
                                                  kHigh_GrSLPrecision));
-        fInEndpoint1 = &this->addVertexAttrib(Attribute("inEndpoint1", kVec2f_GrVertexAttribType, 
+        fInEndpoint1 = &this->addVertexAttrib(Attribute("inEndpoint1", kVec2f_GrVertexAttribType,
                                                         kHigh_GrSLPrecision));
-        fInEndpoint2 = &this->addVertexAttrib(Attribute("inEndpoint2", kVec2f_GrVertexAttribType, 
+        fInEndpoint2 = &this->addVertexAttrib(Attribute("inEndpoint2", kVec2f_GrVertexAttribType,
                                                         kHigh_GrSLPrecision));
-        fInWindings  = &this->addVertexAttrib(Attribute("inWindings", kInt_GrVertexAttribType, 
+        fInWindings  = &this->addVertexAttrib(Attribute("inWindings", kInt_GrVertexAttribType,
                                                         kLow_GrSLPrecision));
         this->setWillReadFragmentPosition();
     }
@@ -629,7 +629,7 @@
     const Attribute* fInWindings;
     SkMatrix         fLocalMatrix;
     bool             fUsesLocalCoords;
-    
+
     GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
 
     typedef GrGeometryProcessor INHERITED;
@@ -652,13 +652,13 @@
     bool colorIgnored() const { return GrColor_ILLEGAL == fColor; }
     const SkMatrix& localMatrix() const { return fLocalMatrix; }
     bool usesLocalCoords() const { return fUsesLocalCoords; }
-    
-    GrPixelLocalStorageState getPixelLocalStorageState() const override { 
+
+    GrPixelLocalStorageState getPixelLocalStorageState() const override {
         return GrPixelLocalStorageState::kFinish_GrPixelLocalStorageState;
     }
 
     const char* getDestColorOverride() const override {
-        return GR_GL_PLS_DSTCOLOR_NAME; 
+        return GR_GL_PLS_DSTCOLOR_NAME;
     }
 
     class GLSLProcessor : public GrGLSLGeometryProcessor {
@@ -672,14 +672,14 @@
             GrGLSLUniformHandler* uniformHandler = args.fUniformHandler;
 
             fUseEvenOdd = uniformHandler->addUniform(kFragment_GrShaderFlag,
-                                                    kFloat_GrSLType, kLow_GrSLPrecision, 
+                                                    kFloat_GrSLType, kLow_GrSLPrecision,
                                                     "useEvenOdd");
             const char* useEvenOdd = uniformHandler->getUniformCStr(fUseEvenOdd);
 
             varyingHandler->emitAttributes(fe);
             this->setupPosition(vsBuilder, gpArgs, fe.inPosition()->fName);
-            this->emitTransforms(vsBuilder, varyingHandler, uniformHandler, gpArgs->fPositionVar, 
-                                 fe.inPosition()->fName, fe.localMatrix(), args.fTransformsIn, 
+            this->emitTransforms(vsBuilder, varyingHandler, uniformHandler, gpArgs->fPositionVar,
+                                 fe.inPosition()->fName, fe.localMatrix(), args.fTransformsIn,
                                  args.fTransformsOut);
 
             GrGLSLPPFragmentBuilder* fsBuilder = args.fFragBuilder;
@@ -699,7 +699,7 @@
             fsBuilder->codeAppend("coverage += pls.windings[3] != 0 ? 0.25 : 0.0;");
             fsBuilder->codeAppend("}");
             if (!fe.colorIgnored()) {
-                this->setupUniformColor(fsBuilder, uniformHandler, args.fOutputColor, 
+                this->setupUniformColor(fsBuilder, uniformHandler, args.fOutputColor,
                                         &fColorUniform);
             }
             fsBuilder->codeAppendf("%s = vec4(coverage);", args.fOutputCoverage);
@@ -752,14 +752,14 @@
     }
 
 private:
-    PLSFinishEffect(GrColor color, bool useEvenOdd, const SkMatrix& localMatrix, 
+    PLSFinishEffect(GrColor color, bool useEvenOdd, const SkMatrix& localMatrix,
                     bool usesLocalCoords)
         : fColor(color)
         , fUseEvenOdd(useEvenOdd)
         , fLocalMatrix(localMatrix)
         , fUsesLocalCoords(usesLocalCoords) {
         this->initClassID<PLSFinishEffect>();
-        fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertexAttribType, 
+        fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertexAttribType,
                                                        kHigh_GrSLPrecision));
     }
 
@@ -797,7 +797,7 @@
 
     const char* name() const override { return "PLSBatch"; }
 
-    void computePipelineOptimizations(GrInitInvariantOutput* color, 
+    void computePipelineOptimizations(GrInitInvariantOutput* color,
                                       GrInitInvariantOutput* coverage,
                                       GrBatchToXPOverrides* overrides) const override {
         // When this is called on a batch, there is only one geometry bundle
@@ -911,10 +911,10 @@
             }
 
             SkAutoTUnref<GrGeometryProcessor> finishProcessor(
-                    PLSFinishEffect::Create(this->color(), 
-                                            pathPtr->getFillType() == 
+                    PLSFinishEffect::Create(this->color(),
+                                            pathPtr->getFillType() ==
                                                                 SkPath::FillType::kEvenOdd_FillType,
-                                            invert, 
+                                            invert,
                                             this->usesLocalCoords()));
             const GrBuffer* rectVertexBuffer;
             size_t finishStride = finishProcessor->getVertexStride();
diff --git a/src/gpu/batches/GrPLSPathRenderer.h b/src/gpu/batches/GrPLSPathRenderer.h
index d701f62..39f21ba 100644
--- a/src/gpu/batches/GrPLSPathRenderer.h
+++ b/src/gpu/batches/GrPLSPathRenderer.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2012 Google Inc.
  *
@@ -13,26 +12,26 @@
 
 /*
  * Renders arbitrary antialiased paths using pixel local storage as a scratch buffer. The overall
- * technique is very similar to the approach presented in "Resolution independent rendering of 
+ * technique is very similar to the approach presented in "Resolution independent rendering of
  * deformable vector objects using graphics hardware" by Kokojima et al.
 
  * We first render the straight-line portions of the path (essentially pretending as if all segments
- * were kLine_Verb) as a triangle fan, using a fragment shader which updates the winding counts 
- * appropriately. We then render the curved portions of the path using a Loop-Blinn shader which 
+ * were kLine_Verb) as a triangle fan, using a fragment shader which updates the winding counts
+ * appropriately. We then render the curved portions of the path using a Loop-Blinn shader which
  * calculates which portion of the triangle is covered by the quad (conics and cubics are split down
- * to quads). Where we diverge from Kokojima is that, instead of rendering into the stencil buffer 
+ * to quads). Where we diverge from Kokojima is that, instead of rendering into the stencil buffer
  * and using built-in MSAA to handle straight-line antialiasing, we use the pixel local storage area
- * and calculate the MSAA ourselves in the fragment shader. Essentially, we manually evaluate the 
+ * and calculate the MSAA ourselves in the fragment shader. Essentially, we manually evaluate the
  * coverage of each pixel four times, storing four winding counts into the pixel local storage area,
  * and compute the final coverage based on those winding counts.
  *
- * Our approach is complicated by the need to perform antialiasing on straight edges as well, 
- * without relying on hardware MSAA. We instead bloat the triangles to ensure complete coverage, 
- * pass the original (un-bloated) vertices in to the fragment shader, and then have the fragment 
- * shader use these vertices to evaluate whether a given sample is located within the triangle or 
+ * Our approach is complicated by the need to perform antialiasing on straight edges as well,
+ * without relying on hardware MSAA. We instead bloat the triangles to ensure complete coverage,
+ * pass the original (un-bloated) vertices in to the fragment shader, and then have the fragment
+ * shader use these vertices to evaluate whether a given sample is located within the triangle or
  * not. This gives us MSAA4 edges on triangles which line up nicely with no seams. We similarly face
- * problems on the back (flat) edges of quads, where we have to ensure that the back edge is 
- * antialiased in the same way. Similar to the triangle case, we pass in the two (unbloated) 
+ * problems on the back (flat) edges of quads, where we have to ensure that the back edge is
+ * antialiased in the same way. Similar to the triangle case, we pass in the two (unbloated)
  * vertices defining the back edge of the quad and the fragment shader uses these vertex coordinates
  * to discard samples falling on the other side of the quad's back edge.
  */
diff --git a/src/gpu/batches/GrStencilAndCoverPathRenderer.cpp b/src/gpu/batches/GrStencilAndCoverPathRenderer.cpp
index cf43173..d50111b 100644
--- a/src/gpu/batches/GrStencilAndCoverPathRenderer.cpp
+++ b/src/gpu/batches/GrStencilAndCoverPathRenderer.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2012 Google Inc.
  *
@@ -28,7 +27,7 @@
 }
 
 GrStencilAndCoverPathRenderer::GrStencilAndCoverPathRenderer(GrResourceProvider* resourceProvider)
-    : fResourceProvider(resourceProvider) {    
+    : fResourceProvider(resourceProvider) {
 }
 
 bool GrStencilAndCoverPathRenderer::onCanDrawPath(const CanDrawPathArgs& args) const {
diff --git a/src/gpu/batches/GrStencilAndCoverPathRenderer.h b/src/gpu/batches/GrStencilAndCoverPathRenderer.h
index bb8cdb0..8fec6c6 100644
--- a/src/gpu/batches/GrStencilAndCoverPathRenderer.h
+++ b/src/gpu/batches/GrStencilAndCoverPathRenderer.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2012 Google Inc.
  *
diff --git a/src/gpu/batches/GrTInstanceBatch.h b/src/gpu/batches/GrTInstanceBatch.h
index fdd0662..726903e 100644
--- a/src/gpu/batches/GrTInstanceBatch.h
+++ b/src/gpu/batches/GrTInstanceBatch.h
@@ -59,7 +59,7 @@
         return str;
     }
 
-    void computePipelineOptimizations(GrInitInvariantOutput* color, 
+    void computePipelineOptimizations(GrInitInvariantOutput* color,
                                       GrInitInvariantOutput* coverage,
                                       GrBatchToXPOverrides* overrides) const override {
         // When this is called on a batch, there is only one geometry bundle
@@ -89,7 +89,7 @@
     GrTInstanceBatch() : INHERITED(ClassID()) {}
 
     void onPrepareDraws(Target* target) const override {
-        SkAutoTUnref<const GrGeometryProcessor> gp(Impl::CreateGP(this->seedGeometry(), 
+        SkAutoTUnref<const GrGeometryProcessor> gp(Impl::CreateGP(this->seedGeometry(),
                                                                   fOverrides));
         if (!gp) {
             SkDebugf("Couldn't create GrGeometryProcessor\n");
diff --git a/src/gpu/batches/GrTessellatingPathRenderer.cpp b/src/gpu/batches/GrTessellatingPathRenderer.cpp
index 4ba0188..8185a85 100644
--- a/src/gpu/batches/GrTessellatingPathRenderer.cpp
+++ b/src/gpu/batches/GrTessellatingPathRenderer.cpp
@@ -23,7 +23,7 @@
 
 /*
  * This path renderer tessellates the path into triangles using GrTessellator, uploads the triangles
- * to a vertex buffer, and renders them with a single draw call. It does not currently do 
+ * to a vertex buffer, and renders them with a single draw call. It does not currently do
  * antialiasing, so it must be used in conjunction with multisampling.
  */
 namespace {
@@ -124,7 +124,7 @@
 
     const char* name() const override { return "TessellatingPathBatch"; }
 
-    void computePipelineOptimizations(GrInitInvariantOutput* color, 
+    void computePipelineOptimizations(GrInitInvariantOutput* color,
                                       GrInitInvariantOutput* coverage,
                                       GrBatchToXPOverrides* overrides) const override {
         color->setKnownFourComponents(fColor);
diff --git a/src/gpu/batches/GrTestBatch.h b/src/gpu/batches/GrTestBatch.h
index c28f98d..5da65f8 100644
--- a/src/gpu/batches/GrTestBatch.h
+++ b/src/gpu/batches/GrTestBatch.h
@@ -25,7 +25,7 @@
 
     virtual const char* name() const override = 0;
 
-    void computePipelineOptimizations(GrInitInvariantOutput* color, 
+    void computePipelineOptimizations(GrInitInvariantOutput* color,
                                       GrInitInvariantOutput* coverage,
                                       GrBatchToXPOverrides* overrides) const override {
         // When this is called on a batch, there is only one geometry bundle
diff --git a/src/gpu/effects/GrBezierEffect.cpp b/src/gpu/effects/GrBezierEffect.cpp
index ae1a8d3..075ce16 100644
--- a/src/gpu/effects/GrBezierEffect.cpp
+++ b/src/gpu/effects/GrBezierEffect.cpp
@@ -727,4 +727,3 @@
     } while (nullptr == gp);
     return gp;
 }
-
diff --git a/src/gpu/effects/GrCoverageSetOpXP.cpp b/src/gpu/effects/GrCoverageSetOpXP.cpp
index 8c98c6c..c1c9425 100644
--- a/src/gpu/effects/GrCoverageSetOpXP.cpp
+++ b/src/gpu/effects/GrCoverageSetOpXP.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2014 Google Inc.
  *
@@ -113,7 +112,7 @@
                                     GrColor* color,
                                     const GrCaps& caps) const {
     // We never look at the color input
-    return GrXferProcessor::kIgnoreColor_OptFlag; 
+    return GrXferProcessor::kIgnoreColor_OptFlag;
 }
 
 void CoverageSetOpXP::onGetBlendInfo(GrXferProcessor::BlendInfo* blendInfo) const {
@@ -168,10 +167,10 @@
     bool invertCoverage() const { return fInvertCoverage; }
 
 private:
-    GrXferProcessor::OptFlags onGetOptimizations(const GrPipelineOptimizations&, bool, GrColor*, 
+    GrXferProcessor::OptFlags onGetOptimizations(const GrPipelineOptimizations&, bool, GrColor*,
                                                  const GrCaps&) const override {
         // We never look at the color input
-        return GrXferProcessor::kIgnoreColor_OptFlag; 
+        return GrXferProcessor::kIgnoreColor_OptFlag;
     }
 
     void onGetGLSLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBuilder* b) const override;
@@ -342,4 +341,3 @@
     bool invertCoverage = !d->fRenderTarget->hasMixedSamples() && d->fRandom->nextBool();
     return GrCoverageSetOpXPFactory::Create(regionOp, invertCoverage);
 }
-
diff --git a/src/gpu/effects/GrDashingEffect.cpp b/src/gpu/effects/GrDashingEffect.cpp
index 344c125..344b93f 100644
--- a/src/gpu/effects/GrDashingEffect.cpp
+++ b/src/gpu/effects/GrDashingEffect.cpp
@@ -267,7 +267,7 @@
 
     const char* name() const override { return "DashBatch"; }
 
-    void computePipelineOptimizations(GrInitInvariantOutput* color, 
+    void computePipelineOptimizations(GrInitInvariantOutput* color,
                                       GrInitInvariantOutput* coverage,
                                       GrBatchToXPOverrides* overrides) const override {
         // When this is called on a batch, there is only one geometry bundle
diff --git a/src/gpu/effects/GrDashingEffect.h b/src/gpu/effects/GrDashingEffect.h
index eaa0d0d..d67a63e 100644
--- a/src/gpu/effects/GrDashingEffect.h
+++ b/src/gpu/effects/GrDashingEffect.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2014 Google Inc.
  *
diff --git a/src/gpu/effects/GrDisableColorXP.cpp b/src/gpu/effects/GrDisableColorXP.cpp
index 937bea8..7d776e7 100644
--- a/src/gpu/effects/GrDisableColorXP.cpp
+++ b/src/gpu/effects/GrDisableColorXP.cpp
@@ -107,4 +107,3 @@
 const GrXPFactory* GrDisableColorXPFactory::TestCreate(GrProcessorTestData*) {
     return GrDisableColorXPFactory::Create();
 }
-
diff --git a/src/gpu/effects/GrDisableColorXP.h b/src/gpu/effects/GrDisableColorXP.h
index 21e6932..3182eef 100644
--- a/src/gpu/effects/GrDisableColorXP.h
+++ b/src/gpu/effects/GrDisableColorXP.h
@@ -47,4 +47,3 @@
 };
 
 #endif
-
diff --git a/src/gpu/effects/GrDistanceFieldGeoProc.cpp b/src/gpu/effects/GrDistanceFieldGeoProc.cpp
index 2182a11..7d474a1 100644
--- a/src/gpu/effects/GrDistanceFieldGeoProc.cpp
+++ b/src/gpu/effects/GrDistanceFieldGeoProc.cpp
@@ -95,7 +95,7 @@
         vertBuilder->codeAppendf("%s = vec2(%d, %d) * %s;", st.vsOut(),
                                  atlas->width(), atlas->height(),
                                  dfTexEffect.inTextureCoords()->fName);
-        
+
         // Use highp to work around aliasing issues
         fragBuilder->codeAppend(GrGLSLShaderVar::PrecisionString(args.fGLSLCaps,
                                                                  kHigh_GrSLPrecision));
@@ -116,7 +116,7 @@
         fragBuilder->codeAppend("float afwidth;");
         if (isUniformScale) {
             // For uniform scale, we adjust for the effect of the transformation on the distance
-            // by using the length of the gradient of the t coordinate in the y direction. 
+            // by using the length of the gradient of the t coordinate in the y direction.
             // We use st coordinates to ensure we're mapping 1:1 from texel space to pixel space.
             // We use the y gradient because there is a bug in the Mali 400 in the x direction.
 
@@ -356,7 +356,7 @@
         bool isSimilarity = SkToBool(dfTexEffect.getFlags() & kSimilarity_DistanceFieldEffectFlag);
         if (isUniformScale) {
             // For uniform scale, we adjust for the effect of the transformation on the distance
-            // by using the length of the gradient of the t coordinate in the y direction. 
+            // by using the length of the gradient of the t coordinate in the y direction.
             // We use st coordinates to ensure we're mapping 1:1 from texel space to pixel space.
             // We use the y gradient because there is a bug in the Mali 400 in the x direction.
 
@@ -403,7 +403,7 @@
         SkASSERT(fTextureSizeUni.isValid());
 
         GrTexture* texture = proc.texture(0);
-        if (texture->width() != fTextureSize.width() || 
+        if (texture->width() != fTextureSize.width() ||
             texture->height() != fTextureSize.height()) {
             fTextureSize = SkISize::Make(texture->width(), texture->height());
             pdman.set2f(fTextureSizeUni,
@@ -645,8 +645,8 @@
         // trade-off between quality and speed.
         fragBuilder->codeAppend("float afwidth;");
         if (isSimilarity) {
-            // For similarity transform (uniform scale-only is a subset of this), we adjust for the 
-            // effect of the transformation on the distance by using the length of the gradient of 
+            // For similarity transform (uniform scale-only is a subset of this), we adjust for the
+            // effect of the transformation on the distance by using the length of the gradient of
             // the texture coordinates. We use st coordinates to ensure we're mapping 1:1 from texel
             // space to pixel space.
 
diff --git a/src/gpu/effects/GrDistanceFieldGeoProc.h b/src/gpu/effects/GrDistanceFieldGeoProc.h
index 765a531..05fffa5 100644
--- a/src/gpu/effects/GrDistanceFieldGeoProc.h
+++ b/src/gpu/effects/GrDistanceFieldGeoProc.h
@@ -24,7 +24,7 @@
     kPortrait_DistanceFieldEffectFlag   = 0x10,   // lcd display is in portrait mode (not used yet)
 
     kInvalid_DistanceFieldEffectFlag    = 0x80,   // invalid state (for initialization)
-    
+
     kUniformScale_DistanceFieldEffectMask = kSimilarity_DistanceFieldEffectFlag |
                                             kScaleOnly_DistanceFieldEffectFlag,
     // The subset of the flags relevant to GrDistanceFieldA8TextGeoProc
diff --git a/src/gpu/effects/GrMatrixConvolutionEffect.cpp b/src/gpu/effects/GrMatrixConvolutionEffect.cpp
index 1dd96a4..21af535 100644
--- a/src/gpu/effects/GrMatrixConvolutionEffect.cpp
+++ b/src/gpu/effects/GrMatrixConvolutionEffect.cpp
@@ -76,7 +76,7 @@
             GrGLSLShaderBuilder::ShaderBlock block(fragBuilder);
             int offset = y*kWidth + x;
 
-            fragBuilder->codeAppendf("float k = %s[%d]%s;", kernel, offset / 4, 
+            fragBuilder->codeAppendf("float k = %s[%d]%s;", kernel, offset / 4,
                                      kVecSuffix[offset & 0x3]);
             SkString coord;
             coord.printf("coord + vec2(%d, %d) * %s", x, y, imgInc);
diff --git a/src/gpu/effects/GrPorterDuffXferProcessor.cpp b/src/gpu/effects/GrPorterDuffXferProcessor.cpp
index d1059c7..733e552 100644
--- a/src/gpu/effects/GrPorterDuffXferProcessor.cpp
+++ b/src/gpu/effects/GrPorterDuffXferProcessor.cpp
@@ -519,7 +519,7 @@
     SkXfermode::Mode getXfermode() const { return fXfermode; }
 
 private:
-    GrXferProcessor::OptFlags onGetOptimizations(const GrPipelineOptimizations&, bool, GrColor*, 
+    GrXferProcessor::OptFlags onGetOptimizations(const GrPipelineOptimizations&, bool, GrColor*,
                                                  const GrCaps&) const override {
         return kNone_OptFlags;
     }
@@ -755,7 +755,7 @@
         }
         blendFormula = get_lcd_blend_formula(optimizations.fCoveragePOI, fXfermode);
     } else {
-        blendFormula = get_blend_formula(optimizations.fColorPOI, optimizations.fCoveragePOI, 
+        blendFormula = get_blend_formula(optimizations.fColorPOI, optimizations.fCoveragePOI,
                                          hasMixedSamples, fXfermode);
     }
 
@@ -804,7 +804,7 @@
     if (caps.shaderCaps()->dualSourceBlendingSupport()) {
         return false;
     }
-    
+
     // When we have four channel coverage we always need to read the dst in order to correctly
     // blend. The one exception is when we are using srcover mode and we know the input color into
     // the XP.
@@ -818,7 +818,7 @@
     }
     // We fallback on the shader XP when the blend formula would use dual source blending but we
     // don't have support for it.
-    return get_blend_formula(optimizations.fColorPOI, optimizations.fCoveragePOI, hasMixedSamples, 
+    return get_blend_formula(optimizations.fColorPOI, optimizations.fCoveragePOI, hasMixedSamples,
                              fXfermode).hasSecondaryOutput();
 }
 
@@ -884,7 +884,7 @@
         }
         blendFormula = get_lcd_blend_formula(optimizations.fCoveragePOI, SkXfermode::kSrcOver_Mode);
     } else {
-        blendFormula = get_blend_formula(optimizations.fColorPOI, optimizations.fCoveragePOI, 
+        blendFormula = get_blend_formula(optimizations.fColorPOI, optimizations.fCoveragePOI,
                                          hasMixedSamples, SkXfermode::kSrcOver_Mode);
     }
 
@@ -912,7 +912,7 @@
             !caps.shaderCaps()->dstReadInShaderSupport()) {
             return false;
         }
-        return get_lcd_blend_formula(optimizations.fCoveragePOI, 
+        return get_lcd_blend_formula(optimizations.fCoveragePOI,
                                      SkXfermode::kSrcOver_Mode).hasSecondaryOutput();
     }
     // We fallback on the shader XP when the blend formula would use dual source blending but we
@@ -920,4 +920,3 @@
     return get_blend_formula(optimizations.fColorPOI, optimizations.fCoveragePOI,
                              hasMixedSamples, SkXfermode::kSrcOver_Mode).hasSecondaryOutput();
 }
-
diff --git a/src/gpu/effects/GrTextureDomain.cpp b/src/gpu/effects/GrTextureDomain.cpp
index 77ce39e..d3850a3 100644
--- a/src/gpu/effects/GrTextureDomain.cpp
+++ b/src/gpu/effects/GrTextureDomain.cpp
@@ -102,7 +102,7 @@
                 builder->appendTextureLookupAndModulate(inModulateColor, sampler,
                                                           inCoords.c_str());
                 builder->codeAppend(";");
-                
+
                 builder->codeAppend(GrGLSLShaderVar::PrecisionString(glslCaps,
                                                                      kHigh_GrSLPrecision));
                 builder->codeAppendf("float x = (%s).x;", inCoords.c_str());
diff --git a/src/gpu/effects/GrTextureDomain.h b/src/gpu/effects/GrTextureDomain.h
index 891ce10..e88f5d5 100644
--- a/src/gpu/effects/GrTextureDomain.h
+++ b/src/gpu/effects/GrTextureDomain.h
@@ -179,7 +179,7 @@
 
     SkString dumpInfo() const override {
         SkString str;
-        str.appendf("Domain: [L: %.2f, T: %.2f, R: %.2f, B: %.2f] ", 
+        str.appendf("Domain: [L: %.2f, T: %.2f, R: %.2f, B: %.2f] ",
                     fTextureDomain.domain().fLeft, fTextureDomain.domain().fTop,
                     fTextureDomain.domain().fRight, fTextureDomain.domain().fBottom);
         str.append(INHERITED::dumpInfo());
diff --git a/src/gpu/gl/GrGLAssembleInterface.cpp b/src/gpu/gl/GrGLAssembleInterface.cpp
index d1b2fb6..91aa045 100644
--- a/src/gpu/gl/GrGLAssembleInterface.cpp
+++ b/src/gpu/gl/GrGLAssembleInterface.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2014 Google Inc.
  *
diff --git a/src/gpu/gl/GrGLAssembleInterface.h b/src/gpu/gl/GrGLAssembleInterface.h
index 2a4835b..3882f71 100644
--- a/src/gpu/gl/GrGLAssembleInterface.h
+++ b/src/gpu/gl/GrGLAssembleInterface.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2014 Google Inc.
  *
diff --git a/src/gpu/gl/GrGLCaps.cpp b/src/gpu/gl/GrGLCaps.cpp
index 18e68e9..7319164 100644
--- a/src/gpu/gl/GrGLCaps.cpp
+++ b/src/gpu/gl/GrGLCaps.cpp
@@ -117,7 +117,7 @@
         fSampleLocationsSupport = version >= GR_GL_VER(3,1);
     }
 
-    // ARB_texture_rg is part of OpenGL 3.0, but mesa doesn't support GL_RED 
+    // ARB_texture_rg is part of OpenGL 3.0, but mesa doesn't support GL_RED
     // and GL_RG on FBO textures.
     if (kMesa_GrGLDriver != ctxInfo.driver()) {
         if (kGL_GrGLStandard == standard) {
@@ -245,7 +245,7 @@
     // We're assuming that on Windows Chromium we're using ANGLE.
     bool isANGLE = kANGLE_GrGLDriver == ctxInfo.driver() ||
                    kChromium_GrGLDriver == ctxInfo.driver();
-    // Angle has slow read/write pixel paths for 32bit RGBA (but fast for BGRA). 
+    // Angle has slow read/write pixel paths for 32bit RGBA (but fast for BGRA).
     fRGBA8888PixelsOpsAreSlow = isANGLE;
     // On DX9 ANGLE reading a partial FBO is slow. TODO: Check whether this is still true and
     // check DX11 ANGLE.
@@ -300,7 +300,7 @@
 
     if (ctxInfo.hasExtension("GL_EXT_shader_pixel_local_storage")) {
         #define GL_MAX_SHADER_PIXEL_LOCAL_STORAGE_FAST_SIZE_EXT 0x8F63
-        GR_GL_GetIntegerv(gli, GL_MAX_SHADER_PIXEL_LOCAL_STORAGE_FAST_SIZE_EXT, 
+        GR_GL_GetIntegerv(gli, GL_MAX_SHADER_PIXEL_LOCAL_STORAGE_FAST_SIZE_EXT,
                           &glslCaps->fPixelLocalStorageSize);
         glslCaps->fPLSPathRenderingSupport = glslCaps->fFBFetchSupport;
     }
@@ -388,7 +388,7 @@
     if (kGL_GrGLStandard == standard) {
         if (version >= GR_GL_VER(3, 0) || ctxInfo.hasExtension("GL_ARB_pixel_buffer_object")) {
             fTransferBufferType = kPBO_TransferBufferType;
-        } 
+        }
     } else {
         if (version >= GR_GL_VER(3, 0) || ctxInfo.hasExtension("GL_NV_pixel_buffer_object")) {
             fTransferBufferType = kPBO_TransferBufferType;
@@ -1092,7 +1092,7 @@
     r.appendf("Bind uniform location support: %s\n", (fBindUniformLocationSupport ? "YES" : "NO"));
     r.appendf("Rectangle texture support: %s\n", (fRectangleTextureSupport? "YES" : "NO"));
     r.appendf("Texture swizzle support: %s\n", (fTextureSwizzleSupport ? "YES" : "NO"));
-    r.appendf("BGRA to RGBA readback conversions are slow: %s\n", 
+    r.appendf("BGRA to RGBA readback conversions are slow: %s\n",
               (fRGBAToBGRAReadbackConversionsAreSlow ? "YES" : "NO"));
 
     r.append("Configs\n-------\n");
@@ -1141,7 +1141,7 @@
 }
 
 void GrGLCaps::initShaderPrecisionTable(const GrGLContextInfo& ctxInfo,
-                                        const GrGLInterface* intf, 
+                                        const GrGLInterface* intf,
                                         GrGLSLCaps* glslCaps) {
     if (kGLES_GrGLStandard == ctxInfo.standard() || ctxInfo.version() >= GR_GL_VER(4, 1) ||
         ctxInfo.hasExtension("GL_ARB_ES2_compatibility")) {
@@ -1165,7 +1165,7 @@
                             first = &glslCaps->fFloatPrecisions[s][p];
                         }
                         else if (!glslCaps->fShaderPrecisionVaries) {
-                            glslCaps->fShaderPrecisionVaries = 
+                            glslCaps->fShaderPrecisionVaries =
                                                      (*first != glslCaps->fFloatPrecisions[s][p]);
                         }
                     }
@@ -1192,7 +1192,7 @@
     // are recommended against.
     if (glslCaps->fGeometryShaderSupport) {
         for (int p = 0; p < kGrSLPrecisionCount; ++p) {
-            glslCaps->fFloatPrecisions[kGeometry_GrShaderType][p] = 
+            glslCaps->fFloatPrecisions[kGeometry_GrShaderType][p] =
                                                glslCaps->fFloatPrecisions[kVertex_GrShaderType][p];
         }
     }
@@ -1833,7 +1833,7 @@
     //      This extension GL_BGRA as an unsized internal format. However, it is written against ES
     //      2.0 and therefore doesn't define a value for GL_BGRA8 as ES 2.0 uses unsized internal
     //      formats.
-    // GL_APPLE_texture_format_BGRA8888: 
+    // GL_APPLE_texture_format_BGRA8888:
     //     ES 2.0: the extension makes BGRA an external format but not an internal format.
     //     ES 3.0: the extension explicitly states GL_BGRA8 is not a valid internal format for
     //             glTexImage (just for glTexStorage).
diff --git a/src/gpu/gl/GrGLCaps.h b/src/gpu/gl/GrGLCaps.h
index e9a2969..e2bc100 100644
--- a/src/gpu/gl/GrGLCaps.h
+++ b/src/gpu/gl/GrGLCaps.h
@@ -428,7 +428,7 @@
         /** The external format and type are to be used when uploading/downloading data using this
             config where both the CPU data and GrSurface are the same config. To get the external
             format and type when converting between configs while copying to/from memory use
-            getExternalFormat(). 
+            getExternalFormat().
             The kTexImage external format is usually the same as kOther except for kSRGBA on some
             GL contexts. */
         GrGLenum fExternalFormat[kExternalFormatUsageCnt];
diff --git a/src/gpu/gl/GrGLCreateNullInterface.cpp b/src/gpu/gl/GrGLCreateNullInterface.cpp
index 1768a26..b9a29fb 100644
--- a/src/gpu/gl/GrGLCreateNullInterface.cpp
+++ b/src/gpu/gl/GrGLCreateNullInterface.cpp
@@ -13,7 +13,7 @@
 
 // added to suppress 'no previous prototype' warning and because this code is duplicated in
 // SkNullGLContext.cpp
-namespace {      
+namespace {
 
 class BufferObj {
 public:
diff --git a/src/gpu/gl/GrGLDefines.h b/src/gpu/gl/GrGLDefines.h
index e09b1f4..2fe22bd 100644
--- a/src/gpu/gl/GrGLDefines.h
+++ b/src/gpu/gl/GrGLDefines.h
@@ -116,7 +116,7 @@
 #define GR_GL_PIXEL_PACK_BUFFER              0x88EB
 #define GR_GL_PIXEL_UNPACK_BUFFER            0x88EC
 
-#define GR_GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM 0x78EC 
+#define GR_GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM 0x78EC
 #define GR_GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM   0x78ED
 
 #define GR_GL_STREAM_DRAW                    0x88E0
@@ -168,7 +168,7 @@
 #define GR_GL_FRAMEBUFFER_SRGB               0x8DB9
 #define GR_GL_SHADER_PIXEL_LOCAL_STORAGE     0x8F64
 #define GR_GL_SAMPLE_SHADING                 0x8C36
- 
+
 /* ErrorCode */
 #define GR_GL_NO_ERROR                       0
 #define GR_GL_INVALID_ENUM                   0x0500
diff --git a/src/gpu/gl/GrGLGLSL.cpp b/src/gpu/gl/GrGLGLSL.cpp
index 60f0c27..e5aed03 100755
--- a/src/gpu/gl/GrGLGLSL.cpp
+++ b/src/gpu/gl/GrGLGLSL.cpp
@@ -50,4 +50,3 @@
             return false;
     }
 }
-
diff --git a/src/gpu/gl/GrGLGpu.cpp b/src/gpu/gl/GrGLGpu.cpp
index 6accc59..d3c4ec3 100644
--- a/src/gpu/gl/GrGLGpu.cpp
+++ b/src/gpu/gl/GrGLGpu.cpp
@@ -297,7 +297,7 @@
     GrGLSLShaderVar uPosXform("u_posXform", kVec4f_GrSLType, GrShaderVar::kUniform_TypeModifier);
     GrGLSLShaderVar uTexture("u_texture", kSampler2D_GrSLType, GrShaderVar::kUniform_TypeModifier);
     GrGLSLShaderVar vTexCoord("v_texCoord", kVec2f_GrSLType, GrShaderVar::kVaryingOut_TypeModifier);
-    
+
     SkString vshaderTxt(version);
     if (glslCaps->noperspectiveInterpolationSupport()) {
         if (const char* extension = glslCaps->noperspectiveInterpolationExtensionString()) {
@@ -313,7 +313,7 @@
     vshaderTxt.append(";");
     vTexCoord.appendDecl(glslCaps, &vshaderTxt);
     vshaderTxt.append(";");
-    
+
     vshaderTxt.append(
         "// PLS Setup Program VS\n"
         "void main() {"
@@ -2621,8 +2621,8 @@
 
 void GrGLGpu::finishDrawTarget() {
     if (fPLSHasBeenUsed) {
-        /* There is an ARM driver bug where if we use PLS, and then draw a frame which does not 
-         * use PLS, it leaves garbage all over the place. As a workaround, we use PLS in a 
+        /* There is an ARM driver bug where if we use PLS, and then draw a frame which does not
+         * use PLS, it leaves garbage all over the place. As a workaround, we use PLS in a
          * trivial way every frame. And since we use it every frame, there's never a point at which
          * it becomes safe to stop using this workaround once we start.
          */
@@ -2632,9 +2632,9 @@
         SkASSERT(!fHWPLSEnabled);
         SkASSERT(fMSAAEnabled != kYes_TriState);
         GL_CALL(Enable(GR_GL_SHADER_PIXEL_LOCAL_STORAGE));
-        this->stampRectUsingProgram(fPLSSetupProgram.fProgram, 
-                                    SkRect::MakeXYWH(-100.0f, -100.0f, 0.01f, 0.01f), 
-                                    fPLSSetupProgram.fPosXformUniform, 
+        this->stampRectUsingProgram(fPLSSetupProgram.fProgram,
+                                    SkRect::MakeXYWH(-100.0f, -100.0f, 0.01f, 0.01f),
+                                    fPLSSetupProgram.fPosXformUniform,
                                     fPLSSetupProgram.fArrayBuffer);
         GL_CALL(Disable(GR_GL_SHADER_PIXEL_LOCAL_STORAGE));
     }
@@ -2803,7 +2803,7 @@
 #endif
 }
 
-void GrGLGpu::stampRectUsingProgram(GrGLuint program, const SkRect& bounds, GrGLint posXformUniform, 
+void GrGLGpu::stampRectUsingProgram(GrGLuint program, const SkRect& bounds, GrGLint posXformUniform,
                                     GrGLuint arrayBuffer) {
     GL_CALL(UseProgram(program));
     this->fHWGeometryState.setVertexArrayID(this, 0);
@@ -2813,7 +2813,7 @@
     attribs->set(this, 0, arrayBuffer, kVec2f_GrVertexAttribType, 2 * sizeof(GrGLfloat), 0);
     attribs->disableUnusedArrays(this, 0x1);
 
-    GL_CALL(Uniform4f(posXformUniform, bounds.width(), bounds.height(), bounds.left(), 
+    GL_CALL(Uniform4f(posXformUniform, bounds.width(), bounds.height(), bounds.left(),
                       bounds.top()));
 
     GrXferProcessor::BlendInfo blendInfo;
@@ -2834,7 +2834,7 @@
 void GrGLGpu::setupPixelLocalStorage(const GrPipeline& pipeline,
                                      const GrPrimitiveProcessor& primProc) {
     fPLSHasBeenUsed = true;
-    const SkRect& bounds = 
+    const SkRect& bounds =
             static_cast<const GrPLSGeometryProcessor&>(primProc).getBounds();
     // setup pixel local storage -- this means capturing and storing the current framebuffer color
     // and initializing the winding counts to zero
@@ -2849,9 +2849,9 @@
     GrGLfloat dy0 = -2.0f * (bounds.top() - 1) / height + 1.0f;
     GrGLfloat dy1 = -2.0f * (bounds.bottom() + 1) / height + 1.0f;
     SkRect deviceBounds = SkRect::MakeXYWH(dx0, dy0, dx1 - dx0, dy1 - dy0);
-    
+
     GL_CALL(Enable(GR_GL_FETCH_PER_SAMPLE_ARM));
-    this->stampRectUsingProgram(fPLSSetupProgram.fProgram, deviceBounds, 
+    this->stampRectUsingProgram(fPLSSetupProgram.fProgram, deviceBounds,
                                 fPLSSetupProgram.fPosXformUniform, fPLSSetupProgram.fArrayBuffer);
 }
 
diff --git a/src/gpu/gl/GrGLGpu.h b/src/gpu/gl/GrGLGpu.h
index 09f0ae4..4a70fb7 100644
--- a/src/gpu/gl/GrGLGpu.h
+++ b/src/gpu/gl/GrGLGpu.h
@@ -245,7 +245,7 @@
                                       const SkIRect& srcRect,
                                       const SkIPoint& dstPoint);
 
-    void stampRectUsingProgram(GrGLuint program, const SkRect& bounds, GrGLint posXformUniform, 
+    void stampRectUsingProgram(GrGLuint program, const SkRect& bounds, GrGLint posXformUniform,
                                GrGLuint arrayBuffer);
 
     void setupPixelLocalStorage(const GrPipeline&, const GrPrimitiveProcessor&);
@@ -503,7 +503,7 @@
                                                         const GrGLBuffer* vbuffer,
                                                         const GrGLBuffer* ibuffer);
 
-        /** Variants of the above that takes GL buffer IDs. Note that 0 does not imply that a 
+        /** Variants of the above that takes GL buffer IDs. Note that 0 does not imply that a
             buffer won't be bound. The "default buffer" will be bound, which is used for client-side
             array rendering. */
         GrGLAttribArrayState* bindArrayAndBufferToDraw(GrGLGpu* gpu, GrGLuint vbufferID);
diff --git a/src/gpu/gl/GrGLGpuProgramCache.cpp b/src/gpu/gl/GrGLGpuProgramCache.cpp
index dc449f8..f6e0eaa 100644
--- a/src/gpu/gl/GrGLGpuProgramCache.cpp
+++ b/src/gpu/gl/GrGLGpuProgramCache.cpp
@@ -23,7 +23,7 @@
 typedef GrGLSLProgramDataManager::UniformHandle UniformHandle;
 
 struct GrGLGpu::ProgramCache::Entry {
-    
+
     Entry() : fProgram(nullptr), fLRUStamp(0) {}
 
     SkAutoTUnref<GrGLProgram>   fProgram;
diff --git a/src/gpu/gl/GrGLInterface.cpp b/src/gpu/gl/GrGLInterface.cpp
index 7f741f9..9cd7e68 100644
--- a/src/gpu/gl/GrGLInterface.cpp
+++ b/src/gpu/gl/GrGLInterface.cpp
@@ -570,14 +570,14 @@
                 nullptr == fFunctions.fDrawElementsInstanced) {
                 RETURN_FALSE_INTERFACE
             }
-        }    
+        }
     } else if (kGLES_GrGLStandard == fStandard) {
         if (glVer >= GR_GL_VER(3,0) || fExtensions.has("GL_EXT_draw_instanced")) {
             if (nullptr == fFunctions.fDrawArraysInstanced ||
                 nullptr == fFunctions.fDrawElementsInstanced) {
                 RETURN_FALSE_INTERFACE
             }
-        }    
+        }
     }
 
     if (kGL_GrGLStandard == fStandard) {
@@ -585,13 +585,13 @@
             if (nullptr == fFunctions.fVertexAttribDivisor) {
                 RETURN_FALSE_INTERFACE
             }
-        }    
+        }
     } else if (kGLES_GrGLStandard == fStandard) {
         if (glVer >= GR_GL_VER(3,0) || fExtensions.has("GL_EXT_instanced_arrays")) {
             if (nullptr == fFunctions.fVertexAttribDivisor) {
                 RETURN_FALSE_INTERFACE
             }
-        }    
+        }
     }
 
     if ((kGL_GrGLStandard == fStandard && glVer >= GR_GL_VER(4,3)) ||
diff --git a/src/gpu/gl/GrGLPath.cpp b/src/gpu/gl/GrGLPath.cpp
index c15a1a2..4600655 100644
--- a/src/gpu/gl/GrGLPath.cpp
+++ b/src/gpu/gl/GrGLPath.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2012 Google Inc.
  *
diff --git a/src/gpu/gl/GrGLPath.h b/src/gpu/gl/GrGLPath.h
index e8642f3..1ef1346 100644
--- a/src/gpu/gl/GrGLPath.h
+++ b/src/gpu/gl/GrGLPath.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2012 Google Inc.
  *
diff --git a/src/gpu/gl/GrGLPathRange.cpp b/src/gpu/gl/GrGLPathRange.cpp
index 4714b92..cc660ed 100644
--- a/src/gpu/gl/GrGLPathRange.cpp
+++ b/src/gpu/gl/GrGLPathRange.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2014 Google Inc.
  *
diff --git a/src/gpu/gl/GrGLPathRange.h b/src/gpu/gl/GrGLPathRange.h
index c9d4845..ed9766d 100644
--- a/src/gpu/gl/GrGLPathRange.h
+++ b/src/gpu/gl/GrGLPathRange.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2014 Google Inc.
  *
diff --git a/src/gpu/gl/GrGLProgram.cpp b/src/gpu/gl/GrGLProgram.cpp
index 8ef188b..aa828a2 100644
--- a/src/gpu/gl/GrGLProgram.cpp
+++ b/src/gpu/gl/GrGLProgram.cpp
@@ -89,7 +89,7 @@
 
     this->setFragmentData(primProc, pipeline, textureBindings);
 
-    if (primProc.getPixelLocalStorageState() != 
+    if (primProc.getPixelLocalStorageState() !=
         GrPixelLocalStorageState::kDraw_GrPixelLocalStorageState) {
         const GrXferProcessor& xp = pipeline.getXferProcessor();
         fXferProcessor->setData(fProgramDataManager, xp);
diff --git a/src/gpu/gl/GrGLTestInterface.h b/src/gpu/gl/GrGLTestInterface.h
index 6af71fe..c5f91ee 100644
--- a/src/gpu/gl/GrGLTestInterface.h
+++ b/src/gpu/gl/GrGLTestInterface.h
@@ -113,7 +113,7 @@
     virtual GrGLvoid* mapBufferRange(GrGLenum target, GrGLintptr offset, GrGLsizeiptr length, GrGLbitfield access) { return nullptr; }
     virtual GrGLvoid* mapBufferSubData(GrGLuint target, GrGLintptr offset, GrGLsizeiptr size, GrGLenum access) { return nullptr; }
     virtual GrGLvoid* mapTexSubImage2D(GrGLenum target, GrGLint level, GrGLint xoffset, GrGLint yoffset, GrGLsizei width, GrGLsizei height, GrGLenum format, GrGLenum type, GrGLenum access) { return nullptr; }
-    virtual GrGLvoid minSampleShading(GrGLfloat value) {}    
+    virtual GrGLvoid minSampleShading(GrGLfloat value) {}
     virtual GrGLvoid pixelStorei(GrGLenum pname, GrGLint param) {}
     virtual GrGLvoid popGroupMarker() {}
     virtual GrGLvoid pushGroupMarker(GrGLsizei length, const char* marker) {}
diff --git a/src/gpu/gl/GrGLUniformHandler.cpp b/src/gpu/gl/GrGLUniformHandler.cpp
index 7f6f106..94da1f1 100644
--- a/src/gpu/gl/GrGLUniformHandler.cpp
+++ b/src/gpu/gl/GrGLUniformHandler.cpp
@@ -86,5 +86,3 @@
     GrGLProgramBuilder* glPB = (GrGLProgramBuilder*) fProgramBuilder;
     return glPB->gpu();
 }
-
-
diff --git a/src/gpu/gl/GrGLUniformHandler.h b/src/gpu/gl/GrGLUniformHandler.h
index 9ef5c57..1dac8d9 100644
--- a/src/gpu/gl/GrGLUniformHandler.h
+++ b/src/gpu/gl/GrGLUniformHandler.h
@@ -55,7 +55,7 @@
 
     friend class GrGLProgramBuilder;
 
-    typedef GrGLSLUniformHandler INHERITED; 
+    typedef GrGLSLUniformHandler INHERITED;
 };
 
 #endif
diff --git a/src/gpu/gl/GrGLVaryingHandler.h b/src/gpu/gl/GrGLVaryingHandler.h
index c4e5ba4..e08a6c6 100644
--- a/src/gpu/gl/GrGLVaryingHandler.h
+++ b/src/gpu/gl/GrGLVaryingHandler.h
@@ -30,8 +30,7 @@
 
     friend class GrGLProgramBuilder;
 
-    typedef GrGLSLVaryingHandler INHERITED; 
+    typedef GrGLSLVaryingHandler INHERITED;
 };
 
 #endif
-
diff --git a/src/gpu/gl/GrGLVertexArray.cpp b/src/gpu/gl/GrGLVertexArray.cpp
index d49846d..564a91a 100644
--- a/src/gpu/gl/GrGLVertexArray.cpp
+++ b/src/gpu/gl/GrGLVertexArray.cpp
@@ -117,7 +117,7 @@
 GrGLAttribArrayState* GrGLVertexArray::bindWithIndexBuffer(GrGLGpu* gpu, GrGLuint ibufferID) {
     GrGLAttribArrayState* state = this->bind(gpu);
     if (state) {
-        if (!fIndexBufferIDIsValid || ibufferID != fIndexBufferID) {            
+        if (!fIndexBufferIDIsValid || ibufferID != fIndexBufferID) {
             GR_GL_CALL(gpu->glInterface(), BindBuffer(GR_GL_ELEMENT_ARRAY_BUFFER, ibufferID));
             fIndexBufferIDIsValid = true;
             fIndexBufferID = ibufferID;
diff --git a/src/gpu/gl/SkGLContext.cpp b/src/gpu/gl/SkGLContext.cpp
index ebe5032..1f9011f 100644
--- a/src/gpu/gl/SkGLContext.cpp
+++ b/src/gpu/gl/SkGLContext.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2013 Google Inc.
  *
@@ -177,7 +176,7 @@
     GR_GL_CALL(fGL, TexParameteri(GR_GL_TEXTURE_RECTANGLE, GR_GL_TEXTURE_MIN_FILTER,
                                   GR_GL_NEAREST));
     GR_GL_CALL(fGL, TexParameteri(GR_GL_TEXTURE_RECTANGLE, GR_GL_TEXTURE_WRAP_S,
-                                  GR_GL_CLAMP_TO_EDGE));    
+                                  GR_GL_CLAMP_TO_EDGE));
     GR_GL_CALL(fGL, TexParameteri(GR_GL_TEXTURE_RECTANGLE, GR_GL_TEXTURE_WRAP_T,
                                   GR_GL_CLAMP_TO_EDGE));
     GR_GL_CALL(fGL, TexImage2D(GR_GL_TEXTURE_RECTANGLE, 0, internalFormat, width, height, 0,
diff --git a/src/gpu/gl/SkNullGLContext.cpp b/src/gpu/gl/SkNullGLContext.cpp
index 95b0e5e..a2c5066 100644
--- a/src/gpu/gl/SkNullGLContext.cpp
+++ b/src/gpu/gl/SkNullGLContext.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/src/gpu/gl/android/GrGLCreateNativeInterface_android.cpp b/src/gpu/gl/android/GrGLCreateNativeInterface_android.cpp
index 58a9809..f594917 100644
--- a/src/gpu/gl/android/GrGLCreateNativeInterface_android.cpp
+++ b/src/gpu/gl/android/GrGLCreateNativeInterface_android.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2014 Google Inc.
  *
diff --git a/src/gpu/gl/angle/GrGLCreateANGLEInterface.cpp b/src/gpu/gl/angle/GrGLCreateANGLEInterface.cpp
index d7ba2cd..48f9d8c 100644
--- a/src/gpu/gl/angle/GrGLCreateANGLEInterface.cpp
+++ b/src/gpu/gl/angle/GrGLCreateANGLEInterface.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2012 Google Inc.
  *
diff --git a/src/gpu/gl/angle/SkANGLEGLContext.cpp b/src/gpu/gl/angle/SkANGLEGLContext.cpp
index a6b4e86..c6ea443 100644
--- a/src/gpu/gl/angle/SkANGLEGLContext.cpp
+++ b/src/gpu/gl/angle/SkANGLEGLContext.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2012 Google Inc.
  *
diff --git a/src/gpu/gl/builders/GrGLProgramBuilder.cpp b/src/gpu/gl/builders/GrGLProgramBuilder.cpp
index 30df7a7..fe617fb 100644
--- a/src/gpu/gl/builders/GrGLProgramBuilder.cpp
+++ b/src/gpu/gl/builders/GrGLProgramBuilder.cpp
@@ -239,4 +239,3 @@
                            fFragmentProcessors,
                            &fSamplerUniforms);
 }
-
diff --git a/src/gpu/gl/builders/GrGLProgramBuilder.h b/src/gpu/gl/builders/GrGLProgramBuilder.h
index f2714f3..481d63b 100644
--- a/src/gpu/gl/builders/GrGLProgramBuilder.h
+++ b/src/gpu/gl/builders/GrGLProgramBuilder.h
@@ -47,7 +47,7 @@
     bool compileAndAttachShaders(GrGLSLShaderBuilder& shader,
                                  GrGLuint programId,
                                  GrGLenum type,
-                                 SkTDArray<GrGLuint>* shaderIds); 
+                                 SkTDArray<GrGLuint>* shaderIds);
     GrGLProgram* finalize();
     void bindProgramResourceLocations(GrGLuint programID);
     bool checkLinkStatus(GrGLuint programID);
@@ -67,6 +67,6 @@
     GrGLVaryingHandler    fVaryingHandler;
     GrGLUniformHandler    fUniformHandler;
 
-    typedef GrGLSLProgramBuilder INHERITED; 
+    typedef GrGLSLProgramBuilder INHERITED;
 };
 #endif
diff --git a/src/gpu/gl/command_buffer/SkCommandBufferGLContext.cpp b/src/gpu/gl/command_buffer/SkCommandBufferGLContext.cpp
index b14debd..516c155 100644
--- a/src/gpu/gl/command_buffer/SkCommandBufferGLContext.cpp
+++ b/src/gpu/gl/command_buffer/SkCommandBufferGLContext.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2015 Google Inc.
  *
diff --git a/src/gpu/gl/debug/GrBufferObj.cpp b/src/gpu/gl/debug/GrBufferObj.cpp
index 37d4438..ee0993d 100644
--- a/src/gpu/gl/debug/GrBufferObj.cpp
+++ b/src/gpu/gl/debug/GrBufferObj.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2012 Google Inc.
  *
diff --git a/src/gpu/gl/debug/GrBufferObj.h b/src/gpu/gl/debug/GrBufferObj.h
index 65b1caf..5b5015b 100644
--- a/src/gpu/gl/debug/GrBufferObj.h
+++ b/src/gpu/gl/debug/GrBufferObj.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2012 Google Inc.
  *
diff --git a/src/gpu/gl/debug/GrFBBindableObj.h b/src/gpu/gl/debug/GrFBBindableObj.h
index e2b43a6..2d490ef 100644
--- a/src/gpu/gl/debug/GrFBBindableObj.h
+++ b/src/gpu/gl/debug/GrFBBindableObj.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2012 Google Inc.
  *
diff --git a/src/gpu/gl/debug/GrFrameBufferObj.cpp b/src/gpu/gl/debug/GrFrameBufferObj.cpp
index 7dc12ac..a8acc3d 100644
--- a/src/gpu/gl/debug/GrFrameBufferObj.cpp
+++ b/src/gpu/gl/debug/GrFrameBufferObj.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2012 Google Inc.
  *
diff --git a/src/gpu/gl/debug/GrFrameBufferObj.h b/src/gpu/gl/debug/GrFrameBufferObj.h
index 42a0eff..40e123e 100644
--- a/src/gpu/gl/debug/GrFrameBufferObj.h
+++ b/src/gpu/gl/debug/GrFrameBufferObj.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2012 Google Inc.
  *
diff --git a/src/gpu/gl/debug/GrGLCreateDebugInterface.cpp b/src/gpu/gl/debug/GrGLCreateDebugInterface.cpp
index 43fc8df..02b5cf7 100644
--- a/src/gpu/gl/debug/GrGLCreateDebugInterface.cpp
+++ b/src/gpu/gl/debug/GrGLCreateDebugInterface.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2012 Google Inc.
  *
diff --git a/src/gpu/gl/debug/GrProgramObj.cpp b/src/gpu/gl/debug/GrProgramObj.cpp
index d6cc36b..d45bd1c 100644
--- a/src/gpu/gl/debug/GrProgramObj.cpp
+++ b/src/gpu/gl/debug/GrProgramObj.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2012 Google Inc.
  *
diff --git a/src/gpu/gl/debug/GrProgramObj.h b/src/gpu/gl/debug/GrProgramObj.h
index a25341a..6e5ec65 100644
--- a/src/gpu/gl/debug/GrProgramObj.h
+++ b/src/gpu/gl/debug/GrProgramObj.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2012 Google Inc.
  *
diff --git a/src/gpu/gl/debug/GrRenderBufferObj.h b/src/gpu/gl/debug/GrRenderBufferObj.h
index 8231ef5..dae08f5 100644
--- a/src/gpu/gl/debug/GrRenderBufferObj.h
+++ b/src/gpu/gl/debug/GrRenderBufferObj.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2012 Google Inc.
  *
diff --git a/src/gpu/gl/debug/GrShaderObj.cpp b/src/gpu/gl/debug/GrShaderObj.cpp
index 8d3caa1..67cca3e 100644
--- a/src/gpu/gl/debug/GrShaderObj.cpp
+++ b/src/gpu/gl/debug/GrShaderObj.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2012 Google Inc.
  *
diff --git a/src/gpu/gl/debug/GrShaderObj.h b/src/gpu/gl/debug/GrShaderObj.h
index 977920f..871494a 100644
--- a/src/gpu/gl/debug/GrShaderObj.h
+++ b/src/gpu/gl/debug/GrShaderObj.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2012 Google Inc.
  *
diff --git a/src/gpu/gl/debug/GrTextureObj.cpp b/src/gpu/gl/debug/GrTextureObj.cpp
index 86063fb..62cb399 100644
--- a/src/gpu/gl/debug/GrTextureObj.cpp
+++ b/src/gpu/gl/debug/GrTextureObj.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2012 Google Inc.
  *
diff --git a/src/gpu/gl/debug/GrTextureObj.h b/src/gpu/gl/debug/GrTextureObj.h
index fcf851d..bc649f3 100644
--- a/src/gpu/gl/debug/GrTextureObj.h
+++ b/src/gpu/gl/debug/GrTextureObj.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2012 Google Inc.
  *
diff --git a/src/gpu/gl/debug/GrTextureUnitObj.cpp b/src/gpu/gl/debug/GrTextureUnitObj.cpp
index 316dcec..8de0b09 100644
--- a/src/gpu/gl/debug/GrTextureUnitObj.cpp
+++ b/src/gpu/gl/debug/GrTextureUnitObj.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2012 Google Inc.
  *
diff --git a/src/gpu/gl/debug/SkDebugGLContext.cpp b/src/gpu/gl/debug/SkDebugGLContext.cpp
index 531e6c3..ecb27db 100644
--- a/src/gpu/gl/debug/SkDebugGLContext.cpp
+++ b/src/gpu/gl/debug/SkDebugGLContext.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2012 Google Inc.
  *
diff --git a/src/gpu/gl/debug/SkDebugGLContext.h b/src/gpu/gl/debug/SkDebugGLContext.h
index 113a254..1ea7b62 100644
--- a/src/gpu/gl/debug/SkDebugGLContext.h
+++ b/src/gpu/gl/debug/SkDebugGLContext.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2012 Google Inc.
  *
diff --git a/src/gpu/gl/egl/GrGLCreateNativeInterface_egl.cpp b/src/gpu/gl/egl/GrGLCreateNativeInterface_egl.cpp
index fef4f02..4f42782 100644
--- a/src/gpu/gl/egl/GrGLCreateNativeInterface_egl.cpp
+++ b/src/gpu/gl/egl/GrGLCreateNativeInterface_egl.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2014 Google Inc.
  *
diff --git a/src/gpu/gl/egl/SkCreatePlatformGLContext_egl.cpp b/src/gpu/gl/egl/SkCreatePlatformGLContext_egl.cpp
index 86e2ebc..1644254 100644
--- a/src/gpu/gl/egl/SkCreatePlatformGLContext_egl.cpp
+++ b/src/gpu/gl/egl/SkCreatePlatformGLContext_egl.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
@@ -332,4 +331,3 @@
     }
     return ctx;
 }
-
diff --git a/src/gpu/gl/glx/SkCreatePlatformGLContext_glx.cpp b/src/gpu/gl/glx/SkCreatePlatformGLContext_glx.cpp
index b91262f..d0bd1de 100644
--- a/src/gpu/gl/glx/SkCreatePlatformGLContext_glx.cpp
+++ b/src/gpu/gl/glx/SkCreatePlatformGLContext_glx.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/src/gpu/gl/iOS/GrGLCreateNativeInterface_iOS.cpp b/src/gpu/gl/iOS/GrGLCreateNativeInterface_iOS.cpp
index c85f05c..c7eb46b 100644
--- a/src/gpu/gl/iOS/GrGLCreateNativeInterface_iOS.cpp
+++ b/src/gpu/gl/iOS/GrGLCreateNativeInterface_iOS.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2014 Google Inc.
  *
@@ -39,7 +38,7 @@
     GrGLFuncPtr getProc(const char name[]) const {
         return (GrGLFuncPtr) dlsym(fLoader.handle(), name);
     }
-    
+
 private:
     GLLoader fLoader;
 };
diff --git a/src/gpu/gl/mac/GrGLCreateNativeInterface_mac.cpp b/src/gpu/gl/mac/GrGLCreateNativeInterface_mac.cpp
index 83e5593..c843d0e 100644
--- a/src/gpu/gl/mac/GrGLCreateNativeInterface_mac.cpp
+++ b/src/gpu/gl/mac/GrGLCreateNativeInterface_mac.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/src/gpu/gl/mac/SkCreatePlatformGLContext_mac.cpp b/src/gpu/gl/mac/SkCreatePlatformGLContext_mac.cpp
index c6eb34b..0ca62ad 100644
--- a/src/gpu/gl/mac/SkCreatePlatformGLContext_mac.cpp
+++ b/src/gpu/gl/mac/SkCreatePlatformGLContext_mac.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/src/gpu/gl/mesa/GrGLCreateMesaInterface.cpp b/src/gpu/gl/mesa/GrGLCreateMesaInterface.cpp
index 734c1fe..6a04d4f 100644
--- a/src/gpu/gl/mesa/GrGLCreateMesaInterface.cpp
+++ b/src/gpu/gl/mesa/GrGLCreateMesaInterface.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/src/gpu/gl/mesa/SkMesaGLContext.cpp b/src/gpu/gl/mesa/SkMesaGLContext.cpp
index 8b3666c..eeccbd6 100644
--- a/src/gpu/gl/mesa/SkMesaGLContext.cpp
+++ b/src/gpu/gl/mesa/SkMesaGLContext.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/src/gpu/gl/mesa/SkMesaGLContext.h b/src/gpu/gl/mesa/SkMesaGLContext.h
index a9c77a8..7f700b6 100644
--- a/src/gpu/gl/mesa/SkMesaGLContext.h
+++ b/src/gpu/gl/mesa/SkMesaGLContext.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/src/gpu/gl/mesa/osmesa_wrapper.h b/src/gpu/gl/mesa/osmesa_wrapper.h
index 70de993..4bb70a4 100644
--- a/src/gpu/gl/mesa/osmesa_wrapper.h
+++ b/src/gpu/gl/mesa/osmesa_wrapper.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2013 Google Inc.
  *
diff --git a/src/gpu/gl/nacl/SkCreatePlatformGLContext_nacl.cpp b/src/gpu/gl/nacl/SkCreatePlatformGLContext_nacl.cpp
index e064aec..855f0dc 100644
--- a/src/gpu/gl/nacl/SkCreatePlatformGLContext_nacl.cpp
+++ b/src/gpu/gl/nacl/SkCreatePlatformGLContext_nacl.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2012 Google Inc.
  *
@@ -11,5 +10,3 @@
     SkASSERT(!shareContext);
     return nullptr;
 }
-
-
diff --git a/src/gpu/gl/win/GrGLCreateNativeInterface_win.cpp b/src/gpu/gl/win/GrGLCreateNativeInterface_win.cpp
index b3766d9..1eae5d7 100644
--- a/src/gpu/gl/win/GrGLCreateNativeInterface_win.cpp
+++ b/src/gpu/gl/win/GrGLCreateNativeInterface_win.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/src/gpu/gl/win/SkCreatePlatformGLContext_win.cpp b/src/gpu/gl/win/SkCreatePlatformGLContext_win.cpp
index da13ee7..e99aa15 100644
--- a/src/gpu/gl/win/SkCreatePlatformGLContext_win.cpp
+++ b/src/gpu/gl/win/SkCreatePlatformGLContext_win.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
@@ -199,4 +198,3 @@
     }
     return ctx;
 }
-
diff --git a/src/gpu/glsl/GrGLSLBlend.cpp b/src/gpu/glsl/GrGLSLBlend.cpp
index 6937977..d2c3640 100644
--- a/src/gpu/glsl/GrGLSLBlend.cpp
+++ b/src/gpu/glsl/GrGLSLBlend.cpp
@@ -479,4 +479,3 @@
     }
     fsBuilder->codeAppend(";");
 }
-
diff --git a/src/gpu/glsl/GrGLSLCaps.cpp b/src/gpu/glsl/GrGLSLCaps.cpp
index f142741..c2404c6 100755
--- a/src/gpu/glsl/GrGLSLCaps.cpp
+++ b/src/gpu/glsl/GrGLSLCaps.cpp
@@ -94,4 +94,3 @@
 
 void GrGLSLCaps::onApplyOptionsOverrides(const GrContextOptions& options) {
 }
-
diff --git a/src/gpu/glsl/GrGLSLCaps.h b/src/gpu/glsl/GrGLSLCaps.h
index f54c61d..7b0868e 100755
--- a/src/gpu/glsl/GrGLSLCaps.h
+++ b/src/gpu/glsl/GrGLSLCaps.h
@@ -15,7 +15,7 @@
 
 class GrGLSLCaps : public GrShaderCaps {
 public:
-    
+
 
     /**
     * Indicates how GLSL must interact with advanced blend equations. The KHR extension requires
@@ -77,7 +77,7 @@
     bool mustEnableSpecificAdvBlendEqs() const {
         return fAdvBlendEqInteraction == kSpecificEnables_AdvBlendEqInteraction;
     }
-    
+
     bool mustDeclareFragmentShaderOutput() const {
         return fGLSLGeneration > k110_GrGLSLGeneration;
     }
@@ -173,7 +173,7 @@
     void onApplyOptionsOverrides(const GrContextOptions& options) override;
 
     GrGLSLGeneration fGLSLGeneration;
-    
+
     bool fDropsTileOnZeroDivide : 1;
     bool fFBFetchSupport : 1;
     bool fFBFetchNeedsCustomOutput : 1;
diff --git a/src/gpu/glsl/GrGLSLFragmentShaderBuilder.cpp b/src/gpu/glsl/GrGLSLFragmentShaderBuilder.cpp
index 166e474..a52b1a6 100644
--- a/src/gpu/glsl/GrGLSLFragmentShaderBuilder.cpp
+++ b/src/gpu/glsl/GrGLSLFragmentShaderBuilder.cpp
@@ -176,7 +176,7 @@
             // The Adreno compiler seems to be very touchy about access to "gl_FragCoord".
             // Accessing glFragCoord.zw can cause a program to fail to link. Additionally,
             // depending on the surrounding code, accessing .xy with a uniform involved can
-            // do the same thing. Copying gl_FragCoord.xy into a temp vec2 beforehand 
+            // do the same thing. Copying gl_FragCoord.xy into a temp vec2 beforehand
             // (and only accessing .xy) seems to "fix" things.
             const char* precision = glslCaps->usesPrecisionModifiers() ? "highp " : "";
             this->codePrependf("\t%svec4 %s = vec4(%s.x, %s - %s.y, 1.0, 1.0);\n",
@@ -264,7 +264,7 @@
         return fbFetchColorName;
     } else {
         return kDstTextureColorName;
-    } 
+    }
 }
 
 void GrGLSLFragmentShaderBuilder::enableAdvancedBlendEquationIfNeeded(GrBlendEquation equation) {
@@ -322,7 +322,7 @@
     va_list argp;
     va_start(argp, fmt);
     inputs().appendVAList(fmt, argp);
-    va_end(argp);    
+    va_end(argp);
 }
 
 const char* GrGLSLFragmentShaderBuilder::getSecondaryColorOutputName() const {
@@ -392,4 +392,3 @@
     int removeAt = fMangleString.findLastOf('_');
     fMangleString.remove(removeAt, fMangleString.size() - removeAt);
 }
-
diff --git a/src/gpu/glsl/GrGLSLGeometryShaderBuilder.cpp b/src/gpu/glsl/GrGLSLGeometryShaderBuilder.cpp
index 25e9f9e..eddd69f 100644
--- a/src/gpu/glsl/GrGLSLGeometryShaderBuilder.cpp
+++ b/src/gpu/glsl/GrGLSLGeometryShaderBuilder.cpp
@@ -17,4 +17,3 @@
 void GrGLSLGeometryBuilder::onFinalize() {
     fProgramBuilder->varyingHandler()->getGeomDecls(&this->inputs(), &this->outputs());
 }
-
diff --git a/src/gpu/glsl/GrGLSLPLSPathRendering.h b/src/gpu/glsl/GrGLSLPLSPathRendering.h
index 9a1625d..60889e9 100644
--- a/src/gpu/glsl/GrGLSLPLSPathRendering.h
+++ b/src/gpu/glsl/GrGLSLPLSPathRendering.h
@@ -10,4 +10,3 @@
                                  "    layout(rgba8i) ivec4 windings;\n"\
                                  "    layout(rgba8) vec4 dstColor;\n"\
                                  "} pls;\n"
-
diff --git a/src/gpu/glsl/GrGLSLProgramBuilder.cpp b/src/gpu/glsl/GrGLSLProgramBuilder.cpp
index 83b50ad..512d9d1 100644
--- a/src/gpu/glsl/GrGLSLProgramBuilder.cpp
+++ b/src/gpu/glsl/GrGLSLProgramBuilder.cpp
@@ -69,9 +69,9 @@
     this->emitAndInstallFragProcs(0, this->pipeline().numColorFragmentProcessors(), inputColor);
     this->emitAndInstallFragProcs(this->pipeline().numColorFragmentProcessors(), numProcs,
                                   inputCoverage);
-    if (primProc.getPixelLocalStorageState() != 
+    if (primProc.getPixelLocalStorageState() !=
         GrPixelLocalStorageState::kDraw_GrPixelLocalStorageState) {
-        this->emitAndInstallXferProc(this->pipeline().getXferProcessor(), *inputColor, 
+        this->emitAndInstallXferProc(this->pipeline().getXferProcessor(), *inputColor,
                                      *inputCoverage, this->pipeline().ignoresCoverage(),
                                      primProc.getPixelLocalStorageState());
         this->emitFSOutputSwizzle(this->pipeline().getXferProcessor().hasSecondaryOutput());
diff --git a/src/gpu/glsl/GrGLSLProgramBuilder.h b/src/gpu/glsl/GrGLSLProgramBuilder.h
index 67d1eb6..952db7e 100644
--- a/src/gpu/glsl/GrGLSLProgramBuilder.h
+++ b/src/gpu/glsl/GrGLSLProgramBuilder.h
@@ -53,7 +53,7 @@
     // Used to add a uniform in the vertex shader for transforming into normalized device space.
     void addRTAdjustmentUniform(GrSLPrecision precision, const char* name, const char** outName);
     const char* rtAdjustment() const { return "rtAdjustment"; }
- 
+
     // Used to add a uniform for the RenderTarget height (used for frag position) without mangling
     // the name of the uniform inside of a stage.
     void addRTHeightUniform(const char* name, const char** outName);
diff --git a/src/gpu/glsl/GrGLSLProgramDataManager.cpp b/src/gpu/glsl/GrGLSLProgramDataManager.cpp
index 8d3d3ce..0c98e08 100644
--- a/src/gpu/glsl/GrGLSLProgramDataManager.cpp
+++ b/src/gpu/glsl/GrGLSLProgramDataManager.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2016 Google Inc.
  *
@@ -24,4 +23,3 @@
     };
     this->setMatrix3f(u, mt);
 }
-
diff --git a/src/gpu/glsl/GrGLSLShaderBuilder.cpp b/src/gpu/glsl/GrGLSLShaderBuilder.cpp
index 30bf86d..93b9f8a 100644
--- a/src/gpu/glsl/GrGLSLShaderBuilder.cpp
+++ b/src/gpu/glsl/GrGLSLShaderBuilder.cpp
@@ -174,4 +174,3 @@
 
     fFinalized = true;
 }
-
diff --git a/src/gpu/glsl/GrGLSLUniformHandler.h b/src/gpu/glsl/GrGLSLUniformHandler.h
index 14835fb..a2f7053 100644
--- a/src/gpu/glsl/GrGLSLUniformHandler.h
+++ b/src/gpu/glsl/GrGLSLUniformHandler.h
@@ -70,4 +70,3 @@
 };
 
 #endif
-
diff --git a/src/gpu/glsl/GrGLSLVarying.cpp b/src/gpu/glsl/GrGLSLVarying.cpp
index d124e77..f3b0405 100644
--- a/src/gpu/glsl/GrGLSLVarying.cpp
+++ b/src/gpu/glsl/GrGLSLVarying.cpp
@@ -157,4 +157,3 @@
     this->appendDecls(fFragInputs, inputDecls);
     this->appendDecls(fFragOutputs, outputDecls);
 }
-
diff --git a/src/gpu/glsl/GrGLSLVertexShaderBuilder.cpp b/src/gpu/glsl/GrGLSLVertexShaderBuilder.cpp
index 005b272..4931e0f 100644
--- a/src/gpu/glsl/GrGLSLVertexShaderBuilder.cpp
+++ b/src/gpu/glsl/GrGLSLVertexShaderBuilder.cpp
@@ -53,4 +53,3 @@
 void GrGLSLVertexBuilder::onFinalize() {
     fProgramBuilder->varyingHandler()->getVertexDecls(&this->inputs(), &this->outputs());
 }
-
diff --git a/src/gpu/glsl/GrGLSLVertexShaderBuilder.h b/src/gpu/glsl/GrGLSLVertexShaderBuilder.h
index 7c624ce..af8d10c 100644
--- a/src/gpu/glsl/GrGLSLVertexShaderBuilder.h
+++ b/src/gpu/glsl/GrGLSLVertexShaderBuilder.h
@@ -23,7 +23,7 @@
     void transformToNormalizedDeviceSpace(const GrShaderVar& posVar);
 private:
     void onFinalize() override;
-    
+
     const char* fRtAdjustName;
 
     friend class GrGLProgramBuilder;
diff --git a/src/gpu/text/GrAtlasTextContext.cpp b/src/gpu/text/GrAtlasTextContext.cpp
index 1a77810..ec9e40c 100644
--- a/src/gpu/text/GrAtlasTextContext.cpp
+++ b/src/gpu/text/GrAtlasTextContext.cpp
@@ -397,7 +397,7 @@
     int yInt = (random->nextU() % kMaxTrans) * yPos;
     SkScalar x = SkIntToScalar(xInt);
     SkScalar y = SkIntToScalar(yInt);
-    
+
     // right now we don't handle textblobs, nor do we handle drawPosText.  Since we only
     // intend to test the batch with this unit test, that is okay.
     SkAutoTUnref<GrAtlasTextBlob> blob(
diff --git a/src/gpu/text/GrFontScaler.cpp b/src/gpu/text/GrFontScaler.cpp
index c841202..0fb768e 100644
--- a/src/gpu/text/GrFontScaler.cpp
+++ b/src/gpu/text/GrFontScaler.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2010 Google Inc.
  *
diff --git a/src/gpu/text/GrFontScaler.h b/src/gpu/text/GrFontScaler.h
index e42c7a1..f6b6770 100644
--- a/src/gpu/text/GrFontScaler.h
+++ b/src/gpu/text/GrFontScaler.h
@@ -17,37 +17,37 @@
 class SkPath;
 
 /*
- *  Wrapper class to turn a font cache descriptor into a key 
+ *  Wrapper class to turn a font cache descriptor into a key
  *  for GrFontScaler-related lookups
  */
 class GrFontDescKey : public SkRefCnt {
 public:
     explicit GrFontDescKey(const SkDescriptor& desc) : fDesc(desc), fHash(desc.getChecksum()) {}
-    
+
     uint32_t getHash() const { return fHash; }
 
     bool operator==(const GrFontDescKey& rh) const {
         return fHash == rh.fHash && fDesc.getDesc()->equals(*rh.fDesc.getDesc());
     }
-    
+
 private:
     SkAutoDescriptor fDesc;
     uint32_t fHash;
-    
+
     typedef SkRefCnt INHERITED;
 };
 
 /*
  *  This is Gr's interface to the host platform's font scaler.
  *
- *  The client is responsible for instantiating this. The instance is created 
+ *  The client is responsible for instantiating this. The instance is created
  *  for a specific font+size+matrix.
  */
 class GrFontScaler : public SkRefCnt {
 public:
     explicit GrFontScaler(SkGlyphCache* strike);
     virtual ~GrFontScaler();
-    
+
     const GrFontDescKey* getKey();
     GrMaskFormat getMaskFormat() const;
     GrMaskFormat getPackedGlyphMaskFormat(const SkGlyph&) const;
@@ -58,11 +58,11 @@
     bool getPackedGlyphDFImage(const SkGlyph&, int width, int height, void* image);
     const SkPath* getGlyphPath(const SkGlyph&);
     const SkGlyph& grToSkGlyph(GrGlyph::PackedID);
-    
+
 private:
     SkGlyphCache*  fStrike;
     GrFontDescKey* fKey;
-    
+
     typedef SkRefCnt INHERITED;
 };
 
diff --git a/src/gpu/vk/GrVkBackendContext.cpp b/src/gpu/vk/GrVkBackendContext.cpp
index 6aae6a2..1ca56e8 100644
--- a/src/gpu/vk/GrVkBackendContext.cpp
+++ b/src/gpu/vk/GrVkBackendContext.cpp
@@ -167,7 +167,7 @@
     // query to get the physical device properties
     VkPhysicalDeviceFeatures deviceFeatures;
     vkGetPhysicalDeviceFeatures(physDev, &deviceFeatures);
-    // this looks like it would slow things down, 
+    // this looks like it would slow things down,
     // and we can't depend on it on all platforms
     deviceFeatures.robustBufferAccess = VK_FALSE;
 
@@ -225,7 +225,7 @@
     ctx->fExtensions = extensionFlags;
     ctx->fFeatures = featureFlags;
     ctx->fInterface.reset(GrVkCreateInterface(inst, device, extensionFlags));
-  
+
     return ctx;
 }
 
diff --git a/src/gpu/vk/GrVkBuffer.cpp b/src/gpu/vk/GrVkBuffer.cpp
index 24a593a..6791328 100644
--- a/src/gpu/vk/GrVkBuffer.cpp
+++ b/src/gpu/vk/GrVkBuffer.cpp
@@ -195,4 +195,3 @@
              || kCopyRead_Type == fDesc.fType || kCopyWrite_Type == fDesc.fType
              || kUniform_Type == fDesc.fType);
 }
-
diff --git a/src/gpu/vk/GrVkCaps.cpp b/src/gpu/vk/GrVkCaps.cpp
index 41bf1ad..8f46408 100644
--- a/src/gpu/vk/GrVkCaps.cpp
+++ b/src/gpu/vk/GrVkCaps.cpp
@@ -280,4 +280,3 @@
     SET_CONFIG_CAN_STENCIL(gS8);
     SET_CONFIG_CAN_STENCIL(gD24S8);
 }
-
diff --git a/src/gpu/vk/GrVkCaps.h b/src/gpu/vk/GrVkCaps.h
index 2137251..5834b15 100644
--- a/src/gpu/vk/GrVkCaps.h
+++ b/src/gpu/vk/GrVkCaps.h
@@ -19,7 +19,7 @@
  * Stores some capabilities of a Vk backend.
  */
 class GrVkCaps : public GrCaps {
-public:    
+public:
     typedef GrVkStencilAttachment::Format StencilFormat;
 
     /**
diff --git a/src/gpu/vk/GrVkCommandBuffer.cpp b/src/gpu/vk/GrVkCommandBuffer.cpp
index ea2b1be..cd97337 100644
--- a/src/gpu/vk/GrVkCommandBuffer.cpp
+++ b/src/gpu/vk/GrVkCommandBuffer.cpp
@@ -63,7 +63,7 @@
     for (int i = 0; i < fTrackedResources.count(); ++i) {
         fTrackedResources[i]->unref(gpu);
     }
-    
+
     // Destroy the fence, if any
     if (VK_NULL_HANDLE != fSubmitFence) {
         GR_VK_CALL(gpu->vkInterface(), DestroyFence(gpu->device(), fSubmitFence, nullptr));
@@ -126,7 +126,7 @@
 
 void GrVkCommandBuffer::submitToQueue(const GrVkGpu* gpu, VkQueue queue, GrVkGpu::SyncQueue sync) {
     SkASSERT(!fIsActive);
-    
+
     VkResult err;
     VkFenceCreateInfo fenceInfo;
     memset(&fenceInfo, 0, sizeof(VkFenceCreateInfo));
@@ -148,7 +148,7 @@
     GR_VK_CALL_ERRCHECK(gpu->vkInterface(), QueueSubmit(queue, 1, &submitInfo, fSubmitFence));
 
     if (GrVkGpu::kForce_SyncQueue == sync) {
-        err = GR_VK_CALL(gpu->vkInterface(), 
+        err = GR_VK_CALL(gpu->vkInterface(),
                          WaitForFences(gpu->device(), 1, &fSubmitFence, true, UINT64_MAX));
         if (VK_TIMEOUT == err) {
             SkDebugf("Fence failed to signal: %d\n", err);
diff --git a/src/gpu/vk/GrVkCommandBuffer.h b/src/gpu/vk/GrVkCommandBuffer.h
index c3d2978..99a3563 100644
--- a/src/gpu/vk/GrVkCommandBuffer.h
+++ b/src/gpu/vk/GrVkCommandBuffer.h
@@ -160,7 +160,7 @@
               uint32_t instanceCount,
               uint32_t firstVertex,
               uint32_t firstInstance) const;
-    
+
     // Add ref-counted resource that will be tracked and released when this
     // command buffer finishes execution
     void addResource(const GrVkResource* resource) {
@@ -213,4 +213,3 @@
 
 
 #endif
-
diff --git a/src/gpu/vk/GrVkDescriptorPool.cpp b/src/gpu/vk/GrVkDescriptorPool.cpp
index 43ffe95..b89145a 100644
--- a/src/gpu/vk/GrVkDescriptorPool.cpp
+++ b/src/gpu/vk/GrVkDescriptorPool.cpp
@@ -13,7 +13,7 @@
 
 GrVkDescriptorPool::GrVkDescriptorPool(const GrVkGpu* gpu, VkDescriptorType type, uint32_t count)
     : INHERITED()
-    , fType (type) 
+    , fType (type)
     , fCount(count) {
     VkDescriptorPoolSize poolSize;
     memset(&poolSize, 0, sizeof(VkDescriptorPoolSize));
diff --git a/src/gpu/vk/GrVkDescriptorPool.h b/src/gpu/vk/GrVkDescriptorPool.h
index 19f778c..bb5697c 100644
--- a/src/gpu/vk/GrVkDescriptorPool.h
+++ b/src/gpu/vk/GrVkDescriptorPool.h
@@ -15,7 +15,7 @@
 class GrVkGpu;
 
 /**
- * We require that all descriptor sets are of a single descriptor type. We also use a pool to only 
+ * We require that all descriptor sets are of a single descriptor type. We also use a pool to only
  * make one type of descriptor set. Thus a single VkDescriptorPool will only allocated space for
  * for one type of descriptor.
  */
diff --git a/src/gpu/vk/GrVkExtensions.cpp b/src/gpu/vk/GrVkExtensions.cpp
index 73cd809..2bec235 100644
--- a/src/gpu/vk/GrVkExtensions.cpp
+++ b/src/gpu/vk/GrVkExtensions.cpp
@@ -91,7 +91,7 @@
     layerCount = fInstanceLayerStrings->count();
     for (uint32_t layerIndex = 0; layerIndex < layerCount; ++layerIndex) {
         uint32_t extensionCount = 0;
-        res = EnumerateInstanceExtensionProperties((*fInstanceLayerStrings)[layerIndex].c_str(), 
+        res = EnumerateInstanceExtensionProperties((*fInstanceLayerStrings)[layerIndex].c_str(),
                                                    &extensionCount, nullptr);
         if (VK_SUCCESS != res) {
             return false;
@@ -107,7 +107,7 @@
             if (specVersion >= extensions[i].specVersion &&
                 find_string(*fInstanceExtensionStrings, extensions[i].extensionName) < 0) {
                 fInstanceExtensionStrings->push_back() = extensions[i].extensionName;
-                SkTQSort(&fInstanceExtensionStrings->front(), &fInstanceExtensionStrings->back(), 
+                SkTQSort(&fInstanceExtensionStrings->front(), &fInstanceExtensionStrings->back(),
                          cmp);
             }
         }
diff --git a/src/gpu/vk/GrVkExtensions.h b/src/gpu/vk/GrVkExtensions.h
index 93b258e..6c395fd 100644
--- a/src/gpu/vk/GrVkExtensions.h
+++ b/src/gpu/vk/GrVkExtensions.h
@@ -13,7 +13,7 @@
 #include "vk/GrVkDefines.h"
 
 /**
- * This helper queries the Vulkan driver for available extensions and layers, remembers them, 
+ * This helper queries the Vulkan driver for available extensions and layers, remembers them,
  * and can be queried. It supports queries for both instance and device extensions and layers.
  */
 class SK_API GrVkExtensions {
@@ -22,7 +22,7 @@
                      , fDeviceExtensionStrings(new SkTArray<SkString>)
                      , fInstanceLayerStrings(new SkTArray<SkString>)
                      , fDeviceLayerStrings(new SkTArray<SkString>) {}
-     
+
     bool initInstance(uint32_t specVersion);
     bool initDevice(uint32_t specVersion, VkInstance, VkPhysicalDevice);
 
diff --git a/src/gpu/vk/GrVkFramebuffer.cpp b/src/gpu/vk/GrVkFramebuffer.cpp
index d79895c..49c6e41 100644
--- a/src/gpu/vk/GrVkFramebuffer.cpp
+++ b/src/gpu/vk/GrVkFramebuffer.cpp
@@ -20,7 +20,7 @@
     // At the very least we need a renderPass and a colorAttachment
     SkASSERT(renderPass);
     SkASSERT(colorAttachment);
-    
+
     VkImageView attachments[3];
     attachments[0] = colorAttachment->imageView();
     int numAttachments = 1;
@@ -30,7 +30,7 @@
     if (stencilAttachment) {
         attachments[numAttachments++] = stencilAttachment->imageView();
     }
-    
+
     VkFramebufferCreateInfo createInfo;
     memset(&createInfo, 0, sizeof(VkFramebufferCreateInfo));
     createInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
@@ -42,7 +42,7 @@
     createInfo.width = width;
     createInfo.height = height;
     createInfo.layers = 1;
-    
+
     VkFramebuffer framebuffer;
     VkResult err = GR_VK_CALL(gpu->vkInterface(), CreateFramebuffer(gpu->device(),
                                                                     &createInfo,
@@ -59,5 +59,3 @@
     SkASSERT(fFramebuffer);
     GR_VK_CALL(gpu->vkInterface(), DestroyFramebuffer(gpu->device(), fFramebuffer, nullptr));
 }
-
-
diff --git a/src/gpu/vk/GrVkGpu.cpp b/src/gpu/vk/GrVkGpu.cpp
index 496f38c..de1e905 100644
--- a/src/gpu/vk/GrVkGpu.cpp
+++ b/src/gpu/vk/GrVkGpu.cpp
@@ -79,7 +79,7 @@
 
 ////////////////////////////////////////////////////////////////////////////////
 
-GrVkGpu::GrVkGpu(GrContext* context, const GrContextOptions& options, 
+GrVkGpu::GrVkGpu(GrContext* context, const GrContextOptions& options,
                  const GrVkBackendContext* backendCtx)
     : INHERITED(context)
     , fVkInstance(backendCtx->fInstance)
@@ -122,7 +122,7 @@
         VK_COMMAND_POOL_CREATE_TRANSIENT_BIT,       // CmdPoolCreateFlags
         backendCtx->fQueueFamilyIndex,              // queueFamilyIndex
     };
-    GR_VK_CALL_ERRCHECK(this->vkInterface(), CreateCommandPool(fDevice, &cmdPoolInfo, nullptr, 
+    GR_VK_CALL_ERRCHECK(this->vkInterface(), CreateCommandPool(fDevice, &cmdPoolInfo, nullptr,
                                                                &fCmdPool));
 
     // must call this after creating the CommandPool
@@ -141,7 +141,7 @@
     SkDEBUGCODE(VkResult res =) VK_CALL(QueueWaitIdle(fQueue));
     // VK_ERROR_DEVICE_LOST is acceptable when tearing down (see 4.2.4 in spec)
     SkASSERT(VK_SUCCESS == res || VK_ERROR_DEVICE_LOST == res);
- 
+
     // must call this just before we destroy the VkDevice
     fResourceProvider.destroyResources();
 
@@ -208,7 +208,7 @@
     }
 
     if (dstSurface->config() != srcConfig) {
-        // TODO: This should fall back to drawing or copying to change config of dstSurface to 
+        // TODO: This should fall back to drawing or copying to change config of dstSurface to
         // match that of srcConfig.
         return false;
     }
@@ -319,7 +319,7 @@
         VkDeviceSize offset = texTop*layout.rowPitch + left*bpp;
         VkDeviceSize size = height*layout.rowPitch;
         void* mapPtr;
-        err = GR_VK_CALL(interface, MapMemory(fDevice, tex->textureMemory(), offset, size, 0, 
+        err = GR_VK_CALL(interface, MapMemory(fDevice, tex->textureMemory(), offset, size, 0,
                                                 &mapPtr));
         if (err) {
             return false;
@@ -556,11 +556,11 @@
 
     GrVkTexture* texture = nullptr;
     if (renderTarget) {
-        texture = GrVkTextureRenderTarget::CreateWrappedTextureRenderTarget(this, surfDesc, 
+        texture = GrVkTextureRenderTarget::CreateWrappedTextureRenderTarget(this, surfDesc,
                                                                             lifeCycle, format,
                                                                             info);
     } else {
-        texture = GrVkTexture::CreateWrappedTexture(this, surfDesc, lifeCycle, format, 
+        texture = GrVkTexture::CreateWrappedTexture(this, surfDesc, lifeCycle, format,
                                                     info);
     }
     if (!texture) {
@@ -572,7 +572,7 @@
 
 GrRenderTarget* GrVkGpu::onWrapBackendRenderTarget(const GrBackendRenderTargetDesc& wrapDesc,
                                                    GrWrapOwnership ownership) {
-    
+
     const GrVkTextureInfo* info =
         reinterpret_cast<const GrVkTextureInfo*>(wrapDesc.fRenderTargetHandle);
     if (VK_NULL_HANDLE == info->fImage ||
@@ -594,7 +594,7 @@
     desc.fOrigin = resolve_origin(wrapDesc.fOrigin);
 
     GrVkRenderTarget* tgt = GrVkRenderTarget::CreateWrappedRenderTarget(this, desc,
-                                                                        lifeCycle, 
+                                                                        lifeCycle,
                                                                         info);
     if (tgt && wrapDesc.fStencilBits) {
         if (!createStencilAttachmentForRenderTarget(tgt, desc.fWidth, desc.fHeight)) {
@@ -975,7 +975,7 @@
 
     VkClearColorValue vkColor;
     GrColorToRGBAFloat(color, vkColor.float32);
-   
+
     GrVkRenderTarget* vkRT = static_cast<GrVkRenderTarget*>(target);
     VkImageLayout origDstLayout = vkRT->currentLayout();
 
@@ -1045,7 +1045,7 @@
     subRange.baseArrayLayer = 0;
     subRange.layerCount = 1;
 
-    // In the future we may not actually be doing this type of clear at all. If we are inside a 
+    // In the future we may not actually be doing this type of clear at all. If we are inside a
     // render pass or doing a non full clear then we will use CmdClearColorAttachment. The more
     // common use case will be clearing an attachment at the start of a render pass, in which case
     // we will use the clear load ops.
@@ -1091,7 +1091,7 @@
     // the cache is flushed since it is only being written to.
     VkAccessFlags srcAccessMask = GrVkMemory::LayoutToSrcAccessMask(origDstLayout);;
     VkAccessFlags dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
-    
+
     dstTex->setImageLayout(this,
                            VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
                            srcAccessMask,
@@ -1099,7 +1099,7 @@
                            srcStageMask,
                            dstStageMask,
                            false);
-    
+
     srcStageMask = GrVkMemory::LayoutToPipelineStageFlags(origSrcLayout);
     dstStageMask = VK_PIPELINE_STAGE_TRANSFER_BIT;
 
@@ -1225,7 +1225,7 @@
                         dstStageMask,
                         false);
 
-    GrVkTransferBuffer* transferBuffer = 
+    GrVkTransferBuffer* transferBuffer =
         static_cast<GrVkTransferBuffer*>(this->createBuffer(kXferGpuToCpu_GrBufferType,
                                                             rowBytes * height,
                                                             kStream_GrAccessPattern));
@@ -1441,4 +1441,3 @@
 #endif
 #endif
 }
-
diff --git a/src/gpu/vk/GrVkGpu.h b/src/gpu/vk/GrVkGpu.h
index 91a67b6..99c03bd 100644
--- a/src/gpu/vk/GrVkGpu.h
+++ b/src/gpu/vk/GrVkGpu.h
@@ -106,7 +106,7 @@
                                VkPipelineStageFlags dstStageMask,
                                bool byRegion,
                                VkImageMemoryBarrier* barrier) const;
-    
+
     shaderc_compiler_t shadercCompiler() const {
         return fCompiler;
     }
@@ -169,7 +169,7 @@
     void bindGeometry(const GrPrimitiveProcessor&, const GrNonInstancedMesh&);
 
     // Ends and submits the current command buffer to the queue and then creates a new command
-    // buffer and begins it. If sync is set to kForce_SyncQueue, the function will wait for all 
+    // buffer and begins it. If sync is set to kForce_SyncQueue, the function will wait for all
     // work in the queue to finish before returning.
     void submitCommandBuffer(SyncQueue sync);
 
diff --git a/src/gpu/vk/GrVkImage.cpp b/src/gpu/vk/GrVkImage.cpp
index 729c627..f91c6a9 100644
--- a/src/gpu/vk/GrVkImage.cpp
+++ b/src/gpu/vk/GrVkImage.cpp
@@ -24,7 +24,7 @@
     if (newLayout == fCurrentLayout) {
         return;
     }
-    
+
     VkImageMemoryBarrier imageMemoryBarrier = {
         VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,   // sType
         NULL,                                     // pNext
@@ -44,7 +44,7 @@
     fCurrentLayout = newLayout;
 }
 
-const GrVkImage::Resource* GrVkImage::CreateResource(const GrVkGpu* gpu, 
+const GrVkImage::Resource* GrVkImage::CreateResource(const GrVkGpu* gpu,
                                                      const ImageDesc& imageDesc) {
     VkImage image = 0;
     VkDeviceMemory alloc;
diff --git a/src/gpu/vk/GrVkImageView.cpp b/src/gpu/vk/GrVkImageView.cpp
index 70e6106..1ab2475 100644
--- a/src/gpu/vk/GrVkImageView.cpp
+++ b/src/gpu/vk/GrVkImageView.cpp
@@ -12,7 +12,7 @@
 const GrVkImageView* GrVkImageView::Create(GrVkGpu* gpu, VkImage image, VkFormat format,
                                            Type viewType) {
     VkImageView imageView;
-    
+
     // Create the VkImageView
     VkImageViewCreateInfo viewInfo = {
         VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,               // sType
@@ -32,18 +32,16 @@
         viewInfo.components.a = VK_COMPONENT_SWIZZLE_ZERO;
         viewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
     }
-    
+
     VkResult err = GR_VK_CALL(gpu->vkInterface(), CreateImageView(gpu->device(), &viewInfo,
                                                                   nullptr, &imageView));
     if (err) {
         return nullptr;
     }
-    
+
     return new GrVkImageView(imageView);
 }
 
 void GrVkImageView::freeGPUData(const GrVkGpu* gpu) const {
     GR_VK_CALL(gpu->vkInterface(), DestroyImageView(gpu->device(), fImageView, nullptr));
 }
-
-
diff --git a/src/gpu/vk/GrVkImageView.h b/src/gpu/vk/GrVkImageView.h
index ab988c0..f700808 100644
--- a/src/gpu/vk/GrVkImageView.h
+++ b/src/gpu/vk/GrVkImageView.h
@@ -20,7 +20,7 @@
         kColor_Type,
         kStencil_Type
     };
-    
+
     static const GrVkImageView* Create(GrVkGpu* gpu, VkImage image, VkFormat format, Type viewType);
 
     VkImageView imageView() const { return fImageView; }
diff --git a/src/gpu/vk/GrVkIndexBuffer.cpp b/src/gpu/vk/GrVkIndexBuffer.cpp
index 6cec856..7342e93 100644
--- a/src/gpu/vk/GrVkIndexBuffer.cpp
+++ b/src/gpu/vk/GrVkIndexBuffer.cpp
@@ -72,4 +72,3 @@
     SkASSERT(!this->wasDestroyed());
     return static_cast<GrVkGpu*>(this->getGpu());
 }
-
diff --git a/src/gpu/vk/GrVkInterface.cpp b/src/gpu/vk/GrVkInterface.cpp
index bc6b87e..37e3570 100644
--- a/src/gpu/vk/GrVkInterface.cpp
+++ b/src/gpu/vk/GrVkInterface.cpp
@@ -16,7 +16,7 @@
 #define GET_PROC_LOCAL(inst, F) PFN_vk ## F F = (PFN_vk ## F) vkGetInstanceProcAddr(inst, "vk" #F)
 #define GET_DEV_PROC(F) functions->f ## F = (PFN_vk ## F) vkGetDeviceProcAddr(device, "vk" #F)
 
-const GrVkInterface* GrVkCreateInterface(VkInstance instance, VkDevice device, 
+const GrVkInterface* GrVkCreateInterface(VkInstance instance, VkDevice device,
                                          uint32_t extensionFlags) {
 
     GrVkInterface* interface = new GrVkInterface();
@@ -373,4 +373,3 @@
     }
     return true;
 }
-
diff --git a/src/gpu/vk/GrVkMemory.cpp b/src/gpu/vk/GrVkMemory.cpp
index 7e8c577..30a3806 100644
--- a/src/gpu/vk/GrVkMemory.cpp
+++ b/src/gpu/vk/GrVkMemory.cpp
@@ -154,4 +154,3 @@
     }
     return flags;
 }
-
diff --git a/src/gpu/vk/GrVkPipeline.cpp b/src/gpu/vk/GrVkPipeline.cpp
index 794acb0..53e9dba 100644
--- a/src/gpu/vk/GrVkPipeline.cpp
+++ b/src/gpu/vk/GrVkPipeline.cpp
@@ -203,7 +203,7 @@
     SkASSERT(viewportInfo->viewportCount == viewportInfo->scissorCount);
 }
 
-void setup_multisample_state(const GrPipeline& pipeline, 
+void setup_multisample_state(const GrPipeline& pipeline,
                              const GrPrimitiveProcessor& primProc,
                              const GrCaps* caps,
                              VkPipelineMultisampleStateCreateInfo* multisampleInfo) {
@@ -469,8 +469,8 @@
 
     VkPipeline vkPipeline;
     VkResult err = GR_VK_CALL(gpu->vkInterface(), CreateGraphicsPipelines(gpu->device(),
-                                                                          cache, 1, 
-                                                                          &pipelineCreateInfo, 
+                                                                          cache, 1,
+                                                                          &pipelineCreateInfo,
                                                                           nullptr, &vkPipeline));
     if (err) {
         return nullptr;
@@ -493,7 +493,7 @@
     if (scissorState.enabled() &&
         !scissorState.rect().contains(0, 0, target.width(), target.height())) {
         // This all assumes the scissorState has previously been clipped to the device space render
-        // target. 
+        // target.
         scissor.offset.x = scissorState.rect().fLeft;
         scissor.extent.width = scissorState.rect().width();
         if (kTopLeft_GrSurfaceOrigin == target.origin()) {
diff --git a/src/gpu/vk/GrVkPipeline.h b/src/gpu/vk/GrVkPipeline.h
index be422e1..0e818ed 100644
--- a/src/gpu/vk/GrVkPipeline.h
+++ b/src/gpu/vk/GrVkPipeline.h
@@ -23,7 +23,7 @@
 
 class GrVkPipeline : public GrVkResource {
 public:
-    static GrVkPipeline* Create(GrVkGpu* gpu, 
+    static GrVkPipeline* Create(GrVkGpu* gpu,
                                 const GrPipeline& pipeline,
                                 const GrPrimitiveProcessor& primProc,
                                 VkPipelineShaderStageCreateInfo* shaderStageInfo,
diff --git a/src/gpu/vk/GrVkPipelineState.cpp b/src/gpu/vk/GrVkPipelineState.cpp
index 996ce4a..dacd66b 100644
--- a/src/gpu/vk/GrVkPipelineState.cpp
+++ b/src/gpu/vk/GrVkPipelineState.cpp
@@ -489,7 +489,7 @@
 
     b.add32(primitiveType);
 
-    // Set key length 
+    // Set key length
     int keyLength = key->count();
     SkASSERT(0 == (keyLength % 4));
     *reinterpret_cast<uint32_t*>(key->begin()) = SkToU32(keyLength);
diff --git a/src/gpu/vk/GrVkPipelineStateBuilder.cpp b/src/gpu/vk/GrVkPipelineStateBuilder.cpp
index f4bb566..871e94e 100644
--- a/src/gpu/vk/GrVkPipelineStateBuilder.cpp
+++ b/src/gpu/vk/GrVkPipelineStateBuilder.cpp
@@ -36,9 +36,9 @@
                                                    const GrPipeline& pipeline,
                                                    const GrPrimitiveProcessor& primProc,
                                                    const GrVkProgramDesc& desc)
-    : INHERITED(pipeline, primProc, desc) 
+    : INHERITED(pipeline, primProc, desc)
     , fGpu(gpu)
-    , fVaryingHandler(this) 
+    , fVaryingHandler(this)
     , fUniformHandler(this) {
 }
 
diff --git a/src/gpu/vk/GrVkPipelineStateDataManager.cpp b/src/gpu/vk/GrVkPipelineStateDataManager.cpp
index 76ad483..86066ab 100644
--- a/src/gpu/vk/GrVkPipelineStateDataManager.cpp
+++ b/src/gpu/vk/GrVkPipelineStateDataManager.cpp
@@ -15,7 +15,7 @@
                                                            uint32_t fragmentUniformSize)
     : fVertexUniformSize(vertexUniformSize)
     , fFragmentUniformSize(fragmentUniformSize)
-    , fVertexUniformsDirty(false) 
+    , fVertexUniformsDirty(false)
     , fFragmentUniformsDirty(false) {
     fVertexUniformData.reset(vertexUniformSize);
     fFragmentUniformData.reset(fragmentUniformSize);
@@ -279,4 +279,3 @@
         fFragmentUniformsDirty = false;
     }
 }
-
diff --git a/src/gpu/vk/GrVkRenderPass.cpp b/src/gpu/vk/GrVkRenderPass.cpp
index 3538776..1aedab4 100644
--- a/src/gpu/vk/GrVkRenderPass.cpp
+++ b/src/gpu/vk/GrVkRenderPass.cpp
@@ -187,7 +187,7 @@
     beginInfo->clearValueCount = 0;
     beginInfo->pClearValues = nullptr;
 
-    // Currently just assuming no secondary cmd buffers. This value will need to be update if we 
+    // Currently just assuming no secondary cmd buffers. This value will need to be update if we
     // have them.
     *contents = VK_SUBPASS_CONTENTS_INLINE;
 }
@@ -235,4 +235,3 @@
         b->add32(fAttachmentsDescriptor.fStencil.fSamples);
     }
 }
-
diff --git a/src/gpu/vk/GrVkRenderTarget.cpp b/src/gpu/vk/GrVkRenderTarget.cpp
index c04cca3..486f2f5 100644
--- a/src/gpu/vk/GrVkRenderTarget.cpp
+++ b/src/gpu/vk/GrVkRenderTarget.cpp
@@ -120,7 +120,7 @@
                          const GrVkImage::Resource* imageResource) {
     VkFormat pixelFormat;
     GrPixelConfigToVkFormat(desc.fConfig, &pixelFormat);
-    
+
     VkImage colorImage;
 
     // create msaa surface if necessary
@@ -211,7 +211,7 @@
     SkASSERT(VK_NULL_HANDLE != info->fImage);
     SkASSERT(VK_NULL_HANDLE != info->fAlloc || kAdopted_LifeCycle != lifeCycle);
 
-    GrVkImage::Resource::Flags flags = (VK_IMAGE_TILING_LINEAR == info->fImageTiling) 
+    GrVkImage::Resource::Flags flags = (VK_IMAGE_TILING_LINEAR == info->fImageTiling)
                                      ? Resource::kLinearTiling_Flag : Resource::kNo_Flags;
 
     const GrVkImage::Resource* imageResource;
@@ -410,4 +410,3 @@
     SkASSERT(!this->wasDestroyed());
     return static_cast<GrVkGpu*>(this->getGpu());
 }
-
diff --git a/src/gpu/vk/GrVkRenderTarget.h b/src/gpu/vk/GrVkRenderTarget.h
index 21c5788..f8c08e6 100644
--- a/src/gpu/vk/GrVkRenderTarget.h
+++ b/src/gpu/vk/GrVkRenderTarget.h
@@ -63,7 +63,7 @@
     // Returns the total number of attachments
     void getAttachmentsDescriptor(GrVkRenderPass::AttachmentsDescriptor* desc,
                                   GrVkRenderPass::AttachmentFlags* flags) const;
-    
+
     void addResources(GrVkCommandBuffer& commandBuffer) const;
 
 protected:
@@ -130,7 +130,7 @@
     const GrVkImage::Resource* fMSAAImageResource;
     const GrVkImageView*       fResolveAttachmentView;
     int                        fColorValuesPerPixel;
-    
+
     // This is a cached pointer to a simple render pass. The render target should unref it
     // once it is done with it.
     const GrVkRenderPass*      fCachedSimpleRenderPass;
diff --git a/src/gpu/vk/GrVkResource.h b/src/gpu/vk/GrVkResource.h
index 8387c4e..6c08f4e 100644
--- a/src/gpu/vk/GrVkResource.h
+++ b/src/gpu/vk/GrVkResource.h
@@ -80,7 +80,7 @@
         return false;
     }
 
-    /** Increment the reference count. 
+    /** Increment the reference count.
         Must be balanced by a call to unref() or unrefAndFreeResources().
      */
     void ref() const {
@@ -122,13 +122,13 @@
 #endif
 
 private:
-    /** Must be implemented by any subclasses. 
-     *  Deletes any Vk data associated with this resource 
+    /** Must be implemented by any subclasses.
+     *  Deletes any Vk data associated with this resource
      */
     virtual void freeGPUData(const GrVkGpu* gpu) const = 0;
 
-    /** Must be overridden by subclasses that themselves store GrVkResources. 
-     *  Will unrefAndAbandon those resources without deleting the underlying Vk data 
+    /** Must be overridden by subclasses that themselves store GrVkResources.
+     *  Will unrefAndAbandon those resources without deleting the underlying Vk data
      */
     virtual void abandonSubResources() const {}
 
diff --git a/src/gpu/vk/GrVkResourceProvider.cpp b/src/gpu/vk/GrVkResourceProvider.cpp
index 8bb3911..7def55d 100644
--- a/src/gpu/vk/GrVkResourceProvider.cpp
+++ b/src/gpu/vk/GrVkResourceProvider.cpp
@@ -61,9 +61,9 @@
 
 
 // To create framebuffers, we first need to create a simple RenderPass that is
-// only used for framebuffer creation. When we actually render we will create 
+// only used for framebuffer creation. When we actually render we will create
 // RenderPasses as needed that are compatible with the framebuffer.
-const GrVkRenderPass* 
+const GrVkRenderPass*
 GrVkResourceProvider::findOrCreateCompatibleRenderPass(const GrVkRenderTarget& target) {
     for (int i = 0; i < fSimpleRenderPasses.count(); ++i) {
         GrVkRenderPass* renderPass = fSimpleRenderPasses[i];
diff --git a/src/gpu/vk/GrVkSampler.cpp b/src/gpu/vk/GrVkSampler.cpp
index 9938340..fb8daca 100644
--- a/src/gpu/vk/GrVkSampler.cpp
+++ b/src/gpu/vk/GrVkSampler.cpp
@@ -74,7 +74,7 @@
 uint8_t GrVkSampler::GenerateKey(const GrTextureParams& params) {
 
     uint8_t key = params.filterMode();
-    
+
     SkASSERT(params.filterMode() <= 3);
     key |= (params.getTileModeX() << 2);
 
@@ -83,4 +83,3 @@
 
     return key;
 }
-
diff --git a/src/gpu/vk/GrVkSampler.h b/src/gpu/vk/GrVkSampler.h
index 3e08745..ec97751 100644
--- a/src/gpu/vk/GrVkSampler.h
+++ b/src/gpu/vk/GrVkSampler.h
@@ -40,4 +40,3 @@
 };
 
 #endif
-
diff --git a/src/gpu/vk/GrVkStencilAttachment.cpp b/src/gpu/vk/GrVkStencilAttachment.cpp
index a632700..97597fc 100644
--- a/src/gpu/vk/GrVkStencilAttachment.cpp
+++ b/src/gpu/vk/GrVkStencilAttachment.cpp
@@ -62,7 +62,7 @@
                                                                imageResource, imageView);
     imageResource->unref(gpu);
     imageView->unref(gpu);
-    
+
     return stencil;
 }
 
diff --git a/src/gpu/vk/GrVkTexture.cpp b/src/gpu/vk/GrVkTexture.cpp
index 058dfbd..b297b60 100644
--- a/src/gpu/vk/GrVkTexture.cpp
+++ b/src/gpu/vk/GrVkTexture.cpp
@@ -76,7 +76,7 @@
 
 GrVkTexture* GrVkTexture::CreateWrappedTexture(GrVkGpu* gpu, const GrSurfaceDesc& desc,
                                                GrGpuResource::LifeCycle lifeCycle,
-                                               VkFormat format, 
+                                               VkFormat format,
                                                const GrVkTextureInfo* info) {
     SkASSERT(info);
     // Wrapped textures require both image and allocation (because they can be mapped)
@@ -145,4 +145,3 @@
     SkASSERT(!this->wasDestroyed());
     return static_cast<GrVkGpu*>(this->getGpu());
 }
-
diff --git a/src/gpu/vk/GrVkTexture.h b/src/gpu/vk/GrVkTexture.h
index 48ec730..7c476ca 100644
--- a/src/gpu/vk/GrVkTexture.h
+++ b/src/gpu/vk/GrVkTexture.h
@@ -21,7 +21,7 @@
     static GrVkTexture* CreateNewTexture(GrVkGpu*, const GrSurfaceDesc&,
                                          GrGpuResource::LifeCycle,
                                          const GrVkImage::ImageDesc&);
-                                          
+
     static GrVkTexture* CreateWrappedTexture(GrVkGpu*, const GrSurfaceDesc&,
                                              GrGpuResource::LifeCycle,
                                              VkFormat, const GrVkTextureInfo*);
@@ -47,7 +47,7 @@
                                GrGpuResource::LifeCycle, VkFormat,
                                const GrVkImage::Resource* texImpl);
 
-    GrVkGpu* getVkGpu() const; 
+    GrVkGpu* getVkGpu() const;
 
     void onAbandon() override;
     void onRelease() override;
diff --git a/src/gpu/vk/GrVkTextureRenderTarget.cpp b/src/gpu/vk/GrVkTextureRenderTarget.cpp
index 43e213f..bd028d2 100644
--- a/src/gpu/vk/GrVkTextureRenderTarget.cpp
+++ b/src/gpu/vk/GrVkTextureRenderTarget.cpp
@@ -129,7 +129,7 @@
         return nullptr;
     }
 
-    GrVkTextureRenderTarget* trt = GrVkTextureRenderTarget::Create(gpu, desc, lifeCycle, 
+    GrVkTextureRenderTarget* trt = GrVkTextureRenderTarget::Create(gpu, desc, lifeCycle,
                                                                    imageDesc.fFormat, imageRsrc);
     // Create() will increment the refCount of the image resource if it succeeds
     imageRsrc->unref(gpu);
@@ -141,7 +141,7 @@
 GrVkTextureRenderTarget::CreateWrappedTextureRenderTarget(GrVkGpu* gpu,
                                                           const GrSurfaceDesc& desc,
                                                           GrGpuResource::LifeCycle lifeCycle,
-                                                          VkFormat format, 
+                                                          VkFormat format,
                                                           const GrVkTextureInfo* info) {
     SkASSERT(info);
     // Wrapped textures require both image and allocation (because they can be mapped)
@@ -170,4 +170,3 @@
 
     return trt;
 }
-
diff --git a/src/gpu/vk/GrVkTextureRenderTarget.h b/src/gpu/vk/GrVkTextureRenderTarget.h
index a7aff00..f2580eb 100644
--- a/src/gpu/vk/GrVkTextureRenderTarget.h
+++ b/src/gpu/vk/GrVkTextureRenderTarget.h
@@ -28,7 +28,7 @@
                                                                  GrGpuResource::LifeCycle,
                                                                  const GrVkImage::ImageDesc&);
 
-    static GrVkTextureRenderTarget* CreateWrappedTextureRenderTarget(GrVkGpu*, 
+    static GrVkTextureRenderTarget* CreateWrappedTextureRenderTarget(GrVkGpu*,
                                                                      const GrSurfaceDesc&,
                                                                      GrGpuResource::LifeCycle,
                                                                      VkFormat,
diff --git a/src/gpu/vk/GrVkUniformHandler.cpp b/src/gpu/vk/GrVkUniformHandler.cpp
index ac6da19..fac955d 100644
--- a/src/gpu/vk/GrVkUniformHandler.cpp
+++ b/src/gpu/vk/GrVkUniformHandler.cpp
@@ -201,4 +201,3 @@
         out->appendf("%s\n};\n", uniformsString.c_str());
     }
 }
-
diff --git a/src/gpu/vk/GrVkUtil.cpp b/src/gpu/vk/GrVkUtil.cpp
index ec3ec23..5ab7966 100644
--- a/src/gpu/vk/GrVkUtil.cpp
+++ b/src/gpu/vk/GrVkUtil.cpp
@@ -91,4 +91,3 @@
             return false;
     }
 }
-
diff --git a/src/gpu/vk/GrVkUtil.h b/src/gpu/vk/GrVkUtil.h
index a3064c8..4e03c75 100644
--- a/src/gpu/vk/GrVkUtil.h
+++ b/src/gpu/vk/GrVkUtil.h
@@ -33,4 +33,3 @@
 bool GrSampleCountToVkSampleCount(uint32_t samples, VkSampleCountFlagBits* vkSamples);
 
 #endif
-
diff --git a/src/gpu/vk/GrVkVertexBuffer.cpp b/src/gpu/vk/GrVkVertexBuffer.cpp
index 1d3eadb..c2c2df0 100644
--- a/src/gpu/vk/GrVkVertexBuffer.cpp
+++ b/src/gpu/vk/GrVkVertexBuffer.cpp
@@ -71,4 +71,3 @@
     SkASSERT(!this->wasDestroyed());
     return static_cast<GrVkGpu*>(this->getGpu());
 }
-
diff --git a/src/images/SkGIFMovie.cpp b/src/images/SkGIFMovie.cpp
index 1031079..00df53d 100644
--- a/src/images/SkGIFMovie.cpp
+++ b/src/images/SkGIFMovie.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/images/SkImageEncoder_Factory.cpp b/src/images/SkImageEncoder_Factory.cpp
index 8d4cc65..887ce55 100644
--- a/src/images/SkImageEncoder_Factory.cpp
+++ b/src/images/SkImageEncoder_Factory.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2009 The Android Open Source Project
  *
diff --git a/src/images/SkJPEGWriteUtility.h b/src/images/SkJPEGWriteUtility.h
index c844652..91d07a3 100644
--- a/src/images/SkJPEGWriteUtility.h
+++ b/src/images/SkJPEGWriteUtility.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2010 The Android Open Source Project
  *
diff --git a/src/images/SkKTXImageEncoder.cpp b/src/images/SkKTXImageEncoder.cpp
index 79f0293..5dc347a 100644
--- a/src/images/SkKTXImageEncoder.cpp
+++ b/src/images/SkKTXImageEncoder.cpp
@@ -59,7 +59,7 @@
         if (SkKTXFile::is_ktx(bytes)) {
             return stream->write(bytes, data->size());
         }
-        
+
         // If it's neither a KTX nor a PKM, then we need to
         // get at the actual pixels, so fall through and decompress...
     }
diff --git a/src/images/SkMovie.cpp b/src/images/SkMovie.cpp
index 9749011..bf94f28 100644
--- a/src/images/SkMovie.cpp
+++ b/src/images/SkMovie.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/src/images/SkMovie_FactoryDefault.cpp b/src/images/SkMovie_FactoryDefault.cpp
index ef8ddda..84ae78a 100644
--- a/src/images/SkMovie_FactoryDefault.cpp
+++ b/src/images/SkMovie_FactoryDefault.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/images/transform_scanline.h b/src/images/transform_scanline.h
index 36efdd8..4baf6b6 100644
--- a/src/images/transform_scanline.h
+++ b/src/images/transform_scanline.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2012 The Android Open Source Project
  *
diff --git a/src/pdf/SkDeflate.cpp b/src/pdf/SkDeflate.cpp
index 3ae0d46..ebf203a 100644
--- a/src/pdf/SkDeflate.cpp
+++ b/src/pdf/SkDeflate.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2010 The Android Open Source Project
  *
diff --git a/src/pdf/SkJpegInfo.cpp b/src/pdf/SkJpegInfo.cpp
index 3c52a10..5e5ec79 100644
--- a/src/pdf/SkJpegInfo.cpp
+++ b/src/pdf/SkJpegInfo.cpp
@@ -117,5 +117,3 @@
     }
     return true;
 }
-
-
diff --git a/src/pdf/SkJpegInfo.h b/src/pdf/SkJpegInfo.h
index 1b03e45..39de994 100644
--- a/src/pdf/SkJpegInfo.h
+++ b/src/pdf/SkJpegInfo.h
@@ -19,7 +19,7 @@
     } fType;
 };
 
-/** Returns true iff the data seems to be a valid JFIF JPEG image.  
+/** Returns true iff the data seems to be a valid JFIF JPEG image.
     If so and if info is not nullptr, populate info.
 
     JPEG/JFIF References:
diff --git a/src/pdf/SkPDFDevice.cpp b/src/pdf/SkPDFDevice.cpp
index 4adc4da..df6a8f8 100644
--- a/src/pdf/SkPDFDevice.cpp
+++ b/src/pdf/SkPDFDevice.cpp
@@ -1988,7 +1988,7 @@
 
 static sk_sp<SkImage> color_filter(const SkImageBitmap& imageBitmap,
                                    SkColorFilter* colorFilter) {
-    auto surface = 
+    auto surface =
         SkSurface::MakeRaster(SkImageInfo::MakeN32Premul(imageBitmap.dimensions()));
     SkASSERT(surface);
     SkCanvas* canvas = surface->getCanvas();
diff --git a/src/pdf/SkPDFFont.h b/src/pdf/SkPDFFont.h
index e410e3e..397cc7f 100644
--- a/src/pdf/SkPDFFont.h
+++ b/src/pdf/SkPDFFont.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
@@ -70,7 +69,7 @@
     reference to each instantiated class.
 */
 class SkPDFFont : public SkPDFDict {
-    
+
 public:
     virtual ~SkPDFFont();
 
diff --git a/src/pdf/SkPDFFontImpl.h b/src/pdf/SkPDFFontImpl.h
index 71f78bd..0dfa191 100644
--- a/src/pdf/SkPDFFontImpl.h
+++ b/src/pdf/SkPDFFontImpl.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/src/pdf/SkPDFFormXObject.cpp b/src/pdf/SkPDFFormXObject.cpp
index 39d75a5..99617e9 100644
--- a/src/pdf/SkPDFFormXObject.cpp
+++ b/src/pdf/SkPDFFormXObject.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2010 The Android Open Source Project
  *
diff --git a/src/pdf/SkPDFFormXObject.h b/src/pdf/SkPDFFormXObject.h
index 32d9e40..5dda459 100644
--- a/src/pdf/SkPDFFormXObject.h
+++ b/src/pdf/SkPDFFormXObject.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2010 The Android Open Source Project
  *
diff --git a/src/pdf/SkPDFGraphicState.h b/src/pdf/SkPDFGraphicState.h
index 31848e8..06f1e11 100644
--- a/src/pdf/SkPDFGraphicState.h
+++ b/src/pdf/SkPDFGraphicState.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2010 The Android Open Source Project
  *
@@ -23,7 +22,7 @@
     once, we want to canonicalize them.
 */
 class SkPDFGraphicState final : public SkPDFObject {
-    
+
 public:
     enum SkPDFSMaskMode {
         kAlpha_SMaskMode,
diff --git a/src/pdf/SkPDFShader.cpp b/src/pdf/SkPDFShader.cpp
index ef47cf7..5dd94e2 100644
--- a/src/pdf/SkPDFShader.cpp
+++ b/src/pdf/SkPDFShader.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/src/pdf/SkPDFShader.h b/src/pdf/SkPDFShader.h
index 921d574..5a5aee4 100644
--- a/src/pdf/SkPDFShader.h
+++ b/src/pdf/SkPDFShader.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/src/pdf/SkPDFStream.cpp b/src/pdf/SkPDFStream.cpp
index 5b7cd57..10fc77b 100644
--- a/src/pdf/SkPDFStream.cpp
+++ b/src/pdf/SkPDFStream.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2010 Google Inc.
  *
diff --git a/src/pdf/SkPDFStream.h b/src/pdf/SkPDFStream.h
index e1fe539..cf8cda5 100644
--- a/src/pdf/SkPDFStream.h
+++ b/src/pdf/SkPDFStream.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2010 Google Inc.
  *
@@ -23,7 +22,7 @@
     SkObjRef).
 */
 class SkPDFStream : public SkPDFDict {
-    
+
 public:
     /** Create a PDF stream. A Length entry is automatically added to the
      *  stream dictionary.
diff --git a/src/pdf/SkPDFUtils.h b/src/pdf/SkPDFUtils.h
index 0dec800..3340089 100644
--- a/src/pdf/SkPDFUtils.h
+++ b/src/pdf/SkPDFUtils.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/src/ports/SkDebug_win.cpp b/src/ports/SkDebug_win.cpp
index 6e05766..b0c5725 100644
--- a/src/ports/SkDebug_win.cpp
+++ b/src/ports/SkDebug_win.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2010 Google Inc.
  *
diff --git a/src/ports/SkFontHost_mac.cpp b/src/ports/SkFontHost_mac.cpp
index 0755b64..53d5610 100644
--- a/src/ports/SkFontHost_mac.cpp
+++ b/src/ports/SkFontHost_mac.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/ports/SkImageEncoder_WIC.cpp b/src/ports/SkImageEncoder_WIC.cpp
index 7911a40..5523ea2 100644
--- a/src/ports/SkImageEncoder_WIC.cpp
+++ b/src/ports/SkImageEncoder_WIC.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
@@ -50,7 +49,7 @@
 class SkImageEncoder_WIC : public SkImageEncoder {
 public:
     SkImageEncoder_WIC(Type t) : fType(t) {}
-    
+
     // DO NOT USE this constructor.  This exists only so SkForceLinking can
     // link the WIC image encoder.
     SkImageEncoder_WIC() {}
diff --git a/src/ports/SkImageEncoder_none.cpp b/src/ports/SkImageEncoder_none.cpp
index 33e07ac..c7d4b92 100644
--- a/src/ports/SkImageEncoder_none.cpp
+++ b/src/ports/SkImageEncoder_none.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/ports/SkImageGeneratorCG.cpp b/src/ports/SkImageGeneratorCG.cpp
index 9be0b8c..c54eebf 100644
--- a/src/ports/SkImageGeneratorCG.cpp
+++ b/src/ports/SkImageGeneratorCG.cpp
@@ -33,7 +33,7 @@
     if (!imageSrc) {
         return nullptr;
     }
-    
+
     // Make sure we call CFRelease to free the imageSrc.  Since CFRelease actually takes
     // a const void*, we must cast the imageSrc to a const void*.
     SkAutoTCallVProc<const void, CFRelease> autoImageSrc(imageSrc);
@@ -42,7 +42,7 @@
     if (!properties) {
         return nullptr;
     }
-    
+
     CFNumberRef widthRef = (CFNumberRef) (CFDictionaryGetValue(properties,
             kCGImagePropertyPixelWidth));
     CFNumberRef heightRef = (CFNumberRef) (CFDictionaryGetValue(properties,
@@ -58,7 +58,7 @@
             !CFNumberGetValue(heightRef, kCFNumberIntType, &height)) {
         return nullptr;
     }
-    
+
     SkAlphaType alphaType = hasAlpha ? kPremul_SkAlphaType : kOpaque_SkAlphaType;
     SkImageInfo info = SkImageInfo::Make(width, height, kN32_SkColorType, alphaType);
 
@@ -85,7 +85,7 @@
         // FIXME: Support other colorTypes.
         return false;
     }
-    
+
     switch (info.alphaType()) {
         case kOpaque_SkAlphaType:
             if (kOpaque_SkAlphaType != this->getInfo().alphaType()) {
@@ -97,7 +97,7 @@
         default:
             return false;
     }
-    
+
     CGImageRef image = CGImageSourceCreateImageAtIndex((CGImageSourceRef) fImageSrc.get(), 0,
             nullptr);
     if (!image) {
diff --git a/src/ports/SkImageGeneratorCG.h b/src/ports/SkImageGeneratorCG.h
index cdfeae0..53102ea 100644
--- a/src/ports/SkImageGeneratorCG.h
+++ b/src/ports/SkImageGeneratorCG.h
@@ -36,7 +36,7 @@
 
     SkAutoTCallVProc<const void, CFRelease> fImageSrc;
     SkAutoTUnref<SkData>                    fData;
-    
+
     typedef SkImageGenerator INHERITED;
 };
 
diff --git a/src/ports/SkImageGeneratorWIC.h b/src/ports/SkImageGeneratorWIC.h
index 1366333..6f661ef 100644
--- a/src/ports/SkImageGeneratorWIC.h
+++ b/src/ports/SkImageGeneratorWIC.h
@@ -56,7 +56,7 @@
     SkTScopedComPtr<IWICImagingFactory> fImagingFactory;
     SkTScopedComPtr<IWICBitmapSource>   fImageSource;
     SkAutoTUnref<SkData>                fData;
-    
+
     typedef SkImageGenerator INHERITED;
 };
 
diff --git a/src/ports/SkOSEnvironment.cpp b/src/ports/SkOSEnvironment.cpp
index ab98e39..ec2cc36 100644
--- a/src/ports/SkOSEnvironment.cpp
+++ b/src/ports/SkOSEnvironment.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2015 Google Inc.
  *
@@ -17,4 +16,3 @@
     setenv(key, value, 1);
 #endif
 }
-
diff --git a/src/ports/SkOSEnvironment.h b/src/ports/SkOSEnvironment.h
index fdbce7a..33cbd3e 100644
--- a/src/ports/SkOSEnvironment.h
+++ b/src/ports/SkOSEnvironment.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2015 Google Inc.
  *
@@ -12,4 +11,3 @@
 void sk_setenv(const char* key, const char* value);
 
 #endif
-
diff --git a/src/ports/SkOSLibrary.h b/src/ports/SkOSLibrary.h
index 7de2b90..ea1378f 100644
--- a/src/ports/SkOSLibrary.h
+++ b/src/ports/SkOSLibrary.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2015 Google Inc.
  *
@@ -13,4 +12,3 @@
 void* GetProcedureAddress(void* library, const char* functionName);
 
 #endif
-
diff --git a/src/ports/SkOSLibrary_posix.cpp b/src/ports/SkOSLibrary_posix.cpp
index 1571e20..901ee22 100644
--- a/src/ports/SkOSLibrary_posix.cpp
+++ b/src/ports/SkOSLibrary_posix.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2015 Google Inc.
  *
diff --git a/src/ports/SkOSLibrary_win.cpp b/src/ports/SkOSLibrary_win.cpp
index 9defb7e..63d8d2d 100644
--- a/src/ports/SkOSLibrary_win.cpp
+++ b/src/ports/SkOSLibrary_win.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2015 Google Inc.
  *
diff --git a/src/svg/parser/SkSVG.cpp b/src/svg/parser/SkSVG.cpp
index 8ee7d02..6c2796b 100644
--- a/src/svg/parser/SkSVG.cpp
+++ b/src/svg/parser/SkSVG.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/svg/parser/SkSVGCircle.cpp b/src/svg/parser/SkSVGCircle.cpp
index e34e179..9b12962 100644
--- a/src/svg/parser/SkSVGCircle.cpp
+++ b/src/svg/parser/SkSVGCircle.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/svg/parser/SkSVGCircle.h b/src/svg/parser/SkSVGCircle.h
index 1185162..edd306a 100644
--- a/src/svg/parser/SkSVGCircle.h
+++ b/src/svg/parser/SkSVGCircle.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/svg/parser/SkSVGClipPath.cpp b/src/svg/parser/SkSVGClipPath.cpp
index 86dc2df..4860fe7 100644
--- a/src/svg/parser/SkSVGClipPath.cpp
+++ b/src/svg/parser/SkSVGClipPath.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/svg/parser/SkSVGClipPath.h b/src/svg/parser/SkSVGClipPath.h
index 9ba4fbc..3ab1a24 100644
--- a/src/svg/parser/SkSVGClipPath.h
+++ b/src/svg/parser/SkSVGClipPath.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/svg/parser/SkSVGDefs.cpp b/src/svg/parser/SkSVGDefs.cpp
index 3b9bc20..c65aafd 100644
--- a/src/svg/parser/SkSVGDefs.cpp
+++ b/src/svg/parser/SkSVGDefs.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/svg/parser/SkSVGDefs.h b/src/svg/parser/SkSVGDefs.h
index daa6894..8bebccb 100644
--- a/src/svg/parser/SkSVGDefs.h
+++ b/src/svg/parser/SkSVGDefs.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/svg/parser/SkSVGElements.cpp b/src/svg/parser/SkSVGElements.cpp
index dc8ec94..3f8bc57 100644
--- a/src/svg/parser/SkSVGElements.cpp
+++ b/src/svg/parser/SkSVGElements.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/svg/parser/SkSVGElements.h b/src/svg/parser/SkSVGElements.h
index d00e434..2266a0b 100644
--- a/src/svg/parser/SkSVGElements.h
+++ b/src/svg/parser/SkSVGElements.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/svg/parser/SkSVGEllipse.cpp b/src/svg/parser/SkSVGEllipse.cpp
index 281e4e9..344faad 100644
--- a/src/svg/parser/SkSVGEllipse.cpp
+++ b/src/svg/parser/SkSVGEllipse.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/svg/parser/SkSVGEllipse.h b/src/svg/parser/SkSVGEllipse.h
index c039c83..2cdf683 100644
--- a/src/svg/parser/SkSVGEllipse.h
+++ b/src/svg/parser/SkSVGEllipse.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/svg/parser/SkSVGFeColorMatrix.cpp b/src/svg/parser/SkSVGFeColorMatrix.cpp
index 4e2d32a..179f9c4 100644
--- a/src/svg/parser/SkSVGFeColorMatrix.cpp
+++ b/src/svg/parser/SkSVGFeColorMatrix.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/svg/parser/SkSVGFeColorMatrix.h b/src/svg/parser/SkSVGFeColorMatrix.h
index 389995a..233ecee 100644
--- a/src/svg/parser/SkSVGFeColorMatrix.h
+++ b/src/svg/parser/SkSVGFeColorMatrix.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/svg/parser/SkSVGFilter.cpp b/src/svg/parser/SkSVGFilter.cpp
index 207f176..e0df156 100644
--- a/src/svg/parser/SkSVGFilter.cpp
+++ b/src/svg/parser/SkSVGFilter.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/svg/parser/SkSVGFilter.h b/src/svg/parser/SkSVGFilter.h
index f615bd0..6a70718 100644
--- a/src/svg/parser/SkSVGFilter.h
+++ b/src/svg/parser/SkSVGFilter.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/svg/parser/SkSVGG.cpp b/src/svg/parser/SkSVGG.cpp
index 21a7aa8..d155ed4 100644
--- a/src/svg/parser/SkSVGG.cpp
+++ b/src/svg/parser/SkSVGG.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/svg/parser/SkSVGG.h b/src/svg/parser/SkSVGG.h
index 4fa27d2..94cddc7 100644
--- a/src/svg/parser/SkSVGG.h
+++ b/src/svg/parser/SkSVGG.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/svg/parser/SkSVGGradient.cpp b/src/svg/parser/SkSVGGradient.cpp
index 0f7c6ba..8b54ff7 100644
--- a/src/svg/parser/SkSVGGradient.cpp
+++ b/src/svg/parser/SkSVGGradient.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/svg/parser/SkSVGGradient.h b/src/svg/parser/SkSVGGradient.h
index 286ff18..ba89d10 100644
--- a/src/svg/parser/SkSVGGradient.h
+++ b/src/svg/parser/SkSVGGradient.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/svg/parser/SkSVGGroup.cpp b/src/svg/parser/SkSVGGroup.cpp
index cbd8c4e..22d4cae 100644
--- a/src/svg/parser/SkSVGGroup.cpp
+++ b/src/svg/parser/SkSVGGroup.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/svg/parser/SkSVGGroup.h b/src/svg/parser/SkSVGGroup.h
index f579a98..5da3185 100644
--- a/src/svg/parser/SkSVGGroup.h
+++ b/src/svg/parser/SkSVGGroup.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/svg/parser/SkSVGImage.cpp b/src/svg/parser/SkSVGImage.cpp
index 97b8df8..54a37b7 100644
--- a/src/svg/parser/SkSVGImage.cpp
+++ b/src/svg/parser/SkSVGImage.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/svg/parser/SkSVGImage.h b/src/svg/parser/SkSVGImage.h
index b63beef..22342c3 100644
--- a/src/svg/parser/SkSVGImage.h
+++ b/src/svg/parser/SkSVGImage.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/svg/parser/SkSVGLine.cpp b/src/svg/parser/SkSVGLine.cpp
index 9158c99..64a0eb4 100644
--- a/src/svg/parser/SkSVGLine.cpp
+++ b/src/svg/parser/SkSVGLine.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/svg/parser/SkSVGLine.h b/src/svg/parser/SkSVGLine.h
index 3e437e0..1db5b65 100644
--- a/src/svg/parser/SkSVGLine.h
+++ b/src/svg/parser/SkSVGLine.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/svg/parser/SkSVGLinearGradient.cpp b/src/svg/parser/SkSVGLinearGradient.cpp
index f89ee53..5e552c1 100644
--- a/src/svg/parser/SkSVGLinearGradient.cpp
+++ b/src/svg/parser/SkSVGLinearGradient.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/svg/parser/SkSVGLinearGradient.h b/src/svg/parser/SkSVGLinearGradient.h
index 8eda065..a8df805 100644
--- a/src/svg/parser/SkSVGLinearGradient.h
+++ b/src/svg/parser/SkSVGLinearGradient.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/svg/parser/SkSVGMask.cpp b/src/svg/parser/SkSVGMask.cpp
index 7526d18..011943a 100644
--- a/src/svg/parser/SkSVGMask.cpp
+++ b/src/svg/parser/SkSVGMask.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/svg/parser/SkSVGMask.h b/src/svg/parser/SkSVGMask.h
index 2e1fd50..7116d45 100644
--- a/src/svg/parser/SkSVGMask.h
+++ b/src/svg/parser/SkSVGMask.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/svg/parser/SkSVGMetadata.cpp b/src/svg/parser/SkSVGMetadata.cpp
index 0f8850e..70a94e2 100644
--- a/src/svg/parser/SkSVGMetadata.cpp
+++ b/src/svg/parser/SkSVGMetadata.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/svg/parser/SkSVGMetadata.h b/src/svg/parser/SkSVGMetadata.h
index 2dcb3a2..5297542 100644
--- a/src/svg/parser/SkSVGMetadata.h
+++ b/src/svg/parser/SkSVGMetadata.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/svg/parser/SkSVGPaintState.cpp b/src/svg/parser/SkSVGPaintState.cpp
index df8ba28..8fa9139 100644
--- a/src/svg/parser/SkSVGPaintState.cpp
+++ b/src/svg/parser/SkSVGPaintState.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/svg/parser/SkSVGParser.cpp b/src/svg/parser/SkSVGParser.cpp
index 854716b..6243e37 100644
--- a/src/svg/parser/SkSVGParser.cpp
+++ b/src/svg/parser/SkSVGParser.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/svg/parser/SkSVGPath.cpp b/src/svg/parser/SkSVGPath.cpp
index c9917c7..225d35f 100644
--- a/src/svg/parser/SkSVGPath.cpp
+++ b/src/svg/parser/SkSVGPath.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/svg/parser/SkSVGPath.h b/src/svg/parser/SkSVGPath.h
index de325a7..f2f8e8a 100644
--- a/src/svg/parser/SkSVGPath.h
+++ b/src/svg/parser/SkSVGPath.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/svg/parser/SkSVGPolygon.cpp b/src/svg/parser/SkSVGPolygon.cpp
index 4b458db..4925fbf 100644
--- a/src/svg/parser/SkSVGPolygon.cpp
+++ b/src/svg/parser/SkSVGPolygon.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/svg/parser/SkSVGPolygon.h b/src/svg/parser/SkSVGPolygon.h
index b2848d0..4945c48 100644
--- a/src/svg/parser/SkSVGPolygon.h
+++ b/src/svg/parser/SkSVGPolygon.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/svg/parser/SkSVGPolyline.cpp b/src/svg/parser/SkSVGPolyline.cpp
index 83dad48..7062f6d 100644
--- a/src/svg/parser/SkSVGPolyline.cpp
+++ b/src/svg/parser/SkSVGPolyline.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/svg/parser/SkSVGPolyline.h b/src/svg/parser/SkSVGPolyline.h
index b8d5af4..2d1b798 100644
--- a/src/svg/parser/SkSVGPolyline.h
+++ b/src/svg/parser/SkSVGPolyline.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/svg/parser/SkSVGRadialGradient.cpp b/src/svg/parser/SkSVGRadialGradient.cpp
index 4fdf432..49a0297 100644
--- a/src/svg/parser/SkSVGRadialGradient.cpp
+++ b/src/svg/parser/SkSVGRadialGradient.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/svg/parser/SkSVGRadialGradient.h b/src/svg/parser/SkSVGRadialGradient.h
index 8eba3f5..b699cd6 100644
--- a/src/svg/parser/SkSVGRadialGradient.h
+++ b/src/svg/parser/SkSVGRadialGradient.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/svg/parser/SkSVGRect.cpp b/src/svg/parser/SkSVGRect.cpp
index 32a7f99..d3383b0 100644
--- a/src/svg/parser/SkSVGRect.cpp
+++ b/src/svg/parser/SkSVGRect.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/svg/parser/SkSVGRect.h b/src/svg/parser/SkSVGRect.h
index 4ae820c..b18a1a3 100644
--- a/src/svg/parser/SkSVGRect.h
+++ b/src/svg/parser/SkSVGRect.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/svg/parser/SkSVGSVG.cpp b/src/svg/parser/SkSVGSVG.cpp
index 61ccb3c..980636b 100644
--- a/src/svg/parser/SkSVGSVG.cpp
+++ b/src/svg/parser/SkSVGSVG.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/svg/parser/SkSVGSVG.h b/src/svg/parser/SkSVGSVG.h
index 155f9a9..0c5d89d 100644
--- a/src/svg/parser/SkSVGSVG.h
+++ b/src/svg/parser/SkSVGSVG.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/svg/parser/SkSVGStop.cpp b/src/svg/parser/SkSVGStop.cpp
index 0630f61..575feab 100644
--- a/src/svg/parser/SkSVGStop.cpp
+++ b/src/svg/parser/SkSVGStop.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/svg/parser/SkSVGStop.h b/src/svg/parser/SkSVGStop.h
index e55936b..5cf480e 100644
--- a/src/svg/parser/SkSVGStop.h
+++ b/src/svg/parser/SkSVGStop.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/svg/parser/SkSVGSymbol.cpp b/src/svg/parser/SkSVGSymbol.cpp
index ce341e6..afdcbd9 100644
--- a/src/svg/parser/SkSVGSymbol.cpp
+++ b/src/svg/parser/SkSVGSymbol.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/svg/parser/SkSVGSymbol.h b/src/svg/parser/SkSVGSymbol.h
index 80fd61a..31ce678 100644
--- a/src/svg/parser/SkSVGSymbol.h
+++ b/src/svg/parser/SkSVGSymbol.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/svg/parser/SkSVGText.cpp b/src/svg/parser/SkSVGText.cpp
index dfaba08..cf0c10f 100644
--- a/src/svg/parser/SkSVGText.cpp
+++ b/src/svg/parser/SkSVGText.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/svg/parser/SkSVGText.h b/src/svg/parser/SkSVGText.h
index 5ac2fbd..492ed72 100644
--- a/src/svg/parser/SkSVGText.h
+++ b/src/svg/parser/SkSVGText.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/svg/parser/SkSVGUse.cpp b/src/svg/parser/SkSVGUse.cpp
index 0496d98..c73176f 100644
--- a/src/svg/parser/SkSVGUse.cpp
+++ b/src/svg/parser/SkSVGUse.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/svg/parser/SkSVGUse.h b/src/svg/parser/SkSVGUse.h
index b907189..b67c54f 100644
--- a/src/svg/parser/SkSVGUse.h
+++ b/src/svg/parser/SkSVGUse.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/utils/SkBase64.cpp b/src/utils/SkBase64.cpp
index b026892..cb3396c 100644
--- a/src/utils/SkBase64.cpp
+++ b/src/utils/SkBase64.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/utils/SkBitSet.cpp b/src/utils/SkBitSet.cpp
index 985bb6e..7d03dfc 100755
--- a/src/utils/SkBitSet.cpp
+++ b/src/utils/SkBitSet.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/src/utils/SkBitSet.h b/src/utils/SkBitSet.h
index 266fd87..802b9e1 100644
--- a/src/utils/SkBitSet.h
+++ b/src/utils/SkBitSet.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/src/utils/SkBoundaryPatch.cpp b/src/utils/SkBoundaryPatch.cpp
index 7ef11ee..0cfb09c 100644
--- a/src/utils/SkBoundaryPatch.cpp
+++ b/src/utils/SkBoundaryPatch.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/src/utils/SkCanvasStack.cpp b/src/utils/SkCanvasStack.cpp
index 87e8f65..a5a483d 100644
--- a/src/utils/SkCanvasStack.cpp
+++ b/src/utils/SkCanvasStack.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2013 Google Inc.
  *
diff --git a/src/utils/SkCanvasStack.h b/src/utils/SkCanvasStack.h
index 6602110..300bcd3 100644
--- a/src/utils/SkCanvasStack.h
+++ b/src/utils/SkCanvasStack.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2013 Google Inc.
  *
diff --git a/src/utils/SkDumpCanvas.cpp b/src/utils/SkDumpCanvas.cpp
index 75fa836..9530f86 100644
--- a/src/utils/SkDumpCanvas.cpp
+++ b/src/utils/SkDumpCanvas.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
@@ -393,7 +392,7 @@
         toString(*src, &ss);
         rs.prependf("%s ", ss.c_str());
     }
-    
+
     this->dump(kDrawBitmap_Verb, paint, "drawImageRectToRect(%s %s)",
                bs.c_str(), rs.c_str());
 }
diff --git a/src/utils/SkInterpolator.cpp b/src/utils/SkInterpolator.cpp
index 197d977..c867587 100644
--- a/src/utils/SkInterpolator.cpp
+++ b/src/utils/SkInterpolator.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2008 The Android Open Source Project
  *
diff --git a/src/utils/SkLayer.cpp b/src/utils/SkLayer.cpp
index 39032b6..d0de1ba 100644
--- a/src/utils/SkLayer.cpp
+++ b/src/utils/SkLayer.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/src/utils/SkMeshUtils.cpp b/src/utils/SkMeshUtils.cpp
index 5d3eefc..27eccc2 100644
--- a/src/utils/SkMeshUtils.cpp
+++ b/src/utils/SkMeshUtils.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/src/utils/SkNWayCanvas.cpp b/src/utils/SkNWayCanvas.cpp
index fd5fa82..4397814 100644
--- a/src/utils/SkNWayCanvas.cpp
+++ b/src/utils/SkNWayCanvas.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/src/utils/SkNinePatch.cpp b/src/utils/SkNinePatch.cpp
index aeb65b1..f4d2300 100644
--- a/src/utils/SkNinePatch.cpp
+++ b/src/utils/SkNinePatch.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/utils/SkParse.cpp b/src/utils/SkParse.cpp
index b5a108e..90c9fff 100644
--- a/src/utils/SkParse.cpp
+++ b/src/utils/SkParse.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/utils/SkParseColor.cpp b/src/utils/SkParseColor.cpp
index 329b304..eafdc4c 100644
--- a/src/utils/SkParseColor.cpp
+++ b/src/utils/SkParseColor.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/utils/SkParsePath.cpp b/src/utils/SkParsePath.cpp
index 8baa661..8f571f9 100644
--- a/src/utils/SkParsePath.cpp
+++ b/src/utils/SkParsePath.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/src/utils/SkPatchGrid.cpp b/src/utils/SkPatchGrid.cpp
index b7aaa82..3b7c06e 100644
--- a/src/utils/SkPatchGrid.cpp
+++ b/src/utils/SkPatchGrid.cpp
@@ -36,28 +36,28 @@
     if (x < 0 || y < 0 || x > fCols - 1 || y > fRows - 1 || nullptr == cubics) {
         return false;
     }
-    
+
     // setup corners and colors
     int cornerPos = y * (fCols + 1) + x;
     fCornerPts[cornerPos] = cubics[SkPatchUtils::kTopP0_CubicCtrlPts];
     fCornerPts[cornerPos + 1] = cubics[SkPatchUtils::kTopP3_CubicCtrlPts];
     fCornerPts[cornerPos + (fCols + 1)] = cubics[SkPatchUtils::kBottomP0_CubicCtrlPts];
     fCornerPts[cornerPos + (fCols + 1) + 1] = cubics[SkPatchUtils::kBottomP3_CubicCtrlPts];
-    
+
     // set horizontal control points
     int hrzPos = y * (fCols * 2) + (x * 2);
     fHrzCtrlPts[hrzPos] = cubics[SkPatchUtils::kTopP1_CubicCtrlPts];
     fHrzCtrlPts[hrzPos + 1] = cubics[SkPatchUtils::kTopP2_CubicCtrlPts];
     fHrzCtrlPts[hrzPos + (fCols * 2)] = cubics[SkPatchUtils::kBottomP1_CubicCtrlPts];
     fHrzCtrlPts[hrzPos + (fCols * 2) + 1] = cubics[SkPatchUtils::kBottomP2_CubicCtrlPts];
-    
+
     // set vertical control points
     int vrtPos = (y*2) * (fCols + 1) + x;
     fVrtCtrlPts[vrtPos] = cubics[SkPatchUtils::kLeftP1_CubicCtrlPts];
     fVrtCtrlPts[vrtPos + 1] = cubics[SkPatchUtils::kRightP1_CubicCtrlPts];
     fVrtCtrlPts[vrtPos + (fCols + 1)] = cubics[SkPatchUtils::kLeftP2_CubicCtrlPts];
     fVrtCtrlPts[vrtPos + (fCols + 1) + 1] = cubics[SkPatchUtils::kRightP2_CubicCtrlPts];
-    
+
     // set optional values (colors and texture coordinates)
     if ((fModeFlags & kColors_VertexType)  && colors) {
         fCornerColors[cornerPos] = colors[0];
@@ -65,57 +65,57 @@
         fCornerColors[cornerPos + (fCols + 1)] = colors[3];
         fCornerColors[cornerPos + (fCols + 1) + 1] = colors[2];
     }
-    
+
     if ((fModeFlags & kTexs_VertexType) && texCoords) {
         fTexCoords[cornerPos] = texCoords[0];
         fTexCoords[cornerPos + 1] = texCoords[1];
         fTexCoords[cornerPos + (fCols + 1)] = texCoords[3];
         fTexCoords[cornerPos + (fCols + 1) + 1] = texCoords[2];
     }
-    
+
     return true;
 }
 
 bool SkPatchGrid::getPatch(int x, int y, SkPoint cubics[12], SkColor colors[4],
                            SkPoint texCoords[4]) const {
-    
+
     if (x < 0 || y < 0 || x > fCols - 1 || y > fRows - 1 || nullptr == cubics) {
         return false;
     }
-    
+
     // set the patch by building the array of points and colors with the corresponding values.
     int cornerPos = y * (fCols + 1) + x;
     cubics[SkPatchUtils::kTopP0_CubicCtrlPts] = fCornerPts[cornerPos];
     cubics[SkPatchUtils::kTopP3_CubicCtrlPts] = fCornerPts[cornerPos + 1];
     cubics[SkPatchUtils::kBottomP0_CubicCtrlPts] = fCornerPts[cornerPos + (fCols + 1)];
     cubics[SkPatchUtils::kBottomP3_CubicCtrlPts] = fCornerPts[cornerPos + (fCols + 1) + 1];
-    
+
     int hrzPos = y * (fCols * 2) + (x * 2);
     cubics[SkPatchUtils::kTopP1_CubicCtrlPts] = fHrzCtrlPts[hrzPos];
     cubics[SkPatchUtils::kTopP2_CubicCtrlPts] = fHrzCtrlPts[hrzPos + 1];
     cubics[SkPatchUtils::kBottomP1_CubicCtrlPts] = fHrzCtrlPts[hrzPos + (fCols * 2)];
     cubics[SkPatchUtils::kBottomP2_CubicCtrlPts] = fHrzCtrlPts[hrzPos + (fCols * 2) + 1];
-    
+
     int vrtPos = (y*2) * (fCols + 1) + x;
     cubics[SkPatchUtils::kLeftP1_CubicCtrlPts] = fVrtCtrlPts[vrtPos];
     cubics[SkPatchUtils::kRightP1_CubicCtrlPts] = fVrtCtrlPts[vrtPos + 1];
     cubics[SkPatchUtils::kLeftP2_CubicCtrlPts] = fVrtCtrlPts[vrtPos + (fCols + 1)];
     cubics[SkPatchUtils::kRightP2_CubicCtrlPts] = fVrtCtrlPts[vrtPos + (fCols + 1) + 1];
-    
+
     if ((fModeFlags & kColors_VertexType)  && colors) {
         colors[0] = fCornerColors[cornerPos];
         colors[1] = fCornerColors[cornerPos + 1];
         colors[3] = fCornerColors[cornerPos + (fCols + 1)];
         colors[2] = fCornerColors[cornerPos + (fCols + 1) + 1];
     }
-    
+
     if ((fModeFlags & kTexs_VertexType)  && texCoords) {
         texCoords[0] = fTexCoords[cornerPos];
         texCoords[1] = fTexCoords[cornerPos + 1];
         texCoords[3] = fTexCoords[cornerPos + (fCols + 1)];
         texCoords[2] = fTexCoords[cornerPos + (fCols + 1) + 1];
     }
-    
+
     return true;
 }
 
@@ -137,12 +137,12 @@
     memset(fCornerPts, 0, (fRows + 1) * (fCols + 1) * sizeof(SkPoint));
     memset(fHrzCtrlPts, 0, (fRows + 1) * fCols * 2 * sizeof(SkPoint));
     memset(fVrtCtrlPts, 0, fRows * 2 * (fCols + 1) * sizeof(SkPoint));
-    
+
     if (fModeFlags & kColors_VertexType) {
         fCornerColors = new SkColor[(fRows + 1) * (fCols + 1)];
         memset(fCornerColors, 0, (fRows + 1) * (fCols + 1) * sizeof(SkColor));
     }
-    
+
     if (fModeFlags & kTexs_VertexType) {
         fTexCoords = new SkPoint[(fRows + 1) * (fCols + 1)];
         memset(fTexCoords, 0, (fRows + 1) * (fCols + 1) * sizeof(SkPoint));
@@ -154,7 +154,7 @@
     int* maxRows = new int[fRows];
     memset(maxCols, 0, fCols * sizeof(int));
     memset(maxRows, 0, fRows * sizeof(int));
-    
+
     // Get the maximum level of detail per axis for each row and column
     for (int y = 0; y < fRows; y++) {
         for (int x = 0; x < fCols; x++) {
diff --git a/src/utils/SkPatchGrid.h b/src/utils/SkPatchGrid.h
index 5bc2e65..ca2a35b 100644
--- a/src/utils/SkPatchGrid.h
+++ b/src/utils/SkPatchGrid.h
@@ -13,12 +13,12 @@
 #include "SkXfermode.h"
 
 /**
- * Class that represents a grid of patches. Adjacent patches share their corners and a color is 
+ * Class that represents a grid of patches. Adjacent patches share their corners and a color is
  * specified at each one of them. The colors are bilinearly interpolated across the patch.
  *
- * This implementation defines a bidimensional array of patches. There are 3 arrays to store the 
+ * This implementation defines a bidimensional array of patches. There are 3 arrays to store the
  * control points of the patches to avoid storing repeated data since there are several points
- * shared between adjacent patches. 
+ * shared between adjacent patches.
  *
  * The array fCornerPts stores the corner control points of the patches.
  * The array fHrzPts holds the intermidiate control points of the top and bottom curves of a patch.
@@ -54,11 +54,11 @@
  *               \      / \      /
  *                H8   H9  H10  H11
  *
- * When trying to get a patch at a certain position it justs builds it with the corresponding 
+ * When trying to get a patch at a certain position it justs builds it with the corresponding
  * points.
  * When adding a patch it tries to add the points at their corresponding position trying to comply
  * with the adjacent points or overwriting them.
- * 
+ *
  * Based the idea on the SVG2 spec for mesh gradients in which a grid of patches is build as in the
  * the following example:
  * <meshGradient x="100" y="100">
@@ -77,58 +77,58 @@
  * </meshGradient>
  */
 class SkPatchGrid {
-    
+
 public:
-    
+
     enum VertexType {
         kNone_VertexType = 0X00,
         kColors_VertexType = 0x01,
         kTexs_VertexType = 0x02,
         kColorsAndTexs_VertexType = 0x03
     };
-    
+
     SkPatchGrid(int rows = 0, int cols = 0, VertexType flags = kNone_VertexType,
                 SkXfermode* xfer = nullptr);
-    
+
     ~SkPatchGrid();
-    
+
     /**
-     * Add a patch at location (x,y) overwriting the previous patch and shared points so they 
+     * Add a patch at location (x,y) overwriting the previous patch and shared points so they
      * mantain C0 connectivity.
      * The control points must be passed in a clockwise order starting at the top left corner.
-     * The colors and texCoords are the values at the corners of the patch which will be bilerp 
+     * The colors and texCoords are the values at the corners of the patch which will be bilerp
      * across it, they must also be in counterclockwise order starting at the top left corner.
      */
     bool setPatch(int x, int y, const SkPoint cubics[12], const SkColor colors[4],
                   const SkPoint texCoords[4]);
-    
+
     /**
      * Get patch at location (x,y). If cubics, colors or texCoords is not nullptr it sets patch's
      * array with its corresponding values.
-     * The function returns false if the cubics parameter is nullptr or if the (x,y) coordinates are 
+     * The function returns false if the cubics parameter is nullptr or if the (x,y) coordinates are
      * not within the range of the grid.
      */
     bool getPatch(int x, int y, SkPoint cubics[12], SkColor colors[4], SkPoint texCoords[4]) const;
-    
+
     /**
      * Resets the grid of patches to contain rows and cols of patches.
      */
     void reset(int rows, int cols, VertexType flags, SkXfermode* xMode);
-    
+
     /**
-     * Draws the grid of patches. The patches are drawn starting at patch (0,0) drawing columns, so 
-     * for a 2x2 grid the order would be (0,0)->(0,1)->(1,0)->(1,1). The order follows the order 
+     * Draws the grid of patches. The patches are drawn starting at patch (0,0) drawing columns, so
+     * for a 2x2 grid the order would be (0,0)->(0,1)->(1,0)->(1,1). The order follows the order
      * of the parametric coordinates of the coons patch.
      */
     void draw(SkCanvas* canvas, SkPaint& paint);
-    
+
     /**
      * Get the dimensions of the grid of patches.
      */
     SkISize getDimensions() const {
         return SkISize::Make(fCols, fRows);
     }
-    
+
 private:
     int fRows, fCols;
     VertexType fModeFlags;
diff --git a/src/utils/SkPatchUtils.cpp b/src/utils/SkPatchUtils.cpp
index 9d095ae..cbaae39 100644
--- a/src/utils/SkPatchUtils.cpp
+++ b/src/utils/SkPatchUtils.cpp
@@ -28,20 +28,20 @@
  */
 
 class FwDCubicEvaluator {
-    
+
 public:
-    
+
     /**
      * Receives the 4 control points of the cubic bezier.
      */
-    
+
     explicit FwDCubicEvaluator(const SkPoint points[4])
             : fCoefs(points) {
         memcpy(fPoints, points, 4 * sizeof(SkPoint));
-        
+
         this->restart(1);
     }
-    
+
     /**
      * Restarts the forward differences evaluator to the first value of t = 0.
      */
@@ -58,14 +58,14 @@
         fFwDiff[1] = to_point(fCoefs.fA * h3 + fCoefs.fB * h2 + fCoefs.fC * h);
         fFwDiff[0] = to_point(fCoefs.fD);
     }
-    
+
     /**
      * Check if the evaluator is still within the range of 0<=t<=1
      */
     bool done() const {
         return fCurrent > fMax;
     }
-    
+
     /**
      * Call next to obtain the SkPoint sampled and move to the next one.
      */
@@ -77,11 +77,11 @@
         fCurrent++;
         return point;
     }
-    
+
     const SkPoint* getCtrlPoints() const {
         return fPoints;
     }
-    
+
 private:
     SkCubicCoeff fCoefs;
     int fMax, fCurrent, fDivisions;
@@ -115,29 +115,29 @@
 }
 
 SkISize SkPatchUtils::GetLevelOfDetail(const SkPoint cubics[12], const SkMatrix* matrix) {
-    
+
     // Approximate length of each cubic.
     SkPoint pts[kNumPtsCubic];
     SkPatchUtils::getTopCubic(cubics, pts);
     matrix->mapPoints(pts, kNumPtsCubic);
     SkScalar topLength = approx_arc_length(pts, kNumPtsCubic);
-    
+
     SkPatchUtils::getBottomCubic(cubics, pts);
     matrix->mapPoints(pts, kNumPtsCubic);
     SkScalar bottomLength = approx_arc_length(pts, kNumPtsCubic);
-    
+
     SkPatchUtils::getLeftCubic(cubics, pts);
     matrix->mapPoints(pts, kNumPtsCubic);
     SkScalar leftLength = approx_arc_length(pts, kNumPtsCubic);
-    
+
     SkPatchUtils::getRightCubic(cubics, pts);
     matrix->mapPoints(pts, kNumPtsCubic);
     SkScalar rightLength = approx_arc_length(pts, kNumPtsCubic);
-    
+
     // Level of detail per axis, based on the larger side between top and bottom or left and right
     int lodX = static_cast<int>(SkMaxScalar(topLength, bottomLength) / kPartitionSize);
     int lodY = static_cast<int>(SkMaxScalar(leftLength, rightLength) / kPartitionSize);
-    
+
     return SkISize::Make(SkMax32(8, lodX), SkMax32(8, lodY));
 }
 
@@ -210,12 +210,12 @@
         }
         data->fColors = new uint32_t[data->fVertexCount];
     }
-    
+
     // if texture coordinates are not null then create array for them
     if (texCoords) {
         data->fTexCoords = new SkPoint[data->fVertexCount];
     }
-    
+
     SkPoint pts[kNumPtsCubic];
     SkPatchUtils::getBottomCubic(cubics, pts);
     FwDCubicEvaluator fBottom(pts);
@@ -225,10 +225,10 @@
     FwDCubicEvaluator fLeft(pts);
     SkPatchUtils::getRightCubic(cubics, pts);
     FwDCubicEvaluator fRight(pts);
-    
+
     fBottom.restart(lodX);
     fTop.restart(lodX);
-    
+
     SkScalar u = 0.0f;
     int stride = lodY + 1;
     for (int x = 0; x <= lodX; x++) {
@@ -238,9 +238,9 @@
         SkScalar v = 0.f;
         for (int y = 0; y <= lodY; y++) {
             int dataIndex = x * (lodY + 1) + y;
-            
+
             SkPoint left = fLeft.next(), right = fRight.next();
-            
+
             SkPoint s0 = SkPoint::Make((1.0f - v) * top.x() + v * bottom.x(),
                                        (1.0f - v) * top.y() + v * bottom.y());
             SkPoint s1 = SkPoint::Make((1.0f - u) * left.x() + u * right.x(),
@@ -255,7 +255,7 @@
                                        + v * ((1.0f - u) * fBottom.getCtrlPoints()[0].y()
                                               + u * fBottom.getCtrlPoints()[3].y()));
             data->fPoints[dataIndex] = s0 + s1 - s2;
-            
+
             if (colors) {
                 uint8_t a = uint8_t(bilerp(u, v,
                                    SkScalar(SkColorGetA(colorsPM[kTopLeft_Corner])),
@@ -279,7 +279,7 @@
                                    SkScalar(SkColorGetB(colorsPM[kBottomRight_Corner]))));
                 data->fColors[dataIndex] = SkPackARGB32(a,r,g,b);
             }
-            
+
             if (texCoords) {
                 data->fTexCoords[dataIndex] = SkPoint::Make(
                                             bilerp(u, v, texCoords[kTopLeft_Corner].x(),
@@ -290,9 +290,9 @@
                                                    texCoords[kTopRight_Corner].y(),
                                                    texCoords[kBottomLeft_Corner].y(),
                                                    texCoords[kBottomRight_Corner].y()));
-                
+
             }
-            
+
             if(x < lodX && y < lodY) {
                 int i = 6 * (x * lodY + y);
                 data->fIndices[i] = x * stride + y;
diff --git a/src/utils/SkPatchUtils.h b/src/utils/SkPatchUtils.h
index 7c231f1..67ab621 100644
--- a/src/utils/SkPatchUtils.h
+++ b/src/utils/SkPatchUtils.h
@@ -12,7 +12,7 @@
 #include "SkMatrix.h"
 
 class SK_API SkPatchUtils {
-    
+
 public:
     /**
      * Structure that holds the vertex data related to the tessellation of a patch. It is passed
@@ -25,7 +25,7 @@
         SkPoint* fTexCoords;
         uint32_t* fColors;
         uint16_t* fIndices;
-        
+
         VertexData()
         : fVertexCount(0)
         , fIndexCount(0)
@@ -33,7 +33,7 @@
         , fTexCoords(nullptr)
         , fColors(nullptr)
         , fIndices(nullptr) { }
-        
+
         ~VertexData() {
             delete[] fPoints;
             delete[] fTexCoords;
@@ -41,30 +41,30 @@
             delete[] fIndices;
         }
     };
-    
+
     // Enums for control points based on the order specified in the constructor (clockwise).
     enum CubicCtrlPts {
         kTopP0_CubicCtrlPts = 0,
         kTopP1_CubicCtrlPts = 1,
         kTopP2_CubicCtrlPts = 2,
         kTopP3_CubicCtrlPts = 3,
-        
+
         kRightP0_CubicCtrlPts = 3,
         kRightP1_CubicCtrlPts = 4,
         kRightP2_CubicCtrlPts = 5,
         kRightP3_CubicCtrlPts = 6,
-        
+
         kBottomP0_CubicCtrlPts = 9,
         kBottomP1_CubicCtrlPts = 8,
         kBottomP2_CubicCtrlPts = 7,
         kBottomP3_CubicCtrlPts = 6,
-        
+
         kLeftP0_CubicCtrlPts = 0,
         kLeftP1_CubicCtrlPts = 11,
         kLeftP2_CubicCtrlPts = 10,
         kLeftP3_CubicCtrlPts = 9,
     };
-    
+
     // Enum for corner also clockwise.
     enum Corner {
         kTopLeft_Corner = 0,
@@ -72,45 +72,45 @@
         kBottomRight_Corner,
         kBottomLeft_Corner
     };
-    
+
     enum {
         kNumCtrlPts = 12,
         kNumCorners = 4,
         kNumPtsCubic = 4
     };
-    
+
     /**
-     * Method that calculates a level of detail (number of subdivisions) for a patch in both axis. 
+     * Method that calculates a level of detail (number of subdivisions) for a patch in both axis.
      */
     static SkISize GetLevelOfDetail(const SkPoint cubics[12], const SkMatrix* matrix);
-    
+
     /**
      * Get the points corresponding to the top cubic of cubics.
      */
     static void getTopCubic(const SkPoint cubics[12], SkPoint points[4]);
-    
+
     /**
      * Get the points corresponding to the bottom cubic of cubics.
      */
     static void getBottomCubic(const SkPoint cubics[12], SkPoint points[4]);
-    
+
     /**
      * Get the points corresponding to the left cubic of cubics.
      */
     static void getLeftCubic(const SkPoint cubics[12], SkPoint points[4]);
-    
+
     /**
      * Get the points corresponding to the right cubic of cubics.
      */
     static void getRightCubic(const SkPoint cubics[12], SkPoint points[4]);
-    
+
     /**
      * Function that evaluates the coons patch interpolation.
      * data refers to the pointer of the PatchData struct in which the tessellation data is set.
      * cubics refers to the points of the cubics.
      * lod refers the level of detail for each axis.
      * colors refers to the corner colors that will be bilerp across the patch (optional parameter)
-     * texCoords refers to the corner texture coordinates that will be bilerp across the patch 
+     * texCoords refers to the corner texture coordinates that will be bilerp across the patch
         (optional parameter)
      */
     static bool getVertexData(SkPatchUtils::VertexData* data, const SkPoint cubics[12],
diff --git a/src/utils/SkTextBox.cpp b/src/utils/SkTextBox.cpp
index ba6ef53..d237f45 100644
--- a/src/utils/SkTextBox.cpp
+++ b/src/utils/SkTextBox.cpp
@@ -300,4 +300,3 @@
     }
     return (SkTextBlob*)visitor.fBuilder.build();
 }
-
diff --git a/src/utils/SkTextureCompressor_ASTC.cpp b/src/utils/SkTextureCompressor_ASTC.cpp
index a6e91d6..02f4f17 100644
--- a/src/utils/SkTextureCompressor_ASTC.cpp
+++ b/src/utils/SkTextureCompressor_ASTC.cpp
@@ -217,7 +217,7 @@
     //     - Single plane
     //     - Low-precision index values
     //     - Index range 0-7 (three bits per index)
-    // 2. Partitions: 0b00 
+    // 2. Partitions: 0b00
     //     - One partition
     // 3. Color Endpoint Mode: 0b0000
     //     - Direct luminance -- e0=(v0,v0,v0,0xFF); e1=(v1,v1,v1,0xFF);
@@ -270,7 +270,7 @@
 //
 ////////////////////////////////////////////////////////////////////////////////
 
-// Enable this to assert whenever a decoded block has invalid ASTC values. Otherwise, 
+// Enable this to assert whenever a decoded block has invalid ASTC values. Otherwise,
 // each invalid block will result in a disgusting magenta color.
 #define ASSERT_ASTC_DECODE_ERROR 0
 
@@ -369,7 +369,7 @@
         SkASSERT(nBits > (64 - from));
         const int nLow = 64 - from;
         const int nHigh = nBits - nLow;
-        result = 
+        result =
             ((block.fLow >> from) & ((1ULL << nLow) - 1)) |
             ((block.fHigh & ((1ULL << nHigh) - 1)) << nLow);
     }
@@ -452,7 +452,7 @@
         v4 = v[4];
         v5 = v[5];
     }
-                  
+
     endpoints[0] = SkColorSetARGB(v4,
                                   (v[0]*v[3]) >> 8,
                                   (v[1]*v[3]) >> 8,
@@ -1256,7 +1256,7 @@
 
                 case kLDR_LuminanceAlpha_Direct_ColorEndpointMode: {
                     const int* v = colorValues;
-                    
+
                     endpoints[i][0] = SkColorSetARGB(v[2], v[0], v[0], v[0]);
                     endpoints[i][1] = SkColorSetARGB(v[3], v[1], v[1], v[1]);
 
@@ -1272,7 +1272,7 @@
 
                     bit_transfer_signed(&v1, &v0);
                     bit_transfer_signed(&v3, &v2);
-                    
+
                     endpoints[i][0] = SkColorSetARGB(v2, v0, v0, v0);
                     endpoints[i][1] = SkColorSetARGB(
                         clamp_byte(v3+v2),
@@ -1669,7 +1669,7 @@
             this->decodeDualPlane(dualPlaneBitLoc);
 
             return;
-        } 
+        }
 
         // If we have more than one partition, then we need to make
         // room for the partition index.
@@ -1691,7 +1691,7 @@
             this->decodeDualPlane(dualPlaneBitLoc);
 
             return;
-        } 
+        }
 
         // Move the dual plane selector bits down based on how many
         // partitions the block contains.
@@ -1756,7 +1756,7 @@
 
     // Decodes the block mode. This function determines whether or not we use
     // dual plane encoding, the size of the texel weight grid, and the number of
-    // bits, trits and quints that are used to encode it. For more information, 
+    // bits, trits and quints that are used to encode it. For more information,
     // see section C.2.10 of the ASTC spec.
     //
     // For 2D blocks, the Block Mode field is laid out as follows:
diff --git a/src/utils/SkTextureCompressor_Blitter.h b/src/utils/SkTextureCompressor_Blitter.h
index 0c259d6..f488707 100644
--- a/src/utils/SkTextureCompressor_Blitter.h
+++ b/src/utils/SkTextureCompressor_Blitter.h
@@ -55,7 +55,7 @@
 //     // most likely be implementation dependent. The mask variable will have
 //     // 0xFF in positions where the block should be updated and 0 in positions
 //     // where it shouldn't. src contains an uncompressed buffer of pixels.
-//     static void UpdateBlock(uint8_t* dst, const uint8_t* src, int srcRowBytes, 
+//     static void UpdateBlock(uint8_t* dst, const uint8_t* src, int srcRowBytes,
 //                             const uint8_t* mask);
 #endif
 // };
@@ -65,7 +65,7 @@
     SkTCompressedAlphaBlitter(int width, int height, void *compressedBuffer)
         // 0x7FFE is one minus the largest positive 16-bit int. We use it for
         // debugging to make sure that we're properly setting the nextX distance
-        // in flushRuns(). 
+        // in flushRuns().
 #ifdef SK_DEBUG
         : fCalledOnceWithNonzeroY(false)
         , fBlitMaskCalled(false),
@@ -139,7 +139,7 @@
             this->flushRuns();
         }
     }
-    
+
     // Blit a vertical run of pixels with a constant alpha value.
     void blitV(int x, int y, int height, SkAlpha alpha) override {
         // This function is currently not implemented. It is not explicitly
@@ -171,7 +171,7 @@
 
         // Make sure that we're only ever bracketing calls to blitAntiH.
         SkASSERT((0 == y) || (!fCalledOnceWithNonzeroY && (fCalledOnceWithNonzeroY = true)));
-        
+
 #if !(PEDANTIC_BLIT_RECT)
         for (int i = 0; i < height; ++i) {
             const SkAlpha kFullAlpha = 0xFF;
@@ -194,7 +194,7 @@
 
             const int yoff = y - startBlockY;
             SkASSERT((yoff + height) <= BlockDim);
-            
+
             for (int j = 0; j < height; ++j) {
                 memset(mask + (j + yoff)*BlockDim + xoff, 0xFF, width);
             }
@@ -493,7 +493,7 @@
         // -----------------------------------------------------------------------
         // ... |  |  |  |  |  ----> fBufferedRuns[3]
         // -----------------------------------------------------------------------
-        // 
+        //
         // curX -- the macro X value that we've gotten to.
         // c[BlockDim] -- the buffers that represent the columns of the current block
         //                  that we're operating on
diff --git a/src/utils/SkTextureCompressor_LATC.cpp b/src/utils/SkTextureCompressor_LATC.cpp
index 3ee6b27..50aaf0b 100644
--- a/src/utils/SkTextureCompressor_LATC.cpp
+++ b/src/utils/SkTextureCompressor_LATC.cpp
@@ -81,7 +81,7 @@
 
 // This function is used by both R11 EAC and LATC to compress 4x4 blocks
 // of 8-bit alpha into 64-bit values that comprise the compressed data.
-// For both formats, we need to make sure that the dimensions of the 
+// For both formats, we need to make sure that the dimensions of the
 // src pixels are divisible by 4, and copy 4x4 blocks one at a time
 // for compression.
 static bool compress_4x4_a8_to_64bit(uint8_t* dst, const uint8_t* src,
@@ -284,7 +284,7 @@
     if (nonExtremalPixels == nUniquePixels) {
         // This is really just for correctness, in all of my tests we
         // never take this step. We don't lose too much perf here because
-        // most of the processing in this function is worth it for the 
+        // most of the processing in this function is worth it for the
         // 1 == nUniquePixels optimization.
         return compress_latc_block_bb(pixels);
     } else {
@@ -320,7 +320,7 @@
 // Converts each 8-bit byte in the integer into an LATC index, and then packs
 // the indices into the low 12 bits of the integer.
 static inline uint32_t convert_index(uint32_t x) {
-    // Since the palette is 
+    // Since the palette is
     // 255, 0, 219, 182, 146, 109, 73, 36
     // we need to map the high three bits of each byte in the integer
     // from
@@ -346,7 +346,7 @@
     // Mask out high bits:
     // 9 7 6 5 4 3 2 0 --> 1 7 6 5 4 3 2 0
     x &= 0x07070707;
-    
+
     return pack_index(x);
 }
 
diff --git a/src/utils/SkTextureCompressor_R11EAC.cpp b/src/utils/SkTextureCompressor_R11EAC.cpp
index 291820b..5c298dd 100644
--- a/src/utils/SkTextureCompressor_R11EAC.cpp
+++ b/src/utils/SkTextureCompressor_R11EAC.cpp
@@ -235,7 +235,7 @@
                 //
                 // this gives the following formula:
                 // clamp[0, 2047](0*8+4+(-3)*2*8) = 0
-                // 
+                //
                 // Furthermore, it is impervious to endianness:
                 // 0x0020000000002000ULL
                 // Will produce one pixel with index 2, which gives:
@@ -244,7 +244,7 @@
 
             // Fully opaque? We know this encoding too...
             case 255:
-            
+
                 // -1 produces the following:
                 // basw_cw: 255
                 // mod: 15, palette: {-3, -5, -7, -9, 2, 4, 6, 8}
@@ -410,7 +410,7 @@
     x = swap_shift<36>(x, 0xFC0ULL);
 
     // x: 00 00 00 00 00 00 00 00 a e i m d h l p b f j n c g k o
-    
+
     x = (x & (0xFFFULL << 36)) | ((x & 0xFFFFFFULL) << 12) | ((x >> 24) & 0xFFFULL);
 #endif
 
@@ -498,13 +498,13 @@
 // the least significant 12 bits of the resulting integer.
 static inline uint32_t pack_indices_vertical(uint32_t x) {
 #if defined (SK_CPU_BENDIAN)
-    return 
+    return
         (x & 7) |
         ((x >> 5) & (7 << 3)) |
         ((x >> 10) & (7 << 6)) |
         ((x >> 15) & (7 << 9));
 #else
-    return 
+    return
         ((x >> 24) & 7) |
         ((x >> 13) & (7 << 3)) |
         ((x >> 2) & (7 << 6)) |
@@ -664,7 +664,7 @@
             src += 8;
         }
         dst += 4 * dstRowBytes;
-    }    
+    }
 }
 
 }  // namespace SkTextureCompressor
diff --git a/src/utils/mac/SkCreateCGImageRef.cpp b/src/utils/mac/SkCreateCGImageRef.cpp
index 3fd9057..7f15ed7 100644
--- a/src/utils/mac/SkCreateCGImageRef.cpp
+++ b/src/utils/mac/SkCreateCGImageRef.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/src/utils/win/SkAutoCoInitialize.cpp b/src/utils/win/SkAutoCoInitialize.cpp
index 83f23bd..3b7b42b 100644
--- a/src/utils/win/SkAutoCoInitialize.cpp
+++ b/src/utils/win/SkAutoCoInitialize.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/src/utils/win/SkIStream.cpp b/src/utils/win/SkIStream.cpp
index fdb6ce6..ad9bf05 100644
--- a/src/utils/win/SkIStream.cpp
+++ b/src/utils/win/SkIStream.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/src/utils/win/SkWGL.h b/src/utils/win/SkWGL.h
index d502eb0..5322d91 100644
--- a/src/utils/win/SkWGL.h
+++ b/src/utils/win/SkWGL.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/src/utils/win/SkWGL_win.cpp b/src/utils/win/SkWGL_win.cpp
index 5afcae9..65ffaf1 100644
--- a/src/utils/win/SkWGL_win.cpp
+++ b/src/utils/win/SkWGL_win.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/src/views/SkEvent.cpp b/src/views/SkEvent.cpp
index b90d03f..7b658c8 100644
--- a/src/views/SkEvent.cpp
+++ b/src/views/SkEvent.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/views/SkEventSink.cpp b/src/views/SkEventSink.cpp
index 003bf8c..1464fa0 100644
--- a/src/views/SkEventSink.cpp
+++ b/src/views/SkEventSink.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/views/SkTagList.cpp b/src/views/SkTagList.cpp
index b1d6ff6..27f3916 100644
--- a/src/views/SkTagList.cpp
+++ b/src/views/SkTagList.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/views/SkTagList.h b/src/views/SkTagList.h
index 1cff9ca..0b158e1 100644
--- a/src/views/SkTagList.h
+++ b/src/views/SkTagList.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/views/SkTouchGesture.cpp b/src/views/SkTouchGesture.cpp
index 676f8e9..5fc8d7e 100644
--- a/src/views/SkTouchGesture.cpp
+++ b/src/views/SkTouchGesture.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2010 Google Inc.
  *
diff --git a/src/views/SkViewPriv.cpp b/src/views/SkViewPriv.cpp
index 03541fd..7dbe5f1 100644
--- a/src/views/SkViewPriv.cpp
+++ b/src/views/SkViewPriv.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/src/views/SkViewPriv.h b/src/views/SkViewPriv.h
index 487e379..3b76457 100644
--- a/src/views/SkViewPriv.h
+++ b/src/views/SkViewPriv.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/src/views/mac/SkNSView.h b/src/views/mac/SkNSView.h
index 4befaee..779c51b 100644
--- a/src/views/mac/SkNSView.h
+++ b/src/views/mac/SkNSView.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/src/views/mac/SkOptionsTableView.h b/src/views/mac/SkOptionsTableView.h
index 1f9b36a..8fa03d1 100644
--- a/src/views/mac/SkOptionsTableView.h
+++ b/src/views/mac/SkOptionsTableView.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/src/views/mac/SkSampleNSView.h b/src/views/mac/SkSampleNSView.h
index d3aca9a..b7da9fd 100644
--- a/src/views/mac/SkSampleNSView.h
+++ b/src/views/mac/SkSampleNSView.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/src/views/mac/SkTextFieldCell.h b/src/views/mac/SkTextFieldCell.h
index 93d0e4d..dfca7ae 100644
--- a/src/views/mac/SkTextFieldCell.h
+++ b/src/views/mac/SkTextFieldCell.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/src/views/unix/SkOSWindow_Unix.cpp b/src/views/unix/SkOSWindow_Unix.cpp
index 7833bbe..7f9d168 100644
--- a/src/views/unix/SkOSWindow_Unix.cpp
+++ b/src/views/unix/SkOSWindow_Unix.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/src/views/unix/XkeysToSkKeys.h b/src/views/unix/XkeysToSkKeys.h
index 9cc9885..aced74c 100644
--- a/src/views/unix/XkeysToSkKeys.h
+++ b/src/views/unix/XkeysToSkKeys.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/src/views/unix/keysym2ucs.h b/src/views/unix/keysym2ucs.h
index 255a930..0287f02 100644
--- a/src/views/unix/keysym2ucs.h
+++ b/src/views/unix/keysym2ucs.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/src/views/win/SkOSWindow_win.cpp b/src/views/win/SkOSWindow_win.cpp
index ee851a1..8b0211d 100644
--- a/src/views/win/SkOSWindow_win.cpp
+++ b/src/views/win/SkOSWindow_win.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
@@ -557,7 +556,7 @@
         fCommandBuffer = SkCommandBufferGLContext::Create((HWND)fHWND, msaaSampleCount);
         if (!fCommandBuffer)
             return false;
-    
+
         SkAutoTUnref<const GrGLInterface> intf(GrGLCreateCommandBufferInterface());
         if (intf) {
             COMMAND_BUFFER_GL_CALL(intf, ClearStencil(0));
@@ -736,7 +735,7 @@
     WindowRect.left = 0;
     WindowRect.right = kWidth;
     WindowRect.top = 0;
-    WindowRect.bottom = kHeight;     
+    WindowRect.bottom = kHeight;
     ShowCursor(FALSE);
     AdjustWindowRectEx(&WindowRect, WS_POPUP, FALSE, WS_EX_APPWINDOW);
     HWND fsHWND = CreateWindowEx(
diff --git a/src/views/win/skia_win.cpp b/src/views/win/skia_win.cpp
index c15846d..8996dda 100644
--- a/src/views/win/skia_win.cpp
+++ b/src/views/win/skia_win.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
@@ -131,4 +130,3 @@
     }
     return 0;
 }
-
diff --git a/src/xml/SkBML_Verbs.h b/src/xml/SkBML_Verbs.h
index 709764d..17c3458 100644
--- a/src/xml/SkBML_Verbs.h
+++ b/src/xml/SkBML_Verbs.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/xml/SkBML_XMLParser.cpp b/src/xml/SkBML_XMLParser.cpp
index 1314608..31d5a99 100644
--- a/src/xml/SkBML_XMLParser.cpp
+++ b/src/xml/SkBML_XMLParser.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/xml/SkDOM.cpp b/src/xml/SkDOM.cpp
index 8b55f6c..15b458e 100644
--- a/src/xml/SkDOM.cpp
+++ b/src/xml/SkDOM.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/xml/SkXMLParser.cpp b/src/xml/SkXMLParser.cpp
index e283656..11f4c6b 100644
--- a/src/xml/SkXMLParser.cpp
+++ b/src/xml/SkXMLParser.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2006 The Android Open Source Project
  *
diff --git a/src/xml/SkXMLPullParser.cpp b/src/xml/SkXMLPullParser.cpp
index 34ad282..3e831a1 100644
--- a/src/xml/SkXMLPullParser.cpp
+++ b/src/xml/SkXMLPullParser.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/tests/AAClipTest.cpp b/tests/AAClipTest.cpp
index 1ea8506..42c320c 100644
--- a/tests/AAClipTest.cpp
+++ b/tests/AAClipTest.cpp
@@ -334,7 +334,7 @@
     // This rect should intersect the clip, but slice-out all of the "soft" parts,
     // leaving just a rect.
     const SkIRect ir = SkIRect::MakeLTRB(10, -10, 50, 90);
-    
+
     clip.op(ir, SkRegion::kIntersect_Op);
 
     REPORTER_ASSERT(reporter, clip.getBounds() == SkIRect::MakeLTRB(10, 0, 50, 90));
diff --git a/tests/AnnotationTest.cpp b/tests/AnnotationTest.cpp
index 4f904bd..d9d971a 100644
--- a/tests/AnnotationTest.cpp
+++ b/tests/AnnotationTest.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/tests/BitmapCopyTest.cpp b/tests/BitmapCopyTest.cpp
index 5793284..216e042 100644
--- a/tests/BitmapCopyTest.cpp
+++ b/tests/BitmapCopyTest.cpp
@@ -608,7 +608,7 @@
                                  gRec[i].fRequestedDstSize.height());
         bool success = srcBM.readPixels(dstInfo, dstPixels, rowBytes,
                                         gRec[i].fRequestedSrcLoc.x(), gRec[i].fRequestedSrcLoc.y());
-        
+
         REPORTER_ASSERT(reporter, gRec[i].fExpectedSuccess == success);
         if (success) {
             const SkIRect srcR = gRec[i].fExpectedSrcR;
@@ -695,7 +695,7 @@
                 refData = (kRGBA_8888_SkColorType == dstBmp.colorType()) ? kData : swizData;
 #elif defined(SK_PMCOLOR_IS_BGRA)
                 refData = (kBGRA_8888_SkColorType == dstBmp.colorType()) ? kData : swizData;
-#else 
+#else
     #error "PM Color must be BGRA or RGBA to use GPU backend."
 #endif
                 bool foundError = false;
diff --git a/tests/BlurTest.cpp b/tests/BlurTest.cpp
index dc3d6c7..8c726e9 100644
--- a/tests/BlurTest.cpp
+++ b/tests/BlurTest.cpp
@@ -559,7 +559,7 @@
 
 #if SK_SUPPORT_GPU
 
-// This exercises the problem discovered in crbug.com/570232. The return value from 
+// This exercises the problem discovered in crbug.com/570232. The return value from
 // SkBlurMask::BoxBlur wasn't being checked in SkBlurMaskFilter.cpp::GrRRectBlurEffect::Create
 DEF_GPUTEST_FOR_RENDERING_CONTEXTS(SmallBoxBlurBug, reporter, ctx) {
 
diff --git a/tests/CachedDataTest.cpp b/tests/CachedDataTest.cpp
index 6c44161..2502480 100644
--- a/tests/CachedDataTest.cpp
+++ b/tests/CachedDataTest.cpp
@@ -41,22 +41,22 @@
 static SkCachedData* test_locking(skiatest::Reporter* reporter,
                                   size_t size, SkDiscardableMemoryPool* pool) {
     SkCachedData* data = make_data(size, pool);
-    
+
     memset(data->writable_data(), 0x80, size);  // just to use writable_data()
 
     check_data(reporter, data, 1, kNotInCache, kLocked);
-    
+
     data->ref();
     check_data(reporter, data, 2, kNotInCache, kLocked);
     data->unref();
     check_data(reporter, data, 1, kNotInCache, kLocked);
-    
+
     data->attachToCacheAndRef();
     check_data(reporter, data, 2, kInCache, kLocked);
-    
+
     data->unref();
     check_data(reporter, data, 1, kInCache, kUnlocked);
-    
+
     data->ref();
     check_data(reporter, data, 2, kInCache, kLocked);
 
@@ -92,4 +92,3 @@
         data->detachFromCacheAndUnref();
     }
 }
-
diff --git a/tests/CanvasTest.cpp b/tests/CanvasTest.cpp
index 05ce604..02b875e 100644
--- a/tests/CanvasTest.cpp
+++ b/tests/CanvasTest.cpp
@@ -700,7 +700,7 @@
     n = canvas.saveLayer(nullptr, nullptr);
     REPORTER_ASSERT(reporter, 2 == n);
     REPORTER_ASSERT(reporter, 3 == canvas.getSaveCount());
-    
+
     canvas.restore();
     REPORTER_ASSERT(reporter, 2 == canvas.getSaveCount());
     canvas.restore();
diff --git a/tests/ClipBoundsTest.cpp b/tests/ClipBoundsTest.cpp
index b5b9cae..2f9e13d 100644
--- a/tests/ClipBoundsTest.cpp
+++ b/tests/ClipBoundsTest.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2015 Google Inc.
  *
diff --git a/tests/CodexTest.cpp b/tests/CodexTest.cpp
index be25dc3..bdb5e77 100644
--- a/tests/CodexTest.cpp
+++ b/tests/CodexTest.cpp
@@ -637,7 +637,7 @@
         return;
     }
     SkAutoTDelete<SkCodec> decoder(SkCodec::NewFromStream(stream.release()));
-    
+
     // This should return kSuccess because kIndex8 is supported.
     SkPMColor colorStorage[256];
     int colorCount;
diff --git a/tests/ColorFilterTest.cpp b/tests/ColorFilterTest.cpp
index 822fb0b..cf542db 100644
--- a/tests/ColorFilterTest.cpp
+++ b/tests/ColorFilterTest.cpp
@@ -165,17 +165,17 @@
     matrix[1] = 0.7152f - 0.7152f * amount;
     matrix[2] = 1.f - (matrix[0] + matrix[1]);
     matrix[3] = matrix[4] = 0.f;
-    
+
     matrix[5] = 0.2126f - 0.2126f * amount;
     matrix[6] = 0.7152f + 0.2848f * amount;
     matrix[7] = 1.f - (matrix[5] + matrix[6]);
     matrix[8] = matrix[9] = 0.f;
-    
+
     matrix[10] = 0.2126f - 0.2126f * amount;
     matrix[11] = 0.7152f - 0.7152f * amount;
     matrix[12] = 1.f - (matrix[10] + matrix[11]);
     matrix[13] = matrix[14] = 0.f;
-    
+
     matrix[15] = matrix[16] = matrix[17] = matrix[19] = 0.f;
     matrix[18] = 1.f;
 }
diff --git a/tests/DataRefTest.cpp b/tests/DataRefTest.cpp
index a474019..03b80fb 100644
--- a/tests/DataRefTest.cpp
+++ b/tests/DataRefTest.cpp
@@ -271,7 +271,7 @@
 static void check_alphabet_buffer(skiatest::Reporter* reporter, const SkROBuffer* reader) {
     size_t size = reader->size();
     REPORTER_ASSERT(reporter, size % 26 == 0);
-    
+
     SkAutoTMalloc<char> storage(size);
     SkROBuffer::Iter iter(reader);
     size_t offset = 0;
diff --git a/tests/FloatingPointTextureTest.cpp b/tests/FloatingPointTextureTest.cpp
index 3a8d63c..a20b8a2 100644
--- a/tests/FloatingPointTextureTest.cpp
+++ b/tests/FloatingPointTextureTest.cpp
@@ -62,7 +62,7 @@
 
 DEF_GPUTEST_FOR_RENDERING_CONTEXTS(FloatingPointTextureTest, reporter, context) {
     runFPTest<float>(reporter, context, FLT_MIN, FLT_MAX, FLT_EPSILON,
-                     kMaxIntegerRepresentableInSPFloatingPoint, 
+                     kMaxIntegerRepresentableInSPFloatingPoint,
                      FP_CONTROL_ARRAY_SIZE, kRGBA_float_GrPixelConfig);
 }
 
diff --git a/tests/FontMgrAndroidParserTest.cpp b/tests/FontMgrAndroidParserTest.cpp
index a56331e..5f6ff06 100644
--- a/tests/FontMgrAndroidParserTest.cpp
+++ b/tests/FontMgrAndroidParserTest.cpp
@@ -213,4 +213,3 @@
         SkDebugf("---- Resource files missing for FontConfigParser test\n");
     }
 }
-
diff --git a/tests/GLProgramsTest.cpp b/tests/GLProgramsTest.cpp
index 6b8efeb..03938fb 100644
--- a/tests/GLProgramsTest.cpp
+++ b/tests/GLProgramsTest.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/tests/GeometryTest.cpp b/tests/GeometryTest.cpp
index f89914f..17e4644 100644
--- a/tests/GeometryTest.cpp
+++ b/tests/GeometryTest.cpp
@@ -58,7 +58,7 @@
             SkEvalQuadAt(pts, t, &r0);
             SkPoint r1 = SkEvalQuadAt(pts, t);
             check_pairs(reporter, i, t, "quad-pos", r0.fX, r0.fY, r1.fX, r1.fY);
-            
+
             SkVector v0;
             SkEvalQuadAt(pts, t, nullptr, &v0);
             SkVector v1 = SkEvalQuadTangentAt(pts, t);
diff --git a/tests/GpuColorFilterTest.cpp b/tests/GpuColorFilterTest.cpp
index 714555a..186f8c6 100644
--- a/tests/GpuColorFilterTest.cpp
+++ b/tests/GpuColorFilterTest.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2013 Google Inc.
  *
diff --git a/tests/GrDrawTargetTest.cpp b/tests/GrDrawTargetTest.cpp
index bbc2b91..30fc0a2 100644
--- a/tests/GrDrawTargetTest.cpp
+++ b/tests/GrDrawTargetTest.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2013 Google Inc.
  *
diff --git a/tests/GrPorterDuffTest.cpp b/tests/GrPorterDuffTest.cpp
index f738c97..54fcfc1 100644
--- a/tests/GrPorterDuffTest.cpp
+++ b/tests/GrPorterDuffTest.cpp
@@ -286,9 +286,9 @@
 }
 static void test_color_unknown_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
     GrPipelineOptimizations optimizations;
-    optimizations.fColorPOI.calcWithInitialValues(nullptr, 0, 0, kNone_GrColorComponentFlags, 
+    optimizations.fColorPOI.calcWithInitialValues(nullptr, 0, 0, kNone_GrColorComponentFlags,
                                                   false);
-    optimizations.fCoveragePOI.calcWithInitialValues(nullptr, 0, 0, kNone_GrColorComponentFlags, 
+    optimizations.fCoveragePOI.calcWithInitialValues(nullptr, 0, 0, kNone_GrColorComponentFlags,
                                                      true);
 
     SkASSERT(!optimizations.fColorPOI.isOpaque());
@@ -482,7 +482,7 @@
     GrPipelineOptimizations optimizations;
     optimizations.fColorPOI.calcWithInitialValues(nullptr, 0, GrColorPackRGBA(229, 0, 154, 0),
                                    kR_GrColorComponentFlag | kB_GrColorComponentFlag, false);
-    optimizations.fCoveragePOI.calcWithInitialValues(nullptr, 0, GrColorPackA4(255), 
+    optimizations.fCoveragePOI.calcWithInitialValues(nullptr, 0, GrColorPackA4(255),
                                                      kRGBA_GrColorComponentFlags, true);
 
     SkASSERT(!optimizations.fColorPOI.isOpaque());
@@ -684,9 +684,9 @@
 
 static void test_color_opaque_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
     GrPipelineOptimizations optimizations;
-    optimizations.fColorPOI.calcWithInitialValues(nullptr, 0, GrColorPackA4(255), 
+    optimizations.fColorPOI.calcWithInitialValues(nullptr, 0, GrColorPackA4(255),
                                                   kA_GrColorComponentFlag, false);
-    optimizations.fCoveragePOI.calcWithInitialValues(nullptr, 0, 0, kNone_GrColorComponentFlags, 
+    optimizations.fCoveragePOI.calcWithInitialValues(nullptr, 0, 0, kNone_GrColorComponentFlags,
                                                      true);
 
     SkASSERT(optimizations.fColorPOI.isOpaque());
@@ -885,7 +885,7 @@
     GrPipelineOptimizations optimizations;
     optimizations.fColorPOI.calcWithInitialValues(nullptr, 0, GrColorPackRGBA(0, 82, 0, 255),
                                    kG_GrColorComponentFlag | kA_GrColorComponentFlag, false);
-    optimizations.fCoveragePOI.calcWithInitialValues(nullptr, 0, GrColorPackA4(255), 
+    optimizations.fCoveragePOI.calcWithInitialValues(nullptr, 0, GrColorPackA4(255),
                                                      kRGBA_GrColorComponentFlags, true);
 
     SkASSERT(optimizations.fColorPOI.isOpaque());
@@ -1098,7 +1098,7 @@
         TestLCDCoverageBatch() : INHERITED(ClassID()) {}
 
     private:
-        void computePipelineOptimizations(GrInitInvariantOutput* color, 
+        void computePipelineOptimizations(GrInitInvariantOutput* color,
                                           GrInitInvariantOutput* coverage,
                                           GrBatchToXPOverrides* overrides) const override {
             color->setKnownFourComponents(GrColorPackRGBA(123, 45, 67, 221));
@@ -1186,11 +1186,11 @@
 
     for (size_t c = 0; c < SK_ARRAY_COUNT(testColors); c++) {
         GrPipelineOptimizations optimizations;
-        optimizations.fColorPOI.calcWithInitialValues(nullptr, 0, testColors[c], testColorFlags[c], 
+        optimizations.fColorPOI.calcWithInitialValues(nullptr, 0, testColors[c], testColorFlags[c],
                                                       false);
         for (int f = 0; f <= 1; f++) {
             if (!f) {
-                optimizations.fCoveragePOI.calcWithInitialValues(nullptr, 0, 0, 
+                optimizations.fCoveragePOI.calcWithInitialValues(nullptr, 0, 0,
                                                                  kNone_GrColorComponentFlags, true);
             } else {
                 optimizations.fCoveragePOI.calcWithInitialValues(nullptr, 0, GrColorPackA4(255),
@@ -1217,4 +1217,3 @@
 }
 
 #endif
-
diff --git a/tests/GrTRecorderTest.cpp b/tests/GrTRecorderTest.cpp
index cef870f..0be0f68 100644
--- a/tests/GrTRecorderTest.cpp
+++ b/tests/GrTRecorderTest.cpp
@@ -40,7 +40,7 @@
 
             for (int i = 0; i < 100; ++i) {
                 if (data) {
-                    REPORTER_ASSERT(reporter, i == *GrNEW_APPEND_TO_RECORDER(recorder, 
+                    REPORTER_ASSERT(reporter, i == *GrNEW_APPEND_TO_RECORDER(recorder,
                                                                              IntWrapper, (i)));
                 } else {
                     REPORTER_ASSERT(reporter, i ==
diff --git a/tests/GradientTest.cpp b/tests/GradientTest.cpp
index 0014089..ac55d99 100644
--- a/tests/GradientTest.cpp
+++ b/tests/GradientTest.cpp
@@ -34,7 +34,7 @@
     SkMatrix matrix;
     matrix.setAffine(affine);
     c.concat(matrix);
-    
+
     c.drawPaint(paint);
 }
 
diff --git a/tests/ImageCacheTest.cpp b/tests/ImageCacheTest.cpp
index 89d2f8d..c2cf2d9 100644
--- a/tests/ImageCacheTest.cpp
+++ b/tests/ImageCacheTest.cpp
@@ -32,7 +32,7 @@
     static bool Visitor(const SkResourceCache::Rec& baseRec, void* context) {
         const TestingRec& rec = static_cast<const TestingRec&>(baseRec);
         intptr_t* result = (intptr_t*)context;
-        
+
         *result = rec.fValue;
         return true;
     }
diff --git a/tests/ImageFilterCacheTest.cpp b/tests/ImageFilterCacheTest.cpp
index 938c048..89c6dcf 100644
--- a/tests/ImageFilterCacheTest.cpp
+++ b/tests/ImageFilterCacheTest.cpp
@@ -233,4 +233,3 @@
     test_explicit_purging(reporter, fullImg, subsetImg);
 }
 #endif
-
diff --git a/tests/ImageFilterTest.cpp b/tests/ImageFilterTest.cpp
index 8268f95..e4ab1ac 100644
--- a/tests/ImageFilterTest.cpp
+++ b/tests/ImageFilterTest.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2013 Google Inc.
  *
@@ -567,7 +566,7 @@
 
     SkAutoTUnref<SkGpuDevice> device(SkGpuDevice::Create(context,
                                                          SkBudgeted::kNo,
-                                                         SkImageInfo::MakeN32Premul(widthHeight, 
+                                                         SkImageInfo::MakeN32Premul(widthHeight,
                                                                                     widthHeight),
                                                          0,
                                                          &props,
diff --git a/tests/MatrixTest.cpp b/tests/MatrixTest.cpp
index f08613f..1399bf2 100644
--- a/tests/MatrixTest.cpp
+++ b/tests/MatrixTest.cpp
@@ -93,10 +93,10 @@
     SkMatrix m;
     m.reset();
     assert9(reporter, m, 1, 0, 0, 0, 1, 0, 0, 0, 1);
-    
+
     m.setScale(2, 3);
     assert9(reporter, m, 2, 0, 0, 0, 3, 0, 0, 0, 1);
-    
+
     m.postTranslate(4, 5);
     assert9(reporter, m, 2, 0, 4, 0, 3, 5, 0, 0, 1);
 
diff --git a/tests/MemsetTest.cpp b/tests/MemsetTest.cpp
index 854b3c5..e1f844e 100644
--- a/tests/MemsetTest.cpp
+++ b/tests/MemsetTest.cpp
@@ -22,7 +22,7 @@
     REPORTER_ASSERT(reporter, alloc->contains(ptr));
     return ptr;
 }
-                        
+
 static void test_chunkalloc(skiatest::Reporter* reporter) {
     static const size_t kMin = 1024;
     SkChunkAlloc alloc(kMin);
diff --git a/tests/PaintTest.cpp b/tests/PaintTest.cpp
index 0e92e65..945c8a1 100644
--- a/tests/PaintTest.cpp
+++ b/tests/PaintTest.cpp
@@ -367,4 +367,3 @@
     paint.setColorFilter(SkColorFilter::MakeMatrixFilterRowMajor255(cm.fMat));
     REPORTER_ASSERT(r, !paint.nothingToDraw());
 }
-
diff --git a/tests/PathOpsBattles.cpp b/tests/PathOpsBattles.cpp
index 6e0d3a4..32ba96c 100644
--- a/tests/PathOpsBattles.cpp
+++ b/tests/PathOpsBattles.cpp
@@ -400,7 +400,7 @@
     SkPath path2(path);
     testPathOp(reporter, path1, path2, (SkPathOp) 2, filename);
 }
-// ../../third_party/tcmalloc/chromium/src/free_list.h:118] Memory corruption detected. 
+// ../../third_party/tcmalloc/chromium/src/free_list.h:118] Memory corruption detected.
 
 static void battleOp13(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
diff --git a/tests/PathOpsBuilderConicTest.cpp b/tests/PathOpsBuilderConicTest.cpp
index 6bb5c70..65adcf0 100644
--- a/tests/PathOpsBuilderConicTest.cpp
+++ b/tests/PathOpsBuilderConicTest.cpp
@@ -111,7 +111,7 @@
                         }
                     }
                     setupOne(reporter, col, row, rot, trial);
-            skipTest: 
+            skipTest:
                     ;
                 }
             }
@@ -403,7 +403,7 @@
 path.moveTo(306.588f, -227.984f);
 path.conicTo(212.465f, -262.242f, 95.5512f, 58.9764f, 0.707107f);
 path.lineTo(306.588f, -227.984f);
-path.close();    
+path.close();
 testSimplify(reporter, path, __FUNCTION__);
 }
 
diff --git a/tests/PathOpsConicIntersectionTest.cpp b/tests/PathOpsConicIntersectionTest.cpp
index 889a41c..624a68a 100644
--- a/tests/PathOpsConicIntersectionTest.cpp
+++ b/tests/PathOpsConicIntersectionTest.cpp
@@ -13,7 +13,7 @@
 manually compute the intersection of a pair of circles and see if the conic intersection matches
   given two circles
     construct a line connecting their centers
-    
+
  */
 
 static const SkDConic testSet[] = {
@@ -21,10 +21,10 @@
     {{{{377.218994,-141.981003}, {40.578701,-201.339996}, {23.1854992,-102.697998}}}, 0.707107008f},
 
     {{{{5.1114602088928223, 628.77813720703125},
-        {10.834027290344238, 988.964111328125}, 
+        {10.834027290344238, 988.964111328125},
         {163.40835571289062, 988.964111328125}}}, 0.72944212f},
-    {{{{163.40835571289062, 988.964111328125}, 
-        {5, 988.964111328125}, 
+    {{{{163.40835571289062, 988.964111328125},
+        {5, 988.964111328125},
         {5, 614.7423095703125}}}, 0.707106769f},
 
     {{{{11.17222976684570312, -8.103978157043457031},
@@ -116,8 +116,8 @@
 
 static void writeDPng(const SkDConic& dC, const char* name) {
     const int scale = 5;
-    SkDConic dConic = {{{ {dC.fPts[0].fX * scale, dC.fPts[0].fY * scale }, 
-        {dC.fPts[1].fX * scale, dC.fPts[1].fY * scale }, 
+    SkDConic dConic = {{{ {dC.fPts[0].fX * scale, dC.fPts[0].fY * scale },
+        {dC.fPts[1].fX * scale, dC.fPts[1].fY * scale },
         {dC.fPts[2].fX * scale, dC.fPts[2].fY * scale }}}, dC.fWeight };
     SkBitmap bitmap;
     SkDRect bounds;
@@ -226,7 +226,7 @@
 };
 
 const SkDConic* frames[] = {
-    frame0, frame1, frame2, frame3, frame4, frame5, frame6 
+    frame0, frame1, frame2, frame3, frame4, frame5, frame6
 };
 
 const int frameSizes[] = { (int) SK_ARRAY_COUNT(frame0), (int) SK_ARRAY_COUNT(frame1),
@@ -244,8 +244,8 @@
         int frameSize = frameSizes[index];
         for (int fIndex = 0; fIndex < frameSize; ++fIndex) {
             const SkDConic& dC = frames[index][fIndex];
-            SkDConic dConic = {{{ {dC.fPts[0].fX * scale, dC.fPts[0].fY * scale }, 
-                {dC.fPts[1].fX * scale, dC.fPts[1].fY * scale }, 
+            SkDConic dConic = {{{ {dC.fPts[0].fX * scale, dC.fPts[0].fY * scale },
+                {dC.fPts[1].fX * scale, dC.fPts[1].fY * scale },
                 {dC.fPts[2].fX * scale, dC.fPts[2].fY * scale }}}, dC.fWeight };
             SkDRect dBounds;
             dBounds.setBounds(dConic);
@@ -273,8 +273,8 @@
         canvas.drawColor(SK_ColorWHITE);
         for (int fIndex = 0; fIndex < frameSize; ++fIndex) {
             const SkDConic& dC = frames[index][fIndex];
-            SkDConic dConic = {{{ {dC.fPts[0].fX * scale, dC.fPts[0].fY * scale }, 
-                {dC.fPts[1].fX * scale, dC.fPts[1].fY * scale }, 
+            SkDConic dConic = {{{ {dC.fPts[0].fX * scale, dC.fPts[0].fY * scale },
+                {dC.fPts[1].fX * scale, dC.fPts[1].fY * scale },
                 {dC.fPts[2].fX * scale, dC.fPts[2].fY * scale }}}, dC.fWeight };
             SkPath path;
             path.moveTo(dConic.fPts[0].asSkPoint());
diff --git a/tests/PathOpsConicLineIntersectionTest.cpp b/tests/PathOpsConicLineIntersectionTest.cpp
index 2a958ed..6219506 100644
--- a/tests/PathOpsConicLineIntersectionTest.cpp
+++ b/tests/PathOpsConicLineIntersectionTest.cpp
@@ -21,7 +21,7 @@
     {
      {{{{30.6499996,25.6499996}, {30.6499996,20.6499996}, {25.6499996,20.6499996}}}, 0.707107008f},
       {{{25.6499996,20.6499996}, {45.6500015,20.6499996}}},
-          1, 
+          1,
        {{25.6499996,20.6499996}, {0,0}}
     },
 };
@@ -100,7 +100,7 @@
         const SkDLine& line = lineConicTests[index].line;
         SkASSERT(ValidLine(line));
         SkReduceOrder reducer;
-        SkPoint pts[3] = { conic.fPts.fPts[0].asSkPoint(), conic.fPts.fPts[1].asSkPoint(), 
+        SkPoint pts[3] = { conic.fPts.fPts[0].asSkPoint(), conic.fPts.fPts[1].asSkPoint(),
             conic.fPts.fPts[2].asSkPoint() };
         SkPoint reduced[3];
         SkPath::Verb order1 = SkReduceOrder::Conic(pts, conic.fWeight, reduced);
diff --git a/tests/PathOpsOpTest.cpp b/tests/PathOpsOpTest.cpp
index 7de910c..1443198 100644
--- a/tests/PathOpsOpTest.cpp
+++ b/tests/PathOpsOpTest.cpp
@@ -3846,7 +3846,7 @@
 static void complex_to_quads(const SkPoint pts[], SkPath* path) {
     SkScalar loopT;
     if (SkDCubic::ComplexBreak(pts, &loopT)) {
-        SkPoint cubicPair[7]; 
+        SkPoint cubicPair[7];
         SkChopCubicAt(pts, cubicPair, loopT);
         SkDCubic c1, c2;
         c1.set(cubicPair);
diff --git a/tests/PathOpsTSectDebug.h b/tests/PathOpsTSectDebug.h
index 68ef4b7..4e04db7 100644
--- a/tests/PathOpsTSectDebug.h
+++ b/tests/PathOpsTSectDebug.h
@@ -195,7 +195,7 @@
     dumpID();
     SkDebugf(" bounds=(%1.9g,%1.9g, %1.9g,%1.9g) boundsMax=%1.9g%s\n",
             fBounds.fLeft, fBounds.fTop, fBounds.fRight, fBounds.fBottom, fBoundsMax,
-            fCollapsed ? " collapsed" : ""); 
+            fCollapsed ? " collapsed" : "");
 }
 
 template<typename TCurve, typename OppCurve>
diff --git a/tests/PathOpsTestCommon.cpp b/tests/PathOpsTestCommon.cpp
index f685225..8cc8fe8 100644
--- a/tests/PathOpsTestCommon.cpp
+++ b/tests/PathOpsTestCommon.cpp
@@ -237,7 +237,7 @@
                     lo = hi;
                 }
                 break;
-            } 
+            }
             case SkPath::kClose_Verb:
                  simplePath->close();
                 break;
diff --git a/tests/Point3Test.cpp b/tests/Point3Test.cpp
index bf3b902..2dedd6b 100644
--- a/tests/Point3Test.cpp
+++ b/tests/Point3Test.cpp
@@ -76,7 +76,7 @@
     REPORTER_ASSERT(reporter, SkScalarNearlyEqual(dot, SK_ScalarRoot2Over2));
 }
 
-static void test_length(skiatest::Reporter* reporter, 
+static void test_length(skiatest::Reporter* reporter,
                         SkScalar x, SkScalar y, SkScalar z, SkScalar expectedLen) {
     SkPoint3 point = SkPoint3::Make(x, y, z);
 
@@ -115,7 +115,7 @@
         SkScalar fX;
         SkScalar fY;
         SkScalar fZ;
-        SkScalar fLength;    
+        SkScalar fLength;
     } gRec[] = {
         { 0.0f, 0.0f, 0.0f, 0.0f },
         { 0.3f, 0.4f, 0.5f, SK_ScalarRoot2Over2 },
diff --git a/tests/PointTest.cpp b/tests/PointTest.cpp
index 84ea865..c0d1f26 100644
--- a/tests/PointTest.cpp
+++ b/tests/PointTest.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/tests/PremulAlphaRoundTripTest.cpp b/tests/PremulAlphaRoundTripTest.cpp
index e0060d6..5cc7a49 100644
--- a/tests/PremulAlphaRoundTripTest.cpp
+++ b/tests/PremulAlphaRoundTripTest.cpp
@@ -114,4 +114,3 @@
     test_premul_alpha_roundtrip(reporter, device);
 }
 #endif
-
diff --git a/tests/PrimitiveProcessorTest.cpp b/tests/PrimitiveProcessorTest.cpp
index 922b4fd..52210f2 100644
--- a/tests/PrimitiveProcessorTest.cpp
+++ b/tests/PrimitiveProcessorTest.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2016 Google Inc.
  *
diff --git a/tests/ReadPixelsTest.cpp b/tests/ReadPixelsTest.cpp
index b538fc8..e6552108 100644
--- a/tests/ReadPixelsTest.cpp
+++ b/tests/ReadPixelsTest.cpp
@@ -52,7 +52,7 @@
     }
     return SkPremultiplyARGBInline(a, r, g, b);
 }
-    
+
 static SkPMColor get_dst_bmp_init_color(int x, int y, int w) {
     int n = y * w + x;
 
diff --git a/tests/RecordReplaceDrawTest.cpp b/tests/RecordReplaceDrawTest.cpp
index 73c6647..fe11106 100644
--- a/tests/RecordReplaceDrawTest.cpp
+++ b/tests/RecordReplaceDrawTest.cpp
@@ -137,7 +137,7 @@
     if (doReplace) {
         REPORTER_ASSERT(r, 0 == numLayers);
     } else {
-        REPORTER_ASSERT(r, 1 == numLayers);    
+        REPORTER_ASSERT(r, 1 == numLayers);
     }
 }
 
diff --git a/tests/RecordTest.cpp b/tests/RecordTest.cpp
index 1b4077c..a67d7e8 100644
--- a/tests/RecordTest.cpp
+++ b/tests/RecordTest.cpp
@@ -116,4 +116,3 @@
         REPORTER_ASSERT(r, is_aligned(record.alloc<uint64_t>()));
     }
 }
-
diff --git a/tests/RectangleTextureTest.cpp b/tests/RectangleTextureTest.cpp
index 2943c25..114207d 100644
--- a/tests/RectangleTextureTest.cpp
+++ b/tests/RectangleTextureTest.cpp
@@ -137,7 +137,7 @@
     }
 }
 
-DEF_GPUTEST_FOR_RENDERING_CONTEXTS(RectangleTexture, reporter, context, glContext) {    
+DEF_GPUTEST_FOR_RENDERING_CONTEXTS(RectangleTexture, reporter, context, glContext) {
     static const int kWidth = 13;
     static const int kHeight = 13;
 
diff --git a/tests/RefDictTest.cpp b/tests/RefDictTest.cpp
index af30f86..f3ba657 100644
--- a/tests/RefDictTest.cpp
+++ b/tests/RefDictTest.cpp
@@ -10,7 +10,7 @@
 
 class TestRC : public SkRefCnt {
 public:
-    
+
 private:
     typedef SkRefCnt INHERITED;
 };
diff --git a/tests/RoundRectTest.cpp b/tests/RoundRectTest.cpp
index 02dad22..37f5318 100644
--- a/tests/RoundRectTest.cpp
+++ b/tests/RoundRectTest.cpp
@@ -693,7 +693,7 @@
     }
 }
 
-// Test out the case where an oval already off in space is translated/scaled 
+// Test out the case where an oval already off in space is translated/scaled
 // further off into space - yielding numerical issues when the rect & radii
 // are transformed separatly
 // BUG=skia:2696
@@ -715,9 +715,9 @@
     SkScalar halfHeight = SkScalarHalf(dst.height());
 
     for (int i = 0; i < 4; ++i) {
-        REPORTER_ASSERT(reporter, 
+        REPORTER_ASSERT(reporter,
                         SkScalarNearlyEqual(dst.radii((SkRRect::Corner)i).fX, halfWidth));
-        REPORTER_ASSERT(reporter, 
+        REPORTER_ASSERT(reporter,
                         SkScalarNearlyEqual(dst.radii((SkRRect::Corner)i).fY, halfHeight));
     }
 }
diff --git a/tests/SerializationTest.cpp b/tests/SerializationTest.cpp
index f8d6ea4..f6b1275 100644
--- a/tests/SerializationTest.cpp
+++ b/tests/SerializationTest.cpp
@@ -293,7 +293,7 @@
 
 static SkBitmap draw_picture(SkPicture& picture) {
      SkBitmap bitmap;
-     bitmap.allocN32Pixels(SkScalarCeilToInt(picture.cullRect().width()), 
+     bitmap.allocN32Pixels(SkScalarCeilToInt(picture.cullRect().width()),
                            SkScalarCeilToInt(picture.cullRect().height()));
      SkCanvas canvas(bitmap);
      picture.playback(&canvas);
@@ -333,8 +333,8 @@
     // Paint some text.
     SkPictureRecorder recorder;
     SkIRect canvasRect = SkIRect::MakeWH(kBitmapSize, kBitmapSize);
-    SkCanvas* canvas = recorder.beginRecording(SkIntToScalar(canvasRect.width()), 
-                                               SkIntToScalar(canvasRect.height()), 
+    SkCanvas* canvas = recorder.beginRecording(SkIntToScalar(canvasRect.width()),
+                                               SkIntToScalar(canvasRect.height()),
                                                nullptr, 0);
     canvas->drawColor(SK_ColorWHITE);
     canvas->drawText(text, 2, 24, 32, paint);
@@ -599,17 +599,17 @@
 DEF_TEST(Annotations, reporter) {
     SkPictureRecorder recorder;
     SkCanvas* recordingCanvas = recorder.beginRecording(SkRect::MakeWH(100, 100));
-    
+
     const char* str0 = "rect-with-url";
     const SkRect r0 = SkRect::MakeWH(10, 10);
     SkAutoTUnref<SkData> d0(SkData::NewWithCString(str0));
     SkAnnotateRectWithURL(recordingCanvas, r0, d0);
-    
+
     const char* str1 = "named-destination";
     const SkRect r1 = SkRect::MakeXYWH(5, 5, 0, 0); // collapsed to a point
     SkAutoTUnref<SkData> d1(SkData::NewWithCString(str1));
     SkAnnotateNamedDestination(recordingCanvas, {r1.x(), r1.y()}, d1);
-    
+
     const char* str2 = "link-to-destination";
     const SkRect r2 = SkRect::MakeXYWH(20, 20, 5, 6);
     SkAutoTUnref<SkData> d2(SkData::NewWithCString(str2));
@@ -627,4 +627,3 @@
     TestAnnotationCanvas canvas(reporter, recs, SK_ARRAY_COUNT(recs));
     canvas.drawPicture(pict1);
 }
-
diff --git a/tests/SpecialImageTest.cpp b/tests/SpecialImageTest.cpp
index bd07115..770810a 100644
--- a/tests/SpecialImageTest.cpp
+++ b/tests/SpecialImageTest.cpp
@@ -43,7 +43,7 @@
     p.setAntiAlias(false);
 
     temp.drawRect(SkRect::MakeXYWH(SkIntToScalar(kPad), SkIntToScalar(kPad),
-                                   SkIntToScalar(kSmallerSize), SkIntToScalar(kSmallerSize)), 
+                                   SkIntToScalar(kSmallerSize), SkIntToScalar(kSmallerSize)),
                   p);
 
     return bm;
@@ -292,7 +292,7 @@
 
     {
         sk_sp<SkSpecialImage> subSImg1(SkSpecialImage::MakeFromGpu(
-                                                               nullptr, subset, 
+                                                               nullptr, subset,
                                                                kNeedNewImageUniqueID_SpecialImage,
                                                                texture));
         test_image(subSImg1, reporter, false, true, kPad, kFullSize);
diff --git a/tests/StreamTest.cpp b/tests/StreamTest.cpp
index a3df8d7..fe4da0f 100644
--- a/tests/StreamTest.cpp
+++ b/tests/StreamTest.cpp
@@ -283,9 +283,9 @@
     }
 }
 
-// This test uses file system operations that don't work out of the 
-// box on iOS. It's likely that we don't need them on iOS. Ignoring for now. 
-// TODO(stephana): Re-evaluate if we need this in the future. 
+// This test uses file system operations that don't work out of the
+// box on iOS. It's likely that we don't need them on iOS. Ignoring for now.
+// TODO(stephana): Re-evaluate if we need this in the future.
 #ifndef SK_BUILD_FOR_IOS
 DEF_TEST(StreamPeek, reporter) {
     // Test a memory stream.
@@ -434,4 +434,3 @@
     SkAutoTDelete<SkStreamAsset> asset(tmp.detachAsStream());
     REPORTER_ASSERT(r, nullptr == asset->getMemoryBase());
 }
-
diff --git a/tests/SubsetPath.h b/tests/SubsetPath.h
index 65067d1..9e4d231 100644
--- a/tests/SubsetPath.h
+++ b/tests/SubsetPath.h
@@ -11,15 +11,15 @@
 #include "SkTDArray.h"
 
 /* Given a path, generate a the desired minimal subset of the original.
-   
+
    This does a binary divide-and-conquer on the path, first splitting by
    contours, and then by verbs. The caller passes whether the previous subset
    behaved the same as the original. If not, the subset() call restores the
    prior state before returning a new subset.
-   
+
    If a path fails a local test, this reduces the data to the
    minimal set that fails using a pattern like:
-   
+
    bool testFailed = true;
    SkPath minimal;
    SubsetContours subsetContours(testPath);
diff --git a/tests/Test.h b/tests/Test.h
index 411ce11..4b19a85 100644
--- a/tests/Test.h
+++ b/tests/Test.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2011 Google Inc.
  *
diff --git a/tests/TestTest.cpp b/tests/TestTest.cpp
index 2c303a7..890042e 100644
--- a/tests/TestTest.cpp
+++ b/tests/TestTest.cpp
@@ -72,4 +72,3 @@
     REPORTER_ASSERT(reporter, glContext);
 }
 #endif
-
diff --git a/tests/TextureCompressionTest.cpp b/tests/TextureCompressionTest.cpp
index 0908660..e1992a0 100644
--- a/tests/TextureCompressionTest.cpp
+++ b/tests/TextureCompressionTest.cpp
@@ -58,7 +58,7 @@
     SkAutoPixmapStorage pixmap;
     pixmap.alloc(SkImageInfo::MakeA8(kWidth, kHeight));
     // leaving the pixels uninitialized, as they don't affect the test...
-    
+
     for (int i = 0; i < SkTextureCompressor::kFormatCnt; ++i) {
         const SkTextureCompressor::Format fmt = static_cast<SkTextureCompressor::Format>(i);
         if (!compresses_a8(fmt)) {
diff --git a/tests/TopoSortTest.cpp b/tests/TopoSortTest.cpp
index 358cd8d..9cee485 100644
--- a/tests/TopoSortTest.cpp
+++ b/tests/TopoSortTest.cpp
@@ -121,7 +121,7 @@
 
     for (size_t i = 0; i < SK_ARRAY_COUNT(tests); ++i) {
         SkTDArray<sk_tool_utils::TopoTestNode*> graph;
-        
+
         (tests[i].fCreate)(&graph);
 
         sk_tool_utils::TopoTestNode::Shuffle(&graph, &rand);
@@ -139,4 +139,3 @@
         sk_tool_utils::TopoTestNode::DeallocNodes(&graph);
     }
 }
-
diff --git a/tests/UtilsTest.cpp b/tests/UtilsTest.cpp
index c431abc..b38bb9f 100644
--- a/tests/UtilsTest.cpp
+++ b/tests/UtilsTest.cpp
@@ -14,7 +14,7 @@
 
 class RefClass : public SkRefCnt {
 public:
-    
+
 
     RefClass(int n) : fN(n) {}
     int get() const { return fN; }
diff --git a/tests/VkClearTests.cpp b/tests/VkClearTests.cpp
index 586d7e7..7cca4e4 100644
--- a/tests/VkClearTests.cpp
+++ b/tests/VkClearTests.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2015 Google Inc.
  *
diff --git a/tests/VkUploadPixelsTests.cpp b/tests/VkUploadPixelsTests.cpp
index 9fc4952..53d9cfc 100644
--- a/tests/VkUploadPixelsTests.cpp
+++ b/tests/VkUploadPixelsTests.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2015 Google Inc.
  *
diff --git a/tests/VkWrapTests.cpp b/tests/VkWrapTests.cpp
index fe954fa..472664b 100755
--- a/tests/VkWrapTests.cpp
+++ b/tests/VkWrapTests.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2016 Google Inc.
  *
diff --git a/tests/Writer32Test.cpp b/tests/Writer32Test.cpp
index 67896f0..5c24259 100644
--- a/tests/Writer32Test.cpp
+++ b/tests/Writer32Test.cpp
@@ -288,14 +288,14 @@
         SkWriter32::WriteDataSize(data0),
         SkWriter32::WriteDataSize(data1),
     };
-    
+
     SkSWriter32<1000> writer;
     size_t sizeWritten = 0;
 
     writer.writeData(nullptr);
     sizeWritten += sizes[0];
     REPORTER_ASSERT(reporter, sizeWritten == writer.bytesWritten());
-    
+
     writer.writeData(data0);
     sizeWritten += sizes[1];
     REPORTER_ASSERT(reporter, sizeWritten == writer.bytesWritten());
@@ -315,7 +315,7 @@
     REPORTER_ASSERT(reporter, strlen(str)+1 == d1->size());
     REPORTER_ASSERT(reporter, !memcmp(str, d1->data(), strlen(str)+1));
     REPORTER_ASSERT(reporter, 0 == d2->size());
-    
+
     REPORTER_ASSERT(reporter, reader.offset() == sizeWritten);
     REPORTER_ASSERT(reporter, reader.eof());
 }
diff --git a/third_party/ktx/ktx.cpp b/third_party/ktx/ktx.cpp
index f7451e8..32985eb 100644
--- a/third_party/ktx/ktx.cpp
+++ b/third_party/ktx/ktx.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2014 Google Inc.
  *
@@ -328,7 +327,7 @@
                 }
             }
         }
-        
+
         uint32_t imgSizePadded = (imgSize + 3) & ~3;
         buf += imgSizePadded;
         bytesLeft -= imgSizePadded;
@@ -380,7 +379,7 @@
     if (!stream->write(&kKTX_ENDIANNESS_CODE, 4)) {
         return false;
     }
-    
+
     Header hdr;
     hdr.fGLType = 0;
     hdr.fGLTypeSize = 1;
@@ -554,6 +553,6 @@
             rowPtr += bitmap.rowBytes();
         }
     }
-    
+
     return true;
 }
diff --git a/third_party/ktx/ktx.h b/third_party/ktx/ktx.h
index 1114b49..889d5aa 100644
--- a/third_party/ktx/ktx.h
+++ b/third_party/ktx/ktx.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2014 Google Inc.
  *
diff --git a/third_party/libsdl/linux/SDL_config.h b/third_party/libsdl/linux/SDL_config.h
index 425e1f8..ab7b82c 100644
--- a/third_party/libsdl/linux/SDL_config.h
+++ b/third_party/libsdl/linux/SDL_config.h
@@ -34,7 +34,7 @@
 
 /* Make sure that this isn't included by Visual C++ */
 #ifdef _MSC_VER
-#error You should run hg revert SDL_config.h 
+#error You should run hg revert SDL_config.h
 #endif
 
 /* C language features */
diff --git a/third_party/libsdl/mac/SDL_config.h b/third_party/libsdl/mac/SDL_config.h
index ea06bc1..27ab73a 100644
--- a/third_party/libsdl/mac/SDL_config.h
+++ b/third_party/libsdl/mac/SDL_config.h
@@ -34,7 +34,7 @@
 
 /* Make sure that this isn't included by Visual C++ */
 #ifdef _MSC_VER
-#error You should run hg revert SDL_config.h 
+#error You should run hg revert SDL_config.h
 #endif
 
 /* C language features */
diff --git a/third_party/lua/src/lauxlib.h b/third_party/lua/src/lauxlib.h
index ac4d15f..1ab0d48 100644
--- a/third_party/lua/src/lauxlib.h
+++ b/third_party/lua/src/lauxlib.h
@@ -208,5 +208,3 @@
 
 
 #endif
-
-
diff --git a/third_party/lua/src/lctype.h b/third_party/lua/src/lctype.h
index 99c7d12..8c2d56a 100644
--- a/third_party/lua/src/lctype.h
+++ b/third_party/lua/src/lctype.h
@@ -92,4 +92,3 @@
 #endif			/* } */
 
 #endif
-
diff --git a/third_party/lua/src/ldo.h b/third_party/lua/src/ldo.h
index 27b837d..3bae88e 100644
--- a/third_party/lua/src/ldo.h
+++ b/third_party/lua/src/ldo.h
@@ -43,4 +43,3 @@
 LUAI_FUNC int luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud);
 
 #endif
-
diff --git a/third_party/lua/src/lmem.h b/third_party/lua/src/lmem.h
index 5f85099..2ac8ac0 100644
--- a/third_party/lua/src/lmem.h
+++ b/third_party/lua/src/lmem.h
@@ -54,4 +54,3 @@
                                const char *what);
 
 #endif
-
diff --git a/third_party/lua/src/lobject.h b/third_party/lua/src/lobject.h
index dd23b91..d7fc86c 100644
--- a/third_party/lua/src/lobject.h
+++ b/third_party/lua/src/lobject.h
@@ -604,4 +604,3 @@
 
 
 #endif
-
diff --git a/third_party/lua/src/lstate.h b/third_party/lua/src/lstate.h
index c8a31f5..3b7b2a1 100644
--- a/third_party/lua/src/lstate.h
+++ b/third_party/lua/src/lstate.h
@@ -225,4 +225,3 @@
 
 
 #endif
-
diff --git a/third_party/lua/src/luaconf.h b/third_party/lua/src/luaconf.h
index df802c9..4568d87 100644
--- a/third_party/lua/src/luaconf.h
+++ b/third_party/lua/src/luaconf.h
@@ -548,4 +548,3 @@
 
 
 #endif
-
diff --git a/tools/VisualBench/VisualBench.cpp b/tools/VisualBench/VisualBench.cpp
index cbd1abe..578ff92 100644
--- a/tools/VisualBench/VisualBench.cpp
+++ b/tools/VisualBench/VisualBench.cpp
@@ -192,4 +192,3 @@
 SkOSWindow* create_sk_window(void* hwnd, int argc, char** argv) {
     return new VisualBench(hwnd, argc, argv);
 }
-
diff --git a/tools/VisualBench/VisualInteractiveModule.cpp b/tools/VisualBench/VisualInteractiveModule.cpp
index 986709a..898315e 100755
--- a/tools/VisualBench/VisualInteractiveModule.cpp
+++ b/tools/VisualBench/VisualInteractiveModule.cpp
@@ -41,7 +41,7 @@
     canvas->drawRect(rect, paint);
     // draw the 16ms line
     paint.setColor(SK_ColorLTGRAY);
-    canvas->drawLine(rect.fLeft, rect.fBottom - kBaseMS*kPixelPerMS, 
+    canvas->drawLine(rect.fLeft, rect.fBottom - kBaseMS*kPixelPerMS,
                      rect.fRight, rect.fBottom - kBaseMS*kPixelPerMS, paint);
     paint.setColor(SK_ColorRED);
     paint.setStyle(SkPaint::kStroke_Style);
@@ -53,7 +53,7 @@
     int i = fCurrentMeasurement;
     do {
         int endY = startY - (int)(fMeasurements[i] * kPixelPerMS + 0.5);  // round to nearest value
-        canvas->drawLine(SkIntToScalar(x), SkIntToScalar(startY), 
+        canvas->drawLine(SkIntToScalar(x), SkIntToScalar(startY),
                          SkIntToScalar(x), SkIntToScalar(endY), paint);
         i++;
         i &= (kMeasurementCount - 1);  // fast mod
diff --git a/tools/android/SkAndroidSDKCanvas.cpp b/tools/android/SkAndroidSDKCanvas.cpp
index d31f93b..c1a40f4 100644
--- a/tools/android/SkAndroidSDKCanvas.cpp
+++ b/tools/android/SkAndroidSDKCanvas.cpp
@@ -300,7 +300,7 @@
 bool SkAndroidSDKCanvas::onAccessTopLayerPixels(SkPixmap* pmap) {
     SkASSERT(pmap);
     SkImageInfo info;
-    size_t rowBytes; 
+    size_t rowBytes;
     const void* addr = fProxyTarget->accessTopLayerPixels(&info, &rowBytes, nullptr);
     if (addr) {
         pmap->reset(info, addr, rowBytes);
@@ -355,5 +355,3 @@
 }
 
 void SkAndroidSDKCanvas::onDiscard() { fProxyTarget->discard(); }
-
-
diff --git a/tools/android/SkAndroidSDKCanvas.h b/tools/android/SkAndroidSDKCanvas.h
index 812775f..78cfa93 100644
--- a/tools/android/SkAndroidSDKCanvas.h
+++ b/tools/android/SkAndroidSDKCanvas.h
@@ -107,4 +107,3 @@
 };
 
 #endif  // SkAndroidSDKCanvas_DEFINED
-
diff --git a/tools/chrome_fuzz.cpp b/tools/chrome_fuzz.cpp
index f49e126..c59c741 100644
--- a/tools/chrome_fuzz.cpp
+++ b/tools/chrome_fuzz.cpp
@@ -79,4 +79,3 @@
   SkDebugf("#EOF\n");
   return ret;
 }
-
diff --git a/tools/create_test_font.cpp b/tools/create_test_font.cpp
index 1de08ac..5183981 100644
--- a/tools/create_test_font.cpp
+++ b/tools/create_test_font.cpp
@@ -255,7 +255,7 @@
         }
     }
     fprintf(out, "\n};\n\n");
-    
+
     // all fonts are now 0x00, 0x20 - 0xFE
     // don't need to generate or output character codes?
     fprintf(out, "const unsigned %sCharCodes[] = {\n", fontname);
@@ -275,7 +275,7 @@
         }
     }
     fprintf(out, "\n};\n\n");
-    
+
     SkString widthsStr;
     fprintf(out, "const SkFixed %sWidths[] = {\n", fontname);
     for (int index = 0; index < offsetCount; ++index) {
@@ -283,7 +283,7 @@
     }
     widthsStr = strip_final(widthsStr);
     fprintf(out, "%s\n};\n\n", widthsStr.c_str());
-    
+
     fprintf(out, "const int %sCharCodesCount = (int) SK_ARRAY_COUNT(%sCharCodes);\n\n",
             fontname, fontname);
 
diff --git a/tools/debugger/SkDebugCanvas.cpp b/tools/debugger/SkDebugCanvas.cpp
index 4c58b96..cf3da5d 100644
--- a/tools/debugger/SkDebugCanvas.cpp
+++ b/tools/debugger/SkDebugCanvas.cpp
@@ -218,13 +218,13 @@
     if (fPaintFilterCanvas) {
         fPaintFilterCanvas->addCanvas(canvas);
         canvas = fPaintFilterCanvas.get();
-    
+
     }
 
     if (fMegaVizMode) {
         this->markActiveCommands(index);
     }
-   
+
 #if SK_SUPPORT_GPU
     // If we have a GPU backend we can also visualize the batching information
     GrAuditTrail* at = nullptr;
@@ -237,7 +237,7 @@
         if (i == index && fFilter) {
             canvas->clear(0xAAFFFFFF);
         }
-   
+
 #if SK_SUPPORT_GPU
         GrAuditTrail::AutoCollectBatches* acb = nullptr;
         if (at) {
@@ -457,7 +457,7 @@
 
 Json::Value SkDebugCanvas::toJSON(UrlDataManager& urlDataManager, int n, SkCanvas* canvas) {
     this->drawAndCollectBatches(n, canvas);
-    
+
     // now collect json
 #if SK_SUPPORT_GPU
     GrAuditTrail* at = this->getAuditTrail(canvas);
diff --git a/tools/debugger/SkDebugCanvas.h b/tools/debugger/SkDebugCanvas.h
index fa02874..47aaf75 100644
--- a/tools/debugger/SkDebugCanvas.h
+++ b/tools/debugger/SkDebugCanvas.h
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2012 Google Inc.
  *
@@ -44,8 +43,8 @@
     void setClipVizColor(SkColor clipVizColor) { this->fClipVizColor = clipVizColor; }
     SkColor getClipVizColor() const { return fClipVizColor; }
 
-    void setDrawGpuBatchBounds(bool drawGpuBatchBounds) { 
-        fDrawGpuBatchBounds = drawGpuBatchBounds; 
+    void setDrawGpuBatchBounds(bool drawGpuBatchBounds) {
+        fDrawGpuBatchBounds = drawGpuBatchBounds;
     }
 
     bool getDrawGpuBatchBounds() const { return fDrawGpuBatchBounds; }
@@ -156,7 +155,7 @@
 
     /**
         Returns a JSON object representing up to the Nth draw, where N is less than
-        SkDebugCanvas::getSize(). The encoder may use the UrlDataManager to store binary data such 
+        SkDebugCanvas::getSize(). The encoder may use the UrlDataManager to store binary data such
         as images, referring to them via URLs embedded in the JSON.
      */
     Json::Value toJSON(UrlDataManager& urlDataManager, int n, SkCanvas*);
diff --git a/tools/debugger/SkDrawCommand.cpp b/tools/debugger/SkDrawCommand.cpp
index af1270c..fcd2885 100644
--- a/tools/debugger/SkDrawCommand.cpp
+++ b/tools/debugger/SkDrawCommand.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2012 Google Inc.
  *
@@ -474,7 +473,7 @@
         case SkPath::kInverseEvenOdd_FillType:
             result[SKDEBUGCANVAS_ATTRIBUTE_FILLTYPE] = SKDEBUGCANVAS_FILLTYPE_INVERSEEVENODD;
             break;
-    }    
+    }
     Json::Value verbs(Json::arrayValue);
     SkPath::Iter iter(path, false);
     SkPoint pts[4];
@@ -563,7 +562,7 @@
             return Json::Value(SKDEBUGCANVAS_POINTMODE_POINTS);
         case SkCanvas::kLines_PointMode:
             return Json::Value(SKDEBUGCANVAS_POINTMODE_LINES);
-        case SkCanvas::kPolygon_PointMode: 
+        case SkCanvas::kPolygon_PointMode:
             return Json::Value(SKDEBUGCANVAS_POINTMODE_POLYGON);
         default:
             SkASSERT(false);
@@ -571,7 +570,7 @@
     };
 }
 
-static void store_scalar(Json::Value* target, const char* key, SkScalar value, 
+static void store_scalar(Json::Value* target, const char* key, SkScalar value,
                          SkScalar defaultValue) {
     if (value != defaultValue) {
         (*target)[key] = Json::Value(value);
@@ -584,14 +583,14 @@
     }
 }
 
-static void encode_data(const void* bytes, size_t count, const char* contentType, 
+static void encode_data(const void* bytes, size_t count, const char* contentType,
                         UrlDataManager& urlDataManager, Json::Value* target) {
     SkAutoTUnref<SkData> data(SkData::NewWithCopy(bytes, count));
     SkString url = urlDataManager.addData(data, contentType);
     *target = Json::Value(url.c_str());
 }
 
-static void flatten(const SkFlattenable* flattenable, Json::Value* target, 
+static void flatten(const SkFlattenable* flattenable, Json::Value* target,
                     UrlDataManager& urlDataManager) {
     SkWriteBuffer buffer;
     flattenable->flatten(buffer);
@@ -611,7 +610,7 @@
     out->write(data, length);
 }
 
-void SkDrawCommand::WritePNG(const png_bytep rgba, png_uint_32 width, png_uint_32 height, 
+void SkDrawCommand::WritePNG(const png_bytep rgba, png_uint_32 width, png_uint_32 height,
                              SkWStream& out) {
     png_structp png = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
     SkASSERT(png != nullptr);
@@ -644,11 +643,11 @@
     sk_free(pixels);
 }
 
-static bool SK_WARN_UNUSED_RESULT flatten(const SkImage& image, Json::Value* target, 
+static bool SK_WARN_UNUSED_RESULT flatten(const SkImage& image, Json::Value* target,
                                           UrlDataManager& urlDataManager) {
     size_t rowBytes = 4 * image.width();
     SkAutoFree buffer(sk_malloc_throw(rowBytes * image.height()));
-    SkImageInfo dstInfo = SkImageInfo::Make(image.width(), image.height(), 
+    SkImageInfo dstInfo = SkImageInfo::Make(image.width(), image.height(),
                                             kN32_SkColorType, kPremul_SkAlphaType);
     if (!image.readPixels(dstInfo, buffer.get(), rowBytes, 0, 0)) {
         SkDebugf("readPixels failed\n");
@@ -700,7 +699,7 @@
     }
 }
 
-static Json::ArrayIndex decode_data(Json::Value data, UrlDataManager& urlDataManager, 
+static Json::ArrayIndex decode_data(Json::Value data, UrlDataManager& urlDataManager,
                                     const void** target) {
     UrlDataManager::UrlData* urlData = urlDataManager.getDataFromUrl(SkString(data.asCString()));
     if (urlData == nullptr) {
@@ -713,7 +712,7 @@
     return (Json::ArrayIndex) urlData->fData->size();
 }
 
-static SkFlattenable* load_flattenable(Json::Value jsonFlattenable, 
+static SkFlattenable* load_flattenable(Json::Value jsonFlattenable,
                                        UrlDataManager& urlDataManager) {
     if (!jsonFlattenable.isMember(SKDEBUGCANVAS_ATTRIBUTE_NAME)) {
         return nullptr;
@@ -816,7 +815,7 @@
     return result;
 }
 
-static bool SK_WARN_UNUSED_RESULT flatten(const SkBitmap& bitmap, Json::Value* target, 
+static bool SK_WARN_UNUSED_RESULT flatten(const SkBitmap& bitmap, Json::Value* target,
                                           UrlDataManager& urlDataManager) {
     bitmap.lockPixels();
     sk_sp<SkImage> image(SkImage::MakeFromBitmap(bitmap));
@@ -917,7 +916,7 @@
     }
 }
 
-static void apply_paint_maskfilter(const SkPaint& paint, Json::Value* target, 
+static void apply_paint_maskfilter(const SkPaint& paint, Json::Value* target,
                                    UrlDataManager& urlDataManager) {
     SkMaskFilter* maskFilter = paint.getMaskFilter();
     if (maskFilter != nullptr) {
@@ -966,7 +965,7 @@
     }
 }
 
-static void apply_paint_patheffect(const SkPaint& paint, Json::Value* target, 
+static void apply_paint_patheffect(const SkPaint& paint, Json::Value* target,
                                    UrlDataManager& urlDataManager) {
     SkPathEffect* pathEffect = paint.getPathEffect();
     if (pathEffect != nullptr) {
@@ -991,7 +990,7 @@
         }
     }
 }
-    
+
 static void apply_paint_textalign(const SkPaint& paint, Json::Value* target) {
     SkPaint::Align textAlign = paint.getTextAlign();
     if (textAlign != SkPaint::kLeft_Align) {
@@ -1009,7 +1008,7 @@
     }
 }
 
-static void apply_paint_typeface(const SkPaint& paint, Json::Value* target, 
+static void apply_paint_typeface(const SkPaint& paint, Json::Value* target,
                                  UrlDataManager& urlDataManager) {
     SkTypeface* typeface = paint.getTypeface();
     if (typeface != nullptr) {
@@ -1019,7 +1018,7 @@
         void* data = sk_malloc_throw(buffer.bytesWritten());
         buffer.copyTo(data);
         Json::Value jsonData;
-        encode_data(data, buffer.bytesWritten(), "application/octet-stream", urlDataManager, 
+        encode_data(data, buffer.bytesWritten(), "application/octet-stream", urlDataManager,
                     &jsonData);
         jsonTypeface[SKDEBUGCANVAS_ATTRIBUTE_DATA] = jsonData;
         sk_free(data);
@@ -1027,7 +1026,7 @@
     }
 }
 
-static void apply_paint_shader(const SkPaint& paint, Json::Value* target, 
+static void apply_paint_shader(const SkPaint& paint, Json::Value* target,
                                UrlDataManager& urlDataManager) {
     SkFlattenable* shader = paint.getShader();
     if (shader != nullptr) {
@@ -1037,7 +1036,7 @@
     }
 }
 
-static void apply_paint_xfermode(const SkPaint& paint, Json::Value* target, 
+static void apply_paint_xfermode(const SkPaint& paint, Json::Value* target,
                                  UrlDataManager& urlDataManager) {
     SkFlattenable* xfermode = paint.getXfermode();
     if (xfermode != nullptr) {
@@ -1057,7 +1056,7 @@
     }
 }
 
-static void apply_paint_colorfilter(const SkPaint& paint, Json::Value* target, 
+static void apply_paint_colorfilter(const SkPaint& paint, Json::Value* target,
                                     UrlDataManager& urlDataManager) {
     SkFlattenable* colorFilter = paint.getColorFilter();
     if (colorFilter != nullptr) {
@@ -1067,7 +1066,7 @@
     }
 }
 
-static void apply_paint_looper(const SkPaint& paint, Json::Value* target, 
+static void apply_paint_looper(const SkPaint& paint, Json::Value* target,
                                UrlDataManager& urlDataManager) {
     SkFlattenable* looper = paint.getLooper();
     if (looper != nullptr) {
@@ -1080,11 +1079,11 @@
 Json::Value make_json_paint(const SkPaint& paint, UrlDataManager& urlDataManager) {
     Json::Value result(Json::objectValue);
     store_scalar(&result, SKDEBUGCANVAS_ATTRIBUTE_STROKEWIDTH, paint.getStrokeWidth(), 0.0f);
-    store_scalar(&result, SKDEBUGCANVAS_ATTRIBUTE_STROKEMITER, paint.getStrokeMiter(), 
+    store_scalar(&result, SKDEBUGCANVAS_ATTRIBUTE_STROKEMITER, paint.getStrokeMiter(),
                  SkPaintDefaults_MiterLimit);
     store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS, paint.isAntiAlias(), false);
     store_bool(&result, SKDEBUGCANVAS_ATTRIBUTE_DITHER, paint.isDither(), false);
-    store_scalar(&result, SKDEBUGCANVAS_ATTRIBUTE_TEXTSIZE, paint.getTextSize(), 
+    store_scalar(&result, SKDEBUGCANVAS_ATTRIBUTE_TEXTSIZE, paint.getTextSize(),
                  SkPaintDefaults_TextSize);
     store_scalar(&result, SKDEBUGCANVAS_ATTRIBUTE_TEXTSCALEX, paint.getTextScaleX(), SK_Scalar1);
     store_scalar(&result, SKDEBUGCANVAS_ATTRIBUTE_TEXTSCALEX, paint.getTextSkewX(), 0.0f);
@@ -1119,7 +1118,7 @@
     }
 }
 
-static void extract_json_paint_shader(Json::Value& jsonPaint, UrlDataManager& urlDataManager, 
+static void extract_json_paint_shader(Json::Value& jsonPaint, UrlDataManager& urlDataManager,
                                       SkPaint* target) {
     if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_SHADER)) {
         Json::Value jsonShader = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_SHADER];
@@ -1130,7 +1129,7 @@
     }
 }
 
-static void extract_json_paint_patheffect(Json::Value& jsonPaint, UrlDataManager& urlDataManager, 
+static void extract_json_paint_patheffect(Json::Value& jsonPaint, UrlDataManager& urlDataManager,
                                           SkPaint* target) {
     if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_PATHEFFECT)) {
         Json::Value jsonPathEffect = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_PATHEFFECT];
@@ -1142,7 +1141,7 @@
     }
 }
 
-static void extract_json_paint_maskfilter(Json::Value& jsonPaint, UrlDataManager& urlDataManager, 
+static void extract_json_paint_maskfilter(Json::Value& jsonPaint, UrlDataManager& urlDataManager,
                                           SkPaint* target) {
     if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_MASKFILTER)) {
         Json::Value jsonMaskFilter = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_MASKFILTER];
@@ -1154,7 +1153,7 @@
     }
 }
 
-static void extract_json_paint_colorfilter(Json::Value& jsonPaint, UrlDataManager& urlDataManager, 
+static void extract_json_paint_colorfilter(Json::Value& jsonPaint, UrlDataManager& urlDataManager,
                                            SkPaint* target) {
     if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_COLORFILTER)) {
         Json::Value jsonColorFilter = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_COLORFILTER];
@@ -1166,7 +1165,7 @@
     }
 }
 
-static void extract_json_paint_xfermode(Json::Value& jsonPaint, UrlDataManager& urlDataManager, 
+static void extract_json_paint_xfermode(Json::Value& jsonPaint, UrlDataManager& urlDataManager,
                                         SkPaint* target) {
     if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_XFERMODE)) {
         Json::Value jsonXfermode = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_XFERMODE];
@@ -1178,7 +1177,7 @@
     }
 }
 
-static void extract_json_paint_looper(Json::Value& jsonPaint, UrlDataManager& urlDataManager, 
+static void extract_json_paint_looper(Json::Value& jsonPaint, UrlDataManager& urlDataManager,
                                       SkPaint* target) {
     if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_LOOPER)) {
         Json::Value jsonLooper = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_LOOPER];
@@ -1189,11 +1188,11 @@
     }
 }
 
-static void extract_json_paint_imagefilter(Json::Value& jsonPaint, UrlDataManager& urlDataManager, 
+static void extract_json_paint_imagefilter(Json::Value& jsonPaint, UrlDataManager& urlDataManager,
                                            SkPaint* target) {
     if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_IMAGEFILTER)) {
         Json::Value jsonImageFilter = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_IMAGEFILTER];
-        SkImageFilter* imageFilter = (SkImageFilter*) load_flattenable(jsonImageFilter, 
+        SkImageFilter* imageFilter = (SkImageFilter*) load_flattenable(jsonImageFilter,
                                                                        urlDataManager);
         if (imageFilter != nullptr) {
             target->setImageFilter(imageFilter);
@@ -1202,7 +1201,7 @@
     }
 }
 
-static void extract_json_paint_typeface(Json::Value& jsonPaint, UrlDataManager& urlDataManager, 
+static void extract_json_paint_typeface(Json::Value& jsonPaint, UrlDataManager& urlDataManager,
                                         SkPaint* target) {
     if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_TYPEFACE)) {
         Json::Value jsonTypeface = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_TYPEFACE];
@@ -1234,14 +1233,14 @@
     if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_STROKEWIDTH)) {
         float strokeWidth = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_STROKEWIDTH].asFloat();
         target->setStrokeWidth(strokeWidth);
-    }    
+    }
 }
 
 static void extract_json_paint_strokemiter(Json::Value& jsonPaint, SkPaint* target) {
     if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_STROKEMITER)) {
         float strokeMiter = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_STROKEMITER].asFloat();
         target->setStrokeMiter(strokeMiter);
-    }    
+    }
 }
 
 static void extract_json_paint_strokejoin(Json::Value& jsonPaint, SkPaint* target) {
@@ -1402,7 +1401,7 @@
     }
 }
 
-static void extract_json_paint(Json::Value& paint, UrlDataManager& urlDataManager, 
+static void extract_json_paint(Json::Value& paint, UrlDataManager& urlDataManager,
                                SkPaint* result) {
     extract_json_paint_color(paint, result);
     extract_json_paint_shader(paint, urlDataManager, result);
@@ -1439,21 +1438,21 @@
 
 static void extract_json_rrect(Json::Value& rrect, SkRRect* result) {
     SkVector radii[4] = {
-                            { rrect[1][0].asFloat(), rrect[1][1].asFloat() }, 
-                            { rrect[2][0].asFloat(), rrect[2][1].asFloat() }, 
-                            { rrect[3][0].asFloat(), rrect[3][1].asFloat() }, 
+                            { rrect[1][0].asFloat(), rrect[1][1].asFloat() },
+                            { rrect[2][0].asFloat(), rrect[2][1].asFloat() },
+                            { rrect[3][0].asFloat(), rrect[3][1].asFloat() },
                             { rrect[4][0].asFloat(), rrect[4][1].asFloat() }
                         };
-    result->setRectRadii(SkRect::MakeLTRB(rrect[0][0].asFloat(), rrect[0][1].asFloat(), 
-                                          rrect[0][2].asFloat(), rrect[0][3].asFloat()), 
+    result->setRectRadii(SkRect::MakeLTRB(rrect[0][0].asFloat(), rrect[0][1].asFloat(),
+                                          rrect[0][2].asFloat(), rrect[0][3].asFloat()),
                                           radii);
 }
 
 static void extract_json_matrix(Json::Value& matrix, SkMatrix* result) {
-    SkScalar values[] = { 
+    SkScalar values[] = {
         matrix[0][0].asFloat(), matrix[0][1].asFloat(), matrix[0][2].asFloat(),
         matrix[1][0].asFloat(), matrix[1][1].asFloat(), matrix[1][2].asFloat(),
-        matrix[2][0].asFloat(), matrix[2][1].asFloat(), matrix[2][2].asFloat() 
+        matrix[2][0].asFloat(), matrix[2][1].asFloat(), matrix[2][2].asFloat()
     };
     result->set9(values);
 }
@@ -1584,11 +1583,11 @@
     return result;
 }
 
-SkClipPathCommand* SkClipPathCommand::fromJSON(Json::Value& command, 
+SkClipPathCommand* SkClipPathCommand::fromJSON(Json::Value& command,
                                                UrlDataManager& urlDataManager) {
     SkPath path;
     extract_json_path(command[SKDEBUGCANVAS_ATTRIBUTE_PATH], &path);
-    return new SkClipPathCommand(path, get_json_regionop(command[SKDEBUGCANVAS_ATTRIBUTE_REGIONOP]), 
+    return new SkClipPathCommand(path, get_json_regionop(command[SKDEBUGCANVAS_ATTRIBUTE_REGIONOP]),
                                  command[SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS].asBool());
 }
 
@@ -1612,7 +1611,7 @@
     return result;
 }
 
-SkClipRegionCommand* SkClipRegionCommand::fromJSON(Json::Value& command, 
+SkClipRegionCommand* SkClipRegionCommand::fromJSON(Json::Value& command,
                                                    UrlDataManager& urlDataManager) {
     SkASSERT(false);
     return nullptr;
@@ -1641,11 +1640,11 @@
     return result;
 }
 
-SkClipRectCommand* SkClipRectCommand::fromJSON(Json::Value& command, 
+SkClipRectCommand* SkClipRectCommand::fromJSON(Json::Value& command,
                                                UrlDataManager& urlDataManager) {
     SkRect rect;
     extract_json_rect(command[SKDEBUGCANVAS_ATTRIBUTE_COORDS], &rect);
-    return new SkClipRectCommand(rect, get_json_regionop(command[SKDEBUGCANVAS_ATTRIBUTE_REGIONOP]), 
+    return new SkClipRectCommand(rect, get_json_regionop(command[SKDEBUGCANVAS_ATTRIBUTE_REGIONOP]),
                                  command[SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS].asBool());
 }
 
@@ -1677,12 +1676,12 @@
     return result;
 }
 
-SkClipRRectCommand* SkClipRRectCommand::fromJSON(Json::Value& command, 
+SkClipRRectCommand* SkClipRRectCommand::fromJSON(Json::Value& command,
                                                  UrlDataManager& urlDataManager) {
     SkRRect rrect;
     extract_json_rrect(command[SKDEBUGCANVAS_ATTRIBUTE_COORDS], &rrect);
-    return new SkClipRRectCommand(rrect, 
-                                  get_json_regionop(command[SKDEBUGCANVAS_ATTRIBUTE_REGIONOP]), 
+    return new SkClipRRectCommand(rrect,
+                                  get_json_regionop(command[SKDEBUGCANVAS_ATTRIBUTE_REGIONOP]),
                                   command[SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS].asBool());
 }
 
@@ -1753,7 +1752,7 @@
     return result;
 }
 
-SkDrawBitmapCommand* SkDrawBitmapCommand::fromJSON(Json::Value& command, 
+SkDrawBitmapCommand* SkDrawBitmapCommand::fromJSON(Json::Value& command,
                                                    UrlDataManager& urlDataManager) {
     SkBitmap* bitmap = load_bitmap(command[SKDEBUGCANVAS_ATTRIBUTE_BITMAP], urlDataManager);
     if (bitmap == nullptr) {
@@ -1769,7 +1768,7 @@
     else {
         paintPtr = nullptr;
     }
-    SkDrawBitmapCommand* result = new SkDrawBitmapCommand(*bitmap, point[0].asFloat(), 
+    SkDrawBitmapCommand* result = new SkDrawBitmapCommand(*bitmap, point[0].asFloat(),
                                                           point[1].asFloat(), paintPtr);
     delete bitmap;
     return result;
@@ -1820,7 +1819,7 @@
     return result;
 }
 
-SkDrawBitmapNineCommand* SkDrawBitmapNineCommand::fromJSON(Json::Value& command, 
+SkDrawBitmapNineCommand* SkDrawBitmapNineCommand::fromJSON(Json::Value& command,
                                                            UrlDataManager& urlDataManager) {
     SkBitmap* bitmap = load_bitmap(command[SKDEBUGCANVAS_ATTRIBUTE_BITMAP], urlDataManager);
     if (bitmap == nullptr) {
@@ -1903,7 +1902,7 @@
     return result;
 }
 
-SkDrawBitmapRectCommand* SkDrawBitmapRectCommand::fromJSON(Json::Value& command, 
+SkDrawBitmapRectCommand* SkDrawBitmapRectCommand::fromJSON(Json::Value& command,
                                                            UrlDataManager& urlDataManager) {
     SkBitmap* bitmap = load_bitmap(command[SKDEBUGCANVAS_ATTRIBUTE_BITMAP], urlDataManager);
     if (bitmap == nullptr) {
@@ -1921,7 +1920,7 @@
         paintPtr = nullptr;
     }
     SkCanvas::SrcRectConstraint constraint;
-    if (command.isMember(SKDEBUGCANVAS_ATTRIBUTE_STRICT) && 
+    if (command.isMember(SKDEBUGCANVAS_ATTRIBUTE_STRICT) &&
         command[SKDEBUGCANVAS_ATTRIBUTE_STRICT].asBool()) {
         constraint = SkCanvas::kStrict_SrcRectConstraint;
     }
@@ -1988,7 +1987,7 @@
     return result;
 }
 
-SkDrawImageCommand* SkDrawImageCommand::fromJSON(Json::Value& command, 
+SkDrawImageCommand* SkDrawImageCommand::fromJSON(Json::Value& command,
                                                  UrlDataManager& urlDataManager) {
     sk_sp<SkImage> image = load_image(command[SKDEBUGCANVAS_ATTRIBUTE_IMAGE], urlDataManager);
     if (image == nullptr) {
@@ -2037,7 +2036,7 @@
 }
 
 void SkDrawImageRectCommand::execute(SkCanvas* canvas) const {
-    canvas->legacy_drawImageRect(fImage, fSrc.getMaybeNull(), fDst, fPaint.getMaybeNull(), 
+    canvas->legacy_drawImageRect(fImage, fSrc.getMaybeNull(), fDst, fPaint.getMaybeNull(),
                                  fConstraint);
 }
 
@@ -2070,7 +2069,7 @@
     return result;
 }
 
-SkDrawImageRectCommand* SkDrawImageRectCommand::fromJSON(Json::Value& command, 
+SkDrawImageRectCommand* SkDrawImageRectCommand::fromJSON(Json::Value& command,
                                                          UrlDataManager& urlDataManager) {
     sk_sp<SkImage> image = load_image(command[SKDEBUGCANVAS_ATTRIBUTE_IMAGE], urlDataManager);
     if (image == nullptr) {
@@ -2088,7 +2087,7 @@
         paintPtr = nullptr;
     }
     SkCanvas::SrcRectConstraint constraint;
-    if (command.isMember(SKDEBUGCANVAS_ATTRIBUTE_STRICT) && 
+    if (command.isMember(SKDEBUGCANVAS_ATTRIBUTE_STRICT) &&
         command[SKDEBUGCANVAS_ATTRIBUTE_STRICT].asBool()) {
         constraint = SkCanvas::kStrict_SrcRectConstraint;
     }
@@ -2145,7 +2144,7 @@
     return result;
 }
 
-SkDrawOvalCommand* SkDrawOvalCommand::fromJSON(Json::Value& command, 
+SkDrawOvalCommand* SkDrawOvalCommand::fromJSON(Json::Value& command,
                                                UrlDataManager& urlDataManager) {
     SkRect coords;
     extract_json_rect(command[SKDEBUGCANVAS_ATTRIBUTE_COORDS], &coords);
@@ -2177,7 +2176,7 @@
     return result;
 }
 
-SkDrawPaintCommand* SkDrawPaintCommand::fromJSON(Json::Value& command, 
+SkDrawPaintCommand* SkDrawPaintCommand::fromJSON(Json::Value& command,
                                                  UrlDataManager& urlDataManager) {
     SkPaint paint;
     extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint);
@@ -2209,7 +2208,7 @@
     return result;
 }
 
-SkDrawPathCommand* SkDrawPathCommand::fromJSON(Json::Value& command, 
+SkDrawPathCommand* SkDrawPathCommand::fromJSON(Json::Value& command,
                                                UrlDataManager& urlDataManager) {
     SkPath path;
     extract_json_path(command[SKDEBUGCANVAS_ATTRIBUTE_PATH], &path);
@@ -2336,7 +2335,7 @@
     return result;
 }
 
-SkDrawPointsCommand* SkDrawPointsCommand::fromJSON(Json::Value& command, 
+SkDrawPointsCommand* SkDrawPointsCommand::fromJSON(Json::Value& command,
                                                    UrlDataManager& urlDataManager) {
     SkCanvas::PointMode mode;
     const char* jsonMode = command[SKDEBUGCANVAS_ATTRIBUTE_MODE].asCString();
@@ -2392,7 +2391,7 @@
 
 Json::Value SkDrawPosTextCommand::toJSON(UrlDataManager& urlDataManager) const {
     Json::Value result = INHERITED::toJSON(urlDataManager);
-    result[SKDEBUGCANVAS_ATTRIBUTE_TEXT] = Json::Value((const char*) fText, 
+    result[SKDEBUGCANVAS_ATTRIBUTE_TEXT] = Json::Value((const char*) fText,
                                                        ((const char*) fText) + fByteLength);
     Json::Value coords(Json::arrayValue);
     size_t numCoords = fPaint.textToGlyphs(fText, fByteLength, nullptr);
@@ -2404,7 +2403,7 @@
     return result;
 }
 
-SkDrawPosTextCommand* SkDrawPosTextCommand::fromJSON(Json::Value& command, 
+SkDrawPosTextCommand* SkDrawPosTextCommand::fromJSON(Json::Value& command,
                                                      UrlDataManager& urlDataManager) {
     const char* text = command[SKDEBUGCANVAS_ATTRIBUTE_TEXT].asCString();
     SkPaint paint;
@@ -2579,7 +2578,7 @@
     return result;
 }
 
-SkDrawTextBlobCommand* SkDrawTextBlobCommand::fromJSON(Json::Value& command, 
+SkDrawTextBlobCommand* SkDrawTextBlobCommand::fromJSON(Json::Value& command,
                                                        UrlDataManager& urlDataManager) {
     SkTextBlobBuilder builder;
     Json::Value runs = command[SKDEBUGCANVAS_ATTRIBUTE_RUNS];
@@ -2683,7 +2682,7 @@
     return result;
 }
 
-SkDrawPatchCommand* SkDrawPatchCommand::fromJSON(Json::Value& command, 
+SkDrawPatchCommand* SkDrawPatchCommand::fromJSON(Json::Value& command,
                                                  UrlDataManager& urlDataManager) {
     Json::Value jsonCubics = command[SKDEBUGCANVAS_ATTRIBUTE_CUBICS];
     SkPoint cubics[12];
@@ -2744,7 +2743,7 @@
     return result;
 }
 
-SkDrawRectCommand* SkDrawRectCommand::fromJSON(Json::Value& command, 
+SkDrawRectCommand* SkDrawRectCommand::fromJSON(Json::Value& command,
                                                UrlDataManager& urlDataManager) {
     SkRect coords;
     extract_json_rect(command[SKDEBUGCANVAS_ATTRIBUTE_COORDS], &coords);
@@ -2778,7 +2777,7 @@
     return result;
 }
 
-SkDrawRRectCommand* SkDrawRRectCommand::fromJSON(Json::Value& command, 
+SkDrawRRectCommand* SkDrawRRectCommand::fromJSON(Json::Value& command,
                                                  UrlDataManager& urlDataManager) {
     SkRRect coords;
     extract_json_rrect(command[SKDEBUGCANVAS_ATTRIBUTE_COORDS], &coords);
@@ -2817,7 +2816,7 @@
     return result;
 }
 
-SkDrawDRRectCommand* SkDrawDRRectCommand::fromJSON(Json::Value& command, 
+SkDrawDRRectCommand* SkDrawDRRectCommand::fromJSON(Json::Value& command,
                                                    UrlDataManager& urlDataManager) {
     SkRRect outer;
     extract_json_rrect(command[SKDEBUGCANVAS_ATTRIBUTE_INNER], &outer);
@@ -2850,7 +2849,7 @@
 
 Json::Value SkDrawTextCommand::toJSON(UrlDataManager& urlDataManager) const {
     Json::Value result = INHERITED::toJSON(urlDataManager);
-    result[SKDEBUGCANVAS_ATTRIBUTE_TEXT] = Json::Value((const char*) fText, 
+    result[SKDEBUGCANVAS_ATTRIBUTE_TEXT] = Json::Value((const char*) fText,
                                                        ((const char*) fText) + fByteLength);
     Json::Value coords(Json::arrayValue);
     result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = make_json_point(fX, fY);
@@ -2858,13 +2857,13 @@
     return result;
 }
 
-SkDrawTextCommand* SkDrawTextCommand::fromJSON(Json::Value& command, 
+SkDrawTextCommand* SkDrawTextCommand::fromJSON(Json::Value& command,
                                                UrlDataManager& urlDataManager) {
     const char* text = command[SKDEBUGCANVAS_ATTRIBUTE_TEXT].asCString();
     SkPaint paint;
     extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint);
     Json::Value coords = command[SKDEBUGCANVAS_ATTRIBUTE_COORDS];
-    return new SkDrawTextCommand(text, strlen(text), coords[0].asFloat(), coords[1].asFloat(), 
+    return new SkDrawTextCommand(text, strlen(text), coords[0].asFloat(), coords[1].asFloat(),
                                  paint);
 }
 
@@ -2899,7 +2898,7 @@
 
 Json::Value SkDrawTextOnPathCommand::toJSON(UrlDataManager& urlDataManager) const {
     Json::Value result = INHERITED::toJSON(urlDataManager);
-    result[SKDEBUGCANVAS_ATTRIBUTE_TEXT] = Json::Value((const char*) fText, 
+    result[SKDEBUGCANVAS_ATTRIBUTE_TEXT] = Json::Value((const char*) fText,
                                                        ((const char*) fText) + fByteLength);
     Json::Value coords(Json::arrayValue);
     result[SKDEBUGCANVAS_ATTRIBUTE_PATH] = make_json_path(fPath);
@@ -2910,7 +2909,7 @@
     return result;
 }
 
-SkDrawTextOnPathCommand* SkDrawTextOnPathCommand::fromJSON(Json::Value& command, 
+SkDrawTextOnPathCommand* SkDrawTextOnPathCommand::fromJSON(Json::Value& command,
                                                            UrlDataManager& urlDataManager) {
     const char* text = command[SKDEBUGCANVAS_ATTRIBUTE_TEXT].asCString();
     SkPaint paint;
@@ -3069,7 +3068,7 @@
         result[SKDEBUGCANVAS_ATTRIBUTE_BOUNDS] = make_json_rect(fBounds);
     }
     if (fPaintPtr != nullptr) {
-        result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = make_json_paint(*fPaintPtr, 
+        result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = make_json_paint(*fPaintPtr,
                                                                 urlDataManager);
     }
     if (fBackdrop != nullptr) {
@@ -3084,7 +3083,7 @@
     return result;
 }
 
-SkSaveLayerCommand* SkSaveLayerCommand::fromJSON(Json::Value& command, 
+SkSaveLayerCommand* SkSaveLayerCommand::fromJSON(Json::Value& command,
                                                  UrlDataManager& urlDataManager) {
     SkCanvas::SaveLayerRec rec;
     SkRect bounds;
@@ -3130,7 +3129,7 @@
     return result;
 }
 
-SkSetMatrixCommand* SkSetMatrixCommand::fromJSON(Json::Value& command, 
+SkSetMatrixCommand* SkSetMatrixCommand::fromJSON(Json::Value& command,
                                                  UrlDataManager& urlDataManager) {
     SkMatrix matrix;
     extract_json_matrix(command[SKDEBUGCANVAS_ATTRIBUTE_MATRIX], &matrix);
diff --git a/tools/debugger/SkDrawCommand.h b/tools/debugger/SkDrawCommand.h
index 7eaf354..ac9e476 100644
--- a/tools/debugger/SkDrawCommand.h
+++ b/tools/debugger/SkDrawCommand.h
@@ -59,7 +59,7 @@
 
     static const int kOpTypeCount = kLast_OpType + 1;
 
-    static void WritePNG(const png_bytep rgba, png_uint_32 width, png_uint_32 height, 
+    static void WritePNG(const png_bytep rgba, png_uint_32 width, png_uint_32 height,
                          SkWStream& out);
 
     SkDrawCommand(OpType opType);
diff --git a/tools/debugger/SkObjectParser.cpp b/tools/debugger/SkObjectParser.cpp
index 5f3fa44..3642783 100644
--- a/tools/debugger/SkObjectParser.cpp
+++ b/tools/debugger/SkObjectParser.cpp
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2012 Google Inc.
  *
@@ -26,7 +25,7 @@
     mBitmap->appendS32(bitmap.width());
     mBitmap->append(" H: ");
     mBitmap->appendS32(bitmap.height());
-    
+
     const char* gColorTypeStrings[] = {
         "None", "A8", "565", "4444", "RGBA", "BGRA", "Index8", "G8", "RGBAf16"
     };
@@ -136,7 +135,7 @@
 
 SkString* SkObjectParser::PathToString(const SkPath& path) {
     SkString* mPath = new SkString;
-    
+
     mPath->appendf("Path (%d) (", path.getGenerationID());
 
     static const char* gFillStrings[] = {
diff --git a/tools/gpuveto.cpp b/tools/gpuveto.cpp
index 41ca0c8..59b3bef 100644
--- a/tools/gpuveto.cpp
+++ b/tools/gpuveto.cpp
@@ -52,8 +52,8 @@
     // The SkPicture tracking information is only generated during recording
     // an isn't serialized. Replay the picture to regenerated the tracking data.
     SkPictureRecorder recorder;
-    picture->playback(recorder.beginRecording(picture->cullRect().width(), 
-                                              picture->cullRect().height(), 
+    picture->playback(recorder.beginRecording(picture->cullRect().width(),
+                                              picture->cullRect().height(),
                                               nullptr, 0));
     sk_sp<SkPicture> recorded(recorder.finishRecordingAsPicture());
 
diff --git a/tools/imgblur.cpp b/tools/imgblur.cpp
index c47bb02..3a0ae00 100644
--- a/tools/imgblur.cpp
+++ b/tools/imgblur.cpp
@@ -37,7 +37,7 @@
         if (!FLAGS_quiet) {
             SkDebugf("Sigma must be greater than zero (it is %f).\n", FLAGS_sigma);
         }
-        return kError;       
+        return kError;
     }
 
     sk_sp<SkData> data(SkData::MakeFromFileName(FLAGS_in[0]));
@@ -70,7 +70,7 @@
         if (!FLAGS_quiet) {
             SkDebugf("Couldn't write to file: %s\n", FLAGS_out[0]);
         }
-        return kError;       
+        return kError;
     }
 
     return kSuccess;
diff --git a/tools/imgslice.cpp b/tools/imgslice.cpp
index 3585c06..2fdc819 100644
--- a/tools/imgslice.cpp
+++ b/tools/imgslice.cpp
@@ -42,21 +42,21 @@
             SkDebugf("Channel (--rgb) must be between 0 and 3 (inclusive) - value is %d.\n",
                      FLAGS_rgb);
         }
-        return kError;        
+        return kError;
     }
 
     if (FLAGS_row >= 0 && FLAGS_column >= 0) {
         if (!FLAGS_quiet) {
             SkDebugf("Only one of '-c' or '-r' can be specified at at time.\n");
         }
-        return kError;       
+        return kError;
     }
 
     if (FLAGS_row < 0 && FLAGS_column < 0) {
         if (!FLAGS_quiet) {
             SkDebugf("At least one of '-c' or '-r' need to be specified.\n");
         }
-        return kError;       
+        return kError;
     }
 
     sk_sp<SkData> data(SkData::MakeFromFileName(FLAGS_image[0]));
@@ -128,7 +128,7 @@
 
                 SkDebugf(", %d", ((c) >> (FLAGS_rgb*8)) & 0xFF);
             }
-        }        
+        }
     }
 
     SkDebugf("\n");
diff --git a/tools/lua/lua_pictures.cpp b/tools/lua/lua_pictures.cpp
index 0edea25..9776002 100644
--- a/tools/lua/lua_pictures.cpp
+++ b/tools/lua/lua_pictures.cpp
@@ -145,7 +145,7 @@
             auto pic(load_picture(path));
             if (pic.get()) {
                 SkAutoTUnref<SkLuaCanvas> canvas(
-                                    new SkLuaCanvas(SkScalarCeilToInt(pic->cullRect().width()), 
+                                    new SkLuaCanvas(SkScalarCeilToInt(pic->cullRect().width()),
                                                     SkScalarCeilToInt(pic->cullRect().height()),
                                                     L.get(), gAccumulateFunc));
 
diff --git a/tools/pinspect.cpp b/tools/pinspect.cpp
index 1cbc2e1..57aaf1e 100644
--- a/tools/pinspect.cpp
+++ b/tools/pinspect.cpp
@@ -38,7 +38,7 @@
         SkDebugf("Could not create SkPicture: %s\n", path);
         return nullptr;
     }
-    printf("picture cullRect: [%f %f %f %f]\n", 
+    printf("picture cullRect: [%f %f %f %f]\n",
            pic->cullRect().fLeft, pic->cullRect().fTop,
            pic->cullRect().fRight, pic->cullRect().fBottom);
     return pic;
diff --git a/tools/sk_tool_utils.cpp b/tools/sk_tool_utils.cpp
index 10e5c30..f46ebb6 100644
--- a/tools/sk_tool_utils.cpp
+++ b/tools/sk_tool_utils.cpp
@@ -91,7 +91,7 @@
 const char* emoji_sample_text() {
     if (!strcmp(sk_tool_utils::platform_os_emoji(), "CBDT")) {
         return "Hamburgefons";
-    } 
+    }
     if (!strcmp(sk_tool_utils::platform_os_emoji(), "SBIX")) {
         return "\xF0\x9F\x92\xB0" "\xF0\x9F\x8F\xA1" "\xF0\x9F\x8E\x85"  // 💰🏡🎅
                "\xF0\x9F\x8D\xAA" "\xF0\x9F\x8D\x95" "\xF0\x9F\x9A\x80"  // 🍪🍕🚀
@@ -167,7 +167,7 @@
     SkTypeface* face = create_font(name, style);
     SkSafeUnref(paint->setTypeface(face));
 }
-    
+
 void write_pixels(SkCanvas* canvas, const SkBitmap& bitmap, int x, int y,
                   SkColorType colorType, SkAlphaType alphaType) {
     SkBitmap tmp(bitmap);
@@ -256,7 +256,7 @@
         for (int x = dst.fLeft; x < dst.fRight; ++x) {
             norm.fX = (x + 0.5f - center.fX) / halfSize.fX;
             norm.fY = (y + 0.5f - center.fY) / halfSize.fY;
-            
+
             SkScalar tmp = norm.fX * norm.fX + norm.fY * norm.fY;
             if (tmp >= 1.0f) {
                 norm.set(0.0f, 0.0f, 1.0f);
@@ -295,13 +295,13 @@
                         norm = locX >= locY ? right : down;   // LR corner
                     } else {
                         norm = locX > -locY ? right : up;     // UR corner
-                    }    
+                    }
                 } else {
                     if (locY > 0.0f) {
                         norm = -locX > locY ? left : down;    // LL corner
                     } else {
                         norm = locX > locY ? up : left;       // UL corner
-                    }    
+                    }
                 }
             }
 
@@ -331,13 +331,13 @@
                     norm = locX >= locY ? rightUp : down;   // LR corner
                 } else {
                     norm = rightUp;
-                }    
+                }
             } else {
                 if (locY > 0.0f) {
                     norm = -locX > locY ? leftUp : down;    // LL corner
                 } else {
                     norm = leftUp;
-                }    
+                }
             }
 
             norm_to_rgb(bm, x, y, norm);
@@ -439,7 +439,7 @@
             *dst.getAddr32(x, y) = blur_pixel(src, x, y, kernel.get(), wh);
         }
     }
- 
+
     return dst;
 }
 
diff --git a/tools/sk_tool_utils.h b/tools/sk_tool_utils.h
index 1e67afb..1d80731 100644
--- a/tools/sk_tool_utils.h
+++ b/tools/sk_tool_utils.h
@@ -167,13 +167,13 @@
         static void SetTempMark(TopoTestNode* node) { node->fTempMark = true; }
         static void ResetTempMark(TopoTestNode* node) { node->fTempMark = false; }
         static bool IsTempMarked(TopoTestNode* node) { return node->fTempMark; }
-        static void Output(TopoTestNode* node, int outputPos) { 
+        static void Output(TopoTestNode* node, int outputPos) {
             SkASSERT(-1 != outputPos);
-            node->fOutputPos = outputPos; 
+            node->fOutputPos = outputPos;
         }
         static bool WasOutput(TopoTestNode* node) { return (-1 != node->fOutputPos); }
         static int NumDependencies(TopoTestNode* node) { return node->fDependencies.count(); }
-        static TopoTestNode* Dependency(TopoTestNode* node, int index) { 
+        static TopoTestNode* Dependency(TopoTestNode* node, int index) {
             return node->fDependencies[index];
         }
 
diff --git a/tools/skiaserve/Request.cpp b/tools/skiaserve/Request.cpp
index 47b467c..1d946ab 100644
--- a/tools/skiaserve/Request.cpp
+++ b/tools/skiaserve/Request.cpp
@@ -55,7 +55,7 @@
 
     // write to png
     SkDynamicMemoryWStream buffer;
-    SkDrawCommand::WritePNG((const png_bytep) bmp->getPixels(), bmp->width(), bmp->height(), 
+    SkDrawCommand::WritePNG((const png_bytep) bmp->getPixels(), bmp->width(), bmp->height(),
                             buffer);
     return buffer.copyToData();
 }
@@ -155,7 +155,7 @@
     return surface;
 }
 
-bool Request::enableGPU(bool enable) {    
+bool Request::enableGPU(bool enable) {
     if (enable) {
         SkSurface* surface = this->createGPUSurface();
         if (surface) {
@@ -175,7 +175,7 @@
     fSurface.reset(this->createCPUSurface());
     fGPUEnabled = false;
     return true;
-} 
+}
 
 bool Request::initPictureFromStream(SkStream* stream) {
     // parse picture from stream
@@ -254,4 +254,3 @@
     bitmap->unlockPixels();
     return result;
 }
-
diff --git a/tools/skiaserve/Request.h b/tools/skiaserve/Request.h
index eecfe33..e3bc373 100644
--- a/tools/skiaserve/Request.h
+++ b/tools/skiaserve/Request.h
@@ -59,7 +59,7 @@
     UploadContext* fUploadContext;
     SkAutoTUnref<SkDebugCanvas> fDebugCanvas;
     UrlDataManager fUrlDataManager;
-    
+
 private:
     SkData* writeCanvasToPng(SkCanvas* canvas);
     void drawToCanvas(int n, int m = -1);
@@ -67,7 +67,7 @@
     SkSurface* createGPUSurface();
     SkIRect getBounds();
     GrContext* getContext();
-    
+
     sk_sp<SkPicture> fPicture;
     GrContextFactory* fContextFactory;
     SkAutoTUnref<SkSurface> fSurface;
@@ -75,4 +75,3 @@
 };
 
 #endif
-
diff --git a/tools/skiaserve/skiaserve.cpp b/tools/skiaserve/skiaserve.cpp
index 164f595..fd96251 100644
--- a/tools/skiaserve/skiaserve.cpp
+++ b/tools/skiaserve/skiaserve.cpp
@@ -86,7 +86,7 @@
     address.sin_port = htons(FLAGS_port);
     int result = inet_pton(AF_INET, FLAGS_address[0], &address.sin_addr);
     if (result != 1) {
-        printf("inet_pton for %s:%d failed with return %d %s\n", 
+        printf("inet_pton for %s:%d failed with return %d %s\n",
                 FLAGS_address[0], FLAGS_port, result, strerror(errno));
         return 1;
     }
@@ -97,7 +97,7 @@
     daemon = MHD_start_daemon(MHD_USE_SELECT_INTERNALLY
 #ifdef SK_DEBUG
                               | MHD_USE_DEBUG
-#endif  
+#endif
                               , FLAGS_port, nullptr, nullptr,
                               &answer_to_connection, &request,
                               MHD_OPTION_SOCK_ADDR, &address,
diff --git a/tools/skiaserve/urlhandlers/BatchBoundsHandler.cpp b/tools/skiaserve/urlhandlers/BatchBoundsHandler.cpp
index 4044986..b14db19 100644
--- a/tools/skiaserve/urlhandlers/BatchBoundsHandler.cpp
+++ b/tools/skiaserve/urlhandlers/BatchBoundsHandler.cpp
@@ -35,4 +35,3 @@
     request->fDebugCanvas->setDrawGpuBatchBounds(enabled);
     return SendOK(connection);
 }
-
diff --git a/tools/skiaserve/urlhandlers/BatchesHandler.cpp b/tools/skiaserve/urlhandlers/BatchesHandler.cpp
index 221c539..b245c4d 100644
--- a/tools/skiaserve/urlhandlers/BatchesHandler.cpp
+++ b/tools/skiaserve/urlhandlers/BatchesHandler.cpp
@@ -31,11 +31,10 @@
     // /batches
     if (0 == strcmp(method, MHD_HTTP_METHOD_GET)) {
         int n = request->getLastOp();
-        
+
         SkAutoTUnref<SkData> data(request->getJsonBatchList(n));
         return SendData(connection, data, "application/json");
     }
 
     return MHD_NO;
 }
-
diff --git a/tools/skiaserve/urlhandlers/BreakHandler.cpp b/tools/skiaserve/urlhandlers/BreakHandler.cpp
index b701955..16bf507 100644
--- a/tools/skiaserve/urlhandlers/BreakHandler.cpp
+++ b/tools/skiaserve/urlhandlers/BreakHandler.cpp
@@ -83,4 +83,3 @@
     SkAutoTUnref<SkData> data(stream.copyToData());
     return SendData(connection, data, "application/json");
 }
-
diff --git a/tools/skiaserve/urlhandlers/ClipAlphaHandler.cpp b/tools/skiaserve/urlhandlers/ClipAlphaHandler.cpp
index 4ab5096..a931f93 100644
--- a/tools/skiaserve/urlhandlers/ClipAlphaHandler.cpp
+++ b/tools/skiaserve/urlhandlers/ClipAlphaHandler.cpp
@@ -35,4 +35,3 @@
     request->fDebugCanvas->setClipVizColor(SkColorSetARGB(alpha, 0, 0, 0));
     return SendOK(connection);
 }
-
diff --git a/tools/skiaserve/urlhandlers/CmdHandler.cpp b/tools/skiaserve/urlhandlers/CmdHandler.cpp
index 1699bcb..09fdc17 100644
--- a/tools/skiaserve/urlhandlers/CmdHandler.cpp
+++ b/tools/skiaserve/urlhandlers/CmdHandler.cpp
@@ -36,7 +36,7 @@
         } else {
             sscanf(commands[1].c_str(), "%d", &n);
         }
-        
+
         SkAutoTUnref<SkData> data(request->getJsonOps(n));
         return SendData(connection, data, "application/json");
     }
@@ -60,4 +60,3 @@
 
     return MHD_NO;
 }
-
diff --git a/tools/skiaserve/urlhandlers/DataHandler.cpp b/tools/skiaserve/urlhandlers/DataHandler.cpp
index 0c94530..397be8f 100644
--- a/tools/skiaserve/urlhandlers/DataHandler.cpp
+++ b/tools/skiaserve/urlhandlers/DataHandler.cpp
@@ -37,4 +37,3 @@
     }
     return MHD_NO;
 }
-
diff --git a/tools/skiaserve/urlhandlers/DownloadHandler.cpp b/tools/skiaserve/urlhandlers/DownloadHandler.cpp
index fd9308d..4e23915 100644
--- a/tools/skiaserve/urlhandlers/DownloadHandler.cpp
+++ b/tools/skiaserve/urlhandlers/DownloadHandler.cpp
@@ -31,4 +31,3 @@
     return SendData(connection, data, "application/octet-stream", true,
                     "attachment; filename=something.skp;");
 }
-
diff --git a/tools/skiaserve/urlhandlers/EnableGPUHandler.cpp b/tools/skiaserve/urlhandlers/EnableGPUHandler.cpp
index b5d0c7a..68eb86f 100644
--- a/tools/skiaserve/urlhandlers/EnableGPUHandler.cpp
+++ b/tools/skiaserve/urlhandlers/EnableGPUHandler.cpp
@@ -38,4 +38,3 @@
     }
     return SendOK(connection);
 }
-
diff --git a/tools/skiaserve/urlhandlers/ImgHandler.cpp b/tools/skiaserve/urlhandlers/ImgHandler.cpp
index a0e58bc..91ea6d0 100644
--- a/tools/skiaserve/urlhandlers/ImgHandler.cpp
+++ b/tools/skiaserve/urlhandlers/ImgHandler.cpp
@@ -43,4 +43,3 @@
     SkAutoTUnref<SkData> data(request->drawToPng(n, m));
     return SendData(connection, data, "image/png");
 }
-
diff --git a/tools/skiaserve/urlhandlers/InfoHandler.cpp b/tools/skiaserve/urlhandlers/InfoHandler.cpp
index 65bbeb9..464bbb3 100644
--- a/tools/skiaserve/urlhandlers/InfoHandler.cpp
+++ b/tools/skiaserve/urlhandlers/InfoHandler.cpp
@@ -40,4 +40,3 @@
     SkAutoTUnref<SkData> data(request->getJsonInfo(n));
     return SendData(connection, data, "application/json");
 }
-
diff --git a/tools/skiaserve/urlhandlers/PostHandler.cpp b/tools/skiaserve/urlhandlers/PostHandler.cpp
index ce59920..34beefa 100644
--- a/tools/skiaserve/urlhandlers/PostHandler.cpp
+++ b/tools/skiaserve/urlhandlers/PostHandler.cpp
@@ -66,11 +66,10 @@
         fprintf(stderr, "Could not create picture from stream.\n");
         return MHD_NO;
     }
-    
+
     // clear upload context
     delete request->fUploadContext;
     request->fUploadContext = nullptr;
 
     return SendTemplate(connection, true, "/");
 }
-
diff --git a/tools/skiaserve/urlhandlers/RootHandler.cpp b/tools/skiaserve/urlhandlers/RootHandler.cpp
index 03b87f3..647c198 100644
--- a/tools/skiaserve/urlhandlers/RootHandler.cpp
+++ b/tools/skiaserve/urlhandlers/RootHandler.cpp
@@ -23,4 +23,3 @@
                         const char* upload_data, size_t* upload_data_size) {
     return SendTemplate(connection);
 }
-
diff --git a/tools/skiaserve/urlhandlers/UrlHandler.h b/tools/skiaserve/urlhandlers/UrlHandler.h
index 4fa9731..02a07b0 100644
--- a/tools/skiaserve/urlhandlers/UrlHandler.h
+++ b/tools/skiaserve/urlhandlers/UrlHandler.h
@@ -56,7 +56,7 @@
 };
 
 /**
-   Controls whether GPU rendering is enabled. Posting to /enableGPU/1 turns GPU on, /enableGPU/0 
+   Controls whether GPU rendering is enabled. Posting to /enableGPU/1 turns GPU on, /enableGPU/0
    disables it.
  */
 class EnableGPUHandler : public UrlHandler {
@@ -128,4 +128,3 @@
                const char* url, const char* method,
                const char* upload_data, size_t* upload_data_size) override;
 };
-
diff --git a/tools/skpmaker.cpp b/tools/skpmaker.cpp
index 99e6adf..e7418ad 100644
--- a/tools/skpmaker.cpp
+++ b/tools/skpmaker.cpp
@@ -77,9 +77,9 @@
     }
 
     SkColor color = SkColorSetRGB(FLAGS_red, FLAGS_green, FLAGS_blue);
-    make_skp(SkIntToScalar(FLAGS_width), 
-             SkIntToScalar(FLAGS_height), 
-             SkIntToScalar(FLAGS_border), 
+    make_skp(SkIntToScalar(FLAGS_width),
+             SkIntToScalar(FLAGS_height),
+             SkIntToScalar(FLAGS_border),
              color, FLAGS_writePath[0]);
     return 0;
 }
diff --git a/tools/test_font_monospace.cpp b/tools/test_font_monospace.cpp
index 64639be..4b14dc6 100644
--- a/tools/test_font_monospace.cpp
+++ b/tools/test_font_monospace.cpp
@@ -4845,4 +4845,3 @@
 0x30307833, -0.83252f, -0.83252f, 0.300293f, 0.300293f, 0, 0.791992f, 0.0123749f,
 -0.0942383f, 0.697754f, 0.538086f, 0.0104446f, 0.100098f, 0.23291f
 };
-
diff --git a/tools/test_font_sans_serif.cpp b/tools/test_font_sans_serif.cpp
index 859375e..b0d433d 100644
--- a/tools/test_font_sans_serif.cpp
+++ b/tools/test_font_sans_serif.cpp
@@ -4855,4 +4855,3 @@
 0x30307833, -1.02979f, -0.905273f, 0.211914f, 0.303223f, 0.0327148f, 1.3374f, 0.0208969f,
 -0.208984f, 1.12842f, 0.537598f, 0.0109024f, 0.10498f, 0.105957f
 };
-
diff --git a/tools/test_font_serif.cpp b/tools/test_font_serif.cpp
index 14a5433..49279ce 100644
--- a/tools/test_font_serif.cpp
+++ b/tools/test_font_serif.cpp
@@ -5147,4 +5147,3 @@
 0x30307833, -0.980957f, -0.891113f, 0.216309f, 0.303223f, 0.0424805f, 1.32861f, 0.0207596f,
 -0.178223f, 1.15039f, 0.469727f, 0.0103607f, 0.0952148f, 0.108887f
 };
-
