diff --git a/gm/fatpathfill.cpp b/gm/fatpathfill.cpp
index c583d64..c23a4ec 100644
--- a/gm/fatpathfill.cpp
+++ b/gm/fatpathfill.cpp
@@ -81,7 +81,7 @@
 
         for (int i = 0; i < REPEAT_LOOP; ++i) {
             SkPath line, path;
-            line.moveTo(SkIntToScalar(1), SkIntToScalar(2)); 
+            line.moveTo(SkIntToScalar(1), SkIntToScalar(2));
             line.lineTo(SkIntToScalar(4 + i), SkIntToScalar(1));
             paint.getFillPath(line, &path);
             draw_fatpath(canvas, surface, &path, 1);
diff --git a/include/utils/SkMatrix44.h b/include/utils/SkMatrix44.h
index 79bc700..f63f0df 100644
--- a/include/utils/SkMatrix44.h
+++ b/include/utils/SkMatrix44.h
@@ -37,7 +37,7 @@
 #endif
     typedef float SkMScalar;
     typedef int32_t SkMIntScalar;
-    
+
     static inline float SkFloatToMScalar(float x) {
         return x;
     }
@@ -134,7 +134,7 @@
         kAffine_Mask        = 0x04,  //!< set if the matrix skews or rotates
         kPerspective_Mask   = 0x08   //!< set if the matrix is in perspective
     };
-    
+
     /**
      *  Returns a bitfield describing the transformations the matrix may
      *  perform. The bitfield is computed conservatively, so it may include
@@ -153,7 +153,7 @@
     inline bool isIdentity() const {
         return 0 == this->getType();
     }
-    
+
     void setIdentity();
     inline void reset() { this->setIdentity();}
 
@@ -319,7 +319,7 @@
     // we are always packed with no extra bits, allowing us to call memcpy
     // without fear of copying uninitialized bits.
     mutable SkMIntScalar    fTypeMask;
-    
+
     enum {
         kUnknown_Mask = 0x80,
 
@@ -333,7 +333,7 @@
     SkMScalar scaleX() const { return fMat[0][0]; }
     SkMScalar scaleY() const { return fMat[1][1]; }
     SkMScalar scaleZ() const { return fMat[2][2]; }
-    
+
     SkMScalar perspX() const { return fMat[0][3]; }
     SkMScalar perspY() const { return fMat[1][3]; }
     SkMScalar perspZ() const { return fMat[2][3]; }
diff --git a/src/core/SkTLList.h b/src/core/SkTLList.h
index bf7c93b..87fd52d 100644
--- a/src/core/SkTLList.h
+++ b/src/core/SkTLList.h
@@ -62,7 +62,7 @@
             }
         }
     }
-    
+
     void addToHead(const T& t) {
         this->validate();
         Node* node = this->createNode();
diff --git a/src/utils/SkMatrix44.cpp b/src/utils/SkMatrix44.cpp
index 489a550..7982c30 100644
--- a/src/utils/SkMatrix44.cpp
+++ b/src/utils/SkMatrix44.cpp
@@ -62,7 +62,7 @@
 
 int SkMatrix44::computeTypeMask() const {
     unsigned mask = 0;
-    
+
     if (0 != perspX() || 0 != perspY() || 0 != perspZ() || 1 != fMat[3][3]) {
         return kTranslate_Mask | kScale_Mask | kAffine_Mask | kPerspective_Mask;
     }
@@ -214,7 +214,7 @@
     fMat[3][1] = ty;
     fMat[3][2] = tz;
     fMat[3][3] = 1;
-    
+
     int mask = kIdentity_Mask;
     if (0 != tx || 0 != ty || 0 != tz) {
         mask |= kTranslate_Mask;
@@ -243,7 +243,7 @@
     fMat[1][1] = sy;
     fMat[2][2] = sz;
     fMat[3][3] = 1;
-    
+
     int mask = kIdentity_Mask;
     if (0 != sx || 0 != sy || 0 != sz) {
         mask |= kScale_Mask;
@@ -485,7 +485,7 @@
         }
         result[i] = SkMScalarToScalar(value);
     }
-    
+
     if (storage == result) {
         memcpy(dst, storage, sizeof(storage));
     }
@@ -496,7 +496,7 @@
 void SkMatrix44::mapMScalars(const SkMScalar src[4], SkMScalar dst[4]) const {
     SkMScalar storage[4];
     SkMScalar* result = (src == dst) ? storage : dst;
-    
+
     for (int i = 0; i < 4; i++) {
         SkMScalar value = 0;
         for (int j = 0; j < 4; j++) {
@@ -504,7 +504,7 @@
         }
         result[i] = value;
     }
-    
+
     if (storage == result) {
         memcpy(dst, storage, sizeof(storage));
     }
diff --git a/tests/LListTest.cpp b/tests/LListTest.cpp
index c5a5663..d574e09 100644
--- a/tests/LListTest.cpp
+++ b/tests/LListTest.cpp
@@ -162,14 +162,14 @@
         REPORTER_ASSERT(reporter, iter3.get()->fID == iter1.get()->fID);
         REPORTER_ASSERT(reporter, iter4.get()->fID == iter1.get()->fID);
         REPORTER_ASSERT(reporter, list1 == list2);
-       
+
         list2.reset();
 
         // use both before/after in-place construction on an empty list
         SkNEW_INSERT_IN_LLIST_BEFORE(&list2, list2.headIter(), ListElement, (1));
         REPORTER_ASSERT(reporter, list2 == list1);
         list2.reset();
-    
+
         SkNEW_INSERT_IN_LLIST_AFTER(&list2, list2.tailIter(), ListElement, (1));
         REPORTER_ASSERT(reporter, list2 == list1);
 
@@ -255,7 +255,7 @@
                                 REPORTER_ASSERT(reporter, prev.next()->fID == iter.get()->fID);
                             }
                         }
-                    }    
+                    }
                 }
                 ++count;
             } else {
@@ -263,7 +263,7 @@
                 int n = random.nextULessThan(list1.count());
                 Iter::IterStart start;
                 ListElement* (Iter::*incrFunc)();
-                
+
                 if (random.nextBool()) {
                     start = Iter::kHead_IterStart;
                     incrFunc = &Iter::next;
diff --git a/tests/Matrix44Test.cpp b/tests/Matrix44Test.cpp
index ed8770a..1220f26 100644
--- a/tests/Matrix44Test.cpp
+++ b/tests/Matrix44Test.cpp
@@ -74,10 +74,10 @@
 
 static void test_gettype(skiatest::Reporter* reporter) {
     SkMatrix44 matrix;
-    
+
     REPORTER_ASSERT(reporter, matrix.isIdentity());
     REPORTER_ASSERT(reporter, SkMatrix44::kIdentity_Mask == matrix.getType());
-    
+
     int expectedMask;
 
     matrix.set(1, 1, 0);
@@ -91,7 +91,7 @@
     matrix.set(2, 0, 1);
     expectedMask |= SkMatrix44::kAffine_Mask;
     REPORTER_ASSERT(reporter, matrix.getType() == expectedMask);
-    
+
     matrix.set(3, 2, 1);
     REPORTER_ASSERT(reporter, matrix.getType() & SkMatrix44::kPerspective_Mask);
 }
@@ -209,7 +209,7 @@
             a.setDouble(row, col, row * 4 + col);
         }
     }
-            
+
     double bufferd[16];
     float bufferf[16];
     a.asColMajord(bufferd);
diff --git a/tests/MatrixTest.cpp b/tests/MatrixTest.cpp
index ed2be1d..894278e 100644
--- a/tests/MatrixTest.cpp
+++ b/tests/MatrixTest.cpp
@@ -98,7 +98,7 @@
 
     dst.fRight += SK_Scalar1;
     matrix.setRectToRect(src, dst, SkMatrix::kFill_ScaleToFit);
-    REPORTER_ASSERT(reporter, 
+    REPORTER_ASSERT(reporter,
                     (SkMatrix::kTranslate_Mask | SkMatrix::kScale_Mask) == matrix.getType());
     REPORTER_ASSERT(reporter, matrix.rectStaysRect());
 
